APP下载

深度学习在人脸妆容推荐系统中的应用研究

2020-01-07黄萍朱惠娟左志远

软件工程 2020年12期
关键词:深度学习

黄萍 朱惠娟 左志远

摘  要:本文设计了一款基于CNN、Alexnet等网络模型的妆容推荐系统,系统能根据脸部属性差异来推荐适宜的化妆方法,满足用户的个性化化妆需求。从技术实践的角度上来说,完成了从数据收集、模型训练到应用开发部署的开发流程。在工程实现上引入当今比较主流云架构方案,采用较为先进的架构,使得应用的性能和各方面的扩展延伸上都得到了增强。

关键词:妆容推荐;深度学习;人脸特征提取

中图分类号:TP39     文献标识码:A

Abstract: This paper proposes a makeup recommendation system based on network models such as CNN (Cable News Network), Alexnet, etc. The system recommends suitable makeup methods based on differences in facial attributes to meet users' personalized makeup needs. From the perspective of technical practice, development process including data collection, model training to application development and deployment is completed. The introduction of cloud architecture solutions makes the proposed system more powerful in application performance and extension of all aspects.

Keywords: makeup recommendation; deep learning; facial feature extraction

1   引言(Introduction)

在这样的一个创新融合的时期,移动互联网的高歌猛进,让女性对于美丽的追求越来越高,也从线下追到线上,化妆人群也更加趋向年轻化,越来越多的年轻女生也开始通过互联网获取化妆相关的知识[1]。但是目前绝大多数试妆应用也仅仅是利用妆容迁移,把各类不同的化妆产品或者妆容模板,利用技术迁移到用户的脸上,无法给客户提供合适自己的妆容。合适的妆容应根据用户的面容特点来推荐且应该附上对应的化妆方法。

本文研究的系统主要是利用深度学习相关技术来分析用户的脸部特点,再配合相关美妆知识个性化的推荐给用户。相对于目前市面上统一的妆容模板,本文尝试开发的产品更加具有灵活性和轻便型。同时本文产品主要针对年轻人群,随着经济的基础不断发展,化妆人群年轻化,对于初学化妆的人群来说,定制化的个性推荐对于对化妆知识了解不多的她们来说尤为重要。

2  妆容推荐系统设计(Makeup recommendation system design)

2.1   系统开发流程

本文主要研究和开发女性妆容推荐系统的方法。经过阅读了大量的化妆方法資料和文献,结合实际给出了根据人脸五官和脸型特征提供对应的化妆方法的妆容推荐系统开发流程。系统的功能流程如图1所示。

系统采用了dlib人脸特征点检测的相关功能,将从CelebA数据集中采集来的图像数据进行人脸五官特征信息的分割,再将特征点信息和CelebA属性整理形成CSV文件用作网络训练的训练集和测试集,分别采用不同类型的神经网络模型(BP网络、CNN网络和Alexnet)学习人脸的五官特征,最终根据已有的数据集将神经网络调参至最佳效果,并保存相关模型放入到网络环境中去使用。

2.2   系统工程实现

系统工程主要实现神经网络在生产环境中应用,利用相关工程技术,如Nginx、Docker、Tensorflow Serving、Kubernetes、React等,制作高效可运行的交互软件。

用户利用浏览器上传图片之后会转码成base64传递到服务端,服务端的入口是Ingress中间件,它会将Http的请求发送到后端的均衡负载器中,负载器会根据目前各个节点的资源剩余状态将请求发送到具体的计算节点中去,在具体计算节点中会利用进行预处理和模型判断的工作最终要结果返回Ingress组成一个完整的Http响应包,返回到用户的浏览器客户端,客户端会根据模型计算的组合结果再根据预存的美妆推荐规则反馈成相应的内容显示出来。

在计算节点内部,当接收到一个带有Base64的载荷字符时会进行不同的预处理操作,如针对脸型判断会先分析出人脸的关键点再把轮廓的部分的关键点坐标进行相关整合传入训练好的网络模型中去,最终会把各个模型计算的结果整合成一个对象结果传递出去。

2.3   开发环境和平台介绍

本文所研究的系统主要都在一台装在Deepin 15.11的小米笔记本上进行开发。主要利用的工具有如下:

(1)Conda 4.8可以快速切换python版本环境,利用高效的包管理工具,便捷的管理一些深度学习相关的模块包[2]。

(2)Pycharm是一款业界优秀的python开发ide,有非常多的实用的功能。

(3)Kears是一款神经网络库,相比较TensorFlow,Kears提供了很多基础的算法模型和简洁的Api,新手非常容易就可以上手。

(4)dlib是一款十分优秀的集成多种人脸识别的机器学习库,文档丰富社区活跃,本文使用的人脸定位就是依赖dlib的人脸68位检测分类器。

3  数据采集和预处理工作(Data acquisition and preprocessing)

3.1   数据采集、分离属性和标记工作

本文实验所使用的数据来自香港中文大学开放提供的名人人脸属性数据集CelebA,它是一个大型的面部属性的数据集,其中超过二十多万的名人人脸图像,每个人脸图像有超过40个的特征属性。该数据集中的图像涵盖了较大的人脸特征范围,比较齐全。该数据集可用于人脸属性标识训练、人脸检测训练以及landmark标记等。本文从其中的40个面部属性主要提取以下几个属性:Pale_Skin(较白的肤色)、Chubby(圆胖的)、Pointy_Nose(尖鼻子)等属性。由于CelebA给出的特征集是较为繁杂的,但是往往只需要单独几个属性拿出来做训练,因此需要先将属性和图片信息一起提取出来,将对应的属性提取出来。采用了dlib人脸特征点检测的相关功能,分割出人脸五官的特征信息。且将特征点信息和Celeba属性整理好CSV文件用作训练网络的训练集和测试集。

3.2   数据预处理和特征提取

(1)脸型特征

首先根据dlib官方开源出来的shape_predictor_68_face_landmarks模型获取数据集中每张图片的人脸特征点信息,如图2所示。针对人脸的脸型,本文利用计算0—16位特征点之间的欧式距离,获取了两个特征变量,加上CelebA中对应属性中的Chubby二进制数据,组成对应的训练集数据存储成对应的csv文件。首位0和1就是人脸胖瘦趋向标志,后面八位则是人脸16个对称点之间的8个欧式距离,如下所示:

0,94,92,89,85,75,61,42,22

0,88,85,81,77,70,58,41,21

1,89,89,88,85,78,65,46,24

0,84,83,81,78,70,56,40,21

(2)肤色特征

针对肤色检测,本文首先利用常见基于YCrCb颜色空间Cr、Cb范围筛选法先滤出人脸照片中的皮肤部分,将图片的RGB颜色空间映射到YCrCb颜色空间上时,在crcb的二维空间上这些皮肤像素点分布近似一个椭圆,因此这里只需要判断像素点是否在椭圆范围内,就可知道是否是肤色点像素。本文将在肤色范围内的像素值整理成一个一维数组,同时本文也从Celeba数据集的属性中提取Pale_Skin(苍白的皮肤)和Rosy_Cheeks(红润的脸颊)整合成为训练数据,如图3所示。

(3)鼻子特征

针对鼻子部分的特征提取,由于没有较好的明显特征可以提取,所以这里只需要截取鼻子周围的图片即可,降低脸部其他特征对于结果的影响,具体的鼻子特征将交由Alexnet网络去提取隐含的高级特征。首先会根据dlib脸部分类器获取到鼻子附近的关键点寻如图(todo),找到最小的X和最大的Y点和最小的Y点。生成(Xmin,Y1)(Xmax,Y2)(Xmin,Ymin)(Xmax,Ymin)四个坐标点,并进行裁剪和统一缩放,如图4所示。

4  神经网络模型人脸特征分类(Face feature classification in neural network model)

随着深度学习的不断发展,神经网絡层数的不断加深和复杂,服务器性能的不断提升,人们对于人脸的特征研究早已经走出了刀耕火种的时代,可以通过非常成熟的模型做到如人脸识别、脸部特征点定位和脸部属性分析等。这些成熟的网络模型为本文的研究打下了坚硬的技术基础,本文将运用这些模型打造更加贴近美妆用户的系统。

针对人脸五官的特征,本文设置了不同的神经网络模型来学习对应的五官特征,用全连接前馈网络训练人脸的脸型特征,用卷积神经网络训练肤色特色,用Alexnet网络训练鼻子特征,并根据已有的数据集将神经网络调参至最佳效果,并将训练好的模型放入到生成环境中去使用。

4.1   基于全连接前馈网络脸型特征分类训练

针对脸型数据的训练,本文采用了全连接前馈网络(BP神经网络)模型。它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小[3]。人脸的胖瘦,从主观角度的来说是通过脸宽和脸宽的下降速度来判定的,而BP神经网络数学理论已证明它具有实现任何复杂非线性映射的功。实验结果也验证了BP神经网络可以学习到八个欧氏距离样本量和胖瘦分类之间的权重抉择。

因为人脸胖瘦是一个二进制量,是一个典型的二分类的线性回归问题,所以本文选择了Sigmoid函数作为激活函数,采用了二值交叉熵作为损失函数。Sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),可以将一个实数映射到(0,1)的区间,用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。

如图5所示,本文设计了一个三层的神经网络,由一层输入层、一层隐藏层、一层输出层组成。在训练时本文选取了10000个训练样本,经过调参优化超参数设定batchsize为100,训练100次,学习率设定为0.001可以快速达到最小损失。通过实验可以看到随着训练的组数越多,损失逐渐降低,预判的正确率的也逐步升高。

4.2   基于卷积神经网络肤色特征分类训练

卷积神经网络也是一种前馈神经网络,但是却又和普通的前馈全连接神经网络有很大的不同[4]。由于肤色和鼻子形状特征提取相对来说比较复杂,所以本文把肤色和鼻子形状的高阶特征提取交给卷积神网络来自动提取。针对肤色的训练,这里仅对肤色是否白嫩进行训练,本文设计了一个简单的CNN模型,将上部分预处理后的图片的像素值作为输入量,由于CelebaDataset中图片尺寸都已经固定好,这里不必要再做裁剪,将10000*218*218*3(图片样本数量*图片高度* 图片宽度*颜色通道数)作为CNN输入层的维度。

本文设计了如图6所示的CNN网络,由多层卷积、池化、全连接层组成,选用Relu作为激活函数,分类交叉熵作为损失函数。

肤色的训练会受到过多其他因素的影响,如光线和种族本身肤色都会对结果产生影响。

4.3   基于Alexnet网络鼻子特征分类训练

Alexnet是一种较为高效的CNN网络,对推动神经网络的发展起到了重要的作用,其作者加拿大多伦多大学的AlexKrizhevsky等人凭借Alexnet网络在2012年的ImageNet比赛中获得冠军。Alexnet与普通的CNN的最大的不同地方就在于它的网络构造上,进一步加深了网络的深度,增加了网络模型获取高级特征的能力[5]。

本文采用的AlexNet有五个卷积层,其中三个卷积层后面连接了最大池化层,最后还有三个全连接层,如图7所示。本文采用Alexnet作为训练鼻子形状的模型,将裁剪后的鼻子作为的像素矩阵作为输入层进行训练。

5 推荐系统工程实现(Recommend system engineering implementation)

模型的训练已经完成,但是在数据科学领域中将模型部署到生成环境且能够提供高效和交互良好的工程也是一项很有挑战性的课题。因为是否能够让模型更好的面向消费者也是评价模型的重要指标。本文针对推荐系统的工程实现,搭建了一个B/S架构的交互软件,能够让用户上传人脸状态并且反馈给用户合适的妆容议。

5.1   服务端的部署

服务端的主要实现的是利用模型和神经网络平台来进行特征分类,并提供有效接口。本文的模型是利用kears框架来实现训练,kears能够以Tensorflow、CNTK或者Theano作为后端运行。这里依旧采用默认后端来支撑网络运行计算作出预算结果。同时利用Flask作为http服务器,它可以帮助开发响应请求的RESTFUL API。采用RESTFUL式的API接口可以更好地分离服务端和客户端,提高客户端的敏捷性,其无状态的特点也提高服务的可见性,可靠性和可缓存性,同时也可以提高服务端和客户端的可扩展性[6]。

为了进一步实现应用的快速部署和扩展性,采用了Docker制作HTTP服务的镜像。Docker主要利用Linux中的cgroups来限制进程的资源使用率,chroot来限制进程可访问文件的权限,以及Linux核心命名空间(namespace)来分类网络和权限的划分,以此来达到一个快速稳定可以迭代的虚拟化环境[7]。为了让服务端程序具有自动化部署,大规模可伸缩的特性,还需要在Docker镜像之上,将应用部署到Kubernetes中去。Kubernetes是一个开源的容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。所以在完成一个应用程序的开发时,需要冗余部署该应用的多个实例,同时需要支持对应用的请求进行负载均衡,在Kubernetes中,因为采用备灾的原则,同一应用会在不同的服务器上创建多个容器实例,每个容器实例不仅仅在别的实例宕机时备用,利用Kubernetes自带的负载均衡器或者自己设计的均衡负载可以让各个实例分担外部流量。

(1)RESTFUL服务搭建

在Flask引用中系统只需要提供一个统一接口,可以接受图像文件,并返回相关预测标签,将相关的标签和化妆推荐规则映射放到客户端来做。本文定义了"/face"这个接口来做统一接口文件,预处理图片并调用模型进行预测,返回一个标准JSON结构体。如下:

{

"code":0,

"data":{

"nose":1,//是否高挺鼻子

"skin":50,// 肤色检测均值

"face_shape":40 //脸型胖瘦均值

}

}

(2)封装Docker镜像

为了进一步实现应用的快速部署和扩展性,可以选择采用了Docker制作HTTP服务的镜像。在制作镜像中选择采用Centos的作为基础镜像,添加python环境支持,利用python requirement。txt描述好所需要的包,利用CMD指令安装好依赖包并启动程序,对外开放80端口。

(3)部署进入Kubernetes内

为了让服务端程序具有自动化部署,大规模可伸缩的特性。因此需要在Docker镜像之上,将应用部署到Kubernetes中去。Kubernetes集群中主要使用Kubernetes Service作为负载均衡的控制器,根据访问的流量来控制运行的Pod数量和分散请求流量,而Pod自动化部署和自愈性又进一步增强了系统的问题性[8]。最后通过Ingress作为Kubernetes集群的入口对外提供访问服务。

5.2   客户端的实现

(1)技术选型介绍

客户端主要实现图片上传和信息反馈的功能,这里主要采用React和Antd 组件库来完成快速开发。React是FaceBook推出的一款基于VirtualDom的前端框架。程序员只需要去操作VirtualDom的结构,框架会根据性能和显示优先级自动使用DomAPi更新页面图示。且React还是一款基于组件化的前端框架,因此可以不断复用相同的组件,Antd就是提供了一些通用的前端组件,极大地减少了开发者的开发工作量。Antd是服务于企业级产品的设计体系,基于确定和自然的設计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

(2)客户端操作方法

客户端的使用非常简单,由于是采用B/S架构,用户只需使用浏览器访问对应的页面即可。点击上传按钮选择本机已经拍摄好的素颜照片确定即可,图片会传递到集群服务器中进行分析并返回对应的结果,在前端显示。显示结果会以弹窗的形式进行展示,如图8所示。

猜你喜欢

深度学习
从合坐走向合学:浅议新学习模式的构建
基于自动智能分类器的图书馆乱架图书检测
搭建深度学习的三级阶梯
有体验的学习才是有意义的学习
电子商务中基于深度学习的虚假交易识别研究
利用网络技术促进学生深度学习的几大策略
MOOC与翻转课堂融合的深度学习场域建构
大数据技术在反恐怖主义中的应用展望
深度学习算法应用于岩石图像处理的可行性研究
构建“单元整合、主题牵引”诗歌鉴赏“深度学习”课堂的策略