详解Single-Shot Alignment Network (S2A-Net) 基于遥感图像的特征对齐旋转目标检测

news2024/12/26 11:49:59

引言

目标检测:把图像中的物体使用方框标记起来,不同类别物体应使用不同颜色
目标检测其实是寻找物体边界框(bounding box)回归问题(regression)和对物体分类问题(classification)的统一

遥感目标检测:普通的目标检测是日常生活中的横向的图片,而遥感目标检测基于遥感图像(传感器拍的,一般是卫星遥感图像,从空中俯拍的图像)

旋转框:普通目标仅仅使用水平框即可,但是遥感图像物体的朝向不一定是水平的,所以我们需要旋转框能更契合物体的边界

RoI:RoI(Region of Interest)感兴趣的区域,也就是从目标图像中可能是物体的候选识别区域。

第一张图为普通目标检测,第二张图为遥感目标检测
图一

图二

双阶段(two-stage)和单阶段(one-stage)的目标检测

目标检测大体可以分为两类,双阶段的目标检测器(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

focal loss:最初由何恺明提出的,最初用于图像领域解决数据不平衡造成的模型性能问题。
在分类问题中我们经常使用交叉熵损失函数
在这里插入图片描述
其中p为预测概率大小
对于所有样本,损失函数为:
在这里插入图片描述
对于二分类问题,损失函数可以写为:
在这里插入图片描述
其中m为正样本个数,n为负样本个数,N为样本总数,m+n=N

当样本分布失衡时,在损失函数L的分布也会发生倾斜,如m<<n时,负样本就会在损失函数占据主导地位。由于损失函数的倾斜,模型训练过程中会倾向于样本多的类别,造成模型对少样本类别的性能较差。

focal loss的形式如下:
在这里插入图片描述
focal loss相比交叉熵多了一个modulating factor即(1-p)^γ,γ为可调节因子,对于分类准确的样本p趋近于1,modulating factor趋近于0。对于分类不准确的样本p趋近于0,modulating factor趋近于1。即相比交叉熵损失,focal loss对于分类不准确的样本,损失没有改变,对于分类准确的样本,损失会变小。 整体而言,相当于增加了分类不准确样本在损失函数中的权重。

交并比(Intersection of Union,IoU)

在检测任务中,使用交并比(Intersection of Union,IoU)作为衡量指标,来描述两个框之间的重合度。这一概念来源于数学中的集合,用来描述两个集合A和B之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式如下:
在这里插入图片描述
两个框可以看成是两个像素的集合,它们的交并比等于两个框重合部分的面积除以它们合并起来的面积。
图“交集”中青色区域是两个框的重合面积,
图“并集”中蓝色区域是两个框的相并面积。
用这两个面积相除即可得到它们之间的交并比
在这里插入图片描述

NMS(non_max_suppression)非极大值抑制

在预测任务中,会出现很多冗余的预测框,通过NMS操作可以有效的删除冗余检测的结果。非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。

算法流程:

  1. 给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为Si, 1<=i<=N。
  2. 建造一个存放待处理候选框的集合H,初始化为包含全部N个框;建造一个存放最优框的集合M,初始化为空集。
  3. 将所有集合 H 中的框进行排序,选出分数最高的框 m,从集合 H 移到集合 M;
  4. 遍历集合 H 中的框,分别与框m计算交并比(Interection-over-union,IoU),如果高于某个阈值(一般为0~0.5),则认为此框与 m重叠,将此框从集合 H 中去除。
  5. 从剩下的候选框集合H中排序找出分数最高的框m’,从集合H移至集合M,然后从剩下的H中继续与刚才移出的框m’计算交并比,如果高于阈值就删除,否则就继续留在H,重复这个步骤直至集合H为空,集合 M 中的框为我们所需。

IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数

anchor box

滑动窗口:比较原始的目标检测方法,给定一个固定尺寸的窗口,根据设定的步伐,一步一步的从左至右、从上至下滑动,把每个窗口输入到卷积神经网络中进行预测和分类,这样做有两个缺点: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定义

  • Faster R-CNN 定义三组纵横比ratio = [0.5,1,2]和三种尺度scale = [8,16,32],可以组合处9种不同的形状和大小的边框。
  • YOLO V2 V3则不是使用预设的纵横比和尺度的组合,而是使用k-means聚类的方法,从训练集中学习得到不同的Anchor
  • SSD固定设置了5种不同的纵横比ratio=[1,2,3,1/2,1/3],由于使用了多尺度的特征,对于每种尺度只有一个固定的scale

Anchor Box的生成是以CNN网络最后生成的Feature Map上的点为中心的(映射回原图的坐标),以Faster R-CNN为例,使用VGG网络对对输入的图像下采样了16倍,也就是Feature Map上的一个点对应于输入图像上的一个16×16的正方形区域(感受野)。根据预定义的Anchor,Feature Map上的一点为中心 就可以在原图上生成9种不同形状不同大小的边框,如下图:

在这里插入图片描述
根据CNN的感受野,一个Feature Map上的点对应于原图的16×16的正方形区域,仅仅利用该区域的边框进行目标定位,其精度无疑会很差,甚至根本“框”不到目标。 而加入了Anchor后,一个Feature Map上的点可以生成9中不同形状不同大小的框,这样“框”住目标的概率就会很大,就大大的提高了检查的召回率;再通过后续的网络对这些边框进行调整,其精度也能大大的提高。

RoIPooling

我们已经知道RoI(Region of Interest) 是从原始图像中提取的区域,我们将通过Fast R-CNN 来讲RoIPooling,在该例中使用VGG16做特征提取
在这里插入图片描述
我们的模型取一个尺寸为 512x512x3 (宽度x高度x RGB) 的图像输入,VGG16将其映射为一个 16x16x512 的feature map。如果你看输出矩阵,你应该注意到它的 宽度和高度 正好比输入图像小32倍(512/32 = 16)。这很重要,因为所有 RoIs 都要按这个因子减小。

接着我们需要将RoIs映射到VGG16的输出 feature map上,如下图只举例了四个RoI
在这里插入图片描述
每个RoI都有它的原始坐标和大小,从现在开始我们只关注下图中的右边那只灰白猫,其原始大小为 145x200 ,左上角设置为 (192x296) ,我们无法将这些数字的大部分整除以 32(比例因子)。
在这里插入图片描述

feature map上坐标的量化(quantization)

量化是将输入从一大组值(如实数)约束为一组离散的值(如整数)的过程。

我们feature map 上原始的 RoI 如下所示:
在这里插入图片描述
我们不能真正地在它上面应用池化层,因为一些“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

RoIPooling在处理过程中丢失了大量数据,这会降低模型的精准度,RoIAlign和RoIPooling之间的主要区别是量化,RoI Align没有将量化用于数据池化。Fast R-CNN应用了两次量化如下图,第一次在映射过程中,第二次在池化过程中。
在这里插入图片描述
我们可以跳过这些操作,将原始RoI分成9个等大小的小格子,并在每个盒子内应用双线性插值(bilinear interpolation)。每个框的大小由映射的RoI的大小和池化层的大小决定,由于我们使用了一个 3x3 的池化层,所以我们必须将映射的RoI (6.25x4.53)除以3。
在这里插入图片描述
如果查看第一个框(左上角),可以注意到它覆盖了6个不同的网格单元格。为了提取池化层的值,我们必须从池化层中采样一些数据。为了对数据进行采样,我们在盒子里均等距离创建 四个采样点,每个点的位置可以通过方框的高度和宽度除以3来计算。
在这里插入图片描述

双线性插值(bilinear interpolation)

当我们有了所有的点我们可以应用双线性插值对这个方框进行数据采样。图像处理中常用双线性插值对颜色进行采样,其方程如下:
在这里插入图片描述
关于双线性插值式子的解释,我认为双线性插值要做的是让四个格子对其中点的值做出相同的贡献,我们使用左上那个点举例子,其中的Q11指的是上图中第一行的第一个格子,Q21指的是第一行的第二个格子
在这里插入图片描述
如下图所示,其中的x、x1和x2均为坐标,Q11方格中点距离中心的点距离较近为x-x1,而Q21方格则距离中心的点较远为x2-x,为了使他们做出相同的贡献,所以要使更短的l1乘上x2-x,而更长的l2乘上x-x1,这就相当于双线性插值中括号中的式子

在这里插入图片描述
如下图所示,其中的y、y1和y2也为坐标,为了使上下格子对点的贡献一致,我们需要对第一行的Q11和Q21两个格子乘上y2-y,第二行的Q12和Q22则乘上y-y1,而这刚好是双线性插值括号外面的系数
在这里插入图片描述
我们使用式子对四个格子的值计算即可得出第一个点的值,我们依次对其他点所涉及的四个格子做相同的计算
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得出这四个点具体的值之后,我们再使用最大池化得到最后3x3中格子的值,具体的过程如下
在这里插入图片描述
下图中左图使用RoIAlign,右图使用RoIPooling,绿色分别是他们相加的数据,蓝色是RoIPooling丢失的数据,浅蓝色是RoIPooling在做第二次量化时失去的数据
在这里插入图片描述

当前遥感目标检测现状

遥感目标检测中的物体总是非常的拥挤,比如按规则排列的一排排汽车、船只等,并且在大尺度的遥感图像中某些目标非常小,同时物体带有任意的方向。

常见基于遥感图像的目标检测方法问题:

  1. 一个锚点或者RoI包含多个物体,一些方法采用不同角度、规模和长宽比的旋转锚点来减缓这个问题,但是这增加了很多锚点相关的计算量
  2. RoI Transformer将水平RoI转化为旋转RoI,避免使用了大量锚点并且减缓了对不齐的问题,但是仍然需要已定义启发式的锚点和复杂的RoI计算
  3. 滑动水平边界框顶点的方法可以精准地描述一个旋转物体,但是RoI对应的特征仍然是水平的,经受着不能对齐的问题
  4. 最近的R3Det从五个位置(中间和四个角)相应的锚框取特征,然后将他们合计起来对位置信息进行再编码;为了与上述方法不同,S2A-Net避免使用已定义启发式的锚点,并且通过将水平锚点改善为旋转锚点产生高质量锚点

目标检测中的特征对齐问题:

特征对齐往往指的是卷积特征和锚框(anchor box)或者RoI之间的对齐问题,依靠对不齐的目标检测器很难获得高精度的检测

  1. 在双阶段的目标检测器中,通常采用RoI操作(例如RoIPooling 、RoIAlign和可变形RoIPooling)从RoI中提取固定长度的特征,这些特征可以大概代表物体的位置
  2. RoIPooling使用量化将浮点数的边界最后转化为整数边界,这引入了RoI和特征之间的不匹配问题,为了避免这个问题RoIAlign使用双线性插值在每个取样位置提取值,使定位的表现更好了;可变性池化为每一个RoI上的点学习了一个offset(偏移),这可以更加适应特征提取。然而这些RoI操作增加了大量的与区域相关的操作,这些运算变成了更快目标检测的瓶颈
  3. guided anchoring通过图像特征来指导 anchor 的生成,通过预测 anchor 的位置和形状,来生成稀疏而且形状任意的 anchor,并且设计了 Feature Adaption 模块来修正特征图使之与 anchor 形状更加匹配。AlignDet设计了一个RoI卷积获得了与RoIAlign相同的效果。这两种方法都在全卷积方式上实现了特征对齐,并且效率也很高,对于自然图像表现很好,但是对于遥感图像中带方向且密集排列的物体检测表现不佳

与上述方法不同,我们在锚框的指导下调整特征取样位置,从而减缓了基于坐标轴的卷积特征和任意方向物体之间的对其问题。

回归和分类之间的不一致问题:

目标检测通常包含下述两个平行的任务:边界框回归和目标物体分类,他们从骨干网络(backbone network)共享相同的特征,分类的分数往往被用于反映定位的精准性。

在后处理阶段(例如NMS),通常会在分类得分和定位精准度之间的不一致问题,有高分类得分的目标检测可能会产出很低定位精准度的边界框,然而定位准确的检测框因为分类分数低会经过NMS而被剔除掉。

如下图,绿框比红框定位精准,但是,由于红框分类分数(0.785)高于绿框(0.586),导致NMS过程中,反而保留了定位较差的绿框。

在这里插入图片描述
在我们的方法中,我们对于每一个目标实例提取已对齐的特征来提高分类的分数,尤其是对于遥感图像中密集排列的物体,精准的特征对于健全的分类和精确的定位是十分重要的。

另外,从骨干网络中共享的特征并不同时适用于分类和定位这两个问题,我们首次使用ARF对方向信息进行编码,然后为回归问题提取方向敏感特征,为分类问题提取方向不变特征。

S2A-Net是什么?

Single-Shot Alignment Network (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,主动旋转过滤器)将方向信息编码,提供对方向敏感的特征,接着通过池化对方向敏感的特征提取出方向不变的特征,最后将特征分别输入回归子网络和分类子网络产生最后的预测。

S2A-Net的工作流程

S2A-Net是一个全卷积网络,我们可以将一张图片输入网络而不需要复杂的RoI操作。首先将输入图片输入主干网络提取特征金字塔,然后特征金字塔输入FAM提供改善过后的锚点和已对齐的特征。之后ODM将方向信息编码提供出具有高可信度的预测。最后我们选出分数最高的前k个预测,使用NMS得出最后的检测结果。

S2A-Net的结果如下图所示
在这里插入图片描述

使用RetinaNet作为基准

S2A-Net选择经典的单阶段RetinaNet作为baseline,RetinaNet包含一个主干网络和两个特定任务的子网络。主干网络(backbone network)使用特征金字塔网络(FPN)来提取多规模的特征,分类和回归两个子网络是带有几个层叠卷积层的全卷积网络。而且在训练过程中使用Focal loss来解决严重的正反例不平衡问题。

值得注意的是RetinaNet被设计为通用的物体检测,输出水平的检测框,该检测框可以用{(x, w, h)}来表示,其中x是一个向量,x = (x1, x2)作为边界框的中心。为了与带方向的目标检测相匹配,我们将{(x, w, h)}替换为{(x, w, h,θ)}作为RetinaNet的回归输出,其中 θ ∈ [−(π/4), (3π/4)]表示w所在的方向与x1方向之间的角度,其他设置与原始RetinaNet保持不变。
在这里插入图片描述

Alignment Convolution(AlignConv,对齐卷积)

在标准的二维卷积,首次在输入特征图X上采样,X可以定义为由一个常规网格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
在这里插入图片描述
正如下图中的c和d显示的那样,对于每一个位置p,偏移O通过基于锚点取样位置(蓝色点)和常规取样位置(绿色点)的差距计算得出,绿色点表示为常规取样位置,下图c我们将绿色点偏移变成了蓝色点,这些蓝色点更能表示当前橙色的边界框,而在图d我们则将图c的矩形进行了旋转,这个旋转过后的矩形则更能代表我们检测中带方向的物体。
在这里插入图片描述
(x, w, h,θ) 可以表示位置p处对应的锚框(anchor box),对于卷积核中的每一点 r ∈ R,基于锚点的取样位置L可以被定义为下面的式子
在这里插入图片描述
k是卷积核的大小,S是特征图的stride,R(θ ) = (cos θ , − sin θ; sin θ , cos θ )T 是转置矩阵,在位置p的偏移O如下所示。用这种方式,我们可以根据相应的锚框将基于轴平行的卷积特征X§转化为任意方向。
在这里插入图片描述
标准的卷积通过常规网格在特征图上取样,DeformConv可变形卷积学习一个偏移增强取样位置的空间性,然而在弱监督下很有可能从错误的位置取样,尤其对于密集排列的物体。而AlignConv对齐卷积增加了一个额外的偏移,在锚框的引导下提取出网格分布式的特征,与DeformConv不同,AlignConv中的偏移直接从锚框中推断出来,上图中的c和d也表明AlignConv可以在锚框中提取出精准的特征。

Feature Alignment Module(FAM,特征对齐模块)

FAM模块包含两部分,一部分是anchor refinement network(ARN,锚点改善网络),另一部分是alignment convolution layer(ACL,对齐卷积层)

Anchor Refinement Network(ARN,锚点改善网络)

anchor refinement network (ARN,锚点改善网络)是一个具有两个平行分支的小型网络,一个锚点分类分支和一个锚点回归分支。锚点分类分支将锚点分为不同的类,锚点回归分支将水平的锚点改善为高质量的旋转锚点。

因为我们在AlignConv对齐卷积层只需要回归后的锚框来调整取样位置,所以在推理阶段我们舍弃了锚点分类分支来提高模型的速度,对于更快版本的S2A-Net,ARN的输出被用于输出最后的预测,保留了锚点分类分支。

由于在不用锚点检测中端对端的时尚,我们对特征图中每一个位置预设了一个方形锚点,并且我们并不会舍弃低置信度的预测,因为我们注意到在最后的预测中一些消极的预测可能变为积极。

Alignment Convolution Layer(ACL,对齐卷积层)

由于内嵌了AlignConv对齐卷积,我们构成了如下图所示的ACL。对于 H × W × 5 锚点预测图中的每一个位置,我们首先将其解码为锚框(x, w, h,θ),然后通过上述的式子(4)计算出偏移O(offset field),同时将输入特征一同输入AlignConv提取已对齐特征。注意对于每一个锚框(5维),我们通常取样9个点(三行三列)来获得18维的偏移(9个点x方向的偏移和y方向的偏移,总共18维,正如上图中绿色点向蓝色点转变的箭头)另外值得强调的是,ACL是一个小型卷积层在偏移计算过程中有着可以忽略不计的时延。
在这里插入图片描述

Oriented Detection Module(ODM,带方向的检测模块)

在这里插入图片描述

正如上图d,ODM是为了减缓分类得分和定位精准度之间的不一致性而提出,然后执行精准的目标检测。我们首先使用ARF对方向信息进行编码,一个ARF是一个 k × k × N 的过滤器能够在卷积过程中旋转N - 1次,产生有N(N默认是8)个方向通道的特征图,对于一个特征图X和一个ARF F,第i个方向的输出Y可以表示为如下
在这里插入图片描述
Fθi是顺时针旋转θi版本的F,F(n)和X(n)是第n个方向通道的F和X,对卷积层使用ARF,我们可以获得基于方向信息编码的对方向敏感的特征。边界框回归任务可以从对方向敏感特征中受益,然而物体分类任务需要不变特征,我们将通过对方向敏感特征池化后提取出方向不变的特征,这可以通过选择在输出特征X中最强响应的方向通道做到。
在这里插入图片描述
用这种方式,我们可以用不同方向排列物体特征。与对方向敏感的特征相比,方向不变的特征,使用少数的参数即可十分有效。例如一个H × W × 256带有8方向通道的特征图,在池化后变成了H × W × 32。最后我们将对方向敏感的特征和方向不变的特征输入两个子网络分别对边界框回归和对类别分类。

如何训练S2A-Net

我们采用RetinaNet作为baseline,包括它的网络架构和大部分参数设置,在FAM和ODM结合的基础上形成了S2A-Net

回归目标

由上述工作得知,我们可以将参数化的回归目标设为如下
在这里插入图片描述
xg表示真实的边界框,x则是我们所设的锚框,k是一个整数确保(θg−θ +kπ ) ∈ [−(π/4), (3π/4)] ,也就是框的角度刚好位于我们设置好的范围内,回归目标可由(7)表示,在ODM中,我们首先对FAM的输出解码,然后通过(7)再计算回归目标

匹配策略

我们采用IoU也就是交并比作为指标,如果一个锚框的交并比高于正例的阈值,我们就将其标为positive,否则如果低于反例的阈值,我们则将其标为negative,与水平边界框的交并比不同,我们在两个带方向的边界框之间计算交并比。我们默认将正例的阈值设为0.5,反例的阈值设为0.4在FAM和ODM中。

损失函数

S2A-Net的损失包含两个部分,FAM的损失和ODM的损失,对于每一个部分,我们给每一个锚点分配一个类别标签,然后对位置进行回归,损失函数可以定义如下所示
在这里插入图片描述
λ是损失平衡参数,1[·]是一个指标函数,Nf和No分别是FAM和ODM中正例的数目,i是每一个迷你batch中的下标,ciF和xiF是在FAM中第i个锚点的预测类别和锚点改善位置;ciO和xiO是在ODM中第i个锚点的预测物体类别和边界框的位置Ii和gi是第i个锚点的真实类别和位置,在分类损失中的Lc是focal loss,回归损失中的Lr则是L1 loss

L1 loss也就是目标值yi与模型输出(估计值)f(xi)做绝对值得到的误差
在这里插入图片描述

推理

S2A网络是一个完全卷积的网络,我们可以简单地通过网络前向传播图像,而无需复杂的RoI操作。具体来说,我们将输入图像传递到主干网络以提取金字塔特征。然后,将金字塔特征输入FAM,以生成精确的anchor和对齐特征。之后,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亿次浮点运算,用于衡量模型的计算量
Params(M): 是 Parameters,即:参数量,用于衡量模型的复杂度

(a)为RetinaNet的表现,在我们将RetinaNet头的深度从4改为2,也就是(b),我们在降低大量计算量(GFLOPs)的同时只降低了很小一部分的mAP,而且在此基础上,我们再将每个位置上的锚点减少到1个©,计算量降低了28%,然而精准度仅仅降低了1.5%,这个结果表明了小型的检测头部和更少的锚点可以实现更有竞争力的表现,同时做到更好的速度——精度均衡。
在这里插入图片描述

验证AlignConv(对齐卷积)的有效性

我们仅仅用AlignConv替代其他卷积而其他设置保持不变,结果如下图所示,AlignConv与其他方法拉开了巨大的差距,与标准卷积作比较,AlignConv仅仅增加了1.41GFLOPs的计算量,然而却带来了3%mAP提升。另外AlignConv几乎在所有类别改善了表现结果,除了具有极大长宽比的类别(大桥),密集分布和少量的实例(比如直升机)。相比之下,DeformConv和GA-DeformConv仅仅实现了71.71% 和 71.33%mAP。
在这里插入图片描述
下图是几种卷积在某张图的输出结果,可以看出AlignConv在检测密集排列随机方向物体实现了高精准度,而其他卷积表现不佳
在这里插入图片描述

验证ARN 和 ARF的有效性

为了评估ARN和ARF的有效性,我们实验了不同设置的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%。
在这里插入图片描述
如下个表格所示,我们探索了FAM和ODM不同的网络设计,可以得出结论S2A-Net不仅仅有着高精度,同时速度和参数上也十分有效,我们提出的方法对于网络深度并不是特别敏感,表现上的改善更主要来自于新颖的对齐方法。另外,随着层数的增加,表现反而有所降低(d)–(f),我们假设更深的网络有着更大的感受野,这妨碍了对于小型物体的检测表现。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/757535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.4 线性表的插入删除

1. 链表的插入删除 1. 单链表插入删除 图1. 单链表插入结点 图2. 单链表删除结点 #include <iostream>typedef struct LNode {int data;struct LNode* next; }LNode;/// <summary> /// 判断链表是否非空 /// </summary> /// <param name"p">…

常见关于数组的函数的介绍

关于字符串函数的介绍 求字符串长度 strlen函数 用于计算字符串的长度的函数&#xff0c;需要使用的库函数是string.h 函数声明 size_t strlen(const char *str)函数模拟实现 #include<stdio.h> #include<assert.h> size_t my_strlen(const char* arr) {asse…

review回文子串

给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 class Solution {List<List<String>> lists new ArrayList<>(); // 用于存储所有可能…

阿里瓴羊One推出背后,零售企业迎数字化新解

配图来自Canva可画 近年来随着数字经济的高速发展&#xff0c;各式各样的SaaS应用服务更是层出不穷&#xff0c;但本质上SaaS大多局限于单一业务流层面&#xff0c;对用户核心关切的增长问题等则没有提供更好的解法。在SaaS赛道日渐拥挤、企业增长焦虑愈演愈烈之下&#xff0c…

Midjourney助力交互设计师设计网站主页

Midjourney的一大核心优势是提供创意设计&#xff0c;这个功能也可以用在网站主页设计上&#xff0c;使用Midjourney prompt 应尽量简单&#xff0c;只需要以"web design for..." or "modern web design for..."开头即可 比如设计一个通用SAAS服务的初创企…

单片机第一季:零基础5——LED点阵

1&#xff0c;第八章-LED点阵 如何驱动LED点阵&#xff1a; (1)单片机端口直接驱动。要驱动8*8的点阵需要2个IO端口&#xff08;16个IO口&#xff09;、要驱动16*16的点阵需要4个IO端口&#xff08;32个IO口&#xff09;。 (2)使用串转并移位锁存器驱动。要驱动16*16点阵只需要…

Linux 系统编程-开发环境(二)

目录 7 压缩包管理 7.1 tar 7.2 rar 7.3 zip 8 进程管理 8.1 who 8.2 ps 8.3 jobs 8.4 fg 8.5 bg 8.6 kill 8.7 env 8.8 top 9 用户管理 9.1 创建用户 9.2 设置用户组 9.3 设置密码 9.4 切换用户 9.5 root用户 9.6 删除用户 10 网络管理 10.1 i…

MySQL-分库分表详解(七)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【熬夜送书 | 第二期】清华社赞助 | 《前端系列丛书》

前端是什么? 前端&#xff08;Front-End&#xff09;&#xff0c;又称浏览器端、客户端等&#xff0c;是指 Web 应用程序中负责用户交互、界面展示和数据展示的部分。前端技术体系主要包括 HTML、CSS 和 JavaScript 等内容。 其中&#xff0c;HTML&#xff08;Hypertext Mar…

❀如何获得铁粉❀

文章目录 引言一、提供独特的价值1.1 分享专业知识和经验1.2 提供独特的产品或服务1.3 展示个人风格和个性 二、构建真实的关系2.1 回应评论和互动2.2 分享个人故事和经历2.3 建立信任和互信关系 三、提供独家福利3.1 提供折扣和促销3.2 推出限量版产品或服务3.3 独家活动和会员…

位运算常见算法题

文章目录 前言191. 位1的个数338. 比特位计数461. 汉明距离136. 只出现一次的数字260. 只出现一次的数字 III面试题 01.01. 判定字符是否唯一268. 丢失的数字371. 两整数之和137. 只出现一次的数字 II面试题 17.19. 消失的两个数字 前言 本篇文章会涉及多道位运算题目&#xf…

图像处理学习笔记(一)

目录 图像处理学习笔记&#xff08;一&#xff09;一、基础知识1、彩色图像&#xff08;1&#xff09;RGB&#xff08;2&#xff09;HSV&#xff08;3&#xff09;HSI&#xff08;4&#xff09;CMYK&#xff08;5&#xff09;YUV&#xff08;6&#xff09;YCbCr 2、灰度图像3、…

谋合作、创新境 | 百度参观图为科技生产全链路

当代科技的发展不断催生出新的变革和机遇&#xff0c;百度作为全球顶尖的高科技公司&#xff0c;凭借其强大的创新基因&#xff0c;一直处于人工智能领域的最前沿。   近日&#xff0c;百度公司派出了一支专业团队来到了图为科技&#xff0c;对图为的研发技术及生产线进行了全…

python 把txt文本的log日志倒序处理

在上述代码中&#xff0c;我们尝试了一系列常见的编码&#xff08;utf-8、gbk、latin-1&#xff09;来打开文件&#xff0c;直到找到一个能够成功解码文件内容的编码。 如果找到了匹配的编码&#xff0c;就使用该编码读取文件内容。如果仍然出现解码错误&#xff0c;你可能需要…

虚幻Voxel插件

虚幻Voxel插件 Voxel Plugin Voxel Plugin brings smoothed voxel terrain to Unreal Engine 4. Generate, destroy and terraform the world! 体素插件可以在虚幻引擎中生成平滑的体素地形。创造、破环和改造世界。 Terrain generation and terraforming both in game and i…

CANOE 操作详情

canoe 手把手教你如何操作canoe工具&#xff1a; 1&#xff1a;创建test文件夹&#xff0c; 并在文件夹下创建3 文件夹 2&#xff1a;创建canoe工程&#xff0c;选择500波特率 3: 双击后进入 4&#xff1a;创建DBC文件 5 创建网络节点&#xff1a; 两个节点创建好之后&#x…

mpVue 微信小程序基于vant-weapp 组件的二次封装TForm 表单组件(适配移动端)——新增仓库地址

一、前言 1、mpVue微信小程序不支持动态组件&#xff08;<component> &#xff09; 2、mpVue微信小程序不支持动态属性及事件穿透&#xff08;$attrs和$listeners&#xff09; 3、mpVue微信小程序不支持render函数 二、最终效果 三、配置参数&#xff08;Attributes&…

OpenCV for Python 入坑第一天:图像的基础操作

我们都知道&#xff0c;OpenCV能够帮助我们处理视频和图像&#xff0c;咱们在图像处理中&#xff0c;除了Pillow库之外&#xff0c;最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python&#xff0c;一起来感受一下OpenCV的魅力吧&#xff01; 文章目录 读取图像 im…

深入了解Redis-基础篇

文章目录 一、故事背景二、知识点主要构成2.1、redis简介2.2、基于CentOS Linux docker容器化安装redis2.3、redis的数据类型2.3.1、String类型2.3.2、Hash类型2.3.3、List类型2.3.4、Set类型2.3.5、SortedSet类型 2.4、Redis的Java客户端2.4.1、Jedis2.4.1.1、Jedis的使用步骤…

leetcode 572. 另一棵树的子树(java)

另一棵树的子树 另一棵树的子树题目描述解法一 DFS解法二 KMP 算法 KMP 算法 另一棵树的子树 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/subtree-of-another-tree 题目描述 给你两棵二叉树 root 和 subRoot 。检验 …