人脸素描属性识别

代码:https://github.com/linkcao/FS2K_extract

问题分析

  • 需要根据FS2K数据集进行训练和测试,实现输入一张图片,输出该图片的属性特征信息,提取属性特征包括hair(有无头发)、hair_color(头发颜色)、gender(图像人物性别)、earring(是否有耳环)、smile(是否微笑)、frontal_face(是否歪脖)、style(图片风格),详细信息均可通过FS2K的anno_train.jsonanno_test.json获取,本质是一个多标签分类问题。

处理方案

  • 首先对于FS2K数据集用官方的数据划分程序进行划分,之后对划分后的数据进行预处理,统一图片后缀为jpg,之后自定义数据加载类,在数据加载过程中进行标签编码,对图片大小进行统一,并转成tensor,在处理过程中发现存在4个通道的图片,采取取前3个通道的方案,之后再对图像进行标准化,可以加快模型的收敛,处理完成的数据作为模型的输入,在深度学习模型方面,首先需要进行模型选择,使用了三个模型,分别为VGG16,ResNet121以及DenseNet121,在通过pytorch预训练模型进行加载,并修改模型输出层,输出数量为图片属性特征数,之后在设定模型训练的参数,包括Batch,学习率,epoch等,在每一轮训练完成后,都需要对预测出的特征进行处理,在二分类标签设定概率阈值,多分类标签特征列则进行最大概率类别组合,取预测概率最大的类别作为当前属性的预测结果,每一轮训练都在测试集上进行性能评估,并根据F1指标择优保存模型。训练完成后,在测试集上预测属性提取结果,对每一个属性进行性能评估,最后取平均,得到平均的性能指标。

整体的处理流程如下图所示:

数据预处理

  1. 数据划分,根据FS2K官方给出的数据划分得到训练集和测试集
  2. 统一图片后缀为jpg,通道数为3
  3. 所给数据集分为三个文件夹,每个文件夹图片的像素各不相同,分别为250*250、475 *340、223 *318,这里统一变换成256 * 256,便于后序处理
  4. 将图片数据转成tensor
  5. 逐channel的对图像进行标准化,可以加快模型的收敛

标签编码

  1. 由于目标属性集中存在hair_colorstyle 两个多分类标签,因此对这两个标签做编码处理
  2. 采用One_Hot编码对多类别标签进行处理
    1. hair_color中0 对应 [1,0,0,0,0], 1对应[0,1,0,0,0], 2对应[0,0,1,0,0],以此类推,共5类
    2. style中 0 对应 [1,0,0],1对应[0,1,0], 2对应[0,0,1],以此类推,共3类
  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人脸素描属性识别的更多相关文章

  1. 体验京东云 Serverless+AI 人脸属性识别

    云原生计算基金会CNCF(Cloud Native Computing Foundation, CNCF)Serverless Whitepaper v1.0对无服务器计算作了如下定义: Server ...

  2. 人工智能之基于face_recognition的人脸检测与识别

    不久乘高铁出行,看见高铁火车站已经实现了"刷脸进站",而且效率很高,很感兴趣,今天抽时间研究一下,其实没那么复杂. 我基本上是基于https://github.com/ageitg ...

  3. vs2017 dlib19.3 opencv3.41 C++ 环境配置 人脸特征点识别

    身为一个.net程序员经过两天的采坑终于把人脸特征检测的项目跑通了,然后本文将以dlib项目中人脸特征检测工程为例,讲解dlib与opencv 在vs2017 C++ 项目中的编译与运行路径配置. 1 ...

  4. 基于OpenCv的人脸检测、识别系统学习制作笔记之三

    1.在windows下编写人脸检测.识别系统.目前已完成:可利用摄像头提取图像,并将人脸检测出来,未进行识别. 2.在linux下进行编译在windows环境下已经能运行的代码. 为此进行了linux ...

  5. OpenCV 学习笔记 05 人脸检测和识别

    本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个  Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...

  6. 人脸检测及识别python实现系列(2)——识别出人脸

    人脸检测及识别python实现系列(2)——识别出人脸 http://www.cnblogs.com/neo-T/p/6430583.html

  7. 人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我”

    人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我” 终于到了最后一步,激动时刻就要来临了,先平复一下心情,把剩下的代码加上,首先是为Model类增加一个预测函数: #识别人脸 ...

  8. 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型

    人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...

  9. 人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门

    人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门 上篇博文我们准备好了2000张训练数据,接下来的几节我们将详细讲述如何利用这些数据训练我们的识别模型.前面说过,原博文给出的训练 ...

随机推荐

  1. SSM整合_年轻人的第一个增删改查_新增

    写在前面 SSM整合_年轻人的第一个增删改查_基础环境搭建 SSM整合_年轻人的第一个增删改查_查找 SSM整合_年轻人的第一个增删改查_新增 SSM整合_年轻人的第一个增删改查_修改 SSM整合_年 ...

  2. Java语言学习day01--6月28日

    Java语言学习day01一:Java概述 1.Java语言发展史 任职于太阳微系统的 詹姆斯·高斯林 等人于1990年代初开发Java语言的雏形,最初被命名为 Oak ,目标设置在 家用电器等小型系 ...

  3. element.insertAdjacentHTML

    一.概念 insertAdjacentHTML() 方法将指定的文本解析为 Element 元素,并将结果节点插入到DOM树中的指定位置.它不会重新解析它正在使用的元素,因此它不会破坏元素内的现有元素 ...

  4. 前端优化建议:合理利用JavaScript的条件运算符

    在最近的项目中要使用到一个格式化文件大小的算法,于是不假思索写了如下代码: function formatSize(size){ if(size<1024){ return size+" ...

  5. @Resource与构造函数踩坑

    (虽然解决了需求,但我还是没搞懂为什么构造函数结束后,调用userMapper注入还是为空!) 首先,我有一个没有问题的userMapper类,用于处理user的数据库处理. 其次,我在另一个类里面使 ...

  6. HMS Core Discovery第14期回顾长文|纵享丝滑剪辑,释放视频创作力

    HMS Core Discovery第14期直播<纵享丝滑剪辑,释放视频创作力>,已于4月21日圆满结束,本期直播我们同HMS Core视频编辑服务(Video Editor Kit)的产 ...

  7. Spring Ioc源码分析系列--Ioc源码入口分析

    Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...

  8. 如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

    问题描述 如今显示器的分辨率越来越高,如果不启用 DPI 缩放,软件的字体和图标在高分屏下就会显得非常小,看得很累人.从 5.6 版本开始,Qt 便能支持 DPI 缩放功能,Qt6 开始这个功能是默认 ...

  9. C语言函数调用栈

    C语言函数调用栈 栈溢出(stack overflow)是最常见的二进制漏洞,在介绍栈溢出之前,我们首先需要了解函数调用栈. 函数调用栈是一块连续的用来保存函数运行状态的内存区域,调用函数(calle ...

  10. Element中Tree树结构组件中实现Ctrl和Shift多选

    在Element中的树结构中, 实现多选功能,首先的是判断有没有按下键盘ctrl和shift按键.但是在Element中的tree组件的左键点击事件是没有提供$event鼠标属性判断的.所以就需要在函 ...