目标检测任务的调研与概述
0 FQA
Q1:什么是检测任务? 他跟分类任务和分割任务有什么区别?
A1: 目标检测任务,就是在图像或者视频上,找到目标的位置并分类。分类任务是比价简单的,在整张图片上进行二分类,是整个图片级信息的理解。 分割任务分类语义分割和实例级分割,语义分割相当于是逐像素的分类,将目标物体的像素逐个分类。 而实例分割就相当于是检测任务的更深一层的扩展,在分割物体的同时,还会分开每一个实例。
Q2: 检测任务的损失函数是啥? 是怎么训练的?
A2:损失函数主要包含分类损失和位置损失,分类损失常见的是交叉熵,位置损失常见的是IOU交并比,以及相应的扩展。
Q3:目标检测都有那些评价指标?你像分类有acc,分割有dice等评价指标。
A3:目标检测当然也有他特殊的评价指标,那就是IOU的扩展,当IOU大于某个阈值时,认为是正确的位置检测。然后就有了tp,然后就可以计算precision,等值。通过计算某个类别的平均准确率,得到评价指标AP,所有类别的话,那就是mAP。
Q4:目标检测有那些常见的数据集? 目标检测任务他是一个比较偏大数据量的数据集是吗?
A4:常见的数据集比如说,**ILSVRC,VOC,ms-coco等等。**不可否认的是,无论是哪一个数据集,都具有数据偏差的存在,因为确实在日常生活中,有些图片好收集,有些图片难以收集。
Q5: 目前检测任务都有那些常见的模型?
A5:目标检测的常见模型,分类二阶段和一阶段。 刚开始发展的是二阶段,比如说R-CNN,fast-RCNN,faster-RCNN,等等,二阶段的也被称为region-based的方法,因为需要先生成区域候选框,然后再进行分类。 后期在yolo这个一阶段的开山之作后,一阶段是一种region-free的方式,不需要事先生成区域候选框,使用不同比例的box来进行密集采样,直接进行分类任务。
Q6:什么是一阶段,什么是二阶段,他们之间有什么区别?
A6:两阶段就相当于,网络需要先生成很多候选的box,然后对box计算损失;单阶段是用不同比例的box去往图片上密集的罩上去,然后计算损失。因为少了生成阶段,所以会快一些。但是这种方式有种遍历的感觉。
Q7:你知道什么是yolo系列算法吗? 其基本原理是啥?
A7:yolo是当初一阶段算法的开创者,一阶段比二阶段的好处就是在于实时性。YOLO利用整张图作为网络的输入,直接在输出层回归 bounding box 的位置和 bounding box 所属的类别。YOLO将检测问题进行了重构,视其为一个回归问题,直接预测图像像素作为目标及其边界框属性。在YOLO中,输入图像被划分为S*S的网格(grid cell),目标中心点所在的cell负责该目标的检测。一个网格cell预测多个边框,每个预测数组包括五个元素:边框的中心点(x, y)、边框的宽高w/h、置信度得分。
Q8:你知道DETR吗?他的基本工作原理是啥?
A8: 单阶段的, DETR是基于transformer制作的目标检测算法,该模型使用集合预测方法同时预测每个对象的类别和位置。DETR将目标检测任务转换为集合预测问题,消除了重复的边界框预测。Transformers通过使用自注意力模块基于整个图像上下文捕获目标之间的成对关系,从而避免重复预测。与使用NMS等后处理步骤来消除重复预测的传统目标检测器相比,有减少计算成本的优势。
Q9: 你觉得目标检测任务中,还存在那些问题?
1,数据标注复杂,可以使用子监督;
2,可以使用CLIP大模型等方法;
1 目标检测任务基本知识:
1.1 什么是目标检测?
简单而言就是,在图像或者视频中,找到目标位置并进行分类。
对于一张图片的理解,有三个主要的层次:
一是分类(Classification),即是将图像结构化为某一类别的信息,用事先确定好的类别(string)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务,也是深度学习模型最先取得突破和实现大规模应用的任务。其中,ImageNet是最权威的评测集,每年的ILSVRC催生了大量的优秀深度网络结构,为其他任务提供了基础。在应用领域,人脸、场景的识别等都可以归为分类任务。
二是检测(Detection)。分类任务关心整体,给出的是整张图片的内容描述,而检测则关注特定的物体目标,要求同时获得这一目标的类别信息和位置信息。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因而,检测模型的输出是一个列表,列表的每一项使用一个数据组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。检测的输出是:要预测一系列的Bounding Box(框)的坐标(x, y, w, h)、置信度(c)以及类别(Label)。一般有两种,Box的坐标位置,一般两种形式,一种是左上角和右下角坐标点,或者就是一个点加宽高,其他参数有置信度和类别。
三是分割(Segmentation)。分割包括语义分割(semantic segmentation)和实例分割(instance segmentation),前者是对前背景分离的拓展,要求分离开具有不同语义的图像部分,而后者是检测任务的拓展,要求描述出目标的轮廓(相比检测框更为精细)。分割是对图像的像素级描述,它赋予每个像素类别(实例)意义,适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。
1.2 目标检测的损失函数都有那些?
一般的目标检测模型包含两类损失函数: 一类是类别损失(分类),另一类是位置损失(回归).
这两类损失函数往往用于检测模型最后一部分,根据模型输出(类别和位置)和实际标注框(类别和位置)分别计算类别损失和位置损失。
1.2.1 类别损失:
就是常见的分类损失,这里就不具体赘述了。
- 交叉熵损失 Cross Entropy Loss
- Focal Loss 改进的交叉熵损失函数
1.2.2 位置损失:
- L1 Loss:即平均绝对误差(Mean Absolute Error, MAE),指模型预测值和真实值之间距离的平均值。
- L2 Loss:即均方误差损失(Mean Square Error, MSE),指预测值和真实值之差的平方的平均值。
- Smooth L1 Loss:基于L1 loss修改得到
- IoU Loss:IoU类的损失函数都是基于预测框和标注框之间的IoU**(交并比)😗*
- GIoU Loss:IoU反映了两个框的重叠程度,在两个框不重叠时,IoU衡等于0,此时IoU loss恒等于1。而在目标检测的边界框回归中,这显然是不合适的。因此,GIoU loss在IoU loss的基础上考虑了两个框没有重叠区域时产生的损失。
- DIoU Loss:IoU loss和GIoU loss都只考虑了两个框的重叠程度,但在重叠程度相同的情况下,我们其实更希望两个框能挨得足够近,即框的中心要尽量靠近。因此,DIoU在IoU loss的基础上考虑了两个框的中心点距离,具体定义如下:,ρ表示预测框和标注框中心端的距离,p和g是两个框的中心点。c表示两个框的最小包围矩形框的对角线长度。当两个框距离无限远时,中心点距离和外接矩形框对角线长度无限逼近,R→1
下图直观显示了不同情况下的IoU loss、GIoU loss和DIoU loss结果:
其中,绿色框表示标注框,红色框表示预测框,可以看出,最后一组的结果由于两个框中心点重合,检测效果要由于前面两组。IoU loss和GIoU loss的结果均为0.75,并不能区分三种情况,而DIoU loss则对三种情况做了很好的区分。
- CIoU Loss:DIoU loss考虑了两个框中心点的距离,而CIoU loss在DIoU loss的基础上做了更详细的度量,具体包括:重叠面积;中心端距离;长宽比;
参考文章;
【https://blog.csdn.net/senbinyu/article/details/108310976】
1.3 目标检测的评价指标都有那些?
目标检测器使用多种指标来评价检测器的性能,如:FPS、precision、recall,以及最常用的mAP。
precision由IoU推导出来,后者的定义是预测边框和GT之间的交并比。然后,设定一个IoU阈值来判定检测结果是否正确:如果IoU大于阈值,则该结果分类为True Positive(TP),如果小于阈值,则分类为False Positive(FP)。如果模型没有检测出GT中存在的目标,则这些目标分类为False Negative(FN)。则precision和recall的定义如下:一般阈值会选择0.5;
基于上述定义,average precision(AP)是每一类的平均精度。然后,为了对比不同检测器,将所有类的AP平均,即可得到mAP这个单一指标。
除此之外,还有时间:FPS,Frame Per Second(FPS)指的是模型一秒钟能检测图片的数量,不同的检测模型往往会有不同的mAP和检测速度.
目标检测技术的很多实际应用在准确度和速度上都有很高的要求,如果不计速度性能指标,只注重准确度表现的突破,其代价是更高的计算复杂度和更多内存需求,对于行业部署而言,可扩展性仍是一个悬而未决的问题。因此在实际问题中,通常需要综合考虑mAP和检测速度等因素。
1.4 目标检测有那些常见的数据集?
Pascal Visual Object Classes(VOC)挑战赛是一个持续了多年的、为了促进视觉感知的比赛。其起始于2005,对四个目标类别进行分类和检测,不过VOC的两个版本主要用作基准测试集。VOC2007有5K个训练图像以及超过12K的标注目标;VOC2012将训练图像增加到11K,并拥有超过27K个标注目标,目标类别也扩展到了20类,同时也增加了语义分割、动作识别的任务。Pascal VOC引入了mAP@0.5IoU作为评价指标,来评估模型性能。
ImageNet Large Scale Visual Recognition Challenge (ILSVRC),是2010~2017期间的年度挑战赛,如今其已经成为了评估模型性能的基准集。数据集的规模扩展到了包含了1000个类别、超过100万个图像,其中精选了200个类别、超500K个图像被用于目标检测。该目标检测数据集包含了来自ImageNet、Flikr在內的多种数据源。ILSVRC还放宽了IoU的限制,以将小目标检测纳入其中。
The Microsoft Common Objects in Context(MS-COCO),是目前最具挑战的数据集之一。其包含了自然环境中发现的、四岁儿童可以轻易识别的共91种常见目标。MS-COCO字2015年提出,自此其热度只增不减。其包含了超过200万个实例,且平均每张图像中有3.5个类别、7.7个实例,也包含了多种视角的图像。MS-COCO引入了更为严格的方法来评价检测器,不像VOC和ILSVCR,COCO在IoU从0.5到0.95的范围内没隔0.5计算一次mAP,然后平均这十个mAP,得到AP。除此之外,它还将AP分别用于小型、中型和大型对象,以在不同的尺度上比较性能。图5展示了MS-COCO数据集中不同类别的图像数量的分布情况:
谷歌的Open Images数据集由920万张图像组成,使用图像级标签、对象边界框和分割掩码等进行标注。它于2017年推出,并已进行6次更新。对于目标检测,Open Images有1600万个包围框,包含190万张图像上的600个类别,这使它成为最大的目标定位数据集。它的创作者格外小心地选择了有趣、复杂和多样的图像,每张图像有8.3个对象类别。对Pascal VOC中引入的AP做了一些更改,比如忽略未注释的类,需要检测类和子类等。
数据倾斜/偏差问题:
不同类别的图片数量差别很大,上述四种数据集中,有三种(Pascal VOC、MS-COCO、Open Image)数据集中,除了前五类,后面类的图片数量显著下降。
2 目标检测的进阶知识:
将检测器分为两类:两阶段检测器、一阶段检测器。同时,我们也简单回顾了传统的检测方法。
- 两阶段检测器:如果一个网络,有一个单独的模块用于生成region proposals(区域候选框),那么该网络就称为两阶段检测器。这种模型试着在第一阶段找到一定数量的目标proposals,然后在第二阶段对各个proposals进行定位及分类。由于具有连个阶段,这些网络通常在生成proposals的阶段耗时较长,且结构复杂、缺乏全局信息。
- 一阶段检测器通过密集采样直接对语义目标进行分类和定位,它们使用预定义的不同比例和长宽比的boxes/points来定位目标,其在实时性以及更简单的设计方面超越了两阶段检测器。
两阶段就相当于,网络需要先生成很多候选的box,然后对box计算损失;
单阶段是用不同比例的box去往图片上密集的罩上去,然后计算损失。因为少了生成阶段,所以会快一些。但是这种方式有种遍历的感觉。
2.1 经典的backbone:
backbone是目标检测器中的重要组成部分,输入图像的特征就是通过其进行提取的。这里讨论几种经典的backbone架构。
- AlexNet
- VGG
- GoogleNet/Inception
- ResNet
- ResNeXt
- CSPNet
- EfficientNet
2.2 目标检测器-传统的检测方法
Viola-Jones:
Viola-Jones检测器于2001年提出,主要用于人脸检测,是一个精确而强大的探测器。它结合了类似Haar特征、积分图像、Adaboost和级联分类器等多种技术。第一步是通过在输入图像上滑动窗口搜索haar类特征,并使用积分图像进行计算。然后,它使用一个训练有素的Adaboost找到每个haar特征的分类器,并将它们级联。Viola-Jones算法仍然用于小型设备,因为它非常高效和快速。
HOG:
Dalal 和Triggs于2005年提出了Histogram of Oriented Gradients (HOG)特征描述器,用于目标检测的特征提取。与其他探测器相比,HOG是一个改进版,它提取梯度及其边缘方向来创建一个特征表。图像被划分为网格,然后使用特征表为网格中的每个单元创建直方图。为感兴趣的区域生成HOG特征,**并将其输入线性SVM分类器进行检测。**其提出是作为行人检测检测器的,不过它可以被训练来检测各种其他类。
DPM:
Deformable Parts Model (DPM)由Felzenszwalb等人引入,是2009年Pascal VOC挑战赛的冠军。它利用目标的个别“部分”进行检测,准确率高于HOG。它遵循分而治之的哲学;在推理期间,对象的各个部分被单独检测,它们的一个可能的排列被标记为检测结果。例如,人体可以被认为是头、胳膊、腿和躯干等部分的集合。一个模型将被指定捕捉整个图像中的一个部分,并对所有这些部分重复这个过程。然后,另一个模型移除那些不可能的组合,以生成最终检测。基于DPM的模型是深度学习时代之前最成功的算法之一。
2.3 目标检测器-两阶段的检测方法:
两阶段中,比较常见的有以下方法,
2.3.1 R-CNN 开山之作
Region-based Convolutional Neural Network (R-CNN),是R-CNN系列的第一篇文章,其证明了CNNs可以极大地提高性能。R-CNN使用一个类别不可知的region proposals CNNs模块将检测转化为分类和定位问题。减去均值后的输入图像,首先通过区域提议模块,生成2000个候选对象。这个模块使用选择性搜索(SS)找到图像中有较高概率属于一个对象的部分。然后,这些候选项被warped并通过CNN网络传播,CNN为每个proposals提取4096维的特征向量。Girshick等人使用AlexNet作为检测器的backbone。然后,特征向量被送入训练好的、指定类别的SVM获取置信度得分。接着,使用非极大值抑制(NMS)基于IoU和类别对得分区域进行过滤。一旦类别被确认,算法就会使用训练好的边界框回归器来预测其边框,也即预测四个参数:xyhw。
R-CNN将检测抽象为两个过程,一是基于图片提出若干可能包含物体的区域(即图片的局部裁剪,被称为Region Proposal),文中使用的是Selective Search算法;二是在提出的这些区域上运行当时表现最好的分类网络(AlexNet),得到每个区域内物体的类别。
R-CNN在目标检测领域引起了一个新的浪潮,不过它很慢(每张图像47秒),且时空复杂度都很高。它有复杂的训练过程,即使在一些计算是共享的情况下,也要花几天时间在小数据集上训练。
2.3.2 SPP-Net
He等人提出使用空间金字塔池化(SPP)层来处理任意尺寸、任意长宽比的图片。他们意识到,仅全连接层需要固定大小的输入。SPP-net在region proposal module之前,只是平移了CNN的卷积层,增加了pooling层,使得网络不依赖于size/aspect ratio,减少了计算量。生成候选窗口的算法仍是选择性搜索(SS)。feature maps是通过ZF-5网络的卷积层从输入图像提取的。然后,候选窗口被映射到特征映射上,这些特征映射随后被金字塔池化层的空间bins转换为固定长度的表示。最后将得到的向量送入全连接层,然后使用SVM分类器预测类别和得分。类似于R-CNN,SPP-Net也有一个边框回归的后处理层来改善定位精度。其同样使用多阶段训练过程,除了微调以外,其他步骤只在全连接层上进行。
SPP-Net在相似精度的前提下,比R-CNN快很多,它还可以处理任意尺寸、比例的图像,因此,也避免了由于输入形变导致的目标变形。然而,由于其架构类似于R-CNN,它也有R-CNN的缺点,像多阶段训练,昂贵的计算和训练时间。
2.3.3 Fast R-CNN
R-CNN和SPP-Net的一个主要缺点是需要多阶段分别训练。Fast-RCNN通过创建一个单一的端到端可训练的系统来解决这个问题。网络将一幅图像被送入一些列卷积层,同时目标的proposals也映射到获取的feature maps上。Girshick利用ROI-Pooling层替代了SPP-net中的金字塔结构的Pooling,其后接上两个全连接层,然后分了N+1类的softmax层和一个同样具有一个全连接的边框回归层。该模型还将边框回归器的损失函数从L2改为smooth L1以提高性能,同时引入多任务损失来训练网络。
作者还使用了先进的改进的预训练模型作为backbone。采用随机梯度下降法(SGD)和mini-batch为2对该网络进行单步训练,这有助于网络更快地收敛,因为反向传播在两个图像的roi之间共享计算。
Fast R-CNN主要是作为速度的改进而引入的**(是R-CNN的146倍)**,而准确性的提高则是次要的。
2.3.4 Faster R-CNN:
尽管Fast R-CNN逐渐接近实时目标检测,但它的区域建议生成仍然慢了一个数量级(每幅图像2秒相比于每幅图像0.2秒)。Ren等人提出了一个完全卷积网络作为区域建议网络(RPN),该网络接受任意输入图像并输出一组候选窗口。每个这样的窗口都有一个相关的对象评分,它决定了一个对象出现的可能性。RPN引入了Anchor的概念,它使用多个不同长宽比的边界框,并在它们之上回归来定位对象。输入的图像首先经过CNN得到一组feature maps。它们被转发到RPN, RPN生成边界框及其分类。被选择的proposals随后映射回前面CNN层所提取的feature maps上,并最终送入全连接层,来进行分类和边框回归。Faster R-CNN实际上就是使用RPN所谓region proposals模块的Fast R-CNN。
训练Faster R-CNN更为复杂,因为两个模型之间存在执行不同的任务的共享层。首先,RPN在ImageNet数据集上进行预训练,在PASCAL VOC数据集上进行微调。然后,使用第一步的RPN得到的region proposals来训练一个Fast R-CNN。到此为止,网络还没有共享卷积层。现在,我们固定了检测器的卷积层,并微调了RPN。最后,Fast R-CNN从更新后的RPN进行微调。
Faster R-CNN比以前的SOTA提高了超过3%的检测精度,并将推理时间减少了一个数量级。它修正了慢速的region proposals过程,并以每秒5帧的速度运行。CNN在region proposals的另一个优势是,它可以学习产生更好的提案,从而提高准确性。
2.3.5 FPN
在提升小目标检测效果时,在多个级别上使用图像金字塔来获取特征金字塔(特征化的图像金字塔)是一种常用的手段。虽然它提高了检测器的平均精度,但推理时间的增加也是很多的。Lin等人提出了该特征金字塔网络(FPN),它采用自上而下的横向连接架构,在不同的尺度上构建高层次的语义特征。FPN有两条路径,一条是由卷积神经网络(ConvNet)在多个尺度上计算特征层次的自底向上路径,另一条是自上而下的路径,它将粗特征图从较高层次上采样为高分辨率特征。这些路径通过1x1卷积运算进行横向连接,以增强特征中的语义信息。这里采用FPN作为Faster R-CNN的RPN,以ResNet-101为backbone。
FPN可以在所有尺度上提供高级语义,降低了检测的错误率。它成为了未来检测模型的标准构建块,提高了整体的准确性。它也促进了洽谈改进的网络,如PANet、NAS-FPN、EfficientNet等网络的发展。
2.3.6 R-FCN
Dai等人提出基于区域的全卷积神经网络(R-FCN),共享了网络中几乎所有的计算,不像之前的两阶段检测器那样每个proposals都使用了资源密集型技术。他们反对使用完全连接的层,而是使用了卷积层。然而,卷积网络的深层是平移不变的,这使得它们在定位任务中不起作用。作者建议使用位置敏感评分图来补救。这些敏感的评分maps编码了相关的空间信息,并稍后汇集,以确定准确的定位。R-FCN通过将ROI分为k*k个网格,并计算每个cell的得分,然后这些得分求均值,用于预测目标类别。R-FCN检测器是四个卷积网络的组合:输入图像首先经过ResNet-101来获取feature maps;中间输出(Conv4)送入RPN以确定ROI proposals,最后的输出进一步送入一个卷积层进行处理,并送入分类器和回归器。分类层通过结合生成的位置敏感map和RoI proposals来生成预测,而回归网络输出边框的细节。R-FCN采用与Faster-RCNN类似的4步训练方式,同时使用组合交叉熵和边框回归损失。同时,在训练过程中也使用了在线难例挖掘(OHEM)。
Dai等人提出了一种新的方法来解决卷积神经网络中的平移不变性问题。R-FCN将Faster R-CNN和FCN结合起来,实现快速、更准确的检测器。尽管它的准确率没有提高多少,但它比同类产品的速度快2.5-20倍。
2.3.7 MaskR-CNN
Mask R-CNN是一个实例分割(Instance segmentation)算法,可以用来做“目标检测”、“目标实例分割”、“目标关键点检测”
Mask R-CNN在Faster R-CNN基础上进行了扩展,通过增加一个分支来并行进行像素级目标实例分割。该分支是一个应用于RoI上的全连接网络,对每个像素进行分割,整体代价很小。它使用类似于Faster R-CNN的架构进行目标proposals提取,不过增加了一个与分类、回归head并行的mask head。一个主要的区别是使用了RoIAlign层,而不是RoIPool层,以避免由于空间量化造成的像素级错位。为了更好的准确性和速度,作者选择了带有特征金字塔网络(FPN)的ResNeXt-101作为其主干。原先Faster R-CNN中的损失函数更新为了mask loss,就像FPN中那样,它使用了5个anchor、3种长宽比。Mask R-CNN的整体训练与faster R-CNN相似。
Mask R-CNN的性能比现有的SOTA一阶段模型架构更好,增加了一个额外的实例分割功能,但增加的开销很小。该算法训练简单、灵活,在关键点检测、人体姿态估计等应用中具有很好的通用性。然而,它仍然低于实时性能(>30 fps)。
2.3.8 DetectoRS
许多当代的两阶段探测器采用的是多看多想的机制,**即先计算对象proposals,然后提取特征来检测对象。**DetectoRS在网络的宏观和微观层面都使用了该机制。在宏观层面,其提出了递归特征金字塔(RFP),这是由多个特征金字塔(FPN)堆叠而成、且带有从FPN的自顶向下层级到自底向上层之间的额外反馈连接。FPN的输出经过空洞空间金字塔池化层(ASPP)处理,然后送入下一个FPN层。然后,通过一个融合模块创建一个注意力map,将不同模块的FPN的输出联合起来。在微观层面,Qiao等人提出了可切换的Atrous卷积(SAC),以调节卷积的扩张率。利用具有5x5滤波器和1x1卷积的平均池化层作为交换函数来决定atrous卷积[55]的速率,帮助backbone动态检测各种尺度的目标。他们还把SAC放在两个全局上下文模块之间,因为这有助于实现更稳定的切换。递归特征金字塔和可切换Atrous两种技术的结合卷积产生检测器。作者将上述带有混合任务级联(HTC)的技术作为baseline,并和ResNext-101骨干结合起来。
DetectoRS结合了多个系统,以提高探测器的性能,并设置了最先进的两级探测器。其RFP和SAC模块具有很好的通用性,可用于其它检测模型。但是,由于它只能处理数据,不适合实时检测(每秒4帧)。
2.4 目标检测器-一阶段的检测方法:
2.4.1 YOLO v1
YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。
因为只需要看一次,YOLO被称为Region-free方法,相比于Region-based方法,YOLO不需要提前找到可能存在目标的Region。
因为YOLO这样的Region-free方法只需要一次扫描,也被称为单阶段(1-stage)模型。Region-based方法方法也被称为两阶段(2-stage)方法。
两阶段检测器将检测视为一个分类问题:需要一个模块枚举一些由网络分类为前景或背景的候选框。
YOLO v1 的核心思想是:采用利用整张图作为网络的输入,直接在输出层回归 bounding box 的位置和 bounding box 所属的类别。
YOLO将检测问题进行了重构,视其为一个回归问题,直接预测图像像素作为目标及其边界框属性。在YOLO中,输入图像被划分为S*S的网格(grid cell),目标中心点所在的cell负责该目标的检测。一个网格cell预测多个边框,每个预测数组包括五个元素:边框的中心点(x, y)、边框的宽高w/h、置信度得分。
论文中,是将图像分为 7x7 的网格,即上文中的 S=7。如上图所示,红色的点,就是负责检测狗的。
YOLO v1目标检测一共三个步骤:
- resize图片尺寸
- 输入网络,出结果
- NMS
网络结构:
NMS:
经过网络处理后,将(S×S)×B×20 的结果送入 NMS ,最后即可得到最终的输出框结果。
NMS,即非极大值抑制,就是将一些冗余框去掉,示意图如下:
NMS 别看简单,面试常考题,比如动手实现一个 NMS 代码之类的。
这个概念千万不要懵懵懂懂,细节决定成败。省着被嘲讽:NMS都不会,做什么Detection!
NMS就是通过计算IOU来去除冗余的区域框。
YOLO的灵感来自于用于图像分类的GoogLeNet模型,该模型使用了更小的卷积网络的级联模块。其在ImageNet数据上进行预训练,直到模型达到较高的精度,然后通过添加随机初始化卷积和全连通层对模型进行修正。训练时,每个网络的cell只预测一个类,印着这样可以更好的收敛,不过在推理时,可以预测多个类。**采用了多任务损失,即所有预测部件的组合损失,对模型进行优化。**非最大抑制(NMS)删除特定类的多重检测。
YOLO在精度和速度上都远远超过了它的当代单级实时模型。然而,它也有明显的缺点。对小的或聚类对象的定位精度和每个单元的对象数量限制是其主要缺点。这些问题在YOLO的后续版本中得到了修复。
2.4.2 SSD
Single Shot MultiBox Detector (SSD)是第一个与同时代的两级探测器如Faster R-CNN的准确性相匹配同时还能保持实时速度的一阶段检测器。SSD是在VGG-16上构建的,带有额外的辅助结构以提高性能。这些辅助卷积层添加到模型的末端,在尺寸上逐渐减小。当图像特征不太粗糙时,SSD会在前面的层中检测到较小的物体,而更深的层负责默认尺寸的框和宽高比。
在训练期间,SSD对每个GT box和具有最好jaccard 重叠度的box相匹配,然后类似Multibox训练相应的网络。同时,也使用了困难负样本挖掘以及大量的数据增强。类似与DPM,SSD也利用了利用定位和置信度损失的加权和来训练模型。最终输出通过非最大抑制获得。
尽管SSD比YOLO和faster R-CNN等最先进的网络更快更准确,但它在探测小物体方面有困难。这个问题后来通过使用更好的主干架构(如ResNet)和其他小补丁解决了。
2.4.3 YOLOv2 /YOLO9000
YOLOv2是对YOLO的改进,在速度和准确性之间提供了一个简单的权衡;而YOLO9000模型可以实时预测9000个对象类。这两者将YOLO中的backbone从GoogleNet替换为DarkNet-19。它结合了许多令人印象深刻的技术,如BN提高收敛性,联合训练分类和检测系统用于提高检测类别数,移除全连接以提高检测速度,使用聚类得到的anchor来改善recall并提供先验知识。Redmon等人也利用WordNet将分级结构的分类和检测数据集结合起来。即使当下词没有被正确分类,这个WordTree也可以用来预测一个更高的条件概率的上下词,从而提高了整体的性能。
YOLOv2在选择模型的速度和精度方面提供了更好的灵活性,新的架构具有更少的参数。正如文章的标题所暗示的那样“better, faster and stronger”。
2.4.4 RetinaNet
鉴于单级和两级探测器的精度差异,Lin等人认为单级探测器滞后的原因是“极端的前景-背景类不平衡”。他们提出了一个改造的交叉熵损失,称为Focal Loss作为解决不平衡的手段,通过其中的参数来降低简单样本对loss的贡献度。作者通过一个简单的单级探测器(RetinaNet)证明了它的有效性,通过对输入图像的位置、比例和纵横比进行密集采样来预测目标。该算法使用由特征金字塔网络(FPN)扩充的ResNet作为骨干网络,两个相似的子网络分别进行分类和回归。FPN的每一层都被传递到子网中,使其能够检测出不同规模的目标。分类子网预测每个位置的对象得分,而边框回归子网将每个锚点的偏移量回归到GT。两个子网都是小的FCN,并在各个网络之间共享参数。与之前大多网络不同,作者使用了一个与类别无关的边界框回归变器,发现它们等效。
RetinaNet训练简单,收敛快速,且容易实现。它在精度和运行时间方面都优于两级探测器。RetinaNet还通过引入新的损失函数来推进目标探测器优化的方法。
2.4.5 YOLOv3
与以前的YOLO版本相比,YOLOv3进行了“增量改进”。Redmon 等人用一个更大的Darknet-53网络代替了原来的特征提取器。他们还整合了各种技术,如数据增强、多尺度训练、批标准化等;分类器层的Softmax被逻辑分类器取代。
尽管YOLOv3比YOLOv2快,但它与之前的版本相比没有任何突破性的变化,它的精度甚至还不如一年前的SOTA检测器。
2.4.6 CenterNet
Zhou等人采用了一种非常不同的方法:将对象建模为点,而不是传统的边界框表示。CenterNet将对象预测为包围框中心的单个点。输入图像通过FCN生成heatmap,heatmap的峰值对应被检测物体的中心。它使用ImageNet预训练的Hourglass-101作为特征提取网络,有3个head:点目标中心点的heatmap头、目标尺寸wh头、目标中心点偏移头。在训练时,三个头的多任务损失被反向传播到特征提取器中。在推理过程中,利用偏移头的输出来确定对象点,最终生成一个方框。由于预测是点,而不是结果,这里不需要使用非最大抑制(NMS)进行后处理。
CenterNet乜有利用这些年来目标检测的常用套路,而是提出了一个新颖的视角。它比之前的方法更准确,推理时间更短。它具有较高的精度,可用于三维目标检测、关键点估计、姿态、实例分割、方向检测等多种任务。不过在做不同任务时,需要不同的骨干架构,因为一般架构与其他探测器工作良好,性能较差,反之亦然。
2.4.7 EfficientDet
EfficientDet构建了具有更高精度和效率的可扩展检测器的思想,引入了有效的多尺度特征、BiFPN和模型缩放。BiFPN是一种具有可学习权值的双向特征金字塔网络,用于不同尺度下输入特征的交叉连接,它在NAS-FPN的基础上,通过删除一个输入节点,增加一个额外的横向连接,改进了需要大量训练和复杂网络的NAS-FPN,这消除了低效节点,增强了高级特征融合。与现有的探测器不同的是,它可以根据更大、更深的骨干网络或堆叠FPN层进行放大,EfficientDet引入了一个复合系数,可用于“联合放大骨干网络、BiFPN网络、类/盒网络和分辨率的所有维度”。EfficientDet利用EfficientNet作为backbone,该backbone是一种具有多个BiFPN的堆叠的特征提取网络,最终BiFPN层的每个输出被发送到类和边框预测网络。该模型使用SGD优化器和同步BN进行训练,并使用swish激活,而不是标准的ReLU激活,后者可区分,效率更高,性能更好。
EfficientDet比以前的检测器具有更好的效率和准确性,同时体积更小,计算成本更低。它易于扩展,可以很好地应用于其他任务,并且是当前单阶段对象检测的SOTA模型。
2.4.8 YOLOv4
YOLOv4结合了许多有效的idea,设计了一种可以在现有系统中工作快速且容易训练的目标检测器。它利用“bag of freebies”方法,只增加训练时间,而不影响推理时间。YOLOv4利用数据增强技术,正则化方法,类标签平滑,CIoU-loss , Cross mini-Batch Normalization (CmBN),自我对抗训练,余弦退火学习率调度等技巧来提高训练。网络中还加入了只影响推理时间的方法,称为“Bag of Specials”,包括Mish激活[、Cross-stage partial connections (CSP)、SPP-Block、PAN路径聚合块、多输入加权残差连接(MiWRC)等,还使用了遗传算法进行超参搜索。其使用在ImageNet上预训练的CSPNetDarkNet-53作为backbone,以SPP和PAN块作为neck,以YOLOv3的head为head。
目前大多数检测算法都需要多个gpu来训练模型,但YOLOv4可以在单个gpu上轻松训练。它的速度是EfficientDet的两倍,却具有类似的性能,达到了SOTA。
2.4.9 YOLO V5
目前YOLO V5公布了源代码,但尚未发表论文;与YOLO V4有点相似,都大量整合了计算机视觉领域的State-of-the-art,从而显著改善了YOLO对目标的检测性能。相比于YOLO V4,YOLO V5在性能上稍微逊色,但其灵活性与速度上远强于YOLO V4,而且在模型的快速部署上也具有极强优势。
2.4.9 Swin Transformer
Transformer从一开始就在自然语言处理(NLP)领域产生了深远的影响。它在语言模型中的应用,如BERT(Bidirectional Encoder Representation from Transformers),GPT(Generative Pre-trained Transformer),T5(Text-To-Text Transfer Transformer)等,推动了这一领域的技术进步。transformer[75]使用注意模型来建立序列元素之间的依赖关系,并且可以比其他顺序架构关注更长的上下文。在自然语言处理中的成功引起了人们对其在计算机视觉中的应用的兴趣。而cnn一直是CV的支柱,不过其有一些固有的缺点,如缺乏全局上下文的重要性,固定的训练后权重等。
Swin Transformer旨在为计算机视觉任务提供基于Transformer的backbone,它将输入图像分割成多个不重叠的patch,并将其转换为token。然后将大量Swin Transformer块应用于4个阶段的patch,每个后续阶段减少patch的数量,以保持分层表示。Swin Transformer块由局部多头自注意(MSA)模块组成,在连续块中基于交替移位的patch窗口。在局部自注意中,计算复杂度与图像大小成线性关系,而移动窗口可以实现跨窗口连接。作者还显示了移动的Windows如何在开销很小的情况下提高检测精度。
Transformers提供了一个不同于CNN的范式,不过其在CV领域的应用仍处于初级阶段,它在这些任务中取代卷积的潜力是非常大的。 Swin Transformer在MS-COCO上达到了新的SOTA,不过其参数量相比CNN模型更高。
3 目标检测的最新进展:
3.1 DETR: 单阶段:
DETR或 Detection Transformer 是一种用于对象检测的深度学习模型,它使用基于** transformer 的架构**。该模型使用集合预测方法同时预测每个对象的类别和位置。DETR 以其高精度和简单性而著称,因为它不需要锚框或非最大抑制。
DETR的思路和传统的目标检测的本质思路有相似之处,但表现方式很不一样。传统的方法比如Anchor-based方法本质上是对预定义的密集anchors进行类别的分类和边框系数的回归。DETR则是将目标检测视为一个集合预测问题(集合和anchors的作用类似)。由于Transformer本质上是一个序列转换的作用,因此,可以将DETR视为一个从图像序列到一个集合序列的转换过程。该集合实际上就是一个可学习的位置编码。
DETR将目标检测任务转换为集合预测问题,消除了重复的边界框预测。Transformers通过使用自注意力模块基于整个图像上下文捕获目标之间的成对关系,从而避免重复预测。与使用NMS等后处理步骤来消除重复预测的传统目标检测器相比,有减少计算成本的优势。
DETR由编码器-解码器转换器和进行**最终预测的前馈网络(FFN)组成(**上图)。编码器由一个多头自注意力(MHSA)模块(Vaswanietal.,2017)和一个FFN组成。这些块是排列不变的,因此,固定位置编码被添加到每个注意力层的输入中。解码器使用编码器特征并使用多个MHSA模块将目标查询转换为输出嵌入。N个输出嵌入被两个不同的FFN层使用,一个用于预测类标签,另一个用于预测框坐标。DETR使用唯一的二分匹配为每个给定的ground-truth找到最佳预测框。使用匈牙利优化算法有效地计算每N个查询到每N个ground-truth的一对一映射。在获得该集合的所有匹配对后,使用标准交叉熵损失进行分类,并使用L1和GIoU损失的线性组合进行回归。在每个解码器层之后添加辅助损失,以帮助模型在每个类中输出正确数量的目标。
优点:
- 物体检测的高精度和简单性
- 可以处理高度重叠的对象
- 不需要锚框或非最大抑制
缺点:
- 计算量可能很大
- 需要大量数据以获得最佳性能
4 目标检测中的关键挑战:
在过去的十年里,计算机视觉已经取得了很大的进步,但是它仍然有一些重大的挑战需要克服。在实际应用中面临的一些关键挑战有:
类内变化:自然场景中,统一对象的不同实例之间出现类内变化是非常常见的。这些变化的原因是多种多样的,如:遮挡、光照、姿态、视角等。这些不受约束的外在因素会对目标的外观产生剧烈变化。可以预见的是,目标可能会有非刚性形变或旋转、缩放、模糊等变化,且一些目标可能在环境中不显著,导致其提取变得困难。
类别数量:可用的目标种类绝对数量(过少)是一个需要解决的挑战。其需要高质量的标注数据,而这通常难以获取。使用更少的样本训练检测器是一个待研究的问题。
效率:如今的模型需要大量的计算资源来生成准确的检测结果,但在移动或边缘设备上,更为关键的是计算效率。
5 未来趋势
在过去的十年中,目标检测取得了巨大的进展。该算法在一些垂直领域已经达到了人类水平的精度,但仍有许多令人兴奋的挑战需要解决。在本节中,我们将讨论目标检测领域中的一些开放性问题。
AutoML:采用神经结构自动搜索(NAS)确定目标探测器的特性已经成为一个比较热的研究领域。前面章节已经展示了一些通过NAS设计的检测器,不过其仍处于初级阶段,算法的搜索是一个复杂且资源密集型的过程。
Lightweight detectors: 虽然轻量网络能够达到与成熟分类网络相当的性能,展示了 其巨大潜力,不过在检测精度上,仍然低于50%。随着越来越多的设备上机器学习的应用上市,对小型、高效和同样精确也高的模型的需求将会增加。
Weakly supervised/few shot detection: 大多SOTA目标检测模型都是在数以百万计的标注数据上训练的,这些数据费时费力难以扩展。在弱监督数据(也即:图像级的标注)上进行训练,将大大降低成本。
Domain transfer: 域转移是指在一个独立但相关的目标任务上使用一个在特定源任务的标注图像上训练的模型。它鼓励重用训练过的模型,减少对大型数据集可用性的依赖,以实现高精度。
3D object detection: 3D目标检测是自动驾驶中尤为关键的问题。即使模型已经达到了很高的准确性,但任何低于人类水平性能的应用都将带来安全问题。
Object detection in video: 目标检测器是为独立图像的推理而设计的,这缺乏了多帧图像间的相关性。使用多帧图像间的时空关系进行目标识别是一个开放性问题。
参考:
【干货 | 目标检测入门,看这篇就够了(已更完) - 格灵深瞳DeepGlint的文章 - 知乎】
https://zhuanlan.zhihu.com/p/34142321
【2021深度学习目标检测综述】
原文链接:https://blog.csdn.net/oYeZhou/article/details/116934793
保姆级教程:图解目标检测算法YOLOv1 - Jack-Cui的文章 - 知乎
https://zhuanlan.zhihu.com/p/376863047