yolov3软件,yolov3算法原理

yolo v3:anincrementalimprovement又大又强,辉煌无比

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

YOLOv3的模型比以前的模型复杂很多,可以通过改变模型结构的大小来权衡速度和精度。

YOLOv3在Pascal Titan X上处理608×608图像的速度达到20FPS,在COCO test-dev上mAP@0.5达到57.9%,接近Retinanet(focalloss论文提出的单级网络)的结果

简单来说,YOLOv3的预检测系统利用分类器或定位符来执行检测任务。 他们将模型应用于图像的多个位置和比例。 评价高的区域可以视为检查结果。 另外,相对于其他目标检测方法,我们使用了完全不同的方法。 我们对整个图像应用了单个神经网络。 该网络将图像分割为不同的区域,预测各区域的边框和概率。 这些边界框以预测的概率加权。 我们的模型与基于分类器的系统相比有几个优点。 为了在测试时显示整个图像,其预测利用了图像内的全局信息。 与需要数千张单一目标图像的R-CNN不同,使用单一网络评估进行预测。 这使YOLOv3非常快,一般比R-CNN快1000倍,比Fast R-CNN快100倍。

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

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

3、详细情况:

要在图像上绘制一个框,表示yolov2的darknet-19型号yolov2的darknet-19 (就像在残差结构中引入了resnet一样),需要四个参数:中心点x轴、y轴坐标、框的高度和宽度。 参考FPN金字塔的特点,y1、y2、y3为多尺度,边长: 13、26、52,深度: 255,主要解决小目标检测。 这里,输出通道的数量为255:3*(4180 )=255,3,其中3表示一个网格锚中有三个边界盒,4表示框的四个坐标信息,1表示有无物体,80比特的类别。 s*s*b*(5c )固定尺寸: 416*416,为了防止变形,在边缘加灰色条。 分类器没有使用softmax,分类损失使用二进制交叉熵损失熵(binary cross-entropy loss ) 4、bbox进行预测

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

softmax为每个框分配一个类别(score中最大的类别),但在open Images这样的数据集中,目标可能有重复的类别标签,因此softmax将分为多个标签softmax被独立的logistics分类器所取代,精度不会降低。 为什么要使用sigmoid函数?

YOLO不预测边界框中心的绝对坐标,预测偏移量,预测结果通过sigmoid函数将输出值强制在0~1之间。 例如,如果对中心的预测为[ 0.4,0.7 ],左上角的坐标为[ 6,6 ],则中心位于1313特征地图上的[ 6.4,6.7 ]。 如果预测的x、y坐标大于1,例如,(1.2,0.7 ),则中心位于) 7.2,6.7。 请注意,当前中心位于图像的第七列第八列单元格中。 这打破了YOLO背后的理论。 这是因为,假设原始区域负责预测目标,则目标的中心必须位于该区域,而不是该区域旁边的其他网格。 为了解决此问题,输出通过sigmoid函数传递,该函数在0到1的范围内缩放输出,并有效地将中心保持在预测的网格上。

预测推理阶段时表示由tx、ty、tw、th的四个offsets和cx、cy、cw、ch (是已知的)、上图的回归式最终得到的边界坐标值为bx、by、bw、

实际上,图像在输入前会根据图像的长边按比例缩放到416,短边按比例缩放。 (图像不会变形变形。 )然后,将短边两侧填充为416。 这将确保输入图像为416*416。

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

为什么需要匹配呢? 你是监督学习。 我必须知道网络预测的结果是什么吗? 这样才能接近真正的标签。 相反,我现在让他们匹配,给他分配标签,然后让网一直这样学习,最后用假货乱真,输出的结果用无线电接近正确的结果。 yolov3的输出prediction的shape为num_samples、self.num_anchors、self.num_classes5)、grid_size、grid_size

,哪些框可能有目标呢,而且一个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的三个基本组件

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

其他基础操作:

Concat:风趣的皮皮虾拼接,会扩充两个风趣的皮皮虾的维度,例如26*26*256和26*26*512两个风趣的皮皮虾拼接,结果是26*26*768。Concat和cfg文件中的route功能一样。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/hcdcb6491/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

参考

https://blog.csdn.net/weixin_44791964/article/details/105310627

https://zhuanlan.zhihu.com/p/183781646

https://www.bilibili.com/video/BV1yi4y1g7ro?from=search&seid=260426214504sdf1404455

https://zhuanlan.zhihu.com/p/143747206

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注