女生比较避讳别人问年龄,于是我偷偷写了一款年龄检测器!

复制代码

人脸检测:

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)

复制代码

性别与年龄预测:

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)

cv.imshow(“Age Gender Demo”, frameFace)

print(“time : {:.3f} ms”.format(time.time() - t))

复制代码

效果图:

​​

​​

​附:

import cv2 as cv

import time

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

faceProto = “D:/projects/opencv_tutorial/data/models/face_detector/opencv_face_detector.pbtxt”

faceModel = “D:/projects/opencv_tutorial/data/models/face_detector/opencv_face_detector_uint8.pb”

ageProto = “D:/projects/opencv_tutorial/data/models/cnn_age_gender_models/age_deploy.prototxt”

ageModel = “D:/projects/opencv_tutorial/data/models/cnn_age_gender_models/age_net.caffemodel”

genderProto = “D:/projects/opencv_tutorial/data/models/cnn_age_gender_models/gender_deploy.prototxt”

genderModel = “D:/projects/opencv_tutorial/data/models/cnn_age_gender_models/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 = cv.dnn.readNet(ageModel, ageProto)

genderNet = cv.dnn.readNet(genderModel, genderProto)

faceNet = cv.dnn.readNet(faceModel, faceProto)

Open a video file or an image file or a camera stream

cap = cv.VideoCapture(0)

padding = 20

while cv.waitKey(1) < 0:

Read frame

t = time.time()

hasFrame, frame = cap.read()

frame = cv.flip(frame, 1)

if not hasFrame:

cv.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 = 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)

cv.imshow(“Age Gender Demo”, frameFace)

print(“time : {:.3f} ms”.format(time.time() - t))

收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

//img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值