51c~目标检测~合集4

自己的原文哦~https://blog.51cto.com/whaosoft/14042849

一、目标检测-框位置优化

本文主要从目标框位置优化的角度来介绍目标检测领域的相关工作,介绍了四个常用的预测框位置优化方法,介绍了各个方法的定义、思路、优化函数和一些常见的问题。

目标检测已经有了长足的发展,总体来说根据阶段个数,可以划分为Two-stage(Faster RCNN)、one-stage(SSD) 或者E2E(DETR)。根据是否基于anchor先验,可以划分为anchor-based(Faster RCNN)、anchor-free(CornerNet)的方法。 本文主要从目标框位置优化的角度来介绍目标检测领域的相关工作。框位置优化主要可以分为以下几个方面

By XYWH,这是指通过优化与ground truth的中心点坐标值、宽和高的值来实现目标框位置的优化

By keypoint,这是指通过优化关键点的方式来找到目标框的位置

By LRBT,这是指通过优化与ground truth 四条边之间的距离的方式来实现目标框位置的优化

By IoU,这是指通过最大化与GT计算得到的IoU来优化目标框的位置

uncertainty,解决目标检测框真值的边界不确定性

Optimize by XYWH定义

优化目标为预测bbox的中心点坐标(x,y)和宽高(width, height)与对应真值的差距尽可能的小。

接下来我们以Faster RCNN为例介绍该方法 。

思路

基于Anchor的先验,我们可以得知每个proposal的大概位置。考虑到利用Anchor的先验信息,作者使得预测框到anchor的距离和与子匹配的GT框到anchor的距离尽可能的相似。距离:XYWH的差值。

匹配方法

Q&A

为什么是SmoothL1?

A: smooth L1 在 x 较小时,对 x 的梯度也会变小,而在 x 很大时,对 x 的梯度的绝对值达到上限 1,也不会太大以至于破坏网络参数。smooth L1 可以避开 L1 和 L2 损失的缺陷。

Optimize by Keypoint

定义

优化目标为找到物体的两个关键点:左上点和右下点。核心为一个semantic segmentation问题。

接下来我们以Corner Net为例介绍该方法。

思路

不同于基于Anchor的方法,本方法需要先识别关键点在图中的位置。由于在pooling过程中会引入左边的误差,所以需要再针对每个关键点预测一个offset。

Q&A

如何训练和预测关键点?一个点一个pixel

A:作者使用2D Gaussian来生成,如下图所示,针对每个pixel,生成一个半径大小为r的圆形Gaussian分布。半径r的大小是自适应的。

半径r是通过下图所示的三种方式计算得到的最小值

若一个pixel对应了多个Gaussian分布的值,选择最大的。

如何根据top-left和bottom-right关键点两两组合形成最终的bbox?

A:作者提出针对每个keypoint 预测一个embedded vector,当top_left和bottom_left的embedded vector相似度大于一定阈值的时候则认为他们是描述的同一个bbox。则形成一个bbox

keypoint往往落在物体的外部,对应位置的特征可能不能很好表征物体,会增加识别关键点的难度。

A:作者提出了CornerPooling,其结构如下图所示

优化公式

综上所述,在该方式中,我们需要以下三个优化目标

1、关键点的分类,可以看成一个语义分割任务,作者采用了focal loss的变种,如下图所示

整体训练&推理流程

整个cornernet 的训练和推理流程如下图所示

Optimize by LRBT

上述基于关键点回归的方法有几个缺点 1、容易产生ghost bbox,这是由于tl br的embedded 相似度的确较高产生的 2、后处理的时候,若关键点较多,复杂度较高。为K^2的复杂度。 为了解决该问题,作者提出了基于LRBT的优化方式

定义

优化目标为物体的"中心点"距离四条边的距离

接下来我们以FCOS为例介绍该方法 。

思路

在feature map上找到每个"中心点",针对每个中心点预测和他对应的框的四个值。

Q&A

1、如何定义"中心点"

A:我们需要找到特征图上每个location(pixel)和gt_bbox的匹配关系,然后将匹配到的gt_bbox作为真值。

匹配关系:

location落在某个gt_bbox内部,这里的落在内部可以直接的理解为落在内部,也可以替换成其他规则。例如真实中心的某个范围。

为了加速收敛,l、r、t、b应该在某一个范围内,如果不在这个范围内,就以为着应该由其他location来优化。例如,都应该在scale_factor的范围内

2、如何解决一个物体框可能包括了多个"中心点"

可以支持这种1对多的关系,一个物体框有多个中心点负责预测,后续通过NMS消除。

但是每个中心点的权重作者认为是不一样的,因为距离物体实际中心近的中心点其难度较低,应该就越准确,所有在NMS的时候权重应该高。所以作者多了一个branch来预测centerness,即用于评估每个中心点的难易程度。

3、如何解决一个中心点可能落在多个物体框内部

作者选择面积最小的bbox作为优化目标,其实也可以优化多个?

Optimize by IoU

上述基本都是基于距离的回归,但是我们最终的评价指标是IoU,所以我们优化的目标和我们最终评价的指标之间还存在一些差异。在下面的case中,第一行所有情况的L2loss都是一样的,但是IoU和GIoU是存在一定差异的。在第二行中,L1 Loss都是一样的,但是IoU 和 GIoU 也是不一样的。

为了解决上述的差异,作者提出了使用IoU作为我们的优化目标

定义

优化目标为使得预测框和真值框IoU最大,使用IoU 作为损失函数主要有以下两个优势

  1. 优化目标和评价指标存在差异,Ln(L2, L1)范式优化和IoU优化并不完全等价,如上图所示。

  2. IoU对目标物体的scale不敏感。

但是直接使用IoU Loss也存在如下两个问题

  1. IoU值容易为0,且始终无法优化。

  2. IoU无法辨识不同方式的对齐,比如方向不一致。

为了解决上述问题,作者提出了GIoU General IoU Loss

GIoU

定义公式如下所示,C是包含A和B的最小box。 当IoU(A, B)为0的时候,优化目标转化为让C与AUB之间的空隙尽可能小。即就是A和B尽可能靠近。

复制代码
A = np.random.random([N, 4])
B = np.random.random([N, 4])
C = np.zero_like(A)
C[:, :2] = np.min(A[:, :2], B[:, :2])
C[:, 2:] = np.max(A[:, 2:], B[:, 2:])

实验结果如下所示

DIoU

Motivation

Distance IoU Loss 主要是为了解决如下两个问题

GIoU训练过程较慢,作者做的模拟实验见下图

GIoU倾向得到一个较大的bbox

GIoU 区分两个对象之间的对齐方式比较间接,仅通过引入C的方式来反应重叠的方式,不够直接。如下图所示。第二幅图展示来当GIoU一样的情况下,DIoU是不一致的(前提是,中心点重合的情况下认为拟合的最好)。

Contributions

提出了基于IoU Loss的一般性范式,这是我认为最大的贡献

提出了DIoU Loss,在IoU loss的基础上将central之间的距离作为惩罚项

在各个数据集和detector上都取得了不错的效果

Detail

范式:作为认为IoU loss应该优化的目标包括三个方面

两个框之间的重合度

中心点之间的距离

长宽比的相似性

作者基于上述的1&&2,提出了DIoU Loss,结合1&&2&&3提出了CIoU Loss(C is complete)

DIoU:定义如下所示,其中关键中心点之间距离的惩罚项的分子代表两个框中心点之间的欧式距离。分母是GIoU中矩阵C的对角线变长。分母起到了归一化的作用。

Optimize by uncertainty

Motivation

不一致性

训练和测试两个阶段的,如上图所示,训练的时候单独优化classification score和IoU score,测试的时候将其相乘,然后会导致训练和测试的时候不一致。

测试的时候,进入NMS的是classification score乘IoU score,就会存在一种情况classification score较低,但是IoU score较高,然后使得负样本没有被过滤。这是因为IoU score并没有对负样本做优化,所有负样本的IoU score并不受控制,如下图所示。

Localization Quality Estimation (LQE) 是许多one-stage或者anchor-free方法改善效果的途径。LQE的常用方法见下图所示。

但是上述的方法会带来一定的不一致性1,它主要包括以下两点

Contribution1

为了解决上述的问题,作者提出使用Joint的方式来联合优化classification score和IoU score。即就是用同一个prediction值即代表classification score又代表IoU score

不灵活性

目前目标检测的标准框有时候会存在标注的不确定性(或噪声),如下图所示。而目前常用的bbox优化方式是优化Dirac分布(具体什么是Dirac分布后续会介绍)。

但是Dirac分布过于固定,不能解决uncertain的问题,因此有人提出了Gaussian 分布。

但是作者认为Gaussian分布过于理想,不能适应于复杂的现实情况。

Contribution2

因此,作者提出了不依赖于任何先验的潜在分布优化(underlying distribution)

Method

Quality Focal Loss

  • 在上一节,我们介绍了作者使用同一个prediction score来同时表示classification score和IoU score,那么优化该值的时候真值应该是什么呢?作者选择IoU值作为优化的真值,由于IoU是一个[0,1]之间的连续值。而传统的focal loss优化的目标是{0, 1}这样的离散值。因此该loss更加泛化一点(general)
  • Quality Focal Loss就是上述的更加泛化的FocalLoss,其定义如下所示
  • 上述公式的后部分是展开形式的交叉熵,系数是adaptive的,当预测是和真值接近的时候,系数小,当远的时候系数大。

Distribution Focal Loss

在本节我们主要介绍以下何为Distribution,以及我们的Distribution Focal Loss。

  • 先看为什么是Distribution?传统的BBox regression即就是直接优化两个值,让pred_w接近真值的w。
  • 换个角度看,假设我们预测的值为pred_w, 我们直接优化pred_w接近w,那么我们就相当于让pred_w出现的概率是1.0。这即就是Dirac Distribution,其如下图所示。
  • 接下来在看我们的Distribution Focal Loss, 有上式可知,上式是比Dirac更加泛化的形式。因此本文用上式来计算预测的y^。预测y^之前我们需要先清楚两点
  • 连续值的积分是不好实现的,我们可以用离散值的求和来代替
  • 我们需要确定预测值的范围。
  • 有了上述两个条件,我们可以得到pred^的计算公式如下所示。

得到上述的y的预测值后,我们如何去优化呢?因为我们知道y^是接近y的,因此我们需要让int(y)和int(y)+1的prob最大。因此就可以对应下面的公式。

Discussion

  • GIoU 是否必须? 根据总的Loss定义,我们发现GIoU貌似不是必须,因为通过 distribution focal loss也可以起到bbox优化的目的。因此我们做了对比实验,发现取消GIoU loss会带来小幅度的指标下降。
  • 别的应用场景 数据分类(带有噪声)。针对每个类,我们将其拆分成N份(0., 0.1, 0.2, ..., 1.0),分别预测每一份的概率,然后求和,即为最终该类别的概率。
  • distribution的意义 分布越陡峭,证明越确定,否则越不确定。
二、目标检测-DETR

今天聊nms时想起了这个 , 这个不需要nms, 目前nms free还不是太好 后处理还是需要, 好了还是搬运今天的主角把, 大佬们勿怪啊~~

TRansformer之前还是发了一些文章的~~ 这里在说一下哈

DETR的全称是DEtection TRansformer,是Facebook提出的基于Transformer的端到端目标检测网络

开源代码 GitHub - facebookresearch/detr: End-to-End Object Detection with Transformers

Transformer自2017年被提出以来,迅速得到了广泛应用,不仅仅在NLP领域基本成为了一个统一的范式, 也被应用到一些视觉的领域,比如图像分类、目标检测、行为识别等,在部分功能上取代了CNN,大有一种统一NLP和CV的趋势。

作为Transformer用在目标检测领域的开山之作,DETR是CV领域学习Transformer绕不过的一道坎。前人栽树后人乘凉,学习一些经典的思路和代码对自己的提升也是巨大的。

Transformer最早由Google提出,成功应用于自然语言处理,目前已经在许多自然语言处理任务中取得了SOTA的成果。Transformer本质上仍然是一个Encoder-Decoder的结构,encoder和decoder均是一种Self-Attention模块的多重叠加,结构如图所示:

原版Transformer结构

和传统的序列模型如RNN相比,Transformer的主要改进在于:

将RNN变为多个自注意力Self-Attention结构的叠加

并行计算序列中任意元素相对于其他所有元素的相关性,高效地提取上下文中的相关性,并引入多头注意力Multi-head Attention机制,从多角度提取特征

用位置编码来描述序列的前后信息,取代了RNN串行的计算过程

这里推荐几个参考博客,里面有详细的动画展示了序列模型和自注意力机制是如何工作的

图解Transformer:

The Illustrated Transformer -- Jay Alammar -- Visualizing machine learning one concept at a time.

The Illustrated Transformer:

The Illustrated Transformer -- Jay Alammar -- Visualizing machine learning one concept at a time.

图解sequence model和Attention:

Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention) -- Jay Alammar -- Visualizing machine learning one concept at a time.

此外哈佛大学还编写了一个极为详细的注解Attention is All You Need原文的博客,使用代码实现了Transformer的每一个关键步骤。可以在github或Google Colab上找到该项目的源代码:

The Annotated Transformer

以及对应的中文翻译版本:

搞懂Transformer结构,看这篇PyTorch实现就够了(上) - 知乎

下面结合PyTorch的接口展示一下Transformer的实际用法。

PyTorch的接口定义参考

Transformer --- PyTorch 1.12 documentation

可以看出PyTorch对Transformer的封装是通过torch.nn.Transformer来实现的。该对象的构造函数比较复杂,主要包含以下几个参数:

复制代码
torch.nn.Transformer(d_model: int = 512,nhead: int = 8,num_encoder_layers: int = 6,num_decoder_layers: int = 6,dim_feedforward: int = 2048,dropout: float = 0.1,activation: str = 'relu',custom_encoder: Optional[Any] = None,custom_decoder: Optional[Any] = None)

nn.Transformer参数

其中d_model是word embedding的channel数;n_head是多头注意力的个数,论文中为8;num_encoder_layers和num_decoder_layers分别对应编码器和解码器的自注意力模块叠加的次数;dim_feedforward对应编码器-解码器中的Linear层的维度。

nn.Transformer的forward函数实现了编码和解码的过程:

复制代码
forward(src: torch.Tensor,tgt: torch.Tensor,src_mask: Optional[torch.Tensor] = None,tgt_mask: Optional[torch.Tensor] = None,memory_mask: Optional[torch.Tensor] = None,src_key_padding_mask: Optional[torch.Tensor] = None,tgt_key_padding_mask: Optional[torch.Tensor] = None,memory_key_padding_mask: Optional[torch.Tensor] = None)→ torch.Tensor

forward的参数也比较多,如图所示:

其中必须的两个是src和tgt,分别对应于编码器的输入inputs和解码器的输入outputs。tgt的作用有点类似于一种条件约束。Decoder的第一层的tgt输入是一个词嵌入向量,从第二层开始是前一层的计算结果。

其他可选参数中,[src/tgt/memory]_mask是一个掩码数组,定义了计算Attention的策略,对应于原文的3.1节。一个通俗解释为:一个词序列中,每个词只能被它前面的词所影响,所以这个词后面的所有位置都需要被忽略,所以在计算Attention的时候,该词向量和它后面的词向量的相关性为0。

src/tgt/memory\]_key_padding_mask也是掩码数组,定义了src, tgt和memory中哪些位置需要保留,哪些需要忽略。 这些参数的shape依次为: src: (S,N,E) tgt: (T,N,E) src_mask: (S,S) tgt_mask: (T,T) memory_mask: (T,S) src_key_padding_mask: (N,S) tgt_key_padding_mask: (N,T) memory_key_padding_mask: (N,S) Transformer输出的shape为: output: (T,N,E) 其中S为源序列的长度,T为目标序列的长度,N为batch size,E为词嵌入向量的维度。 好了下面是今天真正的主角了... DETR DETR的思路和传统的目标检测的本质思路有相似之处,但表现方式很不一样。传统的方法比如Anchor-based方法本质上是对预定义的密集anchors进行类别的分类和边框系数的回归。DETR则是将目标检测视为一个集合预测问题(集合和anchors的作用类似)。由于Transformer本质上是一个序列转换的作用,因此,可以将DETR视为一个从图像序列到一个集合序列的转换过程。该集合实际上就是一个可学习的位置编码(文章中也称为object queries或者output positional encoding,代码中叫作query_embed)。 DETR的网络结构如图所示: ![](https://img-home.csdnimg.cn/images/20230724024159.png) DETR算法流程 DETR使用的Transformer结构和原始版本稍有不同: ![](https://img-home.csdnimg.cn/images/20230724024159.png) DETR的encoder decoder spatial positional encoding是作者自己提出的二维空间位置编码方法,该位置编码分别被加入到了encoder的self attention和decoder的cross attention,同时object queries也被加入到了decoder的两个attention中。而原版的Transformer将位置编码加到了input和output embedding中。值得一提的是,作者在消融实验中指出即使不给encoder添加任何位置编码,最终的AP也只比完整的DETR下降了1.3个点。 代码基于PyTorch重写了TransformerEncoderLayer, TransformerDecoderLayer类,用到的PyTorch接口只有nn.MultiheadAttention类。源码需要PyTorch 1.5.0以上版本。 代码核心位于models/transformer.py和models/detr.py。 transformer.py class Transformer(nn.Module): def __init__(self, d_model=512, nhead=8, num_encoder_layers=6, num_decoder_layers=6, dim_feedforward=2048, dropout=0.1, activation="relu", normalize_before=False, return_intermediate_dec=False): super().__init__() encoder_layer = TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout, activation, normalize_before) encoder_norm = nn.LayerNorm(d_model) if normalize_before else None self.encoder = TransformerEncoder(encoder_layer, num_encoder_layers, encoder_norm) decoder_layer = TransformerDecoderLayer(d_model, nhead, dim_feedforward, dropout, activation, normalize_before) decoder_norm = nn.LayerNorm(d_model) self.decoder = TransformerDecoder(decoder_layer, num_decoder_layers, decoder_norm, return_intermediate=return_intermediate_dec) def forward(self, src, mask, query_embed, pos_embed): # flatten NxCxHxW to HWxNxC bs, c, h, w = src.shape src = src.flatten(2).permute(2, 0, 1) pos_embed = pos_embed.flatten(2).permute(2, 0, 1) query_embed = query_embed.unsqueeze(1).repeat(1, bs, 1) mask = mask.flatten(1) tgt = torch.zeros_like(query_embed) memory = self.encoder(src, src_key_padding_mask=mask, pos=pos_embed) hs = self.decoder(tgt, memory, memory_key_padding_mask=mask, pos=pos_embed, query_pos=query_embed) return hs.transpose(1, 2), memory.permute(1, 2, 0).view(bs, c, h, w) Transformer类包含了一个Encoder和一个Decoder对象。相关类的实现均可在transformer.py中找到。重点看一下forward函数,有一个对输入tensor的变换操作:# flatten NxCxHxW to HWxNxC。 结合PyTorch中对src和tgt的形状定义可以发现,DETR的思路是将backbone输出特征图的像素展开成一维后当成了序列长度,而batch和channel的定义不变。故而DETR可以计算特征图的每一个像素相对于其他所有像素的相关性,这一点在CNN中是依靠感受野来实现的,可以看出Transformer能够捕获到比CNN更大的感受范围。 DETR在计算attention的时候没有使用masked attention,因为将特征图展开成一维以后,所有像素都可能是互相关联的,因此没必要规定mask。而src_key_padding_mask是用来将zero_pad的部分给去掉。 forward函数中有两个关键变量pos_embed和query_embed。其中pos_embed是位置编码,位于models/position_encoding.py. position_encoding.py 针对二维特征图的特点,DETR实现了自己的二维位置编码方式。代码如下 class PositionEmbeddingSine(nn.Module): """ This is a more standard version of the position embedding, very similar to the one used by the Attention is all you need paper, generalized to work on images. """ def __init__(self, num_pos_feats=64, temperature=10000, normalize=False, scale=None): super().__init__() self.num_pos_feats = num_pos_feats self.temperature = temperature self.normalize = normalize if scale is not None and normalize is False: raise ValueError("normalize should be True if scale is passed") if scale is None: scale = 2 * math.pi self.scale = scale def forward(self, tensor_list: NestedTensor): x = tensor_list.tensors mask = tensor_list.mask assert mask is not None not_mask = ~mask y_embed = not_mask.cumsum(1, dtype=torch.float32) x_embed = not_mask.cumsum(2, dtype=torch.float32) if self.normalize: eps = 1e-6 y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device) dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) pos_x = x_embed[:, :, :, None] / dim_t pos_y = y_embed[:, :, :, None] / dim_t pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3) pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3) pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) return pos 的mask是一个位置掩码数组,对于一个没有经过zero_pad的图像,它的mask是一个全为0的数组。 Transformer原文中采用的位置编码方式为正弦编码,计算公式为 ![](https://img-home.csdnimg.cn/images/20230724024159.png) Transformer位置编码 pos是词向量在序列中的位置,而 i 是channel的index。对照代码,可以看出DETR是为二维特征图的 x 和 y 方向各自计算了一个位置编码,每个维度的位置编码长度为num_pos_feats(该数值实际上为hidden_dim的一半),对x或y,计算奇数位置的正弦,计算偶数位置的余弦,然后将pos_x和pos_y拼接起来得到一个NHWD的数组,再经过permute(0,3,1,2),形状变为NDHW,其中D等于hidden_dim。这个hidden_dim是Transformer输入向量的维度,在实现上,要等于CNN backbone输出的特征图的维度。所以pos code和CNN输出特征的形状是完全一样的。 src = src.flatten(2).permute(2, 0, 1) pos_embed = pos_embed.flatten(2).permute(2, 0, 1) 将CNN输出的features和pos code均进行flatten和permute操作,将形状变为SNE,符合PyTorch的输入形状定义。在TransformerEncoder中,会将src和pos_embed相加。可自行查看代码。 detr.py class DETR 该类封装了整个DETR的计算流程。首先来看论文中反复提到的object queries到底是什么。 答案就是query_embed。 代码中,query_embed实际上就是一个embedding数组: self.query_embed = nn.Embedding(num_queries, hidden_dim) 其中,num_queries是预定义的目标查询的个数,代码中默认为100。它的意义是:根据Encoder编码的特征,Decoder将100个查询转化成100个目标。通常100个查询已经足够了,很少有图像能包含超过100个目标(除非超密集的任务),相比之下,基于CNN的方法要预测的anchors数目动辄上万,计算代价实在是很大。 Transformer的forward函数中定义了一个和query_embed形状相同的全为0的数组target,然后在TransformerDecoderLayer的forward中把query_embed和target相加(这里query_embed的作用表现的和位置编码类似),在self attention中作为query和key;在multi-head attention中作为query: class TransformerDecoderLayer(nn.Module): def forward_post(self, tgt, memory, tgt_mask: Optional[Tensor] = None, memory_mask: Optional[Tensor] = None, tgt_key_padding_mask: Optional[Tensor] = None, memory_key_padding_mask: Optional[Tensor] = None, pos: Optional[Tensor] = None, query_pos: Optional[Tensor] = None): q = k = self.with_pos_embed(tgt, query_pos) tgt2 = self.self_attn(q, k, value=tgt, attn_mask=tgt_mask, key_padding_mask=tgt_key_padding_mask)[0] tgt = tgt + self.dropout1(tgt2) tgt = self.norm1(tgt) tgt2 = self.multihead_attn(query=self.with_pos_embed(tgt, query_pos), key=self.with_pos_embed(memory, pos), value=memory, attn_mask=memory_mask, key_padding_mask=memory_key_padding_mask)[0] tgt = tgt + self.dropout2(tgt2) tgt = self.norm2(tgt) tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt)))) tgt = tgt + self.dropout3(tgt2) tgt = self.norm3(tgt) return tgt object queries在经过decoder的计算以后,会输出一个形状为TNE的数组,其中T是object queries的序列长度,即100,N是batch size,E是特征channel。 最后通过一个Linear层输出class预测,通过一个多层感知机结构输出box预测: self.class_embed = nn.Linear(hidden_dim, num_classes + 1) self.bbox_embed = MLP(hidden_dim, hidden_dim, 4, 3) #forward hs = self.transformer(self.input_proj(src), mask, self.query_embed.weight, pos[-1])[0] outputs_class = self.class_embed(hs) outputs_coord = self.bbox_embed(hs).sigmoid() out = {'pred_logits': outputs_class[-1], 'pred_boxes': outputs_coord[-1]} 分类输出的通道为num_classes+1,类别从0开始,背景类别为num_classes。 class SetCriterion 该类负责loss的计算。 基于CNN的方法会计算每个anchor的预测结果,然后利用预测结果和ground truth box之间计算iou,挑选iou大于一定阈值的那些anchors作为正样本,来回归它们的class和box deltas。类似的,DETR也会计算每个object query的prediction,但DETR会直接计算box的四个角的归一化值,而不再基于box deltas: ![](https://img-home.csdnimg.cn/images/20230724024159.png) 然后将这些object predictions和ground truth box之间进行二分匹配。DETR使用匈牙利算法来完成这一匹配过程。 ![](https://img-home.csdnimg.cn/images/20230724024159.png) DETR set匹配 假如有N个目标,那么100个object predictions中就会有N个能够匹配到这N个ground truth,其他的都会和"no object"匹配成功,这些predictions的类别label就会被分配为num_classes,即表示该prediction是背景。 这样的设计是很不错的,理论上每个object query都有唯一匹配的目标,不会存在重叠,所以DETR不需要nms进行后处理。 根据匹配结果计算loss的公式为: ![](https://img-home.csdnimg.cn/images/20230724024159.png) 损失函数 class SetCriterion(nn.Module): def forward(self, outputs, targets): """ This performs the loss computation. Parameters: outputs: dict of tensors, see the output specification of the model for the format targets: list of dicts, such that len(targets) == batch_size. The expected keys in each dict depends on the losses applied, see each loss' doc """ outputs_without_aux = {k: v for k, v in outputs.items() if k != 'aux_outputs'} # Retrieve the matching between the outputs of the last layer and the targets indices = self.matcher(outputs_without_aux, targets) # Compute the average number of target boxes accross all nodes, for normalization purposes num_boxes = sum(len(t["labels"]) for t in targets) num_boxes = torch.as_tensor([num_boxes], dtype=torch.float, device=next(iter(outputs.values())).device) if is_dist_avail_and_initialized(): torch.distributed.all_reduce(num_boxes) num_boxes = torch.clamp(num_boxes / get_world_size(), min=1).item() # Compute all the requested losses losses = {} for loss in self.losses: losses.update(self.get_loss(loss, outputs, targets, indices, num_boxes)) 通过self.matcher将outputs_without_aux和targets进行匹配。匈牙利算法会返回一个indices tuple,该tuple包含了src和target的index。具体匹配过程请参考models/matcher.py。 分类loss 分类loss采用的是交叉熵损失,针对所有predictions def loss_labels(self, outputs, targets, indices, num_boxes, log=True): src_logits = outputs['pred_logits'] idx = self._get_src_permutation_idx(indices) target_classes_o = torch.cat([t["labels"][J] for t, (_, J) in zip(targets, indices)]) target_classes = torch.full(src_logits.shape[:2], self.num_classes, dtype=torch.int64, device=src_logits.device) target_classes[idx] = target_classes_o loss_ce = F.cross_entropy(src_logits.transpose(1, 2), target_classes, self.empty_weight) losses = {'loss_ce': loss_ce} return losses target_classes_o是按target index获取的所有匹配成功的真值类别,并按src index将其放入target_classes的对应位置。匹配失败的predictions在target_classes中用self.num_classes来填充。函数_get_src_permutation_idx的作用是从indices tuple中取得src的batch index和对应的match index。 2. box loss box loss采用了l1 loss和giou loss,针对匹配成功的predictions def loss_boxes(self, outputs, targets, indices, num_boxes): """Compute the losses related to the bounding boxes, the L1 regression loss and the GIoU loss targets dicts must contain the key "boxes" containing a tensor of dim [nb_target_boxes, 4] The target boxes are expected in format (center_x, center_y, w, h), normalized by the image size. """ assert 'pred_boxes' in outputs idx = self._get_src_permutation_idx(indices) src_boxes = outputs['pred_boxes'][idx] target_boxes = torch.cat([t['boxes'][i] for t, (_, i) in zip(targets, indices)], dim=0) loss_bbox = F.l1_loss(src_boxes, target_boxes, reduction='none') losses = {} losses['loss_bbox'] = loss_bbox.sum() / num_boxes loss_giou = 1 - torch.diag(box_ops.generalized_box_iou( box_ops.box_cxcywh_to_xyxy(src_boxes), box_ops.box_cxcywh_to_xyxy(target_boxes))) losses['loss_giou'] = loss_giou.sum() / num_boxes return losses target_boxes 是按target index获取的所有匹配成功的真值box,src_boxes是按src index获取的匹配成功的predictions,计算它们之间的l1_loss和giou loss 3. mask loss 文章还扩展了全景分割的实验,使用mask loss,用来回归segmentation map,这里就不展开将讲解了,感兴趣可以自行查看代码。 实验和baseline的对比 下面看一下DETR的实验结果。文章选择与RetinaNet和Faster-RCNN做比较 ![](https://img-home.csdnimg.cn/images/20230724024159.png) COCO实验对比 可以看出DETR的效果还是很不错的,基于ResNet50的DETR取得了和经过各种finetune的Faster-RCNN相媲美的效果。同时DETR在大目标检测上性能是最好的,但是小目标上稍差,而且基于match的loss导致学习很难收敛。 Deformable DETR的出现较好的解决了这两个问题。 DETR运行需要巨大的显存。作者使用的图像最大的边长为1333,在16个V100上也只能开到batch size=64,训练了三天,共300个epochs。一般实验室还真玩不起== DETR用于全景分割 为Decoder的每个object embedding加上一个mask head就可以实现像素级分割的功能 ![](https://img-home.csdnimg.cn/images/20230724024159.png) mask head可以和box embed联合训练,也可以训练完了box embed以后再单独训练mask head。 DETR的做法和Mask-RCNN比较像,都是在给定的box prediction的基础上预测该box对应instance的segmentation。这里DETR将mask head输出的attention map进行上采样以后,和backbone的一些分支进行相加,实现一个FPN的功能,然后将所有的box对应的mask map进行bitwise argmax操作,得到最终的分割图。 结语 只想感叹一句,大佬们无论用什么网络结构都能做出惊艳的结果。 个人感觉Transformer最强大的地方还是在于sequence model,而在检测和分割领域,不一定能完全取代CNN,至少目前来看,基于Transformer的结构还是略显臃肿,而且精度不能稳压CNN,尤其是针对小目标,更不要说CNN在移动端、落地应用方面已经打下了坚实的基础,所以将Transformer用在vision任务上,可能更多是停留在学术领域,尤其是一些时序相关的视觉任务,比如行为识别、异常检测、图像理解、图像或视频生成等。 ##### 三、目标检测\~NAS-FPN 任意方向的目标检测是一项具有挑战性的任务。这是旋转角度的目标检测\~\~ 论文地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=\&arnumber=9521517 目标检测是计算机视觉中的一项基本任务,许多研究人员已经应用水平边界框来定位图像中的物体。 水平边界框的使用可以使候选区域的表示更加简洁直观。 在许多基于深度学习的方法中,往往需要大量标记样本来训练目标检测器模型,使用轴平行标记框可以大大提高标记效率,快速获取大量标记样本。 此外,水平边界框涉及的参数较少,简化了检测模型的训练过程。 因此,在大多数目标检测方法中,使用水平边界框来表示遥感图像中目标的大致范围,如下图所示。 ![](https://img-home.csdnimg.cn/images/20230724024159.png) 然而,航拍图像中的物体通常是任意方向的。因此,使用水平边界框来检测目标会引起几个问题。首先,这种类型的物体检测框通常包含许多背景区域。如上图(a)所示,图中大约60%的区域属于背景区域。检测框内存在过多的背景区域,不仅增加了分类任务的难度,而且会导致目标范围表示不准确的问题。其次,水平边界框会导致检测框之间出现强烈重叠,如上图(b)所示,降低检测精度。最后,由于飞机、船舶、车辆等图像中的物体包含运动方向信息,如果使用水平边界框,则无法获得目标运动方向的信息。 ![](https://img-home.csdnimg.cn/images/20230724024159.png) **上述三个问题可以通过使用带有角度信息的旋转检测框有效解决**,如上图所示。首先,旋转检测可以精确定位图像中的物体,并且边界框几乎不包含背景区域,从而减少背景对物体分类的影响。其次,旋转检测框之间几乎没有重叠,从而可以更清晰地识别框内包含的物体。最后,可以从旋转检测框粗略得到物体的运动方向信息,从而判断物体的运动轨迹。综上所述,在遥感图像目标检测任务中使用带有角度信息的旋转检测框获得了优越的性能。 任意方向的目标检测是一项具有挑战性的任务。由于遥感图像中的物体方向是任意的,使用水平边界框会导致检测精度低。现有的基于回归的旋转检测器会导致边界不连续的问题。 在今天的分享中,研究者提出了一种基于角度分类的遥感图像目标检测方法,该方法使用带有角度信息的旋转检测边界框来检测对象。具体来说,研究者将神经架构搜索框架与特征金字塔网络 (NAS-FPN) 模块结合到密集检测器 (RetinaNet) 中,并在角度分类中使用二进制编码方法。这种方法减少了背景影响,使得检测框之间几乎没有重叠。根据检测框的角度,我们可以推断出目标的运动方向信息,进一步确定目标的运动轨迹。 研究者对一个可用于航空影像 (DOTA) 中的目标检测的大型公共数据进行了消融实验,以验证该方法中每个模块的有效性,并将该方法与其他几种检测方法进行比较。实验结果证明了新提出方法的有效性。 **新框架** ![](https://img-home.csdnimg.cn/images/20230724024159.png) 新提出的旋转检测器框架如上图所示。网络基于RetinaNet框架。图中标记为C2、C3、C4的特征图是由深度卷积神经网络提取的。该方法的总体步骤如下:首先利用特征提取网络对遥感图像中的特征进行提取,利用NAS-FPN对提取的特征进行融合,得到不同尺度的特征图。然后,使用长边定义方法来表示旋转检测框,并在框回归任务中使用二进制编码标记技术将角度回归问题转化为角度分类问题。下面详细描述该方法中的一些重要结构。 **NAS-FPN** 在NAS-FPN中,最重要的结构是由特征图节点集合、操作池和搜索终止条件组成的合并单元结构。下图简要描述了特征图的搜索过程。 ![](https://img-home.csdnimg.cn/images/20230724024159.png) 1)从特征图节点集中随机选择一个特征图作为输入之一。初始特征图节点集包含五个尺度的特征图,表示为 {C1,C2, C3, C4, C5}。 2)从特征图节点集中随机选择另一个特征图作为另一个输入。 3)选择输出特征图的分辨率。 4)在操作池中选择一个操作对(1)(2)中选择的特征图节点进行操作,产生与输出特征图分辨率相同的特征图,并将该特征图加入到特征图节点集合中选择。 5) 循环重复上述步骤。搜索的终止条件是生成五个与初始特征图分辨率相同的特征金字塔网络,记为{P1, P2, P3, P4, P5}。 **ROTATION DETECTION FRAME** 典型的角度编码方法有三种,包括两种不同角度范围的五参数方法和一种八参数方法。详细情况如下: ![](https://img-home.csdnimg.cn/images/20230724024159.png) 角度范围为90°的五参数法(OpenCV定义法):其示意图如上图所示。该定义法包含五个参数\[x,y,w,h,θ\]。其中,x和y为旋转坐标系的中心坐标,θ为旋转坐标系与x轴的锐角,逆时针方向指定为负角,因此角度范围为\[−90° , 0); 旋转框的宽度w为旋转框所在的边角,旋转框的高度h为另一边。 ![](https://img-home.csdnimg.cn/images/20230724024159.png) 180°角范围的五参数法 ![](https://img-home.csdnimg.cn/images/20230724024159.png) 八参数法 八参数法:该定义方法示意图如上图所示,该定义方法包含8个参数\[a1,a2,b1,b2,c1,c2,d1,d2\], 定义的左上角为起点,其余点按逆时针顺序排列。旋转坐标系的表示不限于上述三种方法,旋转坐标系其余部分的表示可以通过上述三种方法的变换得到。 **ANGLE CODING METHOD** 90°范围的五参数定义方法的问题 ![](https://img-home.csdnimg.cn/images/20230724024159.png) 八参数四边形定义方法的问题 **角度编码方法:** ![](https://img-home.csdnimg.cn/images/20230724024159.png) **实验及可视化** **实验环境** ![](https://img-home.csdnimg.cn/images/20230724024159.png) **DOTA数据集上的性能比较** ![](https://img-home.csdnimg.cn/images/20230724024159.png) ![](https://img-home.csdnimg.cn/images/20230724024159.png) ![](https://img-home.csdnimg.cn/images/20230724024159.png) ##### 四、目标检测\~DETR-family 这里说训练过程并将被忽视的现象归因于两个限制:缺乏训练重点和解码序列的级联错误。作者们设计并展示了选择性查询回收 (SQR),在 Adamixer、DAB-DETR 和 Deformable-DETR 上应用 SQR,并始终带来 1.4-2.8 的 AP 改进。 分享一下我们最近的目标检测文章,Enhanced Training of Query-Based Object Detection via Selective Query Recollection 文章一审 a,wa,wa, 最终收录于 CVPR2023。在此介绍文章主要内容,和一些有趣的现象,以及我们的思考 论文:https://arxiv.org/abs/2212.07593 代码:https://github.com/Fangyi-Chen/SQR 推荐阅读:DETR\[1\], Adamixer\[2\], Deformable DETR\[3\], DAB DETR\[4\], Group DETR\[5\], H-DETR\[6

一个有趣的现象:

我们知道,DETR[1]检测器的重要组成是decoder,也是和之前anchor-base/anchor-free 检测器的区别所在。decoder通常有6层(6 decoding layers)组成,每层的任务和训练方式没什么差别。具体地,decoder肩负三个任务:1.以cross attention或者adamixer[2] 的方式, 把query 和feature map进行充分交互,从而能让query感知到object的存在。2.以self-attention的方式,把query和别的query进行交互,从而能让query感知其他query的信息,比如物体的co-occurance或者重复检测。3. 用几层mlp把query翻译为物体的类别和检测框。每层decoding layer接受上一层的输出,并以残差的形式进行refine。这样每层的结果是逐渐变好的。

确实,从总体来看,每层的mAP逐渐增加。但当我们可视化每一层的具体的结果的时候,我们发现一个有意思的现象:有一些本来前几层检测出来的物体,在第六层没了...比如下图:(0.27 低于常用的0.3阈值)

这个现象significant 吗?

我们定义了两个新的量来研究一下有多少query会有类似这种现象。

第一个量: TP F Rate. 在第六层,对于某一个query,如果它对应的预测是一个True positive, 那必然是匹配到了一个ground-truth G. 那我们就去第1~5层查看和这个query 对应的5个query,看它们的预测是不是也能匹配到这个同样的ground-truth G, 并且有更高的IOU匹配度和更高的confident score 。这是个非常强的条件。如果这件事发生了(5个只要有一个就行), 那就算一次。我们遍历所有的val 图片和所有的query,对于adamixer这个发生率是26%左右,对于deformable detr这个发生率是50%左右。

第二个量:FP E Rate. 类似地,在第六层,对于某一个query,如果它对应的预测是一个False positive, 那我们就去查看对应的5个query,看它们的预测的confident是不是更低。这个发生率是50%左右。

可以看出,这两个量都很高。在此解答两个可能的疑惑:1. 为什么deformable detr TP F rate 能这么高?因为deformable detr 后三个decoding layer的mAP很接近(44.2 vs 44.4 vs 44.5),所以第六层相对没那么强。2. 如果FP E Rate 的对应5个query的预测有一个TP,这种情况怎么办?答:这是一种更糟的情况,但是实测出现概率没那么高。

不过我们观察到,大半的case是marginally triggered ,即前五层的某个结果只比第六层好一点点,肉眼几乎不可见,这一点在对比deformable DETR的第五层和第六层的结果时尤为明显--第五层和第六层的结果非常接近。在对比第四层和第六层的结果时,很多sample的区别明显起来,如fig 2。在多数情况下,第六层的结果依然是最优的(之一),毕竟mAP更高。

这个现象带来的motivation:

本文从训练的角度来思考这个问题: 每层decoder的任务是有轻有重的,对最后的mAP的作用也有大有小。最后一层的结果是决定性的,直接影响mAP,而第一层即使错了,后面也有五层可以帮忙更正。然而在训练的时候,所有的层的训练方式都被粗暴地归为一统,也就是hungarian matching+3个loss。我们认为这种训练是不合理的,后面的decoding layer应该接受更好更强的训练。

另外,因为后面的decoding layer的output (refined query)并不一定比前面的好,下一层的input仅仅是上一层的ouput,这样之前的query没有机会参与很后面的优化。我们希望能把这个query引入到后面几层使其帮助后面的优化。

(补充一个没有验证过的猜想, 也许第一层就不应该有loss, 或者应该用不同的loss。因为也许第一层不适合学习太强的semantic信息,更适合学弱语义信息。加上loss会破坏了一些东西)

一个初始的探索

我们希望这样的一个训练方案:后面的decoding layer 能得到比前面的layer更多更好的优化。并且后面的decoding layer 能'看到'前面较远的query,而不仅仅是前面一个layer的输出。

一个简单设计的方案DQR可以同时做到这两点。如fig 3 (b)

DQR 把每一层的query全部作为后面每一层的输入。这些query分别做self att, cross att, hungarian matching, 操作类似Group DETR和 H-DETR。这样每一层的监督信号是下一层的两倍,形成几何序列1,2,4,8,16,32。

第二个探索

DQR的效果不错,但是训练计算量显著增加。另外,第一层的query 直接给到第六层,会带来很大的learning gap。Plus, 我们在分析了TP F Rate 和FP E Rate后,我们发现对于第六层,只有第四层和第五层的贡献比较大。所以我们提出SQR (selective query recollection, fig 3 c)。每一层的输入不再是之前所有层 的输出,而是选上一层和上上层的输出。这种选择性地输入使计算量大减,形成斐波那契数列1,2,3,5,8,13

SQR作为本文主要方法,在各种DETR上稳定涨点。

第三个探索

这个探索是另外一个有趣的工程上的发现。用 DQR 来减小模型尺寸。放在文章的附录里。

现有方法通常有 6 层decoding layer。我们可以训练检测器让所有层共享参数吗?我们实施了这个想法,让模型在训练时share参数,但发现模型不收敛。但我们发现 DQR 有能力实现目标。上文介绍,DQR可以训练一个强大的final decoding layer,这个layer见过之前所有layer的query,所以我们在训练时用DQR正常训,测试时循环6次final decoding layer,那每一层decoing layer 不都是最强的了吗?想法很美好,结果最后AP 居然是0!

原因是最后这一层decoding layer 在训练的时候,没有输入过它自己的输出。它的输出和自己的输入已经有了不小的shift, 它也不再有能力去理解它自己的输出了。所以我们在训练时,在DQR的基础上,对最后一个decoding stage 输入了它自己的输出。这样得到的final layer, 我们在inference时可以只用第六层循环6次,模型的size也被大大减小了(1.6GB 至 513MB)。而且它只需要 5 个阶段就可以实现比以前更好的性能(42.8AP 对比 42.5AP)。

未来可能的探索

SQR的选择机制不够优雅,也不够dynamic。另外在inference时如果有个机制去选最好的layer也是不错的option。

对别的任务呢?

我们没有资源在多个任务上大搞特搞,只搞了detection。一个大胆又合理的猜测是,应该也work. XD

五、目标检测の共性问题总结

这里对目标检测领域的一些共性问题进行了总结,并给出了详细的解答。是CV面试面经宝典

目标检测两阶段和一阶段的核心区别

目标检测技术从阶段上分为两种,一阶段和二阶段。二阶段的核心思想是首先提出proposal框,通过第一阶段的网络回归出目标框的大概位置、大小及是前景的概率,第二阶段是通过另一个网络回归出目标框的位置、大小及类别;而一阶段网络的核心是,对于输入图像,通过网络直接回归出目标大小、位置和类别。

目标检测两阶段比一阶段的算法精度高的原因

1.正负样本的不均衡性

当某一类别的样本数特别多的时候,训练出来的网络对该类的检测精度往往会比较高。而当某一类的训练样本数较少的时候,模型对该类目标的检测精度就会有所下降,这就是所谓样本的不均衡性导致的检测精度的差异。

对于一阶段的目标检测来说,它既要做定位又要做分类,最后几层中1×1的卷积层的loss都混合在一起,没有明确的分工哪部分专门做分类,哪部分专门做预测框的回归,这样的话对于每个参数来说,学习的难度就增加了。

对于二阶段的目标检测来说(Faster RCNN),在RPN网络结构中进行了前景和背景的分类和检测,这个过程与一阶段的目标检测直接一上来就进行分类和检测要简单的很多,有了前景和背景的区分,就可以选择性的挑选样本,是的正负样本变得更加的均衡,然后重点对一些参数进行分类训练。训练的分类难度会比一阶段目标检测直接做混合分类和预测框回归要来的简单很多。

2.样本的不一致性

怎么理解样本不一致性呢?首先我们都知道在RPN获得多个anchors的时候,会使用一个NMS。在进行回归操作的时候,预测框和gt的IoU同回归后预测框和gt的IOU相比,一般会有较大的变化,但是NMS使用的时候用的是回归前的置信度,这样就会导致一些回归后高IoU的预测框被删除。这就使得回归前的置信度并不能完全表征回归后的IoU大小。这样子也会导致算法精度的下降。在第一次使用NMS时候这种情况会比较明显,第二次使用的时候就会好很多,因此一阶段只使用一次NMS是会对精度有影响的,而二阶段目标检测中会在RPN之后进行一个更为精细的回归,在该处也会用到NMS,此时检测的精度就会好很多。

如何解决目标检测中密集遮挡问题

遮挡本身也可以分为两种类型,一种是由于非目标造成的遮挡,一种是由于也是需要检测的目标造成的遮挡。这两种遮挡分别被叫做occlusion和crowded。

对于前一种类型遮挡,很难有针对性的办法去解决,最好的办法也就是使用更多的数据和更强的feature。可以从训练数据入手。加掩膜,加扰动,提高算法对遮挡的应对能力。

对于第二种遮挡,提出了两个针对这个问题的loss,

通过设置损失函数的方式,即Repulsion Loss,使预测框和所负责的真实目标框的距离缩小,而使得其与周围非负责目标框(包含真实目标框和预测框)的距离加大 。如下式,如果与周围目标的距离越大,损失值会越小。

除了常用的smooth L1使回归目标与GT接近之外,这两个loss一个的目标是使proposal和要尽量远离和它overlap的第二大的GT,另一个目标是要上被assign到不同GT的proposal之间尽量远离。通过这两个loss,不仅仅使得proposal可以向正确的目标靠近,也可以使其远离错误的目标,从而减少NMS时候的误检。

"狭长形状"目标检测有什么合适方法

使用可旋转bonding box进行标注

手工设计anchors

如何解决动态目标检测

1.光流法

光流是空间运动物体被观测面上的像素点运动产生的瞬时速度场,包含了物体表面结构和动态行为的重要信息。光流计算法大致可分为三类:

(1)基于匹配的光流计算方法,包括基于特征和基于区域的两种。基于特征的方法是不断地对目标主要特征进行定位和跟踪,对大目标的运动和亮度变化具有鲁棒性,存在的问题是光流通常很稀疏,而且特征提取和精确匹配也十分困难;基于区域的方法先对类似的区域进行定位,然后通过相似区域的位移计算光流,这种方法在视频编码中得到了广泛的应用,但它计算的光流仍不稠密。

(2)基于频域的方法利用速度可调的滤波组输出频率或相位信息,虽然能获得很高精度的初始光流估计,但往往涉及复杂的计算,而且可靠性评价也十分困难。

(3)基于梯度的方法利用图像序列的时空微分计算2D速度场(光流)。由于计算简单和较好的实验结果,基于梯度的方法得到了广泛应用。

2.相邻帧差法

相邻帧差法是在运动目标检测中使用的最多的一类算法。原理就是将前后两帧图像对应的像素值相减,在环境亮度变化不大的情况下,如果对应像素值相差值很小,可认为此处景物是静止的,反之,则是运动物体。

相邻帧差法对于动态环境具有较强的自适应性,鲁棒性较好,能够适应各种动态环境,但一般不能完全提取出所有相关的特征像素点,这样在运动实体内部容易产生空洞现象。

3.背景差法

背景差法是常用的运动目标检测方法之一。它的基本思想是将输入图像与背景模型进行比较,通过判定灰度等特征的变化,或用直方图等统计信息的变化来判断异常情况的发生和分割运动目标。

与帧间差法比较,背景差法可以检测视频中停止运动的物体,其缺点是背景的更新导致算法的复杂性增加,实时性变差。

4. 基于事件相机来做

事件相机是具有微秒反应时间的仿生传感器 ,可记录每像素亮度变化的异步流,称为"事件"。事件相机通过检测每个像素的亮度变化来生成一个事件,相比于传统相机,更适合在高动态和高速度的环境下使用,具有高动态范围 (HDR)、高时间分辨率和无运动模糊的优势。

  1. 高动态范围:对于传统相机来说,在黑暗的情况下,传统的相机几乎没有办法使用,但对于事件相机来说,只检测正在运动的物体,所以无论是黑暗情况还是有光亮的情况,事件相机都可以发挥作用。
  2. 低延时:相邻事件之间的时间可以小于1毫秒
  3. 无运动模糊:即使是高速运动的物体,事件相机也可以捕获到

FPN的作用

FPN是在卷积神经网络中图像金字塔的应用。图像金字塔在多尺度识别中有重要的作用,尤其是小目标检测。顶层特征上采样后和底层特征融合,每层独立预测。

fpn设计动机:

1.高层特征向低层特征融合,增加低层特征表达能力,提升性能

2.不同尺度的目标可以分配到不同层预测,达到分而治之。

FPN每层做特征融合的特征图有两个,首先是前向传播,然后取了每个特征图做上采样(最近邻插值),对应前向传播的特征图做融合。融合的方式是:通过1x1卷积调整通道数,然后直接add。之后进行3x3卷积操作,目的是消除上采样的混叠效应。

其实,fpn真正起作用的是分而治之的策略,特征融合的作用其实很有限,此外fpn存在消耗大量显存,降低推理速度。

为什么FPN采用融合以后效果要比使用pyramidal feature hierarchy这种方式要好?

卷积虽然能够高效地向上提取语义,但是也存在像素错位问题,通过上采样还原特征图很好地缓解了像素不准的问题。

backbone可以分为浅层网络和深层网络,浅层网络负责提取目标边缘等底层特征,而深层网络可以构建高级的语义信息,通过使用FPN这种方式,让深层网络更高级语义的部分的信息能够融合到稍浅层的网络,指导浅层网络进行识别。

从感受野的角度思考,浅层特征的感受野比较小,深层网络的感受野比较大,浅层网络主要负责小目标的检测,深层的网络负责大目标的检测(比如人脸检测中的SSH就使用到了这个特点)。

FPN在RPN中的应用

rpn在faster rcnn中用于生成proposals,原版rpn生成在每个image的最后一张特征图上生成3x3个proposal。但实际上,小目标下采样到最后一个特征图,已经很小了。fpn可以在之前的多个特征图上获得proposal,具体做法是:在每个feature map上获得1:1、1:2、2:1长宽比的框,尺寸是{32^2、64^2、128^2、256^2、512^2}分别对应{P2、P3、P4、P5、P6}这五个特征层上。P6是专门为了RPN网络而设计的,用来处理512大小的候选框。它由P5经过下采样得到。

如何解决小目标识别问题

通用的定义来自 COCO 数据集(),定义小于 32x32 pix 的为小目标。

小目标检测的难点:可利用特征少,现有数据集中小目标占比少,小目标聚集问题

首先小目标本身分辨率低,图像模糊,携带的信息少。由此所导致特征表达能力弱,也就是在提取特征的过程中,能提取到的特征非常少,这不利于我们对小目标的检测。

另外通常网络为了减少计算量,都使用到了下采样,而下采样过多,会导致小目标的信息在最后的特征图上只有几个像素(甚至更少),信息损失较多。

  1. 数据。
    提高图像采集的分辨率:基于 GAN 的方法解决的也是小目标本身判别性特征少的问题,其想法非常简单但有效:利用 GAN 生成高分辨率图片或者高分辨率特征。
  2. Data Augmentation。一些特别有用的小物体检测增强包括随机裁剪、随机旋转和马赛克增强。copy pasting, 增加小目标数量。缩放与拼接,增加中小目标数量
  3. 修改模型输入尺寸。提高模型的输入分辨率,也就是减少或者不压缩原图像。tiling,将图像切割后形成batch,可以在保持小输入分辨率的同时提升小目标检测,但是推理时也需要 tiling,然后把目标还原到原图,整体做一次 NMS。
  4. 修改 Anchor。适合小目标的 Anchor
  5. Anchor Free。锚框设计难以获得平衡小目标召回率与计算成本之间的矛盾,而且这种方式导致了小目标的正样本与大目标的正样本极度不均衡,使得模型更加关注于大目标的检测性能,从而忽视了小目标的检测。
  6. 多尺度学习。FPN, 空洞卷积,通过多尺度可以将下采样前的特征保留,尽量保留小目标
  7. 减小下采样率。比如对于 YOLOv5 的 stride 为 32, 可以调整其 stride 来减小下采样率,从而保留某些比较小的特征。
  8. SPP 模块。增加感受野,对小目标有效果,SPP size 的设置解决输入 feature map 的size 可能效果更好。
  9. 损失函数。小目标大权重,此外也可以尝试 Focal Loss。

介绍目标检测RCNN系列和Yolo系列的区别

YOLO所属类别为one-stage,Fast-Rcnn所属类别为two-stage

two stage:

先进行区域生成,该区域称为region proposal(RP,一个有可能包含物体的预选框);再通过卷积神经网络进行样本分类,精度高,适合做高检测精度的任务

任务流程:特征提取---生成RP---分类/定位回归

one stage:

不用RP,直接在网络中提取特征来预测物体的分类和位置,速度非常快,适合做实时检测任务,但是效果不会太好

任务流程:特征提取---分类/定位回归

YOLO和SSD区别

YOLO将物体检测这个问题定义为bounding box和分类置信度的回归问题。

将整张图像作为输入,划分成SxS grid,每个cell预测B个bounding box(x, y, w, h)及对应的分类置信度(class-specific confidence score)。分类置信度是bounding box是物体的概率及其与真实值IOU相乘的结果。

SSD将物体检测这个问题的解空间,抽象为一组预先设定好(尺度,长宽比,1,2,3,1/2,1/3)的bounding box。在每个bounding box,预测分类label,以及box offset来更好的框出物体。对一张图片,结合多个大小不同的feature map的预测结果,能够处理大小不同的物体。

区别:

YOLO在卷积层后接全连接层,即检测时只利用了最高层Feature maps。而SSD采用金字塔结构,即利用了conv4-3/fc7/conv6-2/conv7-2/conv8_2/conv9_2这些大小不同的feature maps,在多个feature maps上同时进行softmax分类和位置回归

SSD还加入了Prior box(先验框)

前景背景样本不均衡解决方案:Focal Loss,GHM与PISA

我们可以将前景背景类不平衡的解决方案分为四类:(i)硬采样方法,(ii)软抽样方法( Soft Sampling Methods),(iii)无抽样方法和(iv)生成方法。

1. 软抽样方法

软采样调整每个样本在训练过程中迭代的权重(wi),这与硬采样不同,没有样本被丢弃,整个数据集用于更新参数中。该方法同样也可以应用在分类任务中。

1.1 Focal Loss

一般根据各类别数据占比,对 α 进行取值,即当class_1占比为30%时, α = 0.3,但是这个并不能解决所有问题。因为根据正负难易,样本一共可以分为以下四类:

虽然 α 平衡了正负样本,但对难易样本的不平衡没有任何帮助。其中易分样本(即,置信度高的样本)对模型的提升效果非常小,即模型无法从中学习大量的有效信息。所以模型应该主要关注于那些难分样本。(这个假设是有问题的,GHM对其进行了改进)。

我们希望模型能更关注容易错分的数据,反向思考,就是让模型别那么关注容易分类的样本。因此,Focal Loss的思路就是,把高置信度的样本损失降低

实验表明 γ 取2, α 取0.25的时候效果最佳。

1.2 Gradient Harmonizing Mechanism (GHM)

Focal Loss对容易分类的样本进行了损失衰减,让模型更关注难分样本,并通过 α \alpha α和 γ \gamma γ进行调参。这样相比CE loss 可以提高效果,但是也存在一些问题:

Focal loss有两个超参数( α和 γ),调整起来十分费力。

Focal loss 是个静态loss,不会自适应于数据的分布,在训练的过程中会一直的变化。

GHM认为,类别不均衡可总结为难易分类样本的不均衡,而这种难分样本的不均衡又可视为梯度密度分布的不均衡。假设一个正样本被正确分类,它就是正易样本,损失不大,模型不能从中获益。而一个错误分类的样本,更能促进模型迭代。实际应用中,大量的样本都是属于容易分类的类型,这种样本一个起不了太大作用,但量级过大,在模型进行梯度更新时,起主要作用,使得模型朝这类数据更新

GHM中提到:有一部分难分样本就是离群点,不应该给他太多关注;样本不均衡的基本效果可以通过梯度密度直接统计得到,不需要调参。

简而言之:Focal Loss是从置信度p来调整loss,GHM通过一定范围置信度p的样本数来调整loss。

g的值表示样本的属性(easy/hard), 意味着对全局梯度的影响。尽管梯度的严格定义应该是在整个参数空间,但是g是样本梯度的成比例的norm,在这片论文中g被称作gradient norm。

不同属性的样本(hard/easy,pos/neg)可以由 gradient norm的分布来表示。在图1左中可以看出变化非常大。具有 小 gradient norm 的样本具有很大的密度,它们对应于大量的负样本(背景)。由于大量的简单负样本,我们使用log轴来显示样本的分数,以演示具有不同属性的样本的方差的细节。尽管一个easy样本在全局梯度上相比hard样本具有更小的贡献,但是大量的easy样本的全部贡献会压倒少数hard样本的贡献,所以训练过程变得无效。除此之外,论文还发现具有非常 大gradient norm的样本(very hard examples)的密度微大于中间样本的密度。并且发现这些very hard样本大多数是outliers,因为即使模型收敛它们始终稳定存在。如果收敛模型被强制学习分类这些outliers,对其他样本的分类可能不会那么的准确

根据gradient norm分布的分析,GHM关注于不同样本梯度贡献的协调。大量由easy样本产生的累积梯度可以被largely down-weighted并且outliers也可以被相对的down-weighted。最后,每种类型的样本分布将会使平衡的训练会更加的稳定和有效

1.3 PrIme Sample Attention (PISA)

PISA 方法和 Focal loss 和 GHM 出发点不一样, Focal loss 和 GHM 是利用 loss 来度量样本 的难易分类程度,而本篇论文做者从 mAP 出发来度量样本的难易程度。

多标签图像分类任务中图片的标签不止一个,因此评价不能用普通单标签图像分类的标准,即mean accuracy,该任务采用的是和信息检索中类似的方法---mAP(mean Average Precision),虽然其字面意思和mean accuracy看起来差不多,但是计算方法要繁琐得多。

该作者提出改论文的方法考虑了两个方面:

样本之间不该是相互独立的或同等对待。基于区域的目标检测是从大量候选框中选取一小部分边界框,以覆盖图像中的全部目标。所以,不一样样本的选择是相互竞争的,而不是独立的。通常来讲,检测器更可取的作法是在确保全部感兴趣的目标都被充分覆盖时,在每一个目标周围的边界框产生高分,而不是对全部正样本产生高分。作者研究代表关注那些与gt目标有最高IOU的样本是实现这一目标的有效方法。

目标的分类和定位是有联系的。定位目标周围的样本很是重要,这一观察具备深入的意义,即目标的分类和定位密切相关。具体地,定位好的样本须要具备高置信度好的分类。

PISA由两个部分组成:

基于重要性的样本重加权(ISR)

分类感知回归损失(CARL)。

ISR(Importance-based Sample Reweighting)

ISR由正样本重加权和负样本重加权组成,分别表示为ISR-P和ISR-N。对于阳性样本,我们采用IoU-HLR作为重要性度量;对于阴性样本,我们采用Score-HLR。给定重要性度量,剩下的问题是如何将重要性映射到适当的损失权重。

oU-HLR:

为了计算IoU-HLR,首先将所有样本根据其最近的gt目标划分为不同的组。接下来,使用与gt的IoU降序对每个组中的样本进行排序,并获得IoU局部排名(IoU-LR)。随后,以相同的IoU-LR采样并按降序对其进行排序。具体来说,收集并分类所有top1 IoU-LR样本,其次是top2,top3,依此类推。这两个步骤将对所有样本进行排序

Score-HLR:

以类似于IoU-HLR的方式计算负样本的Score-HLR。与由每个gt目标自然分组的正样本不同,负样本也可能出现在背景区域,因此我们首先使用NMS将它们分组到不同的群集中。将所有前景类别中的最高分数用作负样本的得分,然后执行与计算IoU-HLR相同的步骤。

如何解决训练数据样本过少的问题

利用预训练模型进行迁移微调(fine-tuning),预训练模型通常在特征上拥有很好的语义表达。此时,只需将模型在小数据集上进行微调就能取得不错的效果。这也是目前大部分小数据集常用的训练方式。视觉领域内,通常会ImageNet上训练完成的模型。自然语言处理领域,也有BERT模型等预训练模型可以使用。

单样本或者少样本学习(one-shot,few-shot learning),这种方式适用于样本类别远远大于样本数量的情况等极端数据集。例如有1000个类别,每个类别只提供1-5个样本。少样本学习同样也需要借助预训练模型,但有别于微调的在于,微调通常仍然在学习不同类别的语义,而少样本学习通常需要学习样本之间的距离度量。例如孪生网络(Siamese Neural Networks)就是通过训练两个同种结构的网络来判别输入的两张图片是否属于同一类。3. 以上两种是常用训练小样本数据集的方式。此外,也有些常用的方式:数据集增强、正则或者半监督学习等方式来解决小样本数据集的训练问题。

如何解决类别不平衡的问题

机器学习中,解决样本不均衡问题主要有2种思路:数据角度和算法角度。从数据角度出发,有扩大数据集、数据类别均衡采样等方法。在算法层面,目标检测方法使用的方法主要有:

Faster RCNN、SSD等算法在正负样本的筛选时,根据样本与真实物体的IoU大小,设置了3∶1的正负样本比例,这一点缓解了正负样本的不均衡,同时也对难易样本不均衡起到了作用。

Faster RCNN在RPN模块中,通过前景得分排序筛选出了2000个左右的候选框,这也会将大量的负样本与简单样本过滤掉,缓解了前两个不均衡问题。

权重惩罚:对于难易样本与类别间的不均衡,可以增大难样本与少类别的损失权重,从而增大模型对这些样本的惩罚,缓解不均衡问题。

数据增强:从数据侧入手,可以在当前数据集上使用随机生成和添加扰动的方法,也可以利用网络爬虫数据等增加数据集的丰富性,从而缓解难易样本和类别间样本等不均衡问题,可以参考SSD的数据增强方法。

近年来,不少的研究者针对样本不均衡问题进行了深入研究,比较典型的有OHEM(在线困难样本挖掘)、S-OHEM、Focal Loss、GHM(梯度均衡化)。

  1. OHEM:在线难例挖掘
    OHEM算法(online hard example miniing,发表于2016年的CVPR)主要是针对训练过程中的困难样本自动选择,其核心思想是根据输入样本的损失进行筛选,筛选出困难样本(即对分类和检测影响较大的样本),然后将筛选得到的这些样本应用在随机梯度下降中训练。
  2. Focal loss:专注难样本
    为了解决一阶网络中样本的不均衡问题,何凯明等人首先改善了分类过程中的交叉熵函数,提出了可以动态调整权重的Focal Loss。
  3. GHM:损失函数梯度均衡化机制

前面讲到的OHEM算法和Focal loss各有利弊:

1、OHEM算法会丢弃loss比较低的样本,使得这些样本无法被学习到。

2、FocalLoss则是对正负样本进行加权,使得全部的样本可以得到学习,容易分类的负样本赋予低权值,hard examples赋予高权值。但是在所有的anchor examples中,出了大量的易分类的负样本外,还存在很多的outlier,FocalLoss对这些outlier并没有相关策略处理。并且FocalLoss存在两个超参,根据不同的数据集,调试两个超参需要大量的实验,一旦确定参数无法改变,不能根据数据的分布动态的调整。

GHM主要思想:GHM做法则是从样本的梯度范数出发,通过梯度范数所占的样本比例,对样本进行动态的加权,使得具有小梯度的容易分类的样本降权,具有中梯度的hard expamle升权,具有大梯度的outlier降权。

手撕代码IOU

复制代码
import numpy as np
def ComputeIOU(boxA, boxB):
    ## 计算相交框的坐标
    ## bboxA[0][1] 左上角坐标  bboxA[2][3] 右下角坐标
    x1 = np.max([boxA[0], boxB[0]])
    y1 = np.max([boxA[1], boxB[1]])
    x2 = np.min([boxA[2], boxB[2]])
    y2 = np.min([boxA[3], boxB[3]])
    ## 计算交区域,并区域,及IOU
    S_A = (boxA[2]-boxA[0]+1)*(boxA[3]-boxA[1]+1)
    S_B = (boxB[2]-boxB[0]+1)*(boxB[3]-boxB[1]+1)
    interArea = np.max([x2-x1+1, 0])*np.max([y2-y1+1,0])	##一定要和0比较大小,如果是负数就说明压根不相交
    unionArea = S_A + S_B - interArea
    iou = interArea/unionArea
    return iou
boxA = [1,1,3,3]
boxB = [2,2,4,4]
IOU = ComputeIOU(boxA, boxB)

手撕代码NMS

复制代码
对整个bboxes排序的写法
import numpy as np
def nms(dets, iou_thred, cfd_thred):
    if len(dets)==0: return []
    bboxes = np.array(dets)
    ## 对整个bboxes排序
    bboxes = bboxes[np.argsort(bboxes[:,4])]
    pick_bboxes = []
#     print(bboxes)
    while bboxes.shape[0] and bboxes[-1,-1] >= cfd_thred:
        bbox = bboxes[-1]
        x1 = np.maximum(bbox[0], bboxes[:-1,0])
        y1 = np.maximum(bbox[1], bboxes[:-1,1])
        x2 = np.minimum(bbox[2], bboxes[:-1,2])
        y2 = np.minimum(bbox[3], bboxes[:-1,3])
        inters = np.maximum(x2-x1+1, 0) * np.maximum(y2-y1+1, 0)
        unions = (bbox[2]-bbox[0]+1)*(bbox[3]-bbox[1]+1) + (bboxes[:-1,2]-bboxes[:-1,0]+1)*(bboxes[:-1,3]-bboxes[:-1,1]+1) - inters
        ious = inters/unions
        keep_indices = np.where(ious<iou_thred)
        bboxes = bboxes[keep_indices]	## indices一定不包括自己
        pick_bboxes.append(bbox)
    return np.asarray(pick_bboxes)
dets = [[187, 82, 337, 317, 0.9], [150, 67, 305, 282, 0.75], [246, 121, 368, 304, 0.8]]
dets_nms =  nms(dets, 0.5, 0.3)
print(dets_nms)
  1. 不改变bboxes,维护orders的写法

始终维护orders,代表到原bboxes的映射(map) 优化1:仅维护orders,不改变原bboxes 优化2:提前计算好bboxes的面积,以免在循环中多次重复计算

复制代码
import numpy as np
def nms(dets, iou_thred, cfd_thred):
    if len(dets)==0: return []
    bboxes = np.array(dets)
    ## 维护orders
    orders = np.argsort(bboxes[:,4])
    pick_bboxes = []
    x1 = bboxes[:,0]
    y1 = bboxes[:,1]
    x2 = bboxes[:,2]
    y2 = bboxes[:,3]
    areas = (x2-x1+1)*(y2-y1+1) ## 提前计算好bboxes面积,防止在循环中重复计算
    while orders.shape[0] and bboxes[orders[-1],-1] >= cfd_thred:
        bbox = bboxes[orders[-1]]
        xx1 = np.maximum(bbox[0], x1[orders[:-1]])
        yy1 = np.maximum(bbox[1], y1[orders[:-1]])
        xx2 = np.minimum(bbox[2], x2[orders[:-1]])
        yy2 = np.minimum(bbox[3], y2[orders[:-1]])
        inters = np.maximum(xx2-xx1+1, 0) * np.maximum(yy2-yy1+1, 0)
        unions = areas[orders[-1]] + areas[orders[:-1]] - inters
        ious = inters/unions
        keep_indices = np.where(ious<iou_thred)
        pick_bboxes.append(bbox)
        orders = orders[keep_indices]
    return np.asarray(pick_bboxes)
dets = [[187, 82, 337, 317, 0.9], [150, 67, 305, 282, 0.75], [246, 121, 368, 304, 0.8]]
dets_nms = nms(dets, 0.5, 0.3)
print(dets_nms)

NMS的改进思路

  1. 根据手动设置阈值的缺陷,通过自适应的方法在目标系数时使用小阈值,目标稠密时使用大阈值。例如Adaptive NMS
  2. 将低于阈值的直接置为0的做法太hard,通过将其根据IoU大小来进行惩罚衰减,则变得更加soft。例如Soft NMS,Softer NMS。
  3. 只能在CPU上运行,速度太慢的改进思路有三个,一个是设计在GPU上的NMS,如CUDA NMS,一个是设计更快的NMS,如Fast NMS,最后一个是掀桌子,设计一个神经网络来实现NMS,如 ConvNMS。
  4. IoU的做法存在一定缺陷,改进思路是将目标尺度、距离引进IoU的考虑中。如DIoU

IOU相关优化(giou,diou,ciou)

GIOU

普通IOU是对两个框的距离不敏感的,下面两张图中,左图预测框的坐标要比右图预测框的坐标更接近真实框。但两者的IOU皆为0,如果直接把IOU当作loss函数进行优化,则loss=0,没有梯度回传,所以无法进行训练。

但是,GIOU也存在它的缺点:当两个预测框高宽相同,且处于同一水平面时,GIOU就退化为IOU。此外,GIOU和IOU还有两个缺点:收敛较慢、回归不够准确。

DIOU

在介绍DIOU之前,先来介绍采用DIOU的效果:如图,黑色代表anchor box, 蓝色红色代表default box,绿色代表真实目标存在的框GT box的位置,期望红蓝框与绿框尽可能重合。第一行是使用GIOU训练网络,让预测边界框尽可能回归到真实目标边界框中,迭代到400次后才勉强重合。第二行使用DIOU训练网络,到达120步时,发现与目标边界框已经完全重合。可以看出,相对于GIOU,DIOU的不仅收敛速度更快,准确率也更高

我们再看一组图,图中给出了3组目标边界框与目标边界框的重合关系,显然他们的重合位置不相同的,我们期望第三种重合(两个box中心位置尽可能重合。这三组计算的IOU loss和GIoU loss是一模一样的,因此这两种损失不能很好表达边界框重合关系)。但是DIOU计算出的三种情况的损失是不一样的,显然DIOU更加合理。

从公式和示意图中,我们可以看到,DIoU有几个优点:

DIoU的惩罚项是基于中心点的距离和对角线距离的比值,避免了像GIoU在两框距离较远时,产生较大的外包框,Loss值较大难以优化(因为它的惩罚项是 A ∪ B 比上最小外包框的面积)。所以DIoU Loss收敛速度会比GIoU Loss快。

即使在一个框包含另一个框的情况下,c值不变,但d值也可以进行有效度量。

CIOU LOSS:

论文中,作者表示一个优秀的回归定位损失应该考虑三种几何参数:重叠面积、中心点距离、长宽比。CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。

六、目标检测之样本不平衡问题

样本不平衡问题感觉近期研究的论文相对较多,如:2019 AAAI GHM,2019 CVPR AP-loss, 还有2019 DR loss, 2019 IoU-balanced loss,two-stage中也有Libra RCNN,都是关注样本不平衡的问题。该论文给出了一种可行的方案,即采用学习的方法来处理样本不平衡问题。

Residual Objectness for Imbalance Reduction

论文地址:https://arxiv.org/abs/1908.09075

之前所有处理样本不平衡问题的论文都是采用reweight或者采样的方法,并且都是基于手工调优的,例如RetinaNet需要设置FL的参数,GHM则要设置bins的数目和momentum的大小。该论文则提出了一种基于学习的方法来处理样本不平衡问题,不仅性能更好,而且能自适应不同的数据集。

模型框架 RetinaNet-Obj

通过公式推导,该方法最后和FL loss的效果基本是等价的,在实验结果中基本也是相同的。

Residual Objectness

分析RetinaNet-Obj中Obj分支同样存在样本不平衡的问题,自然地想到继续采用另一个obj来处理第一个Obj的样本不平衡问题。在这里,作者引入了res-obj结构:

通过residual来修正原有的obj分数,公式如下:

注意此处其实只针对大于一定分数的obj来做(分数为正例中分数的最小值),这样就能够提高正例的分数,相当于给正例加了权重,从而解决obj中正负样本不平衡问题。具体算法如下:

实验结果

从最终结果来看,该方法迁移到不同方法上均有性能提升,在RetinaNet中有1个点的提升,和GHM相当;在YOLOV3和Faster RCNN中也有1个点的提升。如下:

目标检测

  1. 生成正边界框以平衡目标检测器的训练 《Generating Positive Bounding Boxes for Balanced Training of Object Detectors》WACV2020 作者团队:中东科技大学
  2. 优于BN/GN/LN和IN!谷歌提出新的归一化方法:FRN 《Filter Response Normalization Layer: Eliminating Batch Dependence in the Training of Deep Neural Networks》 作者团队:Google Research
  3. 目标检测中主动学习的自适应监督框架 BMVC 2019 Date:2019 Author:印度理工学院&东京大学---An Adaptive Supervision Framework for Active Learning in Object Detection》
  4. 用于目标检测的轻量级RetinaNet Date:20190527 Author:亚利桑那州立大学 --- 《Light-Weight RetinaNet for Object Detection》
  5. SkyNet:低功耗目标检测的冠军模型(DAC-SDC 挑战赛) 注:SkyNet超越 Tiny YOLO,YOLOv2,SSD,MobileNet等组合算法,实时运行在TX2(GPU)+ Ultra96(FPGA)上 Date:2019 Author:IBM & Inspirit IoT --- 《SkyNet: A Champion Model for DAC-SDC on Low Power Object Detection》
  6. #显著性目标检测# Contour Loss:用于显著性目标检测的边界感知学习 注:专门用于显著性目标检测的损失函数 Date:2019 Author:中山大学 ---《Contour Loss: Boundary-Aware Learning for Salient Object Segmentation》
  7. #3D目标检测# SS3D:使用IoU Loss的单目3D目标检测 Date:2019 Author:查尔姆斯理工大学 & Zenuity AB ---《Monocular 3D Object Detection and Box Fitting Trained End-to-End Using Intersection-over-Union Loss》
  8. #视频目标检测# STCA:具有时空上下文聚合的视频目标检测 注:STCA超越MANet、STSN等视频目标检测算法,但不明白为什么只在ImageNet VID数据集上进行比较呢?Date:2019 Author:华中科技大学&地平线 ---《Object Detection in Video with Spatial-temporal Context Aggregation》
  9. #基于深度学习的目标检测最新进展(2013-2019)# 注:这才是目标检测综述!40页,256篇参考文献,从2013 OverFeat到2019 NAS-FPN/CenterNet/DetNAS,涵盖检测机制、学习策略和应用方向等内容。还给出VOC/COCO数据集下的算法全面对比 Date:2019 Author:新加坡管理大学等 ---《Recent Advances in Deep Learning for Object Detection》
  10. #目标检测# 检测11000类目标:没有细粒度边界框的大规模目标检测 《Detecting 11K Classes: Large Scale Object Detection without Fine-Grained Bounding Boxes》ICCV2019 Date:2019 Author:亚马逊
  11. #(已开源)目标检测# NDFT:研究无人机图像的目标检测:深度 Nuisance Disentanglement 《Delving into Robust Object Detection from Unmanned Aerial Vehicles: A Deep Nuisance Disentanglement Approach》ICCV2019 Date:2019 Author:德克萨斯A&M大学 & 美国陆军研究实验室
  12. #3D目标检测# Fast Point R-CNN 注:在 KITTI 上 mAP SOTA,速度可达 15 FPS !Date:2019 Author:港中文&腾讯优图 ---《Fast Point R-CNN》
  13. C-RPN:通过RPN的级联结构改进目标检测 《C-RPNs: Promoting Object Detection in real world via a Cascade Structure of Region Proposal Networks》 注:解决样本不均衡问题/hard example mining Date:2019 Author:北京大学&鹏城实验室
  14. 交通标志检测系统的深度神经网络评估 《Evaluation of deep neural networks for traffic sign detection systems 》 注:本文比较各目标检测算法在交通标志检测和识别任务中的综合性能。一共比较了8种模型(Faster R-CNN, R-FCN, SSD和 YOLO V2)),用5项指标(mAP/FPS/参数/内存/FLOPS)进行评价 Date:2019 Author:塞维利亚大学等
  15. 面向高分辨率的显著性目标检测 ICCV2019 注:开源一个高分辨率显著性目标检测数据集:HRSOD Date:2019 Author:大连理工大学&Adobe---《Towards High-Resolution Salient Object Detection》
  16. #3D目标检测# CBGS:类均衡的分组和采样,用于点云三维物体检测的 《Class-balanced Grouping and Sampling for Point Cloud 3D Object Detection》 Date:2019 Author:旷视&中科院&清华
  17. 通过特征重新加权进行Few-shot目标检测 《Few-shot Object Detection via Feature Reweighting》ICCV2019 Date:2019 Author:新加坡国立大学&加州大学伯克利分校
  18. SCRDet:检测小型和旋转的物体 《SCRDet: Towards More Robust Detection for Small, Cluttered and Rotated Objects》ICCV2019 注:在DOTA数据集上,性能优于RRPN和R2CNN等算法 Date:2019 Author:中科院&国科大&上交
  19. #3D目标检测# CBGS:类均衡的分组和采样,用于点云三维物体检测的 《Class-balanced Grouping and Sampling for Point Cloud 3D Object Detection》 Date:2019 Author:旷视&中科院&清华
  20. #视频目标检测# RDN:关系蒸馏网络,用于视频目标检测 《Relation Distillation Networks for Video Object Detection》ICCV2019 注:RDN 在 VID数据集上,81.8% and 83.2% mAP with ResNet-101 and ResNeXt-101 Date:2019 Author:中科大&京东 AI 研究院
  21. #FisheyeMODNet#:用于自主驾驶的环视摄像机上的运动物体检测 《FisheyeMODNet: Moving Object detection on Surround-view Cameras for Autonomous Driving》ICCV 2019 Workshop Date:2019 Author:法雷奥等
  22. #3D目标检测# StarNet:点云中目标检测的目标计算 《StarNet: Targeted Computation for Object Detection in Point Clouds》 注:性能优于VoxelNet、SECOND和PointPillars等算法 Date:2019 Author:Google Brain & Waym
  23. TTFNet:用于实时目标检测的训练时间友好网络 《Training-Time-Friendly Network for Real-Time Object Detection》 Date:2019 Author:浙江大学&飞步科技
  24. FreeAnchor:Anchors 匹配进行目标检测 《FreeAnchor: Learning to Match Anchors for Visual Object Detection》NeurIPS 2019 Date:2019 Author:中国科学院大学&厦门大学&鹏城实验室
  25. SSSDET:用于航拍图像中车辆检测的网络 《SSSDET: Simple Short and Shallow Network for Resource Efficient Vehicle Detection in Aerial Scenes》ICIP 2019 Date:2019
  26. 语义分割
  27. 对语义分割模型的稳健性进行基准测试 Date:2019 Author:海德堡大学 ---《Benchmarking the Robustness of Semantic Segmentation Models》
  28. #视频目标分割# RANet:快速视频目标分割的排序注意网络ICCV 2019 注:RANet 性能优于 FAVOS、FEELVOS等算法,速度可达30FPS!在 DAVIS_16 数据集上表现 SOTA。Date:2019 Author:悉尼大学&IIAI&西安交大&南开--- 《RANet: Ranking Attention Network for Fast Video Object Segmentation》
  29. #实例分割# InstaBoost:通过概率图引导"复制粘贴"来提升实例分割性能 ICCV 2019 注:不做其他修改的情况下,将R101-Mask R-CNN的35.7 mAP 提升至 37.9 mAP Date:2019 Author:上海交通大学 -- 《InstaBoost: Boosting Instance Segmentation via Probability Map Guided Copy-Pasting》
  30. #点云语义分割# 综述:点云语义分割 《A Review of Point Cloud Semantic Segmentation》 Date:2019
  31. KSAC:Kernel共享Atrous卷积,用于语义分割 《See More Than Once -- Kernel-Sharing Atrous Convolution for Semantic Segmentation》 注:KSAC相对于ASPP,提高 mIoU的性能更强!Date:2019 Author:悉尼科技大学&华东师范大学
  32. CBS:基于类的样式,具有语义分割的实时局部风格转换 《Class-Based Styling: Real-time Localized Style Transfer with Semantic Segmentation》 Date:2019 Author:不列颠哥伦比亚大学
  33. MTN:通过掩模迁移网络实现快速视频对象分割 《Fast Video Object Segmentation via Mask Transfer Network》 注:在DAVIS数据集上,速度高达 37 FPS!性能 SOTA!Date:2019 Author:新加坡国立大学&山东省人工智能学会
  34. SPGNet:场景分割的语义预测指南 《SPGNet: Semantic Prediction Guidance for Scene Parsing》 Date:2019 Author:伊利诺伊大学厄巴纳-香槟分校 & IBM研究院等
  35. #全景分割# 用于全景分割的模块化方法:生成器评估器 - 选择器网络 《Generator evaluator-selector net: a modular approach for panoptic segmentation》 Date:2019 Author:多伦多大学&哈佛大学
  36. Gated-SCNN:用于语义分割的Gated形状CNN 《Gated-SCNN: Gated Shape CNNs for Semantic Segmentation》ICCV2019 注:Amusi 认为Gated-SCNN是目前最强的语义分割算法之一,在Cityscapes数据集上test mIoU 82.8%(not use coarse data),超越DeepLabv3+和AutoDeepLab等算法。Date:2019
  37. #3D语义分割# LU-Net:三维LiDAR点云语义分割的高效网络,基于端到端学习的3D特征和U-Net 《LU-Net: An Efficient Network for 3D LiDAR Point Cloud Semantic Segmentation Based on End-to-End-Learned 3D Features and U-Net》 注:在 KITTI 表现 SOTA!速度可达 24 FPS!Date:2019
  38. #视频目标分割# COSNet:使用联合注意孪生网络进行无监督视频对象分割 《See More, Know More: Unsupervised Video Object Segmentation with Co-Attention Siamese Networks》CVPR 2019 Author:IIAI & 上交
  39. #实例分割# SSAP:具有Affinity金字塔的Single-Shot实例分割 《SSAP: Single-Shot Instance Segmentation With Affinity Pyramid》 ICCV2019 Date:2019 Author:中科院&国科大&地平线等
  40. #3D语义分割# PASS3D:3D点云的精确和加速语义分割 《PASS3D: Precise and Accelerated Semantic Segmentation for 3D Point Cloud》IROS-2019 Date:2019 Author:浙江大学
  41. #NAS# #语义分割# GAS:图引导架构搜索的实时语义分割 《Graph-guided Architecture Search for Real-time Semantic Segmentation》 注:性能优于BiSeNet、ICNet等实时语义分割算法,73.3% mIoU with speed of 102 FPS on Titan Xp Author:商汤&浙大
  42. #医学图像分割# SegNAS3D:3D图像分割的网络架构搜索 《SegNAS3D: Network Architecture Search with Derivative-Free Global Optimization for 3D Image Segmentation》MICCAI 2019 Author:IBM Research
  43. DGCNet:用于语义分割的双图卷积网络 《Dual Graph Convolutional Network for Semantic Segmentation》BMVC 2019 注:在 Cityscapes和Pascal Context上,表现 SOTA!Author:牛津大学&北京大学&DeepMotion
  44. 用于实时语义分割的特征金字塔编码网络 《Feature Pyramid Encoding Network for Real-time Semantic Segmentation》BMVC 2019 注:68.0% mIoU,0.4M,102 FPS(TITANV) Author:曼彻斯特大学
  45. DS-PASS:通过SwaftNet进行细节敏感的全景语义分割,以用于周围感知 《DS-PASS: Detail-Sensitive Panoramic Annular Semantic Segmentation through SwaftNet for Surrounding Sensing》 Author:浙大&卡尔斯鲁厄理工学院
  46. MinneApple:用于苹果检测和分割的基准数据集 《MinneApple: A Benchmark Dataset for Apple Detection and Segmentation》 注:数据集和代码已经开源!Author:明尼苏达大学
  47. OCR:用于语义分割的目标上下文表示 《Object-Contextual Representations for Semantic Segmentation》 注:在Cityscapes, ADE20K, PASCAL-Context上表现SOTA!其中在Cityscapes test上可达83.0,排名第二!Author:MSRA&中科院&国科大
  48. #医学图像分割# RAUNet:用于白内障手术器械语义分割的残差注意力U-Net 《RAUNet: Residual Attention U-Net for Semantic Segmentation of Cataract Surgical Instruments》ICONIP2019 Author:国科大&中科院等
  49. 点云语义分割的分层点-边交互网络 《Hierarchical Point-Edge Interaction Network for Point Cloud Semantic Segmentation》ICCV 2019 注:性能优于PointNet++和PointConv等算法 Author:港中文&腾讯优图
  50. #语义分割# ACFNet:用于语义分割的注意类特征网络 《ACFNet: Attentional Class Feature Network for Semantic Segmentation》ICCV 2019 注:在Cityscapes数据集上 81.85% mIoU,优于DenseASPP、PSANet等算法 Author:中科院&国科大&百度
七、Class-agnostic

目标检测模型在定位和分类训练期间显示目标时表现良好,然而,由于创建和注释检测数据集的难度和成本,训练过的模型检测到数量有限的目标类型,未知目标被视为背景内容。这阻碍了传统检测器在现实应用中的采用,如大规模物体匹配、visual grounding、视觉关系预测、障碍检测(确定物体的存在和位置比找到特定类型更重要)等。

目标检测模型在定位和分类训练期间显示目标时表现良好,然而,由于创建和注释检测数据集的难度和成本,训练过的模型检测到数量有限的目标类型,未知目标被视为背景内容。这阻碍了传统检测器在现实应用中的采用,如大规模物体匹配、visual grounding、视觉关系预测、障碍检测(确定物体的存在和位置比找到特定类型更重要)等。

有研究者提出类不可知目标检测作为一个新问题,专注于检测对象的对象类。具体地说,其目标是预测图像中所有对象的边界框,而不是预测它们的对象类。预测的框可以被另一个系统使用,以执行特定于应用程序的分类、检索等。

提出了针对类不可知检测器的基准测试的训练和评估协议,以推进该领域的未来研究。最后,研究者提出了:(1)基线方法和(2)一个新的用于类无关检测的对抗性学习框架,它迫使模型从用于预测的特征中排除特定于类的信息。实验结果表明,对抗性学习方法提高了类不可知性的检测效率。

会有同学会问"目标检测中bbox回归中class-agnostic和class-specific的区别在哪?"。今天我们简单说一下,然后开始今天主框架的分析。

  • **class-specific 方式:**很多地方也称作class-aware的检测,是早期Faster RCNN等众多算法采用的方式。它利用每一个RoI特征回归出所有类别的bbox坐标,最后根据classification 结果索引到对应类别的box输出。这种方式对于ms coco有80类前景的数据集来说,并不算效率高的做法。
  • **class-agnostic 方式:**只回归2类bounding box,即前景和背景,结合每个box在classification 网络中对应着所有类别的得分,以及检测阈值条件,就可以得到图片中所有类别的检测结果。当然,这种方式最终不同类别的检测结果,可能包含同一个前景框,但实际对精度的影响不算很大,最重要的是大幅减少了bbox回归参数量。具体细节,自己参考目前一些开源算法源码会理解的更好。

Class-agnostic目标检测器使用object proposal methods (OPMs), conventional class-aware detectors和提出的adversarially trained class-agnostic detectors。如下图:

绿色和紫红色分别是真值和检测结果。
新框架General Framework

传统的类感知检测侧重于检测"感兴趣的对象",这本质上要求模型能够区分封闭已知集合中的对象类型。直观地说,模型通过编码区分对象类型的特征来实现这一点。然而,为了使类不可知的检测和模型能够检测到以前看不见的对象类型,检测器应该编码能够更有效地区分对象与背景内容、单个对象与图像中的其他对象的特征,而不区分对象类型。

训练传统的目标检测器的二元分类任务以及边界框回归不足以确保模型关注类无关特征,更重要的是,忽略类型区分特征,以便更好地推广到看不见的目标类型。为了克服这个问题,研究者建议以一种对抗性的方式训练类不可知的目标检测器,以便模型因编码包含目标类型信息的编码特征而受到惩罚。

研究者提议用对抗性鉴别器分支来增强类不可知的检测器,这些分支试图从检测网络上游输出的特征中分类对象类型(在训练数据中注释),如果模型训练成功,则对其进行惩罚。模型以交替的方式训练,这样当模型的其余部分更新时,鉴别器被冻结,反之亦然。在更新鉴别器时,研究者使用标准的分类交叉熵损失的目标类型作为预测目标。另一方面,在训练模型的其余部分时,最小化(a)目标与否分类的交叉熵损失,(b)边界框回归的平滑L1损失,以及(c)鉴别器预测的负熵。这种熵最大化迫使检测模型的上游部分从其输出的特征中排除目标类型信息。对于模型的每次更新,鉴别器被更新五次,在整个目标中使用乘子α(调整{0.1,1})对负熵进行加权。上图总结了完整的框架。

实验

Generalization results for FRCNN models trained on the seen VOC dataset. The top row shows macro-level AR@kfor seen and unseen classes in VOC and their harmonic mean (AR-HM). FRCNN-agnostic-adv performs the best overall. The second row shows micro-level results for the easy, medium, and hard unseen classes. FRCNN-agnostic-adv performs the best on the hard and easy classes with recall drop for the medium class. The last row provides results of evaluation on the COCO data of 60 unseen classes. FRCNN-agnostic-adv achieves the best AR@k for objects of all sizes.

Generalization results for SSD models trained on the seen VOC dataset. The top row shows macro-level AR@kfor seen and unseen classes in VOC as well as their harmonic mean (AR-HM). SSD-agnostic-adv performs the best on AR- Unseen and AR-HM, with a drop in AR-Seen, but the models that outperform SSD-agnostic-adv on AR-Seen do significantly worse on AR-Unseen and AR-HM. The second row shows micro-level results for the easy, medium, and hard unseen classes. SSD-agnostic-adv performs the best in all categories. The last row provides results of evaluation on the COCO data of 60 unseen classes. SSD-agnostic-adv achieves the best AR@k with a slight reduction for small-sized objects.

八、基于YOLOv4卷积神经网络的多目标检测方法

为了解决目标检测任务中小目标检测精度低、误检、漏检率高等问题,有研究者提出了一种新的目标检测方法。

为了解决目标检测任务中小目标检测精度低、误检、漏检率高等问题,有研究者提出了一种基于YOLOv4卷积神经网络的多目标检测方法。 多目标检测作为目标检测领域的一个重要研究方向,一直受到研究人员的广泛关注。目前,在智能交通、智能辅助驾驶和视频监控等领域已经产生了深入的研究。

传统的行人检测方法,如HOG(定向梯度直方图)、DPM(可变形部件模型)、ACF(聚合通道特征),都采用人工设计或特征聚合来获取行人特征。随着2012年AlexNet在图像分类任务上的重大突破,利用卷积神经网络自动学习特征提取过程代替传统的人工设计是当前的主要研究方向。基于卷积神经网络的目标检测方法主要分为两类,一类是两阶段方法,一类是单阶段方法。

第一种方法的主要思想是在生成候选目标区域的基础上,利用级联方法进一步判断边界框的类别和位置。另一种是单阶段方法,以YOLO和SSD为例。思路是使用卷积神经网络直接返回位置和类别。卷积神经网络的引入提高了行人检测算法的性能,但遮挡问题仍然是行人检测的一大难点。有文献【Deep learning strong parts for pedestrian detection】使用联合学习方法对不同的行人遮挡模式进行建模,但其检测框架复杂且无法穷尽所有情况。【Repulsion Loss: Detecting Pedestrians in a Crowd】设计了一种新的损失函数,使预测帧与目标真实帧保持接近,同时远离其他真实帧。这种方法处理遮挡更灵活,更容易实现。【Occlusion-aware R-CNN: Detecting Pedestrians in a Crowd】结合了上述两种思想,提出了一个组件遮挡感知单元和一个聚合损失函数来处理行人遮挡问题。【Bi-box Regression for Pedestrian Detection and Occlusion Estimation】通过引入新的监督信息(行人可见区域的边界框)来处理遮挡,思路是用两个分支网络分别返回行人的全身框架和可见区域的边界框,最后合并两个分支的结果,提高检测性能。

目前目标检测任务主要针对不同的应用场景选择合适的检测算法:单阶段算法检测速度最快,但准确率较低;两阶段和多阶段检测算法可以获得更高的检测精度,但以牺牲检测速度为代价。

今天分享的框架,新的方法基于YOLOv4。 高层特征的语义信息首先通过FPN采样传播到低层网络,然后与底层特征的高分辨率信息融合,以提高小目标检测对象的检测效果。 通过对特征金字塔进行下采样来增强从底部到顶部的信息传递路径,最后融合不同层的特征图以实现相关预测。 实验证明,新提出的方法具有良好的效果。

新的模型架构如上图所示。它由三部分组成:用于特征提取的前端网络、特征融合模块和用于分类和回归操作的检测模块。在输入处将输入图像的尺寸resize为416×416,输入到网络中进行训练和检测。 基本卷积块是一个卷积层,它结合了批量归一化 (BN) 并使用Mish和leakyRelu激活函数。

模型前端使用CSPDarknet模块 组成的主干网络,由卷积层和残差模块叠加,有效防止在网络层数加深的基础上梯度消失或爆炸,获得更丰富的语义信息特征图,并且在主干网络中,特征图维度的减少是通过卷积层的5倍下采样实现的,其步长为2,内核大小为3;对网络neck处进行2次上采样,浅层采用PAN+SPP模型结构实现浅层特征与高层语义特征的融合以及多尺度感受野的融合,充分利用了浅层网络,改善小目标特征丢失的问题;检测头采用回归+分类的思想,将输入图像分别划分为76×76、38×38、19×19三种不同尺寸的网格图像,分别实现小目标、中目标和大目标的检测目标。

SPP模块:

该模型在主干网络后面添加了SPP模块,如下图所示。输入特征图经过一个卷积层后,经过5×5、9×9、13×13三个核进行最大池化, 然后concat得到的特征图进行通道拼接,输出通道数变成原来通道数的4倍,特征图大小保持不变。

输出特征图大小为:

其中n是输入特征图的大小,p是padding,s是步长,这意味着向下取整。SPP模块通过使用不同大小核的Maxpool层获取特征图局部区域的感受野信息和接近全局的感受野,并进行特征融合。这种融合不同尺度感受野的操作可以有效丰富特征图的表达能力,增强骨干网络输出特征的接受范围,分离重要的上下文信息。

实验及可视化

九、目标检测~多网格冗余边界框标注

现在领先的目标检测器是从基于深度CNN的主干分类器网络重新调整用途的两级或单级网络。

现在领先的目标检测器是从基于深度CNN的主干分类器网络重新调整用途的两级或单级网络。YOLOv3就是这样一种众所周知的最先进的单级检测器,它接收输入图像并将其划分为大小相等的网格矩阵。具有目标中心的网格单元负责检测特定目标。

今天分享的,就是提出了一种新的数学方法 ,该方法为每个目标分配多个网格,以实现精确的tight-fit边界框预测。研究者还提出了一种有效的离线复制粘贴数据增强来进行目标检测。新提出的方法显着优于一些当前最先进的目标检测器,并有望获得更好的性能。

目标检测网络旨在使用紧密匹配的矩形边界框在图像上定位对象并正确标记它。如今,有两种不同的方法可以实现这一目的。第一个也是性能方面,最主要的方法是两阶段目标检测,最好的代表RCNN及其衍生物[Faster r-cnn: Towards real-time object detection with region proposal networks]、[Fast r-cnn]。相比之下,第二组目标检测实现因其出色的检测速度和轻量级而广为人知,被称为单阶段网络,代表性示例为[You only look once: Unified, real-time object detection]、[Ssd: Single shot multibox detector]、[Focal loss for dense object detection]。两阶段网络依赖于一个潜在的区域建议网络,该网络生成可能包含感兴趣对象的图像的候选区域,第二个检测头处理分类和边界框回归。在单阶段目标检测中,检测是一个单一的、完全统一的回归问题,它在一个完整的前向传递中同时处理分类和定位。因此,通常,单阶段网络更轻、更快且易于实现。

论文地址:​https://arxiv.org/pdf/2201.01857.pdf​

今天的研究依然是坚持YOLO的方法,特别是YOLOv3,并提出了一种简单的hack,可以同时使多个网格单元预测目标坐标、类别和目标置信度。每个对象的多网格单元分配背后的基本理论是通过强制多个单元在同一对象上工作来增加预测紧密拟合边界框的可能性。

多网格分配的一些优点包括:

(a)为目标检测器提供它正在检测的对象的多视角视图,而不是仅依靠一个网格单元来预测对象的类别和坐标;

(b ) 较少随机和不稳定的边界框预测,这意味着高精度和召回率,因为附近的网格单元被训练来预测相同的目标类别和坐标;

(c) 减少具有感兴趣对象的网格单元与没有感兴趣对象的网格之间的不平衡。

此外,由于多网格分配是对现有参数的数学利用,并且不需要额外的关键点池化层和后处理来将关键点重新组合到其对应的目标,如CenterNet和CornerNet,可以说它是一个更实现无锚或基于关键点的目标检测器试图实现的自然方式。除了多网格冗余注释,研究者还引入了一种新的基于离线复制粘贴的数据增强技术,用于准确的目标检测。

MULTI-GRID ASSIGNMENT

上图包含三个目标,即狗、自行车和汽车。为简洁起见,我们将解释我们在一个对象上的多网格分配。上图显示了三个对象的边界框,其中包含更多关于狗的边界框的细节。下图显示了上图的缩小区域,重点是狗的边界框中心。包含狗边界框中心的网格单元的左上角坐标用数字0标记,而包含中心的网格周围的其他八个网格单元的标签从1到8。

到目前为止,我已经解释了包含目标边界框中心的网格如何注释目标的基本事实。这种对每个对象仅一个网格单元的依赖来完成预测类别的困难工作和精确的tight-fit边界框引发了许多问题,例如:

(a)正负网格之间的巨大不平衡,即有和没有对象中心的网格坐标

(b)缓慢的边界框收敛到GT

(c)缺乏要预测的对象的多视角(角度)视图。

所以这里要问的一个自然问题是,"显然,大多数对象包含一个以上网格单元的区域,因此是否有一种简单的数学方法来分配更多这些网格单元来尝试预测对象的类别和坐标连同中心网格单元?"。这样做的一些优点是(a)减少不平衡,(b)更快的训练以收敛到边界框,因为现在多个网格单元同时针对同一个对象,(c)增加预测tight-fit边界框的机会(d) 为YOLOv3等基于网格的检测器提供多视角视图,而不是对象的单点视图。新提出的多重网格分配试图回答上述问题。

Ground-truth encoding

训练

A. The Detection Network: MultiGridDet

MultiGridDet是一个目标检测网络,通过从YOLOv3中删除六个darknet卷积块来使其更轻、更快。一个卷积块有一个Conv2D+Batch Normalization+LeakyRelu。移除的块不是来自分类主干,即Darknet53。相反,将它们从三个多尺度检测输出网络或头中删除,每个输出网络两个。尽管通常深度网络表现良好,但太深的网络也往往会快速过度拟合或大幅降低网络速度。

B. The Loss function

Coordinate activation function plot with different β values

C. Data Augmentation

离线复制粘贴人工训练图像合成工作如下:首先,使用简单的图像搜索脚本,使用地标、雨、森林等关键字从谷歌图像下载数千张背景无对象图像,即没有我们感兴趣的对象的图像。然后,我们从整个训练数据集的随机q个图像中迭代地选择p个对象及其边界框。然后,我们生成使用它们的索引作为ID选择的p个边界框的所有可能组合。从组合集合中,我们选择满足以下两个条件的边界框子集:

  • if arranged in some random order side by side, they must fit within a given target background image area
  • and should efficiently utilize the background image space in its entirety or at least most part of it without the objects overlap.

实验及可视化

Pascal VOC 2007上的性能比较

coco数据集上的性能比较

从图中可以看出,第一行显示了六个输入图像,而第二行显示了网络在非极大抑制(NMS)之前的预测,最后一行显示了MultiGridDet在NMS之后对输入图像的最终边界框预测。

相关推荐
铭keny21 分钟前
YOLO11 目标检测从安装到实战
人工智能·目标检测·目标跟踪
杨小扩6 小时前
第4章:实战项目一 打造你的第一个AI知识库问答机器人 (RAG)
人工智能·机器人
雪兽软件6 小时前
2025 年网络安全与人工智能发展趋势
人工智能·安全·web安全
元宇宙时间7 小时前
全球发展币GDEV:从中国出发,走向全球的数字发展合作蓝图
大数据·人工智能·去中心化·区块链
小黄人20257 小时前
自动驾驶安全技术的演进与NVIDIA的创新实践
人工智能·安全·自动驾驶
ZStack开发者社区8 小时前
首批 | 云轴科技ZStack加入施耐德电气技术本地化创新生态
人工智能·科技·云计算
X Y O9 小时前
神经网络初步学习3——数据与损失
人工智能·神经网络·学习
唯创知音9 小时前
玩具语音方案选型决策OTP vs Flash 的成本功耗与灵活性
人工智能·语音识别
Jamence9 小时前
多模态大语言模型arxiv论文略读(151)
论文阅读·人工智能·语言模型·自然语言处理·论文笔记