YOLO系列:PassThrough Layer、spp、IoU、GIoU、DIoU、CIoU、Focal loss、PAN、csp;
目标检测算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。而另一类是Yolo和SSD,这类是one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。这里讲yolo系列。
yolov1
- yolov1将输入resize成224x224,通过卷积神经网络映射成7x7x30的特征图,则我们可以知道:特征图上的每个点都是30维的向量,总共有7x7=49个特征点。而每个特征点对应到原图中就是一个块区域,这个区域称为grid cell。每一个grid预测多个框和一个类别,这个框称为bounding box。每个bounding box包含x,y,w,h,confidence五个属性。
- 刚开始每个grid cell预测出bounding boxes,我们需要比较bounding box与ground truth(正确框住物体的框)的差距,并进行反向传播,这就会有一个问题:bounding box与哪个ground truth进行比较呢?【这就正负样本的选择问题】
答:bounding box由grid cell预测得到,所以会查找有哪些ground truth的中心落在了当前grid中,并且计算bounding box与这些ground truth之间的IOU,当IOU超过0.5,我们就称此bounding box为正样本。我们需要计算ground truth与正样本之间的差距,使用梯度下降使正样本接近ground truth。
yolov2
yolov2的七种优化
1.Batch Normalization
2.High Resolution Classifier:用高分辨率的图像进行训练,即yolov1将将输入都resize成224x224,yolov2将输入都resize成416x416
3.Convolutional With Anchor Boxes:每个grid都有固定的大小几个框,称为Anchor Boxes。通过预测Anchor Box相对于gt的偏移量来调整Anchor Box。【注】yolov2中将Anchor称为prior
4.Dimension Clusters:在Faster R-CNN和SSD中,先验框(Anchor Boxes)的维度(长和宽)都是手动设定的,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:\(d(box, centroid) = 1 - IOU(box, centroid)\)
5.不让bounding box的中心超出当前grid
\(c_x\)和\(c_y\)代表经过归一化操作的中心坐标
\(\sigma\)是sigmoid函数
通过sigmoid函数让预测得到的bounding box的中心不会超出当前grid
6.Multi-Scale Training:每经过10个batch就随机从{320, 352,...,608 }选取一个数对输入图像进行resize,从而提高模型的鲁棒性。{320, 352,...,608 }中数之间的差距为32的原因:如果输入图像resize成416x416,那输出的特征图大小为13x13,416/13=32,也就是说下采样因子为32。
7.Fine-Grained Features:将底层的特征图和高层的特征图进行拼接,从而引入底层的信息。具体为:将26x26x512的特征图通过1x1的卷积层变成了26x26x64(源码中有此步骤,论文中没有),然后通过PassThrough Layer将26x26x64映射成13x13x256,最后将此13x13x256特征图与高层的13x13x1024进行拼接得到13x13x1280的特征图。拼接过程如下所示:
PassThrough Layer的具体过程如下:
上图中,长度和宽度变为原来的一半,通道数变为原来的四倍。
yolov2模型框架
yolov2的骨干网络:Darknet-19,19代表有19个卷积层。
yolov3
直接看:https://blog.csdn.net/qq_37541097/article/details/81214953 ,文中要注意的点:
- 文中的2 + 12 + 1 + 22 + 1 + 82 + 1 + 82 + 1 + 4*2 + 1 = 53 实际为为2 + 1*2 + 1 + 2*2 + 1 + 8*2 + 1 + 8*2 + 1 + 4*2 + 1 = 53
- 文中的( 4 + 1 + c ) × k:4代表目标边界框的四个偏移量、1代表预测目标边界框内包含目标的概率、c代表预测边界框对应c个目标类别的概率、k代表预测边界框的个数。
yolov3 spp
Mosaic图像增强
Mosaic图像增强:yolo里面其实用到很多数据增强的策略,比如随机裁剪、亮度饱和度调整、mix up等,下面介绍一下Mosaic图像增强:将四张图像拼接成一张图像输入网络。这样做的好处:
- 增加数据的多样性
- 增加目标个数
- BN能一次性统计多张图片的参数:比如输入一张由四张图像拼接成的图像等效于并行输入四张(batch size=4)原始图像。
SPP模块:
总共有四个分支,最左边的分支直接将输入作为输出,其他三个分支进行了maxpool操作。以第一个maxpool操作为例,5x5/1
其中1代表步距为一,并进行了padding操作来保证输入和输出的size保持不变。
Concatenate:代表在channel方向进行拼接。
IoU、GIoU、DIoU、CIoU损失函数:
作者推荐文章:IoU、GIoU、DIoU、CIoU损失函数
IOU loss: \(loss = -ln(IOU)\)、$loss = 1-IOU $
GIOU(Generalized Intersection over Union):
上面公式的意思是:先计算两个框的最小闭包区域面积 (通俗理解:同时包含了预测框和真实框的最小框的面积,如下图中最外围的框),再计算出IoU,再计算闭包区域中不属于两个框的区域(\(A_c-U\))占闭包区域的比重,最后用IoU减去这个比重得到GIoU。
GIOU与IOU相比:如果两个框没有相交,IOU始终为零,故IOU不能反映两者的距离大小。而两个不相交的框的距离越远,GIOU就越小,GIOU的最小值为-1。当两个框像如下所示的形式进行相交,此时GIOU退化成了IOU。
DIOU与CIOU
$GIOU\ loss = 1-GIOU 和IOU\ loss = 1-IOU $有收敛速度慢和定位精度低等缺点。接下来介绍DIOU与CIOU。
DIOU(Distance-IOU):\(DIOU=IOU-\frac{d^2}{c^2}\),d代表两个框中心的距离,c代表最小闭包区域的对角线长度。
DloU损失:
DloU损失能够直接最小化两个boxes之间的距离,因此收敛速度更快
一个优秀的回归定位损失应该考虑到3种几何参数:重叠面积、中心点距离、长宽比,DIOU已经考虑了前两者,所以CIOU多考虑长宽比,如下:
CIOU Loss(Complete-IoU):
$CIOU\ loss = 1-CIOU $
Focal loss(争议大,不知道有没有用)
Focal loss:
说明:
- 这里的p代表预测为目标的概率,1-p代表预测为背景的概率。
- \(\alpha\)用于平衡正负样本,即解决负样本一般远多于正样本的问题。
- \((1-p)^\gamma\)和\(p^\gamma\)能够降低易分样本的损失贡献,使得模型专注于学习难学习的样本。比如当样本为正样本时,使用的是公式\(-\alpha(1-p)^\gamma log(p)\),此时如果p很小,那么就可以认为这个样本很难学习,而公式中的\((1-p)^\gamma\)就会比较大,损失就会比较大,这就让模型学习难学习的样本。
【注】使用Focal loss的时候,主要数据不要标注错误,因为Focal loss专注于学习难学习的样本,如果标注错误就会学习错误。
【问题】作者的训练集得到\(\gamma=2,\alpha=0.25\)时,效果比较好。为什么\(\alpha\)小于0.5的效果比较好,不应该正样本的权重比较大吗?
yolov4
网络结构:
网络结构中最左边是一个主干网络,其他的部分就是一个PAN结构。PAN(Path Aggregation Network)结构其实就是在FPN(从顶到底信息融合)的基础上加上了从底到顶的信息融合。
CSP结构:
左图为CSPNet中的CSP结构,右图为yolov4中的结构。
【问题】IoU threshold(正样本匹配)没看懂,我对anchor和grid cell的理解是不是有错误?
【问题】gt和anchor左上角对齐是什么意思?
正样本匹配(我理解的)
每个Grid Cell都会产生三种anchor,每个Grid Cell产生的anchor的size都是一样的。
- 将GT和这三种Anchor左上角对齐,然后计算IoU。如果GT与某个Anchor的IoU大于给定的阈值,这就说明此anchor是有希望通过神经网络的参数调整变成gt,假设此anchor为anchor2。
- 根据GT的中心点定位到对应cell,这此cell的anchor2为正样本。
- 由于缩放后网络预测中心点的偏移范围已经从原来的(0,1)调整到了(−0.5,1.5),这就意味着不只是GT的中心点所在cell的anchor2为正样本,其他cell中的anchor2也可能为正样本,比如下图:
以第一幅图为例:gt的中心靠近左边和上面两个cell,由于网络预测中心点的偏移范围为(−0.5,1.5),所以这两个cell中的anchor2的中心有可能通过参数调整变成gt的中心,故这两个cell中anchor2也为正样本。实际上,左上角的cell(下图红色区域)的anchor2的中心也有可能通过参数调整变成gt的中心,但是YOLOv5源码中扩展Cell时只会往上、下、左、右四个方向扩展,不会往左上、右上、左下、右下方向扩展,所以左上角的cell的anchor2就没有设置为正样本。
yolov5 v6.1
相比yolov7,yolov5已经迭代了很近,而且是一个团队做的,最近又推出了yolov8,所以yolov5比较稳定,不会有太多bug。
yolov5/data/hyps/hyp.scratch-high.yaml可以看到使用了哪些数据增强策略。
接下来要做:
先看yolov5如何实现:https://www.bilibili.com/video/BV1T3411p7zR/
再看如何添加修改网络:
https://www.bilibili.com/video/BV1s84y1775U/
https://www.bilibili.com/video/BV1kS4y1c7Bm/
看https://www.cnblogs.com/codingbigdog/p/16987508.html的论文对应的源码,对yolov5进行修改
看一下yolov5 6.1的配置文件,网络是否和up主所说的一致。
先使用yolov5 来检测数据集中的行人。下载数据集。
yolov7看了还没总结,
现有的person search准确率很高,那么我可以参考yolo在保证准备率的同时提高速度,并进行比较。
yolov7
正样本分配策略:增加了正样本,提高了召回率
- 初筛:剔除不满足
0.25 <gt与anchor长宽比例<4
和IOU>a
(a可能为0.5等),然后计算类别预测损失,。综上根据损失排名后再进行第二次筛选
添加注意力机制到yolov5中
yolov5用到person search中
网络结构要变,最终的输出不用变
网络结构要变:需要添加对query的处理。
损失函数要变。
方案一:直接将query输入一个卷积网络中,然后将得到的结果和yolo中的某个特征层在channel方向进行拼接。这样做模型可能不收敛。按道理应该可以收敛,因为网络应该会自动学习如何进行匹配。修改网络可能会导致官方提供的预训练模型不可使用。。。
方案二:参照PSTR对yolov5进行修改。
接下来做:试试方案一。
不知道数据集CUHK-SYSU的标注文件中某些字段的含义,需要看一下PSTR或https://github.com/ShuangLI59/person_search中对CUHK-SYSU数据集的处理。
其他
【问题】“将输入图像分成SxS个网格(gird cell),如果某个物体的中心落在这个网格中,那么就由这个网格负责预测这个物体。”中是如何让某个网格预测某个物体?
神经网络输出框的位置,你直接和gt进行比较不就行了,分成grid的目的是什么?
没有在原图上将图像分成多个grid,而是说特征图上的每个点都会对应于原图中的某个区域,每个特征图上的每个点都代表对对应区域的预测。
【问题】对于步长,padding等的了解还不够深入
【问题】摘要中提到的5 FPS to 160 FPS是什么意思,代码中如何设置5FPS?
修改yolov5
https://www.bilibili.com/video/BV1kS4y1c7Bm/
在models/common.py
中修改网络结构
代码
多个不同的特征图,如何产生不同大小的框:只要设置不同特征图上生成的anchor大小不一样,就可以使得生成bbox的大小也不一样。
yolov5最后输出的1024个channel的特征图,如何会输入到最后一个1x1的卷积中,那么这个1x1的卷积的代码,在哪里,我得找出来。
需要在python train.py后面设置--cfg选项,这样才能使用对应yolov5s.yaml配置文件
train.py进行前向传播的几种情况:
- 计算stride,即计算原图到特征图缩小的倍数
- 计算模型的FLOPs
- 检查PyTorch自动混合精度(AMP)功能。
- 训练时
修改代码曾经遇到的问题
reid中也有类似学习率的东西需要修改一下。
Check PyTorch Automatic Mixed Precision (AMP) functionality. Return True on correct operation 发现失败了
yolov5中可以开启的功能:数据增强( 随机改变尺寸、)、 class weights 某一类的数量多且map低,则class weights大 然后class weights越大,越容易被采样进入网络进行训练、Focal loss
Epoch GPU_mem box_loss obj_loss cls_loss Instances Size
0/99 1.07G nan nan 0 6 640: 100%|██████████| 2802/2802 [18:19<00:00, 2.55it/s]
为什么会出现nan?
代码阅读——数据增强
https://www.bilibili.com/video/BV1wG4y1y7J6?p=20
可在yolov5/data/hyps/hyp.no-augmentation.yaml
中设置使用Mosaic的概率,可以使用train.py --rect
取消Mosaic。
train.py --rect
:将数据集按照宽高比进行排序,将相似宽高比的图片组合成batch,这样可以减少计算量,加快训练速度。
代码为yolov5/utils/dataloaders.py
中的load_mosaic()。【问题】不知道load_mosaic9()和load_mosaic()有什么区别?