热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【好文转载】谈谈CNN中位置和尺度问题

前言前段时间看到了几篇有意思的文章,也参考了一些相关的讨论,这里想对CNN中的平移和尺度的不变性和相等性,以及CNN对于目标相对和绝对位置

前言


前段时间看到了几篇有意思的文章,也参考了一些相关的讨论,这里想对CNN中的平移和尺度的不变性和相等性,以及CNN对于目标相对和绝对位置、深度的预测原理进行探讨。这些内容对于一些特定任务很重要,比如目标检测、目标分割、深度估计、分类/识别以及单目标跟踪中的置信图预测等。

1 CNN是否存在平移和尺度的不变性和相等性


1.1 不变性和相等性的定义

在介绍卷积神经网络(CNN)之前,我们对于不变性和相等性的理解可能来自于传统图像处理算法中的,平移、旋转、光照和尺度等不变性,比如HOG梯度方向直方图,由于cell的存在,其对于平移、旋转有一定的不变性,另外由于对图像局部对比度归一化的操作,使其对于光照也有着一定的不变性。又比如说SIFT特征提取,其对于以上四点都有着不变性,其中由于尺度金字塔,使得对尺度也有不变性。这里我们对于不变性的理解就是,同一对象发生平移、旋转、光照变化、尺度变换甚至形变等,其属性应该一致。下面我们给出具体的不变性和相等性的定义。

其中不变性(invariance)的定义正如上文所说,因此其形式为:

  而对于相等性(equivalence),顾名思义,就是对输入进行变换之后,输出也发生相应的变换:

  不过如果我们只考虑输出对于输入不变性和相等性的情况,则会难以理解,因为我们更多地是想象着特征层面的映射,比如:

那么特征层面对于输出的影响我们可能考虑得比较少,但是却实质存在,比如目标在图像中的平移和尺度等变换,在目标检测任务中,必须要使得网络具有相关的变换相等性,由此捕捉目标的位置和形状变化。而在图像分类、目标识别、行人重识别等任务中,又必须使得网络具有相关变换的不变性。这两点也是目标检测和行人检索领域中一个经典的矛盾问题,目前好像还没有特别好的解决,更多地是分阶段地执行不同的任务,防止特征共用。比如:经典的两阶段目标检测任务中,第一阶段是粗检测和前景背景分类,第二阶段是精修和具体类别分类,有一定的偏重。行人检索算法则大多是先检测后识别的策略。当然除了不变性和相等性的问题,还存在类内差异的问题,比如不同的人对于检测而言都是行人类别,对于识别而言则是不同的人,这对于特征提取也存在挑战。

1.2 CNN网络的执行过程

我记得我几年前第一次接触到深度学习的时候,对于全连接和CNN的局部连接形式,都有平移、尺度不变性的说法。对于全连接网络,由于下一层的每个节点都会与上一层进行连接:

因此无论输入发生了平移、尺度等什么变换,只要其属性没变,全连接网络更能捕捉其中的不变性。而对于卷积神经网络,我们都知道两个特点:局部连接和权值共享。

对于局部连接,因为全连接参数太多,容易造成过拟合,并且图像领域更多地关注局部细节信息,所以局部连接方式有效。至于权值共享,也有减少参数的作用,很像图像处理中的滤波器。我们早期对于其不变性的理解更多是遵循一个宏观的感受,即由于卷积核的移位滤波,上一层的特征到下一层的特征相对位置宏观不变,直到最后输出,类似于全连接的效果,从而获得不变性。

1.3CNN网络潜在问题与改进

正因为我刚说的宏观不变,使得输入在经过多次卷积、池化之后,微观/细节的变化累积放大,从而失去了这种不变性,接下来我会结合两篇论文进行介绍。

第一个是为了解决CNN平移不变性对抗性攻击的一篇ICML2019论文《Making Convolutional Networks Shift-Invariant Again》。这篇文章主要讨论了CNN网络中的降采样对于平移不变性的影响:

上图是对于一个窗户分别采用从0~7的平移量,其特征图与不平移的差异,可以明显看到,特征图出现了波动。相应地,上半部分是利用pix2pix生成的图像,我们可以看到随着平移量的增大,窗户中的竖直线从两根变成了一根。这一点就表明传统的CNN网络并不具有平移不变性。

首先,作者做了这样一个小实验,即采用maxpooling对一维向量[0011001100]进行池化,由此得到向量[01010]:

接着,如果将输入向右平移一个单位,则得到向量[111111]:

很明显,平移相等性和不变性都丢失了。接着作者做了进一步实验,利用余弦距离来刻画平移相等性,采用VGG网络对Cifar数据集进行试验:

其中颜色越深说明差异越大,可以看到每次maxpooling都增加了特征的差异性,不过作者将max和pool操作分开了,为了区分取最大值和降采样的影响:

很明显,降采样对于平移相等性的影响更大,而CNN中涉及到降采样的操作有:池化(maxpooling和average pooling)和带步长的卷积(strided convolution)。对此作者提出了一种名为Anti_aliasing方法,中文叫做抗锯齿处理。传统信号处理领域中对于抗锯齿的技术,一般要么增大采样频率,但由于图像处理任务一般都需要降采样,这一点不适合。要么采用图像模糊(bluring)技术,根据Nyquist采样理论,是给定采样频率,通过降低原始信号的频率来使得信号能够被重构出来,如下图所示。对模糊化处理和未处理的原图像进行下采样,得到图中底部的两张图,模糊化处理的原图像下采样的图像还能看出一些轮廓,而未处理的原图像下采样的图像就显得更加混乱。

作者就是采用了模糊的方式,提出了三种不同的blur kernel:

  • Rectangle-2:[1, 1],类似于均值池化和最近邻插值;
  • Triangle-2:[1, 2, 1],类似于双线性插值;
  • Binomial-5:[1, 4, 6, 4, 1],这个被用在拉普拉斯金字塔中。

每个核都需要归一化,即除以核内所有元素之和,然后加入到降采样过程,即在降采样之前使用blur kernel进行卷积滤波:

可以看到其效果很不错:

代码和模型见:https://richzhang.github.io/antialiased-cnns/或者https://github.com/adobe/antialiased-cnns

第二篇是同年发表在JMLR的一篇论文《Why do deep convolutional networks generalize so poorly to small image transformations?》。作者首先给出了几组示例,分别表示了平移、尺度以及轻微图像差异对网络预测分类置信度的影响:

作者认为CNN忽视了采样定理,这一点之前Simoncelli等人已经在论文Shiftable multiscale transforms中验证了二次采样在平移不变性上的失败,他们在文中说:

我们不能简单地把系统中的平移不变性寄希望于卷积和二次采样,输入信号的平移不意味着变换系数的简单平移,除非这个平移是每个二次采样因子的倍数。

我们现有的网络框架中,越深的网络,降采样次数越多,因此出现的问题更多。紧接着,作者提出了几点论述:

  • 如果   是经过卷积操作且满足平移不变性的特征,那么全局池化操作   也满足平移不变性;
  • 对于特征提取器   和降采样因子   ,如果输入的平移都可以在输出上线性插值反映出来:
     
    由香农-奈奎斯特定理知,   满足可移位性,要保证采样频率至少为最高信号频率的2倍。

接下来,作者对这些问题做了一些改进尝试:

  • 抗锯齿,这个就是我们刚刚介绍的方法;
  • 数据增强,当前在很多图像任务中,我们基本都会采用随机裁剪、多尺度、颜色抖动等等数据增强手段,的确也让网络学习到了部分不变性;
  • 减少降采样,也就是说只依赖卷积对于输入尺度的减小来变化,这一点只对小图像适用,主要是因为计算代价太高。

2 CNN对于位置和深度信息的预测


2.1CNN如何获取目标的位置信息

最早接触神经网络和深度学习相关任务时,我的感觉就是这类算法本质是做的分类任务,比如图像分割是对前景背景的分类和具体类别分类,识别任务就是类间类内的区分任务。其中图像分割任务就利用了CNN中的部分相等性,那么对于目标检测任务中的目标位置回归是怎么获取的呢?我们可以知道的是同样是对目标位置的搜索,在单目标跟踪任务中,存在有置信图:

但是置信图本质上是对区域进行搜索得到的,因此可以近似为对多个子区域的识别过程,所以单目标跟踪中的目标定位也可以用分类的理解,但是目标检测则不好用分类来理解了。

接下来我们思考一个问题,我们所设计的网络究竟包含了哪些信息?图像特征、网络结构(卷积核大小、padding)。从上一章我们可以知道,网络可以学习到一定的相等性:

因此,通过不断地训练,网络在最后的特征输出中是可以通过对应的特征数值和区域大小,结合一定的倍数(降采样大小)估计目标尺度的。但是对于目标的位置,我们人眼对于目标位置的判定是通过坐标系的,即目标距离图像的边缘距离,但是网络是如何了解这一信息的呢?《How much Position Information Do Convolutional Neural Networks Encode?》这篇文章做出了回答。

作者首先做了一组实验:

对于不同的输入图像,采用多种mask扰动,H、V、G分别代表水平、竖直和高斯等分布,用这种方式生成多种groundtruth,对于这点我们可能对单目标跟踪中以目标中心为均值的高斯分布比较熟悉。结果发现:

GT是三种分布生成的groundtruth,PosENet是作者提出的网络,没有padding。我们可以看到PosENet并没有得到位置分布信息,而是保持了相等性。而存在padding的VGG和ResNet则都预测出了位置分布。由此可见padding对于位置的作用,也对上一章的内容作了补充,padding对于平移不变性和相等性也有影响。

不过这里我们可能不好理解,我做了个小测试,不过不一定是这么做的,仅仅方便我理解:

上面是两个不同位置“目标”的卷积结果,可以看到,从输出结果得不到什么位置反映,如果加入padding:

首先我们可以知道的是,加入了zero-padding之后,目标边缘相对中心的输出更小了,其次目标距离图像边缘距离越远,其特征映射中出现0的次数越多。所以我猜网络就是在训练过程中让padding和这个相对的关系对应上了,如果没有padding,目标距离边缘越远,同样出现0的次数也会越多,但问题在于无法跟padding造成的边缘数值小,中心数值大的特殊分布相比。当然,以上仅仅是我个人的理解,为了帮助我加深印象罢了。也有人说加入了padding影响了CNN的平移相等性,从而使得CNN学到了位置信息,但这个不大好解释。

不过有关padding的问题,在CVPR2019的一片单目标跟踪算法SiamRPN++中也做了探讨。其出发点在于为何Siamese网络无法扩展为大型网络,其原因就在于padding影响了平移相等性,从而让目标位置的分布发生了偏移。所以作者通过对目标中心的随机扰动,使得网络克服自身的偏移:

也有一些研究探索了如何让CNN结合绝对位置信息,比较出名的应该是当前很热门的SOLO单阶段实力分割算法。SOLO的出发点很简单,我们都知道语义分割只需要分割出不同类别的目标,而实力分割对于同一类别的个体还需要区分。但是显而易见,同一类别的目标只要位置和形状不同则可以区分。因此SOLO就是将位置和形状(用尺寸简化)信息结合进来。具体而言,就是将输入系统的图像统一划分为S x S的网格,如果对象的中心落入网格单元,那么这个网格单元就负责预测语义类别以及分割该对象实例。

特别地,SOLO算法中采用CoordConv策略(代码:https://github.com/uber-research/coordconv),该算法将每个特征区域的坐标信息结合进来,从而让网络显示地学会记忆特征的绝对位置信息。SOLO通过这个策略提升了3.6AP,并且论证只需要一层提供该信息即可达到稳定的提升。

2.2CNN如何预测目标的深度信息

深度估计也是一个类似的问题,不同的是,图像中并没有包含深度信息,但是网络是如何获取深度信息的呢。How Do Neural Networks See Depth in Single Images?这篇文章给出了回答,关于这篇文章NaiyanWang老师已经在博客里讨论过,我这里也就再整理下。

我们可以看到,物体的绝对深度与相机位姿有着很大关系,那么CNN如何学习到这种需要几何先验的绝对信息的呢?作者做了这样一个实验:

上图中作者做了三组实验:同时变化目标位置和尺寸、只变化位置以及只变化尺寸,我们从上面的定性结果好像看不出什么问题,下面是定量的结果:

可以发现,尺度对于深度信息的预测没有什么影响,也就是说CNN网络是通过目标纵坐标来估计深度的,所以说网络实际上是在过拟合训练集,从中学习到一些固定场景下的深度和相对位置的对应关系。

作者又讨论了相机运动对于深度预测的影响,既然深度与目标纵坐标有关系,那么pitch角的影响应该很大:

可以发现,pitch的确影响比较大,相对的roll的影响就比较小了:

最后作者还讨论了颜色和纹理对深度估计的影响:

可以发现,仅仅是改变目标的颜色纹理,深度估计的效果也会下降,可将CNN网络在训练时有多“偷懒”,不知道如果将上述实验变成数据增强的手段的话会让深度估计网络失效还是变强。

2020.3.18更新

昨天碰巧看到一篇CVPR2020的文章《On Translation Invariance in CNNs: Convolutional Layers can Exploit Absolute Spatial Location》,其中也提到了CNN中的平移不变性问题和绝对位置信息编码问题,其切入点是CNN中的边界问题。

作者首先以三种卷积方式为例,full/same/valid,各自的区别在于padding的大小,具体方式我就不细说了,给个示意图:

其中红色部分表示padding,绿色部分表示边界区域。很明显,valid模式下卷积核最右边的1永远无法作用于绿色部分的1,same模式下的卷积核最右边 1永远无法作用于绿色部分的1 。作者以zero-padding和circular-padding两种模式做了一个例子说明:

可以看到Class-1中前两个例子都没有检测到1,validsame+zero-padding模式对于待卷积区域的绝对位置比较敏感。紧接着作者又分析了每个位置被卷积的次数:

由此引出距离图像边界多远时某一固定像素可以被检测到这一问题,于是作者通过给图片四周添加不同大小的黑色边界进行试验:

有意思的是,增加了黑色边界之后分类的准确率都出现了明显的下滑,只不过不同的训练策略和不同的backbone的抗干扰能力不同罢了

为了定量分析各个卷积策略对于边界的处理区别,建了一个分类数据集,特殊点都分布在边界:

结果差别很大:

可以发现,跟之前的观察结果一样,前两种策略的泛化能力很差,而基于Circular padding和full convolution的模式效果最好。接着作者为了降低边界的影响,采用了前文介绍卷积平移不变性里面提到的blur pooling+Tri3卷积核。然后对比S-conv+circular padding和F-conv两种策略对于不同的图像对角平移的鲁棒性:

结果显示Full conv模式效果更好,在后续实验中还说明了其有助于降低过拟合风险,对于小数据集更有效。

代码即将开源:https://github.com/oskyhn/CNNs-Without-Borders

参考资料

[1] CNN是怎么学到图片内的绝对位置信息的? - 知乎

[2] CNN是靠什么线索学习到深度信息的?——一个经验性探索 - 知乎

[3] 证伪:CNN中的图片平移不变性 - 知乎

[4] Zhang R. Making Convolutional Networks Shift-Invariant Again[C]//International Conference on Machine Learning. 2019: 7324-7334.

[5] Dijk T, Croon G. How Do Neural Networks See Depth in Single Images?[C]//Proceedings of the IEEE International Conference on Computer Vision. 2019: 2183-2191.

[6]Islam M A, Jia S, Bruce N D B. How much Position Information Do Convolutional Neural Networks Encode?[C]//International Conference on Learning Representations. 2019.

[7]Wang X, Kong T, Shen C, et al. SOLO: Segmenting Objects by Locations[J]. arXiv preprint arXiv:1912.04488, 2019.

[8]Liu R, Lehman J, Molino P, et al. An intriguing failing of convolutional neural networks and the coordconv solution[C]//Advances in Neural Information Processing Systems. 2018: 9605-9616.

[9]Novotny D, Albanie S, Larlus D, et al. Semi-convolutional operators for instance segmentation[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 86-102.

[10]Li B, Wu W, Wang Q, et al. Siamrpn++: Evolution of siamese visual tracking with very deep networks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 4282-4291.

[11] Azulay, Aharon, and Yair Weiss. "Why do deep convolutional networks generalize so poorly to small image transformations?." Journal of Machine Learning Research 20.184 (2019): 1-25.


推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文讨论了如何在不使用SearchBar display controller的情况下,单独使用SearchBar并捕获其textChange事件。作者介绍了实际状况,即左侧SliderMenu中的SearchBar需要在主页TableView中显示搜索结果。然后,作者提供了解决方案和步骤,帮助读者实现这一功能。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
author-avatar
淡漠少_341
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有