概述

前面我写了很多篇关于OpenCV DNN应用相关的文章,这里再来一篇文章,用OpenCV DNN实现一个很有趣好玩的例子,基于Caffe的预训练模型实现年龄与性别预测,这个在很多展会上都有展示,OpenCV DNN实现这里非常简洁明了,总共不到100行的代码。下面就来说一下怎么实现的,首先下载两个Caffe的预训练模型:

Gender Net and Age Net

https://www.dropbox.com/s/iyv483wz7ztr9gh/gender_net.caffemodel?dl=0"

https://www.dropbox.com/s/xfb20y596869vbb/age_net.caffemodel?dl=0"

上述两个模型一个是预测性别的,一个是预测年龄的,性别预测返回的是一个二分类结果

Male
Female

年龄预测返回的是8个年龄的阶段!

'(0-2)',
'(4-6)',
'(8-12)',
'(15-20)',
'(25-32)',
'(38-43)',
'(48-53)',
'(60-100)'

人脸检测是基于OPenCV DNN模块自带的残差网络的人脸检测算法模型!非常的强大与好用!

实现步骤

完整的实现步骤需要如下几步:

  1. 预先加载三个网络模型

  2. 打开摄像头视频流/加载图像

  3. 对每一帧进行人脸检测

    - 对检测到的人脸进行性别与年龄预测

    - 解析预测结果

    - 显示结果

代码实现详解

加载模型

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)

人脸检测

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 timedef 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, bboxesfaceProto = "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 framet = time.time()hasFrame, frame = cap.read()frame = cv.flip(frame, 1)if not hasFrame:cv.waitKey()breakframeFace, bboxes = getFaceBox(faceNet, frame)if 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()]# 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))

任何程序错误,以及技术疑问或需要解答的,请扫码添加作者VX

源码与模型下载地址

https://github.com/xiaobingchan/opencv_tutorial

Opencv dnn实现人类性别检测和年龄预测相关推荐

  1. OpenCV DNN支持的对象检测模型

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 引言 OpenCV DNN不光支持图像 ...

  2. mask rcnn属于dnn么_基于OpenCV DNN的 MaskRCNN 目标检测与实例分割

    这里主要记录基于 OpenCV 4.x DNN 模块和 TensorFlow MaskRCNN 开源模型的目标检测与实例分割 的实现. MaskRCNN 不仅可以检测图片或视频帧中的物体边界框,还可以 ...

  3. 【年龄估计系列 三】keras实现网络照相机的实时性别/年龄预测

    目录 1.简介 2.工作流程 (1)输入图像 (2)人脸检测 (3)人脸分割 (4)特征提取和年龄性别检测 3.深入理解 4.延伸阅读 1.简介 你是否曾经有过这样的时刻:猜测另一个人的年纪?下面这个 ...

  4. Opencv 深度学习识别性别和检测年龄

    目录 1基于CNN的性别分类建模原理 1.1 人脸识别 1.2 性别预测 1.3 年龄预测 1.4 结果 2 代码 参考 本教程中,我们将讨论应用于面部的深层学习的有趣应用.我们将估计年龄,并从单个图 ...

  5. 用 OpenCV 进行年龄和性别检测

    在本文中,我将带您完成用 Python 进行机器学习的年龄和性别检测的任务.年龄和性别检测属于计算机视觉的范畴,因此我将在Python中使用OpenCV库. 在开始使用Python进行年龄和性别检测任 ...

  6. 深度学习与OpenCV DNN模块:权威指南

    计算机视觉领域自20世纪60年代末就已经存在.图像分类和目标检测是计算机视觉领域的一些最古老的问题,研究人员已经努力解决了几十年.使用神经网络和深度学习,我们已经达到了一个阶段,计算机可以开始真正地理 ...

  7. opencv实现人脸检测、性别和年龄预测

    opencv实现人脸检测.性别和年龄预测 文章目录: 一.下载预训练的模型 1.下载模型 2.模型说明 二.实现步骤 1.加载模型 2.人脸检测 3.性别与年龄预测 4.完整代码 主要是通过openc ...

  8. python 数据结构转换层_[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)...

    在本教程中,我们将讨论应用于面部的深度学习的有趣应用.我们将估计年龄并从单个图像中找出该人的性别.该模型由Gil Levi和Tal Hassner训练.我们将简要讨论本文的主要思想,并提供有关如何在O ...

  9. 使用 Python 进行年龄和性别检测,这个结果搞笑了

    在本文中,我将使用 Python 编程语言带您完成使用机器学习进行年龄和性别检测的任务.年龄和性别检测是计算机视觉的任务,因此我将使用 Python 中的 OpenCV 库. 在开始使用 Python ...

最新文章

  1. Android实现导航菜单随着ListView联动,当导航菜单遇到顶部菜单时停止在哪里,并且listview仍能滑动...
  2. React 学习总结
  3. 数据拆分缺点和解决方案
  4. python万年历源代码_python万年历实现代码 含运行结果
  5. “LINQ已死”论 为言论1 致歉 [Java | .Net | 致歉 ]
  6. java学习之操作符
  7. elasticsearch RestHighLevelClient 使用方法及封装工具
  8. mysql数据库腾讯云添加用户,解决腾讯云cdb的基础版mysql不支持新建账号
  9. matlab 稀疏矩阵求 特征值
  10. [Mac]制作MacOs Mojave系统盘教程 (全新安装 MacOs系统)
  11. 【计算机组成】内存和芯片存储容量问题
  12. srsLTE学习笔记(一)——eNB配置文件enb.conf解析
  13. rxjava背压_关于Rx Java:如何在RxJava RabbitMQ Observable中实现背压?
  14. SQLDbx使用教程:SQLDbx工具如何连接数据库(MS SQLServer)
  15. SpringBoot整合微信扫码登录
  16. 渗透测试-微信刷票漏洞(IP伪造)
  17. BIOMOD2模型、MaxEnt模型物种分布模拟,生物多样性生境模拟,论文写作
  18. python 画三角函数_Python计算三角函数之asin()方法的使用
  19. 研究生哪些行为可以在导师那超加分?
  20. android wi-fi_如何在Android上限制计量Wi-Fi网络的背景数据

热门文章

  1. accept和select的区别
  2. linux常用网络命令ping和arping
  3. 性能测试工具SilkPerformer介绍
  4. Asp.net2.0水晶报表的一些示例源码
  5. python直接连接oracle_python连接oracle
  6. MyEclipse2014破解
  7. java 顺序栈_Java实现顺序栈
  8. linux版本fedora,技术|初级:如何更新 Fedora Linux 系统
  9. win主机上搭建php网站运行环境,Windows server 2008搭建php运行环境图文详解(php5.3)
  10. java oracle 排序_Oracle的排序和限制条件(order by 和where)