OpenMMLab 实战营打卡 - 第 四 课 目标检测算法基础
Posted 苦瓜汤补钙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenMMLab 实战营打卡 - 第 四 课 目标检测算法基础相关的知识,希望对你有一定的参考价值。
(四)计算机视觉之目标检测算法基础
目录
4.非极大值抑制 Non-Maximum Suppression
5.边界框回归 Bounding Box Regression
4.特征金字塔网络 Feature Pyramid Network (2016)
2.YOLO: You Only Look Once (2015)
3.SSD: Single Shot MultiBox Detector (2016)
六、无锚框目标检测算法 Anchor-free Detectors
2.FCOS, Fully Convolutional One-Stage (2019)
前言
OpenMMLab AI实战营第四课!目标检测是计算机视觉中最重要,也是最热门的工作,它的主要任务是用方框标出图片中的“猫”。课程链接:4 目标检测算法基础_哔哩哔哩_bilibili
一、目标检测是什么?
给定一张图片,框出所有兴趣目标同时预测目标类别。
目标检测的应用:人脸识别,身份识别、属性分析等;智慧城市,垃圾检测(保持城市干净整洁)、非法占道检测、违章停车检测、自动服务等;自动驾驶,环境感知-->路径规划与控制;下游视觉任务,光学字符识别(定位+识别)、人体姿态识别等。
1.目标检测VS图像分类
检测,是在一般的场景,目标所在位置、数量、大小均不固定。
分类,是一个更受限的环境,通常情况下,只有一个物体、位于图像中央、占据主要面积。
目标检测与图像分类共同点就是,需要算法“理解”图像的内容-->深度神经网络实现。同样都需要模型对数据、图像中的内容进行一个理解。深度神经网络在图像分类上从AlexNet开始取得了非常和的成绩,目标检测遵循相同套路。
2.检测最朴素方法——滑窗 Sliding Window
首先设定一个固定大小的窗,然后拿这个窗去图像上去扫,有点像算卷积那样。然后我们扫到的位置,把窗内的这个块给抠下来,送到一个神经网络去预测里面的物体是什么(类别)。预测完一个位置后,再滑动10像素预测其他位置,重复操作。在网络训练好的前提下,遍历图像所有位置后,可以找到所有物体的位置并识别类别。
为了检测不同大小、不同形状的物体,可以使用不同大小、长宽比的窗口扫描图片。
(1)滑窗的效率问题
效率是滑窗Sliding Window的致命问题,考虑1000x600大小的图像,设定100x100的窗口,每滑动20像素分类一次。仅推理一张图片,需要对46x26将近1200个窗口进行分类。若使用不同大小的窗口,分类次数成倍增加。所以有着不可接受的计算成本,实用性太低。
改进思路1:使用启发式算法替换暴力遍历。例如R-CNN,Fast R-CNN中使用Selective Search 产生提议框依赖外部算法,系统实现复杂,不能训练,难以联合优化性能。
改进思路2:减少冗余计算,使用卷积网络实现密集预测目前普遍采用的方式。实际上,卷积本身也是一种滑窗,而且有一个参数共享的理念,所以更容易优化。
(2)改进
区域提议,基于图像颜色或底层特征,找出可能含有物体的区域,再送给神经网络识别。相比于普通滑窗,减少框的个数且保证召回率。
分析滑窗中的重复计算,假设用于分类的卷积网络只有2层:
我们去分析两个框的重合部分。在第一张图里预测的时候被卷积核扫过得到第一层特征,然后又扫了一遍得到第二层特征。而在第二张图里,只有位置改变,网络实际上相同,我们用相同网络的相同卷积扫了相同的部分图像,只不过在不同位置说生成了相同的特征,这部分实际上是冗余的。于是,我们考虑从这个卷积网络的的计算上设计某种算法把重复的去除。
改进思路:用卷积一次性计算所有特征,再取出对应位置的特征完成分类。
在特征图上进行密集预测,密集预测实际上是一种隐式的滑窗方法,计算效率远高于滑窗。这里的窗并非我们手动设置的,而是网络去定义的。
3.目标检测的基本范式
主干网络Backbone,输入图像产生一个多通道的特征图。基于特征图的特征去产生类别预测的,叫检测头Head。
4.目标检测技术的演练
深度学习出现以前,目标检测巅峰算法叫DPM(Deformable Part Model)。深度学习出来以后,2012 年卷积神经网络(Convolutional Neural Networks, CNN)的提出开始,不断有基于深度学习的目标检测算法被提出,分单阶段检测和两阶段检测算法。两阶段精度高但速度慢,单阶段速度快但精度稍逊。近几年随着Transformer算法的兴起,基于Transformer的一些优秀算法陆续出现。
二、基础知识
1.框,边界框(Bounding Box)
框泛指图像上的矩形框,边界横平竖直。描述一个框需要4个像素值:方式①左上右下边界坐标(l,t,r,b);方式②中心坐标和框的长宽(x,y, w, h)。
边界框通常指紧密包围感兴趣物体的框,检测任务要求为图中出现的每个物体预测一个边界框。
框相关的概念:
- 区域(Region):框的同义词。
- 区域提议(Region Proposal,Proposal) 指算法预测的可能包含物体的框,某种识别能力不强的算法的初步预测结果。
- 感兴趣区域(Region of Interest,RoI) 当我们谈论需要进一步检测这个框中是否有物体时,通常称框为感兴趣区域。
- 锚框(Anchor Box,Anchor) 图中预设的一系列基准框,类似滑窗,一些检测算法会基于锚框预测边界框。
2.交互比Intersection Over Union
交互比(Intersection Over Union,IoU),定义为两矩形框交集面积与并集面积之比,是矩形框重合程度的衡量指标,是模型产生的目标窗口与原来标记窗口的交叠率。
3.置信度Confidence Score
置信度(Confidence Score):模型认可自身预测结果的程度,通常需要为每个框预测一个置信度。大部分算法取分类模型预测物体属于特定类别的概率,部分算法让模型独立于分类单独预测一个置信度。我们倾向认可置信度高的预测结果。
4.非极大值抑制 Non-Maximum Suppression
滑窗类算法通常会在物体周围给出多个相近的检测框。这些框实际指向同一物体,只需要保留其中置信度最高的。通过非极大值抑制(NMS)算法实现:
5.边界框回归 Bounding Box Regression
问题:滑窗(或其他方式产生的基准框)与物体精准边界通常有偏差。
处理方法:让模型在预测物体类别同时预测边界框相对于滑窗的偏移量
6.边界框编码 Bbox Coding
边界框的绝对偏移量在数值上通常较大,不利于神经网络训练,通常需要对偏移量进行编码,作为回归 模型的预测目标。
三、两阶段目标检测Two-stage Detectors
1.两阶段算法概述
两阶段的检测范式最早由 R-CNN 确立,因包含区域提议和区域识别两个阶段得名。经历一些列发展到 Faster R-CNN 和 Mask R-CNN 逐渐成熟。结合比较先进的主干网络和多尺度技术可以达到 比较优越的检测精度,使用广泛。近几年(2020~)随着单阶段算法精度和速度的 提高逐渐被取代。
2.Region-based CNN (2013)
Stage 1 产生提议框
使用传统视觉算法,推测可能包含物体的框(约2000个) ✔️不漏:真正包含物体的框通常会被选中 ❌不准:大部分大部分提议框并不包含物体
Stage 2 识别提议框
将提议框内的图像缩放至固定大小(原始论文 227×227) ,送入卷积网络进一步识别,得到准确结果。
(1)R-CNN 的训练
(2)R-CNN 相比于传统方法的提升
不同检测算法在 Pascal VOC 2007 数据集上的 mAP 评分(分数越高性能越好)。
(3)R-CNN 的问题
慢 :区域提议一般产生 2000 个框,每个框都需要送入 CNN 前传,推理一张图要几秒至几十秒。
3.Fast R-CNN (2014)
改进 R-CNN:减少重复计算✔️
Stage 1 产生提议框 仍然依赖传统CV方法
Stage 2 识别提议框
- 卷积层应用于全图,一次性计算所有位置的图像特征
- 剪裁提议框对应的特征图送入全连接层计算分类
问题:提议框大小不同,需要处理成固定尺寸才能送入全连接层。
(1)RoI Pooling
目标:将不同尺寸的提议框处理成相同尺寸,使之可以送入后续的全连接层计算分类和回归。算法:
- 将提议框切分成固定数目的格子(上图中 2×2,实际常用 7×7,对齐ResNet等经典结构)。
- 如果格子边界不在整数坐标,则膨胀至整数坐标。
- 在每个格子内部池化,得到固定尺寸的输出特征图。
(2)RoI Align
RoI Align 比 RoI Pooling 在位置上更精细。
(3)Fast R-CNN 的训练
多任务学习、端到端训练
(4)Fast R-CNN 的速度提升
相比 R-CNN 速度大幅提升。
(5)Fast R-CNN 的精度提升
(6)Fast R-CNN 的速度瓶颈
(8)降低区域提议的计算成本
区域提议→在图中找到包含物体的框→不需要区分类别的检测问题
特定位置的特征包含其感受野内图像的信息,且已达到足够的抽象层级。基于特征做二分类就可以预测感受野内是否包含物体,从而实现区域提议。
朴素方法的局限:图中有不同大小的物体,区域提议算法需要产;物体可能有一定程度重合,区域提议算法要有生不同尺寸的提议框,以适应不同尺寸的物体能力在同一位置产生不同尺寸的提议框,以适应重合的情况。
(9)锚框Anchor
从2012以后,不断有基于深度学习的目标检测算法被提出,其主要有两条技术发展路线:Anchor-based和Anchor-free方法。锚框Anchor是在图像上设定好的不同大小、长宽比例的参照框。在原图上设置不同尺寸的基准框,称为锚框Anchor,基于特征独立预测每个锚框中是否包含物体。可以生成不同尺寸的提议框,可以在同一位置生成多个提议框覆盖不同物体。
4.Faster R-CNN (2015)
Faster R-CNN = RPN + Fast R-CNN 二者共享主干网络和特征。
Faster R-CNN 的训练
联合学习 RPN 与 Fast R-CNN。为锚框和预测框产生分类和回归真值的方法与 R-CNN 相同,即基于 IoU 为锚框和预测框匹配真值框。
5.两阶段方法的发展与演进 (2013~2017)
四、多尺度检测技术
1.多尺度检测必要性
图像中物体大小可能有很大差异 (10 px ~ 500 px) 。多尺度技术出现之前,模型多基于单级特征图进行预测,通常为主干网络的倒数第二层,受限于结构 (感受野)和锚框的尺寸范围,只擅长中等大小的物体。另一方面,高层特征图经过多次采样,位置信息逐层丢失,小物体检测能力较弱,定位精度较低。
2.图像金字塔 Image Pyramid
将图像缩放到不同大小,形成图像金字塔。检测算法在不同大小图像上即可检测出不同大小物体。优势:算法不经改动可以适应不同尺度的物体。劣势:计算成本成倍增加。可用于模型集成等不在意计算成本的情况。
3.层次化特征
基于主干网络自身产生的多级特征图产生预测结果。由于不同层的感受大小不同,因此不同层级的特征天然适用于检测不同尺寸的物体。优势:计算成本低。劣势:低层特征抽象级别不够,预测物体比较困难。改进思路:高层次特征包含足够抽象语义信息。将高层特征融入低层特征,补充低层特征的语义信息。
4.特征金字塔网络 Feature Pyramid Network (2016)
改进思路:高层次特征包含足够抽象语义信息。将高层特征融入低层特征,补充低层特征的语义信息。融合方法:特征求和。
5.在 Faster R-CNN 模型中使用 FPN
五、单阶段目标检测One-stage Detectors
1.单阶段算法概述
单阶段算法直接通过密集预测产生检测框,相比于两阶段算法,模型结构简单、速度快,易于在设备上部署。
早期由于主干网络、多尺度技术等相关技术不成熟,单阶段算法在性能上不如两阶段算法,但因为速度和简洁的优势仍受到工业界青睐。
随着单阶段算法性能逐渐提升,成为目标检测的主流方法
2.YOLO: You Only Look Once (2015)
最早的单阶段算法之一
主干网络:自行设计的 DarkNet 结构,产生 7×7×1024 维的特征图。检测头:2 层全连接层产生 7×7 组预测结果,对应图中 7×7 个空间位置上物体的类别和边界框的位置。
(1)YOLO 的分类和回归目标
将原图切分成 S×S 大小的格子,对应预测图上 S×S 个位置。如果原图上某个物体的中心位于某个格子内,则对应位置的预测值应给出物体类别和B组边界框位置,其余位置应预测为背景类别,不关心边界框预测结果。
(2) YOLO 的损失函数
多任务学习:回归、分类共同计入损失函数,通过 λ 控制权重。
(3)YOLO 的优点和缺点
快!在Pascal VOC 数据集上,使用自己设计的 DarkNet 结构可以达到实时速度,使用相同的 VGG可以达到 3 倍于 Faster R-CNN 的速度。
由于每个格子只能预测1个物体,因此对重叠物体、尤其是大量重叠的小物体容易产生漏检。直接回归边界框有难度,回归误差较大,YOLO v2开始使用锚框。
3.SSD: Single Shot MultiBox Detector (2016)
主干网络:使用 VGG + 额外卷积层,产生 11 级特征图。检测头:在 6 级特征图上,使用密集预测的方法,产生所有位置、不同尺度、所有锚框的预测结果。
特征图分辨率×锚框数目,对所有特征图求和 = 8732 个检测框。
SSD 的损失函数
训练 👈 为 8732 个锚框上的分类和回归预测计算损失 👈 为每个预测值设定分类、回归设定真值 👈 比对锚框和真值框的 IoU ,为每个锚框设定分类、回归真值
👉 总损失 = 所有分类损失 + 所有正样本的边界框回归损失
4.正负样本不均衡问题
单阶段算法需要为每个位置的每个锚框预测一个类别,训练时需要为每个预测计算分类损失。图中锚框的数量远远大于真值框(数万 vs 数个),大量锚框的预测真值为背景(负样本)。
使用类别不平衡的数据训练出的分类器倾向给出背景预测,导致漏检。朴素的分类损失不能驱动检测器在有限的能力下达到漏检和错检之间的平衡。
解决方法:
两阶段检测器通过区域提议拒绝了大量负样本,区域检测头接收的正负样本比例并不悬殊。单阶段检测器则需要专门处理样本不均衡问题。
5.困难负样本 Hard Negative
困难样本 = 分类器难以分类正确的样本 = loss 大的样本
负样本 = 真值为背景的样本
困难负样本 = 真值为背景,但被分类为前景, 且置信度非常高的样本(可能是真值框周围但 IoU 并不高的候选框)
6.RetinaNet (2017)
基于 focal loss 的单阶段检测器。
特征生成:ResNet 主干网络 + FPN 产生 P3~P7 共 5 级特征图,对应降采样率 8~128 倍。多尺度锚框:每级特征图上设置 3 种尺寸×3 种长宽比的锚框,覆盖 32~813 像素尺寸。密集预测头:两分支、5 层卷积构成的检测头,针对每个锚框产生 K 个二类预测以及 4 个边界框偏移量。
7.YOLO v3 (2018)
自定义的 DarkNet-53 主干网络和 FPN 结构,产生 1/8、1/16、1/32 降采样率的 3 级特征图。在每级特征图上设置 3 个尺寸的锚框,锚框尺寸通过对真值框聚类得到。两层卷积构成的密集预测头,在每个位置、针对每个锚框产生 80 个类别预测、4个边界框偏移量、1个 objectness 预测,每级特征图 3×(80+4+1)=255 通道的预测值。
得益于相对轻巧的主干网络设计、YOLO v3 的速度远快于 RetinaNet。
六、无锚框目标检测算法 Anchor-free Detectors
1.锚框 vs 无锚框
基于锚框(Anchor-based)
- Faster R-CNN、YOLO v3 / v5、RetinaNet 都是基于锚框的检测算法
- 模型基于特征预测对应位置的锚框中是否有物体,以及精确位置相对于锚框的偏移量
- 需要手动设置锚框相关的超参数(如大小、长宽比、数量等),设置不当影响检测精度 ❌
无锚框(Anchor-free)
- 不依赖锚框,模型基于特征直接预测对应位置是否有物体,以及边界框的位置
- 边界框预测完全基于模型学习,不需要人工调整超参数 ✔️
- YOLO v1 是无锚框算法,但由于提出时间较早,相关技术并不完善,性能不如基于锚框的算法
2.FCOS, Fully Convolutional One-Stage (2019)
特征生成:主干网络 + FPN 产生 P3~P7 共 5 级特征图,对应降采样率 8~128 倍。密集预测头:两分支、5 层卷积构成的密集预测头,对于每个位置,预测类别、边界框位置和中心度三组数值(与 Anchor-based 有所不同)。
(1)FCOS 的多尺度匹配
Anchor-based 算法根据锚框和真值框的 IoU 为锚框匹配真值框通常,锚框会匹配到同尺度的真值框,小物体由低层特征预测,大物 体由高层特征图预测。
问题: Anchor-free 算法没有锚框,真值框如何匹配到不同尺度?匹配方案:每层特征图只负责预测特定大小的物体,例如图中512像素以上的物体匹配到P7上。
由于重叠的物体尺度通常不同,同一位置重叠的真值框会被分配到不同的特征层,从而避免同一个位置需要预测两个物体的情形。
(2)FCOS 的预测目标
基本规则: 如果某个特征(在原图上对应的位置)位于某个真 值框的内部,则该特征对应正样本,应预测物体的:类别概率; 边界框相对于该中心位置的偏移量 ;中心度,用于衡量预测框的优劣。如果某个位置不在任何物体的边界框内部,对应负样本,只需预测类别为背景。
(3)中心度 Center-ness
FCOS 将所有框内的位置归类为正样本: 相比 Anchor-Based 有更多正样本用于训练,但也会让分类器更容易在物体周围产生低质量预测框。
解决方案: 每个位置额外预测一个中心度值,用于该预测框的优劣。推理阶段:置信度 = 中心度 × 分类概率,以过滤低质量预测框。
(4)FCOS 的损失函数
3.CenterNet (2019)
针对 2D 检测的算法,将传统检测算法中的“以框表示物体”变成“以中心点表示物体”,将 2D 检测建模 为关键点检测和额外的回归任务,一个框架可以同时覆盖 2D 检测、3D 检测 、姿态估计等一系列任务。
(1)CenterNet 的主要流程
CenterNet 检测器将目标以点的形式进行检测,即用目标框的中心点表示目标,预测目标的中心点偏移量和宽度,得到目标的实际轨迹。CenterNet 网络结构:
CenterNet 网络结构如图整体比较简单,主要分为提供图片特征信息的网络结构,对特征图片进行线上采样的反卷积模块,另外还有可以进行预测热图热图结果的三个分支卷积计算网络。反卷积模块包含有三套反卷积组,每套都包含有一个3*3的卷积图和一个反卷积计算,而每个反卷积计算组都会加大一倍的特征图尺寸。
CenterNet 的模型计算流程:缩放输入图片,将缩放后的图片作为输入赋予给网络;图片经过残差网络提取特征得到第一特征;使用反卷积模块处理第二特征,三次采样得到第二特征;将第二特征送入三个分支分别进行预测长宽和中心点偏移量。
推理时,如果热力图上 (𝑥, 𝑦) 坐标出现局部极大值,其对应坐标的局部偏移量为 𝛿𝑥, 𝛿𝑦 ,则认为原图 上 (𝑅𝑥 + 𝛿𝑥, 𝑅𝑦 + 𝛿𝑦) 位置是某物体中心。
七、Detection Transformers
1.DETR (2020)
传统方法:在特征图上进行密集预测,依赖 Anchor 设计、NMS 后处理等额外操作。
DETR:脱离密集预测范式,将检测建模为从特征序列到框序列的翻译问题,用 Transformer 模型解决。
Transformer 以一系列特征为输入、输出一系列检测框。object queries 是可学习的参数,与 NLP 不同的是没有顺序上的前后关系,训练时也不需要 mask 使用匈牙利算法(一一对应)匹配 DETR 产生的预测框与真值框,计算损失。
2.Deformable DETR (2021)
DETR 的注意力机制收敛很慢,收敛 ≈ 注意力机制注意到特定的位置。
Deformable DETR 借鉴 Deformable Conv 的方式,显示建模 query 注意的位置,收敛速度更快。
八、目标检测模型的评估方法
1.检测结果的正确/错误类型
正确结果 (True Positive):算法检测到了某类物体 (Positive),图中也确实有这个物体,检测结果正确 (True) 。
假阳性 (False Positive):算法检测到了某类物体 (Positive),但图中其实没有这个物体,检测结果错误 (False) 。
假阴性 (False Negative):算法没有检测到物体 (Negative),但图中其实有某类物体,检测结果错误 (False)
检测到的衡量标准:对于某个检测框,图中存在同类型的真值框且与之交并比大于阈值(通常取0.5)。
2.准确率 Precision 与 召回率 Recall
真值框总数与检测算法无关,因此只需将检测结果区分为 TP 和 FP 即可计算 recall 和 precision。
两种极端情况:
- 检测器将所有锚框都判断为物体:召回率≈100%,但大量背景框预测为物体,FP很高,准确率很低。
- 检测器只输出确信度最高的1个检测框:以很大概率检测正确,准确率=100%,但因为大量物体被预测 为背景,FN很高,召回率很低。
一个完美的检测器应该有100%召回率和100%的精度;在算法能力有限的情况下,应该平衡二者。通常做法:将检测框按置信度排序, 仅输出置信度最高的若干个框。
置信度 = 分类概率,或修正后的分类概率(YOLO、FCOS)
3.PR 曲线 与 AP 值
为得到阈值无关的评分,可以遍历阈值,并对 Precision 和 Recall 求平均。具体做法:
- 检测框按置信度排序,取前 K 个框计算 Precision 和 Recall
- 遍历 K 从 1 至全部检测框,将得到的 Precision 和 Recall 值绘制在坐标系上,得到 PR 曲线
- 定义 Average Precision = Precision 对 Recall 的平均 值,即 PR 曲线下的面积,作为检测器的性能衡量指标
(1)完整数据集上的例子:
(2)PR 曲线的起伏
(3)Mean AP
分类别统计AP,并按类别平均即得到 Mean AP。
Mean AP 的完整计算流程: 将数据集中全部图像上的检测框按预测类别分类 ;对于某一类别的所有检测框,计算 AP:①按置信度将该类别的所有检测框排序②逐一与真值框比较,判定 TP 或 FP ,并绘制 PR 曲线 ③对 PR 曲线插值,计算 AP ;求所有类别的 AP 的平均,得到 Mean AP。
部分数据集(如 COCO)还要求在不同的 IoU 阈值下计算 Mean AP,得到 AP50 ,AP75 等指标 可衡量检测器在不同定位精度要求下的性能。
总结
以上就是笔记全部内容,本文仅仅简单介绍了目标检测、部分目标检测算法以及评估方法。
以上是关于OpenMMLab 实战营打卡 - 第 四 课 目标检测算法基础的主要内容,如果未能解决你的问题,请参考以下文章