How to do Age Gender Recognition Easily In Opencv

1991 views Nov 23, 2024

ကျွန်တော်လဲ မအားလို့ စာမရေးဖြစ်တာကြာပြီဆိုတော့ ဒီနေ့မှာတော့ Age Gender recognition လေးဖတ်လို့လွယ်ပြီး ပြန်အသုံးချလို့လွယ်အောင် ရေးပေးလိုက်ပါတယ်။အောက်ကအဆင့်တွေတိုင်း လိုက်လုပ်လို့ရပါတယ်။

ပထမဆုံးလိုအပ်တာလေးတွေ import လုပ်ပြီး face detect လုပ်ပါတယ်။

Step 1:

import cv2
import math
import time
import argparse
 
def getFaceBox(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()
    bboxes = []
    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)
            bboxes.append([x1, y1, x2, y2])
            cv2.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8)
    return frameOpencvDnn, bboxes
 
 
parser = argparse.ArgumentParser()
parser.add_argument('--image', help='Path to input image.')
args = vars(parser.parse_args())
 
faceProto = "opencv_face_detector.pbtxt"
faceModel = "opencv_face_detector_uint8.pb"
 
ageProto = "age_deploy.prototxt"
ageModel = "age_net.caffemodel"
 
genderProto = "gender_deploy.prototxt"
genderModel = "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']
 
# Load network
ageNet = cv2.dnn.readNet(ageModel, ageProto)
genderNet = cv2.dnn.readNet(genderModel, genderProto)
faceNet = cv2.dnn.readNet(faceModel, faceProto)

အရင်ပို့စ်တွေမှာလဲ ပြောပြပြီးသားဆိုတော့ သိလောက်ပြီထင်လို့မပြောတော့ပါဘူး။Opencv နောက်ပိုင်း version မှာပါလာတယ့် dnn module ကနေပဲ pretrained model တွေကို load လုပ်ပြီးသုံးတာဆိုတော့ ဘာမှတော့ထွေထွေထူးထူးမပါပါဘူး။အဓိကက trained ထားတယ့် model ရှိဖို့ပါပဲ။source code file ကို အောက်ဆုံးမှာ download link ပေးထားတာမို့ run ယုံပါပဲ။

အပေါ်ဆုံးမှာ getFaceBox ဆိုပြီး faces တွေရဲ့ location ကို deep learning model နဲ့ detect လုပ်ပါတယ်။ဒီနေရာမှာ haar cascade ကိုသုံးရင် မရဘူးလားဆိုတော့ ရပါတယ် သိပ်တော့မတိကျပါဘူး။ကျွန်တော်တော့ ပျင်းလို့ သူများရဲ့ source code လဲဖြစ်လို့ မပြင်နေတော့ပါဘူး။မိတ်ဆွေတို့ သုံးရအဆင်ပြေအောင်သာ ဒီမှာ တင်ပေးတာပါ။Beginners တွေတွက် အဆင်ပြေတယ်ဆို တင်ပေးရကျိုးနပ်ပါတယ်။

ပြီးတော့ argument parser ကို သုံးပြီး command line ကနေ image path လက်ခံနိုင်အောင် လုပ်ပါတယ်။realtime webcam နဲ့ run ချင်တယ့်သူတွေက အဲ့ argument မထည့်ပါနဲ့။

ပြီးတော့ ကျွန်တော်တို့သုံးမယ့်  pretrained model တွေကို ကြေငြာထားပါတယ်။ဒီမှာ ကျွန်တော် ရှင်းပြရလောက်အောင် ရှုပ်တယ့်ဟာမပါတာမို့ နားလည်မယ်ထင်ပါတယ်။variable တွေ function တွေ နားမလည်သေးဘူးဆို Practical python for beginners online course လေးလုပ်ထားပါတယ်။စိတ်ဝင်စားတယ်ဆို ဝင်ကြည့်ပါ။

# Open a video file or an image file or a camera stream
cap = cv2.VideoCapture(args['image'] if args['image'] else 0)
padding = 20
while cv2.waitKey(1) < 0:
    # Read frame
    t = time.time()
    hasFrame, frame = cap.read()
    if not hasFrame:
        cv2.waitKey()
        break
 
    frameFace, bboxes = getFaceBox(faceNet, frame)
    if not bboxes:
        print("No face Detected, Checking next frame")
        continue
 
    for bbox in bboxes:
        # print(bbox)
        face = frame[max(0,bbox[1]-padding):min(bbox[3]+padding,frame.shape[0]-1),max(0,bbox[0]-padding):min(bbox[2]+padding, frame.shape[1]-1)]
 
        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()]
        # print("Gender Output : {}".format(genderPreds))
        print("Gender : {}, conf = {:.3f}".format(gender, genderPreds[0].max()))
 
        ageNet.setInput(blob)
        agePreds = ageNet.forward()
        age = ageList[agePreds[0].argmax()]
        print("Age Output : {}".format(agePreds))
        print("Age : {}, conf = {:.3f}".format(age, agePreds[0].max()))
 
        label = "{},{}".format(gender, age)
        cv2.putText(frameFace, label, (bbox[0], bbox[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2, cv2.LINE_AA)
        cv2.imshow("Age Gender Demo", frameFace)
        # cv.imwrite("age-gender-out-{}".format(args.input),frameFace)
    print("time : {:.3f}".format(time.time() - t))

webcam နဲ့ ပဲဖြစ်ဖြစ် single image ပဲဖြစ်ဖြစ် လက်ခံနိုင်အောင်လို့ cap = cv2.VideoCapture(args[‘image’] if args[‘image’] else 0) ဆိုပြီး condition လေးနဲ့ ရေးထားပါတယ်။နောက်ပြီးတော့ frameFace, bboxes = getFaceBox(faceNet, frame) ဆိုပြီး အပေါ်မှာရေးထားတဲ့ function ကို ပြန်ခေါ်ကာ face detect လုပ်ထားတယ့် image frame ရယ် ရှာတွေ့ထားတယ့် bounding boxes တွေကို ယူလိုက်ပြီး model ထဲ forward လုပ်ပြီး predict လုပ်တာလေးပါပဲ။

အဲ့တော့ ဘယ်လို run ရမလဲဆို

$ python AgeGender.py --image imagePath ကုိထည့္ပါ

webcam ကနေ realtime run ချင်တယ်ဆိုရင်တော့

$ python AgeGender.py

ဆိုပြီးပဲ run ပါ။ကျေးဇူးတင်ပါတယ်။

အောက်က link မှာ project ကို download လုပ်နိုင်ပါတယ်။

Download Here

Source Code Credit: AgeGender Repository