تشخیص سن و جنسیت با رزبری پای و OpenCV (یادگیری عمیق)

محتویات
در این آموزش ، ما می خواهیم از مدل های OpenCV و Deep Learning برای شناسایی جنسیت و سن فردی که جلوی دوربین قرار دارد استفاده کنیم. مدل سن یادگیری عمیق و آشکارساز جنسیتی که امروز قصد استفاده از آن را داریم ، توسط Levi و Hassner در 2015 اجرا و آموزش داده شد. تشخیص سن و جنسیت یک فرآیند دو مرحله ای است:
- مرحله 1: شناسایی چهره ها در جریان فیلم ورودی
- مرحله 2: ناحیه صورت مورد نظر (ROI) را استخراج کرده و الگوریتم سن و جنسیت را برای حدس سن و جنسیت فرد اعمال کنید.
جنسیت پیش بینی شده “مرد” یا “زن” خواهد بود و سن پیش بینی شده می تواند یکی از محدوده های زیر باشد: (0 – 2) ، (4 – 6) ، (8 – 12) ، (15 – 20) ، ( 25 – 32) ، (38 – 43) ، (48 – 53) ، (60 – 100). ما قبلاً از رزبری پای برای برخی از پروژه های پیچیده پردازش تصویر مانند تشخیص چهره با رزبری پای و شناسایی افراد با رزبری پای استفاده کردیم.
در اینجا ، ما فقط به ماژول دوربین و برد رزبری پای با OpenCV نصب شده نیاز داریم. OpenCV در اینجا برای پردازش تصویر دیجیتال استفاده می شود. رایج ترین کاربردهای پردازش تصویر دیجیتال ، تشخیص شی ، تشخیص چهره و شمارش افراد است.
نصب OpenCV
قبل از نصب OpenCV و سایر وابستگی ها ، Raspberry Pi باید کاملاً به روز شود. از دستورات زیر برای به روزرسانی Raspberry Pi به آخرین نسخه استفاده کنید:
sudo apt-get update
سپس از دستورات زیر برای نصب وابستگی های مورد نیاز برای نصب OpenCV در Raspberry Pi خود استفاده کنید.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –y sudo apt-get install libqt4-test –y
پس از آن ، از دستور زیر استفاده کنید تا OpenCV را روی Raspberry Pi خود نصب کنید.
pip3 install opencv-contrib-python==4.1.0.25
قطعات مورد نیاز
- رزبری پای
- ماژول دوربین Pi
برنامه نویسی رزبری پای برای تشخیص سن و جنسیت
کد پروژه تشخیص سن و جنسیت با رزبری پای را می توانید از انتهای صفحه دانلود کنید. در اینجا ما قسمت های مهم کد را توضیح میدهیم.
کد را با فراخوانی کردن بسته های OpenCV و math شروع کنید.
import cv2 import math
از تابع highlightFace() برای بدست آوردن مختصات صورت استفاده می شود. در سه خط اول ارتفاع و عرض قاب را تشخیص می دهیم. در خطوط بعدی مختصات صورت را استخراج میکنیم. سپس از این مختصات برای ایجاد مستطیل در اطراف صورت استفاده کنید.
def highlightFace(net, frame, conf_threshold=0.7): frameOpencvDnn=frame.copy() frameHeight=frameOpencvDnn.shape[0] frameWidth=frameOpencvDnn.shape[1] blob=cv2.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False) net.setInput(blob) detections=net.forward() faceBoxes=[] for i in range(detections.shape[2]): confidence=detections[0,0,i,2] if confidence>conf_threshold: x1=int(detections[0,0,i,3]*frameWidth) y1=int(detections[0,0,i,4]*frameHeight) x2=int(detections[0,0,i,5]*frameWidth) y2=int(detections[0,0,i,6]*frameHeight) faceBoxes.append([x1,y1,x2,y2]) cv2.rectangle(frameOpencvDnn, (x1,y1), (x2,y2), (0,255,0), int(round(frameHeight/150)), 8) return frameOpencvDnn,faceBoxes
در خطوط بعدی به سراغ تشخیص جنسیت و سن میرویم.
faceProto="face_detector/opencv_face_detector.pbtxt" faceModel="face_detector/opencv_face_detector_uint8.pb" ageProto="age_detector/age_deploy.prototxt" ageModel="age_detector/age_net.caffemodel" genderProto="gender_detector/gender_deploy.prototxt" genderModel="gender_detector/gender_net.caffemodel"
لیستی از تصاویر مربوط به مرد و زن و سن را وارد میکنیم.
MODEL_MEAN_VALUES=(78.4263377603, 87.7689143744, 114.895847746) ageList=['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)'] genderList=['Male','Female']
با استفاده از مسیری که قبلاً تعریف شد ، مدل های تشخیص چهره ، تشخیص سن و تشخیص جنسیت را از دیسک بارگیری میکنیم.
faceNet=cv2.dnn.readNet(faceModel,faceProto) ageNet=cv2.dnn.readNet(ageModel,ageProto) genderNet=cv2.dnn.readNet(genderModel,genderProto)
سپس جریان ویدئوی ورودی را دریافت میکنیم.
video=cv2.VideoCapture(0)
در داخل loop، فریم ها را از جریان ویدئو دریافت کرده و سپس تابع ()highlightFace را با پارامتر faceNet و frame فراخوانی میکنیم.
hasFrame,frame=video.read() resultImg,faceBoxes=highlightFace(faceNet,frame)
پس از بدست آوردن باکس صورت ، یک تکه 4 بعدی از تصویر ایجاد می کنیم. با انجام این کار ، آن را مقیاس بندی می کنیم ، اندازه آن را تغییر می دهیم.
blob=cv2.dnn.blobFromImage(face, 1.0, (227,227), MODEL_MEAN_VALUES, swapRB=False)
اکنون ، داده را از مدل تشخیص جنسیت عبور داده و جنسیت را مشخص میکنیم.
genderNet.setInput(blob) genderPreds=genderNet.forward() gender=genderList[genderPreds[0].argmax()]
سپس ما همین روش را برای تشخیص سن دنبال می کنیم.
ageNet.setInput(blob) agePreds=ageNet.forward() age=ageList[agePreds[0].argmax()]
اکنون ، پس از دریافت نتایج سن و جنسیت، جنسیت و سن را با استفاده از عملکرد cv2.putText() به تصویر حاصل اضافه کرده و با imshow() نمایش می دهیم.
text = "{}:{}".format(gender, age) cv2.putText(resultImg, text,(faceBox[0], faceBox[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,255,255), 2, cv2.LINE_AA) cv2.imshow("Detecting age and gender", resultImg)
تست پروژه طبقه بندی سن و جنسیت با رزبری پای
قبل از اجرای اسکریپت پایتون ، ماژول دوربین Raspberry Pi Camera را مطابق تصویر زیر به رزبری پای متصل کنید.
اکنون ، بررسی کنید که دوربین Pi کار می کند یا خیر. پس از بررسی دوربین ، اسکریپت پایتون را اجرا کنید ، پنجره ای پیدا می کنید که در آن ویدیوی شما ظاهر می شود. هنگامی که رزبری پاای سن و جنسیت را تشخیص داد ، آن را در صفحه چاپ می کند.
به این ترتیب می توانید سن و جنسیت را با استفاده از OpenCV و Python تشخیص دهید.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
سلام
ارور دریافت میکنم موقع اجرا
برنامه اجرا نمیشه
Traceback (most recent call last):
File “/home/pi/A&G.py”, line 1, in
import cv2
File “/home/pi/.local/lib/python3.7/site-packages/cv2/__init__.py”, line 3, in
from .cv2 import *
ImportError: libcblas.so.3: cannot open shared object file: No such file or directory