请选择 进入手机版 | 继续访问电脑版

之江杯2020零样本目标分割题参赛总结

[复制链接]
丶禁飞 发表于 2021-1-1 10:29:45 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

文章目录



   一、赛题简介

本题属于图像语义分割任务,零样本是指没有提供任何测试集种别的样本,但提供了和测试集相似种别的图像及语义分割标注作为训练集,别的可以使用已训练好的词向量表来连结训练集种别和测试集种别间的语义关系,(词向量可以理解为一种用数字编码表现的辞书)。举例:训练会集提供了西瓜的图像分割样本,测试集要求实现哈密瓜的图像分割,好比一个人见过西瓜但从来没有见过哈密瓜,他可以通过查阅西瓜和哈密瓜的辞书来推测哈密瓜长什么样子。
零样本目的分割任务的初衷是为相识决图像语义分割问题标注本钱非常高的问题,同时这也是对更为通用的人工智能的一种探索,要求机器不但可以大概识别图像,还要把图像名称的语义和图像特征对应起来。本赛题训练集200类(下称已知类,seen),共约80000张图片,是和ImageNet风格类似的实物照片,测试集初赛和决赛都各有差异的50类(下称未知类,unseen),每类约100张图片。
这个问题比力前沿,相关文献和开源不多,可以大概查到的按时间顺序排序是SPNet -> ZS3Net -> CaGNet。CaGNet应该是其时的SOTA,这次角逐CaGNet的作者团队也来了,但最后没有获奖,学术和角逐毕竟照旧不一样,角逐需要许多trick,就比如孔子加入科举未必能中举因为他不会写八股文,但大家的成就不是区区小赛的效果所能比的,向他们致敬。这次角逐的冠军团队来自浙江大学,确实非常牛,心服口服,他们的方法已经撰写论文被顶会录用(似乎是AAAI?),应该是新的SOTA了。

二、ZS3Net简介

由于赛程短,我照旧零底子进入,自然是采用本渣一贯的战略:走别人的路,让别人无路可走(囧)。看了一圈文献后,以为CaGNet较难,估计来不及,所以从ZS3Net下手,ZS3Net是该范畴较早期的一个作品。下面简介一下ZS3Net和我的理解。
原文NIPS2019:https://arxiv.org/abs/1906.00817
代码:https://github.com/valeoai/ZS3
先放上论文主图:

ZS3在经典图像分割网络DeepLabV3+底子上动手术,首先把网络切开,切出末层和除末层之外的前层。网络末层的输出是像素级的分类效果,而末层的输入就是每像素所属种别的语义特征,语义特征是什么?也是词向量。而零样本任务中已知类和未知类的唯一连结就是词向量,这样我们从DeepLabV3+末层的输入入手,就可以把已知类和未知类关联起来。
然而DeepLabV3+的末层输入的这个词向量和我们从其他文本中训练得到的词向量(我使用的是Glove6B)是不对应的。我们可以想象一下,假设末层输入的语义特征是300维,它大概是按照颜色、纹理、形状…这样的300个属性分列的,但我们从外界得到的词向量大概是物种、质料…、形状、纹理、颜色…等这样的分列,两者有交叉部分,但顺序差异,描述方式也差异,好比是两本辞书,你需要一个翻译机制翻译过来。
ZS3Net创造性的提出用生成器的方式实现这个翻译。这个生成器的输入是外界得到的词向量,比如Glove6B中词向量,输出是刚才提到特征向量(即DeepLabv3+末层的输入,固然它也是前层的输出),使用已知类的Glove6B词向量和DeepLabv3+前层输出特征向量训练这个生成器,训练好的生成器就掌握了这种翻译机制,可以用来根据未知类的Glove6B词向量生成未知类的特征向量。
得到了未知类的特征向量再用它来训练DeepLabV3+的末层(前层冻结不训练),得到了新的网络权重,就可以直接用于未知类的分割任务了。
这个问题大概有点绕,我再来捋一遍,实在就是分为3步:
1,在已知类上把DeepLabV3+训练充分;
2,使用训练集种别的词向量和训练集图片经DeepLabV3+前层输出的特征向量训练一个生成器;
3,从Glove6B中得到未知类的词向量,用生成器生成特征向量,用这个特征向量替换训练集图片经DeepLabV3+前层输出的特征向量(注,只替换目的部分,不替换配景),同时也替换训练集标注Label中的已知类种别为未知类种别。然后再冻结前层,重新训练末层。最后把前层权重和末层权重归并起来得到的新的网络权重,就可以直接用于未知类测试集的推理。
实际ZS3Net原文方法比我讲的要复杂一些,还用了一些本领,但焦点原理就是我刚才讲的三步。
三、我的tricks

单靠已有开源想在这种角逐中得胜是不大概的,我在仔细分析数据、调试网络之后,举行了以下三点主要的改进,正是这三点改进使得分有了很大提高。
1、对训练集逐种别增强训练
由于本题训练集的种别数特别多,高达200类,而且各类差异很大,有的很好训练,而有的很难训练,主要是上帝造的东西都比力好训练一些,人造的东西都难训练。如果全部丢进去一起训练,网络训练希望非常迟钝,而且我卡也有限,只有2080ti,跑两天两夜也只到达mIoU0.25的水平。逼的没办法,我设计了一种逐种别训练的方法,效果不错。详细如下:

step1: 先把200类全部训练几个epoch,验证每一类的IoU,把IoU到达一定阈值以上的种别称为learned类,表现它们已经训练好了,把剩余的称为unlearn类。
step2: 然后每epoch从unlearn类中随机挑选10个作为to learn类,从learned类中每类选50张图片以保持影象性,从to learn中每类选200张图片以增强训练。每轮训练结束再验证,重新分别learned类和unlearn类。
如此循环往复。我最后到达159类learned,尚有41类确实非常难以分类,仍然是unlearn。这样可以到达mIoU0.36,比直接训练法整整提高了11个点!
2、只使用优质数据训练生成器
ZS3Net的生成器使用GMMN,它比力简朴,参数也少,所以训练它不难,不需要非常大量的数据。但是由于deeplabv3+自己在本题训练集上的效果并不是很高,mIoU0.36实际上意味着它有许多分割效果仍是错误的,如果我们用这些错误的特征向量和种别对应关系去训练这个生成器,这个生成器的翻译就会不准。
所以我们应该去掉那些错误数据,只喂给生成器最好的饲料来训练。一个自然的想法是只用learned类来训练它,更进一步还可以深入到每张图片,比如盘算每张图片的acc,只用acc高的图片来喂它。这样训练出来的生成器就更加准确。
3、用一种新颖的方法对效果举行融合
观察测试集推理效果我发现,网络对许多图片分割也都大抵能分割出来,但分类却是错误的,更细致的观察我发现如果网络对某张图片分类错误时它会体现的没有正确时那么“自信”,就是它分割出的面积会小一些,比如缺一块大概中间有孔洞。这样我就想出了采用如下方式举行融合:
step1:在差异训练条件下得到的各个权重分别对测试集做推理
step2:对比同一张图片在差异权重下的推理效果,选择目的面积较大的一个作为最终推理效果。
这个方法也很有效,我在决赛第一轮的时候没有使用融合,只排到第6名,决赛第二轮的时候使用了这个融合,排到第2名。
四、总结

本次赛制是初赛取前12名进入决赛,决赛前6有奖,我是以初赛第11名进入决赛的,所以我去现场的时候没报希望,心态也非常放松。由于决赛采用了未知类词向量统一提供的方式,而初赛许多团队在词向量方面做了不少工作,所以改这种方式之后许多队伍翻了船,而我自始至终本天职分的做零样本网络方面的工作,没有去琢磨词向量,所以决赛我占优势。另外决赛第二轮我想到了用上面提到的融合方法又提了不少分,说实话第一轮我也想到了,但是当天一直在赶路,而且心态上没抱希望所以没有打起精力来改代码就没用融合。
这次角逐认识了许多大佬,结识了几位朋友,收获满满。

来源:https://blog.csdn.net/Brikie/article/details/109686349
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )