跑跑跑pao
对于目标检测方向并不是特别熟悉,本文记录一下RCNN, fast-RCNN, faster-RCNN, mask-RCNN这4篇有关目标检测的论文笔记和学习心得。
R-CNN的意思就是Region based,主要思路就是根据一张图像,提取多个region,再将每个Region输入CNN来进行特征的提取。因此RCNN就可以分为 Region proposals , Feature extraction 两个主要部分,提取的特征就可以输入任意一个分类器来进行分类。 模型的流程图如下:
在训练的时候,首先使用的是已经训练好的CNN网络作为特征提取器,但是由于预训练是在分类数据集上,因此在应用到检测之前要做finetune。也就是说,为了将用ImageNet数据集训练的网络应用到新的任务(检测),新的数据集(region)上,作者将原来的CNN最后的1000类的fc层,更改为了 层, 代表待检测的物体的类别数。然后,对于所有的region,如果它和ground truth的重叠率大于,就认为是正类。 对于分类器的训练,作者发现选择多大的IoU来区分正类和负类非常关键。并且,对于每一类,都会训练一个分类器。
框的回归非常重要,在对每一个region proposal使用分类器进行打分评价之后,作者使用一个回归器来预测一个新的框作为结果。这个回归器使用的特征是从CNN中提取的特征。回归器的训练中,输入是 region proposal 的 和ground truth的 ,目标是学习一种变换,使得region proposal通过该变换能够接近ground truth。同时,希望这种变换拥有尺度不变性,也就是说尺度变化的话,变换不会改变。 如下图所示,每一个regressor会学习一组参数,特征输入是pool 5的特征输出,拟合的目标是 。
Fast-RCNN 主要解决的问题是在RCNN中对于每一个region proposal都进行特征提取,会产生非常多的冗余计算,因此可以先对一张图像进行特征提取,再根据region proposal在相应的特征上进行划分得到对应region的特征(映射关系)。 这样便可以实现共享计算提高速度,但是与SPPnets不同,SPPnets在一副图像得到对应的特征后,从这张图像的特征上proposal对应的部分,采用空间金字塔池化,如下图:
RoI pooling的方法很简单,类似于空间金字塔pooling,它将proposal部分对应卷积层输出的特征(称之为RoI,因为用于做pooling的特征是 region of interest,也就是我们感兴趣的区域)划分成 块,然后对每一块求最大值,最终得到了一个 的特征图。可以看出,它只是空间金字塔pooling的一部分。 但是SPP-nets的空间金字塔也是可以求导的,那么它到底不好在哪里呢?因为当每一个RoI都可能来源于不同的图像的时候(R-CNN和SPPnets的训练策略是从一个batch的不同图像中,分别挑选一个proposal region),SPPNets的训练非常地低效,这种低效来源于在SPPnets的训练中,每个RoI的感受野都非常地大,很可能对应了原图的整个图像,因此,得到的特征也几乎对应了整张图像,所以输入的图像也就很大。 为了提高效率,Fast-RCNN首先选取 个图像,再从每个图像上选择 个RoI,这样的效率就比从每个图像提取一个RoI提高了 倍。
为了将分类和框回归结合起来,作者采用了多任务的loss,来进行联合的训练。具体来说就是将分类的loss和框回归的loss结合起来。网络的设计上非常直接,就是将RoI得到的特征接几个FC层后,分别接不同的输出层。对应于分类部分,特征会接一个softmax输出,用于分类,对于框回归部分,会接一个输出4维特征的输出层,然后分别计算loss,用于反向传播。loss的公式如下:
回归的target可以参考前面的R-CNN部分。
notes
为什么比fast还fast呢?主要原因是在这篇论文中提出了一个新的层:RPN(region proposal networks)用于替代之前的selective search。这个层还可以在GPU上运算来提高速度。 RPN的目的:
为了能够进行region proposal,作者使用了一个小的网络,在基础的卷积层输出的特征上进行滑动,这个网络输入大小为 ,输入后会映射(用 的卷积)为一个固定长度的特征向量,然后接两个并联的fc层(用 的卷积层代替),这两个fc层,一个为box-regressoin,一个为box-classification。如下图:
在每一个滑动窗口(可以参考 ),为了考虑到尽可能多的框的情况,作者设计了anchors来作为region proposal。anchors就是对于每一个滑动窗口的中心位置,在该位置对应的原图位置的基础上,按照不同的尺度,长宽比例框出 个不同的区域。然后根据这些anchors对应的原始图像位置以及区域,和ground truth,就可以给每一个滑动窗口的每一个anchor进行标记,也就是赋予label,满足一定条件标记为正类(比如和ground truth重叠大于一个值),一定条件为负类。对于正类,就可以根据ground truth和该anchor对应的原图的区域之间的变换关系(参考前面的R-CNN的框回归),得到回归器中的目标,用于训练。也就是论文中的loss function部分:
自然地,也就要求RPN的两个并联的FC层一个输出2k个值用于表示这k个anchor对应的区域的正类,负类的概率,另一个输出4k个值,用于表示框回归的变换的预测值。
对于整个网络的训练,作者采用了一种叫做 4-step Alternating Training 的方法。具体可以参考论文。
与之前的检测任务稍有不同,mask r-cnn的任务是做instance segmentation。因此,它需要对每一个像素点进行分类。 与Faster R-CNN不同,Faster R-CNN对每一个候选框产生两个输出,一个是类别,一个是bounding box的offset。Mask R-CNN新增加了一个输出,作为物体的mask。这个mask类似于ps中的蒙版。
与Faster R-CNN类似的是,Mask R-CNN同样采用RPN来进行Region Proposal。但是在之后,对于每一个RoI,mask r-cnn还输出了一个二值化的mask。
不像类别,框回归,输出都可以是一个向量,mask必须保持一定的空间信息。因此,作者采用FCN来从每个RoI中预测一个 的mask。
由于属于像素级别的预测问题,就需要RoI能够在进行特征提取的时候保持住空间信息,至少在像素级别上能够对应起来。因此,传统的取最大值的方法就显得不合适。 RoI Pooling,经历了两个量化的过程: 第一个:从roi proposal到feature map的映射过程。 第二个:从feature map划分成7*7的bin,每个bin使用max pooling。
为此,作者使用了RoIAlign。如下图
为了避免上面提到的量化过程
可以参考
作者使用ResNet作为基础的特征提取的网络。 对于预测类别,回归框,mask的网络使用如下图结构:
整体看完这几篇大佬的论文,虽说没有弄清楚每一个实现细节,但是大体上了解了算法的思路。可以看出,出发点都源于深度神经网络在特征提取上的卓越能力,因此一众大神试图将这种能力应用在检测问题中。从R-CNN中简单地用于特征提取,到为了提高速度减少计算的Fast R-CNN,再到为了将region proposal集成进入整个模型中,并且利用GPU加速的RPN,也就是Faster R-CNN。再到为了应用于instance segmentation任务中,设计的RoIAlign和mask。包括bounding box regression,pooling层的设计,训练方法的选择,loss的设计等等细节,无一不体现了大师们的思考和创造力。 可能在我们这些“拿来”者的眼中,这些方法都显得“理所应当”和巧妙,好用,但是,它们背后隐藏的选择和这些选择的思考却更值得我们学习。 以及,对待每一个问题,如何设计出合理的解决方案,以及方案的效率,通用性,更是应该我们努力的方向。
无锡美艺馨
论文地址: 前置文章:10/16、10/17、10/18
本文提出了Point Fractal Network(PF-Net),旨在从不完整的点云数据中恢复点云,克服了之前方法修改现有数据点、引入噪声和产生几何损失的缺点。
由前置文章可知,之前的点云修复方法是输入不完整的点云,输出完整的点云,但这样会导致原有信息的缺失。这篇文章提出PF-Net,主要特点有三个:
网络的整体结构如下:
网络详细推理步骤如下:
损失函数使用完整性损失和对抗损失的加权平均,完整性损失使用L-GAN中提出的CD距离:
对抗损失使用GAN中常见的损失函数
感觉这篇文章对多尺度的运用非常极致,在编码器、解码器和CMLP中都应用了这种思想,最后的效果也非常不错,很值得借鉴。
论文地址:
PointNet提出一种基础的网络结构,可以用于点云分类、部分分割和语义分割等多种任务。在这篇文章之前,点云数据的处理方式是将点云数据转换为多个二维的视图或三维的体素形式,然后应用2D/3D CNN进行处理,但这样引入了多余的体积,效率不高。本文是第一个直接使用点云数据的神经网络。(其实可以这样类比,在二维图像处理中,假设图像是二值化的,传统方法是将这个图像直接丢到CNN里面,但如果背景特别多会比较浪费资源。直接使用点云数据相当于直接将前景像素的坐标输入到神经网络里面,对稀疏数据会有比较好的性能,但因为以下三个问题导致直接使用坐标信息比较困难) 由于点云的排列是无序的(可以想象,点云中任意一点排在前面对点云的表达都是相同的)、点云之间是有相互作用的(相邻的点云才能构成形状)、点云在某些变换下具有不变性(比如旋转不会改变点云的类别)这些特性,要求神经网络既能处理无序的数据,又能捕捉全局的结构特征,同时对刚性变换不敏感。基于这些条件,作者提出了如下的网络结构:
可以简要分析一下网络的工作流程,以点云分类问题为例:
感觉网络的结构虽然简单,但是却很好地满足了点云数据自身特性对神经网络的要求。而且我觉得在图像处理中,也有时候必须用到坐标信息或者一些标量特征,这篇文章的方法对于怎样将这些特征融合进CNN里面也有一定的启发意义。
论文地址:
这篇文章的主要工作是:
首先来看衡量两个点云相似程度的指标部分,作者首先给出了两个距离,EMD和CD:
在计算上,CD更为简便,而且EMD是不可导的。
基于这两种距离,作者引入了三种衡量两个点云相似程度的指标:JSD、Coverage和MMD:
定义了指标后,就可以实现自动编码器和生成模型了。作者提到了四种结构,分别是:
作者同时验证了AE的一些其他功能,比如如果给AE的编码器输入不完整的点云数据,即可训练得到点云复原的模型。使用SVM对低维表示进行分类,即可进行点云分类的任务,证明AE在点云数据形式中的潜在应用较为广泛。
论文地址:
PointNet++针对PointNet提取局部信息能力不强的弊端,提出了一种层次神经网络,可以更好地提取局部信息。其中心思想是将整个点云分割成若干个小部分来提取信息,然后将每个小部分整合成较大的部分,提取更高层次的信息。类似于CNN中卷积和下采样的思想。首先来看网络结构图:
网络大概可以分为两个部分,左边是层次的点云特征提取网络,右边是针对不同任务的解码网络。 特征提取分为若干个set abstraction模块,每个模块又分为采样层、分组层和特征提取层。
得到了较高层次的特征后,对不同的任务需要不同的解码网络。对分类网络来说比较简单,使用全连接即可。对分割网络来说,由于对每个点都需要输出数值,则需要类似上采样的操作。具体的实现作者使用了插值的方法,将较少的点插值到较多的点上去。首先找到插值的目标坐标,然后寻找K个距离最近的已知点,以距离的倒数作为权重,将K个点的特征做加权平均,作为这个点的特征。然后使用之前特征提取中得到的该点的特征与当前特征做一个拼接,即可得到最终特征(类似U-Net的skip connection)。公式如下:
感觉这篇文章和PF-Net的思想差不多,都是希望提取多尺度的特征。但是思路不一样,都值得借鉴。
不老的传说kz
Inception系列的v1,v2读完了,该v3了,当年在渣浪做的视频推荐,提取视频特征的网络用的就是Inception v3。不过作者的标题没用v3,而是开始『Rethinking』了。
2777次。和v1,v2完全不在一个量级上。
2015年12月刊发于arXiv。比后来横空出世的ResNet也就早了几天。一作回归到了v1的作者Christian Szegedy,v2的作者Sergey Ioffe这次是三作,看来两人好基友,每次都是组团出现
1 提出一些设计网络架构的通用准则
2 各种分解卷积的骚套路
本文探索了各种扩大网络的方式,目标是通过合适的卷积分解和有效的正则化来尽可能有效地利用所增加的计算。
相比VGG和AlexNet,Inception的计算量和参数量都大大降低,因此可以用于大数据和移动设备。不过,如果架构只是简单的缩放,大部分计算带来的收益可能会立即丢失。
本文将介绍一些通用的准则和优化理念用来更有效的扩大卷积网络。
作者反复强调以上只是部分经验,实际使用时需根据具体情况抉择。。
GoogLeNet最初的收益大多数来自广泛使用的降维。这可以被视为以一种更有效的计算来分解卷积的特例。
因为Inception网络是全卷积的,每个权重对应于每次激活的一次乘法,因此任何计算代价的减少也会引起总参数量的减少。这意味着可以通过合适的分解,得到更可分的参数并因此加速训练。
较大的filter(例如,5×5或7×7)在计算方面往往不成比例地昂贵。
用两个3x3卷积代替一个5x5卷积
做了控制实验证明这种策略有效。
很自然的想到能不能把3x3继续缩小为2x2,作为比较,将3x3分解为2个2x2只能节约11%的计算,不过用3x1和1x3能节约33%。
理论上,还可以更进一步,将nxn都用1xn和nx1来代替。实践发现这种分解在早期的层效果并不好,但在中间的层效果非常好(对于m x m的特征图,m在12到20之间)
Inception-v1中使用的辅助分类器最初动机就是为了克服深层网络中的梯度消失问题,将有用的梯度使浅层立即可以使用。不过,经实验发现,在训练早期这样并不能改进收敛,只是在训练后期,比没有辅助分类器的网络稍微好一点。这说明在Inception-v1中的假设是错误的(自己打自己脸,佩服,有勇气承认,没有混过去)
传统上,卷积网络通过池化操作来减小feature map的大小。为了避免表示性的bottleneck,在执行平均或最大池化前都会扩展filter的维度。
图9的左图虽然减小了网格尺寸,不过违反了通用原则1,过早的引入了bottleneck,右图倒是没违反,不过带来了3倍的计算量。
图10给出了解决办法,即引入两个并行的stride都为2的block:P和C,之后再联结起来。这样不仅代价更低而且避免了表示性的bottleneck。
(虽然这里是官方定义的v2,不过大家貌似都将BN-Inception认为是v2?)
把起初的7x7卷积分解为3个3x3卷积,用了不同结构的Inception块(图5,6,7),总共42层,计算代价只比v1高倍。
提出了一种机制,通过估计训练期间标签丢失的边缘化效应来给分类层加正则。
分析了交叉熵损失过于自信导致过拟合的原因。提出一种机制鼓励模型减少这种自信。
对于标签为y的样本,将标签分布 替换为 在实验中,使用均匀分布 ,这样式子变为 称这种对真实标签分布的改变为标签平滑正则(label-smoothing regularization LSR)
另一种对LSR的解释是从交叉熵的角度出发 第二项损失惩罚了预测的标签分布p与先验u的偏差。这种偏差也可以通过KL散度等效地捕获,因为 ,而 是固定的。
在ILSVRC2012中,设置 , , 。带来了的提升。
用tensorflow训练了50个模型(这是Inception系列论文中第一次用tf),batch_size=32,epochs=100。起初的实验用带动量的SGD,decay=。但是最佳的模型是RMSProp,decay=, 。学习率用,每2个epoch衰减(指数衰减率为)。
另外,发现用RNN中的梯度裁剪(设置阈值为)可以使训练稳定。
常识 是,采用更高分辨率感受野的模型往往会显著提高识别性能。如果我们只是改变输入的分辨率而不进一步调整模型,那么最后就是使用低计算量的模型来解决更困难的任务。
问题转化为:如果计算量是恒定的,更高的分辨率能有多少帮助?
尽管低分辨率的网络需要训练更久,但是最终的效果差不太多。然而,只是根据输入分辨率简单的减小网络的尺寸结果往往会很糟糕。
(这部分的结论是更高分辨率的输入用更复杂的模型?)
本文将使用了所有提升的Inception-v2综合体称为Inception-v3。
我屮,表4有bug,Top-5和Top-1的标题反了
提供了几条设计准则,基于此来扩大卷积网络。
感觉Inception结构太复杂了,充满了魔数,看起来没有ResNet那种统一的简洁美。另外,感觉这篇讲的有点散,有种拼凑感。。要不是Label smoothing提升的不是特别多,应该都能专门拿出来写一篇。最受用的是几点设计准则,应该会有助于理解后来出现的网络的设计理念。
栈爆上一个用pandas实现label smoothing的示例
pytorch的官方实现只有v3,没有其他的
花书的节(向输出目标注入噪声)解释了label smoothing背后的原理。
找到原因,重新做实验。如果做出的结果不显著,要分析一下,找出原因,重新做实验得结果。
无可奈何需要
(该分享持续更新中...) 这篇论文主要有三个贡献点: 目前,物体检测、语义分割等技术都是集中在如何在图片上检测出物体,但是忽略了物体与物体之间的关系。
能不能给我发一份呢?
每一个孩子都经历过被论文支配的痛苦,大多数学生写完了文之后要去相关网站进行查重,如果某一位学生写出来的作文不合格,这位学生会根据不合格的原因进行修改。还有一部分