DeepFashion论文阅读及源码实现
数据集介绍
DeepFashion是香港中文大学开放的一个large-scale数据集。包含80万张图片,包含不同角度,不同场景,买家秀,买家秀等图片。总共有4个主要任务,分别是服装类别和属性预测、In-Shop和c2s服装检索、关键点和外接矩形框检测。
每张图片也有非常丰富的标注信息,包括类别,属性,Bbox,特征点等信息。部分任务中的数据集需要邮件联系作者获取解压缩密码。
Category and Attribute Prediction Benchmark
这个任务主要是做服装分类和属性预测的,其中共有50中分类标记,1000中属性标记,包含289,222张图像。每张图像都有1个类别标注,1000个属性标注,Bbox边框,landmarks。更多信息
attributes.jpgIn-shop Clothes Retrieval Benchmark
这个任务的数据集为卖家秀图片集,每个商品id,有多张不同角度的卖家秀,放在同一个文件夹内。总共7982件商品,52712张图像,每张图片都有463中属性,Bbox,landmarks,以及店铺描述。更多信息
retrieval_inshop.pngConsumer-to-shop Clothes Retrieval Benchmark
这个任务的数据集是卖家秀买家秀对应的数据集,每个商品id对应的文件夹中包含一张卖家秀和几张买家秀。总共33881种商品,239557张图片。每张图片都有Bbox,303种属性,以及来源说明(卖家,买家)。更多信息
retrieval_consumer2shop.pngFashion Landmark Detection Benchmark
这个任务的数据集主要是做landmark和Bbox用的,包含123016张图片,每张图片都有landmarks和Bbox的标记,还有类别标注(上衣,下装,全身),以及姿态(正常姿势,大幅度姿势等)信息。。更多信息
landmarks.jpgFashionNet
关于服装检索,这篇文章作者在In-Shop和C2S两个子任务上做了BaseLine的工作,并将其命名为FashionNet,除了利用到了服装的属性、类别信息之外,作者新颖的提出了使用landmarks辅助提取特征的方法。个人认为这种方法有一些attention的意思在里面,通过landmarks detection子网络得到服装特征点以后,对特征点附近进行局部特征编码,最终将其应用在服装检索任务中。
网络结构
论文提到的FashionNet方法采用的网络backbone为VGG16,实际上经过笔者的复现,使用更新、表征能力更强的网络作为backbone时检索精度还会得到提升;在VGG16网络中,stage4之前的网络结构权值都是共享的,在这一基础上发展了三个网络分支,如下图所示:
FashionNet.png上图的橙色部分、绿色部分和蓝色部分分别代表了全局特征提取网络、局部特征提取网络和特征点回归网络。
- 橙色部分(全局分支):基于共享的VGG16前4个stage,增加了自己的conv5卷积结构,然后接一个全连接层用于特征编码,输出特征作为最终检索特征的一部分。
- 蓝色部分(关键点回归分支):与VGG16网络结构类似,在stage5卷积结构后面使用两个全连接层进行特征编码,根据输出的特征分别再使用两个全连接层输出服装关键点和关键点是否可见的标签。
- 绿色部分(局部分支):借助于蓝色分支输出的服装关键点,论文作者提出了一个新的层,landmark pooling layer,与Faster RCNN中的ROI Pooling层类似,目的在于对提取特征图上的某一块区域进行统一的编码工作。这部分的特征称之为局部特征,将橙色部分和绿色部分的特征按通道组合在一起之后经过一个全连接层再编码一次,然后基于这个特征对属性、类别标签进行分类学习,同时使用triplet loss进行辅助学习。
landmark pooling layer
landmark pooling layer是作者在本文的一个创新点,在图像检索中,landmark所代表的其实是一个局部的,细粒度的特征,通过将这部分特征与全局特征组合能较好的对图像内容进行表征,基于这一点,作者设计了一个关键点回归子网络,基本部分与主网络共享权值。输出的关键点位置信息作为输入被绿色部分网络所接收。绿色部分的网络将关键点位置映射到VGG16 stage4 conv层的输出特征图上,对其附近的特征做统一size的Crop提取,称之为局部特征图。然后对于每一个局部特征图,首先使用max-pooling层操作之后将所有的局部特征图按通道组合在一起,后面使用一个全连接层对其进行编码输出,得到固定维度的局部特征。landmark pooling layer的图示操作如下所示:
landmark-pooling-layer.png需要注意的是,蓝色部分的关键点回归网络其实除了输出特征点的位置信息之外,还输出了关键点是否可见的标签,在landmark pooling layer操作中,标签为可见的关键点可以用作局部特征提取的输入,但是对于不可见的关键点,论文并没有给出详细的操作指示,笔者将其固定取图像左上角的一块特征区域,最终依然能复现出论文结果。
前向传播
作者在论文中对FashionNet使用了multi-stage的训练方式:
- 首先在第一个stage中,作者设计将蓝色网络的loss权重调高,而用于属性、类别分类及triplet学习的loss权值保持正常。经过一段时间的迭代训练之后进入stage2。
- 使用stage1中的最优模型作为fine-tune基础,作者开始第二轮训练,网络结构和训练数据保持不变,超参数不变(推测)。与stage1不同的是,这一阶段的训练中,关键点回归子网络中的loss比重与其余loss保持一致。
这样做的理论依据在于,网络的表征能力受到了关键点回归准确程度的影响,在第一个训练阶段中,增加关键点回归子网络的loss比重,可以使得网络在优化训练过程中朝着关键点回归任务偏移,但属性、类别分类器的存在,也使得网络在迭代过程中同时兼顾了服装类别的区分。通过一段时间的第一阶段训练之后,将训练策略调整为所有loss的权重平等,对于一开始就使用平等权重的loss进行训练,能更好的达到局部特征辅助全局特征进行分类的效果。
反向传播
FashionNet网络在训练过程中总共使用了4种loss结构
关键点回归
关键点回归使用了L2 regression loss,公式如下:
- 表示了训练样本
- 表示第个样本的groundtruth关键点位置
- 表示预测出的第个样本的关键点位置
关键点可见标签和服装类别标签
这两点使用了多标签分类任务,Softmax分类器及其loss函数被用于训练这部分内容,loss分别为和。
属性预测
属性预测为带权重的cross-entropy loss,其实就是Softmax loss在二分类上的体现,这里需要注意的是对于不同的属性,由于正负比例不均所以使用了不同的权重去定义该部分的loss,公式如下所示:
其中:
- 和分别表示第张服装图像及其对应的属性标签;
- 和为两个系数,这个就是上面提到的不同属性标签的loss权重,这个权重由某个属性标签positive和negative样本数量来确定。
三元组损失函数
度量学习triplet loss同样也被用于在组合特征中对不同的服装类别进行区分度学习,其使用欧氏距离作为距离判定标准,约束条件为:
对于三元组损失的详细内容不再解释,有需要请点击triplet loss