目标检测:把图像中的物体使用方框标记起来,不同类别物体应使用不同颜色
目标检测其实是寻找物体边界框(bounding box)回归问题(regression)和对物体分类问题(classification)的统一
遥感目标检测:普通的目标检测是日常生活中的横向的图片,而遥感目标检测基于遥感图像(传感器拍的,一般是卫星遥感图像,从空中俯拍的图像)
旋转框:普通目标仅仅使用水平框即可,但是遥感图像物体的朝向不一定是水平的,所以我们需要旋转框能更契合物体的边界
RoI:RoI(Region of Interest)感兴趣的区域,也就是从目标图像中可能是物体的候选识别区域。
第一张图为普通目标检测,第二张图为遥感目标检测
目标检测大体可以分为两类,双阶段的目标检测器(two-stage detector)和单阶段的目标检测器(one-stage detector)
双阶段的目标检测器在第一阶段首先通常采用 RPN 生成 proposal,是对 anchor 进行分类和回归的过程,即 anchor -> proposal -> detection box
单阶段的目标检测器直接对 anchor 进行分类和回归,也就是 anchor -> detection box,不需要产生RoI的阶段,常见的有YOLO和SSD,因为严重的前景背景不平衡问题(foreground–background class imbalance),所以表现一般不如双阶段的目标检测器,为了解决这个问题可以使用focal loss
前景背景不平衡问题(foreground–background class imbalance):简单来说就是background anchors 远远多于 foreground anchors,在一张图片中,大部分锚点圈中的其实都是我们所不关注的背景,只有很少一部分是我们应该检测出来的物体;
当样本分布失衡时,在损失函数L的分布也会发生倾斜,如果负样本较多,那么负样本就会在损失函数占据主导地位。由于损失函数的倾斜,模型训练过程中会倾向于样本多的类别,造成模型对少样本类别的性能较差。
focal loss:最初由何恺明提出的,最初用于图像领域解决数据不平衡造成的模型性能问题。
在分类问题中我们经常使用交叉熵损失函数
其中p为预测概率大小
对于所有样本,损失函数为:
对于二分类问题,损失函数可以写为:
其中m为正样本个数,n为负样本个数,N为样本总数,m+n=N
当样本分布失衡时,在损失函数L的分布也会发生倾斜,如m< focal loss的形式如下: 在检测任务中,使用交并比(Intersection of Union,IoU)作为衡量指标,来描述两个框之间的重合度。这一概念来源于数学中的集合,用来描述两个集合A和B之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式如下: 在预测任务中,会出现很多冗余的预测框,通过NMS操作可以有效的删除冗余检测的结果。非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。 算法流程: IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数 滑动窗口:比较原始的目标检测方法,给定一个固定尺寸的窗口,根据设定的步伐,一步一步的从左至右、从上至下滑动,把每个窗口输入到卷积神经网络中进行预测和分类,这样做有两个缺点:1、由于窗口尺寸固定,因此不适合形变较大的物体 2、窗口较多,运算量大 目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同。 这里我们介绍其中的一种方法:以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框。 这些边界框被称为锚框(anchor box)。 ---- 《动手学深度学习v2》 预定义边框就是一组预设的边框,在训练时,以真实的边框位置相对于预设边框的偏移来构建训练样本。 这就相当于,预设边框先大致在可能的位置“框“出来目标,然后再在这些预设边框的基础上进行调整。 为了尽可能的框出目标可能出现的位置,预定义边框通常由上千个甚至更多,可以使用Anchor Box在图像的不同位置生成边框,并且能够方便的提取边框对应区域的特征,用于边框位置的回归。 一个Anchor Box可以由:边框的纵横比和边框的面积(尺度)来定义,相当于一系列预设边框的生成规则,根据Anchor Box,可以在图像的任意位置,生成一系列的边框。 由于Anchor box 通常是以CNN提取到的Feature Map 的点为中心位置,生成边框,所以一个Anchor box不需要指定中心位置。 在一幅图像中,要检测的目标可能出现在图像的任意位置,并且目标可能是任意的大小和任意形状。 Anchor Box的生成是以CNN网络最后生成的Feature Map上的点为中心的(映射回原图的坐标),以Faster R-CNN为例,使用VGG网络对对输入的图像下采样了16倍,也就是Feature Map上的一个点对应于输入图像上的一个16×16的正方形区域(感受野)。根据预定义的Anchor,Feature Map上的一点为中心 就可以在原图上生成9种不同形状不同大小的边框,如下图: 我们已经知道RoI(Region of Interest) 是从原始图像中提取的区域,我们将通过Fast R-CNN 来讲RoIPooling,在该例中使用VGG16做特征提取 接着我们需要将RoIs映射到VGG16的输出 feature map上,如下图只举例了四个RoI 量化是将输入从一大组值(如实数)约束为一组离散的值(如整数)的过程。 我们feature map 上原始的 RoI 如下所示: RoIPooling在处理过程中丢失了大量数据,这会降低模型的精准度,RoIAlign和RoIPooling之间的主要区别是量化,RoI Align没有将量化用于数据池化。Fast R-CNN应用了两次量化如下图,第一次在映射过程中,第二次在池化过程中。 当我们有了所有的点我们可以应用双线性插值对这个方框进行数据采样。图像处理中常用双线性插值对颜色进行采样,其方程如下: 遥感目标检测中的物体总是非常的拥挤,比如按规则排列的一排排汽车、船只等,并且在大尺度的遥感图像中某些目标非常小,同时物体带有任意的方向。在后文中,我们将依次解决这三个问题 1.目标检测方法问题: 2.目标检测中的特征对齐问题: 特征对齐往往指的是卷积特征和锚框(anchor box)或者RoI之间的对齐问题,依靠对不齐的目标检测器很难获得高精度的检测 与上述方法不同,我们在锚框的指导下调整特征取样位置,从而减缓了基于坐标轴的卷积特征和任意方向物体之间的对齐问题。 3.回归和分类之间的不一致问题: 目标检测通常包含下述两个平行的任务:边界框回归和目标物体分类,他们从骨干网络(backbone network)共享相同的特征,分类的分数往往被用于反映定位的精准性。 在后处理阶段(例如NMS),通常会存在分类得分和定位精准度之间的不一致问题,有高分类得分的目标检测可能会产出很低定位精准度的边界框,然而定位准确的检测框因为分类分数低会经过NMS而被剔除掉。 如下图,绿框比红框定位精准,但是,由于红框分类分数(cls conf = 0.785)高于绿框(cls conf = 0.586),导致NMS过程中,反而保留了定位较差的红框。 另外,从骨干网络中的共享特征并不同时适用于分类和定位这两个问题,我们首次使用ARF对方向信息进行编码,然后为回归问题提取方向敏感特征,为分类问题提取方向不变特征。 Single-Shot Alignment Network ( S 2 A − N e t S^2A-Net S2A−Net,单次对齐网络)是单阶段的目标检测器,包含FAM(feature alignment module,特征对齐模块)和ODM(oriented detection module,带方向检测模块)两个模块。 FAM(特征对齐模块)使用ARN(anchor refinement network锚点改善网络)产生高质量的锚点,使用alignment convolution(AlignConv,对齐卷积层)根据对应的锚框(anchor box)将特征对齐,相比于其他框架使用的密集采样锚点不同,该网络在特征图中每一个位置只使用一个方形的锚点,然后ARN将该锚点改进为高质量的旋转锚点。接着AlignConv对齐卷积层根据相应锚点的形状、大小和方向将特征排列起来。 在ODM(oriented detection module,带方向检测模块)中,首次采用active rotating filters (ARF,主动旋转过滤器)将方向信息编码,提供对方向敏感的特征,接着通过池化对方向敏感的特征提取出方向不变的特征,最后将特征分别输入回归子网络和分类子网络产生最后的预测。 S 2 A − N e t S^2A-Net S2A−Net是一个全卷积网络(FCN),我们可以将一张图片输入网络而不需要复杂的RoI操作。首先将输入图片输入主干网络提取特征金字塔,然后特征金字塔输入FAM提供改善过后的锚点和已对齐的特征。之后ODM将方向信息编码提供出具有高可信度的预测。最后我们选出分数最高的前k个预测,使用NMS得出最后的检测结果。 S 2 A − N e t S^2A-Net S2A−Net的结构如下图所示 S 2 A − N e t S^2A-Net S2A−Net选择经典的单阶段RetinaNet作为baseline,RetinaNet包含一个主干网络和两个特定任务的子网络。主干网络(backbone network)使用特征金字塔网络(FPN)来提取多规模的特征,分类和回归两个子网络是带有几个层叠卷积层的全卷积网络。而且在训练过程中使用Focal loss来解决严重的前景背景不平衡问题。 ResNet与残差单元有关,对于一个堆积层结构(几层堆积而成)当输入为x时其学习到的特征记为H(x),现在我们希望其可以学习到残差 F(x)=H(x)-x,这样其实原始的学习特征是F(x)+x。之所以这样是因为残差学习相比原始特征直接学习更容易。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。 识别不同尺寸的物体是目标检测中的一个基本挑战,而特征金字塔一直是多尺度目标检测中的一个基本的组成部分,但是由于特征金字塔计算量大,会拖慢整个检测速度,所以大多数方法为了检测速度而尽可能的去避免使用特征金字塔,而是只使用高层的特征来进行预测。高层的特征虽然包含了丰富的语义信息,但是由于低分辨率,很难准确地保存物体的位置信息。 与之相反,低层的特征虽然语义信息较少,但是由于分辨率高,就可以准确地包含物体位置信息。 所以如果可以将低层的特征和高层的特征融合起来,就能得到一个识别和定位都准确的目标检测系统。 下图所示的三种结构是在目标检测中比较常见的结构: ( b ) Pyramid feature hierarchy:这是SSD采用的多尺度融合的方法,即从网络不同层抽取不同尺度的特征,然后在这不同尺度的特征上分别进行预测,这种方法的优点在于它不需要额外的计算量。而缺点就是有些尺度的特征语义信息不是很丰富,此外,SSD没有用到足够低层的特征,作者认为低层的特征对于小物体检测是非常有帮助的。 ( c ) Single feature map:这是在SPPnet,Fast R-CNN,Faster R-CNN中使用的,就是在网络的最后一层的特征图上进行预测。这种方法的优点是计算速度会比较快,但是缺点就是最后一层的特征图分辨率低,不能准确的包含物体的位置信息。 所以为了使得不同尺度的特征都包含丰富的语义信息,同时又不使得计算成本过高,FPN采用top down和lateral connection的方式,让低层高分辨率低语义的特征和高层低分辨率高语义的特征融合在一起,使得最终得到的不同尺度的特征图都有丰富的语义信息,如下图所示。 Bottom-up的过程就是将图片输入到backbone ConvNet中提取特征的过程中。Backbone输出的feature map的尺寸有的是不变的,有的是成2倍的减小的。对于那些输出的尺寸不变的层,把他们归为一个stage,那么每个stage的最后一层输出的特征就被抽取出来。以ResNet为例,将卷积块conv2, conv3, conv4, conv5的输出定义为{C2,C3,C4,C5} ,这些都是每个stage中最后一个残差块的输出,这些输出分别是原图的{1/4,1/8,1/16,1/32}倍,所以这些特征图的尺寸之间就是2倍的关系。 Top-down的过程就是将高层得到的feature map进行上采样然后往下传递,这样做是因为,高层的特征包含丰富的语义信息,经过top-down的传播就能使得这些语义信息传播到低层特征上,使得低层特征也包含丰富的语义信息。本文中,采样方法是最近邻上采样,使得特征图扩大2倍。上采样的目的就是放大图片,在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的像素,在本文中使用的是最近邻上采样(插值)。这是最简单的一种插值方法,不需要计算,在待求像素的四个邻近像素中,将距离待求像素最近的邻近像素值赋给待求像素。设待求像素的坐标为(i+u,j+v),(i,j为正整数,u,v为大于零小于1的小数),则待求像素灰度的值f(i+u,j+v)的计算方式如下图所示: 如下图所示,lateral connection主要包括三个步骤: (1) 对于每个stage输出的feature map C n C_n Cn,都先进行一个1*1的卷积降低维度。 (2) 然后再将得到的特征和上一层采样得到特征图 P n + 1 P_{n+1} Pn+1进行融合,就是直接相加,element-wise addition。因为每个stage输出的特征图之间是2倍的关系,所以上一层上采样得到的特征图的大小和本层的大小一样,就可以直接将对应元素相加 。 (3) 相加完之后需要进行一个3 * 3的卷积才能得到本层的特征输出 P n P_n Pn。使用这个3*3卷积的目的是为了消除上采样产生的混叠效应(aliasing effect),混叠效应应该就是指上边提到的插值生成的图像灰度不连续,在灰度变化的地方可能出现明显的锯齿状。 下图为RetinaNet的结构图,我们可以看出,RetinaNet的特征提取网络选择了残差网络ResNet,特征融合这块选择了FPN(特征金字塔网络),以特征金字塔不同的尺寸特征图作为输入,搭建三个用于分类和框回归的子网络。分类网络输出的特征图尺寸为(W,H,KA),其中W、H为特征图宽高,KA为特征图通道,存放A个anchor各自的类别信息(K为类别数)。 FPN结构如下图所示 5 个输出特征图的 Head 模块权值是共享的,但每个 Head 的分类和回归分支权值不共享 head模块结构如下图所示 值得注意的是RetinaNet被设计为通用的物体检测,输出水平的检测框,该检测框可以用{(x, w, h)}来表示,其中x是一个向量,x = (x1, x2)作为边界框的中心。为了与带方向的目标检测相匹配,我们将{(x, w, h)}替换为{(x, w, h,θ)}作为RetinaNet的回归输出,其中 θ ∈ [−(π/4), (3π/4)]表示w所在的方向与x1方向之间的角度,其他设置与原始RetinaNet保持不变。 对齐卷积的作用就是根据旋转锚框将原本与轴平行的卷积特征X( p )转化为任意方向,从而解决了问题2(卷积特征和锚框不能对齐之间的问题) 在标准的二维卷积,首次在输入特征图X上采样,X可以定义为由一个常规网格 R = ( r x , r y ) R = {(r_x ,r_y )} R=(rx,ry)组成的Ω = {0, 1,…, H − 1} × {0, 1,…, W − 1} ,然后将所有取样的值乘上权重W再计算累加。 例如,R = {(−1, −1), (−1, 0), . . . , (0, 1), (1, 1)} 表明了一个3x3大小的卷积核,对于每一个在输出特征图Y位置的p ∈ Ω,我们将其定义为如下形式 与标准卷积不同,alignment convolution (AlignConv,对齐卷积)对于每一个位置p都增加了一个额外的偏移O 首先(w,h)·r是一个矢量,我们也可以把它称之为位移矢量,我们将原本的位置x加上这个位移矢量,我们就从下图中的绿色点转移到蓝色点 用这种方式,我们可以根据旋转锚框将原本与轴平行的卷积特征X( p )转化为任意方向,解决问题2 标准的卷积通过常规网格在特征图上取样,DeformConv可变形卷积学习一个偏移增强取样位置的空间性,然而在弱监督下很有可能从错误的位置取样,尤其对于密集排列的物体。而AlignConv对齐卷积增加了一个额外的偏移,在锚框的引导下提取出网格分布式的特征,与DeformConv不同,AlignConv中的偏移直接从锚框中推断出来,上图中的c和d也表明AlignConv可以在锚框中提取出精准的特征。 FAM模块包含两部分,一部分是anchor refinement network(ARN,锚点改善网络),另一部分是alignment convolution layer(ACL,对齐卷积层) anchor refinement network (ARN,锚点改善网络)是一个具有两个平行分支的小型网络,一个锚点分类分支和一个锚点回归分支。ARN接收到的是锚框,锚点分类分支将锚点分为不同的类,锚点回归分支将水平的锚框改善为高质量的旋转锚框。 我们使用ARN解决了问题1,并没有使用定义好的启发式的锚框,而是接受RetinaNet输出的锚框,然后将这些锚框改善为高质量的旋转锚框 由于在anchor-free detectors中端对端的时尚,我们对特征图中每一个位置预设了一个方形锚点,并且我们并不会舍弃低置信度的预测,因为我们注意到在最后的预测中一些消极的预测可能变为积极。 由于内嵌了AlignConv对齐卷积,我们构成了如下图所示的ACL,ACL接收到的是特征图 注意对于每一个锚框,我们通常取样9个点(三行三列)来获得18维的偏移(9个点x方向的偏移和y方向的偏移,总共18维,正如上图中绿色点向蓝色点转变的箭头) ACL接受特征金字塔给的特征图,然后接受ARN传递过来改善过后的锚框,我们用旋转锚框中的位置减去最开始的取样位置计算出偏移O后,将特征图与偏移O输入AlignConv卷积过后输出排列好的特征 正如上图d,ODM是为了减缓分类得分和定位精准度之间的不一致性而提出,然后执行精准的目标检测。 我们首先使用ARF(active rotating filters)对方向信息进行编码,ARF是一种在卷积过程中进行旋转的滤波器,以生成具有多方向通道的特征映射图。因此ARF是一个虚拟的滤波器组,只有一个卷积核实例化进行学习相关参数。 简单说,就是把所有方向的结果逐像素取个最大值。如果物体是某个方向的,那么对应的方向的response应该比较大,这样就能把该方向的特征抽取出来。 一个ARF是一个 k × k × N 的过滤器能够在卷积过程中旋转N - 1次,产生有N(N默认是8)个方向通道的特征图,对于一个特征图X和一个ARF F,第i个方向的输出Y可以表示为如下 我们采用RetinaNet作为baseline,包括它的网络架构和大部分参数设置,在FAM和ODM结合的基础上形成了 S 2 A − N e t S^2A-Net S2A−Net 由上述工作得知,我们可以将参数的回归目标设为如下 我们采用IoU也就是交并比作为指标,如果一个锚框的交并比高于正例的阈值,我们就将其标为positive,否则如果低于反例的阈值,我们则将其标为negative,与水平边界框的交并比不同,我们在两个带方向的边界框之间计算交并比。我们默认将正例的阈值设为0.5,反例的阈值设为0.4在FAM和ODM中。 S 2 A − N e t S^2A-Net S2A−Net的损失包含两个部分,FAM的损失和ODM的损失,对于每一个部分,我们给每一个锚点分配一个类别标签,然后对位置进行回归,损失函数可以定义如下所示 L1 loss也就是目标值yi与模型输出(估计值)f(xi)做绝对值得到的误差 S 2 A S^2A S2A网络是一个全卷积网络(FCN),我们可以简单地通过网络前向传播图像,而无需复杂的RoI操作。具体来说,我们将输入图像传递到backbone以提取金字塔特征。然后,将金字塔特征输入FAM,以ARN产生旋转精确的anchor,ACL产生已对齐特征。之后,ODM对方向信息进行编码,以产生高置信度的预测。最后,我们选择top-k(即2000)预测,并采用NMS产生最终检测。 我们同时在DOTA的测试集上验证了模型的有效性,在所有的实验中采用ResNet50 FPN作为主干网络,RetinaNet作为单阶段的目标检测器已经非常快了,但是在上面增加任何的模块都会增加更多的计算量,我们在RetinaNet上面实验了不同的网络结构和设置,结果如下个表格所示 mAP的全称是mean Average Precision,意为平均精度均值。这个指标是多目标检测和多标签图像分类中常用的评测指标,因为这类任务中的标签大多不止一个,所以不能用普通的单标签图像的分类标准,也就是mean Precision,平均精确确率这个指标。mAP是将多分类任务中的平均精度AP(Average Precision)求和再取平均。 GFLOPs: 是G floating point operations的缩写(s表复数),即:10亿次浮点运算,用于衡量模型的计算量 (a)为RetinaNet的表现,在我们将RetinaNet头的深度从4改为2,也就是(b),我们在降低大量计算量(GFLOPs)的同时只降低了很小一部分的mAP,而且在此基础上,我们再将每个位置上的锚点减少到1个( c ),计算量降低了28%,然而精准度仅仅降低了1.5%,这个结果表明了小型的检测头部和更少的锚点可以实现更有竞争力的表现,同时做到更好的速度——精度均衡。 我们仅仅用AlignConv替代其他卷积而其他设置保持不变,结果如下图所示,AlignConv与其他方法拉开了巨大的差距,与标准卷积作比较,AlignConv仅仅增加了1.41GFLOPs的计算量,然而却带来了3%mAP提升。另外AlignConv几乎在所有类别改善了表现结果,除了具有极大长宽比的类别(大桥),密集分布和少量的实例(比如直升机)。相比之下,DeformConv和GA-DeformConv仅仅实现了71.71% 和 71.33%mAP。 为了评估ARN和ARF的有效性,我们实验了不同设置的 S 2 A − N e t S^2A-Net S2A−Net,如果ARN被舍弃,FAM和ODM使用没有改善过的相同初始锚点;如果ARF被舍弃,我们将ARF层换为标准卷积层。如下图所示,如果ARN、ACL和ARF都不使用的话,我们的模型可以达到68.26%的mAP,mAP比标准方法高1.26%,这主要因为我们在FAM和ODM中增加了监督。如果加上ARN帮我们将锚点改善为高质量的旋转锚点,那么可以获得71.17%mAP,说明锚点改善在最终的预测中十分重要,另外如果只加上ARF而不带ACL不会有任何用处,如下图中的第三列和第四列,mAP变化不大。但是如果我们同时使用ACL和ARF将会有一个明显的提升,表现效果从73.24%提升到74.12%。
focal loss相比交叉熵多了一个modulating factor即 ( 1 − p ) γ (1-p)^γ (1−p)γ,γ为可调节因子,对于分类准确的样本p趋近于1,modulating factor趋近于0。对于分类不准确的样本p趋近于0,modulating factor趋近于1。即相比交叉熵损失,focal loss对于分类不准确的样本(难分样本),损失没有改变,对于分类准确的样本(易分样本),损失会变小。 整体而言,相当于增加了分类不准确样本在损失函数中的权重。交并比(Intersection of Union,IoU)
两个框可以看成是两个像素的集合,它们的交并比等于两个框重合部分的面积除以它们合并起来的面积。
图“交集”中青色区域是两个框的重合面积,
图“并集”中蓝色区域是两个框的相并面积。
用这两个面积相除即可得到它们之间的交并比
NMS(non_max_suppression)非极大值抑制
anchor box
常用的Anchor Box定义
根据CNN的感受野,一个Feature Map上的点对应于原图的16×16的正方形区域,仅仅利用该区域的边框进行目标定位,其精度无疑会很差,甚至根本“框”不到目标。 而加入了Anchor后,一个Feature Map上的点可以生成9中不同形状不同大小的框,这样“框”住目标的概率就会很大,就大大的提高了检查的召回率;再通过后续的网络对这些边框进行调整,其精度也能大大的提高。RoIPooling
我们的模型取一个尺寸为 512x512x3 (宽度x高度x RGB) 的图像输入,VGG16将其映射为一个 16x16x512 的feature map。如果你看输出矩阵,你应该注意到它的 宽度和高度 正好比输入图像小32倍(512/32 = 16)。这很重要,因为所有 RoIs 都要按这个因子减小。
每个RoI都有它的原始坐标和大小,从现在开始我们只关注下图中的右边那只灰白猫,其原始大小为 145x200 ,左上角设置为 (192x296) ,我们无法将这些数字的大部分整除以 32(比例因子)。
feature map上坐标的量化(quantization)
我们不能真正地在它上面应用池化层,因为一些“cells”被分割了。量化所做的就是每一个结果在放到矩阵上之前都进行约减。9.25变成9, 4.53变成4,等等。我们需要将原始的RoI覆盖的区域全部变成整个方格,如下图,我们包含了左边界的方格,尽管最左边的某些部分我们原始的RoI并不包含,同时删去了右边界和下边界所在的方格,尽管我们原始的RoI包含那些区域,但是我们在这一部分将他们丢失了
量化后的RoI如下图所示,绿色部分是我们新增的数据,而蓝色部分是我们丢失的数据,因此在这一部分我们有一个quantization loss(量化损失),我们将在下面所讲述的RoIAlign解决这个问题
现在,当我们把RoI映射到feature map上时,我们可以在上面应用pooling(池化),所以我们需要选择 RoI池化层 的大小。你可能会问:“我们为什么要应用RoI Pooling呢?”这是个好问题。如果你看原始设计的Fast R-CNN:
在 RoI池化层 之后是一个固定大小的 全连接层,因为RoIs的大小不同,所以我们必须将它们池化为相同的大小(在该示例中我们选用的池化层核大小为 3x3x512,还记得吗我们特征图的大小为16x16x512,所以我们池化层核的第三个数应该为512以契合特征图)。上图我们映射的RoI大小为 4x6,而我们现在需要把这个已经量化过后的RoI进行池化变为3x3
由于6 可以整除以 3 得到2,所以我们可以将每两列变成一列,但当你用 4 除以 3 时,剩下1.33,这表明我们需要将1.33行RoI变为1行,这显然是做不到的,所以我们使用与前面量化相同的方法(约简 round down )后,舍弃最后一行,这样我们每行都可以对应一行池化后的数据。我们的映射如下图所示:
由于池化映射,我们再次失去了最后一行数据
众所周知,池化有多种方法,在本例中我们采用最大池化,也就是原先的数据我们从中挑选出最大的一个填入新的格子中,整个池化过程如下动图所示
RoIAlign
我们可以跳过这些操作,将原始RoI分成9个等大小的小格子,并在每个盒子内应用双线性插值(bilinear interpolation)。每个框的大小由映射的RoI的大小和池化层的大小决定,由于我们使用了一个 3x3 的池化层,所以我们必须将映射的RoI (6.25x4.53)除以3。
如果查看第一个框(左上角),可以注意到它覆盖了6个不同的网格单元格。为了提取池化层的值,我们必须从池化层中采样一些数据。为了对数据进行采样,我们在盒子里均等距离创建 四个采样点,每个点的位置可以通过方框的高度和宽度除以3来计算。
双线性插值(bilinear interpolation)
关于双线性插值式子的解释,我认为双线性插值要做的是让四个格子对其中点的值做出相同的贡献,我们使用左上那个点举例子,其中的 Q 11 Q_{11} Q11指的是上图中第一行的第一个格子, Q 21 Q_{21} Q21指的是第一行的第二个格子
如下图所示,其中的x、x1和x2均为坐标, Q 11 Q_{11} Q11方格中点距离中心的点距离较近为x-x1,而 Q 21 Q_{21} Q21方格则距离中心的点较远为x2-x,为了使他们做出相同的贡献,所以要使更短的l1乘上x2-x,而更长的l2乘上x-x1,这就相当于双线性插值中括号中的式子
如下图所示,其中的y、y1和y2也为坐标,为了使上下格子对点的贡献一致,我们需要对第一行的 Q 11 Q_{11} Q11和 Q 21 Q_{21} Q21两个格子乘上y2-y,第二行的 Q 12 Q_{12} Q12和 Q 22 Q_{22} Q22则乘上y-y1,而这刚好是双线性插值括号外面的系数
我们使用式子对四个格子的值计算即可得出第一个点的值,我们依次对其他点所涉及的四个格子做相同的计算
得出这四个点具体的值之后,我们再使用最大池化得到最后3x3中格子的值,具体的过程如下
下图中左图使用RoIAlign,右图使用RoIPooling,绿色分别是他们相加的数据,蓝色是RoIPooling丢失的数据,浅蓝色是RoIPooling在做第二次量化时失去的数据
当前遥感目标检测的三个问题
在本文中,我们对于每一个目标实例提取对齐过后的特征来提高分类的分数,也就是不会存在多个边界框,同时仅剩的那个边界框由于ARN改善过后从而可以更加符合物体的边界。 S 2 A − N e t S^2A-Net S2A−Net是什么?
S 2 A − N e t S^2A-Net S2A−Net的工作流程
使用RetinaNet作为基准
ResNet
残差单元结构如下:
ResNet使用两种残差单元,如下图,左图对应的是浅层网络,而右图对应的是深层网络。FPN(Feature Pyramid Network)
( a ) Featurized image pyramid:这种方式就是先把图片弄成不同尺寸的,然后再对每种尺寸的图片提取不同尺度的特征,再对每个尺度的特征都进行单独的预测,这种方式的优点是不同尺度的特征都可以包含很丰富的语义信息,但是缺点就是时间成本太高。
特征金字塔的结构主要包括三个部分:bottom-up,top-down和lateral connection。Bottom-up
Top-down
如果(i+u,j+v)落在A区域内,即u<0.5,v<0.5,则将a点的像素值赋给待求像素,同理,落在B区则将b点的像素值赋给待求像素,落在C区则赋予c点的像素值,落在D区则赋予d点的像素值。最邻近法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。Lateral connection
RetinaNet
Retinanet 的 Backbone 为 ResNet 网络,Neck 模块即为 FPN 网络结构。FPN 模块接收 c3, c4, c5 三个特征图,输出 P3-P7 五个特征图,通道数都是 256, stride 为 (8,16,32,64,128),其中大 stride (特征图小)用于检测大物体,小 stride (特征图大)用于检测小物体。P6由C5卷积获得,P7由P6通过ReLU之后,再卷积产生。P6 和 P7 目的是提供一个大感受野强语义的特征图,有利于大物体和超大物体检测。
Head 即预测头网络,Retinanet 的 neck 输出 5 个分支,即输出 5 个特征图。head 模块包括分类和位置检测两个分支,每个分支都包括 4 个卷积层,但是 head 模块的这两个分支之间参数不共享,分类 Head 输出通道是 AK,K是检测目标的类别个数,注意这里的K不包含背景类别;A是预测特征层在每一个位置生成的 anchor 的个数,检测 head 输出通道是 4A, A是 anchor 个数。
RetinaNet产出锚框,并交付给FAM中的ARN
Alignment Convolution(AlignConv,对齐卷积)
如下图所示,对于位置p,我们用用卷积核的权值乘上对应位置的之后再累加得到输出后的值
正如下图中的c和d展示的那样,对于每一个位置p,偏移O通过常规取样位置(绿色点)和根据锚点取样位置(蓝色点)之间的差距计算得出,下图c我们将绿色点偏移变成了蓝色点,这些蓝色点更能表示当前橙色的边界框,而在图d我们则将图c的矩形进行了旋转,这个旋转过后的矩形则更能代表我们检测中带方向的物体。
(x, w, h,θ) 可以表示位置p处对应的锚框(anchor box),对于卷积核中的每一点 r ∈ R,基于锚框的取样位置L可以被定义为下面的式子
让我们把这个式子拆解之后再分析;
为什么要乘上 1 k \frac{1}{k} k1?比如对于一个3x3的卷积核,k=3,我们将w和h分别三等分之后,加上这一部分即为之后位置中心点周围的点
接着我们将这整个矢量也就是整个括号里面的内容乘上旋转矩阵 R T ( θ ) R^T(θ) RT(θ),也就是将这个方框旋转θ,S跟k的作用差不多,S也就是stride,是我们当前特征图与原图的比例,我们乘上 1 S \frac{1}{S} S1控制当前特征图取样位置,这一步过后我们就从左图转换到了右图
k是卷积核的大小,S是特征图的stride, R ( θ ) = ( c o s θ , − s i n θ ; s i n θ , c o s θ ) T R(θ ) = (cos θ , − sin θ; sin θ , cos θ )^T R(θ)=(cosθ,−sinθ;sinθ,cosθ)T是旋转矩阵(矢量乘上旋转矩阵之后可以只改变方向而不改变大小,不太清楚的可以百度一下),在位置p的偏移O如下所示。
最开始的位置是p,r是卷积核里面的元素,浅绿色的p+r也就是原本的取样位置,深蓝色的 L p r L_p^r Lpr是我们通过式子(3)转变过后的取样位置,其中的偏移O(浅蓝色箭头)也就是的 L p r − ( p + r ) L_p^r-(p+r) Lpr−(p+r),则刚好可以计算得出然后带入式子(2)
Feature Alignment Module(FAM,特征对齐模块)
Anchor Refinement Network(ARN,锚点改善网络)
Alignment Convolution Layer(ACL,对齐卷积层)
对于 H × W × 5 锚点预测图中的每一个位置,我们首先将其解码为锚框(x, w, h,θ),然后通过上述的式子(4)计算出偏移O(offset field),偏移O告诉了我们改善后的位置距离原本取样特征的差距,我们使用AlignConv输入原来的特征图和偏移O,将原本水平的取样特征点变为旋转过后的取样点,从而解决了问题2(卷积特征和锚框不能对齐之间的问题)
另外值得强调的是,ACL是一个小型卷积层所以在偏移计算过程中有着可以忽略不计的时延。Oriented Detection Module(ODM,带方向的检测模块)
F θ i F_{θ_i} Fθi是顺时针旋转 θ i θ_i θi版本的F, F ( n ) F^{(n)} F(n)和 X ( n ) X^{(n)} X(n)是第n个方向通道的F和X,对卷积层使用ARF,我们可以获得基于方向信息编码的对方向敏感的特征。边界框回归任务可以从对方向敏感特征中受益,然而物体分类任务需要不变特征,我们将通过对方向敏感特征池化后提取出方向不变的特征,这可以通过选择在输出特征X中响应最强的方向通道做到(因为原来的feature有多个方向的,但只给定feature是不知道具体是哪个方向的,不能把它单独拿出来,用Max就可以不管是哪个方向都能提取出来)。
用这种方式,我们可以用不同方向排列物体特征。与对方向敏感的特征相比,方向不变的特征,使用少数的参数即可十分有效。例如一个H × W × 256带有8方向通道的特征图,在池化后变成了H × W × 32。最后我们将对方向敏感的特征和方向不变的特征输入两个子网络分别对边界框回归和对类别分类。如何训练 S 2 A − N e t S^2A-Net S2A−Net
回归目标
x g x_g xg表示真实的边界框,x则是我们所设的锚框,k是一个整数确保 ( θ g − θ + k π ) ∈ [ − ( π / 4 ) , ( 3 π / 4 ) ] (θ_g−θ +kπ )∈ [−(π/4), (3π/4)] (θg−θ+kπ)∈[−(π/4),(3π/4)] ,也就是框的角度刚好位于我们设置好的范围内,回归目标可由(7)表示,在ODM中,我们首先对FAM的输出解码,然后通过(7)再计算回归目标匹配策略
损失函数
λ是损失平衡参数(决定哪一个模块占更大的损失,损失占比更大优化更好,但是另一个模块相应就会差一些)
1[·]是一个指标函数, N F N_F NF和 N O N_O NO分别是FAM和ODM中正例的数目,i是每一个迷你batch中的下标, c i F c_i^F ciF和 x i F x_i^F xiF是在FAM中第i个锚点的预测类别和锚框改善位置; c i O c_i^O ciO和 x i O x_i^O xiO是在ODM中第i个锚点的预测物体类别和边界框的位置 l i ∗ l_i^* li∗和 g i ∗ g_i^* gi∗是第i个锚点的真实类别和位置,在分类损失中的 L c L_c Lc是focal loss,回归损失中的 L r L_r Lr则是L1 loss
推理
消融实验验证模型的有效性
Params(M): 是 Parameters,即:参数量,用于衡量模型的复杂度
验证AlignConv(对齐卷积)的有效性
下图是几种卷积在某张图的输出结果,可以看出AlignConv在检测密集排列随机方向物体实现了高精准度,而其他卷积表现不佳
验证ARN 和 ARF的有效性
如下个表格所示,我们探索了FAM和ODM不同的网络设计,可以得出结论 S 2 A − N e t S^2A-Net S2A−Net不仅仅有着高精度,同时速度和参数上也十分有效,我们提出的方法对于网络深度并不是特别敏感,表现上的改善更主要来自于新颖的对齐方法。另外,随着层数的增加,表现反而有所降低(d)–(f),我们假设更深的网络有着更大的感受野,这妨碍了对于小型物体的检测表现。
由下图可知, S 2 A − N e t S^2A-Net S2A−Net在大部分物体类别上都达到了最好的识别效果,除了部分类(比如大桥或者直升机)效果没有其他模型好,并且使用 ResNet-50-FPN的S2A-Net在所有单阶段和双阶段检测器中达到了最好的mAP79.42%