1.深度学习经典检测算法比较
two-stage(两阶段):Faster-RCNN,Mask-RCNN,第一步RPN选预测框,第二步得到物体检测框的位置。(先预选,后得到结果)
优点:效果好
缺点:5fps ,速度较慢。
one-stage(单节段):YOLO系列,一个CNN网络做回归得到物体检测框的位置(直接得到结果) 网络简单 还有SSD。
优点:速度快,适合实时检测,可以到40到200fps
缺点:效果通常不太好,结果比较粗
2.MAP指标与IOU
MAP:综合衡量检测效果,精度与召回率recall(在机器学习中二者矛盾)
IOU:交并比,真实值与预测值的交集与并集 交集/并集。
精度:tp/(tp+fp)真阳比上真阳与假阳之和,
召回率/查全率:tp/(tp+fn)真阳比上真阳与假阴之和,给你的正样本你有没有都找出来
一个样本集,有正样本与假样本,并有其对应标签。
tp 正样本输入得到正的标签 fp 假样本输入得到正的标签
tn 正样本输入得到假的标签 fn 假样本输入得到假的标签
例子,班级总数100,男生80,女生20,选出所有女生。
网络选出了50人,20人是女生,30名是男生
所以TP = 20,女生得到女生,FP = 30,男生得到女生,FN = 0 ,男生得到男生,没有这个情况,TN女生得到男生, 80-30 = 50;
3.检测任务中的精度与召回率是代表什么?
精度,标签框与预测出来框的重合多少。
召回率,预测正确/预测正确+与预测错误
置信度,当前检测物体是目标的可能性。
AP,把所有阈值考虑(0~1),进来,将P,R化成图,得到RP曲线
MAP,RP曲线下方的面积。
4.YOLO v1的算法整体思路,YOLO(you only look once)
把检测问题转成回归问题。一个CNN搞定。
回归任务调整检测框的大小和位置,看那种最合适。
将图像分成许多格子,每个格子每个点产生两个候选框,算IOU与置信度,谁的IOU大,确定有物体,对那个检测框调整。
预测时不仅预测检测框的大小和位置,还有置信度(是物体的可能性,置信度小的过滤掉)。
四个坐标值,置信度值。
最终就得到最终检测结果。
5.YOLOv1网络架构
输入448*448*3 ,(输入大小不能变)
卷积不影响输入图像大小,但是全连接层固定了输入的大小。
输入-特征提取(卷积)-全连接层-reshape(7*7*30)-输出结果
格子大小是7*7的,30表示的是
每个格子产生两个候选框(B1:x1,y1,w1,h1,c1,B2:x2,y2,w2,h2,c2)这是5+5=10个。
另外20表示20分类,当前格子属于那种物体的概率。
10 = (X,Y,H,W,C)*B(2个)
当前数据集20个类别 C = 20;
7*7网格大小。S = 7;
(S*S)*(B*5+C)
6.损失函数:
x,y,w,h 位置误差,x,y的位置误差(平方差之和) + w,h的大小误差(根号差的平方之和),因为物体的大小不一样,物体有可能会小一点,需要为w,h加根号对小物体的检测更敏感。
c 置信度误差,置信度误差分为有物体(前景),和没物体的(背景),一般背景多。
候选框的预测置信度 与 该候选框与目标框的IOU的置信度真实值的差异
不含物体的加了一个权重,因为背景多,加上权重项可以减小背景的影响
分类误差,这是20分类,预测类别的概率与目标类别的概率误差。
最终loss将这些加起来。
7.NMS(非极大值抑制)
有许多检测框是重叠的,将这些检测框按照IOU大小排序,排除不符合的。
YOLO v1,快速简单,每个cell只能预测一个类别,重叠无法解决,小物体检测效果一般,长宽比可选,但是单一
8.YOLO v2 改进
(1)舍弃 dropout(可以防止过拟合),没有全连接层。
每次卷积后加入Batch Normalization(数据经过网络卷积后数据可能会偏移,不可操纵,所以进行数据归一化)
网络的每一层的输入都做了归一化,收敛相对容易。
经过BN网络提升2%的map,性能提升。
BN称为网络必备处理。
CONV-BN
(2)更大的分辨率
v1训练用的是224*224,测试时使用的是448*448
v2训练加了10次448*448微调
使用高分辨率分类器,YOLO v2 的map提升了4%9.
9.yolo v2网络架构
使用的时DarkNet,实际输入416*416;
没有FC层,5次降采样(maxpool)
全连接层容易过拟合,权重多。
1*1卷积节省参数
所有都用卷积来做。
v2中最终输出13*13,v1时7*7*30
所有卷积都是3*3,darknet有19层,卷积。经过卷积特征图就变大了。而中间进行了1*1卷积。
10 聚类提取先验框:
faster-rcnn 在不同尺度,不同h,w比例中产生9种框。不一定完全适合数据集。
而v2中不是直接按照长宽固定比给的。
聚类提取先验框,将数据集中的标准框进行聚类,用k-means聚类来分成几类。
将分类得到的边框的数据更有说服力,因为是从实际物体出发的。
聚类时的距离采用的是,聚类点的检测框与待聚类点的IOU作为距离。
d = 1-IOU; k = 5;聚类5
所以这里每个网格块产生5个先验框。
加了先验框map并不是多了,框多了反而预测的不好。recall提升了,查全率。
11.偏移量的计算
先验的是x,y,w,h
预测是 tx,ty,tw,th,以上代表偏移量,直接预测偏移量,偏移量大就会出现问题。
预测结果不在是直接预测偏移量。而是预测格子中心点的偏移量。那么预测的偏移量就不会超出网格。这里tx,ty预测方式变了,而tw,th不变。
坐标值映射与还原
12.感受野的作用
输入,conv1,conv2
特征图的一个点相对于原始图的数据与卷积核大小一样。
感受野就是最后一次的特征图中的一个点,相对于原始输入图的大小。
特征图上的点能看到原始图像的多大区域。
感受野,输入5*5,卷积3个3*3,stride=1,感受野就是7*7。
这种卷积与7*7的卷积结果是一样的,那为什么非要堆叠3个小卷积。
大的卷积核参数多,堆叠小的卷积核所需的参数更少一些,并且卷积越多,特征提取就会越细致,加入的非线性变换也随着增多,还不会增大权重的参数个数。这就是VGG网络的基本出发点。
13.特征融合
最后一层的感受野太大了,适合捕捉大目标,小目标可能就丢失,需要融合之前的特征。
将前几层的特征图reshape,拆分,拼接后,与最后一层特征图融合。
多尺度检测,只用卷积,多少输入都可以做。经历一次迭代之后改变输入图片的大小。
13. v3改进
YOLO v3 速度和map很强
作者是做到YOLOv3就结束了。后续版本是别人的改进。
现在已经改进到YOLOv8了。
最大改进网络结构,更适合小目标
特征更细致,融入多持续特征图信息来预测不同规格的物体。
先验框更丰富,3种scale,3种规格,一共9种。多尺度检测不同大小的物体,设计了3个scale,
13*13 预测大的,最后的特征 26*26 预测中的,中间的特征要借鉴最后的特征,即特征融合
52*52 预测小的 ,前面的特征要借鉴中和大的特征,即特征融合
每种都生成3个合适的候选框。
scale变换经典方法
(1)生成图像金字塔,做采样。但速度慢
(2)每层特征分别利用
(3)每层特征与之前的特征进行融合
由于尺度不匹配,所以做上采样,将13*13变成26*26,再与中间的结合,其他层同理。
残差连接:v3中野加入了resnet思想,堆叠更多的层进行特征提取。
14年vgg,只做到19层,但是网络层数越深后反而效果差了。
而resnet,解决的深度造成的效果差的问题,当效果好就保留,效果不好那我就恒等映射。
深度网络层数多,效果差不是所有层都不行,而是有些层有效果,有些层没效果。所以保留有效果的层,没效果的就把之前的层结果拿过来。
resnet 至少不比原来差。
YOLO v3核心网络框架,中间加入了残差模块,没有池化与全连接层,池化会对特征做压缩,而全连接层引入的参数太多,计算效率下降。而下采样通过设置卷积参数stride=2来实现。生成3种尺度的先验框。
最后输出
13*13*3*85 13表示网格
26*26*3*85 26表示网格
52*52*3*85 52表示网格
85(4边框坐标+1边框置信度+80类别)
yolov2 聚类5个先验框,v3中聚类选了将大的先验框交给13*13,中的先验框交给26*26的,小的先验框交给52*52的。
softmax 替代,交叉熵损失
物体检测任务中可能有一个物体有多个标签,logistic激活函数来完成,这样就能预测每一类别是/不是。
14.YOLO-v4
YOLO v4 速度和精度更块更强
创新没多少,但融合了当时很多的优质细节。
两大核心,从数据层和网络设计层面来进行改善。
全是实验都是,单GPU就能训练的非常好。
数据层面的改进:
BOF(Bag of freebies)增加训练成本,对数据增强(旋转,裁剪,平移,放大,缩小,颜色转换,Mosaic数据增强(四张图拼接成一张训练),图像融合,裁剪,裁剪融合),并不影响推理速度。
SAT(self adversarial-training)通过引入噪音点来增强数据。
网络正则化:dropout,dropblock。类别不平衡,损失函数设计。
dropout是随机选择点pass,而dropblock是吃掉一个区域。增强网络泛化能力。
Mosatic数据增强。间接增大了Batch size。
label Smoothing 标签平滑,神经网络最大的缺点,自觉不错,过拟合,别让他太自信。
标签平滑就是给类别加上概率,可以抗过拟合。使用之后簇内更紧密,簇间更分离。
损失函数:IOU损失存在的问题(当没有相交时,则IOU=0,无法梯度计算,相同的IOU却反应不出实际情况到底啥样。)
升级:GIOU损失引入最小封闭形状C,可以把A,B包含在内。最小包围框与并集的关系。
再不重叠的情况下能让预测框尽可能朝着真实框前进。
DIOU损失,分子(计算预测框与真实框的中心点欧式距离d),分母(能覆盖预测框与真实框的最小BOX的对角线长度C),直接优化距离,速度更快,解决了GIOU的问题。
CIOU损失再DIOU基础上加上了av,考虑重叠面积,中心点距离,长宽比。(a是权重,v是长宽比)
最后呈现结果时:
DIOU-NMS 决定是否删除一盒框,现在改用DIOU。非极大值抑制。
先找置信度最大的框,与其他框计算IOU,IOU越大,重叠度越高就删除。现在是加上DIOU(考虑两个BOX中心点的距离)
SOFT-NMS,如果高度重合就直接删除有点太刚了,不满足要求的不直接删,降他的置信度,最后看他的综合表现。
网络结构的改进:
加入了注意力机制,网络细节设计,特征金字塔等。
SPPNet(spatial pyramid pooling)
在v3中为了满足不同的输入大小,训练的时候要改变输入数据大小
SPP用最大池化(Max pooling)然后concat满足最终输入特征一致。
CSPNet(cross stage partial Network)
将特征图一切为2,第二部分走正常的卷积网络,第一部分直接concat加到第二部分的结果
使得最终结果下降不是特别多,速度上升。
CBAM:卷积块注意力机制模型
加入了注意力机制,V4中只加入了SAM,即空间注意力机制。
注意力机制就是关注充电,先做channel维度的,再是空间维度的子注意力机制。
给每个特征图加上权重,那个重要权重就大。空间维度就是那个点(空间位置)重要就加上权重。
乘在原始的特征图上。多引入一个softmax或者sigmod计算权重。
PAN(path aggregation network)
自顶向下的模式,将高层特征传下来,只有一条路,缺了一个从底层到高层的路子。
而PAN引入了自底向上的路径,使得底层信息更容易传到底部。
YOLOv4是拼接而不是相加。两个人融合成一个人,是加法,两个人合一块一起上,是拼接。
激活函数用的Mish,Relu太绝对了,Mish跟符合实际。
公式f(x) = x*tanh(ln(1+e^x));
计算量确实增加了,效果会提升一点。
在坐标值回归预测是在0-1之间是,在网格边界怎么表示,即取到0或1太难了,由于sigmoid函数,实际结果加上一个偏置。
CSP Darknet53 yolo head
SPP PAN