网站首页 > 技术文章 正文
前段时间看到了几篇有意思的文章,也参考了一些相关的讨论,这里想对CNN中的平移和尺度的不变性和相等性,以及CNN对于目标相对和绝对位置、深度的预测原理进行探讨。这些内容对于一些特定任务很重要,比如目标检测、目标分割、深度估计、分类/识别以及单目标跟踪中的置信图预测等。
一、CNN是否存在平移和尺度的不变性和相等性
1.1 不变性和相等性的定义
在介绍卷积神经网络(CNN)之前,我们对于不变性和相等性的理解可能来自于传统图像处理算法中的,平移、旋转、光照和尺度等不变性,比如HOG梯度方向直方图,由于cell的存在,其对于平移、旋转有一定的不变性,另外由于对图像局部对比度归一化的操作,使其对于光照也有着一定的不变性。又比如说SIFT特征提取,其对于以上四点都有着不变性,其中由于尺度金字塔,使得对尺度也有不变性。这里我们对于不变性的理解就是,同一对象发生平移、旋转、光照变化、尺度变换甚至形变等,其属性应该一致。下面我们给出具体的不变性和相等性的定义。
其中不变性(invariance)的定义正如上文所说,因此其形式为:
而对于相等性(equivalence),顾名思义,就是对输入进行变换之后,输出也发生相应的变换:
不过如果我们只考虑输出对于输入不变性和相等性的情况,则会难以理解,因为我们更多地是想象着特征层面的映射,比如:
那么特征层面对于输出的影响我们可能考虑得比较少,但是却实质存在,比如目标在图像中的平移和尺度等变换,在目标检测任务中,必须要使得网络具有相关的变换相等性,由此捕捉目标的位置和形状变化。而在图像分类、目标识别、行人重识别等任务中,又必须使得网络具有相关变换的不变性。这两点也是目标检测和行人检索领域中一个经典的矛盾问题,目前好像还没有特别好的解决,更多地是分阶段地执行不同的任务,防止特征共用。比如:经典的两阶段目标检测任务中,第一阶段是粗检测和前景背景分类,第二阶段是精修和具体类别分类,有一定的偏重。行人检索算法则大多是先检测后识别的策略。当然除了不变性和相等性的问题,还存在类内差异的问题,比如不同的人对于检测而言都是行人类别,对于识别而言则是不同的人,这对于特征提取也存在挑战。
1.2 CNN网络的执行过程
我记得我几年前第一次接触到深度学习的时候,对于全连接和CNN的局部连接形式,都有平移、尺度不变性的说法。对于全连接网络,由于下一层的每个节点都会与上一层进行连接:
因此无论输入发生了平移、尺度等什么变换,只要其属性没变,全连接网络更能捕捉其中的不变性。而对于卷积神经网络,我们都知道两个特点:局部连接和权值共享。
对于局部连接,因为全连接参数太多,容易造成过拟合,并且图像领域更多地关注局部细节信息,所以局部连接方式有效。至于权值共享,也有减少参数的作用,很像图像处理中的滤波器。我们早期对于其不变性的理解更多是遵循一个宏观的感受,即由于卷积核的移位滤波,上一层的特征到下一层的特征相对位置宏观不变,直到最后输出,类似于全连接的效果,从而获得不变性。
1.3CNN网络潜在问题与改进
正因为我刚说的宏观不变,使得输入在经过多次卷积、池化之后,微观/细节的变化累积放大,从而失去了这种不变性,接下来我会结合两篇论文进行介绍。
第一个是为了解决CNN平移不变性对抗性攻击的一篇ICML2019论文《Making Convolutional Networks Shift-Invariant Again》https://arxiv.org/pdf/1904.11486.pdf。这篇文章主要讨论了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?》http://www.jmlr.org/papers/volume20/19-519/19-519.pdf。作者首先给出了几组示例,分别表示了平移、尺度以及轻微图像差异对网络预测分类置信度的影响:
作者认为CNN忽视了采样定理,这一点之前Simoncelli等人已经在论文Shiftable multiscale transforms http://persci.mit.edu/pub_pdfs/simoncelli_shift.pdf中验证了二次采样在平移不变性上的失败,他们在文中说:
我们不能简单地把系统中的平移不变性寄希望于卷积和二次采样,输入信号的平移不意味着变换系数的简单平移,除非这个平移是每个二次采样因子的倍数。
我们现有的网络框架中,越深的网络,降采样次数越多,因此出现的问题更多。紧接着,作者提出了几点论述:
- 如果 是经过卷积操作且满足平移不变性的特征,那么全局池化操作 也满足平移不变性;
- 对于特征提取器 和降采样因子 ,如果输入的平移都可以在输出上线性插值反映出来:由香农-奈奎斯特定理知, 满足可移位性,要保证采样频率至少为最高信号频率的2倍。
接下来,作者对这些问题做了一些改进尝试:
- 抗锯齿,这个就是我们刚刚介绍的方法;
- 数据增强,当前在很多图像任务中,我们基本都会采用随机裁剪、多尺度、颜色抖动等等数据增强手段,的确也让网络学习到了部分不变性;
- 减少降采样,也就是说只依赖卷积对于输入尺度的减小来变化,这一点只对小图像适用,主要是因为计算代价太高。
二、CNN对于位置和深度信息的预测
2.1CNN如何获取目标的位置信息
最早接触神经网络和深度学习相关任务时,我的感觉就是这类算法本质是做的分类任务,比如图像分割是对前景背景的分类和具体类别分类,识别任务就是类间类内的区分任务。其中图像分割任务就利用了CNN中的部分相等性,那么对于目标检测任务中的目标位置回归是怎么获取的呢?我们可以知道的是同样是对目标位置的搜索,在单目标跟踪任务中,存在有置信图:
但是置信图本质上是对区域进行搜索得到的,因此可以近似为对多个子区域的识别过程,所以单目标跟踪中的目标定位也可以用分类的理解,但是目标检测则不好用分类来理解了。
接下来我们思考一个问题,我们所设计的网络究竟包含了哪些信息?图像特征、网络结构(卷积核大小、padding)。从上一章我们可以知道,网络可以学习到一定的相等性:
因此,通过不断地训练,网络在最后的特征输出中是可以通过对应的特征数值和区域大小,结合一定的倍数(降采样大小)估计目标尺度的。但是对于目标的位置,我们人眼对于目标位置的判定是通过坐标系的,即目标距离图像的边缘距离,但是网络是如何了解这一信息的呢?《How much Position Information Do Convolutional Neural Networks Encode?》https://arxiv.org/pdf/2001.08248.pdf这篇文章做出了回答。
作者首先做了一组实验:
对于不同的输入图像,采用多种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?https://arxiv.org/pdf/1905.07005.pdf这篇文章给出了回答,关于这篇文章NaiyanWang老师已经在博客里讨论过,我这里也就再整理下。
我们可以看到,物体的绝对深度与相机位姿有着很大关系,那么CNN如何学习到这种需要几何先验的绝对信息的呢?作者做了这样一个实验:
上图中作者做了三组实验:同时变化目标位置和尺寸、只变化位置以及只变化尺寸,我们从上面的定性结果好像看不出什么问题,下面是定量的结果:
可以发现,尺度对于深度信息的预测没有什么影响,也就是说CNN网络是通过目标纵坐标来估计深度的,所以说网络实际上是在过拟合训练集,从中学习到一些固定场景下的深度和相对位置的对应关系。
作者又讨论了相机运动对于深度预测的影响,既然深度与目标纵坐标有关系,那么pitch角的影响应该很大:
可以发现,pitch的确影响比较大,相对的roll的影响就比较小了:
最后作者还讨论了颜色和纹理对深度估计的影响:
可以发现,仅仅是改变目标的颜色纹理,深度估计的效果也会下降,可将CNN网络在训练时有多“偷懒”,不知道如果将上述实验变成数据增强的手段的话会让深度估计网络失效还是变强。
2020.3.18更新
昨天碰巧看到一篇CVPR2020的文章《On Translation Invariance in CNNs: Convolutional Layers can Exploit Absolute Spatial Location》https://arxiv.org/pdf/2003.07064.pdf,其中也提到了CNN中的平移不变性问题和绝对位置信息编码问题,其切入点是CNN中的边界问题。
作者首先以三种卷积方式为例,full/same/valid,各自的区别在于padding的大小,具体方式我就不细说了,给个示意图:
其中红色部分表示padding,绿色部分表示边界区域。很明显,valid模式下卷积核最右边的1永远无法作用于绿色部分的1,same模式下的卷积核最右边 1永远无法作用于绿色部分的1 。作者以zero-padding和circular-padding两种模式做了一个例子说明:
可以看到Class-1中前两个例子都没有检测到1,valid和same+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] https://zhuanlan.zhihu.com/p/99766566
[2] https://zhuanlan.zhihu.com/p/95758284
[3] https://zhuanlan.zhihu.com/p/38024868
[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.
作者:知乎-黄飘
地址:https://www.zhihu.com/people/huang-piao-72
猜你喜欢
- 2024-10-28 使用卷积神经网络构建图像分类模型检测肺炎
- 2024-10-28 机器不学习:卷积神经网络CNN与Keras实战
- 2024-10-28 我是如何用5个概念理解的卷积神经网络?(Hadoop大数据)
- 2024-10-28 深度学习笔记:图像识别和卷积网络
- 2024-10-28 Tensorflow Conv2D和MaxPool2D原理
- 2024-10-28 PyTorch中傅立叶卷积:计算大核卷积的数学原理和代码实现
- 2024-10-28 一文看完卷积神经网络及实现机制 卷积神经网络的原理与实现
- 2024-10-28 卷积神经网络原理及其C++/Opencv实现(6)—前向传播代码实现
- 2024-10-28 「周末AI课堂」卷积之上的新操作|机器学习你会遇到的“坑”
- 2024-10-28 使用Keras进行深度学习:(一)Keras 入门
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)