专栏首页量子位让CNN有了平移不变性,同时提升ImageNet成绩:Adobe开源新方法,登上ICML

让CNN有了平移不变性,同时提升ImageNet成绩:Adobe开源新方法,登上ICML

栗子 发自 凹非寺 量子位 报道 | 公众号 QbitAI

古往今来,大家都知道:只要图像一平移,CNN就认不出来了

原因就在降采样身上。不管是最大池化,跨步卷积,还是平均池化,都对平移太敏感:

比如,0、0、1、1、0、0、1、1……这样的周期,最大池化是这样:

但如果平移一格,最大池化完全变了一个样子:

虽然,有著名的抗锯齿 (Anti-Aliasing,AA) 方法,致力解决这个问题。但把这种模块直接插进网络,会严重影响模型的表现。

现在,来自Adobe的Richard Zhang (简称“理查”) ,让抗锯齿和各种降采样和平共处了

在保留平移不变性的情况下,还能提升ImageNet上的分类准确率。VGG、ResNet、DenseNet……各种架构都适用。

不止如此, 面对其他干扰更稳定了,如旋转如缩放;面对输入图像的损坏,还更鲁棒了。

研究登上了ICML 2019,代码已经开源,还有演讲可以看。Reddit热度已经超过了250,观众纷纷表达了谢意:

论文很厉害,演讲也很好。

怎样和解的?

想知道怎样帮助CNN保留平移不变形,就要了解平移不变性是怎样打破的。

理查观察了VGG的第一个卷积层,发现它对平移毫无波澜,并不是在这里打破的。

但再观察第一个池化层,对平移有了反应:平移偶数个像素,表征还不改变,平移奇数个像素,表征就完全变了。

向网络深处走,经过的池化层越多,问题就越严重。

抗锯齿

想解决这个问题,就要把抗锯齿降采样友好地结合到一起。

于是,理查又仔细查看了降采样过程,把它 (按顺序) 分成了两个部分:

一是取最大值,用密集的方式。 二是在中间特征图 (Intermediate Feature Map) 上做子采样 (Sub-Sampling) 。

第一步没有问题,完全不会出现锯齿。

第二步就要改了。理查给中间特征图,加了个模糊滤波器 (Blur Filter) 来抗锯齿,然后再做子采样:

(2)为滤波器

那么,“抗锯齿版最大池化”效果怎么样?

平移不变性与准确率兼得

理查用ImageNet分类任务测试了一下进化后的VGG,原以为会损失一些准确率,结果:

右为抗锯齿
空心为抗锯齿

在解锁平移不变性的同时,准确率还提升了。

如果降采样方法不是最大池化,又怎么样呢?

所以,理查还测试了ResNetMobileNetv2,它们用的是跨步卷积;以及DenseNet,它用的是平均池化:

空心为抗锯齿

这些架构也获得了类似的提升。全面成功。

上面只讲了分类这一项任务。而进化后的降采样,在图到图翻译任务上也同样有效。

不惧各种变换,以及图像损坏

不只是平移,像旋转、缩放这样的干扰,都可以应对自如;另外,面对输入图像损坏 (Image Corruption) ,也变得更加鲁棒了。

ImageNet-P数据集里,有受到各类干扰的图像;而ImageNet-C数据集里,包含了系统性损坏的图像。

mCE=Mean Corruption Rate, mFR=Mean Flip Rate

左边一栏 (除了Baseline) 之外,是不同的滤波器,从上到下依次变强。mCEmFR,都是越小越好。

数据显示,各种滤波器都能有效增强,应对干扰的稳定性,和应对图像损坏的鲁棒性。其中,最强的过滤器Bin-5表现最佳。

One More Thing

如果小伙伴们没有看够,可以点开演讲视频:

然后,还有一大波传送门。

论文在此: https://arxiv.org/abs/1904.11486

项目主页: https://richzhang.github.io/antialiased-cnns/

开源代码: https://github.com/adobe/antialiased-cnns#1-quickstart-load-an-antialiased-model

加入社群 | 与优秀的人交流

小程序 | 全类别AI学习教程

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点「好看」吧 !

本文分享自微信公众号 - 量子位(QbitAI),作者:关注前沿科技

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么我的CNN石乐志?我只是平移了一下图像而已

    一般来说,图像经过小小的平移和变形之后,人类还是信任CNN能够把它们泛化,识别出里面的物体。

    量子位
  • 1200+标星,3千多人点赞,这本书让你系统了解机器学习可解释性丨开源免费阅读

    对许多技术人员来说,机器学习在出现问题的时候,总会让人一头雾水,搞不清楚具体是哪里出了问题。

    量子位
  • 欲学机器学习必先掌握Shell,AI工程师自制教程,获Reddit网友400+点赞 | PDF+视频

    研究机器学习,少不了Python和C++等语言的帮助。而在GitHub发布的2018机器语言排行榜中,还有一种“冷门”的语言进入了前十,它就是Shell。

    量子位
  • JavaScript设计模式--桥梁模式--引入

    wfaceboss
  • 计算机操作系统学习笔记_进程管理--死锁

    进程管理 --死锁 一、死锁的概念 1.死锁的概念   系统中两个或两个以上的进程无限期地相互等待永远不会发生的条件,系统处于一种停滞状态,这种情况称为死锁。 ...

    小小科
  • 什么情况下 Java 程序会产生死锁?

    死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也...

    葆宁
  • 面试-死锁 原

    重点摘要:多线程之间的死锁、多事务之间的死锁、查看死锁(jstack)、顺序死锁(调整顺序可以解决死锁)、动态死锁(内部动态排序or尝试锁)

    秋日芒草
  • Java Concurrent 死锁

    死锁是一个比较大的概念,在并发场景下的加锁行为都有可能产生死锁问题。在Java 并发编程中会有死锁,操作系统里也有死锁,数据库里也见过死锁,分布式里也有死锁, ...

    邹志全
  • 2.4 死锁

    由于系统中存在一些不可剥夺资源,而当两个或两个以上的进程占用自身资源,并请求对方资源时,会导致每个进程都无法向前推进,这就是死锁。死锁产生的必要条件有四个,分别...

    week
  • 面试杂谈 - 死锁的四大条件与处理策略

    比如:两个线程A、B各自持有一个无法共享的资源,并且他们都需要获取对方现在持有的资源才能进行下一步,但是他们又必须等对方释放了才能去获取,于是A等待B,B也在等...

    acupt

扫码关注云+社区

领取腾讯云代金券