پروژه الکترونیکپروژه های پایتونپروژه های پردازش تصویرپروژه های رزبری پای

پروژه شناسایی چهره با OpenCV و رزبری پای + فیلم عملکرد

سلام. پروژه تشخیص چهره با OpenCV و رزبری پای + فیلم عملکرد را آماده کردیم.

آموزش تشخیص صورت با Open CV و Raspberry pi

بحث تشخیص چهره با سرعت بالایی در حال رشد است. این مبحث کاربرد فراوانی در سیستم امنیتی خانه ها، ادارات و … دارد. چین برای نظارت بر حضور و رفتار دانش آموزان از فناوری تشخیص چهره استفاده میکرده است. با امکانات زیادی که این مبحث در اختیار ما قرار میدهد، بی شک بزودی شاهد افزایش همه گیر شدن تشخیص چهره خواهیم بود.

در این پروژه رزبری پای خواهیم آموخت که چگونه میتوانیم با استفاده از کتابخانه OpenCv روی Raspberry pi یک سیستم تشخیص چهره بسازیم. مزیت اجرای این پروژه با رزبری پای این است که میتوانید آن را در هر جایی نصب کنید تا به عنوان سیستم نظارتی کار کند. مانند همه سیستم های تشخیص چهره، پروژه ما نیز شامل دو اسکریپت پایتون است. اسکریپت اول برنامه Trainer است که مجموعه از عکس های یک شخص خاص را تجزیه و تحیل میکند و اسکریپت دیگر برنامه ای است که چهره را تشخیص میدهد و نام شخص را اعلام میکند. هر دو برنامه مربوط به لینوکس و رزبری پای هستند اما روی ویندوز هم با ایجاد تغییرات جزئی کار میکنند.

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

آموزش تشخیص صورت با Open CV و Raspberry pi

همانطور که قبلاً گفته شد ، ما از کتابخانه 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 را نصب کند و در صورت موفقیت ، صفحه ای مانند تصویر زیر مشاهده خواهید کرد.

نصب dlib در رزبری پای

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

نصب Pillow : Pillow همچنین با نام PIL مخفف کتابخانه تصویربرداری Python است که برای باز کردن ، دستکاری و ذخیره تصاویر در قالب های مختلف استفاده می شود. برای نصب PIL از دستور زیر استفاده کنید

Pip install pillow

پس از نصب یک پیام موفقیت آمیز مطابق شکل زیر دریافت خواهید کرد

نصب Pillow در Raspberry pi

نصب face_recognition: کتابخانه face_recognition ساده ترین کتابخانه پایتون برای تشخیص و دستکاری چهره ها محسوب می شود. ما برای شناسایی چهره ها از این کتابخانه استفاده خواهیم کرد. برای نصب این کتابخانه دستور زیر را وارد کنید.

Pip install face_recognition –no –cache-dir

هنگامی که با موفقیت نصب شد باید صفحه ای مانند تصویر زیر مشاهده کنید. این کتابخانه سنگین است و اکثر مردم با مشکلات حافظه روبرو می شوند ، از این رو من از کد —no –cache-dir برای نصب کتابخانه بدون ذخیره فایل های حافظه نهان استفاده کرده ام.

نصب face_recognition در رزبری پای

پوشه پروژه شناسایی چهره Face Recognition

پوشه پروژه ما شامل دو برنامه پایتون به نام های Face_Trainner.py و Face_Recog.py خواهد بود. پوشه ای به نام Face_Images شامل تصاویر نمونه افرادی است که باید شناخته شوند است. یک پرونده طبقه بندی کننده به نام “haarcascade_frontalface_default.xml” که برای تشخیص چهره استفاده می شود. و در آخر ، یک فایل به نام “face-trainner.yml” که با استفاده از برنامه Face_Trainner.py بر اساس تصاویر موجود در پوشه Face_Images تولید می شود. تمام پرونده های پوشه پروژه در زیر نشان داده شده است. تمام فایل ها را میتوانید از انتهای صفحه دانلود کنید.

پوشه پروژه تشخیص چهره Face Recognition

تنظیم دایرکتوری Face_Images با چهره های نمونه

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

تنظیم دایرکتوری Face_Images با چهره های نمونه

شما باید پوشه را با نام شخصی که بخواهید بشناسید تغییر دهید و همچنین عکس ها را با آن شخص جایگزین کنید. حداقل 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 انجام دهید این برنامه را کامپایل کنید.

برنامه مربی چهره Face Trainer

اسکریپت شناسایی چهره

اکنون که داده های آموزش دیده ما آماده است ، اکنون می توانیم از آن برای شناسایی چهره ها استفاده کنیم. در برنامه شناسایی چهره ، یک فید ویدیوی زنده از یک وب کم 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 به مانیتور متصل شده است. برنامه را اجرا کنید و پنجره ای با پیش نمایش نام و فید ویدیوی خود در آن پیدا خواهید کرد. فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.

دانلود فیلم پروژه تشخیص و شنایایی چهره با رزبری پای

موارد موجود در فایل : سورس کامل ، شماتیک

پروژه ها رایگان هستند. برای دانلود فایل های پروژه باید در سایت عضو باشید. ثبت نام / ورود

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید
امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. مالکیتی بر مطالب ارائه شده ندارم. اکثر فعالیت بنده در زمینه ترجمه است. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

8 نظر

  1. سلام و وقت بخیر.
    نصب dlib چقدر زمان میبره؟ من تقریبا یک ساعت صبر کردم ولی نصب همچنان ادامه داشت. در سطح اینترنت هم کاربرانی بودند که مشکل من را داشتند(یعنی نصب برای مدت زمان طولانی برای آن‌ها ادامه داشت و کامل نشد) ولی راهکاری برای حل داخل فروم ها من پیدا نکردم. نصب dlib زمان بره یا مشکلی وجود داره؟

    1. سلام جناب، بستگی به مدل رزبری پای شما داره، صبر کنید

  2. سلام .
    من طبق مراحلی که توضیح داده شده پیش رفتم اما فقط برد ربریرو با کابل HDMI متصل نکردم به لپ تاپ. به جای اون از طریق SSH ارتباط بین برد و لپ تاپ برقرار شده . اما الان وقتی کد رو ران میکنم ، دوریبین فعال میشه و بعد از چند ثانیه عبارت های : select timeout , segmentation fault در ترمینال رزبری نوشته شده و دوربین غیرفعال میشه . در واقع انگار برد نمیتونه خروجی خودش رو جایی نمایش بده .
    ممکنه لطفا بگید ایراد کار از کجا میتونه باشه ؟ همان وجود نداشتن اتصال از طریق HDMI باعث این مساله اس ؟
    لطفا جواب بدید .. چون شدیدا نیاز دارم به این پروژه

    1. سلام جناب. بله همونطور که در متن آموزش نوشته شده، رزبری پای باید از طریق کابل HDMI به یک صفحه نمایش متصل بشه چون خروجی ویدئو از طریق SSH منتقل نمیشه.

      1. مجددا سلام .
        من اتصال HDMI‌ رو هم برقرار کردم . اما همچنان ارور های قبلی رو میگیرم .
        من به جای وبکم USB دارم از ماژول دوربین رزبری استفاده میکنم … این بخش ک مشکلی نداره ؟ چون مهم اینه ک تصاویر رو به عنوان ورودی از یک دوربین بگیره . حالا چه وبکم و چه ماژول دوربین

        ممنون از جوابتون

        1. سلام. بعد از اتصال با HDMI لطف کنید مراحل رو از اول برید همچنین برای نصب OpenCV هم از روشی که در آموزش لینک داده شده استفاده کنید. و اینکه برای استفاده از ماژول دوربین پای من مطمئن نیستم چون آموزش با توجه به استفاده از وبکم هست و ممکنه برای دوربین پای نیاز به تغییر در پروژه و همچنین نصب موارد اضافی باشه. چون ورودی که از وبکم میاد یا از دوربین پای ممکنه از مکان مختلفی بیان.

        2. من برای تغییر دادن عکس ها به مشکل برمیخورم . و نمیدونم که محتوی دو فایل face-trainner.yml و haarcascade_frontalface_default.xml چطوری تغییر میکنند . در واقع برای اینکه چهره های دیگه ای رو تشخیص بده (یعنی محتوی پوشه ی ّFace_
          Images رو با عکس هایی از چهره های دلخواه جایگزین کرده باشیم )این دو تا فایلی که گفتم رو باید خود ما تغییری بدیم یا اینکه فقط برنامه رو کامپایل کنیم و تغییرات لازم در اون ها اعمال میشه ؟
          خیلی ممنون میشم در اسرع وقت پاسخ بدید

        3. سلام. با نرم افزار Notepad میتونید فایل ها رو تغییر بدید یا اگر پروژه بزرگی نیست عکس های مورد نظرتون رو با نام عکس های موجود در پوشه مربوطه قرار بدید. همچنین لینک به ایمیلتون ارسال شد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *