关注公众号,发现CV技术之美
目录
P1:目标检测的需求与应用
P2:目标检测的相关定义
2.1 目标检测的定义
2.2 目标检测的核心问题
2.3 理想检测器的条件
2.4 从两个要求看关键挑战
从精度角度看挑战
从效率角度看挑战
一个挑战解决方法的例子
2.5 目标检测损失函数的发展
概述
IOU的发展变化
2.6 评价指标概述
常见指标概述
AP与mAP
2.7 数据集与标注软件
常见数据集
两大主流数据集
两大标注软件
三种常用标签格式
P3:方法回顾
3.1 目标检测算法发展的概览
发展历史轴(时间轴线图)
算法方法概览(思维导图)
3.2 传统的目标检测
基于特征的传统算法
基于分割的传统算法
传统算法的一般流程
经典的传统算法
传统算法总结
3.2 后处理算法NMS的发展
NMS概览
传统NMS
soft-NMS
Weighted-NMS
分类置信度优先NMS总结
IOU-Guided NMS(IOU-Net)
softer NMS
Adaptive NMS
DIOU-NMS
NMS总结
3.3 Anchor-based的目标检测
3.3.1 Two-stage方法
3.3.2 One-stage方法
3.3.3 Anchor-based总结
3.4 Anchor-free的目标检测
3.4.1 背景与定义
3.4.2 Anchor-free概述
3.4.3 早期探索型
3.4.4 基于关键点系列(源于姿态估计)
3.4.4 基于密集型系列(源于语义分割)
3.4.5 总结与思考
3.5 Transformer-based的目标检测
3.5.1 引言
3.5.2 概述
3.5.3 发展轴预览
3.5.4 CNN-backbone系列
3.5.5 Transformer-backone系列
3.6 总结与思考
P4:总结与思考
4.1 总结
4.2 思考
4.3 作业
注:本文仅供学习,未经同意勿转。
前言:本文梳理了目标检测的相关背景,定义,挑战,损失函数及模型方法的发展,为希望学习相关知识的新手提供了相对比较全面易懂的简要介绍,同时结合本笔者自身研究方向的知识展开了相关的思考。
P1:目标检测的需求与应用
第一部分我们主要回答两个问题:目标检测在实际中有哪些应用以及为什么我们需要研究它的原因。
问题1:在我们日常生活中有哪些可以想到的目标检测应用呢?
比如,打卡时需要人脸检测,购物时可以进行商品检测与文本提取,检血时可能需要细胞检测与病理检测,垃圾分类时可使用垃圾检测避免误分类现象等。
这些都说明:目标检测不管是在我们的日常生活领域,交通领域,工商业领域还是医学领域中都有着广大的应用需求与前景。再回到我们日常的校园生活中,学校的智能食堂及智能MY PASS门禁系统也都需要目标检测技术的支持。
问题2:为什么我们需要目标检测?
由此可见,目标检测存在于我们生活中的方方面面,为我们的生活生产提供了极大的便利与高效的技术支持。虽然目前目标检测技术已经有着众多的落地应用,算法也相对成熟并取得十分不错的效果,但它还有许多挑战值得我们去研究(这个我们后面会讲到)。正所谓:没有最好,只有更好。
P2:目标检测的相关定义
第二部分,我们主要会介绍目标检测的相关定义,挑战,经典的数据集以及相关的评价指标。在介绍数据集之前,我们会先结合目标检测的定义及挑战,以损失函数的角度概览目标检测的相关改进发展。从而使大家更好地理解后面所介绍的目标检测模型方法。
2.1 目标检测的定义
首先,目标检测在CV领域中所处的地位是怎么样的?与其它任务的区别是?
目标检测与分类、分割并称为CV的三大主要任务,他们之间的区别主要如下图所示。
与分类的区别:相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因此检测模型的输出是一个列表,列表的每一项使用一个数组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。
与分割的区别:分割分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
从任务的角度来看,目标检测可以看成是分类与分割任务的一座过度桥。这也是目标检测研究的重要性所在原因之一。
那到底什么是目标检测呢?或者说目标检测的任务是什么呢? 🤔
目标检测实际上就是找出图像中所有感兴趣的目标(object),并获得这一目标的类别信息和位置信息。因此,目标检测任务可以解耦成分类任务和定位任务。
2.2 目标检测的核心问题
从目标的定位角度出发,目标检测需要解决的核心问题主要有3个:
大小的多样性同一张图像上可能同时出现多个不同或相同的目标,他们之间的大小差异大
位置的任意性目标可以出现在图像的任意位置
形态的差异性同一物体目标的形态差异可能很大,目标可能有各种不同的形状
2.3 理想检测器的条件
那么对于一个理想的目标检测器,我们当然希望它能够在解决上述核心问题的前提下,具有高的准确度及效率。
因此,为了实现我们所想要的检测器,我们需要解决什么问题?或者说我们将会面临怎么样的挑战呢?
2.4 从两个要求看关键挑战
从精度角度看挑战
从高准确度的角度来看,在现实场景中常见的挑战主要有:
类内的差异性种类内自身材料、纹理、姿态等带来的多样性干扰,如黄色框图中椅子的制作材料及形态差异很大,但是它们都属于椅子的大类别
外部环境的干扰外部环境带来的噪声干扰,比如蓝色框中光照、迷雾、遮挡等带来的识别及回归挑战。
类间的相似性类间因纹理、姿态所带来的相似性干扰,比如黄色框图中是不同品种的动物,但是它们之间的差异又很小;这里实际上可以衍生为细粒度识别领域
集群小目标问题集群目标检测所面临的数量多,类别多样化的问题,比如行人检测,遥感检测等。
从效率角度看挑战
目标检测是一个非常接地气的实际应用技术,它通常需要应用在实时处理的场景之中,比如自动驾驶系统。而且它还有可能需要同时处理成千上万的数据。因此,除了考虑高准确度还需要考虑处理时间,占用内存,消耗流量等方面的效率问题。
那么面对上面的挑战,我们一般有什么方法去解决它呢?下面给出一个示例短暂快速的了解一番。 😀
一个挑战解决方法的例子
在现实中常见的场景有小目标检测场景。我们认为小目标检测场景就很好的包含了上述所提及的所有可能的问题与挑战。对于低像素问题,多数研究采用图像重构方法来解决,对于易遮挡问题,大多研究通过上下文语义信息来辅助检测,对于小尺寸问题则通过尺度自适应变换来解决,对于大批量数据问题可通过降低参数来实现。
从任务上来看,目标检测的挑战是分类挑战与定位挑战的结合。对于两个挑战,我们应该如何去优化?
2.5 目标检测损失函数的发展
概述
对于两个挑战的优化,目标检测损失函数的发展可以由上图来概括。不管是分类任务还是定位任务都可能面临样本分布不均匀,数据分布不一致等问题,因此,后面所提出的优化损失函数也包含对这些问题的改善。比如,Focal loss和DR loss,AP loss,Balanced L1 loss都解决了不平衡的问题。其中:
一般来说,样本量多的类型,模型更容易学习到其相对应的特征,反之,相反。所以Focal loss是通过改变模型对难易样本学习的权重来提高模型对不均衡样本的学习。
而DR loss和AP loss则主要是将分类问题转化为排序问题,从而避免正负样本不均衡的问题。
Balanced L1 loss解决的是定位上的平衡问题,主要是在找一个平衡的点,能让easy和hard的sample所占的梯度贡献差不多。
KL loss主要就是拉近两个分布之间的距离。
由于篇幅及时间的限制,我们主要的关注点是在IOU loss上(与后面讲的评价指标息息相关),因此这里我只对上面的损失函数发展做一个简单概述。
IOU的发展变化
目标检测在定位上的准确度会对模型分类的结果有所影响。因此,好的定位有利于模型精度的提高。在IOU Loss提出来之前,检测上有关候选框的回归主要是通过坐标的回归损失来优化。但很明显L1和L2 Loss存在比较大的问题:
L1 Loss的问题:损失函数对x的导数为常数,在训练后期,x很小时,如果learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。
L2 Loss的问题:损失函数对x的导数在x值很大时,其导数也非常大,在训练初期不稳定。
而且,基于L1/L2 Loss的坐标回归不具有尺度不变性,且并没有将四个坐标之间的相关性考虑进去。因此,像L1/L2 Loss直接的坐标回归实际上很难描述两框之间的相对位置关系。
IOU
因此,在ACM2016的论文中提出了IOU loss,它将四个坐标点看成一个整体进行计算,具有尺度不变性(也就是对尺度不敏感)。IOU Loss的定义是先求出预测框和真实框之间的交集和并集之比,再求负对数,但是在实际使用中我们常常将IOU Loss写成1-IOU。如果两个框重合则交并比等于1,Loss为0说明重合度非常高。因此,IOU的取值范围为[0,1]。
虽然IOU Loss虽然解决了Smooth L1系列变量相互独立和不具有尺度不变性的两大问题,但是它也存在两个问题:
当预测框和目标框不相交时,即IOU(A,B)=0时,不能反映A,B距离的远近,此时损失函数不可导,IOU Loss 无法优化两个框不相交的情况。
如上图三个框,假设预测框和目标框的大小都确定,只要两个框的相交值是确定的,即其IoU值相同时,IOU值不能反映两个框是如何相交的。
因此,IOU Loss虽然比较简单直观,但它不是最好的选择!
GIOU
针对IOU无法反映两个框是如何相交的问题,GIOU通过引入预测框和真实框的最小外接矩形(类似于图像处理中的闭包区域)来获取预测框、真实框在闭包区域中的比重。这样子,GIOU不仅可以关注重叠区域,还可以关注其他非重合区域,能比较好的反映两个框在闭包区域中的相交情况。
从公式上来看,GIOU是一种IOU的下界,取值范围[-1,1]。在两者重合的时候取最大值1,在两者无交集且无限远的时候取最小值-1。因此,与IOU相比,GIoU是一个比较好的距离度量指标。
DIOU
虽然GIOU通过引入闭包区域缓解了预测框与真实框相交位置的衡量问题,但其实际上仍存在两个问题:
对每个预测框与真实框均要去计算最小外接矩形,计算及收敛速度受到限制。【能不能直接最小化距离?,以达到更快的速度?】
当预测框在真实框内部时,GIOU退化为IOU,也无法区分相对位置关系。【能不能在两者有重叠时甚至包含时回归更加准确】
因此,考虑到GIOU的缺点,DIOU在IOU的基础上直接回归两个框中心点的欧式距离==,加速了收敛速度。DIOU的惩罚项是基于中心点的距离和对角线距离的比值。这样就避免了GIOU在两框距离较远时产生较大闭包时所造成的Loss值较大而难以优化的情况。
CIOU
虽然DIOU Loss通过中心点回归缓解了两框距离较远时难优化的问题,但DIoU Loss仍存在两框中心点重合,但宽高比不同时,DIOU Loss退化为IOU Loss的问题。因此,为了得到更加精准的预测框,CIOU在DIOU的基础上增加了一个影响因子,即增加了预测框与真实框之间长宽比的一致性的考量(v值)。
CIOU Loss虽然考虑了边界框回归的重叠面积、中心点距离及长宽比。但是其公式中的v反映的时长宽比的差异,而不是宽高分别与其置信度的真实差异,所以有时会阻碍模型有效的优化。
EIOU
因此,EIOU在CIOU的基础上将长宽比拆开,分别计算长、宽的差异,同时引入Fcoal loss解决了难易样本不平衡的问题。
IOU loss的总结
2.6 评价指标概述
常见指标概述
前面说IOU与目标检测评价息息相关,主要是因为目标检测在进行性能比较时一般会说明对应的IOU阈值。那目前大家一般采用的评价指标有哪些呢?从目标检测的两个要求来看(精度和效率):一般精度大家都会计算各种IOU阈值下的mAP值和F1分数等。mAP的计算依赖于TP,FP,TN,FN等的计算,也就是依赖Precision和Recall来计算的。因为大家或多或少都会接触过Pr和Re的计算,这里我就不详细说明了。但mAP我在下一页中会介绍。而效率大家一般都会比较FPS和参数量。当然,一般论文在这里都必须指明是在什么样的硬件条件下进行实验比较的。
主要评价指标:MAP(平均准确度均值,精度评价) 检测速度(FPS即每秒处理的图片数量或者处理每张图片所需的时间,当然必须在同一硬件条件下进行比较) 召回率(Recall)= (TP)/(TP+FN):每个类被正确分类的概率
其他性能指标:准确率 (Accuracy) 精确率(Precision) 混淆矩阵 (Confusion Matrix) precision-recall曲线 平均正确率(AP) ROC曲线(Receiver Operating Characteristic) AUC曲线(Area Under Curve)即为ROC曲线下的面积 交除并IOU(Intersection Over Union)预测框A和真实框B的重叠程度 非极大值抑制(NMS)
作为目标检测的主要指标,mAP指的是什么?
AP与mAP
AP是指PR曲线下(调整置信度阈值变化,得到不同置信度阈值下Re与Pr之间的关系)的面积,是判断改类别分类器表现性能好坏的标准。其表现了分类器在Pr与Re之间的权衡,当AP值较高~=PR曲线向右上方拟合,也就说明Recall在增长的同时Precision也稳定在一个较高的值附近。
mAP值是AP的均值,代表的是整个检测模型的表现性能。
2.7 数据集与标注软件
常见数据集
从应用的角度出发,模型的设计与数据息息相关的。有关目标检测公开的数据集也有很多,比如最初的MNIST、ImageNet等数据集。这些数据集的大小、数量及主要面临的挑战都大不相同。
两大主流数据集
虽然公开的数据集很多,但目前最为流行的经典数据集还是COCO和PASCAL VOC。一般做通用任务或backbone时,我们都至少需要比较这两个数据集中的一个。
两大标注软件
为便于COCO和PASCAL VOC数据集的采集制作,目标检测领域有两款开源的主流标注软件:labelme和labelImg。这两大软件都有对应的python包,所生成的数据格式为常见的三种数据集格式VOC格式,COCO格式和YOLO格式。
三种常用标签格式
这三种数据格式的区别主要在于标签文件类型和bbox格式。VOC采用的是图像文件与xml标签文件,而COCO采用的是json格式,YOLO采用的是txt文本格式。如果大家有接触过一点前端的知识或者有接触过目标检测,应该是知道这三种标签文件的优劣势所在。【个人看法:json格式可以很好的将各种数据集成到一个文件中去,具有占用空间小,检索迅速的优势。而txt文本格式则具有简单易处理的有点。xml格式介于两者之间吧】
这里为什么讲数据格式,是为了方便大家快速的了解目前经典开源框架大多会采用什么样的数据书写模式,以便于大家在探索目标检测领域时能够快速的利用目前现有的代码资源。但不管是什么样的数据格式,最主要的数据导入完全解决于自己习惯的代码书写。
P3:方法回顾
第三部分,我们将系统地回顾一下目标检测的方法,包括传统的目标检测方法和基于深度学习的方法。虽然传统的目标检测方法现在比较少用,但我们认为有必要了解其手工设计的特征,因为现在在工业和医学领域这些手工特征与深度学习方法的融合也带来了不错的效果。当然,我们的汇报仍然是以基于深度学习的方法为主。==这里由于时间限制,而且anchor-based的方法已经有很多博文都有介绍,我就不详细介绍(