基于深度学习的人脸性别识别系统(含UI界面,Python代码)

本文涉及的产品
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频资源包5000点
简介: 基于深度学习的人脸性别识别系统(含UI界面,Python代码)

前言


       随着科技的发展,人脸识别以及性别检测在日常生活中的应用越来越广泛,由于人脸图像的生物特征识别是非接触的,比较简单快速,还具有一定的娱乐性,在社交网络、视频监控、人机交互等领域具有广阔的应用前景。本文使用OpenCV算法,实现人脸检测以及性别识别,用户可以选择传入图片、视频、或者摄像头实时摄影作为检测的文件。

       人脸性别识别,其实是人脸属性识别的一种,即根据图像中的人脸判断其性别属于男性还是女性,该任务本身具有较强的现实意义。前面博主分享有人脸表情识别系统介绍的博文,可以认为是检测人脸的表情属性[1],对性别的识别算是继续人脸识别的小专题。这里博主分享一个性别识别的小项目,供大家参考学习了。

       网上的人脸性别识别程序代码很多,大部分都是采用OpenCV算法和face_recognition等识别单张图片中的人脸,虽然后者的算法相较于前者更简单,但是对于大多数Windows用户想要下载这个库是很困难的,所以本博文使用对Windows用户更友好的OpenCV算法来完成。网上的人脸性别识别程序脚本很多,但几乎没有人将其开发成一个可以展示的完整软件,并不方便选择文件和实时检测。对此这里给出博主设计的界面,同款的简约风,功能也可以满足图片、视频和摄像头的识别检测,希望大家可以喜欢,初始界面如下图:



       检测人脸时的界面截图(点击图片可放大)如下图,可识别画面中存在的多个人脸,也可开启摄像头或视频检测:



        详细的功能演示效果参见博主的B站视频或下一节的动图演示,觉得不错的朋友敬请点赞、关注加收藏!系统UI界面的设计工作量较大,界面美化更需仔细雕琢,大家有任何建议或意见和可在下方评论交流。


1. 效果演示


       软件好不好用,颜值很重要,首先我们还是通过动图看一下识别性别的效果,系统主要实现的功能是对图片、视频和摄像头画面中的人脸性别属性进行识别,识别的结果可视化显示在界面和图像中,另外提供多个人脸的显示选择功能,演示效果如下。


(一)选择人脸图片识别

       系统允许选择图片文件进行识别,点击图片选择按钮图标选择图片后,显示所有人脸识别的结果,可通过下拉选框查看单个人脸的结果。本功能的界面展示如下图所示:



(二)人脸视频识别效果展示


       很多时候我们需要识别一段视频中的人脸属性,这里设计了视频选择功能。点击视频按钮可选择待检测的视频,系统会自动解析视频逐帧识别人脸,并将结果记录在右下角表格中,效果如下图所示:



(三)摄像头检测效果展示


       在真实场景中,我们往往利用设备摄像头获取实时画面,同时需要对画面中的人脸性别进行识别,因此本文考虑到此项功能。如下图所示,点击摄像头按钮后系统进入准备状态,系统显示实时画面并开始检测画面中的人脸,识别结果展示如下图:




2. 人脸检测与性别识别


       人脸性别识别可看成是通过人脸图像信息自动发掘和分析人脸属性的二分类问题。在广告定向投放、个性化智能推荐、人脸属性分析等方面得到广泛应用。如今人工智能横扫经典算法,因此以卷积神经网络为代表的深度学习方法自然就被广泛用于人脸性别识别研究。本文借助OpenCV算法,实现人脸检测以及性别识别,这里首先对实现原理进行介绍。

       本文所使用的模型是由 Gil Levi 和Tal Hassner 发布在CVPR的《Age and Gender Classification using Convolutional Neural Networks》论文,论文旨在缩小自动人脸识别能力与年龄性别估计方法之间的差距[2]。论文使用Adience数据集,该数据集包含比LFW数据集的图像更具挑战性,使用一个健壮性更强的系统提升性能,以更好地利用来自大量示例训练集的信息。



       这里使用的是一种以上论文提出的卷积神经网络架构,类似于 CaffeNet 和 AlexNet。该网络使用 3 个卷积层、2 个全连接层和一个最终输出层。首先原始图像被缩放至256×256256×256的尺寸,对图像进行中心裁剪,得到尺寸为227×227227×227的图像作为网络输入,该网络结构如下图所示:



  1. 尺寸为96×3×7×796×3×7×7的卷积核,接ReLU层、MaxPooling(3×3,stride=23×3,stride=2)、归一化层,输出尺寸:96×28×2896×28×28
  2. 尺寸为96×5×5×25696×5×5×256的卷积核,接ReLU层、MaxPooling(3×3,stride=23×3,stride=2)、归一化层,输出尺寸:256×14×14256×14×14
  3. 尺寸为256×14×14×384256×14×14×384的卷积核,接ReLU层、MaxPooling(3×33×3)$;
  4. 全连接层(512个神经元),接ReLU层及Dropout层;
  5. 全连接层(512个神经元),接ReLU层及Dropout层;
  6. 根据性别映射到最后的类别输出。

       利用以上网络进行训练,所有层中的权重均采用标准偏差为0.01,均值为0的高斯随机值初始化。训练时不使用预训练模型,不使用基准可用的图像和标签之外的任何数据,网络从头开始进行训练。训练的目标值用与真实类别相对应的稀疏二进制向量表示,对于每个训练图像,目标标签向量具有类数的长度,在真实值所在索引位置为1,在其他位置为0。训练基于Adience数据集,使用随机梯度下降算法进行训练,其中批量大小(Batch Size)设置为50,初始学习率为e3e−3,在10K10K次迭代后降为e4e−4

       这里我们利用OpenCV导入该算法,调用电脑自带的摄像头获取画面,并对画面中的人脸进行性别识别。首先需要导入用到的Python库:

java
import cv2 as cv
import time
import argparse
        然后导入我们下载到的训练模型,主要有人脸检测和性别识别的模型,代码如下:
java
faceProto = "opencv_face_detector.pbtxt"
faceModel = "opencv_face_detector_uint8.pb" # 检测人脸的模型,
genderProto = "gender_deploy.prototxt"
genderModel = "gender_net.caffemodel" # 判断性别的模型
MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
genderList = ['Male', 'Female'] # 性别列表
# 加载 network
genderNet = cv.dnn.readNet(genderModel, genderProto)
faceNet = cv.dnn.readNet(faceModel, faceProto)
        接下来我们定义获得图像/视频的人脸信息的函数,使用模型对图像中的人脸进行检测,框出人脸位置:
java
def getFace(frame):
    conf_threshold = 0.7
    # 获取图像的信息,以便之后对图像的操作
    height = frame.copy().shape[0]
    width = frame.copy().shape[1]
    # 对图片进行预处理, frame就是我们读取到视频的每一帧,最后输出的大小是300*300
    # 同时也帮助我们减均值抵抗亮度的变化对模型造成的不良影响
    # 为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,
    # 我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,
    # 这样就可以得到像素之间的相对值,就可以排除光照的影响。
    frameblob = cv.dnn.blobFromImage(frame.copy(), 1.0, (300, 300), [104, 117, 123], True, False)
    # 识别人脸
    faceNet.setInput(frameblob)# 将预处理后的图像输入网络
    detections = faceNet.forward() # 将图像向前传播,检测可以检测到的东西
    box = []  # 用来保留检测到的结果
    # 遍历所有的结果, 并将可行的放到我们最终的结果中
    for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]  # 得到检测结果的分数
        if confidence > conf_threshold: # 大于阈值就是我们需要的结果
            # 取出相对坐标并获得原坐标
            x1 = int(detections[0, 0, i, 3] * width)
            y1 = int(detections[0, 0, i, 4] * height)
            x2 = int(detections[0, 0, i, 5] * width)
            y2 = int(detections[0, 0, i, 6] * height)
            box.append([x1, y1, x2, y2])
            # 绘图
            cv.rectangle(frame.copy(), (x1, y1), (x2, y2), (0, 255, 0), int(round(height / 150)), 8)
    return frame.copy(), box


       以上函数传入的参数是图像的信息,经过该函数的处理,我们检测图像中包含的信息,然后通过上述论文模型的预测,取出图像中可能是人脸数据的值,这些就是最后用来预测的数据,该步骤主要用的就是facenet这个神经网络模型,使用该模型之后能够大大增加数据的准确性,让后面的预测模型更加精准。

       FaceNet是谷歌于CVPR2015.02发表,提出了一个对识别(这是谁?)、验证(这是用一个人吗?)、聚类(在这些面孔中找到同一个人)等问题的统一解决框架,即它们都可以放到特征空间里统一处理,只需要专注于解决的仅仅是如何将人脸更好的映射到特征空间[3]。其本质是通过卷积神经网络学习人脸图像到128维欧几里得空间的映射,该映射将人脸图像映射为128维的特征向量,联想到二维空间的相关系数的定义,使用特征向量之间的距离的倒数来表征人脸图像之间的"相关系数"(为了方便理解,后文称之为相似度),对于相同个体的不同图片,其特征向量之间的距离较小(即相似度较大),对于不同个体的图像,其特征向量之间的距离较大(即相似度较小)。最后基于特征向量之间的相似度来解决人脸图像的识别、验证和聚类等问题。论文地址如下:https://arxiv.org/abs/1503.03832



       如上图所示,FaceNet由一个批量输入层和一个深度卷积神经网络(CNN )组成,然后是 L2 归一化和之后的人脸嵌入,最后使用三元组损失函数进行训练。图像经过该模型后就可以得到图像中人脸的基本信息特征,接下来调用导入的辨别gender的模型就可以完成人脸的识别,调用和标记识别结果的代码如下:

java
def face_pred(cap):
    padding = 20
    while cv.waitKey(1) < 0:
        # 读取 frame
        t = time.time()
        # 读取视频中的帧
        hasFrame, frame = cap.read()
        if not hasFrame:
            # 等待键盘发出命令
            cv.waitKey(100)
            break
        frameFace, bboxes = getFace(frame)
        # if not bboxes:
        #     continue
        for bbox in bboxes:
            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()]
            label = "{}".format(gender)
            cv.putText(frameFace, label, (bbox[0], bbox[1] - 10), cv.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2,
                       cv.LINE_AA)
            cv.imshow("Gender_recognition", frameFace)
        该函数传入的参数是视频的数据,读取视频的函数是cv.VideoCapture( ),如果该函数的参数是0,那么就会调用系统摄像头,获取本人的人脸数据,如果传入的参数是一个文件地址,那么就会预测传入视频的性别。最终运行以上函数进行识别的代码如下:
java
cap = cv.VideoCapture(0)
face_pred(cap)


       运行以上演示脚本,达到的结果如下图所示,性别识别结果被显示在人脸上方。有了以上的思路,我们可以在此基础上利用PyQt5设计UI界面,将图片、视频选择和摄像头功能更好展示在界面中。



       打开QtDesigner软件,拖动以下控件至主窗口中,调整界面样式和控件放置,性别识别系统的界面设计如下图所示:



       控件界面部分设计好,接下来利用PyUIC工具将.ui文件转化为.py代码文件,通过调用界面部分的代码同时加入对应的逻辑处理代码。博主对其中的UI功能进行了详细测试,最终开发出一版流畅得到清新界面,就是博文演示部分的展示,完整的UI界面、测试图片视频、代码文件,以及Python离线依赖包(方便安装运行,也可自行配置环境),均已打包上传,感兴趣的朋友可以通过下载链接获取。



下载链接


   若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、视频,py, UI文件等,如下图),这里已打包上传至博主的面包多平台和CSDN下载资源。本资源已上传至面包多网站和CSDN下载资源频道,可以点击以下链接获取,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:



   在文件夹下的资源显示如下,其中包含了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,点击bat文件进行安装,详细演示也可见本人B站视频。



注意:本资源已经过调试通过,下载后可通过Pycharm运行;运行界面的主程序为runMain.py,测试摄像头或视频脚本可运行main.py,为确保程序顺利运行,请配置Python依赖包的版本如下:➷➷➷

Python版本:3.8,请勿使用其他版本,详见requirements.txt文件;

java
certifi == 2021.10.8
click == 7.1.2
numpy == 1.22.3
opencv-python == 4.5.5.64
Pillow == 9.0.1
PyQt5 == 5.15.4
pyqt5-plugins == 5.15.4.2.2
PyQt5-Qt5 == 5.15.2
PyQt5-sip == 12.9.1
pyqt5-tools == 5.15.4.3.2
python-dotenv == 0.19.2
qt5-applications == 5.15.2.2.2
qt5-tools == 5.15.2.1.2
wincertstore == 0.2
相关文章
|
4月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
168 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
4月前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
100 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
3月前
|
数据可视化 测试技术 Linux
基于Python后端构建多种不同的系统终端界面研究
【10月更文挑战第10天】本研究探讨了利用 Python 后端技术构建多样化系统终端界面的方法,涵盖命令行界面(CLI)、图形用户界面(GUI)及 Web 界面。通过分析各种界面的特点、适用场景及关键技术,展示了如何使用 Python 标准库和第三方库(如 `argparse`、`click`、`Tkinter` 和 `PyQt`)实现高效、灵活的界面设计。旨在提升用户体验并满足不同应用场景的需求。
|
5月前
|
C# 开发者 设计模式
WPF开发者必读:命令模式应用秘籍,轻松简化UI与业务逻辑交互,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,命令模式是简化UI与业务逻辑交互的关键技术,通过将请求封装为对象,实现UI操作与业务逻辑分离,便于代码维护与扩展。本文介绍命令模式的概念及实现方法,包括使用`ICommand`接口、`RelayCommand`类及自定义命令等方式,并提供示例代码展示如何在项目中应用命令模式。
64 0
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
167 3
|
19天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
1月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
2月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
149 8
|
3月前
|
JavaScript API 开发者
掌握ArkTS,打造HarmonyOS应用新视界:从“Hello World”到状态管理,揭秘鸿蒙UI开发的高效秘诀
【10月更文挑战第19天】ArkTS(ArkUI TypeScript)是华为鸿蒙系统中用于开发用户界面的声明式编程语言,结合了TypeScript和HarmonyOS的UI框架。本文介绍ArkTS的基本语法,包括组件结构、模板和脚本部分,并通过“Hello World”和计数器示例展示其使用方法。
106 1

热门文章

最新文章