# 人脸性别识别:二分类问题
## 一、实验目的及要求
大作业提供人脸图像,数据集包括了白种人、黄种人、黑种人等多种种族数据。数据集存在人脸姿态、光照、年龄等多种干扰,具有一定的挑战性。要求实现:基于人脸图像自动识别该人性别,数据集划分要求为:随机选择 40%、10%、50%的数据,分别作为训练、验证和测试集。
① 要求撰写一份实验报告,报告中说明使用了何种模型及方法,以及对应的测试结果;
② 在训练模型时所参考的学术信息需要给出适当的文献引用;
③ 不允许直接使用开源项目提供的已训练好的模型或已写好的现有代码。
④ 附加任务(供参考选做):设计界面,可在界面上实现输入数据集中的图像后,显示该人的性别。
## 二、实验过程
### 1.准备工作
首先弄清楚作业需要完成什么,阅读了作业文件,配置了环境;之后复习KNN和逻辑回归算法,初步弄懂助教的示例代码。
### 2.尝试逻辑回归算法
依据提示,重新写了 DataLoader,用以加载 LWF 数据集。修改的部分主要包括:
没有使用 one-hot 编码;因为是二分类问题,所以只用 1 和 0 作为 label。
修改数据集的数量及比例
修改数据的加载方式:读取男女名单文件,分别加载后合并。
首先尝试逻辑回归算法。
![](https://www.writebug.com/myres/static/uploads/2021/12/13/c957d2a5ead5d0e0c1d79e26d1349c7b.writebug)
起初我延续助教的代码进行了尝试,但是无论如何调试,都会报错。报错信息如下:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/303b753c55e9a74018028032bda41985.writebug)
这个错误非常的奇怪,因为它只给了我一个错误码,没有给出任何的错误提示,调试过程便突然直接结束。我开始逐行地运行,但是也总是突然退出。上网查了许多资料,大多数说是内存问题。Debug 的时候打开任务管理器,有如下界面,可以看到磁盘和内存几乎已经满了:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/226bc5ac8123ba470faef931b1226061.writebug)
尝试了许多办法也没有效果。之后尝试了修改一个参数,就是正则化的选择。在上网查资料时,有一个资料说一般使用 l2 正则化即可,复杂一些的也可以选择 l1 正则化。原代码中使用的 l1,因此我尝试了 l1 正则化。
终于不报这个错误了。但是运行的时候,在第一个正则化参数训练的时候出现了时间过长的问题(一个多小时都没有出任何结果,我中间甚至睡了一觉)。效率这样低,就算有结果也是差强人意的,遂按下停止按钮。
### 3. 尝试 KNN 算法
于是转而尝试 KNN 算法。
依旧先尝试延续助教的代码进行尝试,在其中加入了一些输出内容。以下是运行结果:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/f388f2389404fa930ecfc6bccb32e833.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/13/d88350876c0fa17472239493a0b912ef.writebug)
运行了几次,正确率均在 80% 左右,运行时间也比较慢;但是暂时我也不知道应该如何调试,因此决定尝试 CNN 算法。
### 4. 尝试 CNN 算法
CNN 算法相对来说门槛高了很多,有了机器学习的感觉。我打算先把助教给的参考代码跑起来,看看效果如何。没想到这一步就耗费了我三天。
首先,由于 MNIST 是 Pytorch 自带的数据集,而 LWF 不是,因此首先要写一个 Dataset 的派生类,用以载入数据。依据参考文献,有三个函数必须重载,它们的功能分别有:
__init__
构造函数。除了初始化参数,还包括读取包含名字的名单。
__len__
返回数据集的大小。
__getitem__
用于返回某一条数据。在这个函数中,不仅承担了读取数据的功能,还承担了图形变换的功能,变换取决于类的属性 transforms。
然后顺利地形成第一个大 bug:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/5990b6f8f115905e964cbdaaf34da112.writebug)
原因应该是:在__getitem__函数中,我返回的 sample 是一个字典,这不符合它的要求。于是有如下更改:
原代码:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/6fdaf20d2888252bd2d616da41509be3.writebug)尝试了许多办法,这样修改是有效的:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/ea40c3ffb4038ad8c631d2b5ac927249.writebug)
这个 bug 解决了。之后开始和第二个大 bug 的斗争:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/e8327d1d522010cb36b22512b93eb75d.writebug)
我想这个是说,我要接两个参数,但是我给它传了多于两个。问题出在这行代码:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/0e6f50a4c39406bc50d170caa93fc7fd.writebug)
记忆有些模糊了,下面说得可能不是百分百正确:
调试的时候发现传的第一个参数是 int,这并不是我想要的。于是修改为:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/abbb89e049169fb4532c61b3985a2c87.writebug)
然后它居然说我传的参数太少了!
后来又查了很多网页,这样修改是有效的:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/95bec64b1eecad4eb5ea95be10cb118e.writebug)
这个解决了,然后有一些不太顽固的问题:
矩阵尺寸不匹配问题,改变尺寸即可解决
输入了三个通道,在读取图片时把其转化为灰度图即可
……
然后出现了一个问题:
在定义 MyDataset 的时候,它是依赖于一个名单文件的。那个文件上有的名字,所对应的图片就是它的数据,不太容易再进行内部的划分。于是我先按比例,分别随机划分了男女名单,然后实例化了四个类,分别是男女的训练集和测试集。
由于我比较信赖 python 的高级性,我想把两个 MyDataset 直接进行相加,得到训练集和测试集,后续直接使用这两个数据集就可以了。事实证明我只是痴心妄想。
于是我重新写了一份加载数据的 dataset,这次叫 LfwDataset。同样是继承 Dataset 类并重载三个函数。与初代版本区别如下:
首先生成一份包含所有名字的名单文件
构造函数__init__增加了两个参数:train 和 test,类型为 bool,用以表征它们是训练集还是测试集。如果均为 false,则说明是验证集。有了这两个参数,就可以直接对数据集进行删减。
构造函数中承担读取数据和图像变换的功能。
__getitem__直接从其图片列表中返回数据,而不是读取文件。
然后来了这个非常非常非常折磨人的错误,耗了我一天的时间:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/0e2a4770caa9cd542b0e60e47d1d6cbf.writebug)
首先是弄懂哪里出的问题,这个就花了很多功夫。问题出在:读取到的数据经过转化为灰度图之后,就变成了 float64(也就是 double)。但之后的默认是 float32,这两个无法在一起做运算。
![](https://www.writebug.com/myres/static/uploads/2021/12/13/3bfff004fe9589f240520abad08ab90f.writebug)
然后是寻求解决办法。尝试了太多!都没有用!最后这个解决了问题:在图片变换的时候加上:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/dad35b427986b79d5eb94693394a081e.writebug)
天知道我找了这个方法多久!泪目了。
之后尝试运行,得到这样的结果:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/d616bf0f38cf773282b5267c9ee8c256.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/13/1fa0c708978c29c83d4810bc7f029322.writebug)
![](https://www.writebug.
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
大作业提供人脸图像,数据集包括了白种人、黄种人、黑种人等多种种族数据。数据集存在人脸姿态、光照、年龄等多种干扰,具有一定的挑战性。要求实现:基于人脸图像自动识别该人性别,数据集划分要求为:随机选择 40%、10%、50%的数据,分别作为训练、验证和测试集。详细设计见md文件。 大作业提供人脸图像,数据集包括了白种人、黄种人、黑种人等多种种族数据。数据集存在人脸姿态、光照、年龄等多种干扰,具有一定的挑战性。要求实现:基于人脸图像自动识别该人性别,数据集划分要求为:随机选择 40%、10%、50%的数据,分别作为训练、验证和测试集。 ① 要求撰写一份实验报告,报告中说明使用了何种模型及方法,以及对应的测试结果; ② 在训练模型时所参考的学术信息需要给出适当的文献引用; ③ 不允许直接使用开源项目提供的已训练好的模型或已写好的现有代码。 ④ 附加任务(供参考选做):设计界面,可在界面上实现输入数据集中的图像后,显示该人的性别。 二、实验过程
资源推荐
资源详情
资源评论
收起资源包目录
基于python pytorch实现人脸性别识别GUI系统 附代码 +报告可作为毕设.zip (18个子文件)
genderiden
MyDataSet.py 2KB
Gender_identify3.1.py 6KB
LwfDataset2.py 3KB
LICENSE 1KB
Gender_identify2.0.py 1KB
YutongNet2.py 869B
female_names.txt 70KB
Gender_identify3.3.py 5KB
人脸性别识别_实验报告_无08李煜彤.docx 1.2MB
Gender_identify_gui.py 4KB
DataLoader.py 3KB
YutongNet.py 2KB
Gender_identify1.0.py 1KB
README.md 73KB
LfwDataset.py 3KB
Gender_identify3.0.py 8KB
male_names.txt 234KB
Gender_identify3.2.py 4KB
共 18 条
- 1
资源评论
- weixin_734905372023-06-08资源很实用,对我启发很大,有很好的参考价值,内容详细。
- 别骂啦_2023-04-26资源太好了,解决了我当下遇到的难题,抱紧大佬的大腿~
- m0_674576452023-11-16支持这个资源,内容详细,主要是能解决当下的问题,感谢大佬分享~
- 2301_790839882023-07-20资源内容详实,描述详尽,解决了我的问题,受益匪浅,学到了。
甜辣uu
- 粉丝: 8384
- 资源: 1103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Python实现的股票量化交易策略源代码+视频讲解+案例代码,含RSI策略、BOP指标策略、KDJ策略、MACD指标策略等
- EDA编码.zip
- 文本分类任务训练神经网络来学习词汇表中每个词的词向量
- MyBatis进阶技巧:探索动态SQL的无限可能.md
- HM2300C-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- HM2300B-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 员工解除劳动合同申请表.pdf
- 物模块模型代码,前往设计物模块所属
- mybatis动态sql(使用<where>标签来处理多个查询条件)
- Java面试手册,助力大家面试过五关斩六将,面试成功
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功