تشخیص چهره با پایتون


امروزه خیلی از کار های روزمره ما توسط پردازش های کامپیوتری انجام میشه مثلا اگر بخوایم از دیجیکالا خریدی انجام بدیم ، پردازش هایی انجام میشه که ما بتونیم به کالای مورد نظر خودمون برسیم و اطلاعات ما به سرور ارسال بشه.

پس در کل پردازش های کامپیوتری از مهم ترین چیزهایی است که ما اکثرا با آن هیچ توجه ای نمی کنیم و کار اصلی توسط آن ها صورت میگیرد.
?یکی از این پردازش ها، بینایی ماشین هست ، خب همانطور که گفتیم پردازش های کامپیوتری نقش مهمی در زندگی ما دارند و کار هایی که برای انسان سخت هست را به راحتی انجام می دهند. پس بعضی وقت ها لازم هست چیزی را ببینند و انجام دهند همانطور که ما انسان های می بینم.
?بینایی ماشین امروزه بسیار مورد استفاده قرار میگیرد برای مثال : باز شدن گوشی با تشخیص چهره
خب قطعا برای همچین تکنولوژی هایی نیاز به الگوریتم و برنامه نویسی هست و اینجاست که پایتون وارد کار میشه ....

ما می تونیم با کتابخانه face_recognition و cv2(همون opencv) تشخیص چهره رو انجام بدیم.
?توجه داشته باشید در پروژه به حروف کوچک و بزرگ دقت کنید ....
?حتما باید به زبان برنامه نویسی پایتون مسلط باشید...

نصب opencv:

pip install opencv-python


نصب face_recognition:
برای نصب کردن این کتابخونه نیاز هست تا CMake رو داشته باشید برای اینکار کافیه لانچر ویژوال استدیو رو نصب کنید و برید داخل اینستالر و طبق مراحل زیر پیش برید :

نرم افزار ویژوال استدیو رو نصب کنید
نرم افزار ویژوال استدیو رو نصب کنید


روی Modify بزنید
روی Modify بزنید
تیک بخش ++C رو بزنید و بعدش روی Modify
تیک بخش ++C رو بزنید و بعدش روی Modify

خب Cmake نصب شد.
حالا وقتشه face_recognition رو نصب کنید.

❗توجه❗:

?من خودم dlib(یک کتابخونه پایتون) و face_recognition رو جدا نصب کردم ولی فکر کنم اگر کتابخونه face_recognition رو نصب کنید به طور خودکار dlib هم نصب بشه ولی بنظر من جدا نصب کنید تا باهم جلو بریم.
?توجه داشته باشید اگر CMake نصب نشه dlib هم نصب نمیشه.

نصب face_recognition :

pip install face_recognition

نصب dlib :

pip install dlib

خب کتابخونه ها نصب شد حالا وقتشه بریم سراغ برنامه نویسی :

من در اینجا از نرم افزار پایچارم استفاده می کنم و پیشنهاد می کنم که شما هم از پایچارم استفاده کنید.

خب اول کتابخانه ها رو import می کنیم.

وارد کردن کتابخانه های مورد نیاز
وارد کردن کتابخانه های مورد نیاز
import face_recognition
import cv2

خب حالا در مرحله بعد باید عکسمونو لود کنیم.

لود کردن عکس
لود کردن عکس
img = face_recognition.load_image_file('image.jfif')

من اینجا از 'image/bill gates.jfif' استفاده کردم یعنی بهش گفتم برو داخل پوشه image عکس بیل گیتس رو لود کن اگر عکستون داخل پوشه فایلتون هست کافیه فقط اسم فایل رو بنویسن در غیر این صورت اسم پوشه رو بنویسید و بعدش اسم فایل رو بنویسید.

حالا باید عکسمونو از BGR تبدیل کنیم به RGB (عکس رو که وارد می کنیم به صورت پیشفرض BGR هستش ولی باید به صورت RGB پردازش بشه)

BGR2RGB
BGR2RGB
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

خب ما در اینجا از کتابخانه opencv استفاده کردیم (cv2) و با کمک cvtcolor در مرحله اول عکس مورد نظر (همون img که لود کردیم منتها این دوباره اونو میریزیم تو img) را مشخص می کنیم و بعد باimg,cv2.COLOR_BGR2RGB عملیات مورد نظر رو انجام میدیم.

نمای کلی از پروژه
نمای کلی از پروژه
import face_recognition
import cv2

img = face_recognition.load_image_file('image/bill gates.jfif')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

خب در اینجا باید بدونیم که این تشخیص چهره چه کاری انجام میده :
1️⃣اطلاعاتی رو از عکس میگیره2️⃣ اونو با دیتابیسی که از قبل درست شده تطبیق میده3️⃣ مختصات چره شناسایی شده رو به ما میده.

خب حالا ما باید این مختصات رو بگیرم شاید در نگاه اول سخت بنظر بیاد ولی فقط یک خط کده!

گرفتن مختصات چهره
گرفتن مختصات چهره
imgLoc = face_recognition.face_locations(img)[0]
print(imgLoc)

خب ما در اینجا مختصات چهره رو گرفتیم حالا من واستون چاپش می کنم که بدونید به چه صورته:
? اون [0] برای اینه که imgloc به صورت یک لیست در میاد و ما فقط آیتم اولشو می خوایم(کلا یک آیتمه)

imgLoc
imgLoc

همانطور که می بینید 4 عدد بهمون داده که به این صورت هستش :

y1,x2,y2,x1

شاید چینش این 4 تا یکم عجیب باشه ولی خب مشکلی برامون به وجود نمیاره حالا شاید با خودتون بگین اینا چی هستن !!

روش ترسیم یک مستطیل در opencv
روش ترسیم یک مستطیل در opencv

خب همونطور که در تصاویر مختلف دیدید معمولا در تشخیص چهره دوره صورت یک آدم یک مربع میاد این مربعه همینه که این بالا می بینید و ما برای ترسیمش نیاز به 2 نقطه داریم که این 2 نقطه هر کدوم مختصات مربوط به خودشو داره ولی خب لازم نیست نگران باشید چون فقط با کد زیر می تونید اون مربع رو دور صورت طرف ایجاد کنید.

;کشیدن مستطیل به دور چهره
;کشیدن مستطیل به دور چهره
cv2.rectangle(img,(imgLoc[3],imgLoc[0]),(imgLoc[1],imgLoc[2]),(255,0,0),3)

خب اومدیم از cv2.rectangle استفاده کردیم و بعدش عکسی که می خوایم داخلش مستطیله کشیده بشه رو مشخص می کنیم حالا اگر دقت کنید از ما دو نقطه خواسته شده که ما اونا رو داخل () نوشتیم و برای هر نقطه یک x و y مشخص کردیم.
در مرحله بعد یک کد رنگ به مستطیل دادیم (255,0,0) که مربوط به رنگ آبی هستش
در مرحله بعد ضخامت اون مستطیل رو مشخص کردیم که من 3 رو گذاشتم
?بین هر بخش باید یک , گذاشته بشه.

حال وقت آن رسیده که عکس رو نمایش بدیم که با 2 خط کد اینکار امکان پذیر هستش :

نمایش دادن عکس
نمایش دادن عکس
cv2.imshow(&quotimage&quot,img)
cv2.waitKey()

با استفاده از imshow در کتابخانه cv2 در بخش اول اسم پنجره و در بخش بعد عکی که می خوایم نمایش داده بشه رو قرار میدیم.
?اگر می خواید چند عکس نشون داده بشه اسم پنجره ها رو متفاوت بزاریم
اگر من بدون waitkey پروژه رو ران کنم سریع بسته میشه چون به هر حال نشون داده که شده ?
پس waitkey رو میزارم که منتظر کلیک من وایسته و داخلشم خالی میزارم.

خب خروجیی که همیشه منتظرش بدیم رو ببینیم:

نتیجه نهایی
نتیجه نهایی

می تونیم حتی عکس رو عوض کنیم فقط کافیه تو خط 4 ام که در بالا می بینید آدرس یک عکس دیگه رو بدیم برای مثال :

نتیجه نهایی برای یک عکس دیگه
نتیجه نهایی برای یک عکس دیگه

خب من کد رو این زیر قرار میدم :

import face_recognition
import cv2

img = face_recognition.load_image_file('image/bill gates test.jfif')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
imgLoc = face_recognition.face_locations(img)[0]
print(imgLoc)
cv2.rectangle(img,(imgLoc[3],imgLoc[0]),(imgLoc[1],imgLoc[2]),(255,0,0),3)
cv2.imshow(&quotimage&quot,img)
cv2.waitKey()

?فقط باید در خط 4 عکس خودتونو قرار بدین...

اگر مشکلی در این مطلب بود حتما بگین تا اصلاح بشه