【python】OpenCV—Age and Gender Classification

news2024/9/21 23:08:21

在这里插入图片描述

文章目录

  • 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 argparse


def getFaceBox(net, frame, conf_threshold=0.7):
    frameOpencvDnn = frame.copy()
    frameHeight = frameOpencvDnn.shape[0]  # 333
    frameWidth = frameOpencvDnn.shape[1]  # 500
    blob = 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 RoI
        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


parser = 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 frame
    t = time.time()
    hasFrame, frame = cap.read()
    if not hasFrame:
        cv.waitKey()
        break

    frameFace, bboxes = getFaceBox(faceNet, frame)  # (333, 500, 3), 4 bbox
    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()]
        # 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.coloradmin.cn/o/2127222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode - 17 电话号码的字母组合

题目来源 17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对…

共享单车轨迹数据分析:以厦门市共享单车数据为例(三)

本篇文章将视角聚焦于共享单车的出行距离和时间分布&#xff0c;为了更好地理解共享单车在特定时间段内的使用情况及用户行为特征&#xff0c;本文基于2020年12月21日上午06:00至10:00期间收集的共享单车订单数据进行了详细的分析&#xff0c;旨在探索共享单车在该时间段内的出…

Centos7 Hadoop 单机版安装教程(图文)

本章教程,主要记录如何在Centos7中安装Hadoop单机版。 一、软件安装包和基础环境 CentOS7.x,jdk8,hadoop 通过网盘分享的文件:Hadoop 链接: https://pan.baidu.com/s/1_qGI9QeXMAJNb3TydHhQGA?pwd=xnz4 提取码: xnz4 当然你也可以自己去官网下载。 java8:https://www.ora…

【Python第三方库】OpenCV库实用指南

文章目录 前言安装OpenCV读取图像图像基本操作获取图像信息裁剪图像图像缩放图像转换为灰度图图像模糊处理边缘检测图像翻转图像保存 视频相关操作方法讲解读取视频从摄像头读取视频 前言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;作为一个强大的计…

使用docker配置wordpress

docker的安装 配置docker yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo下载最新版本docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-…

基于spring拦截器实现博客项目的强制登录功能(四)

6. 强制登录 当⽤⼾访问 博客列表和博客详情⻚ 时, 如果⽤⼾当前尚未登陆, 就⾃动跳转到登陆⻚⾯. 我们可以采⽤拦截器来完成, token通常由前端放在header中, 我们从header中获取token, 并校验 token是否合法 6.1 添加拦截器 package com.example.spring_blog_24_9_8.config;…

k8s dashboard token 生成/获取

创建示例用户 在本指南中&#xff0c;我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。 对于以下每个和的代码片段ServiceAccount&#xff0c;ClusterRoleBinding您都应该将它们复制到新的清单文件(如)…

Blazor开发框架Known-V2.0.10

Known今天迎来了2.0的第11个版本&#xff0c;同时网站网址和板块也进行了一次升级改造&#xff0c;虽不完美&#xff0c;但一直在努力改变&#xff0c;之前一直在完善框架功能&#xff0c;忽略了文档的重要性&#xff0c;所以这次更新了文档和API。交流互动板块也在进行当中&am…

PPT幻灯片的添加与编辑:全面技术指南

目录 一、PPT幻灯片的添加 1.1 启动PowerPoint与新建演示文稿 1.2 选择模板 1.3 添加新幻灯片 1.3.1 使用“开始”选项卡 1.3.2 使用快捷键 1.3.3 复制现有幻灯片 1.4 调整幻灯片顺序 二、PPT幻灯片的编辑 2.1 输入与编辑文本 2.1.1 使用文本框添加文本 2.1.2 使用占…

GitHub Star 数量前 13 的自托管项目清单

一个多月前&#xff0c;我们撰写并发布了这篇文章《终极自托管解决方案指南》。在那篇文章里我们深入探讨了云端服务与自托管方案的对比、自托管的潜在挑战、如何选择适合自托管解决方案&#xff0c;并深入介绍了五款涵盖不同场景的优秀自托管产品。 关于自托管的优势&#xf…

职业技能大赛背景下的移动互联网应用软件开发(Android)实训室建设方案

一、建设背景 随着科技的持续进步&#xff0c;移动设备已成为人们日常生活中不可或缺的一部分。据相关数据&#xff0c;移动互联网的使用率在近年来显著上升。在这样的背景下&#xff0c;移动互联技术不仅推动了科技的发展&#xff0c;也渗透到了智能家居、车联网、工业自动化…

大数据-129 - Flink CEP 详解 Complex Event Processing - 复杂事件处理

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

改进版field-sensitive指针分析算法

DEA 1.Introduction2.Approach2.1.Stride-based Field Representation2.1.1.示例12.1.2.示例2 2.2.完整算法 3.Evaluation3.1.Implementation3.2.结果 参考文献 1.Introduction 这篇paper是SVF团队对PKH field-sensitive指针分析算法 [ 2 ] ^{[2]} [2] 的优化&#xff0c;在使…

Pycharm中python文件导入torch模块时报错:No module named ‘torch‘

问题描述 导入torch时报错 上网查找后&#xff0c;发现原因可能是没有安装pytorch&#xff0c;但检查后发现自己已经安装了&#xff0c;遂考虑到可能是没有使用正确的环境 解决方法 因为是PyCharm 没有使用我所安装了 PyTorch 的 Conda 环境&#xff0c;所以报错了&#xf…

计算2的100次方

#include <stdio.h>int main() {int a[100] {0};a[0] 1;for(int i 0;i < 100;i)//乘100次2{for(int j 0; j < 100;j)//乘以每一位{a[j] * 2;//每一位都*2}for(int k 0;k < 99;k){if(a[k] > 10)//判断进位{a[k 1];a[k] - 10;}}}//找到第一个不为0的数&a…

vue part 9

动画与过渡 Test.vue <template><div><button click"isShow !isShow">显示/隐藏</button><transition name"hello" appear><h1 v-show"isShow">你好啊!</h1></transition><transition …

51单片机快速入门之点灯 STC 51单片机

第一步创建工程 第二步加载头文件 第三步编写代码 点灯完成 解释:主函数为main() 内部P1控制的是p1.0-p1.7 引脚 0为低电平

银河麒麟国产化系统(或者是Linux)一键安装docker和docker-compose

在国产化化机器上离线安装docker和docker-compose 第一步&#xff0c;查询国产化系统的cpu架构 使用如下命令都可以查询出来&#xff1a; # 查询全部 uname -a # 只查询部分 uname -p # 查了cpu 列表 lscpu 查询示例如下&#xff1a; 为麒麟桌面版 为麒麟服务版 第二步&a…

人工智能领域各方向顶级会议和期刊

会议 人工智能基础与综合&#xff1a;AAAI、CICAI (!)、UAI、IJCAI 机器学习&#xff1a;COLT、ICLR、ICML、NeurIPS 模式识别与计算机视觉&#xff1a;ECCV、CVPR、ICCV 语言与语音处理&#xff1a;ACL、EMNLP 知识工程与数据挖掘&#xff1a;SIGKDD、SIGMOD、ICDE、SIGIR、V…

golang-基础知识(array, slice, map)

1. array array就是数组&#xff0c;我们可以通过如下方式定义一个数组并对数组中的元素进行赋值 var arr [n]type // 定义一个大小为n&#xff0c;类型为type的数组 arr[0] xx // 对数组中的元素进行赋值 其中[n]type中&#xff0c;n表示数组的长度&#xff0c;type表示数…