525
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
目录
非极大值抑制(Non-Maximun Suppression)
目标检测:给定一张图片,使用矩形框框出所有感兴趣物体并同时预测物体类别
目标检测与图像分类
图像分类 | 目标检测 | |
不同 |
通常只一个物体 通常位于图像中央 通常占据主要面积 |
物体数量不固定 物体位置不固定 物体大小不固定 |
相同 | 需要算法“理解”图像的内容 -> 神经网络实现 |
目标检测发展史
框,边界框(Bounding Box):泛指图像上的矩形框,边界横平竖直(如果斜着,则有专门的旋转检测)
描述框需要4个数值:
方式1(VOC格式):左上右下边界坐标(x_min,y_min),(x_max,y_max)
方式2(COCO格式):中心坐标和框的长宽(x_center,y_center), w, h
好的目标检测器:紧密包围感兴趣物体,检测任务要求为图中出现的每个物体预测一个边界框
交并比:定义为两个矩形框交集面积与并集面积之比,是矩形框重合程度的衡量指标
概念:神经网络中,一个神经元能“看到”的原图的区域,即为了计算出这个神经元的激活值,原图上哪些像素参与运算
换句话说:
这个神经元表达了图像上哪个区域的内容
这个神经元是图像上哪个区域的特征
图示
感受野的中心
对于尺寸3x3、pad=1的卷积(或池化)堆叠起来的模型,感受野中心=神经元在特征图上的坐标x感受野步长
感受野的步长(=降采样率=特征图尺寸的缩减倍数)
神经网络某一层上,相邻两个神经元的感受野的距离
步长=这一层之前所有stride的乘积
有效感受野
感受野一般很大,但不同像素对激活值的共线是不同的,即激活值对感受野内的像素求导数,大小不同
影响比较大的像素通常聚集在中间区域,可以认为对应神经元提取了有效感受野范围内的特征
概念:模型认可自身预测结果的程度,通常需要为每个框预测一个置信度
一般来说,我们倾向认可置信度高的预测结果
部分算法直接取模型预测物体属于特定类别的概率
部分算法让模型单独预测一个置信度(训练时有GT,可以得到相关信息作为监督)(YOLOv3)
需要解决的问题:“是什么”,“在那里”
问题的难点:图中物体位置、数量、尺度变化多样
指标:一个好的检测器应满足不重、不漏的要求
设定一个固定大小的窗口
遍历图像所有位置,所到之处用分类模型识别窗口中的内容
为了检测不同大小、不同形状的物体,可以使用不同大小、窗宽比的窗口扫描图片(有些看到先验框的影子)
缺点:计算成本过大,分类次数与窗口大小和图像大小成倍相关
优点:方法简单
如何改进?
思路一:使用启发式算法替换暴力遍历
用相对低计算量的方式粗筛出可能包含物体的位置,再使用卷积网络预测(有些二阶段目标检测算法的影子)
缺点:是早期二阶段方法使用,依赖外部算法,系统实现复杂
思路二:减少冗余计算,使用卷积网络实现密集预测
冗余示意图
改进思路:用卷积一次性计算所有特征,再取出对应位置的特征完成分类(是否会导致位置信息的丢失?)
这种改进方法在重叠区域只计算一次卷积特征,与窗的个数无关
基本思路
问题:滑窗与物体精准边界通常有偏差
方法:让模型在预测物类别同时预测边界框相对滑窗的偏移量(多任务学习)
两种方式:锚框与无锚框
注:卷积相较于全连接层回归预测较为困难,所以采用基于锚框的方式降低回归难度
滑窗通常会在物体周围给出多个相近的检测框
这些框实际指向同一物体,只需要保留其中置信度最高的
算法实现:
用模型做密集预测,使用1x1卷积得到预测图,每个位置包含类别概率、边界框回归的预测结果
保留预测类别不是背景的“框”
基于“框”中心,和边界框回归结果,进行边界框解码
后处理:非极大值抑制
检测头在每个位置产生一个预测(有无物体、类别、位置偏移量)
该预测值应与某个真值比较产生损失,进而才可以训练检测器
但这个真值在数据标注中并不存在,标注值标出了有物体的地方
我们需要基于稀疏的标注框为密集预测的结果产生真值,这个过程成为匹配(Assignment)
匹配基本思路
对于每个标注框,在特征图上找到与其接近的位置(可不止一个),该位置的分类真值设置为对应物体
位置的接近程度,通常基于中心位置或者与基准框的IOU判断
其余真值为无物体
采样:选取一部分正、负样本计算Loss
总结
尺度问题:图像中物体大小可能有很大差异(10~500px)
朴素的密集范式中,如果让模型基于主干网络最后一层或导数第二层特征图进行预测:
受限于结构(感受野),只擅长中等大小的物体
高层特征图经过多次采样,位置信息逐层丢失,小物体检测能力较弱,定位精度较低
方法一:基于锚框
在原图上设置不同尺寸的基准框,称为锚框,基于特征分别预测每个锚框中是否包含物体
可以生成不同尺寸的预测框
可以在同一位置生成多个提议框覆盖不同物体
缺点:能力有限
方法二:图像金字塔
将图像缩放到不同大小,形成图像金字塔
检测算法在不同大小图像上即可检测出不同大小物体
优势:算法不经改动可以适应不同尺度的物体
劣势:计算成本成倍增加
可用于任何模型(不在意计算成本)
方法三:基于层次化特征
基于主干网络自身产生的多级特征图产生预测结果
由于不同层的感受大小不同,因此不同层级的特征天然使用与检测不同尺寸的物体
优势:计算成本低
劣势:底层特征抽象级别不够,预测物体较困难
改进方法:高层次特征包含足够抽象语义信息。将高层特征融入底层特征,补充底层特征的语义信息
方法四:特征金字塔
相关论文:Feature Pyramid Network(2016)
融合方法:特征求和
目前检测器的主流范式
单阶段算法直接通过密集预测产生检测框,相比于两阶段算法,模型结构简单、速度快,易于在设备上部署
相关论文: Faster R-CNN: Towards Real-Time Object Detectionwith Region Proposal Networks(2015)
RPN→ Propose Region——初步筛选出图像中包含物体的位置,不预测具体类别
RPN算“半个检测器”,是二阶段算法Faster RCNN的第一阶段
RPN是基于密集预测的
其中:3为3个锚框,2为2个类别,即前景和背景,4为边界框回归的偏移值
相关代码
def _init_layers(self) -> None:
"""Initialize layers of the head.
self.num_base_priors = 3
self.cls_out_channels = 1 或 2 取决于使用 BCE 还是 CE Loss
self.bbox_coder.encode_size = 4
self.feat_channels =1024
self.in_channels = 1024
"""
self.rpn_conv = nn.Conv2d(self.in_channels, self.feat_channels, 3, padding=1)
self.rpn_cls = nn.Conv2d(
self.feat_channels, self.num_base_priors * self.cls_out_channels, 1)
reg_dim = self.bbox_coder.encode_size
self.rpn_reg = nn.Conv2d(self.feat_channels,self.num_base_priors * reg_dim, 1)
def forward_single(self, x: Tensor) -> Tuple[Tensor, Tensor]:
x = self.rpn_conv(x)
x = F.relu(x)
rpn_cls_score = self.rpn_cls(x)
rpn_bbox_pred = self.rpn_reg(x)
return rpn_cls_score, rpn_bbox_pred
基于IOU匹配:为所有的预测框匹配一个GT
1. 将每个预测框分配到背景
2. 将iou与所有gts<负样本阈值的预测框分配为0
3. 对于每个预测框,如果具有其最近gt>=正样本阈值的iou,把GT分配给那个预测框
4. 对于每个gt-bbox,分配其最接近的预测框
相关论文: SSD: Single Shot MultiBox Detector(2016)
主干网络:使用VGG+额外卷积层,产生11级特征图
检测头:在6级特征图上进行密集预测,产生所有位置、不同尺度的预测结果
网络结构图
匹配规则(训练)
为8732个锚框上的分类和回归预测计算损失
为每个预测值设定分类、回归设定真值
比对锚框和真值框的loU,为每个锚框设定分类、回归真值
总损失=所有分类损失+所有正样本的边界框回归损失
锚框与真值框的匹配规则
首先,把每个真值框匹配到与其交并比最大的锚框
然后,把剩余锚框匹配给与其交并比大于0.5的真值框进行匹配一个真值框可甚配给多个锚框
相关论文: Focal Loss for Dense Object Detection(2017)
特征生成:ResNet主干网络+FPN产生P3~P7共5级特征图,对应降采样率8~128倍
多尺度锚框:每级特征图上设置3种尺寸×3种长宽比的锚框,覆盖32~813像素尺寸
密集预测头:两分支、5层卷积构成的检测头,针对每个锚框产生K个二类预测以及4个边界框偏移量
损失函数:Focal Loss
网络结构
注:5级特征图,降采样率分别为8,16,32,64,128
损失函数:Focal Loss
引入Focal loss的原因主要是为了解决正负样本不均匀问题
单阶段算法共产生尺度数×位置数×锚框数个预测,而这些预测之中,只有少量锚框的真值为物体(正样本),大部分锚框的真值为背景(负样本)
正样本 :负样本 = 几个 :几万个
如果不解决正负样本失衡的问题,则可能导致的问题:使用类别不平衡的数据训练出的分类器倾向给出背景预测,导致漏检
朴素的分类损失不能驱动检测器在有限的能力下达到漏检和错检之间的平衡
论文分析损失组成,可分为三类:pos Lcls(正样本损失),hard Lcls(难负样本),easy Lcls(简单负样本)
横轴为预测负样本的概率,纵轴为CE产生的损失
Focal loss主要降低简单负样本产生的损失,从而使模型更加关注困难负样本和正样本
常数α用于调节正样本和负样本产生损失的比例
实验结果,当γ=2,α=0,25时结果最好
相关论文:YOLO: You Only Look Once(2015)
主干网络:自行设计的DarkNet结构,产生7×7×1024维的特征图
检测头:2层全连接层产生7×7组预测结果,对应图中7x7个空间位置上物体的类别和边界框的位置
网络结构图
YOLO的匹配与框编码
将原图切分成S×S大小的格子,对应预测图上SxS个位置
如果原图上某个物体的中心位于某个格子内,则对应位置的预测值应给出物体类别和B组边界框位置
其余位置应预测为背景类别,不关心边界框预测结果
损失函数
多任务学习:回归、分类共同计入损失函数,通过λ控制权重
优点:快
缺点:重叠物体容易产生漏检,边界框回归较为困难,导致精度低
相关论文:YOLOv3: An Incremental Improvement(2018)
自定义的DarkNet-53主干网络和类FPN结构,产生1/8、1/16、1/32降采样率的3级特征图
在每级特征图上设置3个尺寸的锚框,锚框尺寸通过对真值框聚类得到
两层卷积构成的密集预测头,在每个位置、针对每个锚框产生80个类别预测(coco)、4个边界框偏移量、1个objectness预测,每级特征图3×(80+4+1)=255通道的预测值
网络结构图
相关链接:YOLOv5(2020)
模型结构进一步改进、使用CSPDarkNet 主干网络、PAFPN多尺度模块等
训练时使用更多数据增强,如Mosaic、MixUp等
使用自对抗训练技术(SAT)提高检测器的鲁棒性
相关链接:YOLOv8(2022)
解读文档:MMYOLO——YOLOv8
相关论文:YOLOX: Exceeding YOLO Series in 2021(2021)
以YOLOv3为基准模型改进的无锚框检测器
Decouple Head结构
更多现代数据增强策略
从小到大的一系列模型
检测头结构图
不依赖锚框,模型基于特征直接预测对应位置是否有物体,以及边界框的位置
边界框预测完全基于模型学习,不需要人工调整超参数
缺点
主要针对同一位置重叠的物体
基于锚框算法可以基于不同形状的锚框预测不同的物体
无锚框导致歧义的预测目标,应该预测为马还是人?
解决方法:借助FPN,可以利用不同层次的特征预测重叠的物体(但是大小不同的物体)
相关论文:FCOS: Fully Convolutional One-Stage Object Detection(2019)
模型结构与RetinaNet基本相同:主干网络+FPN+两分支、5层卷积构成的密集预测头
预测目标不同:对于每个点位,预测类别、边界框位置和中心度三组数值
网络结构图
Regression:回归物体四条边界框相对于中心点的偏移量
Centerness:特征中心点是否在物体中心
匹配规则
先将GT投射到不同级别的特征图上
如果某个特征位于某个真值框的内部,且特征的层级与真值框的尺度匹配,则该特征对应正样本,应预测物体的:
类别概率
边界框相对于该中心位置的偏移量
中心度,用于衡量预测框的优劣
如果某个特征不位于任何真值框内部,或与真值框尺度不匹配,对应负样本,只需预测类别为背景
多尺度匹配
Anchor-based 算法根据锚框和真值框的 loU 为锚框匹配真值框,通常,锚框会匹配到同尺度的真值框,小物体由低层特征预测,大物体由高层特征图预测
问题:没有锚框,GT如何匹配到不同尺度?
解决方案:每层特征图只负责预测特定大小的物体,例如下图中512像素以上的物体匹配到P7上
对于重叠物体,重叠的物体尺度通常不同,同一位置重叠的真值框会被分配到不同的特征层,从而避免同一个位置需要预测两个物体的情形
中心度Centerness
FCOS将所有框内的位置归类为正样本:
相比 Anchor-Based有更多正样本用于训练
但也会让分类器更容易在物体周围产生低质量预测框
解决方法:
每个位置额外预测一个中心度值,用于该预测框的优劣
推理阶段:置信度=√中心度×分类概率,以过滤低质量预测框
中心度定义
几何意义:位置越靠近边界框中心越接近1,越靠近边界越接近0
损失函数
分类损失:Focal loss
边界框回归损失:IOULoss
Centerness 损失:BCE loss
针对2D检测的算法,将传统检测算法中的“以框表示物体”变成“以中心点表示物体”,将2D检测建模为关键点检测和额外的回归任务,一个框架可以同时覆盖2D检测、3D检测、姿态估计等一系列任务
主要利用概率热力图
暂无