پروژه شناسایی چهره با OpenCV و رزبری پای

محتویات
- آموزش تشخیص صورت با Open CV و رزبری پای
- شناسایی چهره با OpenCV چگونه کار می کند؟
- تشخیص چهره با استفاده از طبقه بندی آبشار در OpenCV
- نصب بسته های مورد نیاز برای تشخیص چهره با رزبری پای
- پوشه پروژه شناسایی چهره Face Recognition
- تنظیم دایرکتوری Face_Images با چهره های نمونه
- برنامه مربی چهره Face Trainer
- اسکریپت شناسایی چهره
سلام. پروژه تشخیص چهره با OpenCV و رزبری پای + فیلم عملکرد را آماده کردیم.
آموزش تشخیص صورت با Open CV و رزبری پای
بحث تشخیص چهره با سرعت بالایی در حال رشد است. این مبحث کاربرد فراوانی در سیستم امنیتی خانه ها، ادارات و … دارد. چین برای نظارت بر حضور و رفتار دانش آموزان از فناوری تشخیص چهره استفاده میکرده است. با امکانات زیادی که این مبحث در اختیار ما قرار میدهد، بی شک بزودی شاهد افزایش همه گیر شدن تشخیص چهره خواهیم بود.
در این پروژه رزبری پای خواهیم آموخت که چگونه میتوانیم با استفاده از کتابخانه OpenCv روی Raspberry pi یک سیستم تشخیص چهره بسازیم. مزیت اجرای این پروژه با رزبری پای این است که میتوانید آن را در هر جایی نصب کنید تا به عنوان سیستم نظارتی کار کند. مانند همه سیستم های تشخیص چهره، پروژه ما نیز شامل دو اسکریپت پایتون است. اسکریپت اول برنامه Trainer است که مجموعه از عکس های یک شخص خاص را تجزیه و تحیل میکند و اسکریپت دیگر برنامه ای است که چهره را تشخیص میدهد و نام شخص را اعلام میکند. هر دو برنامه مربوط به لینوکس و رزبری پای هستند اما روی ویندوز هم با ایجاد تغییرات جزئی کار میکنند.
فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.
اگر یک چهره تشخیص داده شود ، مربعی در اطراف آن چهره رسم میشود و اگر برنامه بتواند چهره را شناسایی کند ، نام فرد را نیز نشان می دهد.
همانطور که قبلاً گفته شد ، ما از کتابخانه OpenCV برای شناسایی و شناسایی چهره ها استفاده خواهیم کرد. بنابراین اطمینان حاصل کنید که قبل از ادامه این آموزش ، نصب Open CV روی رزبری پای را انجام داده اید. همچنین Pi خود را با آداپتور 2A نیرو دهید و آن را از طریق کابل HDMI به مانیتور صفحه نمایش وصل کنید زیرا ما قادر نخواهیم بود از طریق SSH خروجی را بدست آوریم.
شناسایی چهره با OpenCV چگونه کار می کند؟
قبل از شروع ، مهم است که بدانیم تشخیص چهره و شناسایی چهره دو چیز متفاوت هستند. در تشخیص چهره فقط چهره یک شخص تشخیص داده می شود. در شناسایی چهره نرم افزار نه تنها چهره را شناسایی می کند بلکه فرد را نیز می شناسد. حال باید واضح باشد که قبل از انجام شناسایی چهره باید تشخیص چهره را انجام دهیم.
ویدیویی که از وب کم دریافت مییشود چیزی نیست جز یک دنباله طولانی از تصاویر ثابت که یکی پس از دیگری به روز می شوند. و هر یک از این تصاویر فقط مجموعه ای از پیکسل ها با مقادیر مختلف هستند که در موقعیت مربوطه قرار گرفته اند. بنابراین چگونه یک برنامه می تواند چهره ای را از این پیکسل ها تشخیص دهد و فرد موجود در آن را بیشتر بشناسد؟ الگوریتم های زیادی در پشت آن وجود دارد و تلاش برای توضیح آنها فراتر از محدوده این مقاله است ، اما از آنجا که ما از کتابخانه OpenCV استفاده می کنیم انجام تشخیص چهره بسیار ساده است بدون آنکه نیازی به مفاهیم عمیق داشته باشیم.
ما قبلا پروژه تشخیص چهره را با آردوینو راه اندازی کرده ایم : ربات تشخیص چهره و دنبال کننده صورت با آردوینو و Processing
تشخیص چهره با استفاده از طبقه بندی آبشار در OpenCV
فقط اگر بتوانیم چهره ای را تشخیص دهیم ، قادر خواهیم بود آن را بشناسیم یا آن را به خاطر بسپاریم. برای کشف شیء مانند صورت از چیزی به نام Classifiers (طبقه بندی کننده) استفاده می کند. این طبقه بندی ها مجموعه ای از داده های از پیش آموزش دیده (XML File) هستند که می توانند برای تشخیص یک شی خاص مورد استفاده قرار گیرند. جدای از تشخیص چهره ، Classifiers می تواند اشیاء دیگری مانند بینی ، چشم ها ، پلاک وسیله نقلیه ، لبخند و … را نیز تشخیص دهد. لیست موارد طبقه بندی کننده در انتهای آموزش برای دانلود قرار داده شده است.
در این آموزش از یک طبقه بندی کننده به نام “haarcascade_frontalface_default.xml” استفاده می کنیم که صورت را تشخیص می دهد.
نصب بسته های مورد نیاز برای تشخیص چهره با رزبری پای
مطمئن شوید که پیپ نصب شده است و سپس نصب بسته های زیر را ادامه دهید.
نصب dlib: این Dlib ابزاری برای برنامه های یادگیری ماشین و تجزیه و تحلیل داده های دنیای واقعی است. برای نصب dlib ، فقط دستور زیر را در ترمینال وارد کنید.
Pip install dlib
این باید dlib را نصب کند و در صورت موفقیت ، صفحه ای مانند تصویر زیر مشاهده خواهید کرد.
نصب Pillow : Pillow همچنین با نام PIL مخفف کتابخانه تصویربرداری Python است که برای باز کردن ، دستکاری و ذخیره تصاویر در قالب های مختلف استفاده می شود. برای نصب PIL از دستور زیر استفاده کنید
Pip install pillow
پس از نصب یک پیام موفقیت آمیز مطابق شکل زیر دریافت خواهید کرد
نصب face_recognition: کتابخانه face_recognition ساده ترین کتابخانه پایتون برای تشخیص و دستکاری چهره ها محسوب می شود. ما برای شناسایی چهره ها از این کتابخانه استفاده خواهیم کرد. برای نصب این کتابخانه دستور زیر را وارد کنید.
Pip install face_recognition –no –cache-dir
هنگامی که با موفقیت نصب شد باید صفحه ای مانند تصویر زیر مشاهده کنید. این کتابخانه سنگین است و اکثر مردم با مشکلات حافظه روبرو می شوند ، از این رو من از کد —no –cache-dir
برای نصب کتابخانه بدون ذخیره فایل های حافظه نهان استفاده کرده ام.
پوشه پروژه شناسایی چهره Face Recognition
پوشه پروژه ما شامل دو برنامه پایتون به نام های Face_Trainner.py و Face_Recog.py خواهد بود. پوشه ای به نام Face_Images شامل تصاویر نمونه افرادی است که باید شناخته شوند است. یک پرونده طبقه بندی کننده به نام “haarcascade_frontalface_default.xml” که برای تشخیص چهره استفاده می شود. و در آخر ، یک فایل به نام “face-trainner.yml” که با استفاده از برنامه Face_Trainner.py بر اساس تصاویر موجود در پوشه Face_Images تولید می شود. تمام پرونده های پوشه پروژه در زیر نشان داده شده است. تمام فایل ها را میتوانید از انتهای صفحه دانلود کنید.
تنظیم دایرکتوری Face_Images با چهره های نمونه
دایرکتوری Face_Images نشان داده شده در بالا باید دارای زیر فهرست هایی با نام شخصی باشد که باید شناخته شود و چند نمونه از آنها در داخل آن باشد. به خاطر این آموزش سعی کردیم اسم Aswinth و ایلان ماسک Elon را بشناسم. بنابراین من فقط دو زیر شاخه با تصاویر مانند زیر ایجاد کرده ام.
شما باید پوشه را با نام شخصی که بخواهید بشناسید تغییر دهید و همچنین عکس ها را با آن شخص جایگزین کنید. حداقل 5 عکس برای هر فرد به نظر می رسد خوب کار کند. تعداد بالای اشخاص باعث کند تر کار کردن برامه خواهد شد.
برنامه مربی چهره Face Trainer
بیایید نگاهی به برنامه Face_Traineer.py بیندازیم. هدف از این برنامه باز کردن تمام تصاویر در دایرکتوری Face_Images و جستجوی چهره است. پس از تشخیص چهره ، صورت را برش داده و آن را به مقیاس خاکستری و سپس به یک آرایه numpy تبدیل می کنیم سپس در نهایت از کتابخانه face_recognition که قبلاً نصب کرده ایم برای آموزش و ذخیره آن به عنوان پرونده ای به نام face-trainner.yml استفاده می کنیم. داده های موجود در این پرونده بعدا می توانند برای تشخیص چهره ها استفاده شوند. برنامه کامل Trainer در پایان آورده شده است ، در اینجا مهمترین خطوط را توضیح خواهیم داد.
ما برنامه را با وارد کردن ماژول های مورد نیاز شروع می کنیم. ماژول cv2 برای پردازش تصویر استفاده می شود ، از numpy برای تبدیل تصاویر به معادل های ریاضی استفاده می شود ، از ماژول os برای پیمایش از طریق دایرکتوری ها استفاده می شود و از PIL برای مدیریت تصاویر استفاده می شود.
import cv2 #پردازش تصویر import numpy as np #تبدیل تصاویر به مقدار ریاضی import os #پیمایش دایرکتوری ها from PIL import Image #مدیریت تصاویر
در مرحله بعد برای شناسایی صورت در تصاویر باید از طبقه بندی haarcascade_frontalface_default.xml استفاده کنیم. اطمینان حاصل کنید که این پرونده xml را در پوشه پروژه خود قرار داده اید در غیر این صورت با خطا روبرو خواهید شد. سپس از متغیر recognizer برای ایجاد یک هیستوگرام پترن باینری برای شناسایی چهره استفاده میکنیم.
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') recognizer = cv2.createLBPHFaceRecognizer()
سپس برای دسترسی به تصاویر داخل آن باید به دایرکتوری Face_Images وارد شویم. این دایرکتوری باید در داخل داریکتوری فعلی شما (CWD) قرار گیرد. از خط زیر برای ورود به پوشه موجود در CWD استفاده می شود.
Face_Images = os.path.join(os.getcwd(), "Face_Images")
سپس از حلقه هایی استفاده می کنیم تا به هر زیر فهرست دایرکتوری Face_Images وارد شویم و پرونده هایی را که با jpeg ، jpg یا png به پایان می رسد باز کنیم. مسیر هر تصویر در متغیری به نام مسیر و نام پوشه (که نام آن شخص خواهد بود) ذخیره می شود که در آن تصاویر قرار می گیرند در متغیری به نام person_name ذخیره می شوند.
for root, dirs, files in os.walk(Face_Images): for file in files: if file.endswith("jpeg") or file.endswith("jpg") or file.endswith("png"): path = os.path.join(root, file) person_name = os.path.basename(root)
اگر نام شخص تغییر کرده باشد ما یک متغیر به نام Face_ID را افزایش می دهیم، این به ما در داشتن Face_ID متفاوت برای افراد مختلف کمک می کند که بعداً برای شناسایی نام شخص از آنها استفاده خواهیم کرد.
if pev_person_name!=person_name: #چک کردن تغییر نام شخص Face_ID=Face_ID+1 #اگر بله، افزایش مقدار آی دی pev_person_name = person_name
همانطور که می دانیم برای OpenCV کار با تصاویر خاکستری بسیار ساده تر از تصاویر رنگی است زیرا مقادیر RGB را نمی توان نادیده گرفت. بنابراین برای کاهش مقادیر موجود در تصویر ، آن را به مقیاس خاکستری تبدیل کرده و سپس تصویر را به 550 تغییر اندازه می دهیم تا همه تصاویر یکنواخت بمانند. مطمئن شوید که صورت در وسط قرار دارد. در آخر همه این تصاویر را به آرایه numpy تبدیل کنید تا یک مقدار ریاضی برای تصاویر بدست آورید. و سپس از طبقه بندی آبشار برای تشخیص چهره در تصاویر استفاده کرده و نتیجه را در یک کال متغیر ذخیره کنید.
Gery_Image = Image.open(path).convert("L") # تبدیل تصاویر به خاکستری با Pillow Crop_Image = Gery_Image.resize( (550,550) , Image.ANTIALIAS) #تغییر سایز به 550 Final_Image = np.array(Crop_Image, "uint8") faces = face_cascade.detectMultiScale(Final_Image, scaleFactor=1.5, minNeighbors=5) #تشخیص چهره در تصاویر
پس از شناسایی چهره ، آن منطقه را برداشت می کنیم و آن را به عنوان منطقه مورد علاقه (ROI) در نظر می گیریم. از منطقه ROI برای آموزش تشخیص چهره استفاده می شود. ما باید هر چهره ROI را در یک متغیر به نام x_train اضافه کنیم. سپس این مقادیر ROI را به همراه مقدار Face ID به شناسه ارائه می دهیم که داده های آموزش را در اختیار ما قرار می دهد.
for (x,y,w,h) in faces: roi = Final_Image[y:y+h, x:x+w] #برش منطقه مورد نظر x_train.append(roi) y_ID.append(Face_ID) recognizer.train(x_train, np.array(y_ID)) #ایجاد یک ماتریس recognizer.save("face-trainner.yml") #ذخیره ماتریس در فایل YML
با تهیه این برنامه متوجه می شوید که فایل face-trainner.yml هر بار به روز می شود. بنابراین اطمینان حاصل کنید که هر زمان که تغییراتی در عکسها در دایرکتوری Face_Images انجام دهید این برنامه را کامپایل کنید.
اسکریپت شناسایی چهره
اکنون که داده های آموزش دیده ما آماده است ، اکنون می توانیم از آن برای شناسایی چهره ها استفاده کنیم. در برنامه شناسایی چهره ، یک فید ویدیوی زنده از یک وب کم USB دریافت می کنیم و سپس آن را به تصویر تبدیل می کنیم. سپس ما باید از تکنیک تشخیص چهره خود برای شناسایی چهره در آن عکس ها استفاده کنیم و سپس آن را با تمام Face ID که قبلاً ایجاد کرده ایم مقایسه کنیم. اگر تطابقی پیدا کنیم می توانیم چهره ای را با کشیدن یک مربع دور آن مشخص کرده و نام کسی را که شناخته شده است بنویسیم.
این برنامه شباهت زیادی با برنامه مربی دارد ، بنابراین همان ماژول هایی را که قبلاً از آنها استفاده می کردیم وارد میکنیم و همچنین از طبقه بندی استفاده می کنیم زیرا باید دوباره تشخیص چهره را انجام دهیم.
import cv2 import numpy as np import os from PIL import Image
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') recognizer = cv2.createLBPHFaceRecognizer()
در مرحله بعدی در برچسب های متغیر ، باید نام افرادی را که در پوشه ها قرار داده شده اند ، بنویسید. حتماً به همان ترتیب عمل کنید. من از “Aswinth” و “Elon” استفاده کردم.
labels = ["Aswinth", "Elon Musk"]
ما باید فایل face-trainner.yml را در برنامه خود بارگذاری کنیم زیرا برای تشخیص چهره ها باید از داده های آن پرونده استفاده کنیم.
recognizer.load("face-trainner.yml")
فید ویدیو از وب کم USB بدست می آید. اگر بیش از یک دوربین متصل دارید ، 0 را با 1 جایگزین کنید تا به دوربین ثانویه دسترسی پیدا کنید.
cap = cv2.VideoCapture(0) #Get vidoe feed from the Camera
بعد ، ما فیلم را به فریم (تصاویر) می شکنیم و آن را به مقیاس خاکستری تبدیل می کنیم و سپس چهره های موجود در تصویر را تشخیص می دهیم. پس از شناسایی چهره ها ، باید آن منطقه را جداگانه مانند roi_gray ذخیره کنیم.
ret, img = cap.read() # تبدیل ویدئو به فریم gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #تبدیل به مقیاس خاکستری faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5) #شناسایی چهره ها for (x, y, w, h) in faces: roi_gray = gray[y:y+h, x:x+w] #تبدیل تصاویر به مقیاس خاکستری id_, conf = recognizer.predict(roi_gray) #شناسایی تصاویر
متغیر Conf به ما می گوید که نرم افزار چگونه چهره را تشخیص می دهد. اگر سطح اطمینان و تطابق بیش از 80 باشد ، با استفاده از خط کد زیر ، نام شخص را با استفاده از شماره شناسنامه دریافت می کنیم. سپس یک مربع را در اطراف صورت آن کشیده میشود و نام آن را در بالای مربع نوشته میشود.
if conf>=80: font = cv2.FONT_HERSHEY_SIMPLEX #Font style for the name name = labels[id_] #Get the name from the List using ID number cv2.putText(img, name, (x,y), font, 1, (0,0,255), 2) cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
سرانجام باید فید ویدیویی را که اخیراً آنالیز کرده ایم نمایش دهیم و هنگامی که کلید انتظار (در اینجا q) فشرده می شود ، فید را بشکنیم.
cv2.imshow('Preview',img) #Display the Video if cv2.waitKey(20) & 0xFF == ord('q'): break
مطمئن شوید که رزبری پای شما هنگام اجرای این برنامه ، از طریق HDMI به مانیتور متصل شده است. برنامه را اجرا کنید و پنجره ای با پیش نمایش نام و فید ویدیوی خود در آن پیدا خواهید کرد.
موارد موجود در فایل : سورس کامل ، شماتیک
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
سلام و عرض ادب
برای همین پروژه چه تنظیماتی اعمال کنیم که درصورت عدم شناسایی چهره شخص، اخطار بده؟ به عنوان مثال یک سیستم صوتی تهیه کنیم که درصورت عدم شناسایی چهره به سیستم صوتی خود ولتاژ برق اعمال کنه و یجورایی آژیر بکشه؟؟
سلام خسته نباشید
اگه بخوام اسم هرکسی رو که تشخسص داد پرینت بگیره باید چیکار کنم
سلام عزیز، اگر منظورتون پرینت گرفتن در شل پایتون هست که کاری نداره فقط باید تابع print رو استفاده کنید.
متشکر از پاسخگوییتون
خیر منظور اینه وقتی برنامه دور چهره یک مربع کشید و اسمش رو توی اون مربع نوشت ، اون اسم به طور خودکار در همون لحظه شناسایی پرینت بشه و درکل بشه اون اسم رو هر جایی فرستاد
می شه بگین این ارور برای چی هست؟ ممنون
درود و خدا قوت.ببخشید من هر کاری می کنم نمی تونم open cv رو روی پایتون نصب کنم.این ارور رو میده:Traceback (most recent call last):
File “”, line 1, in
import cv2
ImportError: DLL load failed: %1 is not a valid Win32 application.
می شه راهنماییم کنید که مشکل از کجاست؟چندین ورژن از open cv رو نصب کردم ولی باز این ارور رو می ده.حتی تو cmd هم pip install opencv-python می زنم ولی بازم نصب نمی شه.می شه راهنماییم کنید؟ ممنون و تشکر فراوان از شما
سلام.ببخشید باز مزاحمتون شدم.می شه کمی توی نوشتن کد processing این پروژه به من کمک کنید؟ممنون می شم.با تشکر از شما
سلام. بهتر هست کسی رو پیدا کنید که براتون انجام بده. یا با پایتون یا با پراسسینگ
سلام. ببخشید یکم می شه راجع به برنامه ی processing این پروژه به من راهنمایی کنید؟تشکر فراوان از شما و سایت عالیتون
یک آموزش کوتاه در سایت در مورد processing قرار داده شده. آموزش نرم افزار Processing
اگه می شه لطفا بگین می شه با اردوینو انجام داد یا نه؟یعنی مثلا اردوینو رو با زبان پایتون برنامه نویسی کنیم و این پروژه رو انجام بدیم.فقط بگین می شه یا نه.ممنون از سایت عالیتون
سلام جناب، میتونید با processing برنامه نویسی رو انجام بدید و این پروژه رو اجرا کنید. برنامه نویسی آردوینو رو با پایتون انجام ندید میشه بین برنامه ای که برای آردوینو نوشتید و برنامه ای که با پایتون مینویسید ارتباط برقرار کنید. آموزش برنامه نویسی آردوینو با پایتون رو مشاهده کنید.
سلام.می شه این پروژه رو با اردوینو انجام داد؟ ممنون
سلام و وقت بخیر.
نصب dlib چقدر زمان میبره؟ من تقریبا یک ساعت صبر کردم ولی نصب همچنان ادامه داشت. در سطح اینترنت هم کاربرانی بودند که مشکل من را داشتند(یعنی نصب برای مدت زمان طولانی برای آنها ادامه داشت و کامل نشد) ولی راهکاری برای حل داخل فروم ها من پیدا نکردم. نصب dlib زمان بره یا مشکلی وجود داره؟
سلام جناب، بستگی به مدل رزبری پای شما داره، صبر کنید
سلام .
من طبق مراحلی که توضیح داده شده پیش رفتم اما فقط برد ربریرو با کابل HDMI متصل نکردم به لپ تاپ. به جای اون از طریق SSH ارتباط بین برد و لپ تاپ برقرار شده . اما الان وقتی کد رو ران میکنم ، دوریبین فعال میشه و بعد از چند ثانیه عبارت های : select timeout , segmentation fault در ترمینال رزبری نوشته شده و دوربین غیرفعال میشه . در واقع انگار برد نمیتونه خروجی خودش رو جایی نمایش بده .
ممکنه لطفا بگید ایراد کار از کجا میتونه باشه ؟ همان وجود نداشتن اتصال از طریق HDMI باعث این مساله اس ؟
لطفا جواب بدید .. چون شدیدا نیاز دارم به این پروژه
سلام جناب. بله همونطور که در متن آموزش نوشته شده، رزبری پای باید از طریق کابل HDMI به یک صفحه نمایش متصل بشه چون خروجی ویدئو از طریق SSH منتقل نمیشه.
مجددا سلام .
من اتصال HDMI رو هم برقرار کردم . اما همچنان ارور های قبلی رو میگیرم .
من به جای وبکم USB دارم از ماژول دوربین رزبری استفاده میکنم … این بخش ک مشکلی نداره ؟ چون مهم اینه ک تصاویر رو به عنوان ورودی از یک دوربین بگیره . حالا چه وبکم و چه ماژول دوربین
ممنون از جوابتون
سلام. بعد از اتصال با HDMI لطف کنید مراحل رو از اول برید همچنین برای نصب OpenCV هم از روشی که در آموزش لینک داده شده استفاده کنید. و اینکه برای استفاده از ماژول دوربین پای من مطمئن نیستم چون آموزش با توجه به استفاده از وبکم هست و ممکنه برای دوربین پای نیاز به تغییر در پروژه و همچنین نصب موارد اضافی باشه. چون ورودی که از وبکم میاد یا از دوربین پای ممکنه از مکان مختلفی بیان.
من برای تغییر دادن عکس ها به مشکل برمیخورم . و نمیدونم که محتوی دو فایل face-trainner.yml و haarcascade_frontalface_default.xml چطوری تغییر میکنند . در واقع برای اینکه چهره های دیگه ای رو تشخیص بده (یعنی محتوی پوشه ی ّFace_
Images رو با عکس هایی از چهره های دلخواه جایگزین کرده باشیم )این دو تا فایلی که گفتم رو باید خود ما تغییری بدیم یا اینکه فقط برنامه رو کامپایل کنیم و تغییرات لازم در اون ها اعمال میشه ؟
خیلی ممنون میشم در اسرع وقت پاسخ بدید
سلام. با نرم افزار Notepad میتونید فایل ها رو تغییر بدید یا اگر پروژه بزرگی نیست عکس های مورد نظرتون رو با نام عکس های موجود در پوشه مربوطه قرار بدید. همچنین لینک به ایمیلتون ارسال شد.