基于深度学习人脸性别识别项目

news2024/10/6 10:37:00

项目概述

要求针对提供的人脸数据集,根据人脸图像预测人脸性别。

本次将提供 20000 多张已经分割的人脸图像,要求基于人脸图像自动识别该人性别。数据集的年龄从 1 岁覆盖到 100 多岁,包括了白种人、黄种人、黑种人等多种种族数据。数据集存在人脸姿态、光照、年龄等多种干扰,具有一定的挑战性。

数据集


数据集包括以下 csv 文件:

  • train.csv:训练集,其中包括两列,第一列 id 是人脸图像的编号,即对应的文件名,第二列 label 是性别标签,0 表示男性,1 表示女性

  • test.csv:测试集,只包括一列 id,即测试集中所有的人脸图像的编号。测试集中没有性别标签

  • train文件夹:所有的训练图像,扩展名名.jpg,其命名与train.csv中的id命名一致

  • test 文件夹:所有的测试图像,扩展名为jpg,其命名与test.csv中的id命名一致

  • sampleSubmit.csv:提交文件的样本,其中包括两列,第一列 id 是所有测试集的人脸图像的编号,即对应的文件名,第二列 label 是模型输出的性别标签,0 表示男性,1 表示女性

数据说明:

  • id:图像文件名,其对应图像为 id.jpg

  • label:图像标签,0 表示男性,1表示女性

3 运行环境


  • 虚拟环境:Anaconda 4.5.4

  • Python环境:Python 3.6.5

  • 编译器:vs code

  • 深度学习框架:pytorch1.5.1 , tensorflow2.3.0

  • 其他环境:jupyter, Kaggle notebook

  • Python库:numpy,pandas,os,PIL,matplotlib

4 算法原理与分析


4.1 损失函数


损失函数是一个非负实数函数,用来量化模型预测与真实标签之间的差异,下面介绍几种常用的损失函数:

4.1.1 平方损失函数(MSE)

平方损失函数较为容易理解,它直接测量机器学习模型的输出与实际结果之间的距离。这里可以定义机器学习模型的输出为y, 实际的结果为y_t,那么平方损失函数可以被定义为:

4.1.2 交叉熵损失函数(CrossEntropy)

二分类

在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们预测得到的概率分别为p和(1-p),此时表达式为:

其中:

  • y_i表示样本i的label,正类为1,负类为0

  • p_i表示样本i预测为正的概率

多分类

多分类实际上是对二分类的扩展:

其中:

  • y_i表示第i类的标签

  • p_i表示第i类的概率

.2 梯度下降


众所周知,在求最优解时常用到两个方法,两者均可用于线性/非线性拟合,梯度下降法通过不断地向梯度反方向迭代可以得到最优解,过程通常分为计算梯度和调整权值直至收敛

4.2.1 随机梯度下降(SGD)

随机梯度下降是指对于一个单样本计算损失,即随机一个样本更新一次梯度。

这样的好处是计算f(x)的梯度和计算f(x+1)的梯度是可以并行计算的,大大提高了运行速度,而且其可以避免冗余数据的影响,但是并不是每次都朝着全局最优迭代,多以通常说地SGD都是mini-batch SGD。

4.2.2 带动量的梯度下降(momentum)

如下图所示,如果进行梯度下降法的一次迭代, 可以看到是慢慢摆动到最小值, 这种上下波动减慢了梯度下降法的速度, 理想的情况是,在纵轴上, 你希望学习慢一点, 因为你不想要这些摆动, 但是在横轴上,你希望加快学习,你希望快速从左向右移,移向最小值,移向红点。

其基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新你的权重。

4.3 卷积神经网络


基础的CNN由卷积(convolution),激活(activation)和池化(pooling)三种结构组成。CNN输出的结果是每幅图像的特定特征空间。当处理图像分类任务时,我们会把CNN输出的特征空间作为全连接层或全连接神经网络(fully connected neural network, FCN)的输入,用全连接层来完成从输入图像到标签集的映射,即分类。当然,整个过程最重要的工作就是如何通过训练数据迭代调整网络权重,也就是后向传播算法。目前主流的卷积神经网络(CNNs),比如VGG, ResNet都是由简单的CNN调整,组合而来。

CNN层级结构

  • 数据输入层/ Input layer

  • 卷积计算层/ CONV layer

  • ReLU激励层 / ReLU layer

  • 池化层 / Pooling layer

  • 全连接层 / FC layer

卷积计算过程

4.4 深度学习训练技巧


4.4.1 划分验证集和K交叉验证

模型什么时候达到最好,首先看对训练集的拟合程度,也就是通常所说的loss,但是并不是loss越小越好,更重要的是模型在新数据下的表现能力,也就是val_loss。我们通常将训练集划分出一部分作为验证集,来查看模型的泛化能力,但是这也会产生一个弊端,也就是没有充分的运用到训练数据,要知道,很多任务中的训练数据本身也并不多,所以我们这里采用k折交叉验证来最小化这个弊端。

4.4.2 ReduceLROnPlateau配合EarlyStopping

在训练过程中通过手工调整超参数费时费力,ReduceLROnPlateau通过监测验证集上的损失(val_loss)来动态的调整学习率,而且配合EarlyStopping,可以在val_loss多次不再变化后停止训练,更容易获取训练的最佳点。

4.4.3 Dropout

dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。

4.4.4 Batch normalization

在我们以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过σ ( W X + b ) 这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,既可以加快训练速度,又可以避免采用其他正则化手段,还能提高模型精度。

5 实验设计


5.1 数据读入


该任务给出的原始数据是由csv文件和相关的图片文件夹构成,操作起来很不方便,本文通过pandas的读取方法将csv文件里的图片名和标签读取到统一的txt文件中,如下图所示。

通过继承pytorch里提供的DataSet类重写自己的数据集类,然后通过DataLoader打乱并生成batch。

5.2 图像增强


为了丰富图像训练集,更好的提取图像特征,泛化模型(防止模型过拟合),一般都会对数据图像进行数据增强。数据增强,常用的方式,就是旋转图像,剪切图像,改变图像色差,扭曲图像特征,改变图像尺寸大小,增强图像噪音(一般使用高斯噪音,盐椒噪音)等。

归一化和标准化

下边展示一些常用的图像增强方法:

亮度变化

随机灰度化

随机旋转

水平垂直翻转

5.3 模型设计


5.3.1 模型一

模型1结构

损失函数:BCELoss

参数选择

以1:4将训练集划分为验证集(validation)和训练集,以下将探讨学习率(learning_rata)、epoch、batch_size、优化器,正则化系数λ对验证集准确率的影响。

总结

在提高模型一精度的过程中,各种手段(包括数据增强,各种超参数调节均未取得较大进步,最高准确率只有89%,有理由确定该模型是影响精度的主要原因,猜测原因主要是模型深度还不够,可调节的参数不够多)

5.3.2 模型二

模型结构

模型二通过使用小的3*3的卷积核进行处理,叠加5层,拉平后接全连接层,这样使得网络深度足够,有足够多的参数。下图是部分网路结构。

该网络除了使用小的卷积核之外,还使用了dropout方法,这也是一种正则化方法,随机的让部分神经元失活,可以防止过拟合的出现。而且该网络在每一个卷积层的输出添加了Batch Normalization层,该层可以让网络训练过程中使得每一层神经网络的输入保持相同分布。

训练过程

在模型1的训练过程中通过手工调整超参数费时费力,在该模型中我们使用ReduceLROnPlateau,通过监测验证集上的损失(val_loss)来动态的调整学习率,而且配合EarlyStopping,可以在val_loss多次不再变化后停止训练,更容易获取训练的最佳点。

实验表明,通过多次训练,该模型最佳可达到91.2%的准确率。

5.3.3 模型三

迁移学习

模型迁移利用上千万的图象训练一个图象识别的系统,当我们遇到一个新的图象领域,就不用再去找几千万个图象来训练了,可以原来的图像识别系统迁移到新的领域,所以在新的领域只用几万张图片同样能够获取相同的效果。模型迁移的一个好处是可以和深度学习结合起来,我们可以区分不同层次可迁移的度,相似度比较高的那些层次他们被迁移的可能性就大一些。

所以在遇到特征比较相似的情况时,可以使用预训练模型来达到自己的目的。

VGG16迁移学习

通过大量实践,并跑了多个预训练模型,发现对于人脸性别识别任务上VGG16效果最好,验证集上效果最高可到到92.7%,下表展示了VGG16训练过程中的部分数据。

在此之前,或许因为训练经验不足,其他的预训练模型都没有产生理想的结果,也因为kaggle上gpu使用时间的限制和速度的限制,没有对其他模型进行大量的训练工作,也可能是其他模型识别的特征与该任务相差太大,训练结果见下表所示。

5.4 模型融合


在获取了大量的训练结果数据后,所谓三个臭皮匠,胜过诸葛亮,模型融合是一个很关键的步骤,能够大大提高精度。模型融合方法很多,下面介绍使用到的几个方法。

5.4.1 投票

如果是三个性能较差,但是高度不相关的模型:

可以看到大大的提高了精确性。

5.4.2 带权重的投票

得到了一堆准确率差别挺大的数据,经过实验,随着低准确率样本数增多,投票过后的精度并不会再升高,反而不如用精确率最高的几组数据进行投票。可以想到这样一个场景:对于一道题,就算有2个成绩一般的人选A,反而你更宁愿相信成绩很好的人说选B,复原到该任务中,一个准确率很高的结果的票数远不止1票才合理。基于这种思想,将得分高的结果票数增多取得了比平均投票更好的效果。但是探索合适的权重仍然是一个复杂的工作,相信合适权重分配能取得更好的表现。

6 实验结果与分析


6.1 实验结果


通过大量实验,模型一的最佳测试集结果为0.89,模型二的最佳表现为0.916,模型三的VGG16迁移学习最佳测试集结果可达到0.927,在通过投票和带权重的投票模型融合手段下,最佳测试集结果可达到0.93447。

6.2 结果分析与展望


对于这个结果,我觉得还存在很多不足,主要还有很多工作没有做完,主要有以下工作:

  • 在模型融合上,权重探索还不够多,而且单纯的对结果投票并没有对各个模型物尽其用,基于这个问题,我觉得可以将各个表现比较好的模型最后一个卷积层拉平的向量V保存下来,然后将几个模型的向量V进行拼接,通过一个或者多个全连接层进行训练,相信可以最大化的发掘出每个模型的优点

  • 对于一个不错的模型,因为gpu和设备的限制,只用到了部分数据,并且没有去做K交叉验证,所以应该还有一定的提升空间

  • 我一直有一个想法:模型输出的是为男性或者女性的概率,那么当模型输出值在0.45-0.55的时候,说明模型也觉得既像男性,又像女性,那么这个时候模型输出的结果属于“值得怀疑的结果”,我们可以对于这部分的输出再进行训练,提取更多的特征

  • 对于诸多复杂的预训练模型,没有进行大量而丰富的训练,并没有得出其最好的结果,相信其中还有很多潜力等待挖掘

  • 其次,对于各种trick还不够熟悉,对于模型的设计还有很多不足

  • 在对于图像数据清洗和处理上,在明知道有错误数据,但是却未来得及处理。

我相信,随着自己不断地学习,以及条件地改善,这些遗留问题都会被一一解决,自己也能对该类问题更加游刃有余。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164744.html

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

相关文章

2022年“网络安全”赛项海南省赛选拔赛 任务书

2022年“网络安全”赛项海南省赛选拔赛 任务书 一、竞赛时间 共计6小时。 (二)A模块基础设施设置/安全加固(350分) 一、项目和任务描述: 假定你是某企业的网络安全工程师,对于企业的服务器系统&#xff0c…

【数据结构】二叉搜索树

一、概念二叉搜索树也叫二叉排序树。在一颗二叉搜索树中,他的左子树二点节点值一定比根节点的值小,他的右子树节点的值一定比根节点的值大。二、特点他的左子树节点的值一定比根节点的值小他的右子树节点的值一定比根节点的值大他的每一颗子树都是一颗二…

java+springboot笔记2023002

java的注解机制: Java主要提供了5个基础注解,分别是: Override Deprecated SuppressWarnings SafeVarargs FunctionalInterface Java元注解: Retention, Target, Inherited, Documented&#x…

算法刷题打卡第66天:极大极小游戏

极大极小游戏 难度:简单 给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度,如果 n 1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums &a…

MySQL索引命中与失效

目录创建表MySQL执行优化器索引的命中与失效情况总结讨论MySQL索引命中与失效,我们得先来创建表 创建表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABL…

java动态规划算法

使用场景 动态规划最重要的是转移方程,而转移方程需要递归和记忆化搜索产生的表,因此直接贴出转移方程是没什么用的,不探究如何从递归到记忆化搜索再到转移方程,还是很难想到怎么去得到转移方程。下面我们将从例子中探寻如何三步走…

四、Gradle项目的生命周期

文章目录四、Gradle项目的生命周期【尚硅谷】Gradle教程-讲师:刘辉 生活明朗,万物可爱,人间值得,未来可期 四、Gradle项目的生命周期 Gradle 项目的生命周期分为三大阶段:Initialization -> Configuration -> E…

Maestro 薛定谔软件简单分子对接案例

##参考: Maestro 薛定谔软件使用: https://www.bilibili.com/video/BV1RN411X7Te https://www.youtube.com/watch?vNkM8jjHr7f4&listPL3dxdlKx_PcfuvHwJ0RjpZFt4HjwyTr7f Maestro 薛定谔对接: https://www.bilibili.com/video/BV17p…

【Java多线程】线程的常用方法

测试Thread中的常用方法1.start():启动当前线程;调用当前线程的run()2.run():通常需要重写Thread类中的此方法,将创建的线程要执行的3.currentThread():静态方法,返回当前代码的线程4.getName():获取当前线程的名字5.setName():设置当前线程的…

MySQL逻辑删除+Mybatis-Plus = 墙裂推荐

目录前言逻辑删除使用Mybatis-Plus逻辑删除它做了什么注意写在后面的一些话前言 一般情况下,我们要删除一条数据,直接使用 delete 即可,就像这样:delete from user where id 1,这样做的好处是: 符合我们…

C进阶_字符串库函数

目录 求字符串长度 strlen 常规实现 递归实现 指针-指针实现 长度不受限制的字符串函数 strcpy 模拟实现strcpy strcat 模拟实现strcat strcmp 模拟实现strcmp 长度受限制的字符串函数 strncpy strncat strncmp 求字符串长度 strlen size_t strlen ( const c…

前端工具(运用造型)

CSS预处理器的使用方法 1、什么是css预处理器 CSS预处理器是一种专门的编程语言,用来为CSS增加一些编程特性(CSS本身不是编程语言)不需要考虑浏览器兼容问题,因为CSS预处理器最终编译和输出的仍是标准的CSS样式。可以在CSS预处理…

磨金石教育摄影技能干货分享|简述特效在影视制作中的四大作用

近三年因为疫情的原因,极少去影院去看电影。 想起来上次看电影还是去年八月份,当时上映的是科幻大作《沙丘》。看科幻电影,最大的期待就是导演编剧们对外星球与外太空场景的塑造。那些逼真的场景与炫酷的战舰航天器,满足了我对未知…

设计模式_结构型模式 -《适配器模式》

设计模式_结构型模式 -《适配器模式》 笔记整理自 黑马程序员Java设计模式详解, 23种Java设计模式(图解框架源码分析实战) 概述 如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图…

Kindle 可旋转桌面时钟

前言 自己的 Kindle 吃灰很久了,想做个时钟用,但是网上可选的时钟网站比较少,这些时钟网站里面,要么太简单 界面也比较丑陋,要么内容太多 有些本末倒置了,要么网址特别长 输入网址的时候太麻烦。 干脆自己…

【ROS】—— 机器人导航(仿真)—导航原理(十七)

文章目录前言1. 导航模块简介1.1 全局地图1.2 自身定位1.3 路径规划1.4 运动控制1.5 环境感知2. 导航之坐标系前言 📢本系列将依托赵虚左老师的ROS课程,写下自己的一些心得与笔记。 📢课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ …

Min_25筛详解

概述 Min_25是日本一个ACM选手的ID,这个筛法是他发明的,所以称之为Min_25筛。它能在亚线性复杂度求出一类积性函数的 fff 的前缀和,前提 是这个积性函数在质数和质数的幂位置的函数值比较好求。借助埃拉托色尼筛的思想 将原问题转化成与质因…

Allegro如何导出和导入设计规则操作指导

Allegro如何导出和导入设计规则操作指导 当需要借用另外一款PCB的设计规则时候,Allegro支持把PCB设计规则导入到另外一块PCB中,如下图 具体操作如下 打开规则管理器打开后如下图

2023.1.15 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.PROPOSED METHOD5.1 Problem Formulation5.2 Personalized Time Intervals5.3 Embedding Layer5.4 Time Interval-Aware Self-Attention5.4.1 Time Interval-Aware Self-attention Layer5.4.2 Causality5.4.3 Point-Wise Fe…

QT可直接安装的离线版最后版本5.14.2

以前用c#来做组态,自定义控件开发起来也还过得去,但QT的控件和graphics view貌似更有优势,个人观点吧!工控领域的组态用上QT还是不错的选择。 从2000前开始使用qt,算起来也有20多年了。个人感觉用起来最顺手的应该时Q…