DL目标检测

目标检测

YOLO系列

| Name | Academy | score |score |
| – | :-: | -: | – | – |
| Harry Potter | Gryffindor| 90 |score |
| Hermione Granger | Gryffindor | 100 |score |
| Draco Malfoy | Slytherin | 90 |score |

PANet

Path-Aggregation Net,如下图所示,(a)蓝色部分是fpn,网络正常下采样后,又有一次上采样,然后进行特征融合。PANet认为fpn中比较大的特征图,左边的特征深度和右边的差距太大,特征不够精细,不易融合,因此又添加了一个下采样的过程(b),再进行融合一次。

DL目标检测

; spp

yolov3以后使用列spp网络,使用后mAP有了好几个百分点的提升,在加了SPP模块之后的YOLOv3为何有这么大的提升?

DL目标检测
1 可能会有全连接层,这就要求输入尺寸固定,但是resize会导致图片信息丢失
2 使用全局最大池化代替全连接
3 使用spp后,无论输入为任何尺寸图片,都可以转为固定维度的向量,然后再全连接
如下图所示,降输入分成三个分支,分别分成N块进行全局最大池化,然后将池化后的值进行concat,如下图可以得到21×256的固定长度向量
DL目标检测
DL目标检测
实现的配置代码如下,几个池化层的stride都是1,都没有改变尺寸:

[maxpool]
stride=1
size=5

[route]
layers=-2

[maxpool]
stride=1
size=9

[route]
layers=-4

[maxpool]
stride=1
size=13

[route]
layers=-1,-3,-5,-6

2.cspnet

CSPNet(Cross Stage Partial Network)就是从网络结构设计的角度来解决以往工作在推理过程中需要很大计算量的问题。
作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。 大量的梯度信息被重复用来更新不同dense block的权重。这将导致不同dense block反复学习相同的梯度信息。
CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。CSPNet是一种处理的思想,可以和ResNet、ResNeXt和DenseNet结合。个人觉得是加强版的resnet

DL目标检测
下面是实现的cfg文件可视化图,可视化的内容是cspesnet50中的一个基本模块:

DL目标检测

; focus

yolov5输入有一个fucos操作,其实就是一次下采样的过程,不同于粗暴的下采样,他是将原始图片按照像素排布间隔抽取,并组成四张新的图片,并将新图片进行concat。好处是完成了下采样降低了计算量,并且比粗暴的下采样效果好。

DL目标检测

yolov5网络结构

anchor与GT匹配机制,需了解
yolov4和5是用的cspdarknet,darknet类似于残差网络,darknet的残差块与csp结合后,就是下图的CSP1_x和CSP2_x模块,就是加了一个路径更长的残差,理解了这个cspDarknet就比较容易看懂了。

DL目标检测
结合代码来分析下,yolov5源码model下面有各个模型(x l m s)的配置文件,不同模型的大小是通过控制cspBottleneck内卷积块的重复次数(depth)和通道数量来控制的,因此这几个模型唯一不同的就是这两个缩放因子

nc: 80
depth_multiple: 0.33
width_multiple: 0.50

anchors:
  - [10,13, 16,30, 33,23]
  - [30,61, 62,45, 59,119]
  - [116,90, 156,198, 373,326]

backbone:

  [[-1, 1, Focus, [64, 3]],
   [-1, 1, Conv, [128, 3, 2]],
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],
  ]

head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],
   [-1, 3, BottleneckCSP, [512, False]],

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],
   [-1, 3, BottleneckCSP, [256, False]],

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],
   [-1, 3, BottleneckCSP, [512, False]],

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],
   [-1, 3, BottleneckCSP, [1024, False]],

   [[17, 20, 23], 1, Detect, [nc, anchors]],
  ]

yolo Loss

DOU loss
比较传统的bbox损失,如ssd或yolo早期版本使用L1或L2损失,或者两者结合的smooth L1 Loss。yolov4开始使用IOU loss衡量预测框和GT框的差距。L = 1 – IOU
IOU的一个问题是当两个框没有重合区域时,IOU永远是0,因此无法衡量两个框离得到底多远多近,这样也没有梯度。因此提出了改进的DIOU,yolov5的边框损失是L = 1- DIOU

DL目标检测
其中,b , bgt分别代表了预测框和真实框的中心点,且 ρ 代表的是计算两个中心点间的欧式距离。c 代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。
DL目标检测
yolov3 loss
bbox使用L2,是否是目标使用BCE(仅计算有目标的anchor),类别使用L2
DL目标检测
objectness score的损失BCEWithLogitsLoss
class probability score的损失BCEWithLogitsLoss
bounding box的损失1-CIOU

参考博客:yolov5学习总结

; yolov8

还没时间仔细研究,运行yolov8代码,是两种方式,一种是用它线程的库(不推荐,无法改代码),另一种是运行代码,但是要在test或train文件加上以下三行

DL目标检测

nms相关

nms

NMS算法的大致思想:对于有重叠的候选框:若大于规定阈值(某一提前设定的置信度)则删除,低于阈值的保留。对于无重叠的候选框:都保留。
所谓非极大值抑制:先假设有6个输出的矩形框(即proposal_clip_box),根据分类器类别分类概率做排序,从小到大分别属于车辆的概率(scores)分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。

DL目标检测

; soft nms

普通的nms有两个问题,一方面有很多重合度较高的两个框,实际上确实是两个目标,却错误的被删除了,另一方面,由于情况的复杂性,阈值不好设定。
soft NMS思路:不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。
算法的大致思路为:M为当前得分最高框,bi 为待处理框,bi 和M的IOU越大,bi 的得分si 就下降的越厉害。下降的方式包括线性衰减和高斯衰减。
普通的nms:

DL目标检测
线性衰减的soft nms:
DL目标检测
高斯加权:
DL目标检测

nms的IOU

普通的IOU是计算交并比,上文讲了DIOU(考虑非重合情况下的距离,回归时使用),此外还有CIOU,在DIOU基础上,进一步考虑了框的长宽比的相似性。yolov4使用了CIOU loss

DL目标检测

; centerNet

anchor free检测算法,Objects as Points 2019CVPR,和openpose原理有点相似,都是利用关键点检测,来实现目标检测。损失函数分为三个部分,中心点/目标尺寸/偏置,论文中所使用的backbone都有三个head layer,分别产生[1,80,128,128]、[1,2,128,128]、[1,2,128,128],也就是每个坐标点产生C+4个数据(即关键点类别C, 中心偏移量的x,y,尺寸的w,h)
中心偏移使用L1 loss,尺寸回归使用L2 loss,热图类别损失(有C个heat map,相当于多个二分类)使用facol loss

DL目标检测

anchor三个缺点
1.正负样本不均衡,背景多,大量简单负样本
2.超参难调,anchor数量尺寸比例等
3.匹配耗时严重,每个anchor要与所有的gt进行iiu匹配
centernet没有anchor,直接预测中心点位置,不存在匹配,以及正负样本筛选
每个目标仅选择一个中心点作为正阳本,在关键点热图上选择一个峰值,没有nms
专注关键点检测,可以使用更大的特征图,下采样为4,无需大小不同的特征图,不用fpn什么的,只在一个特征图上回归就行
改进点:
1、高斯核,线性核,代码GT部分,实际没有所谓的核,只有目标中心点被标1,其他零
2、上面说,回归C+4个数据,实际上不同的类别是公用位置信息的,可以增加通道数,不同类别分别回归,C+C*4

FCOS

FCOS是anchor free的思想,方法是将原有的对锚框进行分类与回归,变为了对锚点进行分类与回归,其中回归是预测锚点到检测框上下左右四条边界的距离

DL目标检测
相比centerNet在一个特征图上回归,fcos在五个特征图上回归,它没有预设anchor,怎么分配大小目标呢?
  1. 空间限制:将位于物体真实标注框中的锚点作为候选正样本;
  2. 尺度限制:FCOS为每个检测层人为设置了一个尺度范围,P3~P7检测层对应的尺度范围分别是(0, 64)、(64,128)、(128, 256)、(256, 512)、(512, +∞),锚点回归目标(锚点到边框四条边界的距离)的最大值如果在这个范围内则是最终的正样本。这样可以使得各检测层上关联的锚点用于不同尺度物体的检测。(基本上还是小目标在浅层,大目标在深且小的层)
    DL目标检测

; 锚点的分类分支与回归分支

锚点的分类采用了多分类Focal Loss作为损失函数,锚点的回归采用了SmoothL1作为损失函数
锚点的回归目标值计算公式如下图所示,其中l t r b是锚点距离物体真实标注框左、上、右、下边界的距离,值得注意的是这些距离都通过锚点关联的检测层的下采样倍数S进行了归一化,使得不同尺度的物体,回归目标值都在一定范围内

DL目标检测

center-ness分支

回归一个值,目标中心偏离锚点的值,如果目标中心正好落在锚点,这个值就是0,极端情况,如果锚点处在目标边界上,这个值就是1

DL目标检测
训练的时候,使用BCE loss回归训练这个值。预测的时候,这个值会乘以目标的分类置信度,因此目的是当目标中心落在锚点上的时候,预测就越准确,反之回归的就不准确,对于不准确的,添加上一个惩罚项,后续nms可能就会被滤掉,提升检测效果。

; 目标检测的loss

focal loss

解决目标检测中的正负样本不均衡以及较多容易样本影响loss的问题

DL目标检测
alfa是不同类别权重,gamma是难负样本参数
既然有了出发点,那么就要找one-stage detector的准确率不如two-stage detector的原因,作者认为原因是:样本的类别不均衡导致的。我们知道在object detection领域,一张图像可能生成成千上万的candidate locations,但是其中只有很少一部分是包含object的,这就带来了类别不均衡。那么类别不均衡会带来什么后果呢?引用原文讲的两个后果:
(1) training is inefficient as most locations are easy negatives that contribute no useful learning signal;
(2) en masse, the easy negatives can overwhelm training and lead to degenerate models.

什么意思呢?负样本数量太大,占总的loss的大部分,而且多是容易分类的,因此使得模型的优化方向并不是我们所希望的那样。其实先前也有一些算法来处理类别不均衡的问题,比如OHEM(online hard example mining),OHEM的主要思想可以用原文的一句话概括:In OHEM each example is scored by its loss, non-maximum suppression (nms) is then applied, and a minibatch is constructed with the highest-loss examples。OHEM算法虽然增加了错分类样本的权重, 但是OHEM算法忽略了容易分类的样本。

Original: https://blog.csdn.net/henyaoyuancc/article/details/121771233
Author: henyaoyuancc
Title: DL目标检测

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/683051/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球