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),再进行融合一次。
在这里插入图片描述

spp

yolov3以后使用列spp网络,使用后mAP有了好几个百分点的提升,在加了SPP模块之后的YOLOv3为何有这么大的提升?
在这里插入图片描述原始spp是解决网络尺度不同问题的,比如目标检测中,关于尺寸问题有以下几种情况
1 可能会有全连接层,这就要求输入尺寸固定,但是resize会导致图片信息丢失
2 使用全局最大池化代替全连接
3 使用spp后,无论输入为任何尺寸图片,都可以转为固定维度的向量,然后再全连接
如下图所示,降输入分成三个分支,分别分成N块进行全局最大池化,然后将池化后的值进行concat,如下图可以得到21×256的固定长度向量
在这里插入图片描述在yolo中,如果使用原始的spp虽然长度固定,但是会丧失位置信息,因此这里的spp并非真正意义的spp。在相对于普通版本的YOLOv3,SPP版本在第五、六层卷积之间增加了一个SPP模块,这个模块主要是由不同的池化操作组成,具体的实现在YOLOv3-SPP的cfg文件中,这里的spp无关尺度,就是做了一次不同池化核的特征融合。
在这里插入图片描述
实现的配置代码如下,几个池化层的stride都是1,都没有改变尺寸:

### SPP ###
[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
在这里插入图片描述
下面是实现的cfg文件可视化图,可视化的内容是cspesnet50中的一个基本模块:

在这里插入图片描述

focus

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

yolov5网络结构

anchor与GT匹配机制,需了解
yolov4和5是用的cspdarknet,darknet类似于残差网络,darknet的残差块与csp结合后,就是下图的CSP1_x和CSP2_x模块,就是加了一个路径更长的残差,理解了这个cspDarknet就比较容易看懂了。
在这里插入图片描述
结合代码来分析下,yolov5源码model下面有各个模型(x l m s)的配置文件,不同模型的大小是通过控制cspBottleneck内卷积块的重复次数(depth)和通道数量来控制的,因此这几个模型唯一不同的就是这两个缩放因子

# parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# anchors默认预设,Yolov5每次训练时,会自适应的计算不同训练集中的最佳锚框值,也可关闭该自适应功能
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  #form:输入 -1表示接上层输出
  #number:重复次数,主要说明BottleneckCSP卷积快数量,实际数量还需再乘depth_multiple
  #modulue:模块名  #args:参数
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2  #模块/下采样,focus完成了一次下采样
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, BottleneckCSP, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

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
在这里插入图片描述
其中,b , bgt分别代表了预测框和真实框的中心点,且 ρ 代表的是计算两个中心点间的欧式距离。c 代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。
在这里插入图片描述
yolov3 loss
bbox使用L2,是否是目标使用BCE(仅计算有目标的anchor),类别使用L2
yolov5 loss
objectness score的损失BCEWithLogitsLoss
class probability score的损失BCEWithLogitsLoss
bounding box的损失1-CIOU

参考博客:yolov5学习总结

yolov8

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

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是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
在这里插入图片描述

soft nms

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

nms的IOU

普通的IOU是计算交并比,上文讲了DIOU(考虑非重合情况下的距离,回归时使用),此外还有CIOU,在DIOU基础上,进一步考虑了框的长宽比的相似性。yolov4使用了CIOU loss
在这里插入图片描述由于CIOU的因子V涉及列GT信息,因此在推理时无法在nms中使用,yolov4推理使用了DIOU nms,v5使用了混合方式。

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
在这里插入图片描述

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的思想,方法是将原有的对锚框进行分类与回归,变为了对锚点进行分类与回归,其中回归是预测锚点到检测框上下左右四条边界的距离
在这里插入图片描述
相比centerNet在一个特征图上回归,fcos在五个特征图上回归,它没有预设anchor,怎么分配大小目标呢?

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

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

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

center-ness分支

回归一个值,目标中心偏离锚点的值,如果目标中心正好落在锚点,这个值就是0,极端情况,如果锚点处在目标边界上,这个值就是1
在这里插入图片描述
训练的时候,使用BCE loss回归训练这个值。预测的时候,这个值会乘以目标的分类置信度,因此目的是当目标中心落在锚点上的时候,预测就越准确,反之回归的就不准确,对于不准确的,添加上一个惩罚项,后续nms可能就会被滤掉,提升检测效果。

目标检测的loss

focal loss

解决目标检测中的正负样本不均衡以及较多容易样本影响loss的问题
在这里插入图片描述
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算法忽略了容易分类的样本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值