首页 > 其他分享 >使用OpenCV进行实时性别和年龄识别

使用OpenCV进行实时性别和年龄识别

时间:2024-06-17 16:28:40浏览次数:14  
标签:frame cv2 实时 OpenCV 人脸 图像 性别 模型

        在计算机视觉领域,使用深度学习技术进行实时性别和年龄识别是一项具有挑战性和实用性的任务。本文将深入解析一个使用OpenCV和预训练模型实现的实时性别和年龄识别代码,并逐行进行详细的注释解析,帮助读者理解代码的工作原理和实现细节。

import cv2
import numpy as np
from PIL import ImageDraw
from PIL import ImageFont
from PIL import Image

        首先,我们导入所需的库,包括OpenCV(cv2)、NumPy(numpy)和Python Imaging Library(PIL)。这些库用于图像处理和显示。

#-------模型初始化-----
# 模型(网络模型/预训练模型):face/age/gender(脸、年龄、性别)
faceProto="model/opencv_face_detector.pbtxt" # TensorFlow,模型的结构文件
faceModel="model/opencv_face_detector_uint8.pb"  # TensorFlow模型权重参数
ageProto="model/deploy_age.prototxt" # TensorFlow,模型的结构文件
ageModel="model/age_net.caffemodel"  # TensorFlow模型权重参数
genderProto="model/deploy_gender.prototxt" # TensorFlow,模型的结构文件
genderModel="model/gender_net.caffemodel"  # TensorFlow模型权重参数

        在这一部分,我们定义了用于人脸检测、年龄识别和性别识别的预训练模型的文件路径。

#加载网络
faceNet=cv2.dnn.readNet(faceModel,faceProto)  #人脸  facenet是已经搭建好并训练好的神经网络模型
ageNet=cv2.dnn.readNet(ageModel,ageProto)   #年龄
genderNet=cv2.dnn.readNet(genderModel,genderProto)  #性别

        接下来,我们使用OpenCV的dnn模块中的readNet函数加载预训练模型。这些模型包括用于人脸检测的模型、用于年龄识别的模型和用于性别识别的模型。

#--------变量初始化------
mean=(78.4263377603,87.7689143744,114.895847746)  #模型均值
ageList=['0-2岁', '4-6岁', '8-12岁', '15-20岁', '25-32岁', '38-43岁', '48-53岁', '60-100岁']
genderList=['男性','女性']

在这里,我们定义了模型的均值和年龄、性别的类别列表。

#-----------自定义函数,获取人脸包围框----------
def getBoxes(net,frame):
    frameHeight,frameWidth=frame.shape[:2]  #获取高度、宽度

    blob=cv2.dnn.blobFromImage(frame,1.0,(300,300),
                               [104,117,123],True,False)#图片做预处理的
    net.setInput(blob)#调用网络模型,输入图片进行人脸检测
    detections=net.forward()

    faceBoxes=[] #faceBoxes存储检测到的人脸
    for i in range(detections.shape[2]):
        #confindence中每一行保存了7个数据,第3个数据表示置信度,第4,5,6,7分别表示人脸归一化后的坐标位置
        confindence=detections[0,0,i,2]

        if confindence > 0.7:  #筛选一下,将置信度大于0.7侧保留,其余不变了
            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)
            faceBoxes.append([x1,y1,x2,y2])  #人脸框的坐标
            #绘制人脸框
            cv2.rectangle(frame,(x1,y1),(x2,y2),
                          (0,255,0),int(round(frameHeight / 150)),6)
            #返回绘制了人脸框的帧frame,人脸包围框faceBoxes
    return frame,faceBoxes

        这是一个自定义函数,用于获取图像中的人脸包围框。我们首先将图像处理为模型的输入格式,然后调用网络模型进行人脸检测,最后返回绘制了人脸框的图像和检测到的人脸框的坐标。

def cv2AddchineseText(img, text, position, textColor=(0,255,0),textSize = 30):
    # 检查图像是否为numpy数组,如果是则将其转换为PIL图像
    if (isinstance(img, np.ndarray)):
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 
    # 创建一个绘图对象
    draw = ImageDraw.Draw(img) 
    # 加载中文字体
    fontStyle = ImageFont.truetype("C:\WINDOWS\FONTS\DENG.TTF", textSize, encoding="utf-8")  
    # 在图像上绘制文本
    draw.text(position, text, textColor, font = fontStyle)
    # 将PIL图像转换回OpenCV的BGR格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

这是另一个自定义函数,用于在图像上添加中文文本。我们首先将图像转换为PIL格式,然后使用PIL库中的绘图功能添加文本,最后将图像转换回OpenCV格式。

# 打开摄像头,创建VideoCapture对象,参数为0表示使用默认摄像头
cap=cv2.VideoCapture(0)  # 装载摄像头

# 进入视频捕获循环
while True:
    # 读取摄像头捕获的每一帧画面
    _,frame=cap.read()
    # 对捕获的画面进行水平镜像处理
    frame=cv2.flip(frame,1) #镜像处理   
    # 获取人脸包围框、绘制人脸包围框(可能多个)
    frame,faceBoxes=getBoxes(faceNet,frame) 
    # 如果没有检测到人脸,则跳过后续处理并继续下一帧
    if not faceBoxes:  #没有人脸时检测下一帧,后续循环操作不再继续
        frame =cv2AddchineseText(frame,result,(50,100))
        continue
    # 遍历每一个人脸包围框
    for faceBox in faceBoxes:
        # 处理frame,将其处理为符合DNN输入的格式
        blob = cv2.dnn.blobFromImage(frame,1.0,(227,227),mean)        
        # 调用性别预测模型,进行性别预测
        genderNet.setInput(blob) #人脸检测已经完成,性别的检测,227*227
        genderOuts = genderNet.forward()
        gender = genderList[genderOuts[0].argmax()]        
        # 调用年龄预测模型,进行年龄预测
        ageNet.setInput(blob)
        ageOuts = ageNet.forward()
        age = ageList[ageOuts[0].argmax()]
        # 将性别和年龄信息格式化为字符串
        result="{},{}".format(gender,age) # 格式化文本(年龄、性别)
        print(result)        
        # 在画面上添加中文文本
        frame_1 = cv2AddchineseText(frame,result,(0,50))        
        # 显示处理后的画面
        cv2.imshow("result",frame_1)
    # 检测是否按下了Esc键,如果按下则退出程序
    if cv2.waitKey(1)==27: #按下Esc键,退出程序
        break

# 关闭所有窗口
cv2.destroyAllWindows()
# 释放摄像头资源
cap.release()

        在这部分代码中,我们打开了摄像头,并开始了一个无限循环,以便持续获取摄像头捕获的每一帧图像。

  • cap.read()函数用于读取摄像头的每一帧图像。
  • cv2.flip(frame,1)将图像进行水平翻转,因为很多摄像头捕获的图像是镜像的。

        然后,我们调用getBoxes函数获取图像中的人脸包围框,并在图像上绘制这些包围框。如果没有检测到人脸,则程序会继续到下一帧。检测每个人脸包围框,调用模型来预测性别和年龄。我们首先将图像处理为适合模型输入的格式(使用blobFromImage函数),然后分别将其输入到性别识别模型和年龄识别模型中。根据模型输出的概率最大值索引,从年龄和性别列表中获取相应的预测结果,并将它们格式化为文本字符串。调用cv2AddchineseText函数将性别和年龄文本添加到图像中,并通过cv2.imshow显示结果。同时,使用cv2.waitKey(1)等待用户按下Esc键退出程序。

标签:frame,cv2,实时,OpenCV,人脸,图像,性别,模型
From: https://blog.csdn.net/2301_77444219/article/details/139607113

相关文章

  • OpenCV中绘制多边形的函数:fillPoly与polylines
    一、函数接口介绍1.1fillPoly函数这是个重载函数,有2个实现,具体如下:1、重载1voidfillPoly(Mat&img,constPoint**pts,constint*npts,intncontours,constScalar&color,intlineType......
  • 2024 最新谷歌邮箱 Gmail 账号注册完整指南 (多种方法 实时更新)
    Gmail是目前国内外是最常见、使用最广泛的邮箱,基本上持有谷歌邮箱的人可以”横行互联网“。针对很多人反映自己在注册谷歌账号时总是失败,本文整理了截止2024年6月亲测可用的所有注册方法,以图文结合的形式详细手把手带你注册Gmail新账户。 本文将包括:注册Gmail的主......
  • 定义一个结构体变量stu,成员包括学号、姓名、性别、成绩。定义一个指针变量p指向该结构
            一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。编写程序:运行结果:程序分析:        在主函数中声明......
  • OpenCV 根据 URL 读取网络图片
    OpenCV 提供了一个 imread() 函数可以在本地磁盘读取图片并进行各种操作,这里介绍一种方法,可以让OpenCV根据URL也能读取网络图片(配合Nginx服务更好用)参考链接:【Python】根据URL读取网络图片的两种方式(OpenCV)_cv2读取网络图片-CSDN博客 调用 VideoCapture 进行转换im......
  • 树莓派4B_OpenCv学习笔记9:图片的腐蚀与膨胀
    今日继续学习树莓派4B4G:(RaspberryPi,简称RPi或RasPi) 本人所用树莓派4B装载的系统与版本如下: 版本可用命令(lsb_release-a)查询: Opencv版本是4.5.1:图像的膨胀与腐蚀一般用于灰度图或者二值图,今日便来学习一下文章提供测试代码讲解,整体代码贴出、测试效果图......
  • OpenCV 双目三角法计算点云
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介基于三角法计算点坐标的过程类似于我们人类眼睛观察事物的过程:如上图所示,通过两个相机观察到同一位置,我们可以通过两个相机得到这一位置的投影坐标(ur,vr),(ul,vl)......
  • YOLOv5改进策略|YOLOv5鸟类检测,准确率可以达到 87.40%,提升了21.25%,实时检测⻛力发电
    订阅专栏后私信获取完整源码+远程部署目录简介材料和数据收集实验环境实验数据方法YOLOv5RetinexNet模型测试结果与分析结论        ⻛力发电机组的安全是海上⻛电场稳定运行的前提。然而,⻦害对⻛力发电机和⻛力发电机叶片的安全运行构成直接威胁。此......
  • OpenCV 形态学操作
    canny边缘检测        canny边缘检测算法是JohnF.Canny于1986年开发出来的一个多边缘检测算法,也被很多人认为是边缘检测的最优算法,最优边缘检测的三个主要标准是:        低错误率:标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。       ......
  • 定义两个结构体变量student1和student2,成员包括学号、姓名、性别、出生日期、成绩。对
            在定义了结构体变量以后,当然可以引用这个变量。    (1)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。如:        student1=student2;赋值时,结构体变量student2中的各个成员的值分别赋给结构体变量student1中相应的成员。 ......
  • 基于Python+OpenCV的车牌识别停车场管理系统(PyQt界面)【含Python源码 MX_009期】
    简介:        基于Python和OpenCV的车牌识别停车场管理系统是一种利用计算机视觉技术来自动识别停车场进出车辆的系统。该系统通过摄像头捕获车辆图像,并使用OpenCV库中的图像处理和模式识别技术来识别图像中的车牌号码。一旦车牌被成功识别,系统就会将车辆的进出时间和......