部分基于深度学习的主流目标检测算法


目标检测是计算机视觉的一个非常重要的核心方向,它的主要任务目标定位和目标分类。

基于深度学习的目标检测方法大致可分为两类:Anchor based方法(一阶段,二阶段)、Anchor free方法、基于transformer的方法。

无论是anchor还是anchor free,检测任务无非就是这样的思路:

  1. 表示:如何表示图像上的物体,如bbox,conner,center,reppoints等;

  2. 分配:如何分配正负样本:IOU、高斯热图、centerness等;

  3. 分类:分类任务计算物体类别损失,解决样本不平衡的问题;

  4. 回归:回归任务计算物体尺度、offset等等,以进行一些修正。

Anchor-Based方法

基于CNNs的目标检测算法主要有两条技术发展路线:anchor-based和anchor-free方法,而anchor-based方法则包括一阶段和二阶段检测算法(二阶段目标检测算法一般比一阶段精度要高,但一阶段检测算法速度会更快)。

局限性:

  1. Anchor的大小,数量,长宽比对于检测性能的影响很大(通过改变这些超参数Retinanet在COCO benchmark上面提升了4%的AP),因此Anchor based的检测性能对于anchor的大小、数量和长宽比都非常敏感。
  2. 这些固定的Anchor极大地损害了检测器的普适性,导致对于不同任务,其Anchor都必须重新设置大小和长宽比。
  3. 为了去匹配真实框,需要生成大量的Anchor,但是大部分的Anchor在训练时标记为负样本,所以就造成了样本极度不均衡问题(没有充分利用fore-ground)。
  4. 在训练中,网络需要计算所有Anchor与真实框的IOU,这样就会消耗大量内存和时间。

Two-stage目标检测算法

二阶段检测算法主要的两个阶段:

Stage1: 从图像中生成region proposals

Stage2: 从region proposals生成最终物体框

相较于单阶段目标检测算法,双阶段目标检测算法先根据图像提取候选框,然后基于候选区域做二次修正得到检测点结果,检测精度较高,但检测速度较慢。

这类算法的开山之作是RCNN,随后Fast RCNN、Faster RCNN依次对其进行了改进。

由于优秀的性能,Faster RCNN至今仍然是目标检测领域很有竞争力的算法。随后,FPN、Mask RCNN等算法又针对Faster RCNN的不足提出了改进,这进一步丰富了Faster RCNN的组件,提升了它的性能。

RCNN

简介:
CNN首先通过选择性搜索算法Selective Search从一组对象候选框中选择可能出现的对象框,然后将这些选择出来的对象框中的图像resize到某一固定尺寸的图像,并喂入到CNN模型(经过在ImageNet数据集上训练过的CNN模型,如AlexNet)提取特征,最后将提取出的特征送入到分类器来预测该对象框中的图像是否存在待检测目标,并进一步预测该检测目标具体属于哪一类。

不足:
重叠框(一张图片大2000多个候选框)特征的冗余计算使得整个网络的检测速度变得很慢(使用GPU的情况下检测一张图片大约需要14S)。

Fast RCNN

简介:
在RCNN中,每个候选区域都需要用CNN单独提取特征。为了减少算法的计算时间,Fast-RCNN希望在每张图片上只使用一次CNN,就能提取到所有关注区域的特征。
该网路使得我们可以在相同的网络配置下同时训练一个检测器和边框回归器。该网络首先输入图像,图像被传递到CNN中提取特征,并返回感兴趣的区域ROI,之后再ROI上运用ROI池化层以保证每个区域的尺寸相同,最后这些区域的特征被传递到全连接层的网络中进行分类,并用Softmax和线性回归层同时返回边界框。

不足:
与RCNN相比,Fast RCNN计算一张图片只需要2秒,速度有大幅提升,每张图片的计算时间只有但仍不够理想。因为它依然用到了选择性搜索方法得到感兴趣区域,而这一过程通常很慢。

Faster RCNN

简介:
Faster RCNN针对感兴趣区域的生成方式,对RCNN进行了优化,进一步提高了计算速度和准确率。具体来说,Faster RCNN使用Region Proposal Network(RPN) 生成感兴趣区域:
该网络首先输入图像到卷积网络中,生成该图像的特征映射。在特征映射上应用Region Proposal Network,返回object proposals和相应分数。应用Rol池化层,将所有proposals修正到同样尺寸。最后,将proposals传递到完全连接层,生成目标物体的边界框。

不足:
时至今日,依然是目标检测领域的主流算法之一。
虽然Faster RCNN的精度更高,速度更快,也非常接近于实时性能,但它在后续的检测阶段中仍存在一些计算冗余;除此之外,如果IOU阈值设置的低,会引起噪声检测的问题,如果IOU设置的高,则会引起过拟合。

在R-CNN系列算法中,包括原始的R-CNN以及其后续改进版本Fast R-CNN和Faster R-CNN,卷积神经网络(CNN)通常用作特征提取器(backbone)。这些算法的核心思想是使用深度学习来提取图像特征,然后在此基础上进行目标检测任务。
在这些算法中,CNN backbone可以是不同的架构,如VGG-16、ResNet-50、ResNet-101等等。VGG-16是R-CNN原始论文中使用的backbone。

FPN(理解为Faster R-CNN中的一个关键组件或改进模块)

简介:
Faster R-CNN是利用单个高层特征图(下采样四倍的卷积层–Conv4)进行物体的分类和bounding box的回归。这样做对小物体的检测不利,因为小物体本身具有的像素信息较少,在下采样的过程中,这些信息很容易丢失,从而降低了算法的性能。

为了处理这种物体大小差异十分明显的检测问题,FPN提出了特征金字塔网络结构,它引入了多尺度特征,在只增加少量计算量的情况下,提升小物体的检测性能。

具体来说,Faster RCNN将最后一层特征输入到了RPN中,最后一层的特征经过3x3卷积,得到256个channel的卷积层,再分别经过两个1x1卷积得到类别得分和边框回归结果。

而FPN将P2、P3、P4、P5、P6这五个特征层的特征都输入到了RPN中。每个特征层的下采样倍数不同,这意味着它们具有不同的尺度信息分离,因此作者将322、642、1282、2562、5122这五种尺度的anchor,分别对应到P2、P3、P4、P5、P6这五个特征层上,这样一来,每个特征层只需要专门处理单一的尺度信息即可。

此外,作者通过实验发现,如果将这5个特征层后面的RPN参数共享,所得到的结果与不共享几乎没有差别。这说明不同下采样倍数之间的特征有相似语义信息。

性能:
将FPN技术应用于Faster RCNN网络之后,网络的检测精度得到了巨大提高,再次成为当前的SOTA检测算法。此后FPN成为了各大网络(分类,检测与分割)提高精度最重要的技术之一。

在Faster R-CNN中,FPN通常被集成到基础的卷积神经网络中,用来改进区域建议网络(RPN)和后续的检测性能。FPN的引入显著提高了Faster R-CNN对小目标的检测能力,因为它能够更有效地捕捉到多尺度的目标信息。

One-stage目标检测算法

相较于双阶段目标检测算法,单阶段目标验测算法直接对图像进行计算生成检测结果,检测低速度快,但检测精度低。

这类算法的开山之作是YOLO,随后SSD、Retinanet依次对其进行了改进,提出YOLO的团队将这些有助于提升性能的 trick融入到YOLO算法中,后续又提出了4个改进版本YOLOv2~YOLOv5。

尽管预测准确率不如双阶段目标检测算法,由于较快的运行速度,YOLO成为了工业界的主流。

YOLO

简介:
双阶段目标检测需要预先设置大量先验框,并且需要专门的神经网络RPN对先验框进行位置修正。这种设定使得双阶段目标检测算法复杂且计算慢。

YOLO是单阶段目标检测的开山之作,它只需要用神经网络处理一次图片,就可以同时预测得到位置和类别,从而将目标检测任务定义为端到端的回归问题,提升了计算速度。YOLO的工作流程如下:

对于一张输入图片,首先将图片缩放成统一的尺寸,并在图片上划分出若干表格。随后使用卷积神经网络提取图片特征,并使用全连接层在每个网格上进行回归预测,每个网格预测K个box,每个box预测五个回归值。其中的四个回归值代表box的位置,第五个回归值代表box中含有物体的概率和位置的准确程度。

随后对于含有物体的box,使用全连接层,回归预测物体的在各个类别的条件概率。因而,卷积网络共输出的预测值个数为N×(K×5+C),其中N为网格数,K为每个网格生成box个数,C为类别数。

不足:
尽管单阶段模型显著提高了计算速度,YOLO划分网格的方式较为粗糙,在小目标检测任务上表现不佳,总体性能弱于Faster RCNN。

SSD

简介:
针对YOLO的不足,SSD借鉴了双阶段目标检测算法的一些trick,在YOLO的基础上进行了一系列改进:

YOLO利用单个高层特征进行目标检测,SSD则是将特征提取网络中不同层的多个特征输入到目标检测模块,以希望提升小物体检测的精度。

YOLO在每个网格上预测多个边界框,但这些预测都相对这个正方形网格本身,与真实目标多变的形状差异较大,这使得YOLO需要在训练过程中自适应目标的形状。SSD借鉴了Faster R-CNN中先验框理念,为每个网格设置不同尺度、长宽比的先验框,这在一定程度上减少训练难度。

SSD还使用卷积层络替代全连接层,针对不同特征图进行回归预测,这样一来,对于形状为mxnxp的特征图,只需要采用3x3xp这样比较小的卷积核得到检测值,进一步减少了模型的参数量,提高了计算速度。

总而言之,SSD算法的主要创新点是提出了Multi-reference和Multi-resolution的检测技术。SSD算法和先前的一些检测算法的区别在于:先前的一些检测算法只是在网络最深层的分支进行检测,而SSD有多个不同的检测分支,不同的检测分支可以检测多个尺度的目标,所以SSD在多尺度目标检测的精度上有了很大的提高,对小目标检测效果要好很多。

性能:
SSD的改进,使得单阶段目标检测算法的性能基本与当时的Faster-RCNN持平,不过后续又被Faster-RCNN类算法超越。

Anchor-Free方法

基于Anchor的物体检测问题通常被建模成对一些候选区域进行分类和回归的问题,在一阶段检测器中,这些候选区域就是通过滑窗方式产生Anchor box,而在二阶段检测器中,候选区域是RPN生成的Proposal,但是RPN本身仍然是对滑窗方式产生的Anchor进行分类和回归。基于Anchor的检测算法由于Anchor太多导致计算复杂,及其所带来的大量超参数都会影响模型性能。近年的Anchor free技术则摒弃Anchor,通过确定关键点的方式来完成检测,大大减少了网络超参数的数量。

CornerNet
CenterNet
FSAF
FCOS
SAPD

基于transformer的方法

对于目标检测任务而言,理论上讲,各个目标之间的关系是有助于提升目标检测效果的。尽管传统目标检测方法使用到了目标之间的关系,直到Transformer模型面世,无论是单阶段还是双阶段目标检测,都没有很好地利用到注意力机制。

一个可能的原因是目标与目标之间的关系难以建模,因为目标的位置、尺度、类别、数量都会因图像的不同而不同。而现代基于CNN的方法大多只有一个简单、规则的网络结构,对于上述复杂现象有些无能为力。

针对这种情况,Relation Net和DETR利用Transformer将注意力机制引入到目标检测领域。Relation Net利用Transformer对不同目标之间的关系建模,在特征之中融入了关系信息,实现了特征增强。DETR则是基于Transformer提出了全新的目标检测架构,开启了目标检测的新时代。

DETR

简介:
DETR是首个用transformer完成目标检测任务的代表性工作。

首先,DETR使用CNN提取图片的特征,再加上NLP领域常用的位置编码,最终生成了一批序列化数据。

在encoder阶段,将序列化数据其送入encoder中,利用注意力机制提取数据中的特征。在decoder阶段,输入N个随机初始化向量,每个object query关注图片的不同位置。经过decoder的解码,最终会生成N个向量,每个向量对应一个检测到的目标。最后将这N个向量输入到神经网络中,得到每个目标的类别和位置。

相较于其它目标检测算法,DETR生成的检测框数量大幅减少,与真实的检测框数量基本一致。DETR使用匈牙利算法,将预测框与真实框进行了匹配,随后就可以计算出loss,完成对模型的训练。

性能:
DETR取得了好于Faster RCNN的检测效果,并且它不需要预先指定候选区域,不需要使用NMS去除重复的目标框,算法流程十分简洁。

常用数据集

目标检测使用最多的四大公共数据集:

Pascal VOC

ILSVRC

MS-COCO

OID

Reference

https://zhuanlan.zhihu.com/p/393997909

https://zhuanlan.zhihu.com/p/485657298

https://zhuanlan.zhihu.com/p/94924987

https://blog.csdn.net/zhuquan945/article/details/79862522

最近更新

  1. TCP协议是安全的吗?

    2024-05-16 15:30:12       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-16 15:30:12       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-16 15:30:12       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-16 15:30:12       20 阅读

热门阅读

  1. 【深度学习】Pytorch模型转成Onnx

    2024-05-16 15:30:12       14 阅读
  2. 6 使用 AspectJ 的 AOP 配置管理事务

    2024-05-16 15:30:12       13 阅读
  3. 自定义一个starter

    2024-05-16 15:30:12       12 阅读
  4. ESP32 Arduino 定时器中断

    2024-05-16 15:30:12       14 阅读
  5. vue3-响应式API(工具函数)-unRef

    2024-05-16 15:30:12       12 阅读