本文根据闫云鹏于唯品会“唯享·技”分享会2018年6月9日上海场分享内容整理而成。
“唯享·技”是唯品会对外分享的平台。希望以此平台分享唯品会的技术研究案例与实践的结果,也能听到更多技术方向上的干货分享。
唯有分享可以让技术的脚步更快,享受技术钻研的乐趣,在此让我们听见技术流~
本文讲师
闫鹏云
任职于唯品研究院,十余年软件开发经验,曾供职于Adobe、Zillow等多家公司,在北京、旧金山等多地工作。
目录
1 唯品会AR系统介绍
2 为什么要做AR平台
3 深度学习在虚拟试戴AR平台的应用
4 深度学习在虚拟试妆AR平台的应用
唯品会AR系统介绍
AR即增强现实,对于唯品会而言主要是实现虚拟试妆虚拟试戴等,我们还有眼影和腮红的效果。虚拟试妆在2017年上线以来可以说取得了非常好的效果,不仅用户的下单率及下单金额明显上升,用户退单率也有明显的下降。但是随着AI系统不断发展,我们遇到了瓶颈。作为电商唯品会每天有不断的新商品上下架,怎么样让新商品利用我们AR平台为用户提供更好更快速的服务,这就是我今天想要跟大家交流的内容。
首先我会跟大家介绍唯品会的AR平台及其技术实现;第二点会谈到唯品会做AR平台的初衷;接下来会用两个深度学习的案例应用—虚拟试戴&虚拟试妆去做探讨。
虚拟试妆
首先跟大家介绍一下虚拟试妆,是2017年AR在唯品会首先上线的一款产品,当大家打开唯品会APP,选定你所喜欢的一款口红,然后选择虚拟试妆以后,就会真实地渲染口红在我们嘴唇上的效果,很明显用户可以通过这种形式,根据自己的肤色选定合适产品来降低退单率。
虚拟试戴
虚拟试戴跟虚拟试妆类似,不同之处在于它的商品换成了眼镜,用户可以根据脸型等特征选定喜欢的眼镜,手机上会真实地显示出光影等效果,促成用户购买,也可以降低用户退单率。
深度学习在虚拟试妆/试戴AR平台的应用
那么接下来我会跟大家简单介绍唯品会的AI系统是怎么设计的,我们技术上是怎么实现的?
虚拟试妆/试戴 pipeline
虚拟试妆和虚拟试戴,在唯品会是利用一个深度学习的多任务的卷积神经网络的回归模型实现,我们在GPU在后端进行训练,训练以后的模型是比较小的,经过压缩可以直接部署到手机端,再在手机端直接进行实时预测,可以把人脸的关键点信息取出来。通过这些关键点信息,我们可以比较好的做出一些应用,比如说腮红、口红等,对于眼镜来讲是根据3D模型,在手机端直接做出渲染效果,是有很多流水线的。接下来跟大家简单介绍我们虚拟试妆&试戴的技术流水线是怎么做的。
第一步需要做人脸检测,在2000年以后人脸检测的算法比较成熟了,我们用传统机器学习调用库,就可以得到比较好的轮廓效应,当然在APP上不会显示这个轮廓。人脸检测可以有效减少图像计算量。
第二步是对关键点进行检测,可以看到经过关键点检测的人脸,眉毛、眼睛、鼻子、嘴唇,都有了一些轮廓的点,这对于以后的计算是非常有帮助的,可以做出一些有趣的应用。关键点检测是唯品会根据现有研究成果和实践自研的多任务的回归的深度学习模型,直接部署在手机端就可以实时检测出人脸关键点。一般来讲检测越多准确度越好。最终我们要给用户呈现出真实的渲染效果,除了人脸信息,我们还需要另一拨信息——商品信息。那么商品信息是什么?对于口红来主要就是口红色系,例如RGB色值和渲染效果(珠光、哑光等),这样在3D渲染时可以呈现出更加真实的效果。对于眼镜,它就是更为复杂的一张图,眼镜的高宽、眼镜正面高宽和侧面高宽以及轴心位置、透明度、光泽、质量,都是有严格定义的要求。实际上可以看到这张眼镜图片,类似于人脸关键点,我们订好了具体的眼镜位置。
第三步我们做实时渲染时就可以一方面根据人脸算好的位置,另一方面根据我们眼镜这张2D图片的位置,然后进行渲染。
有了人脸和商品信息,第四步要做实时渲染,比如说在眼镜上会做一些效果及光影变化,让用户体验到更真实的这样的一个的感受。这就是我们现在的流水线。
眼镜更加复杂。图上是真实世界里并不存在一张图片。我们希望供应商拍摄更加清晰的几张图片,一张正面一张侧面,然后请ps人员结合不同的高宽和透明度要求等进行PS。实际上我们发现会有很大的问题。首先眼镜素材不像口红,后台人员几乎是没有能力进行维护的。第二点,商家在维护这个这张图片的时候,返工量和沟通成本也是很大的,第三点就是商品覆盖率随着时间的推进会有很大的问题,而唯品会作为一个电商每天有新商品上下架,那么对这些商品我们怎么样让它可以有实时的AR效果来提升销售数据,所以我们就需要改变人工处理的问题。这时需要一个更加彻底的智能的自动化解决方案。
我们在唯品会商品里发现,对于眼镜图有很多正面和侧面的商品图,可以通过人工PS成第三列的图片。但是对于第一列的正面图片,其实上在真实商品里眼镜腿位置是千变万化的,而且眼镜腿颜色和镜片颜色也是比较相近的,眼镜腿也是有很多交叉的,所以我们用传统方式抠图不是特别容易,可能对某一种图片能比较好地处理,但对于大量图片就很难做自动化处理,所以希望借用现在深度学习的一些方式,比如说是语义分割、实例分割等进行自动分割,如果做不到,我们也希望看看是否有半自动的方式去实现。对于口红这是一个比较典型的目标检测案例。目标检测目前广泛应用于各种场景。前几天我看到有科研人员用机器人对着苹果树定点喷射,这样可以减少农药喷洒量等。我们也希望可以用深度学习方法自动检测到口红位置进行自动取色。接下来我会跟大家详细介绍最终是怎么做的,也会提到一些失败的尝试。
眼镜抠图实现的Pipeline
对于眼镜抠图我们需要下载器,因为眼镜图片一般也是十几张二十几张,需要找到能拼接的正面和侧面两张图片,同时还需要图片分类器。我不知道大家对深度学习有没有一些了解,分类实际上是比较高级的语义任务,它不同于局部的梯度变化或边缘检测,而是要识别出某一类问题。比如说一个大象,它可能站在左边也可能站在右边,这两张图如果背景图不一样像素也是完全不一样的。但是最终我们的模型是能够通过学习检测出这样的分类。所以在此我会跟大家简单用两三张Slides介绍深度学习在图像的基本应用。目标检测、图片编辑分割的基础模型都是基于分类的基础模型。深度学习在图像里都是用卷积神经网络的。
卷积神经网络介绍
卷积神经网络在1989年就已经提出来了,也基本奠定了卷积神经网络结构,包含卷积核、非线性激活函数(比较复杂的问题都是非线性的),池化操作,把池度变小最终得到更高级的信息,然后通过反向传播训练卷积。基本特征是我们输入一张图片,点击学习到的卷积filter,然后再经非线性激活函数RELU转换,再经过池化层得到特征图,通过多层运算最终得到高级信息。
那么在1989年就提出了这个模型,为什么直到现在我们才开始流行深度学习?这中间到底发生了什么?实际上在1989年人工智能尤其深度学习在图像领域是火了几年的,但是到了2000年之后,随着SVM作为分类器表现更好,所以深度学习基本上只局限于学术界,直到近几年才发生了很大改变。到了2012年,AlexNet在ImageNet竞赛中前五个错误率大大地有性能上的提高。
AlexNet为什么会取得成功?我觉得是主要有三个原因:
第一点是硬件。由于NVIDIA长期布局并行计算,到了2012年他们的GPU可以在较短的时间内,因为深度学习需要大量参数且训练是非常耗时的,那么深度学习可以利用GPU能够快速训练出模型。
第二点,深度学习有大量参数,它容易过拟合,即在训练集上学得特别好,但是在测试集上的表现特别不好。大量的数据可以让他学得更好,缓解过拟合问题,所以当时ImageNet的百万级数据量竞赛可以说大大地推广了深度学习。
第三点就是算法这20年来的进步,比如说更深的卷积神经网络,比如说RELU激活函数,比如说一些防止过拟合的技术,很快工业界得到了认可。
最后跟大家介绍一些基础知识,怎么样理解深度神经网络,深度神经网络到底是怎么工作的。虽然说是这些人发明和试验了神经网络,但是对每一层到底是怎么工作的在2012年还是一个黑盒子。到2013年研究人员对卷积层每一层做了反卷积,形成了灰色的特征图,然后右边对应的是真实的图,即这张特征图对应其学习到的一张图,在最浅层他学到是线条边缘这些比较明显的局部特征。到第二层他开始学到边缘和边缘的连接特征。第三层他开始学习到纹理特征,比如网格特征,那么第四层他有了一个语义信息,比较高级的信息,比如说鸟腿、狗脸。第五层有了translation invariance,可以适应很多变化,比较好得能够做分类工作。我们现在很大程度上基于卷积神经网络,在图像上做各种分类、检测等。
我们看分类结果,最上面是眼镜正面的分类,中间是眼镜的侧面,第三排是其他分类,这些是不符合要求的图片,比如说中间这张图片它是俯着拍的,我们通过增加训练集设置一定阈值也能够比较好地测试出来。
我们需要做分类,但真正的难点是怎样进行分割。对一张图的分割用传统技术会比较简单,但是对多张图怎么样把图片正面的两个眼镜腿抠掉把色着上,对侧面把眼镜抠出来然后进行拼接,其实是有一定难度的。我们首先想到的是用自动分割。
自动分割这几年有语义分割、实例分割等技术,所以我们也做了一些尝试。什么是语义分割?在这张图片上我们可以把镜腿看成一个分类,其他我们可以看成另一个分类,而这两个镜腿不需要区分,因为他们本来就分开的,我们只知道它们是一类的就可以了,这个叫做语义分割。下排这张图我们需要把镜腿抠出来,这两个镜腿长的是非常像的,但是还是需要把镜腿一上一下分出来,所以可以定义镜腿是一类,其他是一类,那这两个镜腿要分开,这是实例分割。究竟为什么要区分语义分割和实例分割?因为在做分割时,语义分割一般情况下是有专用模型的,效果也是要好很多的,如果能用语义分割时就尽量语义分割。
我们一些失败的尝试:自动语义分割
来看看一些失败的尝试。我们希望自动做语义分割,用现在比较好的模型训练。目前比较好的语义分割是针对像素级的,即对于每个像素要训练出它的分类信息。图片中上面是一个网络图,它大体意思是首先是要经过一个卷积层得到一个高级信息,然后经过一个反卷积层逐渐放大,得到一个轮廓信息。我们发现在做完这类图片后,对个别图片比如说上面黑色眼镜的研究是做得比较好的,但是有很多图像我们做的不是很好。比如下排第一个眼镜我们就没有把边给拿掉,中间的眼镜其实它是有镜腿的但是我们没有找出来,第三个做得也很不好。为什么没有做成?我们事后分析主要原因如下:第一,深度学习需要大量标注,但我们标注资源有限;第二即使标注好了,我们也不可能做到完全自动分割,因为在做增强现实时我们对眼镜的图像质量要求是非常高的,几个像素点的变化都会让用户感觉到眼镜的质量很差,所以这种方式不可能达到完全自动化。当然今后如果能够做到半自动找到大体轮廓也是有帮助的,但是当时实验这一步至少目前还是不能做到。
我们一些失败的尝试:
深度学习图像增强和全自动抠图
我们还有一些失败尝试。首先我们希望做到全自动抠图,但图像质量也是非常差的,也无法实现大量图片全自动抠图。第二个是我们做了深度学习的图像增强,这也是近年来也是比较火的深度学习应用案例。第一张图片是一个模糊化的图片,第二张图片是原图,第三张是深度学习学出来以后还原的图片,它的效果还是非常好的,但是我们用在眼镜上可以看到下面这两张图质量非常差,第一张左边有一个明显的蓝条,而且中间部分放大来看像素也是非常差,右边图就更是惨不忍睹。为什么会出现这样的现象?首先在做这个训练时图片不是真实世界拍摄的图片,另外这张图片的模糊化是经过特定处理的,而我们这些处理都是自然拍摄的图片,所以不能完全浮现。第二点即使能比较好地来实现,但是要达到高清质量的图像仍然是不能落地的。所以这也是我们做过的失败尝试。
我们最终方案是深度学习的边缘检测加深度学习镜腿分割的关键点检测。
深度学习边缘检测
首先跟大家介绍深度学习的边缘检测。边缘检测在上个世纪30年代40年代就已经可以实现了,是非常古老的计算机学科。最左面这张图片是伯克利数据集的一张图片,这张图片是一个蜥蜴在一片叶子上,中间这张图片是人为标出的图片,第三张图片是通过边缘检测出来的图片,有什么不同呢?人类会很聪明,我们知道蜥蜴中间的花纹信息不是很重要,如果加入这些信息会给后面的计算量增加很多困难,所以不需要记录这些信息。但是传统算法是基于梯度、亮度、色差等变化,不可能有类似的高级特征,所以很难达到非常好的边缘检测效果。所以我们也认识到边缘检测它不是简单的局部问题,它是一个高级问题,是一个分类问题,甚至有一定的语义信息。这些年深度学习在边缘检测上也是有一些比较好的成果,在数据集上也是明显比以前传统算法要好一些。
我们看一下眼镜的深度学习边缘检测图片。最左上边是眼镜的一张原始图片,最右上面是边缘检测检测出的图片,可以看到一些比较有趣的特征。眼镜边框都是比较好的保留下来,但是眼镜腿和眼镜框的结合处在这个时候被打掉了。有这样的图片我们就能进行比较好的抠图和计算。下面五张图我们是用了多尺度模型,即它在不同卷积层卷积的效果,我们可以看到它在浅层时和灰度图比较类似,到了第二层它比较像边缘检测图,到第三层它好像有一定的语义特征,那么到了第四层特别是第五层时,语义特征是非常明显的,这时候它的边框和中间镜腿分开了,但是这时图像质量又不是很好,所以最终这个模型是采用这五张图的合成图,最终这张图也是学习得来的模型。最终利用深度学习边缘检测能够帮我们减少一定计算量并且实现目标。
最后再跟大家介绍一下边缘检测的网络图,其实刚才有提到网络图是有多尺度的,每一层都要输出一个output,机器学习有一个损失函数,我们都是五个不同输出的损失函数,再加上最终它们合成图片的损失函数训练得出。这就是我们用到的深度学习边缘检测。
镜腿关键点检测
除了正面我们还要把镜腿分割出来,镜腿分割采用的是关键点检测。关键点人工标注不是很明显,这里也是有一定技巧的。上图是一张well defined的图片,我们可以利用传统算法把它扭正放在中间,然后从X轴中间拉线,比如说是100、110、120,再在这些点上进行标注,这样就可以减少标注维度,让深度学习更容易学习出来这些特征。
最终我们采用的关键点检测方案比较类似人脸,但是人脸检测需要实时推断,而我们这个方案对速度要求显然没有那么高,所以更希望精度上做得更好。所以我们最后用的是Mask RCNN的关节点检测方法。Mask RCNN在2017年也是Facebook非常有名的成果,它实际上是用来就是做分割的,比如说自动驾驶等,但也可以用在关键点检测,只把一个点作为一个分类即可。它是基于两阶段的检测器。我们最终做这样一个分割,对每个类都会最后出这样一张图,每个分类都会出这样一个MASK的的分割图。
目标检测
说完了眼镜是怎么做的,最后我们再来看口红是怎么做的。口红是通过目标检测来实现的。目标检测即我们对图片进行标注,利用深度学习模型找出位置,最后通过计算得出RGB值。常见的目标检测有两种,第一种就是我们实验过的两阶段目标检测。第一步是把物体位置进行训练,对每个位置它会判断这是不是一个物体,它不关心是哪个分类,到第二阶段时它才关心哪个分类,比如说这个边框是个口红,然后那个边框它是嘴唇等,两阶段检测一般来讲准确率是比较好的比一阶段检测要好。一阶段检测我们也做过实验,直接把一个图化成很多网格,每个网格都做一个预测,最后进行训练。一般来讲一阶段检测的速度是要快很多,甚至可以用在手机上实时计算。两阶段则是在准确率和精确度比较好。因为我们是后台应用,所以最终采用的是两阶段检测器。当然近几年一阶段也有一些很好的成果。
整体分享的内容就差不多了,深度学习在唯品会AR平台的应用有分类、目标检测、边缘检测、关键点检测。
总体看来我们的AR平台有以下作用。首先它解决了商品素材维护难的问题。第二提升了效率,眼镜图片处理从熟练PS人员15分钟一张到现在的30秒一张。最后是明显提升了虚拟试戴的效果。
我今天就讲到这里,感谢大家。
推荐阅读
基于Kafka1.0消息可靠性设计之消费重试策略
灾难连锁之RedisCluster下线节点导致集群崩溃事件整理反思
VDL:唯品会强一致、高可用、高性能分布式日志存储介绍(产品篇)
“唯技术”一档专为唯品技术人发声的公众号
欢迎投稿!!
只要是技术相关的文章尽管砸过来!
领取专属 10元无门槛券
私享最新 技术干货