تشخیص سن با استفاده از یادگیری عمیق در OpenCV با پایتون
- زمان مطالعه: 8 دقیقه
- اشتراک گذاری این نوشته در:
وظیفه پیشبینی سن ممکن است در ابتدا ساده به نظر برسد، اما در برنامههای دنیای واقعی کاملاً چالش برانگیز است. در حالی که پیشبینی سن معمولاً به عنوان یک مسئله رگرسیون در نظر گرفته میشود، این رویکرد با عدم قطعیتهای زیادی مانند کیفیت دوربین، روشنایی، شرایط آب و هوایی، پسزمینه و غیره روبرو است. در این مقاله، برنامهای خواهیم ساخت که سن یک فرد را از روی یک تصویر با استفاده از یادگیری عمیق پیشبینی میکند، یعنی پروژه پیشبینی سن با استفاده از OpenCV.
روند کار مدل پیشبینی سن
به جای پیشبینی دقیق سن، رویکرد مؤثرتر، دستهبندی سن در محدودههای خاص است. محققان دریافتند که این رویکرد طبقهبندی، دقت را در سناریوهای دنیای واقعی به طور قابل توجهی بهبود میبخشد. گردش کار برای ساخت سیستم تشخیص سن شامل موارد زیر است:
1- Live Feed: این فرآیند معمولاً با یک جریان ویدیویی از دوربین یا وبکم است، آغاز میشود. این Feed فریم به فریم پردازش میشود تا چهرهها را در لحظه تشخیص دهد.
2- Face Detection Model (مدل تشخیص چهره): خروجی بخش شماره یک از یک مدل تشخیص چهره عبور میکند. این مدل با استفاده از یک رویکرد مبتنی بر یادگیری عمیق مانند ماژول DNN در OpenCV، چهرهها را در داخل فریم تشخیص میدهد.
3- Crop Face Blob from Frame (برش تصویر چهره از فریم): پس از شناسایی چهرهها، مرحله بعدی برش ناحیه چهره از فریم شناسایی شده است. این ناحیه مورد نظر برای پیشبینی سن به مراحل بعدی منتقل میشود.
4- Age Detection Model (مدل تشخیص سن): چهره برش داده شده به مدل تشخیص سن منتقل میشود. این مدل با طبقهبندی افراد در محدودههای سنی خاص، سن آنها را پیشبینی میکند. این مدل از شبکههای از پیش آموزش دیده برای پیشبینی بر اساس ویژگیهای چهره استفاده میکند.
5- Gender Detection Model (مدل تشخیص جنسیت): مشابه تشخیص سن، چهره برش داده شده نیز به مدل تشخیص جنسیت منتقل میشود. این مدل جنسیت مانند مرد یا زن را بر اساس ویژگیهای چهره آنها پیشبینی میکند.
6- Output Image (تصویر خروجی): در نهایت سن و جنسیت پیشبینیشده به صورت حاشیهنویسی متنی روی فریم اضافه میشوند. فریم پردازششده با این حاشیهنویسیها به عنوان تصویر خروجی نشان داده میشود.
حالا که روندکار را میدانیم، میتوانیم شروع به پیاده سازی مدل در پایتون کنیم.
پیادهسازی مدل پیشبینی سن با کتابخانه OpenCV
برای سادگی و درک بهتر، ما فقط سن فرد را پیشبینی میکنیم. در اینجا فرآیند گام به گام پیادهسازی آن آمده است.
ابتدا باید کتابخانههای numpy و OpenCV را برای پروژه وارد کنیم.
import cv2
import numpy as np
from google.colab.patches import cv2_imshow
در صورت استفاده از سیستمعامل Linux دستورهای زیر را خط به خط وارد کنید:
sudo apt-get python3-pip python3-opencv
pip install opencv-python
برای اطمینان از نصب کتابخانه، وارد IDLE پیشفرض پایتون شده و دستور زیر را وارد کنید:
import cv2
بارگذاری مدلهای از پیش آموزشدیده
در مرحله بعد، مدلهای از پیش آموزشدیده برای تشخیص چهره و پیشبینی سن را بارگذاری خواهیم کرد. ماژول شبکه عصبی عمیق (DNN) در OpenCV به ما امکان استفاده از این مدلها را میدهد.
face_proto = "opencv_face_detector.pbtxt"
face_model = "opencv_face_detector_uint8.pb"
age_proto = "age_deploy.prototxt"
age_model = "age_net.caffemodel"
face_net = cv2.dnn.readNetFromTensorflow(face_model, face_proto)
age_net = cv2.dnn.readNetFromCaffe(age_proto, age_model)
تشخیص چهره در تصویر
اکنون تابعی را برای تشخیص چهره در یک تصویر تعریف میکنیم. این تابع از ماژول DNN در OpenCV برای پردازش تصویر و یافتن چهرهها استفاده میکند.
cv2.dnn.blobFromImage: تصویر را به فرمت blob مورد نیاز مدل DNN تبدیل میکند.
net.setInput(blob): ورودی را برای مدل تشخیص چهره تنظیم میکند.
()net.forward: مسیر رو به جلو را برای تشخیص چهرهها اجرا میکند.
confidence threshold: چهرههایی را که اطمینان تشخیص پایینی دارند، فیلتر میکند.
def detect_faces(net, frame, conf_threshold=0.7):
frame_height = frame.shape[0]
frame_width = frame.shape[1]
blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300), [104, 117, 123], False, False)
net.setInput(blob)
detections = net.forward()
face_boxes = []
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > conf_threshold:
x1 = int(detections[0, 0, i, 3] * frame_width)
y1 = int(detections[0, 0, i, 4] * frame_height)
x2 = int(detections[0, 0, i, 5] * frame_width)
y2 = int(detections[0, 0, i, 6] * frame_height)
face_boxes.append([x1, y1, x2, y2])
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), int(round(frame_height/150)), 8)
return frame, face_boxes
پیشبینی سن
پس از شناسایی چهرهها، میتوانیم سن هر چهره شناسایی شده را پیشبینی کنیم. این کار با پیشپردازش تصویر چهره و عبور آن از مدل پیشبینی سن انجام میشود.
cv2.dnn.blobFromImage: تصویر چهره را با تغییر اندازه و نرمالسازی آن برای ورودی به مدل پیشبینی سن آماده میکند.
()net.forward: عبور رو به جلو را برای پیشبینی سن اجرا میکند.
()age_preds[0].argmax: شاخص بالاترین احتمال را پیدا میکند که مربوط به محدوده سنی پیشبینی شده است.
def predict_age(face, net):
blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), MODEL_MEAN_VALUES, swapRB=False)
net.setInput(blob)
age_preds = net.forward()
age = age_list[age_preds[0].argmax()]
return age
پردازش یک تصویر واحد
در نهایت، تابعی برای پردازش یک تصویر تعریف خواهیم کرد. این تابع تصویر را بارگذاری میکند، چهرهها را تشخیص میدهد، سن هر چهره را پیشبینی میکند و نتیجه را نمایش میدهد.
cv2.imread: تصویر را از مسیر ارائه شده میخواند.
detect_faces: چهرههای موجود در تصویر را تشخیص میدهد.
predict_age: سن هر چهره را پیشبینی میکند.
cv2.putText: سن پیشبینی شده را به عنوان متن روی تصویر اضافه میکند.
cv2_imshow: تصویر را نمایش میدهد.
def process_image(image_path):
frame = cv2.imread(image_path)
if frame is None:
print(f"Error: Image not found at {image_path}")
return
frame, face_boxes = detect_faces(face_net, frame)
for (x1, y1, x2, y2) in face_boxes:
face = frame[max(0, y1-20):min(y2+20, frame.shape[0]-1),
max(0, x1-20):min(x2+20, frame.shape[1]-1)]
age = predict_age(face, age_net)
cv2.putText(frame, f"Age: {age}", (x1, y1-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2, cv2.LINE_AA)
cv2_imshow(frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
image_path = "kid1.jpg"
process_image(image_path)
نمونهای از نتایج به دست آماده












