تشخیص چهره و شناسایی آن با پایتون
تفاوت تشخیص چهره و شناسایی چهره
تشخیص چهره (Face Detection) فرآیند تشخیص دادن چهره هایی، از یک تصویر یا ویدیویی است که هویت آن ها مهم نیست. این برنامه کاری بیشتر از پیدا کردن چهره ها ندارد. اما از طرف دیگر، شناسایی چهره (Face Recognition) برنامه ای که چهره ها را پیدا می کند و همچنین می تواندبه ما بگوید که کدام چهره متعلق به چه کسی است. بنابراین اطلاعات بیشتر از تشخیص چهره در اختیار ما قرار می دهد.
برای نوشتن کدی که چهره ها را شناسایی کند، به داده های آموزش نیاز داریم، باید دستگاه خود را آموزش دهیم تا چهره ها را بشناسد. در یادگیری ماشین، دو نوع یادگیری وجود دارد. نظارت شده و بدون نظارت. در این پروژه ما قصد داریم از یادگیری نظارت شده استفاده کنیم.
برای شروع ما از دو ماژول اصلی برای این پروژه استفاده خواهیم کرد، و به آنها Face Recognition و OpenCV گفته می شود. OpenCV یک کتابخانه بسیار بهینه شده با تمرکز بر برنامه های بلادرنگ (real-time applications) است.
OpenCV (Open Source Computer Vision Library) یک کتابخانه نرم افزار بینایی کامپیوتر و یادگیری ماشین منبع باز است. OpenCV به منظور ایجاد زیرساخت مشترک برای برنامه های بینایی کامپیوتر و تسریع در استفاده از ادراک ماشین در محصولات تجاری ساخته شده است. OpenCV به عنوان یک محصول دارای مجوز BSD، استفاده و اصلاح کد را برای مشاغل آسان می کند.
کتابخانه های مورد نیاز برای تشخیص چهره
در اینجا لیستی از کتابخانه هایی که نصب خواهیم کرد وجود دارد:
face_recognition ، numpy ، opencv-python. Cmake
cmake ،یک کتابخانه پیش نیاز است تا نصب کتابخانه face_recognition خطایی ایجاد نکند.
با استفاده از PIP می توانیم آنها را در یک خط نصب کنیم:
1 pip install cmake face_recognition numpy opencv-python
پس از اتمام نصب ، اجازه دهید آنها را به ویرایشگر کد وارد کنیم. برخی از این کتابخانه ها در پایتون گنجانده شده اند ، به همین دلیل می توانیم آنها را بدون نصب وارد کنیم
1
2
3
4
5
|
import face_recognition
import cv2
import numpy as np
import os
import glob
|
اکنون به مرحله بعدی می رویم ، جایی که تصاویر را وارد کرده و از آنها برای آموزش برنامه خود استفاده می کنیم.
آموزش تصاویر چهره
در ابتدا، بیایید تصاویر خود را پیدا کنیم.
وارد کردن تصاویر
تصاویر برخی از افراد مشهور را دانلود کرده و آنها را به پوشه جدیدی به نام “faces” اضافه می کنیم. همچنین برای بدست آوردن دایرکتوری فعلی ، به عبارت دیگر ، محل برنامه شما ، می توانیم از روشی به نام “()getcwd ” استفاده کنیم.
1
2
3
4
5
6
7
|
faces_encodings=[]
faces_names=[]
cur_direc=os.getcwd()
path=os.path.join(cur_direc,‘data/faces/’)
list_of_files=[f for f in glob.glob(path+’*.jpg’)]
number_files=len(list_of_files)
names=list_of_files.copy()
|
درک خطوط بالا:
- همه تصاویر در یک پوشه به نام “faces” هستند.
- نام فایل های تصویری باید نام شخصی در تصویر باشد. (مانند: obama.jpg).
- نام فایل ها لیست شده و به متغیر “names” اختصاص داده شده اند.
- نوع فایل ها باید یکسان باشند. در این تمرین ، من از فرمت “jpg” استفاده کردم.
آموزش چهره ها
1
2
3
4
5
6
7
8
|
for i in range(number_files):
globals()[’image_{}’.format(i)] = face_recognition.load_image_file(list_of_files[i])
globals()[’image_encoding_{}’.format(i)] = face_recognition.face_encodings(globals()[‘image_{}’.format(i)])[0]
faces_encodings.append(globals()[’image_encoding_{}’.format(i)])
# Create array of known names
names[i] = names[i].replace(cur_direc, “”)
faces_names.append(names[i])
|
در اینجا لیست “names” بدین شکل است.
شناسایی چهره
ما در این مرحله یک کد طولانی داریم. که اگر آن را بخوانید به راحتی می توانید در هر خط اتفاقات را بفهمید. بیایید متغیرهای مورد نیاز را تعریف کنیم.
1
2
3
4
|
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True
|
در اینجا کد شناسیایی چهره وجود دارد. (اگر کد زیر را کپی کنید ممکن است لازم باشد فاصله را مجدداً قالب بندی کنید ، توصیه می کنم با دیدن آن، کد را از ابتدا بنویسید و همچنین سعی کنید آن را درک کنید)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
rgb_small_frame = small_frame[:, :, ::-1]
if process_this_frame:
face_locations = face_recognition.face_locations( rgb_small_frame)
face_encodings = face_recognition.face_encodings( rgb_small_frame, face_locations)
face_names = []
for face_encoding in face_encodings:
matches = face_recognition.compare_faces (faces_encodings, face_encoding)
name = “Unknown”
face_distances = face_recognition.face_distance( faces_encodings, face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
name = faces_names[best_match_index]
face_names.append(name)
process_this_frame = not process_this_frame
# Display the results
for (top, right, bottom, left), name in zip(face_locations, face_names):
top *= 4
right *= 4
bottom *= 4
left *= 4
# Draw a rectangle around the face
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# Input text label with a name below the face
cv2.rectangle(frame, (left, bottom – 35), (right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom – 6), font, 1.0, (255, 255, 255), 1)
# Display the resulting image
cv2.imshow(‘Video’, frame)
# Hit ‘q’ on the keyboard to quit!
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
|
برنامه ای ایجاد شده که چهره ها را در تصویر تشخیص و شناسایی می کند. اکنون، شما ایده ای در مورد چگونگی استفاده از بینایی کامپیوتر در یک پروژه واقعی دارید.
پایان موفق باشید
دیدگاهتان را بنویسید