该篇论文主要有两个任务,第一个任务是提供了一个large-scale数据集, 包含80万张图片,包含不同角度,不同场景,买家秀,买家秀图片。数据集分为4个子数据集,用于4个主要任务,分别是服装类别与属性预测、店内衣服检索、买家秀卖家秀衣服检索、关键点和目标检测。第二个任务是提出了一个深度学习网络FashionNet,该博客主要用于记录fashionnet部分的内容,具体deepfashion数据集介绍请见其它博客。
1.服装间由于款式、质地和裁剪方式的差异,会导致模型识别服装结果发生混淆,比如同一服装间的裁剪方式不一致导致模型认为不是同一服装,或不同服装由于款式,质地十分相近会使得模型认为是同一服装。 2.服装在展示时发生形变或部分被遮挡是不可避免的,这给模型在识别效果上制造了困难。 3.在不同场景下拍摄出来的服装图像通常表现出很严重的差异,例如:买家秀和买家秀的不同。
1.提出大型时装数据集DeepFashion 2.提出了FashionNet 进行DeepFashion 数据集的衣服属性的预测和分类 3.定义了多种任务的评价标准

如上图,文章认为在衣服识别中,若一个数据集同时拥有类别、属性和关键点的标签,会得到两个优势,第一个是给定关键点的位置有助于服装识别精度的提高,第二个是服装的大量属性的引入导致了服装的特征空间能够得到更好的划分,从而能够促进跨域服装图像的识别和检索。
FashionNet 建立了三个benchmark,以供后续研究作为效果评价的基线。它们分别是:服装特征分类、店内服装检索(网站中同一商品展示图的匹配),和跨领域的服务检索(买家秀卖家秀衣服检索)。具体代码可以在mmfashion中查看。

以下内容来自:DeepFashion服装检索及代码实现
论文提到的FashionNet方法采用的网络backbone为VGG16,在VGG16网络中,stage4之前的网络结构权值都是共享的,在这一基础上发展了三个网络分支,如上图所示。上图的橙色部分、绿色部分和蓝色部分分别代表了全局特征提取网络、局部特征提取网络和特征点回归网络。 橙色部分(全局分支):基于共享的VGG16前4个stage,增加了自己的conv5卷积结构,然后接一个全连接层用于特征编码,输出特征作为最终检索特征的一部分。 蓝色部分(关键点回归分支):与VGG16网络结构类似,在stage5卷积结构后面使用两个全连接层进行特征编码,根据输出的特征分别再使用两个全连接层输出服装关键点和关键点是否可见的标签。 绿色部分(局部分支):借助于蓝色分支输出的服装关键点,论文作者提出了一个新的层,landmark pooling layer,与Faster RCNN中的ROI Pooling层类似,目的在于对提取特征图上的某一块区域进行统一的编码工作。这部分的特征称之为局部特征,将橙色部分和绿色部分的特征按通道组合在一起之后经过一个全连接层再编码一次,然后基于这个特征对属性、类别标签进行分类学习,同时使用triplet loss进行辅助学习。
Llandmarks=∑j=1∣D∣∣∣Vj⋅(l^j−lj)∣∣22
2.衣服类别分类和landmark是否可见分类,采用传统的softmax crossentrop loss, 表示为 L v i s i b i l i t y L_{visibility} Lvisibility 和 L c a t e g o r y L_{category} Lcategory
3.衣服属性分类采用加权的sigmoid crossentrop loss, X j X_j Xj代表第j个衣服, a j a_j aj代表第j个衣服的属性, W p o s W_{pos} Wpos和 W n e g W_{neg} Wneg代表正负样本的权值
L a t t r i b u t e s = ∑ j = 1 ∣ D ∣ ( w p o s ⋅ a j l o g p ( a j ∣ x j ) + w n e g ⋅ ( 1 − a j ) l o g ( 1 − p ( a j ∣ x j ) ) ) L_{attributes} = \sum_{j=1}^{|D|} (w_{pos} \cdot a_jlogp(a_j|x_j) + w_{neg} \cdot (1 - a_j)log(1-p(a_j|x_j))) Lattributes=j=1∑∣D∣(wpos⋅ajlogp(aj∣xj)+wneg⋅(1−aj)log(1−p(aj∣xj)))
4.衣服服装对的loss采用triplet loss。 ( x , x + , x − ) (𝑥,𝑥+,𝑥−) ( x , x+ , x− ) \begin{pmatrix} x, x^+ , x^- \end{pmatrix}(x,x+,x−) 表示三元组,m表示margin,d表示距离函数。
L t r i p l e t = ∑ j = 1 ∣ D ∣ m a x { 0 , m + d ( x j , x j + ) − d ( x j , x j − ) } L_{triplet} = \sum_{j=1}^{|D|} max {0,𝑚+𝑑(𝑥𝑗,𝑥+𝑗)−𝑑(𝑥𝑗,𝑥−𝑗)} { 0 , m + d ( x j , x j + ) − d ( x j , x j − ) } \begin{Bmatrix} 0, m + d(x_j, x_j^+) - d(x_j, x_j^-) \end{Bmatrix}Ltriplet=j=1∑∣D∣max{0,m+d(xj,xj+)−d(xj,xj−)}
对于一张图片来说,从最初的(224,224,3)经过vgg16的stage4输出一个(7,7,512)feature map, 这个feature map连接着2个分支,包括全局分支、局部分支;其中全局分支先AdaptiveAvgPool2d池化为(7,7,512),如果是用户自定义的图像输入的化,vgg输出的不一定是(7,7,512),然后将该feature map展平后通过几个全连接层得到图片的全局表示为(4096,)的维度;而对于局部分支,由于输入为feature map以及landmarks,经过仿射变换可以得到局部关键点向量,然后经过全连接层可得到局部向量表示(4096,);全局局部拼接在一起后可以得到最终的向量表示。
基本思路就是通过仿射变换将关键点放到最中间,同时根据一定比例放大,这样对原来的tensor进行卷积就相当于局部卷积了,推荐一个讲的比较好的博客,Pytorch中的仿射变换(affine_grid)
已知deepfashion数据集有四个子任务,分别是服装类别与属性预测、店内衣服检索、买家秀卖家秀衣服检索、关键点和目标检测。而以上的FashionNet为一个整体的框架,在观察mmfashion中的子任务的代码后发现,其实每个任务并不一定需要同时预测category、attributes、triplet、landmarks和landmark visibility,可以只用部分分支就可以进行预测,比如类别或属性预测没有必要使用triplet loss,同时我们数据集也可能没有服装对的数据。在mmfashion中可以看到,FashionNet的使用还需要对具体数据情况来实现模型。
PS:以下内容为mmfashion中买家秀卖家秀衣服检索模型的部分代码, 主要是便于本人理解和记忆。其他部分的训练过程和数据准备可参考GETTING_STARTED和DATA_PREPARATION
|---- Anno 标注文件文件夹 |-------- list_attr_cloth.txt 衣服款式中英文对照表 |-------- list_attr_items.txt 衣服属性标注,1000个属性 |-------- list_attr_type.txt 衣服属性类型中英文对照表 |-------- list_bbox_consumer2shop.txt 图片中服装的bbox框标注 |-------- list_item_consumer2shop.txt 图片中商品编号,每种商品可以用多个商品对 |-------- list_landmarks_consumer2shop.txt 图片中商品的landmarks标注 |---- Eval 数据集划分文件 |-------- list_eval_partition.txt 训练集测试集划分,商品对的形式 |---- Img 图片文件夹
数据准备运行代码为: python prepare_consumer_to_shop.py