YOLOv3

YOLOv3:An Incremental Improvement 做大做强,再创辉煌

速度和精度最均衡的目标检测网络。

YOLOv3的模型比之前的模型复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

YOLOv3在Pascal Titan X上处理608x608图像速度达到20FPS,在 COCO test-dev 上 mAP@0.5 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快4倍.
 

简而言之,YOLOv3 的先验检测(Prior detection)系统将分类器或定位器重新用于执行检测任务。他们将模型应用于图像的多个位置和尺度。而那些评分较高的区域就可以视为检测结果。此外,相对于其它目标检测方法,我们使用了完全不同的方法。我们将一个单神经网络应用于整张图像,该网络将图像划分为不同的区域,因而预测每一块区域的边界框和概率,这些边界框会通过预测的概率加权。我们的模型相比于基于分类器的系统有一些优势。它在测试时会查看整个图像,所以它的预测利用了图像中的全局信息。与需要数千张单一目标图像的 R-CNN 不同,它通过单一网络评估进行预测。这令 YOLOv3 非常快,一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。

1、backbone:darknet53 更好的网络结构(类ResNet),精度更好。融合多种先进方法,改进yolov1/v2缺点,且效果更优。

2、步骤:YOLOv3不过是把一张图片划分成不同的网格,每个网格点负责一个区域的预测,只要物体的中心点落在这个区域,这个物体就由这个网格点来确定。

3、细节:

  • 将yolov2的darknet-19的模型-------> YOLOv3 的darknet-53(类似于Resnet引入残差结构)
  • 在图片上画出box框需要四个参数:分别是中心点的x轴、y轴坐标、框的高和宽。
  • 借鉴FPN金字塔特征,y1,y2,y3为多尺度,边长:13,26,52,深度:255,主要解决小目标检测。其中,输出通道数为255:3*(4+1+80)=255,3表示一个格子的锚有3个bounding box,4表示框的4个坐标信息,1表示有无物体,80位类别。S*S*B*(5+C)
  • 固定尺寸:416*416,为了防止失真,边缘加灰条。
  • 分类器不在使用softmax,分类损失采用binary cross-entropy loss(二分类交叉熵损失熵)

4、bbox预测

YOLOv3不使用softmax对每个框进行分类,主要考虑因素有两个:

  1. softmax使得每个框分配一个类别(score最大的一个),而对于open Images这种数据集,目标可能有重叠的类别标签,因此softmax不适用于多标签分类。
  2. softmax可被独立的logistics分类器替代,且准确率不会下降。

为何使用sigmoid函数?

YOLO不预测边界框中心的绝对坐标,它预测的是偏移量,预测的结果通过一个sigmoid函数,迫使输出的值在0~1之间。例如,若对中心的预测是(0.4,0.7),左上角坐标是(6,6),那么中心位于13×13特征地图上的(6.4,6.7)。若预测的x,y坐标大于1,比如(1.2,0.7),则中心位于(7.2,6.7)。注意现在中心位于图像的第7排第8列单元格,这打破了YOLO背后的理论,因为如果假设原区域负责预测某个目标,目标的中心必须位于这个区域中,而不是位于此区域旁边的其他网格里。为解决这个问题,输出是通过一个sigmoid函数传递的,该函数在0到1的范围内缩放输出,有效地将中心保持在预测的网格中。

BCE 交叉熵

MSE最小均方误差

多类别分类multi-class 互斥 softmax  概率和为1

sigmoid:

\sigma\left (x_{i} \right ) = \frac{1}{1+e^{x_i}}

 torch.nn.BCEWithLogitsLoss()

softmax:

\sigma\left (x_{i} \right ) = \frac{e^{x_i}}{\sum e^{x_i}}

 torch.nn.CrossEntroploss()

torch.nn.BCELoss()、torch.nn.BCEWithLogitsLoss() 用于二分类问题, torch.nn.CrossEntropyLoss() 既可用于二分类又可用于多分类

预测推理阶段时,根据 tx,ty,tw,th这4个offsets,和 cx,cy,cw,ch(是已知的)及上图的回归公式倒推出最终得到的边框坐标值是 bx,by,bw,bh,即边界框bboxes相对于feature maps的位置和大小,是我们需要的预测输出坐标。最后再乘以stride再乘以原始图像的宽高就得到原图上的预测框。

其实图像在输入之前是按照图像的长边缩放为416,短边根据比例缩放(图像不会变形扭曲),然后再对短边的两侧填充至416,这样就保证了输入图像是416*416的。

注意点:loss计算时 anchor box与ground truth的匹配。

​ 为啥需要匹配呢?你是监督学习,那得知道网络预测的结果是啥呀?这样才能逼近真实的label,反过来就是我现在让他们匹配,给他分配好label,后面就让网络一直这样学习,最后就是以假乱真了,输出的结果无线接近正确结果了。​yolov3的输出prediction的shape为(num_samples, self.num_anchors*(self.num_classes + 5), grid_size, grid_size),为了计算loss,转换为(num_samples, self.num_anchors, grid_size, grid_size, 5+self.num_classes ), 其中self.num_anchors为3, 总共这么多boxes,哪些框可能有目标呢,而且一个cell对应有三个anchor boxes,究竟选择哪个anchor去匹配ground truth?

将每个锚框(anchor boxes)视为一个训练样本,需要标记每个anchor box的标签,即类别标签和偏移量。所以我们只需要考虑有目标的anchor boxes,哪些有目标呢?ground truth的中心落在哪个cell,那对应这三个anchor boxes就有,所以计算ground truth与anchor boxeses的IOU(bbox_wh_iou(计算Gw,Gh与Pw,Ph的IOU)),其实只需要选取重叠度最高的anchor box就行,再将三个anchores通过torch.stack后max(0)下就知道选择三个中的哪个了,将这种方式匹配到的boxes视为有目标的box。

YOLOv3在mAP@0.5及小目标APs上具有不错的结果,但随着IOU的增大,性能下降,说明YOLOv3不能很好地与ground truth切合。

图为带有维度先验和定位预测的边界框,我们边界框的宽和高作为离聚类中心的位移,并使用sigmoid函数预测边界框相对于滤波器应用位置的中心坐标。 仍采用之前的logis,其中cx,cy是网格的坐标偏移量,pw,ph是预设的anchor box的边长.最终得到的边框坐标值是b*,而网络学习目标是t*,用sigmod函数、指数转换。

第4行说明:loss分3部分组成:
第1行代表geo_loss,S代表13,26,52,就是grid是几乘几的。B=5。
第2行代表confidence_loss,和YOLO v2一模一样。
第3行代表class_loss,和YOLO v2的区别是改成了交叉熵。

5、总结:

YOLOv3改进了小物体检测

YOLOv4是在v3基础上的守正出新。

网络结构图

绘制网络结构图受到Yolov3另一位作者文章的启发,包括下面Yolov4的结构图,确实,从总体框架上先了解了Yolov3的流程。再针对去学习每一小块的知识点,会事半功倍。

上图三个蓝色方框内表示Yolov3的三个基本组件

  1. CBL:Yolov3网络结构中的最小组件,由Conv+Bn+Leaky_relu激活函数三者组成。
  2. Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
  3. ResX:由一个CBLX个残差组件构成,是Yolov3中的大组件。每个Res模块前面的CBL都起到下采样的作用,因此经过5次Res模块后,得到的特征图是608->304->152->76->38->19大小

其他基础操作:

  1. Concat:张量拼接,会扩充两个张量的维度,例如26*26*256和26*26*512两个张量拼接,结果是26*26*768。Concat和cfg文件中的route功能一样。
  2. add:张量相加,张量直接相加,不会扩充维度,例如104*104*128和104*104*128相加,结果还是104*104*128。add和cfg文件中的shortcut功能一样。

Backbone中卷积层的数量:

每个ResX中包含1+2*X个卷积层,因此整个主干网络Backbone中一共包含1+(1+2*1)+(1+2*2)+(1+2*8)+(1+2*8)+(1+2*4)=52,再加上一个FC全连接层,即可以组成一个Darknet53分类网络。不过在目标检测Yolov3中,去掉FC层,不过为了方便称呼,仍然把Yolov3的主干网络叫做Darknet53结构


yolov3-spp  和yolov4 map相差不大

YOLOv1 2016 CVPR  45FPS 448*448  63.4mAP 

YOLOv3输入尺寸问题 [参考](https://blog.csdn.net/pangxing6491/article/details/109822428)

1、python代码

https://github.com/ultralytics/yolov3

2、C++代码

https://github.com/AlexeyAB/darknet

3、 python版本的Tensorrt代码

除了算法研究外,实际项目中还需要将算法落地部署到工程上使用,比如GPU服务器使用时还需要对模型进行tensorrt加速。

(1)Tensort中的加速案例

强烈推荐tensort软件中,自带的Yolov3加速案例,路径位于tensorrt解压文件夹的TensortX/samples/python/Yolov3_onnx中

针对案例中的代码,如果有不明白的,也可参照下方文章上的详细说明:

代码地址:https://www.cnblogs.com/shouhuxianjian/p/10550262.html

(2)Github上的tensorrt加速

除了tensorrt软件中的代码, github上也有其他作者的开源代码

代码地址:https://github.com/lewes6369/TensorRT-Yolov3

4、 C++版本的Tensorrt代码

项目的工程部署上,如果使用C++版本进行Tensorrt加速,一方面可以参照Alexey的github代码,另一方面也可以参照下面其他作者的开源代码

代码地址:https://github.com/wang-xinyu/tensorrtx/tree/master/Yolov3

参考

睿智的目标检测26——Pytorch搭建yolo3目标检测平台_Bubbliiiing的学习小课堂-CSDN博客_睿智的目标检测26

你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (中) - 知乎

3.1 YOLO系列理论合集(YOLOv1~v3)_哔哩哔哩_bilibili

深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解 - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值