YOLO论文系列笔记(上)

YOLO论文系列笔记(上)

参考的视频:YOLOv1-v3理论解析视频
参考的博客:YOLOV3理论解析
去年一直看的是劈拉吧啦老哥的代码解析,收获颇多,当时没有整理成文档,采用记笔记的方式,于是现在整理成文档,给想学目标检测的小小伙伴参考。老哥的代码解析对我的帮助很大,真的可以学到很多东西,可以说是我最佩服最喜欢的Up主和博主!!!没有之一
言归正传,追根溯源,先讲V1的思想,注意这里只解析论文中最核心的思想部分,实验部分我这里就不贴了。=o=

YOLO V1:You Only Look Once

1.论文思想

1)将一幅图像分成s*s个网格grid cell,如果某个object的中心落在这个cell中,则这个cell就负责预测这个object;
2)每个cell要预测B个bounding box,每个bounding box预测4个位置信息和一个置信度confidence值,并且每个cell还要预测C个类别的分数。如VOC2012数据集,使用S=7,B=2,C=20,最后的预测输出个数为7x7x(2x(4+1)+20)=7x7x30.
在这里插入图片描述
其中confidence为预测目标与GT的IOU值,confidence=Pr(Object)xIOU(GT,pred),当cell中确实有目标的时候,Pr(Object)=1,否则为0。
Pr(classi|Object)xPr(Object)xIOU(GT,pred)=Pr(classi)x
IOU(GT,pred).

2.网络框架

在这里插入图片描述
由于V1部分的主干特征提取网络框架不难,我这里也就不展开细讲框架的实现了。

3. Loss部分

在这里插入图片描述
第一部分为bounding box loss,第二部分为confidence loss,第三部分为class loss,使用的都是误差平方和sum-squared error。注意这里的boundinbox loss中的w和h不同于x和y,原因如下:
在这里插入图片描述
这也是我为什么如此喜欢噼里啪啦老哥的讲解,因为就是很细,并不像其他的一些博主和Up主,仅仅是作了论文的翻译,只提及提下基本的东西,深层次的理论并不会去分析,我觉得这对刚入门的学生来说是非常不友好的,因为我去年在看一些论文的解析博客时发现这不就是论文的翻译吗?基本上没有什么自己的理解在里面,更谈不上深层次的理论,全是翻译的话我为什么不去谷歌或者知云翻译呢?不来的更快些?以上全是本人学习快一年的感觉和想法,并没有针对某个博主和Up主,不可否认的是依旧还是有良心的博主和Up主的,希望以后会越来越多吧,而不再是简单的翻译或者是无脑的搬运。
扯远了,哈哈哈。。。

从上图可以看出,假设有两组预测的bbox和GT,并且这两组的偏移量都一致,但是可以明显的发现:在offset相同的前提下,小目标与GT的IOU值会比大目标与GT的IOU值小,因此在相同offset前提下,小目标的拟合程度并没有大目标的效果好。
红色线为y=x,当小目标与大目标的offset相同是,可以看出两组所导致的loss是相同的,这是不对的,因为相同的offset,小目标的误差会更大一些。不能简单的用均方误差,而是使用y=sqrt(x),在相同的offset前提下,从上图可看出小目标的loss会比大目标的loss大,满足需求。解释了为什么使用sqrt对w和h的loss求解。

4. YOLO V1的局限性

1)由于每个cell只预测两个bbox,并且每个cell预测的类别是同一类别,这就导致对密集的小目标的检测效果并不好;
2)当目标出现新的scales和aspect_ratio时,预测效果也不好;
3)主要的错误原因来自网络的定位不准确,由于V1是直接预测目标的坐标信息,而不像FasterRCNN和SSD,用预测的回归参数去拟合GT相对应anchor的回归参数。所以在V2版本以后,都采用基于anchor的机制去预测。

YOLO V2 -----YOLO9000: Better,Faster,Stronger

在这里插入图片描述
在这里插入图片描述
以上是在VOC 2007上的性能指标,常用的是YOLOv2 416x416版本。

1. Better章节

1)Batch Normalization

收敛更快,减少使用正则化方式Dropout的作用,mAP提升2个点相对于V1;

2)High Resolution Classifier

使用更高分辨率的分类器,微调ClassNet,使用448x448的输入,可获得4个点的mAP提升,V1中使用的是224x224的input image;

3)Convolutional with anchor boxes

基于anchor的预测而不是直接去预测坐标信息,不仅可简化问题,使得网络更加容易训练,使用anchor 之前的YOLO mAP为69.5%,recall为81%,使用anchor机制之后获得69.2的mAP以及88%的recall。虽然mAP有一个微小的下降,但recall的增幅还是很可观的,意味着模型有更大的提升空间。并且V2中去掉了V1的FC层和Pooling层,使用416x416的input,最后得到13x13(相当于比原图像的分辨率缩小了32倍)的feature map;

4)Dimension Cluster

anchor的聚类,不像Faster和SSD去手工设计prior boxes,而是采用K-means clustering去自动找到最佳的prior boxes,如果找到合理的prior boxes对于网络的训练和检测性能都有帮助。如果是用标准的欧式距离的K-means,尺寸大的框会比尺寸小的框有更多的误差,目的是为了提高IOU分数,这依赖于box的大小,则距离度量使用:d=1-IOU
实验中使用K=5,其实在论文中并没有去细说K-means是怎么得到anchors模板的,在源码中可以找到答案,后续我会补充K-means聚类获取anchors的代码;

5)Direct Location Prediction

直接在V1中使用anchor会存在一个问题:
模型不稳定,原因在于预测的bbox的中心坐标是没有限制的,先引入FasterRCNN中预测的encode过程:
pred_x = (x - xa) / wa; pred_y = (y - ya) / ha。
那么最终的预测结果需要decode得到:
x = pred_x * wa + xa; y = pred_y * ha + ya。
由于pred_x和pred_y是无限制的,那么anchor将有可能会出现在图像的任何一个位置,因此随机初始化模型需要训练一段较长的时间才能得到有用的offset,关于如何理解‘无限制的中心点坐标’以及为什么会造成训练的不稳定,下面给出图解:
在这里插入图片描述
图中的anchor的中心全部设置每个cell的左上角,网络并没有限制预测的pred_x和pred_y数值,有可能导致解码之后的框发生很大的偏移,如上图中的左上角的黄色框解码之后跑到右下角的黄色框,这是不合理的,因为右下角的cell是由该cell中的anchor如红色的框来负责检测,轮不到其他cell中(图中黄色框)的框来检测。这也就导致网络训练时不稳定的原因所在。

并且论文中关于bounding box的解码过程是错误的,原论文公式如下:
在这里插入图片描述
可以明显看到,这与Faster RCNN以及SSD中的encode是不一致的,这里的减号应该改成加号。

因此,V2中将pred_x和pred_y先经过sigmoid函数将其缩放至0-1之间,在经过encode过程,如下:
bx = sigmoid(pred_x) + cx;
by = sigmoid(pred_y) + cy;
bw = Pw x exp(pred_tw);
bw = Ph x exp(pred_th);
Pr(object) * IOU(b, object) = sigmoid(to) 其中to就是confidence置信度
其中,(pred_x,pred_y,pred_w,pred_h)是网络预测出来的regression回归参数;(cx,cy,Pw,Ph)是由K-means求得的anchor的中心坐标和宽高,(bx,by,bw,bh)才是网络的预测框相对于GT的真实坐标参数。
于是可以将预测的值限制在0-1之间,使用逻辑回归函数sigmoid来限制。保证每个anchor去负责预测目标中心落在某个grid cell区域内的目标,不会随即落在网格上的任意一个位置处,网络训练会更加稳定,更容易学习,相比于V1直接预测有5个mAP的提升。
在这里插入图片描述
上图是对预测框的解码过程:蓝色框为预测的回归参数经过encode得到的,虚线框为anchor,cx和cy为当前anchor的中心点距离特征图左上角的offset。

6)Fine-Grained Features

V1中对小目标检测效果太差,由于仅仅使用高层的feature map来做检测,小目标的细节信息将会变得非常模糊,而这些细节对于检测是非常重要的。类似于SSD中华使用不同尺寸的feature map,V2中使用一个Passthrough Layer来取得低层中某个feature map(26x26),类似于ResNet中的identity short cut。模型的提升大概有1个mAP。
在这里插入图片描述
其实这与其他one-stage检测算法中的Neck部分即feature fusion模块非常相似,将高分辨率的特征图经过下采样与高语义的特征图进行特征融合,如RetinaNet中的FPN;PANet;FPN+PANet;NAS-FPN以及EfficientDet中的BiFPN等等。一般包括两种分支上的feature fusion:bottom-up分支以及top-down分支。

那么Passthrough Layer是如何工作的呢?见下图:
在这里插入图片描述

7)Multi-scale trianing

不仅仅使用固定尺寸416x416的输入来训练网络,不具有鲁棒性。因此,每迭代10个epoch,网络会随机选择一个新的input size,输入图像的缩放因子为416/13 = 32, 故待选择的尺寸需要满足32的整数倍:{320, 352, 384,…,608 }最小尺寸为320,最大尺寸为608,实验结果如下:
在这里插入图片描述
不难看出,随着网络输入分辨率的增大,检测效果也是在增加的,因为大分辨率的图像对于小目标的检测会更加友好,但是会带来计算量和MAC的提升,降低推理速度。

2.Faster章节

Backbone使用DarkNet-19,其中的每个conv包括:卷积+BN+LeakyRelu三步。训练时,去掉DarkNet-19中的最后一个conv层(包括GAP以及softmax层),再额外增加3个conv层(均为3x3卷积,输出channel为1024),concat操作在最后一个3x3卷积之前,最后的输出使用一个1x1卷积,输出channel为(num_classses 20+bbox 4+ confidence 1)x5个bbox=125。
注意这里的concat是将主分支上的13x13的feature map与short cut上最后一个26x26x512的feature map做concat。

关于网络的训练细节论文中并没有明确指出,都已经习惯了,关于实现细节的地方,作者一般都不会提的,只能从源码中找答案。只有:weight decay 0.0005,momentum = 0.9
使用与V1和SSD中类似的数据增强技术,包括随机裁剪、颜色偏移等。

YOLO V3:An Incremental Improvement

在这里插入图片描述
在这里插入图片描述
第一幅图的纵坐标是COCO mAP:0.50-0.95(每次增加0.05)全部的AP值得均值。第二幅图的纵坐标是COCO AP50也就是VOC的评价指标。

1.网络架构

Backbone使用DarkNet-53,相比于DarkNet-19有更高的Top-1,几乎与resnet-101持平,并且比resnet-52的检测FPS高出两倍。有可能是因为:移除了所有的maxpooling层,使用残差结构的堆叠,原先的maxpool(2x2/2)用conv(3x3/2)来代替,并且比resnet-101的卷积核数目要少得多。具体网络架构如下:
在这里插入图片描述
每个Convolutional包括:conv+BN+LeakyRelu,其中的每个残差结构为1x1和3x3的两个卷积,并且是直接相加,为identity short cut。在3个预测特征图上去检测目标,并且每种特征图负责检测3种scale的目标,类似于SSD中的大特征图检测小目标小特征图检测大目标的思想。3种特征图为:13x13, 26x26, 52x52,每种特征图上预测3种scale的anchor;
最后的预测卷积层仅仅是一个卷积操作,没有BN+relu。输出tensor:NxNx(3x(4+1+80));
Predict one----13x13 feature map对应的anchor:(116x90),(156x198),(373x326);
Predict two----26x26 feature map对应的anchor:(30x61),(62x45),(59x119);
Predict three---- 52x52feature map对应的anchor:(10x13),(16x30),(33x23).

2.Bounding box的预测与YOLO v2相似

注意下面的图中anchor的位置的中心点坐标是在每个cell左上角的,与原论文不同,其他不变。anchor的坐标信息为(cx, cy, Pw, Ph)
在这里插入图片描述
上图相对于V2中的图有所改进,在anchor的部分,因为论文中说anchor的中心是在每个cell的左上角,论文中是将anchor与encode的中心放在一起绘制的,这其实是不严谨的。

3.正负样本的匹配

对每一个GT分配一个prior box,即一张图像有几个目标就有几个正样本。
正样(1):与每个GT的IOU值最大的anchor作为正样本,一个GT对应一个positive;
丢弃样本:与GT的IOU值不是最大的但是超过指定的某一个阈值(0.5)的anchor为丢弃样本;
负样本:对于剩下的样本全部为负样本
如果不是正样本,既没有class loss,也没有regression loss,仅仅只有confidence loss。

4.Loss function

在这里插入图片描述

1)confidence loss

论文中仅提到对每一个bounding box使用logistic regression也就是binary crossentropy,如下图:
在这里插入图片描述
其中oi属于[0,1],表示预测目标边界框与GT的IOU值;c为预测值,ci为c通过sigmoid得到的预测confidence即ci = sigmoid (c); N为正负样本数的总和.

2)class loss

对最后的结果不使用softmax,仅仅使用独立的逻辑回归分类器,在训练时候依旧使用binary crossentropy(BCE loss),如下:
在这里插入图片描述
其中Oij属于{0,1},当预测边界框i中存在第j类目标取1否则取0;
Cij为预测值,Cij_hat = sigmoid(Cij)得到目标概率;N为正样本个数。

3)regression loss

训练时候使用sum-of-squared error loss均方误差和,
N为所有正样本个数,如下:
在这里插入图片描述
其中(tx, ty, tw, th)为预测值,并且对于中心点坐标不能直接带进去求loss,而是使用sigmoid处理得到Lx = sigmoid(tx), Ly = sigmoid(ty), Lw = tw, Lh = th,并且不是将预测结果直接去拟合GT参数,而是将GT经过encode得到target_g,再利用预测结果L去拟合target_g
gx = GT_x - cx ; gy = GT_y - cy;
gw = log(GT_w / Pw); gh = log(GT_h / Ph)

关于YOLOV3_SPP-ultralytics版本以及YOLO V4的论文和代码解析留到下次,临近5月1号,在学习的同时记得放松一下,身体很重要!希望小伙伴们论文看得越来越多,代码撸得越来越快!!!╮( ̄▽  ̄)╭

YOLO-WASTE是一个与YOLO(You Only Look Once)目标检测算法相关的术语。它是YOLO的一个改进版本,旨在提高YOLO在垃圾分类领域的应用效果。YOLO-WASTE通过训练模型来实现对垃圾的自动分类和识别。该算法使用YOLO的核心思想,即将整张图作为网络的输入,并直接在输出层回归bounding box的位置和bounding box所属的类别。通过对标注数据进行训练,YOLO-WASTE可以准确地检测和分类不同类型的垃圾。同时,YOLO-WASTE还可以实现实时的目标检测,具有较高的速度和泛化能力。然而,与YOLO相同,YOLO-WASTE也存在一些缺点,如对相互靠近的物体和小群体的检测效果不佳,以及在处理大小物体时定位误差较大。因此,YOLO-WASTE仍然需要进一步改进和优化以提高其性能和准确性。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [【论文笔记】:YOLO v1](https://blog.csdn.net/qq_41375609/article/details/100898123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [YOLO V5 实操](https://blog.csdn.net/weixin_41929524/article/details/118915489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从现在开始壹并超

你的鼓励,我们就是hxd

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值