深度学习之人物年龄预测

2023-11-11

在这里插入图片描述

1.年龄检测

在这里插入图片描述
论文地址:《Age and Gender Classification using Convolutional Neural Networks》
论文作者提出了一个简单的类似AlexNet的网络结构,该网络总共学习了8个年龄段:

  1. 0-2
  2. 4-6
  3. 8-12
  4. 15-20
  5. 25-32
  6. 38-43
  7. 48-53
  8. 60-100

注意:这些年龄段不是连续的
首先,要搞懂检测年龄适合用回归还是用分类来做
举个栗子:

1. 回归
在这里插入图片描述

2. 分类
在这里插入图片描述
年龄预测是基于面部外观,有的人保养的好,显得年轻,实际年龄与测得会有差别。在不结合其它有关信息作推断情况下,网络模型很难预测到实际的真实年龄。若看作是回归问题,模型很难预测到图像中年龄的一个准确值,而看作是分类问题,预测一个年龄段相对来说模型更容易训练,比回归产生更高的准确性。

2.思路方法

自动识别年龄步骤:

1. 检测出输入图像或视频中的人脸
2. 提取面部感兴趣区域(ROI)
3. 用年龄检测器预测人物的年龄
4. 返回结果

对于检测人脸的分类器:

分类器 优缺点
Haar级联 速度快,嵌入式设备上运行,但准确性低
HOG +线性SVM 相比Haar级联精确,但速度慢,对遮挡,面部角度变化时检测效果不好
深度学习检测器 相比以上两者效果最佳,但需消耗更多计算资源

3.代码实现

环境:

  • win10
  • pycharm
  • anaconda3
  • python3.7
  • opencv4.2.0

对于OpenCV尽量用最新版本,可参考这篇仅一个命令行简单快速安装:https://blog.csdn.net/y459541195/article/details/104851892

文件结构:

在这里插入图片描述

3.1 单张图像检测代码
import numpy as np
import cv2

"""
#图片年龄预测
执行:
python test_age.py 

"""
# 检测年龄段
AGE_LIST = ["(0-2)","(4-6)","(8-12)","(15-20)","(25-32)","(38-43)","(48-53)","(60-100)"]

# 人脸检测模型路径
prototxtPathF ="./models/face_detector/face_deploy.prototxt"
weightsPathF = "./models/face_detector/res10_300x300_ssd_iter_140000.caffemodel"
# 加载人脸模型
faceNet = cv2.dnn.readNet(prototxtPathF,weightsPathF)

# 年龄检测模型
prototxtPathA ="./models/age_detector/age_deploy.prototxt"
weightsPathA = "./models/age_detector/age_net.caffemodel"
#加载模型
ageNet = cv2.dnn.readNet(prototxtPathA,weightsPathA)

#获取图像
image = cv2.imread("./input/test01.jpg")
src = image.copy()
(h,w)= image.shape[:2]

# 构造blob
blob = cv2.dnn.blobFromImage(image,1.0,(300,300),
                             (104,177,123))
# 送入网络计算
faceNet.setInput(blob)
detect = faceNet.forward()
# 检测
for i in range(0,detect.shape[2]):
    confidence = detect[0,0,i,2]
    # 过滤掉小的置信度,计算坐标,提取面部roi,构造面部blob特征
    if confidence > 0.5:
        box = detect[0,0,i,3:7]*np.array([w,h,w,h])
        (startX,startY,endX,endY) = box.astype("int")
        face = image[startY:endY,startX:endX]
        faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227),
                                         (78.4263377603, 87.7689143744, 114.895847746),
                                         swapRB=False)
        # 预测年龄
        ageNet.setInput(faceBlob)
        predictions = ageNet.forward()
        i = predictions[0].argmax()
        age = AGE_LIST[i]
        ageConfidence = predictions[0][i]

        #显示打印
        text = "age{}:{:.2f}%".format(age,ageConfidence*100)
        print(text)

        #绘制显示框
        y = startY - 10 if startY - 10 > 10 else startY + 10
        cv2.rectangle(image, (startX, startY), (endX, endY),
                      (0, 0, 255), 2)
        cv2.putText(image, text, (startX, y),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)

cv2.imshow("Result",image)
cv2.waitKey(0)

3.2 视频流检测代码
import numpy as np
import cv2
import imutils

"""
#视频流年龄预测
执行:
python test_video_age.py 
"""
def detect_age(frame,faceNet,ageNet,minConfidence=0.5):
    # 检测年龄段
    AGE_LIST = ["(0-2)","(4-6)","(8-12)","(15-20)","(25-32)","(38-43)","(48-53)","(60-100)"]
    #定义空列表存放结果
    results = []
    (h,w)= frame.shape[:2]
    # 构造blob
    blob = cv2.dnn.blobFromImage(frame,1.0,(300,300),
                                 (104,177,123))
    # 送入网络计算
    faceNet.setInput(blob)
    detect = faceNet.forward()
    # 检测
    for i in range(0,detect.shape[2]):
        confidence = detect[0,0,i,2]
        # 过滤掉小的置信度,计算坐标,提取面部roi,
        if confidence > minConfidence:
            box = detect[0,0,i,3:7]*np.array([w,h,w,h])
            (startX,startY,endX,endY) = box.astype("int")
            face = frame[startY:endY,startX:endX]
            # 过滤干扰
            if face.shape[0]<20 or face.shape[1]<20:
                continue
            # 构造面部blob特
            faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227),
                                             (78.4263377603, 87.7689143744, 114.895847746),
                                             swapRB=False)
            # 预测年龄
            ageNet.setInput(faceBlob)
            predictions = ageNet.forward()
            i = predictions[0].argmax()
            age = AGE_LIST[i]
            ageConfidence = predictions[0][i]
            # 构造字典存放结果
            dicts = {
               "location":(startX,startY,endX,endY),
               "age":(age,ageConfidence)
           }
        results.append(dicts)
    return results



# 人脸检测模型路径
prototxtPathF ="./models/face_detector/face_deploy.prototxt"
weightsPathF = "./models/face_detector/res10_300x300_ssd_iter_140000.caffemodel"
# 加载人脸模型
faceNet = cv2.dnn.readNet(prototxtPathF,weightsPathF)

# 年龄检测模型
prototxtPathA ="./models/age_detector/age_deploy.prototxt"
weightsPathA = "./models/age_detector/age_net.caffemodel"
#加载模型
ageNet = cv2.dnn.readNet(prototxtPathA,weightsPathA)

#获取视频图像
videoPath = "./input/test1.mp4"
vs = cv2.VideoCapture(videoPath)

#处理视频流
while True:
    (grabbed,frame) = vs.read()

    # 判断是否结束
    if not grabbed:
        print("无视频读取...")
        break
    frame = imutils.resize(frame,width=720)

    #调用上面函数计算
    results = detect_age(frame,faceNet,ageNet,minConfidence=0.5)
    for  i in results:
        #显示信息
        text = "age{}:{:.2f}%".format(i["age"][0], i["age"][1] * 100)
        (startX,startY,endX,endY) = i["location"]
        # 绘制显示框
        y = startY - 10 if startY - 10 > 10 else startY + 10
        cv2.rectangle(frame, (startX, startY), (endX, endY),
                      (0, 0, 255), 2)
        cv2.putText(frame, text, (startX, y),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
    # 显示
    cv2.imshow("Result", frame)
    key = cv2.waitKey(1) & 0xFF
    # 按q键退出循环
    if key == ord("q"):
        break
cv2.destroyAllWindows()
vs.release()

4.测试结果

4.1 单张图像测试

虚拟环境下命令行输入:

python test_age.py 

效果一:
在这里插入图片描述

效果二:

在这里插入图片描述

效果三:
在这里插入图片描述

4.2 视频流检测

深度学习之年龄检测


视频地址: https://www.bilibili.com/video/BV16g4y187iQ/

Reference:
1.https://talhassner.github.io/home/publication/2015_CVPR
2.https://github.com/dpressel/rude-carnie
3.https://github.com/GilLevi/AgeGenderDeepLearning

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习之人物年龄预测 的相关文章

  • cv2.imread:检查图像是否正在被读取

    我正在用 python 编写一个 OpenCV 程序 在某些时候我有类似的东西 import cv2 import numpy as np img cv2 imread myImage jpg do stuff with image her
  • 在 iPad 上使用 OpenCV 避免碰撞

    我正在开展一个项目 需要使用 OpenCV 实现碰撞避免 这是在 iOS 上完成的 iOS 5 及以上版本即可 项目目标 这个想法是将 iPad 安装在汽车仪表板上并启动应用程序 应用程序应该从相机中抓取帧并进行处理 以检测汽车是否会与任何
  • 在opencv中发现凸性缺陷? [根据给定的输入图像崩溃..]

    我有一个计算图像凸包的程序 我正在尝试使用此信息来计算fingers存在于输入图像中 从一些冲浪中我发现做到这一点的方法 数手指 是 寻找轮廓 凸包 凸性缺陷 但我在使用凸性缺陷函数时遇到了麻烦 它编译得很好 但在运行时程序会因某些输入图像
  • 使用相位相关和对数极坐标变换获得旋转位移

    我一直在编写一个脚本 它使用 cv2 计算两个图像之间的旋转位移phaseCorrelate method 我有两张图像 第二张是第一张图像的 90 度旋转版本 加载图像后 我将它们转换为对数极坐标 然后将它们传递到phaseCorrela
  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • bitblt 在 Windows 10 版本 1703 上失败 (15063.138)

    使用 Visual Studio 2017 vc141 以下代码应该从前游戏窗口获取屏幕截图 但现在它返回黑色和空白图像 唯一的游戏问题 尝试过 OpenGL 和 Vulkan ogl 返回黑色 vulkan 返回白色 在升级到 Windo
  • 如何使用 OpenCV 检测图像帧中的对象?

    我正在使用 Raspberry Pi 开发一个漫游器 它将清扫房间并捡起掉落在地上的物体 为了检测物体 我使用了在流动站操作开始时拍摄的参考图像 以及每 10 秒单击一次的图像 新图像 为了确定图像帧是否发生变化 我在参考图像和新图像之间进
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 相机标定(OpenCV 2.3)-如何使用畸变参数?

    我有一组带有一些附加标记的刚体图像 我在这些标记之一中定义了一个原点坐标系 我想获得该坐标系与在相机原点定义的坐标系之间的旋转和平移 我尝试了一段时间 POSIT 以下this http goo gl cUYYt 但从未获得可接受的结果 直
  • Opencv matchTemplate 和 np.where():仅保留唯一值

    继带有马里奥硬币的 opencv 教程 https opencv python tutroals readthedocs io en latest py tutorials py imgproc py template matching p
  • 如何在opencv python中为图像添加边框

    如果我有如下图所示的图像 如何在图像周围添加边框 以便最终图像的整体高度和宽度增加 但原始图像的高度和宽度保持在中间 下面的代码添加了一个大小恒定的边框10像素到原始图像的所有四个边 对于颜色 我假设您想要使用背景的平均灰度值 这是我根据图
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 在加载“cv2”二进制扩展期间检测到递归

    我有一个小程序 在 pyinstaller 编译后返回 opencv 错误 但无需编译即可工作 我在 Windows 10 上使用 Python 3 8 10 Program 导入 pyautogui将 numpy 导入为 np导入CV2
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • OpenCV C++ 如何知道每行的轮廓数进行排序?

    我有一个二值图像 https i stack imgur com NRLVv jpg在这张图片中 我可以使用重载的函数轻松地对从上到下 从左到右找到的轮廓进行排序std sort 我首先通过以下方式从上到下排序 sort contours
  • 从图像坐标获取对象的世界坐标

    I have been following this http docs opencv org modules calib3d doc camera calibration and 3d reconstruction html docume
  • 使用 OpenCV 和/或 Numpy 对两个图像进行 Alpha 混合 [重复]

    这个问题在这里已经有答案了 我想将一个填充纯色的半透明矩形添加到已加载的半透明 PNG 中 这是我正在使用的输入图像示例 该图像加载了标准cv2 IMREAD UNCHANGED标志 以便完美保留 alpha 通道 该输入图像存储在imag

随机推荐

  • 解决vscode jupyter启动kernel错误的方案Failed to connect to Jupyter notebook.

    最近在vscode里面运行 ipynb文件的时候经常性地会出现报错情况 报错的图片内容如下 Failed to connect to Jupyter notebook 经过网上一番查阅方法之后 终于将配件搭建好了 解决方法为输入如下命令 p
  • 【Unity 学习笔记】动画系统(续)和事件

    在上一篇笔记中 我们使用Unity的动画系统实现了移动和跳跃的动画 在这一篇笔记中我们将使用Unity事件的方式来实现受伤和死亡的动画 首先创建一个受伤动画 由于素材中没有现成的受伤动画 我们只能手动创建一个简陋的闪烁动画 主要现实在角色受
  • java变量的类别和作用范围

    1 类别及作用范围 类变量 在类中用static修饰的字段 存储位置 方法区 生命周期 随着JVM的消亡而消失 生命周期最长 局部变量 在方法中存在的 或者形参 存储位置 栈帧中 生命周期 随着方法的调用而存在 生命周期最短 实例变量 在类
  • GCC编译器-<嵌入式Linux应用程序开发标准教程>-华清远见

    3 3 gcc编译器 GNU CC 简称为gcc 是GNU项目中符合ANSI C标准的编译系统 能够编译用C C 和Object C等 语言编写的程序 gcc不仅功能强大 而且可以编译如C C Object C Java Fortran P
  • LA@特征值和特征向量的性质

    文章目录 方阵特征值和特征向量的性质 特征值之和 特征值之积 推论 特征值判定方阵的可逆性 证明 小结 导出性质 可逆矩阵的特征值性质 转置矩阵和特征值 矩阵多项式的特征值 不同特征值的特征向量线性无关定理 推论 推广 特征向量线性组合 特
  • [python爬虫] 爬取图片无法打开或已损坏的简单探讨

    本文主要针对python使用urlretrieve或urlopen下载百度 搜狗 googto 谷歌镜像 等图片时 出现 无法打开图片或已损坏 的问题 作者对它进行简单的探讨 同时 作者将进一步帮你巩固selenium自动化操作和urlli
  • 【C语言】数据结构-----字符串匹配之KMP算法

    目录 算法简介 匹配原理 第一次匹配 第二次匹配 第三次匹配 第四次匹配 可能失配位置 next数组求解 next数组的由来 next数组的用法 next数组代码的实现 KMP算法的实现 示例 完整的代码 KMP算法与BF算法相比较 算法简
  • python处理ECG二进制文件(.dat文件)和.db文件

    python处理ECG二进制文件 dat文件 和 db文件 最近拿到了一批ECG原数据文件 包括 dat和 db文件 需要自己解析 记录一下解析结果 1 dat 文件是病人的心电数据 以二进制形式读取和解析 数据文件的说明 数据文件记录的是
  • FLASH擦除问题

    我们最近用mm32f3277的flash mm32f3277的flash有512K的空间 128个扇区 每个扇区有四页 每页有1K 图一 mm32f3277的flash 我们写入flash用的是片内FLASH存储器 片内FLASH存储器的地
  • java多线程异步处理批量数据

    前段时间需要一个批量请求别人接口的模块 由于别人接口反应速度慢导致批量请求耗费时间太多 于是在网上多发查询找到一个批量异步接口切能返回数据 多线程配置类 import org springframework aop interceptor
  • error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    一 问题描述 打开用VS2010打开vs 2008创建的解决方案 重新生成解决方案时 报如下错误 error LNK1123 转换到 COFF 期间失败 文件无效或损坏 二 原因分析 输入文件必须具有通用对象文件格式 COFF 如果输入文件
  • Maven 子项目

    使用maven搭建的子项目 其中包含web子项目和其他依赖子项目 在使用tomcat构建war的时候 会构建该web相对应的war maven关联的其他子项目会以jar包的形式关联到lib中 从而 使得web项目中可以引用其他包的类以及配置
  • 【C++】友元

    目录 友元的定义 全局函数做友元 类做友元 成员函数做友元 友元的定义 友元定义在类外面的一种函数或者类 友元不是成员函数 但是友元可以对某个类里面私有成员进行访问 要想友元获得访问某个类私有成员的权限 我们需要利用关键字friend并且在
  • eclipse web 项目中配置jetty-maven-plugin 版本 9.4.2.v20170220

    在web项目的pom xml文件中添加jetty maven plugin插件配置 如下
  • 【图像处理】去雾算法

    真正了解了什么叫最简单的就是最美好的 真正的好文章不需要大堆公式堆积显得充实 而是最最平实的思想 这篇文章的 原文PDF PPT 感兴趣的可以了解一下 这篇文章的目的就是以最简单的思路将图像达到去雾效果 用Matlab编了一下 效果图特别好
  • Windows11 安装 chocolatey 包管理器

    众所周知每个Linux发行版都有一个包管理器 比如Ubuntu的 apt get Centos的 yum Arch Linux的 pacman 那么问题来了 Windows有包管理器吗 Windows 目前最新版的系统有一个 winget
  • LLVM每日谈之十九 LLVM的第一本系统的书<Getting Started with LLVM Core Libraries>

    作者 史宁宁 snsn1984 LLVM最终有了一本系统的书了 Getting Started with LLVM Core Libraries 这本书号称是LLVM的第一本书 可是据说日本早就有两本日文的关于LLVM的书 这个了解的不多
  • 数据库学习笔记(4)——SQL语言之DQL

    复杂分组查询举例 子查询 把select查询结果当作数据使用时 这种结构就是子查询 子查询练习 子查询练习 查询学生成绩在70分以上的学生学号和姓名 select stu id as id stu name as 姓名 from tb st
  • 傻白探索Chiplet,关于EPYC Zen2 的一些理解记录(五)

    目录 一 知识铺垫 1 Chiplet 2 Zen架构 3 EPYC和Ryzen 4 EPYC Zen2 二 关于EPYC Zen2里的部件 1 内存控制器 2 PCIe控制器 3 Infinity Fabric总线 4 关于CCX和CCD
  • 深度学习之人物年龄预测

    1 年龄检测 论文地址 Age and Gender Classification using Convolutional Neural Networks 论文作者提出了一个简单的类似AlexNet的网络结构 该网络总共学习了8个年龄段 0