编者按:辛弃疾在《青玉案.元夕》中曾这样写道,“众里寻她千百度,蓦然回首,那人却在,灯火阑珊处。”
其实在视觉理解领域,这半阙词,描绘的即是,在熙熙攘攘的视觉世界中,通过剥离场景,只关注所关心的那个她的过程 。
如果能够更好地对“她”进行表示,将直接影响到相关视觉任务的性能。因此,对人物的特征表示,成为了计算机视觉领域一个长期的研究方向。
今天,来自加州大学伯克利分校的刘子纬博士,将从开放环境下的人物特征表示出发, 带着你,在熙熙攘攘的视觉世界中,“众里寻她”。
文末,大讲堂特别提供文中提到所有文章以及代码的下载链接。
本文整理自Valse Webinar 2018-01-17期报告。
为什么要做以人为中心的视觉计算?在精彩的数据世界中,90%的图像视频数据都是与人相关的。例如,对于上图,我们第一点会关注的就是她是谁、有怎样的喜怒哀乐,也就是对人脸属性的理解。
第二点,会关注她的衣着打扮和服饰风格,这是对全身的理解;
第三点,我们开始尝试理解她和环境的关系,也就是所谓的场景理解。
最后,我们好奇的是她将要去哪里,下一个动作是什么,也就是运动关系理解。接下来将从以上四个方面来逐步讲述我对Human-centric Visual Representation的研究。
Part I: Deep Face Understanding
首先介绍对人脸的理解,这部分内容基于以下工作:
“Deep Learning Face Attributes in the Wild”,ICCV 2015.
人脸除了具备身份特征之外,还包含肤色、形状、部件等丰富的中层语义层面的视觉属性特征。预测一张图片中人脸的属性(比如拱形眉毛、大眼睛、衰退的发际线、有无胡须等),其实是一个很难的问题,尽管在这里属性都是指二分类问题。
传统方法常采用HOG在人脸关键点处提取信息,然后训练一个SVM分类器来得到最终结果。它会有很多错误结果,分析其中原因:第一,真实条件下的人脸存在较大的姿态及尺度变化,因此基于关键点的方法不一定奏效;第二,属性空间是非常大的,线性分类器SVM不足以解决这个问题。
因此属性特征空间问题是我们的一个motivation。所谓的single detector是指将所有人脸放在同一个空间下,其空间变化非常大,需要捕捉的信息过多,所以很难学习到一个比较好的检测器。因此,人们就想到了multi-view detector,将人脸分为正面人脸和其他朝向的人脸,在每个子空间里只解决一个子问题,使每一个子问题变得简单,并改善了single detector。这里我们提出用人脸属性分割各个子空间,比如具有“金发”、“微笑”属性的人脸构成第一个子空间,这个子空间比正面人脸子空间更加紧致,所以可以学习到更加紧致的模型来刻画子空间。
为了研究这个问题,我们收集了一个较大规模的人脸数据集CelebA,它包含20万张人脸数据,涵盖了40个人脸属性,1万个体。每张人脸图像有bounding box和五个关键点的标注。
以上是我们的pipeline,整个网络分为两个部分,第一部分做定位,第二部分做属性预测,都只用了image-level的属性标注信息。首先通过Face Localization Nets定位图片中的人脸,利用人脸属性训练深度神经网络,其卷积层的响应信息其实是可以表示出人脸位置的,结果还是出人意料的精确。之后再通过训练一个Attribute Prediction Net来得到细粒属性。
如何做定位呢?首先验证为什么人脸属性信息可以做定位,我们用直方图统计了训练好的卷积神经网络在人脸图像和背景图像上的响应,可以看出人脸和背景有明显的分界。从右图可以得知,使用愈加丰富的人脸属性信息可以得到愈加精确的定位。
随着人脸属性数目逐步增多,神经网络越来越向人脸集中注意力。
进一步做了一些定量化的研究。第一,我们发现LNet在CelebA数据集上的人脸定位结果优于传统方法。
第二,研究了网络的泛化能力。使用网络陌生的MobileFace用户数据集测试,它依然可以找到人脸。
以上是第一个模块——人脸定位。
以下是第二个模块——细粒度分类。我们发现如果用人脸身份信息做预训练,网络已经能够挖掘很多人脸属性语义信息,也就是说神经网络本身做了分解,不断找到训练集图片的heat map。如图(a.1)(a.2)...(a.6)代表神经元,比较靠左的是它高响应的平均图,靠右的是低响应的平均图。
随着训练迭代次数的增多,神经元慢慢发现了种族信息,它的高响应结果是“亚洲人”、低响应结果是“欧洲人”。
如果在预训练好的网络上用人脸属性fine-tune,结果它的activation比较稀疏,但是每一个响应的神经元代表了某一种细粒度属性。
如图,通过属性信息fine-tune可以发现“厚嘴唇”这一特征。
我们的属性分类在CelebA 和 LFWA上都取得了比较好的结果,而且其运行速度也是比较快的。
通过观察网络在未知的30个人脸上的属性预测表现,测试了属性预测的泛化能力,可以看到相对于其他方法有一定优势。
以上和大家分享的是人脸方向的一些工作,主要分为两个方面,首先,人脸属性可以做人脸预测,不需要bounding box标注;其次,用身份信息做预训练其实可以把人脸空间做一定的分解,能够发现很多属性信息。
Part Ⅱ:Deep Fashion Understanding
接下来跟大家分享在服装理解方面的工作,主要基于以下两个工作展开:
"DeepFashion:Powering Robust Clothes Recognition and Retrieval with Rich Annotations",CVPR 2016
"Fashion Landmark Detection in the Wild",ECCV 2016
服饰理解比人脸理解的难度大很多。人脸是近似刚体的,可以很好地对齐,而且整个变化可以转化为表面变化。但是衣服是柔性物质,常面临遮挡以及形变,且在不同场景下变化较大。
但是我们依然遵循计算机视觉社区二十多年的经验,来进行视觉上的服饰理解。首先,可以利用faster-RCNN或者SSD等算法,训练一个服装检测器,然后我们提出服装对齐的方法,服装确实具备一些关键点,可以从关键点处提取其局部本征信息。
得到关键点信息之后,可以做识别任务,尽管不同场景下衣服形态发生了很大变化,但对于一些本征的局部特征具备一定的不变性。
为了研究这个问题,我们依然收集了一个大规模的数据库Deep Fashion,它包含4万套不同款式衣服的80万张图片,涵盖50个种类,1000个属性,并有bounding box以及八个关键点的标注信息。
第一步检测是较容易的,可以使用一些通用检测器。比较困难的是对齐,首先定义一组衣服的关键点,比如领口、袖口、腰身、下摆等位置,但是服饰的关键点和人体关键点还是有很多差异。比如(a.1)中蓝色的是人体关键点,而(a.2)中绿色的是衣服的关键点。(a.3)中衣服并没有穿在人身上,所以无法依据人体关键点来检测衣服关键点,而(a.4),在自拍状态下很多关键点被遮挡,一些姿态检测器不能起作用。因此,服饰关键点检测比人体关键点检测更可靠。
这里进一步说明服饰关键点检测比人脸关键点检测更加困难。从两个角度来看,其一从几何角度看,图(b)中,服饰关键点的分布比人体关键点的分布更加广泛;其二从外观角度来看,人体关键点比服饰关键点有更明显的边界信息。
我们设计了如图算法流程,通过级联的神经网络做对齐,每一个阶段都是一个回归问题,也就是给一张图片,通过一个基网络(比如VGG16),经过几个全连接层回归其坐标,比如有8个关键点就回归16个坐标(x,y)。第二个阶段通过学第一个阶段的增量来优化其结果,但是,衣服的变化是很大的,如果仅仅直接做深度回归学习的话,对于一些中等难度或难度较大的样本效果是不好的。
因此,我们提出在regression label之外添加pseudo label,在训练集空间中做聚类,比如第一阶段除了回归坐标之外,还预测它属于哪一类,回归类别的过程帮助网络预测样本的难易程度,其实隐含地做了难例挖掘,对于比较困难的样本,它会用网络中学到的权重来专门处理。
可以看出对于不同难度的姿态和不同程度的放大,我们的方法都能表现得比较好,但仅仅基于回归或者仅仅基于图模型推理的方法表现都不佳。
以上我们讲述了如何做服饰关键点检测, 那么我们为什么要做呢?其实服饰关键点提供了一个非常有效的表达,(a)图是服饰属性预测的结果,(b)图是用服饰做检索的结果,我们发现当用服饰关键点时,它的效果要优于用人体关键点、bounding box、全图来检索。因此,尽管服饰关键点检测是一个具有挑战性的问题,但是它是非常有意义的。
这是我们的一些结果,可以看出红色的预测结果非常接近绿色的groundtruth。
对齐完成后,可以进行我们真正感兴趣的地方——服饰识别。这个问题有很大的商业价值,但是在学术上还没有清晰的定义,其识别目的究竟是同一款式的还是同一风格的服饰,所以我们需要去平衡这两点。
我们设计了Fashion Net,它同时利用多个损失做多任务学习,通过关键点定位得到局部特征,然后将局部特征和全局特征融合起来同时做身份预测和属性预测。
这是简化的流程,当网络前向传播时,根据关键点信息(蓝色)得到局部特征(绿色),然后和全局特征(橙色)融合,最后利用融合好的特征预测属性类别,同时会用triplet loss预测它的款式类别。
但是上述三个部分的损失都不容易设计,都不能直接用现有简单的损失函数(比如cross entropy、softmax loss)解决,因为服饰的类别和属性数量都是非常大的,一般的损失函数很难转换,所以我们首先对属性做了一个直方图统计,如图,它是一个长尾型的分布,而且对于在线图片而言,具有较多噪声,因此我们提出了Multi-label ranking loss,ranking loss的本质精神只关心正确的比错误的分高,而并不关心真正能够分对的标签是什么,它对噪声非常鲁棒,而且某种意义上能够解决数据不平衡问题。
对于类别数量较多的情况,也不能用softmax,一个很简单的方法就是用triplet,但在做triplet的时候我们需要去融合样本中的正样本对和负样本对。对于负样本对,需要用Hard Negative Mining方法挖掘比较难的负样本对。
我们测试了神经网络在两种情况下的性能,首先是In-shop Clothes Retrieval,即对于一张给定图片,搜索店里相似的图片。这是对电商很有吸引力的一项功能,可以看出现有方法都能取得比较好的性能,top10的准确率都在50%以上,基本都能正确检索。
但是consumer-to-shop(从街拍到电商图片)服饰检索是一个更难的问题,目前方法能达到的检索正确率仅仅是20%左右,所以这种跨模型问题应该是今后的研究方向。如何解决两个模态之间的鸿沟,同时学到一个公共空间将它们投影,还是一个非常困难但是很有意义的问题。
当我们解决上述两个问题后,系统就可以衍生出非常多的应用,可以检索相同风格的衣服,也可以搜索电影视频或照片中服装的同款,甚至做一些服饰搭配。
总体来看服饰理解任务,首先定义服饰关键点,然后通过级联模型找到关键点,通过伪标签解决一些难例样本,最后通过多任务学习来融合异构、异质的监督信息,获得最终比较好的表示。
Part Ⅲ:Deep Scene Understanding
在人脸和服饰理解的基础之上,我们进一步解析人和环境之间的关系,即场景理解,以下基于这两个工作展开:
“Semantic Image Segmentation via Deep Parsing Network”,ICCV 2015(oral)
"Not ALL Pixels Are Equal:Difficulty-aware Semantic Segmentation via Deep Layer Cascade",CVPR 2017(spotlight)
给定一张图片,我们应该如何解析它的每一个像素,解析出来后将其用于high-level的图像理解、或者low-level的图像编辑。
这也是所谓的语义分割,这方面已有很多工作,比如SVM或者SVM和MRF(Markov Random Field)概率图模型的结合,以及当前流行的CNN,2015年我们提出了一个问题:如何把CNN和MRF结合起来?
首先调研了当时最好的方法,第一个方法是全卷积网络,它可以很好地学习特征,但是缺少成对的联系,因此像素之间是相互独立的。
后来DeepLab出世,它在FCN之后接上了Dense CRF做后处理,解决了pairwise relation的问题。它的问题在于不能端到端地训练,而且后处理需要十次迭代,时间代价较高。
当时同时还有一个工作叫“CRF as RNN”,它相对于DeepLab能够进行端到端地训练,但是依旧需要迭代十次。
这里我们提出用Deep Parsing Network来解决问题,能够获得同样的三个优点,但是只需要一次迭代。
这里的贡献主要有三点:
将更丰富的结构信息和关系信息融入MRF;
把high-order MRF用mean field解法融合进CNN;
整体网络可以联合训练并且只需要一次迭代。
这里重点讲我们设计的两个比较特殊的公式。首先是triple penalty,一般只考虑i,j两点,它们相似那么其标签就一致,这里我们还考虑z1...zn这个邻域,好处是当i,j不确定时,可以参考z邻域的信息来得到更精确的估计。这里对于i,j和z的联合计算可以很好地模拟图像中广泛存在的长程一致性。
第二个是mixture of label contexts,普通的context仅仅是某一类物体出现的频率,而在此可以考虑两种物体联合的损失,这样可以构成更加丰富的空间对信息。
我们进一步把pairwise term用mean field solver解成一元组。
然后把一元项和成对项变成卷积和求和形式,然后就可以用我们现在一些标准的神经网络操作来解决该问题。其中,Pairi,j代表了不同类型的全局和局部滤波器。
这是我们的深度解析网络,unary term可以是很强的VGG或者ResNet,然后通过triple penalty和label context学到一个结果。
如图,我们发现unary term会漏掉图像中的部分目标,且边界较粗糙;通过triple penalty,判断两个标签的相似度来修正它的预测标签,可以将边缘变得较尖锐;然后通过label contexts判断这里很有可能是一个盆栽;最后通过整体三个部分一起做训练,来得到最终结果,非常接近groundtruth。
我们的方法当时在VOC2012上取得了最好的结果。
所以我们关心label contexts究竟能否学到所谓的结构化关系信息,颜色偏红表示否定,偏蓝表示肯定,普通的ResNet和VGG容易把摩托车和自行车这两种混淆,我们通过label contexts把二者区分开来;第二,我们看到一个favor,我们希望人和摩托车能够一起出现,这也是非常合理的,因为摩托车上一般会有人。
进一步去可视化它的卷积核,左图表示人在摩托车上,右图表示椅子一般在人下面。这样的空间信息也符合人直观的感受。
对于有图片中有反射的挑战性问题,我们的方法能够明显优于其他方法,原因就在于label context,而且joint tuning可以使得之后的网络修正之前的信息。
Input video
State-of-the-art Method (4 FPS)
Deep Layer Cascade (17 FPS)
如图,Deep Parsing Network速度其实很慢,尽管只有一次迭代,但是因为基网络用的是VGG和ResNet,因此对于这样一段街景视频,它只能做到每秒4帧,并不能够应用于实际场景中,因此我们这里提出了进一步优化的方法——Deep Layer Cascade,它可以做到每秒17帧,而且可以保证准确率几乎不降。
网络慢的原因是使用了非常深的全卷积网络,而且每一层都需要传导高分辨率的特征图。
我们的motivation非常简单,即没有必要对图像中的每一个像素都做深度处理,因为对于一些简单的和中等难度的区域,完全可以用浅层网络来解决,而对于比较难的区域才需要深度网络处理。
因此,我们把contempotary model变成Deep Layer Cascade,上面是一个做分类任务的网络ResNet,下面是把ResNet变成一个做分割任务的网络,每一个卷积层都需要给它一个比较大的特征图。
将它变成layer cascade形式,当ResNet过了三个block之后,就输出简单区域的结果,而简单区域大约占据了图像60%~80%的比例,这部分就不用输入更深层的网络;再经过两层得到中等难度区域结果;最后经过深度网络所有层得到难区域的结果。对于全图而言,它节省了大量时间成本。
区别于传统对全图做卷积的方式,这里采用区域卷积思想,只对选择出的区域做卷积,然后在残差网络中放入区域卷积,对某一区域做卷积后将其加到原先的特征图上,之后的网络就可以只处理比较难的区域。
这是我们算法的表现,尽管较简单的区域没有经过神经网络,但是并不影响最终的识别结果,这是因为网络其实学会了注意力机制,它可以学会关注难区域,所以网络之后的层并不需要处理所有的区域,只需要处理难区域,神经网络反而会表现得更好,而且其速度要明显优于其他方法。
这是对每一阶段的可视化结果。我们看到从第一阶段到第三阶段,网络逐步从认识较容易的背景区域到较难的关键物体区域,越来越接近groundtruth。
Input video
Stage-1
Stage-2
Stage-3
对于街景视频,我们看到deep layer cascade在第一阶段学到的是路、天空,而在第二阶段开始它可以学到一些比较大的树和交通路牌,第三阶段能够学到行人、电线杆这种比较精细化的目标。由此可见,这个网络可以预测不同难度的样本。
在场景理解这部分,我们从精度和速度两个方面进行了求解和优化,提出了layer cascade这种“分而治之”的思想,对不同难度的区域用不同方式处理。
Part Ⅳ:Deep Motion Understanding
在对人脸、服饰、场景进行理解的基础上,我们希望理解图像中目标的运动,譬如人往哪里走。以下介绍基于工作:
"Video Frame Synthesis using Deep Voxel Flow",ICCV 2017(oral)
这里我们比较感兴趣的是如何生成视频帧,它有两个实际的应用,第一个是预测,第二个是插值,比如,如图第一帧和第三帧已知,我们要求第二帧。或者将低帧率的视频变成高帧率的,以及做视频压缩。这个问题是非常基础且有意义的,但也是非常困难的。
如图,视频合成任务面临两个主要的挑战。其一,运动是非常复杂的,一个是摄像机的移动,另一个是拍摄主体的移动,所以一般基于运动模型或者光流的方法不太适合解该问题;其二,生成高分辨率的图片,是现在基于对抗神经网络方法所不能达到的。
这里我们提出了基于体素流(是一个双向流)的方法,与其生成中间所求这一帧每个像素的值,不如学习可以从哪里复制过来这个值。
然后需要一个选择掩膜,视频中常常会存在遮挡,因此需要去选择从第几帧取像素。
最后,为了让任务可学(可微),我们提出了双线性采样方式,从局部区域采样一些体素来重建这一帧。
这里最核心的一个模块就是deep voxel flow(深度体素流),它是一个可微的时空采样,它可以前向或反向传导,并能够从间隔帧中学习。
如图是具体神经网络结构,它结合了基于光流的方法和基于神经网络的方法,所以紫色框标注的是完全由无监督学习学出来的,仅仅通过重构的损失函数来学习。
为了解决大运动问题,我们提出了多尺度深度体素流法。从小尺度学习开始,不断把小尺度的信息融合到大尺度上去,因为大的运动在小尺度上会变小,所以这样的pipeline有助于解决这个问题。
如图,是从2D flow+ mask到多尺度体素流方法的演变及其效果,可以看到学到的motion field和selection mask是非常匹配的。
这里是一些ablation study,从定量上看,我们的方法也比较好。
如图是针对UCF-101体育数据集的一些结果,所有帧都是网络生成出来的。
此外针对驾驶数据集做了测试,驾驶数据集的难度在于前后帧的跳跃较大,因为速度比较快,可以看出我们的方法依然可以比较平稳地找到中间帧。
另一个比较有意思的地方是,尽管这个网络学到的是重构这一帧,但是它学到的特征依然可以用于high-level的视觉任务,比如这里无监督的光流表现的不错,而且神经网络学习到的权重也可以被应用到行为识别中去,这与learning-by-prediction思想类似,通过预测或插值中间帧和下一帧,学到比较有效的视频表示。
除了在空间上一致之外,它还在时间空间上也是比较连续的,(b)图是沿着视频的时间轴和x轴进行的切片,可以看出我们的方法比Epic方法要平稳一些。
最后我们做了一些真实视频上的测试,一些没有计算机视觉背景的人观察我们的方法和其他方法的效果,投票表明我们的方法明显效果更好。而且,如果使用更高清的数据来训练,最终效果会更好。
在这个章节中,我们介绍了如何解human motion的问题,提出了voxel flow(体素流),它其实是一种无监督的光流,仅仅通过视频重构就可以得到比较好的表示。
总结一下,我们的工作主要围绕人,对人脸、服饰、场景、以及动作进行理解,算法场景都是户外条件。因此,算法需要同时考虑两点,一个是物体会存在形变,我们使用了注意力机制和关键点来做,另一个是场景也非常复杂,我们采用了layer-cascade,对不同难度的区域采用分而治之的思想;第二,我们的工作混合了异质的监督信息,通过融合身份、属性、关键点信息,甚至未来可能会用到自监督信息,提高了算法性能和算法落地的可能性;第三,我们需要把深度学习变得更加结构化,需要加强每个神经元的语义信息,并让神经元懂得一定的空间关系并具有时空概念,这也是结构化深度学习未来的方向。
这些工作不仅在理论上有一定的价值,在实际中也已落地到产品中去,比如Microsoft Blink,Google Clips,SenseTime FashionEye。
最后非常感谢我的合作者们,和他们一起工作非常开心,谢谢大家!
文中刘博士提到的文章下载链接为:https://pan.baidu.com/s/1ggdvu4F
文中提到的算法源代码已开源:https://github.com/liuziwei7
本文主编袁基睿,编辑杨茹茵。
--end--
该文章属于“深度学习大讲堂”原创,如需要转载,请联系 ruyin712。
作者介绍:
刘子纬,现为加州大学伯克利分校博士后。2017年博士毕业于香港中文大学,师从汤晓鸥教授和王晓刚教授,期间应邀赴Microsoft Research和Google Research实习。他的研究兴趣是计算机视觉、机器学习和计算摄影学等,目前已在TPAMI,CVPR,ICCV,ECCV,SIGGRAPH等顶级期刊和会议上发表论文十余篇。他曾获得Microsoft Young Fellowship, Hong Kong PhD Fellowship和ICCV Young Researcher Award等奖项。
往期精彩回顾
欢迎关注我们!
深度学习大讲堂是由中科视拓运营的高质量原创内容平台,邀请学术界、工业界一线专家撰稿,致力于推送人工智能与深度学习最新技术、产品和活动信息!
中科视拓(SeetaTech)将秉持“开源开放共发展”的合作思路,为企业客户提供人脸识别、计算机视觉与机器学习领域“企业研究院式”的技术、人才和知识服务,帮助企业在人工智能时代获得可自主迭代和自我学习的人工智能研发和创新能力。
中科视拓目前正在招聘: 人脸识别算法研究员,深度学习算法工程师,GPU研发工程师, C++研发工程师,Python研发工程师,嵌入式视觉研发工程师,运营经理。有兴趣可以发邮件至:hr@seetatech.com,想了解更多可以访问,www.seetatech.com
中科视拓
深度学习大讲堂
点击阅读原文打开中科视拓官方网站