1, Introduction
Facial analysis in photos has attracted extensive attention because it can help us solve various problems, including better customer advertising positioning, better content recommendation system, security monitoring and other fields.
Age and gender are important aspects of facial features and their identification is a prerequisite for such activities. Many enterprises use these technologies for a variety of reasons, including easier cooperation with customers, better adaptation to their needs and providing a good experience. People's gender and age make it easier to identify and predict their needs.
Even for us humans, it is difficult to detect gender and age from images because it is completely based on appearance, which is sometimes difficult to predict. The appearance of peers may be very different from what we expect.
application
In monitoring computer vision, age and gender prediction are often used. Advances in computer vision have made this prediction more practical and more acceptable to the public. Because of its practicability in the application of intelligent real world, this research topic has made great progress.
A person's identity, age, gender, emotion and race are all determined by the characteristics of their faces. Age and gender classifications are two of these features that are particularly useful in a variety of practical applications, including
- Security and video surveillance
- human-computer interaction
- Biometric technology
- entertainment
There are still a lot of it.
implementation
Now let's learn how to use the OpenCV Library in Python to determine age and gender through camera or image input.
The framework used is Caffe, which is used to create models using prototype files.
Let's get started. If we haven't installed OpenCV, please make sure it's installed.
$ pip install opencv-python numpy
Step 1: import library
# Import required modules import cv2 as cv import math import time from google.colab.patches import cv2_imshow
Step 2: find the bounding box coordinates in the frame
Using the following user-defined function, we can obtain the coordinates of the bounding box, or the position of the face in the image.
def getFaceBox(net, frame, conf_threshold=0.7): frameOpencvDnn = frame.copy() frameHeight = frameOpencvDnn.shape[0] frameWidth = frameOpencvDnn.shape[1] blob = cv.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]) cv.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8) return frameOpencvDnn, bboxes
Step 3: load the model and weight file
The following files must be included in the project directory:
- gender_net.caffemodel: pre training model weight for gender detection.
- deploy_ gender. Protoxt: the model architecture of gender detection model.
- age_net.caffemodel: pre training model weight for age detection.
- deploy_ age. Protoxt: the model architecture of age detection model.
- res10_300x300_ssd_iter_140000_fp16.caffemodel: pre training model weight for face detection.
- deploy.prototxt.txt: model architecture of face detection model.
We have a for face detection pb file, which is a protobuf file (protocol buffer), which contains the graphic definition and training weight of the model. This is what we will use to execute the trained model. Although pb file contains protobuf in binary format, but pbtxt file contains protobuf in text format. Contains TensorFlow files The prototext file provides age and gender network configuration, while The caffemodel file defines the internal state of layer parameters.
Then, for the face, age and gender detection model, the weight and structural variables are defined.
faceProto = "/content/opencv_face_detector.pbtxt" faceModel = "/content/opencv_face_detector_uint8.pb" ageProto = "/content/age_deploy.prototxt" ageModel = "/content/age_net.caffemodel" genderProto = "/content/gender_deploy.prototxt" genderModel = "/content/gender_net.caffemodel"
Step 4: list of age and gender categories
Set the average value of the model and the list of age groups and genders to classify from.
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']
Step 5: load network
To load the network, use the readNet() method. The first parameter is used to store the training weight, and the second parameter is used to save the network configuration.
# Load network ageNet = cv.dnn.readNet(ageModel, ageProto) genderNet = cv.dnn.readNet(genderModel, genderProto) faceNet = cv.dnn.readNet(faceModel, faceProto)
Step 6: predict gender and age as a function
The following user-defined function is pipline or we can say it is the implementation of the main workflow. In this workflow, the image enters the function to obtain the location and further predict the age range and gender.
def age_gender_detector(frame): # Read frame t = time.time() frameFace, bboxes = getFaceBox(faceNet, frame) 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 = cv.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) cv.putText(frameFace, label, (bbox[0], bbox[1]-10), cv.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2, cv.LINE_AA) return frameFace
Step 7: Forecast
from google.colab import files uploaded = files.upload() input = cv.imread("2.jpg") output = age_gender_detector(input) cv2_imshow(output)
Here, we can see that the confidence of gender prediction is 1 (100%), while the confidence of age prediction is lower because it is difficult to be accurate.
In this article, we learned how to create an age predictor that can also detect your face and highlight it with a border.