人脸素描属性识别
代码:https://github.com/linkcao/FS2K_extract
问题分析
- 需要根据FS2K数据集进行训练和测试,实现输入一张图片,输出该图片的属性特征信息,提取属性特征包括
hair(有无头发)、hair_color(头发颜色)、gender(图像人物性别)、earring(是否有耳环)、smile(是否微笑)、frontal_face(是否歪脖)、style(图片风格),详细信息均可通过FS2K的anno_train.json和anno_test.json获取,本质是一个多标签分类问题。
处理方案
- 首先对于FS2K数据集用官方的数据划分程序进行划分,之后对划分后的数据进行预处理,统一图片后缀为jpg,之后自定义数据加载类,在数据加载过程中进行标签编码,对图片大小进行统一,并转成tensor,在处理过程中发现存在4个通道的图片,采取取前3个通道的方案,之后再对图像进行标准化,可以加快模型的收敛,处理完成的数据作为模型的输入,在深度学习模型方面,首先需要进行模型选择,使用了三个模型,分别为VGG16,ResNet121以及DenseNet121,在通过pytorch预训练模型进行加载,并修改模型输出层,输出数量为图片属性特征数,之后在设定模型训练的参数,包括Batch,学习率,epoch等,在每一轮训练完成后,都需要对预测出的特征进行处理,在二分类标签设定概率阈值,多分类标签特征列则进行最大概率类别组合,取预测概率最大的类别作为当前属性的预测结果,每一轮训练都在测试集上进行性能评估,并根据F1指标择优保存模型。训练完成后,在测试集上预测属性提取结果,对每一个属性进行性能评估,最后取平均,得到平均的性能指标。
整体的处理流程如下图所示:

数据预处理
- 数据划分,根据FS2K官方给出的数据划分得到训练集和测试集
- 统一图片后缀为jpg,通道数为3
- 所给数据集分为三个文件夹,每个文件夹图片的像素各不相同,分别为250*250、475 *340、223 *318,这里统一变换成256 * 256,便于后序处理
- 将图片数据转成tensor
- 逐channel的对图像进行标准化,可以加快模型的收敛
标签编码
- 由于目标属性集中存在
hair_color、style两个多分类标签,因此对这两个标签做编码处理 - 采用One_Hot编码对多类别标签进行处理
hair_color中0 对应 [1,0,0,0,0], 1对应[0,1,0,0,0], 2对应[0,0,1,0,0],以此类推,共5类style中 0 对应 [1,0,0],1对应[0,1,0], 2对应[0,0,1],以此类推,共3类
- 在和其他的5个二分类标签拼接组成标签向量,共13维
实验模型
VGG16
模型结构参数

由于VGG16最后一层全连接输出1000维特征,因此在本题中需要在加一层全连接输入1000维特征,输出13维特征,最后再加上一层sigmoid激活函数,在得到每一类预测的概率后,针对编码过的hair_color、style的8列,对各自的编码后的对应列计算概率最大的列下标,作为该属性的预测值。
训练参数
| batch | 64 |
|---|---|
| epoch | 20 |
| optimizer (优化器) | SGD(随机梯度下降) |
| criterion (损失函数) | BCELoss(二分类交叉熵损失) |
| 学习率 | 0.01 |
photo数据集上模型训练Loss

结果「方法一」
| f1 | precision | recall | accuracy | |
|---|---|---|---|---|
| hair | 0.926064 | 0.903045 | 0.950287 | 0.950287 |
| gender | 0.598046 | 0.611282 | 0.59369 | 0.59369 |
| earring | 0.74061 | 0.674408 | 0.821224 | 0.821224 |
| smile | 0.513038 | 0.580621 | 0.639579 | 0.639579 |
| frontal_face | 0.758024 | 0.694976 | 0.833652 | 0.833652 |
| hair_color | 0.351596 | 0.387132 | 0.389101 | 0.389101 |
| style | 0.460469 | 0.526145 | 0.443595 | 0.443595 |
| average | 0.668481 | 0.672201 | 0.708891 | 0.708891 |
ResNet18
模型结构参数

模型修改 ,模型最后加一层全连接输入1000维特征,输出13维特征,最后再加上一层sigmoid激活函数
训练参数
| batch | 64 |
|---|---|
| epoch | 20 |
| optimizer (优化器) | SGD(随机梯度下降) |
| criterion (损失函数) | BCELoss(二分类交叉熵损失) |
| 学习率 | 0.01 |
photo数据集上模型训练Loss

photo数据集结果「方法二」
| f1 | precision | recall | accuracy | |
|---|---|---|---|---|
| hair | 0.926064 | 0.903045 | 0.950287 | 0.950287 |
| gender | 0.657874 | 0.657195 | 0.6587 | 0.6587 |
| earring | 0.744185 | 0.764809 | 0.821224 | 0.821224 |
| smile | 0.634135 | 0.63298 | 0.652008 | 0.652008 |
| frontal_face | 0.758024 | 0.694976 | 0.833652 | 0.833652 |
| hair_color | 0.498804 | 0.515916 | 0.546845 | 0.546845 |
| style | 0.508202 | 0.57917 | 0.482792 | 0.482792 |
| average | 0.715911 | 0.718511 | 0.743188 | 0.743188 |
Sketch数据集上模型训练Loss

sketch数据集结果「方法三」
| f1 | precision | recall | accuracy | |
|---|---|---|---|---|
| hair | 0.926064 | 0.903045 | 0.950287 | 0.950287 |
| gender | 0.811982 | 0.813721 | 0.814532 | 0.814532 |
| earring | 0.743495 | 0.720011 | 0.813576 | 0.813576 |
| smile | 0.573169 | 0.573085 | 0.614723 | 0.614723 |
| frontal_face | 0.758024 | 0.694976 | 0.833652 | 0.833652 |
| hair_color | 0.358576 | 0.339481 | 0.419694 | 0.419694 |
| style | 0.842575 | 0.942995 | 0.803059 | 0.803059 |
| average | 0.751736 | 0.748414 | 0.78119 | 0.78119 |
DenseNet121
模型结构参数

训练参数
| batch | 64 |
|---|---|
| epoch | 20 |
| optimizer (优化器) | SGD(随机梯度下降) |
| criterion (损失函数) | BCELoss(二分类交叉熵损失) |
| 学习率 | 0.01 |
photo数据集上模型训练Loss

photo数据集结果「方法四」
| f1 | precision | recall | accuracy | |
|---|---|---|---|---|
| hair | 0.926064 | 0.903045 | 0.950287 | 0.950287 |
| gender | 0.935669 | 0.936043 | 0.935946 | 0.935946 |
| earring | 0.837358 | 0.837194 | 0.853728 | 0.853728 |
| smile | 0.784984 | 0.787445 | 0.790631 | 0.790631 |
| frontal_face | 0.780436 | 0.832682 | 0.8413 | 0.8413 |
| hair_color | 0.685242 | 0.665904 | 0.718929 | 0.718929 |
| style | 0.515421 | 0.567896 | 0.497132 | 0.497132 |
| avg | 0.808147 | 0.816276 | 0.823494 | 0.823494 |
Sketch数据集上模型训练Loss

sketch数据集结果「方法五」
| f1 | precision | recall | accuracy | |
|---|---|---|---|---|
| hair | 0.926064 | 0.903045 | 0.950287 | 0.950287 |
| gender | 0.883773 | 0.886639 | 0.885277 | 0.885277 |
| earring | 0.743196 | 0.734733 | 0.819312 | 0.819312 |
| smile | 0.610952 | 0.661847 | 0.671128 | 0.671128 |
| frontal_face | 0.758024 | 0.694976 | 0.833652 | 0.833652 |
| hair_color | 0.372596 | 0.360252 | 0.423518 | 0.423518 |
| style | 0.944535 | 0.96071 | 0.938815 | 0.938815 |
| avg | 0.779892 | 0.775275 | 0.815249 | 0.815249 |
FS2K人脸素描属性识别的更多相关文章
- 体验京东云 Serverless+AI 人脸属性识别
云原生计算基金会CNCF(Cloud Native Computing Foundation, CNCF)Serverless Whitepaper v1.0对无服务器计算作了如下定义: Server ...
- 人工智能之基于face_recognition的人脸检测与识别
不久乘高铁出行,看见高铁火车站已经实现了"刷脸进站",而且效率很高,很感兴趣,今天抽时间研究一下,其实没那么复杂. 我基本上是基于https://github.com/ageitg ...
- vs2017 dlib19.3 opencv3.41 C++ 环境配置 人脸特征点识别
身为一个.net程序员经过两天的采坑终于把人脸特征检测的项目跑通了,然后本文将以dlib项目中人脸特征检测工程为例,讲解dlib与opencv 在vs2017 C++ 项目中的编译与运行路径配置. 1 ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之三
1.在windows下编写人脸检测.识别系统.目前已完成:可利用摄像头提取图像,并将人脸检测出来,未进行识别. 2.在linux下进行编译在windows环境下已经能运行的代码. 为此进行了linux ...
- OpenCV 学习笔记 05 人脸检测和识别
本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个 Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...
- 人脸检测及识别python实现系列(2)——识别出人脸
人脸检测及识别python实现系列(2)——识别出人脸 http://www.cnblogs.com/neo-T/p/6430583.html
- 人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我”
人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我” 终于到了最后一步,激动时刻就要来临了,先平复一下心情,把剩下的代码加上,首先是为Model类增加一个预测函数: #识别人脸 ...
- 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型
人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...
- 人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门
人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门 上篇博文我们准备好了2000张训练数据,接下来的几节我们将详细讲述如何利用这些数据训练我们的识别模型.前面说过,原博文给出的训练 ...
- 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据
人脸检测及识别python实现系列(3)——为模型训练准备人脸数据 机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为.举一个简单的例子,成年人并没有主动 ...
随机推荐
- 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程
读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...
- 星外Xday提权
在星外不是安全模式的时候 但是又没有执行目录 有时候远程调用也不行对吧 winrar 有执行权限的时候C:\windows\IIS Temporary Compressed Files\ 这个目录有 ...
- 【转】基于DM8168的视频智能分析系统的设计方案
[导读] 为了实现高清视频的智能分析功能,本文介绍了一种以TI公司的DM8168为核心的高清视频智能分析系统的设计方案,该方案从硬件设计和软件设计两个方面介绍了硬件组成.工作流程.软件架构,并 ...
- Javascript新手集中营
javascript是世界上最流行的编程语言,也许没有之一,看看github,stackoverflow上面的开源项目和问答就可略知一二.它可以用来开发web app.服务器.或者联合nati ...
- 写给Java开发者的Node.JS简介
前言 今天上推特看见这篇文章,点进去发现是新货. 正好最近想入Node的坑,又有一些Java基础,所以希望翻译出来给大家,同时也让自己加深理解. 才疏学浅,如有不妥之处请指正. 原文链接:Node f ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- 写Java代码分别使堆溢出,栈溢出
首先要搞清楚堆栈里放的什么东西: 栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间,堆分配每一个对象内容(实例)内存空间. 一个变量可以先后指向多个对象实例:数组.链表等 ...
- FormData 知识点
通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对.它可以更灵活方便的发送表单数据,因此可以独立于表单使用. 如果你把表单的编码类型设置为multipart/for ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- 理解与学习linux 文件系统的目录结构
1. linux文件系统的结构 linux文件系统是以一种树形结构存在,Linux的文件系统的入口就是/,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. 2. ...









