首页 > 其他分享 >《OpenCV计算机视觉》—— 年龄与性别预测

《OpenCV计算机视觉》—— 年龄与性别预测

时间:2024-10-18 22:17:19浏览次数:9  
标签:img frame cv2 OpenCV detections 人脸 视觉 性别 模型

结合以下链接中的文章有助于理解此篇案例:

此案例是通过使用OpenCV中的cnn模块来调用别人已经训练好的深度学习模型,此篇案例中用到了人脸检测模型年龄预测模型性别预测模型

  • 以下链接中是这三种模型所需要的模型文件和配置文件

  • 完整代码如下:

    import cv2
    from PIL import Image, ImageDraw, ImageFont
    import numpy as np
    
    # ======模型初始化======
    # 模型(网络模型/预训练模型):face/age/gender(脸、年龄、性别)
    faceProto = "model/opencv_face_detector.pbtxt"
    faceModel = "model/opencv_face_detector_uint8.pb"
    ageProto = "model/deploy_age.prototxt"
    ageModel = "model/age_net.caffemodel"
    genderProto = "model/deploy_gender.prototxt"
    genderModel = "model/gender_net.caffemodel"
    
    # 加载网络
    ageNet = cv2.dnn.readNet(ageModel, ageProto)  # 模型的权重参数、模型的配置
    genderNet = cv2.dnn.readNet(genderModel, genderProto)
    faceNet = cv2.dnn.readNet(faceModel, faceProto)
    # ======年龄初始化======
    # 年龄段和性别  共有8个年龄区间,区间范围可自行更改
    ageList = ['0-2岁', '4-6岁', '8-12岁', '15-22岁', '25-32岁', '38-43岁', '48-53岁', '60-100岁']
    genderList = ['男性', '女性']
    mean = (78.4263377603, 87.7689143744, 114.895847746)  # 模型均值
    
    
    # ======自定义函数,获取人脸包围框======
    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 = []  # 存储检测到的人脸
        xx = detections.shape[2]
        for i in range(detections.shape[2]):
            # confidence中每一行保存了7个数据,第3个数据表示置信度,第4,5,6,7分别表示人脸归一化后的坐标位置
            confidence = detections[0, 0, i, 2]
    
            if confidence > 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):
        if (isinstance(img, np.ndarray)):  # 判断是否是OpenCV图片类型
            img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 实现 array 到 image 的转换
        draw = ImageDraw.Draw(img)  # 在img图片上创建一个绘图的对象
        # 字体的格式                       C 盘中的 Windows/Fonts 中,复制到此文件夹下可看到文件名
        fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
        draw.text(position, text, textColor, font=fontStyle)  # 绘制文本
        return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  # 转换回 OpenCV 格式
    
    
    """ 打开摄像头,将每一帧画面传入神经网络中 """
    cap = cv2.VideoCapture(0)	# 0-->电脑自带摄像头,1-->电脑外接摄像头
    
    while True:
        _, frame = cap.read()
        # frame = cv2.flip(frame,1) # 镜像处理
    
        # 获取人脸包围框、绘制人脸包围框(可能多个)
        frame, faceBoxes = getBoxes(faceNet, frame)
    
        if not faceBoxes:
            print("当前镜头中没有人")
            continue
        # 遍历每一个人脸包围框
        for faceBoxe in faceBoxes:
            # 处理每一帧画面frame,将其处理为符合DNN输入的格式
            x, y, x1, y1 = faceBoxe
            face = frame[y:y1, x:x1]
            blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), mean)   # 模型输入为227*277
            # 调用模型,预测性别
            genderNet.setInput(blob)
            genderOuts = genderNet.forward()
            gender = genderList[genderOuts[0].argmax()]
            # 调用模型,预测年龄
            ageNet.setInput(blob)
            ageOuts = ageNet.forward()
            age = ageList[ageOuts[0].argmax()]
    
            result = "{},{}".format(gender, age)    # 格式化文本(年龄、性别)
            frame = cv2AddChineseText(frame, result, (x, y - 30))   # 输出中文性别和年龄
            cv2.imshow("result", frame)
    
        if cv2.waitKey(1) == 27:    # 按下ESc键,退出程序
            break
    
    cv2.destroyAllWindows()
    cap.release()
    

标签:img,frame,cv2,OpenCV,detections,人脸,视觉,性别,模型
From: https://blog.csdn.net/weixin_73504499/article/details/143062008

相关文章

  • 2024年计算机视觉与图像处理国际学术会议 (CVIP 2024) 2024 International Conference
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍2024年计算机视觉与图像处理国际学术会议(CVIP2024)将于2024......
  • labelImg操作麻烦,用opencv写了个假的,勉强能用
    LabelImage.py:1importcv22importos3importcopy4567defnoNagInt(array=[]):8newArray=[]9forsingleinarray:10ifsingle<0:11newArray.append(0)12else:13......
  • 【进阶OpenCV】 (17)-- Dlib库 --实现人脸检测
    文章目录Dlib库一、Dlib库安装二、实现人脸检测1.生成人脸检测器2.检测人脸3.显示人脸总结Dlib库Dlib提供了丰富的图像处理和计算机视觉工具,如面部特征检测、物体检测、图像变换等,这些工具使得开发者能够轻松地进行各种图像处理任务。一、Dlib库安装pipinst......
  • opencv yolo11 onnx c++代码
    1.exportonnx,opset我设置的是12,其它值或许也可以2.opencv使用的4.10【其他版本或许也可以,4.7.0版本是不行的】3.代码核心参考yolo之前版本的实现即可。 model.setInput(blob);model.forward(outputs,outnames);constintdimensions=84;constintrows=......
  • OpenCV基本操作(python开发)——(1) 读取图像、保存图像
    OpenCV一.OpenCV安装——linux执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。#安装opencv核心库pip3install--useropencv-python==3.4.2.16--index-urlhttps://pypi.tuna.tsinghua.edu.cn......
  • 盒子绝对定位开启视觉新纪元(脱离文档流)
    目录一、概念二、语法结构三、特点四、绝对定位的使用五、浮层效果六、总结七、练习一、概念绝对定位会脱离文档流,相对于已经定位的上层元素(position)进行定位;若上层元素没有定位,则向更上层寻找已定位元素,直到根元素。二、语法结构<style>选择器{/*......
  • OpenCV 简介与在 Python 和 C# 中的使用
    一、OpenCV概述(一)什么是OpenCVOpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉库,它提供了丰富的函数和工具,用于处理图像和视频数据。最初由英特尔公司开发,现在由一个开源社区维护和扩展。OpenCV支持多种操作系统,包括Windows、Linux和MacOS等,并且可......
  • 【北京迅为】itop-3562机器视觉opencv开发手册使用OpenCV处理图像
    iTOP-3562开发板采用瑞芯微RK3562处理器,主频2.0GHz,采用四核A53+MaliG52架构,主频2GHz,内置1TOPSNPU算力,具有多个嵌入式硬件引擎,以优化高端应用的性能。     【公众号】迅为电子----------------------------------------------------3.1颜色转换本小节代码在配套资料“iTOP-3......
  • 【北京迅为】itop-3562机器视觉opencv开发手册使用OpenCV处理图像
              iTOP-3562开发板采用瑞芯微RK3562处理器,主频2.0GHz,采用四核A53+MaliG52架构,主频2GHz,内置1TOPSNPU算力,具有多个嵌入式硬件引擎,以优化高端应用的性能。     【公众号】迅为电子----------------------------------------------------3.1颜色......
  • 基于深度学习的基于视觉的机器人导航
    基于深度学习的视觉机器人导航是一种通过深度学习算法结合视觉感知系统(如摄像头、LiDAR等)实现机器人在复杂环境中的自主导航的技术。这种方法使机器人能够像人类一样使用视觉信息感知环境、规划路径,并避开障碍物。与传统的导航方法相比,深度学习模型能够在动态环境中表现出更强......