最近关于 A n c h o r F r e e Anchor \ Free Anchor Free的目标检测结构如雨后春笋般出现,我也跟一波学习,发现,里面涉及到很多细碎的知识,没办法啊,只有一层一层拨开它的心!道阻且长啊~~~~~写的不好望指点哈!旨在学习交流,最重要的还是记录!
F C N ( F u l l y C o n v o l u t i o n a l N e t w o r k s f o r S e m a n t i c S e g m e n t a t i o n ) − − − 2015 C V P R FCN \ (Fully \ Convolutional \ Networks \ for \ Semantic \ Segmentation)---2015 \ CVPR FCN (Fully Convolutional Networks for Semantic Segmentation)−−−2015 CVPR
图像语义分割:给定一张图片,对图片上每一个像素点进行分类!但是与图像分类目的不同,语义分割模型要具有像素级的密集预测能力才可以。
传统的 C N N CNN CNN做语义分割:将像素周围的一块(一个小区域)作为 C N N CNN CNN的输入,也就是利用每个像素周围的图像块所属类别将该像素分成该类别。简单的说:以某个像素点中心取一个区域,取图像块的特征做样本训练分类器,分类结果作为此像素点的结果。使用这种方法的主要原因是网络后面具有全连接层,全连接层输入需要固定大小。
上述存在三个缺点:
然后就出现了这篇文章: F C N ( F u l l y C o n v o l u t i o n a l N e t w o r k s f o r S e m a n t i c S e g m e n t a t i o n ) − 2015 C V P R FCN \ (Fully \ Convolutional \ Networks \ for \ Semantic \ Segmentation)-2015 \ CVPR FCN (Fully Convolutional Networks for Semantic Segmentation)−2015 CVPR。改变了原来的 C N N CNN CNN结构,去除了全连接层,进行密集预测。
除了全连接层结构,池化层也是语义分割里面一个棘手的问题。池化层可以丢弃部分位置信息,增大感受野。这对识别有帮助,因为不需要位置空间信息。但是语义分割方法需对类别图进行精确调整,因此需要保留位置信息。这篇论文中使用上采样来逐步恢复细节和相应的位置信息。
先简单介绍一下 F C N FCN FCN:全卷积网络,模型由卷积层、池化层组成(没有全连接层),可以接受任意大小的输入,网络的示意图如下:
输入一张图片,网络由浅到深,随着卷积层和池化层不断作用,产生的特征图分辨率越来越小,但是通道数会越来越多。最后通过逐层上采样得到一个和输入形状一样的结果。
一般图像分类 C N N CNN CNN网络在最后一层卷积层后会跟若干个全连接层, 作用:将卷积层产生的特征图映射成一个固定长度的特征向量。论文中的例子:输入一张猫的图片, 经过 C N N CNN CNN网络, 得到一个长为1000的输出向量, 这个向量经过 S o f t m a x Softmax Softmax归一化,分别对应1000个类别的概率,这样我们可以得到输入图像属于每一类的概率, 在下例中我们可以看出图像属于 “ t a b b y c a t ” “tabby \ cat” “tabby cat”这一类可能性最大。
这篇论文里面是将全连接层转化为卷积层。上图中我们可以看出 F C N FCN FCN将最后3层转换为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,1,1)、(4096,1,1)、(1000,1,1)。
下面介绍全连接层怎么转成卷积层:拿上图为例,最后一层卷积层的输出为 7 ∗ 7 ∗ 256 7*7*256 7∗7∗256 。后面再接三个全连接层变为(1,4096),(1,4096),(1,1000)(一维向量)。我们可以把这三个全连接层变为卷积层。
变换方式:
这样转换后的网络输出的就是一个热力图 ( h e a t m a p ) (heatmap) (heatmap),这个图明显二维的。
参考自:(https://zhuanlan.zhihu.com/p/30195134)
我们可以看出,对原图像进行卷积 c o n v 1 、 p o o l 1 conv1、pool1 conv1、pool1后原图像缩小为1/2;之后对图像进行第二次 c o n v 2 、 p o o l 2 conv2、pool2 conv2、pool2后图像缩小为1/4;接着继续对图像进行第三次卷积操作 c o n v 3 、 p o o l 3 conv3、pool3 conv3、pool3缩小为原图像的1/8,此时保留 p o o l 3 pool3 pool3的 f e a t u r e M a p feature \ Map feature Map;接着继续对图像进行第四次卷积操作 c o n v 4 、 p o o l 4 conv4、pool4 conv4、pool4,缩小为原图像的1/16,保留 p o o l 4 pool4 pool4的 f e a t u r e M a p feature \ Map feature Map;最后对图像进行第五次卷积操作 c o n v 5 、 p o o l 5 conv5、pool5 conv5、pool5,缩小为原图像的1/32,然后把原来CNN操作中的全连接变成卷积操作 c o n v 6 conv6 conv6,图像的 f e a t u r e M a p feature \ Map feature Map数量改变但是图像大小依然为原图的1/32,此时图像不再叫 f e a t u r e M a p feature \ Map feature Map而是叫 h e a t M a p heatMap heatMap(热力图)。
现在我们有1/32尺寸的 h e a t M a p heatMap heatMap,1/16尺寸的 f e a t u r e M a p feature \ Map feature Map和1/8尺寸的 f e a t u r e M a p feature \ Map feature Map,1/32尺寸的 h e a t M a p heatMap heatMap进行上采样操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此把conv4中的卷积核对上一次上采样之后的图进行反卷积,最后把conv3中的卷积核对刚才上采样之后的图像进行再次反卷积补充细节,最后相加,完成了整个图像的还原。
其中上采样有3种常见的方法:双线性插值,反卷积(转置卷积),反池化。这边我只讨论反卷积。
反卷积(转置卷积):反卷积是一种特殊的正向卷积,先按照一定的比例通过补 0 来扩大输入图像的尺寸,接着卷积核卷积,再进行正向卷积。简单点说把普通卷积中的卷积核做一个转置,然后把普通卷积的输出作为转置卷积的输入,而转置卷积的输出,就是普通卷积的输入,常用于 C N N CNN CNN中对特征图进行上采样,比如语义分割和超分辨率任务中。我认为:反卷积就是卷积,只是中间 p a d d i n g padding padding下,然后再做卷积。
下面是常规的普通卷积:卷积核为 3 ∗ 3 3*3 3∗3, s t r i d e = 2 stride=2 stride=2, p a d d i n g = 1 padding=1 padding=1。卷积核在红框位置时输出元素1,在绿色位置时输出元素2。我们可以观察到:输入元素 a a a仅和一个输出元素有运算关系,也就是元素1,而输入元素 b b b和输出元素1, 2均有关系。同理 c c c只和一个元素2有关,而 d d d和1,2,3,4四个元素都有关。那么在进行反卷积时,依然应该保持这个连接关系不变。
反卷积(转置卷积):由前面反卷积的定义,将上图得到的绿色特征图作为输入,蓝色特征图作为输出,并且需要保证连接关系不变。也就是说,a只和1有关,b和1,2两个元素有关,其它类推。怎么才能达到这个效果呢(一开始我个人觉得达不到。因为反卷积是可以恢复到原来输入的shape,但是其value值是不一样的?但是先进行上采样,即扩大像素;再进行卷积——就是通过训练学习获得权值,这就有可能了!)。
如下图:
设反卷积的输入是 n ∗ n n*n n∗n,反卷积的输出为 m ∗ m m*m m∗m, p a d d i n g = p padding=p padding=p, s t r i d e = s stride=s stride=s。
条件: ( n + 2 p − k ) % s = 0 (n+2p-k)\%s=0 (n+2p−k)%s=0,根据步数 s t r i d e s strides strides 对输入的内部进行填充,这里 s t r i d e s strides strides 可以理解成输入放大的倍数,即在 i n p u t input input 的每个元素之间填充 0 ,0 的个数 n 1 n_1 n1 与 s t r i d e s strides strides 的关系为: n 1 = s t r i d e s − 1 n_1=strides-1 n1=strides−1那么此时反卷积的输出就为: m = s ( n − 1 ) + k − 2 p m=s(n-1)+k-2p m=s(n−1)+k−2p
举个例子:选择一个输入 i n p u t input input尺寸为 3 × 3 3 \times 3 3×3 ,卷积核 k e r n e l kernel kernel 尺寸为 3 × 3 3\times 3 3×3 ,步长 s t r i d e s = 2 strides=2 strides=2 ,填充 p a d d i n g = 1 padding=1 padding=1,即 n = 3 , k = 3 , s = 2 , p = 1 n=3,k=3,s=2,p=1 n=3,k=3,s=2,p=1 ,则输出 o u t p u t output output 的尺寸为 m = 2 × ( 3 − 1 ) + 3 = 5 m=2\times(3-1)+3=5 m=2×(3−1)+3=5 。
卷积网络中的每一层数据都是尺寸为 h ∗ w ∗ d h*w*d h∗w∗d的三维数组,其中 h h h和 w w w是特征图的高和宽, d d d是通道数。 F C N FCN FCN网络的训练损失为最后一层中每个像素的 S o f t m a Softma Softmax损失之和。更具体地说,最后上采样个跳层连接之后会输出 N N N张热力图 ( h e a t m a p ) (heatmap) (heatmap),逐个像素的求其在 N N N张图像该像素位置的最大数值描述(概率)作为该像素的分类。
值得研究,体现思想!实验结果不贴!
4. 上采样融合3个pooling层的预测结果。 第三次反卷积步长为8,记为FCN-8s。