前些天从实验室了解到天池的FashionAI全球挑战赛,题目和数据都挺有意思,因而花了点时间稍微尝试了下。目前比赛还在初赛阶段,题目有两个,分别是服装属性标签识别和服饰关键点定位。html
服装属性标签识别是指识别出领、袖、衣、裙、裤等部位的设计属性,对应多个多分类问题,例如如下的例子。git
服饰关键点定位是指定位出服饰中关键点的位置,对应多个回归问题,例如如下的例子。github
这和CelebA(mmlab.ie.cuhk.edu.hk/projects/Ce…)人脸数据集有点像,每张图片都是一张人脸,对应的标注包括5个关键点位置和40个属性的01标注,例如是否有眼镜、帽子、胡子等。网络
我选了第二道题目,一方面感受有人脸关键点检测、人体骨骼关键点检测等相关问题可供参考,去年的AI Challenger也举办过人体骨骼关键点检测的比赛(challenger.ai/competition…),另外一方面本身尚未作过这块内容,比较感兴趣。函数
比赛官方提供的训练集共包括4W多张图片,测试集共包括将近1W张图片,神奇的是训练集和测试集有366张图片是彻底重合的。每张图片都指定了对应的服饰,共5类:上衣(blouse)、外套(outwear)、连身裙(dress)、半身裙(skirt)、裤子(trousers)。学习
一共有24个关键点,但每类服饰对应的关键点数量并不同。关键点标注分为三类,-1表示不存在,0表示存在但不可见,1表示存在且可见,后两种状况都会提供对应关键点的xy坐标。测试
进行了相关的预处理以后,先尝试下最基础的结构,即卷积、池化加全链接。因为以前彻底没作过这一块,因此网络的一些细节都只能慢慢尝试,包括卷积用几层、卷积核大小设多少、使用哪一个激活函数、使用哪一个损失函数等等。设计
进行了长时间的摸索,终于折腾出第一个所有打通的版本,提交了一版结果,成绩大概30%左右。因为最后一层使用全链接层直接输出每一个关键点的xy坐标,所以偏差比较大。3d
目前排行榜第一名是4.49%,占榜不少天雷打不动,可见实力之强劲。cdn
后来一想,像这类比较经典的问题,确定已经有大量的相关研究和模型,彻底靠本身凭空搭一个网络显然不靠谱。因而进行了一些调研,找到两个模型:Convolutional Pose Machine、Stacked Hourglass。
精力有限,重点研究了一下CPM。阅读了对应的论文,2016年的CVPR,模型结构长这样,简单来讲就是反复使用多个Stage,不断抽取每一个关键点对应的愈来愈准确的响应图。
在Github上找到了CPM的一个开源实现(github.com/timctho/con…),阅读代码并进行修改后应用到比赛的数据上,在P100上训练共花费30个小时左右。使用6个Stage的CPM,为每一个关键点生成一张响应图。
如下是一张dress对应的结果,第一行的三张依次是第1个、第2个、第3个Stage的响应图合成结果,第二行的三张分别对应第6个Stage的响应图合成结果、正确答案、正确答案和原图的合成,看起来还不错。
再来看个outwear,响应图也很准。
最后再看个trousers,关键点比较少,也很准。
又交了一版结果,拿到了17%的成绩。因为CPM输出关键点的响应图而不是直接输出关键点的xy坐标,同时使用多个Stage级联以逐步获取愈来愈准确的响应图,所以能够取得更好的结果。
可能的改进包括多个方面:
虽然有不少可能的改进方向,不过因为本身以前没有作过关键点检测这类问题,因此继续折腾下去只能靠运气各类尝试,并且每次尝试都须要等待好久的模型训练时间。
相比之下,对于一些在关键点检测领域有至关积累的团队和我的,他们有着丰富的经验和现成的代码,和他们竞争仍是至关有难度的。看一下排行榜,第一名的4.49%至今无人能超越,前三十名也都在12%如下。
并且我的事情也比较多,时间和精力都十分有限,因此决定这个比赛再也不继续尝试,感受作到这一步就能够了。
经过此次比赛,了解了关键点检测这类问题的一些解决方法,并尝试用CPM进行了一些实践,对本身而言已经知足了。
等比赛结束后,再关注一下冠军团队的解决方案,好好学习一波。