AICon全球人工智能与机器学习技术大会周四开幕,点击查看完整日程>> 了解详情
写点什么

新零售下的精准营销利器:人脸属性识别

人脸识别技术专栏文章 - 第三篇

  • 2019 年 6 月 24 日
  • 本文字数:0 字

    阅读完需:约 1 分钟

新零售下的精准营销利器:人脸属性识别

第一篇第二篇文章中,我们分别介绍了人脸识别发展的主要脉络以及目前主流的人脸识别算法,本文我们将对人脸识别的一个重要应用方向进行介绍。


在人脸识别中,有一类应用叫做人脸属性识别,它主要是通过分析人脸图像来识别人物的各种属性或者状态,然后根据当前人物的状态做出一些针对性的处理,在零售行业中典型的应用场景就是精准营销。随着近几年深度学习的快速发展,人脸属性分析也获得了越来越多的关注。


1 人脸属性识别简介

关于人脸属性的研究方向大致可分为两类,一类是人脸属性估计,即识别一张图片中人脸的某些属性,比如性别、表情,欢乐程度等等;另外一类是人脸属性编辑,简单来说就是改变、生成或去除某些属性,比如把一张脸变的更老,预测未来的相貌,或是在一张脸上添加一副白框太阳镜等等。


早期关于人脸属性识别的研究大多采用基于特征脸的方法,它主要用到了主成分分析(PCA)。计算所有训练样本的特征脸,也就是将人脸的形状和纹理进行主成分分析,生成对应的特征向量,即所谓的特征脸。这个特征脸也可以作为特征用于人脸识别。在人脸属性分析当中,假定第 i 个样本对应的特征脸为Φi,对应的人脸属性值为 yi,这个属性可以为年龄或者性别或者其它。简单来说人脸属性识别问题可以通过估计下述映射矩阵 R 进行解决:



而人脸属性编辑则可以通过估计下述回归矩阵 B 进行解决:



当然,实际处理的时候并没有这么简单,因为先要对特征脸对应的特征向量进行分解,将表征人身份的特征剔除出去,只留下那些影响属性变化的特征。


正是由于早期基于特征脸的方法在对人脸属性识别和属性编辑这两套算法上是一个对偶问题,我们习惯性的在提起人脸属性识别的时候,默认不仅仅是属性识别,还包括了属性编辑。


当进入深度学习阶段以后,人脸属性识别和人脸属性编辑从算法角度上来说,就逐渐的区分开了。


说到这里,插一个题外话,笔者曾经在与其他研究人员交流的过程中被问到过一个问题,就是年龄识别为什么要使用回归的方式而不是将每个岁数当作一个标签采用分类的方法。这个问题非常突然,当时笔者给出的回答并不十分准确,但是现在可以准确的告诉大家答案:正是因为在传统算法中,基于特征脸的人脸属性识别,尤其是年龄估计是使用回归估计的方法,所以在早期的基于深度学习的人脸属性识别中,经常会采用回归的方法来识别部分人脸属性。


人脸属性估计通过特征提取和训练分类器来实现,而人脸属性编辑通过训练生成模型来实现,其主要有两个分支:生成对抗网络(generative adversarial networks, i.e., GANs)以及变分自动编码器(variational autoencoders, i.e., VAEs)。论文[1]里给出了基于深度学习的人脸属性估计和编辑的演变历史,分别见图 1 和图 2。



图 1:人脸属性估计方法演变


如图 1 所示,深度学习人脸属性估计的研究可以追述到 Zhang et al.,人的全身图片作为模型输入,不仅有人脸属性的估计,也有身体属性的估计。接着 LNet 和 ANet 的兴起推动人脸属性估计成为独立的研究方向,只有人脸图片作为模型输入。与此同时,两个拥有 40 个标注属性的大型数据库,即 CelebA 和 LFWA 公开于世,进一步推动了人脸属性估计方法的发展。


人脸属性编辑方法的演变见图 2,基本所有方法都是随着 GANs 和 VAEs 的发展一起发展而来。最早的编辑模型 DIAT,尝试用简单的生成对抗网络生成人脸属性。紧接着,条件 GANs 和 VAEs 的发展推动了基于属性标签模型的快速发展,这类模型有个重要的优势就是可以同时改变多个属性,但其实这也是把双刃剑,因为模型不能保证不相关属性不被改变。事实上,直到现在,如何同时改变多个属性但是又保证不相关属性不变,如何找到这个平衡仍然是个待解决的问题。



图 2:人脸属性编辑方法演变


2 人脸属性识别的难点及解决方案

人脸属性识别最大的困难就在于样本的不充分和不均衡。


以年龄为例,大量存在的样本是某个人特定年龄的照片,但是包含同一个人不同年龄段的样本却非常少。此外,年龄还存在生理年龄与外貌年龄严重不匹配的问题,许多中国人的外貌年龄要远远小于生理年龄,而外国人则正相反。最后,在年龄数据集中,小孩和老人的数据量往往远少于中年人的数据量。


再以表情为例,大量的表情样本都是在非自然状态下获得,而在自然状态下获得的表情中,又以高兴和中性的表情为主,其他表情非常少,样本分布非常不均衡。


遇到这种情况时,如不作任何处理,不常见的样本会淹没在常见样本中,不常见样本中的特征得不到充分学习,导致训练出的模型在实际应用时效果不好。常用的解决方法有重采样和代价敏感学习,即给予不同类别样本不同的权重,构造新的损失函数。


除了通过损失函数的巧妙设计解决样本不均衡的问题外,还可以通过数据预处理对数据进行进一步扩充。Guenther et al. 提出了 Alignment-Free Facial Attribute Classification Technique (AFFACT)作为解决方案。


在训练阶段,人脸图片被旋转,缩放,裁剪,水平翻转,另外用高斯滤波器对部分图片进行模糊处理。在测试阶段,缩放的图片被截取成 10 张图,包括中间图,沿 4 个角截取的图,以及水平翻转后相应的 5 张图。最终模型预测结果是在 10 张图上预测结果的平均值。AFFACT 有效的提高了网络模型的性能。


另外,随着人脸属性编辑模型性能的不断提升,相信未来也会用这种方法人为创造出更多新的数据。甚至可能人脸属性分析与人脸属性编辑又再次合二为一,成为一个整体的模型,从不同的方向输入,对应不同的任务。


3 人脸属性识别的常用骨干网络

模型除了追求精度,随着移动端的需求越来越大,速度也是研发人员考虑的重要因素。于是轻量级的小网络孕育而生,经典的比如 MobileNet V1/V2/V3,ShuffleNet V1/V2 等。


3.1 ShuffleNet V2

先来看一下 ShuffleNet V2[2],这是旷视去年给出的模型。作者提到,对于速度,网络设计时不能仅仅考虑 FLOPs(floating-point operations per second,每秒浮点运算次数),由于不同设备的内存访问耗时是不同的,模型的并行度也是不同的,更少的 FLOPs 并不代表更快的速度。不同模型比较时,要直接比较在相同硬件下(比如一块 NVIDIA GeForce GTX 1080Ti GPU 或一块 Qualcomm Snapdragon 810 ARM 板)的运行时间,而不是 FLOPs。作者在网络设计时提出了新的概念“通道切分”(channel split),将输入分成 2 部分,最终给出的 ShuffleNet V2 的基础模块如图 3 所示:



图 3:ShuffleNet v2 基础模块。(a) ShuffleNet v2 with residual. (b) ShuffleNet v2 with SE (squeeze and excitation). © ShuffleNet v2 with SE and residual.


3.2 MobileNet V3

在最新的 MobileNet V3[3]中,谷歌的作者改进了模型的最后几层,在不损失精度的情况下提升了模型速度。



图 4:模型原来最后几层和改进后最后几层的对比


另外,作者提出了一种新的激活函数,可以有效的提升模型精度,



但是由于计算量过大,作者提出用下面的函数来近似,




图 5:swish 和 h-swish 对比


从图 5 可以看到,h-swish 对 swish 的近似效果还是很好的。


MobileNet V3 在各个公开数据库上均取得了很好的效果,请有兴趣的读者朋友们阅读原文。


4 人脸属性编辑模型

下面来看一个生成对抗网络。STGAN[4]指的是 Selective Transfer GAN,是由百度今年给出人脸属性编辑模型。原有的编辑模型很难处理高分辨率的情况,而如果想提高分辨率,便是以降低编辑效果为代价的。作者提出的 STGAN 在一定程度上解决了这些问题,实现了很好的编辑效果,如图 6 所示。



图 6:CelebA 数据集上人脸属性编辑结果不同模型间对比


Selective 指的是 1)模型只考虑要变化的属性,2)对于与要编辑属性无关的区域,选择性的拼接编码器特征和解码器特征。Transfer 指的是模型根据不同编辑任务,自适应地修改编码器特征。相比于用所有的目标属性标签作为输入,模型选择目标和源属性标签之间的差异作为编码器-解码器的输入,然后选择性转换单元(selective transfer units)自适应地选择和修改编码器特征,并进一步与解码器特征连接以达到同时增强属性编辑能力和提高图像质量的目的。


下面给出模型结构:



图 7:STGAN 整体结构。左侧是生成器。右上角是选择性转换单元结构。右下角展示了添加眼镜并减去张嘴的属性差异标签。


5 苏宁实际应用场景

目前,在已部署的场景中,苏宁的人脸属性模型还只涉及到估计。模型部署在全国 30 多家门店的颜值测评设备上,场景示例如图 8:



图 8:实际场景示例


模型可以输出 6 个属性,分别为性别、是否戴眼镜、年龄、颜值、表情和欢乐度。其中,表情有 7 种,包括生气、厌恶、恐惧、高兴、中性、悲伤、惊讶,而欢乐度是基于表情里高兴的概率。


苏宁人脸属性 Caffe 模型 3.9 兆,模型转换后部署到安卓开发板上,在 RK3399 芯片上 SDK 接口调用平均耗时不到 25 毫秒。


测试集由实际场景 7500 张图片组成,由于在 6 个属性里,只有性别和眼镜有明确真值,我们对比了一下这 2 个属性苏宁与其他 3 家知名人工智能公司的表现,结果见下表:



表 1:性别和眼镜识别准确率四公司对比


从上表可以看到,我们的眼镜识别的准确率是最高的,而性别识别准确率略低于其他 3 家公司,总体性能达到了业内一流水平。


下面来看模型的颜值性能,颜值分数位于图片下方:



图 9:苏宁模型颜值表现


从模型返回的颜值来看,分数似乎有些偏低了,尤其是某完全无名程序猿不应该仅仅比某著名演员高 2 分。


接下来看模型的欢乐度性能,欢乐度分数位于图片下方:



图 10:苏宁模型欢乐度表现


从左到右三张图,模型给出的欢乐度很好的反应了女神快乐程度的变化。


6 总结

现在我们的模型还有很多待改进的地方,比如还不能很好的区分普通眼镜和太阳镜;表情分类还不够准确;对小孩和老人的年龄预测也有很大的提升空间;模型对非正脸的适应性不是很好等等。这些都是我们未来改进的方向。


当然除了现有功能的改进,也会加入新的功能。检测表情微动作;结合关键点定位,可以做人脸美颜特效化妆;合成脸,如用男女朋友的脸合成未来孩子的脸等等有意思的产品。未来应用场景也不仅仅是颜值互动,比如可用于客户分析,进行精准广告投放等。


人脸属性作为计算机视觉的重要分支,相信未来一定会应用在越来越多的实际场景中。


作者简介

杨睿昕,苏宁科技人工智能实验室图像算法工程师,毕业于美国明尼苏达大学,应用数学硕士,现主要研究方向为人脸属性及人脸关键点相关算法。


何智翔,苏宁科技人工智能实验室 图像技术专家,毕业于清华大学 THOCR 实验室,师从国内著名人工智能专家 IEEE fellow 丁晓青教授,十余年来一直从事人脸相关算法的研究。现任苏宁科技人工智能实验室图像技术专家,主要研究方向为人脸属性的识别、商品的检测和识别。


专栏文章回顾

(一)一文看懂人脸识别技术发展脉络


(二)既要高精度也要高性能,人脸识别主流算法大合集


7 参考文献

[1]Zheng X , Guo Y , Huang H , et al. A Survey to Deep Facial Attribute Analysis[J]. 2018.


[2]Ma N , Zhang X , Zheng H T , et al. ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design[J]. 2018.


[3]Howard A , Sandler M , Chu G , et al. Searching for MobileNetV3[J]. 2019.


[4]Liu M , Ding Y , Xia M , et al. STGAN: A Unified Selective Transfer Network for Arbitrary Image Attribute Editing[J]. 2019.


2019 年 6 月 24 日 09:005827

评论 4 条评论

发布
用户头像
你好,想请教一下提及的“实际场景 7500 张图片”有开源出来吗?
2019 年 09 月 29 日 14:29
回复
抱歉数据集和模型都没有开源
2019 年 11 月 29 日 15:08
回复
用户头像
文虽然是好文,但是我怀疑你就是想说明你比吴彦祖帅。。。
2019 年 06 月 24 日 15:59
回复
总结的很到位,,哈哈,,,,你要是认识在北京的单身女孩儿可以介绍给我啊,,哈哈
2019 年 06 月 25 日 10:37
回复
没有更多了
发现更多内容

Mybatis学习笔记--延迟加载与缓存,深入分析解读MySQL锁,解决幻读问题

Java 程序员 后端

MyBatis官方文档-入门,java开发工程师技术栈

Java 程序员 后端

MyBatis实现一对一,一对多关联查询,java程序设计教程课后题

Java 程序员 后端

Kurento实战之五:媒体播放,mysql高级教程ppt

Java 程序员 后端

Mybatis入门篇之结果映射,你射准了吗?,java框架ssh和ssm百度

Java 程序员 后端

为什么一定要学习设计模式

Tom弹架构

Java 架构 设计模式

MyBatis初级实战之三:springboot集成druid,java实用教程第五版

Java 程序员 后端

MyBatis初级实战之二:增删改查,java项目开发实战入门光盘

Java 程序员 后端

Kafka消费组核心API与核心参数运行机制剖析,java银行面试题目及答案

Java 程序员 后端

Matlab数值微分与数值积分,linux环境高级编程

Java 程序员 后端

MyBatis07:使用注解开发,java教程视频我赢职场

Java 程序员 后端

mybatis学习一之入门示例,阿里+头条+腾讯等大厂Java面试题分享

Java 程序员 后端

Lua+OpenResty+nginx,java菜鸟教程集合

Java 程序员 后端

Mybatis学习笔记--Mybatis的概念与入门案例,java中高级面试题最新

Java 程序员 后端

Mysql 纵表转换为横表,靠着这份190页的面试资料

Java 程序员 后端

Linux安装JDK并配置环境变量 - 详细步骤,被腾讯辞退的高级Java工程师现在怎么了

Java 程序员 后端

Kafka的生产者原理及重要参数说明,大厂程序员35岁后的职业出路在哪

Java 程序员 后端

Kafka-探险---生产者源码分析---核心组件,2021年Java社招面试题精选

Java 程序员 后端

Kubernetes官方java客户端之四:内部应用,孙鑫java视频教程百度网盘

Java 程序员 后端

Kubernetes实战(一)-Kubernetes集群搭建,java注解扫描原理

Java 程序员 后端

linux中route命令超详细用法(十五万字),nginx实战基于luapdf

Java 程序员 后端

Maven虐我千百遍,我待Maven如初恋!(1),springcloud实战演练

Java 程序员 后端

Maven虐我千百遍,我待Maven如初恋!,mongodb教程

Java 程序员 后端

Mybatis学习笔记--自定义Mybatis,java数据结构面试题及答案

Java 程序员 后端

Kotlin(1)-lambda表达式和高阶函数操作符,java面试资料推荐

Java 程序员 后端

Linux怎么学?一张思维导图带你深入Linux核心原理,mybatis基础面试题

Java 程序员 后端

Mybatis学习笔记--多表查询,java入门基础代码

Java 程序员 后端

Mybatis源码分析二-如何优雅的使用主体日志,zookeeper集群实现原理

Java 程序员 后端

MyBatis的SQL执行流程不清楚?看完这一篇就够了!,kafka视频教程下载

Java 程序员 后端

MySQL InnoDB 事务隔离级别的实现原理,linux群集部署架构

Java 程序员 后端

Kubernetes官方java客户端之八:fluent style,java语言视频教学

Java 程序员 后端

数据cool谈(第2期)寻找下一代企业级数据库

数据cool谈(第2期)寻找下一代企业级数据库

新零售下的精准营销利器:人脸属性识别-InfoQ