当前位置: 首页 > news >正文

【python】OpenCV—Age and Gender Classification

在这里插入图片描述

文章目录

  • 1、任务描述
  • 2、网络结构
    • 2.1 人脸检测
    • 2.2 性别分类
    • 2.3 年龄分类
  • 3、代码实现
  • 4、结果展示
  • 5、参考

1、任务描述

性别分类和年龄分类预测

2、网络结构

2.1 人脸检测

在这里插入图片描述

在这里插入图片描述

输出最高的 200 个 RoI,每个 RoI 7 个值,(xx,xx,score,x0,y0,x1,y1)

2.2 性别分类

二分类

在这里插入图片描述

在这里插入图片描述

2.3 年龄分类

按年龄区间分类 ageList = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']

在这里插入图片描述

在这里插入图片描述

3、代码实现

先检测人脸,人脸外扩,再性别检测,再年龄检测,最后结果绘制输出

# Import required modules
import cv2 as cv
import math
import time
import argparsedef getFaceBox(net, frame, conf_threshold=0.7):frameOpencvDnn = frame.copy()frameHeight = frameOpencvDnn.shape[0]  # 333frameWidth = frameOpencvDnn.shape[1]  # 500blob = cv.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False)net.setInput(blob)detections = net.forward()  # (1, 1, 200, 7), (xxx, xxx, confidence, x0, y0, x1, y1)bboxes = []for i in range(detections.shape[2]):  # 遍历 top 200 RoIconfidence = 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, bboxesparser = argparse.ArgumentParser(description='Use this script to run age and gender recognition using OpenCV.')
parser.add_argument('--input', help='Path to input image or video file. ''Skip this argument to capture frames from a camera.',default="jolie.jpg")
parser.add_argument("--device", default="cpu", help="Device to inference on")args = parser.parse_args()args = 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 = cv.dnn.readNet(ageModel, ageProto)
genderNet = cv.dnn.readNet(genderModel, genderProto)
faceNet = cv.dnn.readNet(faceModel, faceProto)if args.device == "cpu":ageNet.setPreferableBackend(cv.dnn.DNN_TARGET_CPU)genderNet.setPreferableBackend(cv.dnn.DNN_TARGET_CPU)faceNet.setPreferableBackend(cv.dnn.DNN_TARGET_CPU)print("Using CPU device")elif args.device == "gpu":ageNet.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA)ageNet.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA)genderNet.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA)genderNet.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA)genderNet.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA)genderNet.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA)print("Using GPU device")# Open a video file or an image file or a camera stream
cap = cv.VideoCapture(args.input if args.input else 0)
padding = 20
while cv.waitKey(1) < 0:# Read framet = time.time()hasFrame, frame = cap.read()if not hasFrame:cv.waitKey()breakframeFace, bboxes = getFaceBox(faceNet, frame)  # (333, 500, 3), 4 bboxif not bboxes:print("No face Detected, Checking next frame")continuefor 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()]# array([[9.9999559e-01, 4.4012304e-06]], dtype=float32), 'Male'# print("Gender Output : {}".format(genderPreds))print("Gender : {}, conf = {:.3f}".format(gender, genderPreds[0].max()))ageNet.setInput(blob)agePreds = ageNet.forward()"""array([[5.3957672e-05, 5.3967893e-02, 9.4579268e-01, 1.0875276e-04, 5.0436443e-05, 1.2142612e-05, 1.0151542e-05, 3.9845672e-06]],dtype=float32)"""age = ageList[agePreds[0].argmax()]  # '(8-12)'# print("Age Output : {}".format(agePreds))# print("Age : {}, conf = {:.3f}".format(age, agePreds[0].max()))label = "{},{}".format(gender, age)  # Out[15]: 'Male,(8-12)'cv.putText(frameFace, label, (bbox[0], bbox[1]-5), cv.FONT_HERSHEY_SIMPLEX,0.6, (0, 0, 255), 2, cv.LINE_AA)# cv.imshow("Age Gender Demo", frameFace)cv.imwrite("age-gender-out-{}".format(args.input), frameFace)print("time : {:.3f}".format(time.time() - t))

4、结果展示

输入图片

在这里插入图片描述

人脸检测结果

在这里插入图片描述

人脸外扩

在这里插入图片描述

输出结果

在这里插入图片描述

性别还是比较准的

输入图片

在这里插入图片描述

输出结果

在这里插入图片描述

输入图片

在这里插入图片描述

输出结果

在这里插入图片描述

输入图片

在这里插入图片描述

输出结果

在这里插入图片描述

输入图片

在这里插入图片描述

输出结果

在这里插入图片描述

5、参考

OpenCV进阶(8)性别和年龄识别

http://www.lryc.cn/news/436079.html

相关文章:

  • python安装换源
  • JavaScript练手小技巧:利用鼠标滚轮控制图片轮播
  • 搭建Eureka高可用集群 - day03
  • 并行程序设计基础——并行I/O(2)
  • Java三种创建多线程的方法
  • 828华为云征文 | 云上私人数据管家,jMalCloud个人网盘在华为云Flexus的Docker化部署实践
  • C# 开源教程带你轻松掌握数据结构与算法
  • 由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(五)
  • python爬虫基础:了解html
  • spring security OAuth2 客户端接入gitee
  • 阿里云镜像报错 [Errno 14] HTTP Error 302 - Found 问题解决记录
  • 《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》
  • 深入剖析嵌套调用和链式访问,以及函数的声明和定义(超全面覆盖)
  • 浏览器百科:网页存储篇-IndexedDB介绍(十)
  • Java语言程序设计基础篇_编程练习题*18.22 (将十进制數转换为十六进制数)
  • 蓝桥杯3. 压缩字符串
  • Java设计模式之责任链模式详细讲解和案例示范
  • ubuntu_如何解决apt install时报错:Waiting for cache lock: Could not get lock
  • 软件测试(D5)
  • CSS 圆角渐变边框
  • 骑砍2霸主MOD开发(26)-使用TrfExporterBlender制作TRF文件
  • Leetcode 最大子数组和
  • 目标检测-YOLOv2
  • 大数据 - OLAP与OLTP的区别
  • win10+eclipse+ESP8266_RTOS_SDK开发环境构建
  • 树形弹窗选择框/vue2/Element/弹框选择
  • Python精选200Tips:121-125
  • 对接后端download接口报未知异常错误
  • vue3 指定元素全屏 screenfull(可直接粘贴使用)
  • 【规范】Git Commit 约定式提交规范