阿里天池FashionAI服装属性标签识别Top1%方案分享

前言

上周六刚刚结束FashionAI2018服装属性标签识别的复赛,比赛竞争十分激烈。比赛总共报名近3000支队伍,经过3个月的比拼,我们队伍最终获得了第11名的成绩。虽然离第十名只有一步之遥,但是我不遗憾,毕竟这是我第一次参加天池比赛,对于这个结果我感觉对得起自己三个月的辛苦。

干货

首先源码网址:https://github.com/KaiJin1995/fashionAI2018/tree/master

下面从以前几点来讲解该比赛及方案

  • FashionAI比赛内容
  • FashionAI比赛方案
  • 未来计划
  • 源码分享

比赛内容

该比赛是对服装不同属性进行识别,服装的属性包含:coat length 、collar design、neck design、neckline design、pant length、skirt length、sleeve length,每种服装属性包含若干类别,我们需要做的是识别服装的每个属性的不同类别。具体类别请参考下图,该比赛只涉及到了脖领设计、领子设计、翻领设计、颈线设计、袖长、衣长、裙长、裤长八个属性,每个属性都有自己的分类。该比赛需要我们分别对每个属性设计分类器,对每个属性单独分类,最终评价分类器每个属性识别准确率好坏。

图1

详情请参考阿里天池-服装属性标签识别
任务的定义很直白,简而言之是分类任务。

比赛方案

首先这是比赛的总体框图
这里写图片描述

总体来说有五大部分:
1. 改进版多任务训练
2. Mask RCNN 和CPN的应用
3. 输入图像大小的影响
4. 数据增广
5. 多通道网络的训练

改进版多任务训练

由于是分类任务,目前做分类任务做好的方法是使用深度CNN网络,所以该比赛毋庸置疑必须要有GPU才能做。我们做这个比赛使用了3块1080Ti、4块K80(稳定)。最多的时候用了6块1080Ti、3块1080、7块K80 和 1块P100。(应急的时候借师兄师姐师弟师妹的GPU)是不是感觉GPU有点多,毕竟要不断的尝试方案,在有限的时间里训练多种不同的方案需要一些GPU,最终定下方案的时候只需要使用2块卡就足够训练了。

一旦使用深度卷积神经网络,不可避免的一点就是数据量的问题。初赛的时候数据量比较小,而现有的分类效果良好的CNN参数量较大,如何用比较少的数据量训练比较深的网络是要解决的难点之一。

因此,多谢技术圈中培文大佬的分享,使得我们对于这个难点有了新的思路:这个思路便是采用多任务学习的方式进行训练,从而弥补数据量的不足。多任务学习在分类和检测任务中很常见,比如FasterRCNN便同时可实现对物体位置的定位和分类。我们不再对每个属性单独训练,而是将所有的属性合并起来共同训练。

多任务训练结构图如下图所示:详细的代码请看NasNet代码
NasNet多任务训练
这个图来自培文大佬开源的代码的可视化图。
多任务训练的思想在于如何多种相似数据集共同输入至网络训练,对于分类网络而言,所有的任务共享卷积层,全连接层独立,例如coat输入到网络中,将会有结果同时在八个全连接层输出,但只更新coat的全连接层,其他七个FC层不更新,FC层之外的Conv层是都更新的:即共享不同属性的结构信息。
这个方法对于数据集数量不多,但是不同数据集的结构特征很相似的情况下很有用,能够提升约1个百分点的准确率。

而直接使用八个属性进行多任务训练是存在不足的,因为八个多任务需要识别的特征是有差异的,比如design和length的显著性特征是不同的。因此提出了一种分离多任务训练策略:属性分成length属性和coat属性,分别对这两个不同属性进行多任务训练。分离成这样的多任务,每个多任务分类器需要分类四个属性,使用这种方法准确率进一步提升。

但是仅仅是这样也是不足够的,如果使用了检测将衣服关注区域crop之后,design的多任务策略需要改变,因为我们对于neck和collar切的图像区域很小,使用的是CPN的方法,而lapel和neckline切的图像区域较大,使用的是MaskRCNN。使用了这种不同策略的图像crop之后,图像的分辨率将发生变化,此时图像的结构信息发生改变,不能将这四个属性一起多任务训练,于是lapel和neckline合并进行多任务训练,neck和collar合并进行多任务训练。
如下图所示,分成三个部分进行多任务训练:
length
Collar&NeckNeckline&Lapel

以上便是我们采用的改进版多任务训练的方法

Mask RCNN 和CPN的应用

此部分简单说一下,因为这部分是由本次比赛的主力二号来自上交的老哥做的。由于FashionAI同时举办了服装关键点检测和服装属性标签识别,所以具有服装关键点的数据集,而且属性标签识别的比赛允许使用关键点对图像进行预处理,因此我们采用关键点检测先对训练集进行预处理,之后送入分类网络中训练。
由于length属性容易出现裁剪不恰当导致服装部分被裁掉,进而出现服装length识别错误的问题,即length对于裁剪比较敏感,因此本次比赛仅对length的pant和skirt进行裁剪,而且裁剪的也是大图,无法切成小图。
因此对design进行裁剪,design中的lapel和neckline占据较大的面积,因此不能切割很小的图像,于是保留了大部分的图像,而neck和collar在图像中占据的面积较小,因此可以切割较小的图。
切割图像示例:

neck:collar:

lapel:neckline:
skirt:pant:

输入图像大小的影响

输入图像的大小对于结果的影响很显著,对于识别而言,官方给的图像都在1000以上,如果输入到网络的图像resize更大,则对识别而言,图像特征更明显更清晰,卷积核提取到更有判别性的特征。
比赛中,我选用了Inception系列的网络用作识别,因为Inception结构具备多尺度提取特征的特性。
Inception典型结构如下图所示:

这里写图片描述
1x1卷积用来整合concat层通道信息,用不同大小的卷积多尺度地提取特征,每个卷积核提取到的featuremap拥有不同的感受野。对于服装属性识别任务,多尺度特性提取有助于抓住关键信息,我认为这具有间接attention的作用。

InceptionV3一般输入大小是299,由于最后分类的FC层拥有Global Average Pooling,所以输入大小可以改变,并不是固定的,因此,根据下图在ImageNet的实验,我采用了393的输入大小:
这里写图片描述

其实,对于这个任务而言,可以输入更大的图像,但是会带来显存占用显著增加,对于393的大小,我感觉预测速度明显变慢,显存占用很严重。由于考虑到时间不够长,就没能尝试更大的图像。

数据增广

这是做图像识别的最基本的技巧,也是在数据集不够的情况下的一种妥协。一般来说,不同的数据集需要做不同的数据增广,这是case-by-case的。因此对于一般的图像识别而言,mirror、rotation、random crop都是必须要做的。在服装属性识别任务中,我们除了上述的通用的增广方式,同时也采用了channel shift,也就是颜色通道的变化,使得图像具有不同的颜色。这个操作在一定程度上是有帮助的,避免了颜色信息影响图像的识别。另外,图像的旋转对于这个数据集很有帮助,因为测试集中具有很多旋转的图片,通过数据增广,可以对旋转的图片更鲁棒的识别。

多通道网络训练

官方限制只能使用两个模型,因此,为了获得更好的单模型性能,本次比赛采用了多通道网络训练策略。
该多通道模型是端到端可训练的网络结构。不同于训练完模型之后的简单融合,其实就是相当于加宽了网络。训练结构图如下图所示:
这里写图片描述
因为考虑到不同模型结构对于网络的特征提取不同,因此,我们使用了三种不同的网络特性结构,

通过多网络联调训练方式,加深了网络,获得不同网络对于特征的提取特性。
这种策略在单模型上很有用,缺陷在于训练耗时,测试时间长,显存占用比较大。

未来计划

将在一周内公开源码。将来一段时间博客的内容主要是tensorflow的讲解,预计会开一个专栏,专门将tensorflow的重点用法。tensorflow的灵活性使得做竞赛、做实验都很方便

源码公开

https://github.com/KaiJin1995/fashionAI2018/tree/master

没有更多推荐了,返回首页