خریدی لذت بخش تر با کد تخفیف بیست درصدی: khanecode20
سبد خرید
0

No products in the cart.

Return To Shop
  • تمام دسته ها
  • وبلاگ

تشخیص سن با استفاده از یادگیری عمیق در OpenCV با پایتون

Age Detection

تشخیص سن با استفاده از یادگیری عمیق در OpenCV با پایتون

وظیفه پیش‌بینی سن ممکن است در ابتدا ساده به نظر برسد، اما در برنامه‌های دنیای واقعی کاملاً چالش برانگیز است. در حالی که پیش‌بینی سن معمولاً به عنوان یک مسئله رگرسیون در نظر گرفته می‌شود، این رویکرد با عدم قطعیت‌های زیادی مانند کیفیت دوربین، روشنایی، شرایط آب و هوایی، پس‌زمینه و غیره روبرو است. در این مقاله، برنامه‌ای خواهیم ساخت که سن یک فرد را از روی یک تصویر با استفاده از یادگیری عمیق پیش‌بینی می‌کند، یعنی پروژه پیش‌بینی سن با استفاده از 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)
				
			

نمونه‌ای از نتایج به دست آماده

Age Detection

در اینجا از تصویر یک کودک برای پیش‌بینی سن او استفاده شده است و می‌توانیم ببینیم که مدل با دادن محدوده سنی ۴ تا ۶ سال برای کودک، به خوبی کار می‌کند.

ما می‌توانیم به راحتی این رویکرد را برای پردازش فیدهای real-time video تطبیق دهیم و با اضافه کردن ویژگی‌هایی مانند طبقه‌بندی جنسیت یا تشخیص احساسات، سیستم را بیشتر بهبود بخشیم. علاوه بر این، آزمایش با مدل‌های از پیش آموزش‌دیده سفارشی مانند YOLO برای تشخیص چهره می‌تواند دقت و عملکرد را بهبود بخشد.

تبریک می‌گویم! شما موفق شدید برنامه تشخیص سن را با پایتون بسازید. امیدواریم از این پست آموزشی لذت برده و نکات تازه‌ای را یاد گرفته باشید. بهترین راه برای تمرین مهارت‌های کدنویسی این است که پروژه‌های سرگرم‌کننده را پیاده‌سازی کنید. در سایت خانه کد، پروژه‌های متنوعی برای بهبود برنامه نویسی شما کاربران عزیز با ❤️ فراهم کرده‌ایم. برای دسترسی به مجموعه کدهای تمرینی جذاب پایتون در سطوح مختلف از اینجا(کلیک کنید) وارد شوید.

اگر شما تابه‌حال با استفاده از پایتون برنامه‌ای برای تشخیص سن پیاده سازی نمودید، برای ما از مشکلاتی که بر سر راهتان وجود داشته بنویسید.

انجام پروژه‌های پایتونی و مجموعه‌داده‌های آماده با خانه‌کد

برای انجام پروژه‌های پایتونی خود با خانه‌کد در تماس باشید؛ هدف ما انجام پروژه‌های شما در زمانی کوتاه و البته با دقت و بازدهی ایده‌آل است. همینطور در خانه کد مجموعه‌داده‌های مختلف در حوزه‌های پژوهشی مختلف موجود هستند. برای دریافت مجموعه‌داده مورد نظر خود، از طریق فرم زیر با ما در تماس باشید تا براساس نیاز شما مجموعه داده لازم را تهیه کنیم. 

در کنار هم تا رسیدن به بهترین‌ها

10

محمدرضا باغبانی‌ام. دانش‌آموخته رشته کامپیوتر؛ عاشق یادگیری و یاد دادن... مطلبی که مطالعه کردید و مطالب دیگر داخل سایت را با ❤️ نوشته‌ام و امید دارم به افزودن دانش شما و ترقی جامعه کمک کنم...

ارسال دیدگاه

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

توسط
تومان
رفتن به محتوا