以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 !
实现思路
第一步:Pytorch搭建yolo3目标检测平台
模型yolov3和预训练权重下载
yolo3算法原理实现思路
一、预测部分
1、yolo3的网络模型架构和实现
2、主干特征网络darknet53介绍和结果(获取3个初始特征层)
3、从初始特征获取预测结果(最终的3个有效的特征层)
4、预测结果的解码(对最终的3个有效特征层的结果进行解码)
5、在原图上进行绘制(对解码的结果数据在原图绘制展现)
二、训练部分
1、计算loss所需参数
2、pred是什么
3、target是什么。
4、loss的计算过程
5、正式开始训练
第二步:使用Visdrone2019训练自己的模型yolov3模型
yolov3整体的文件夹结构
一、数据集准备
1.visdrone数据集训练
2.自己制作数据集训练
二、训练和效果展示
3.正式开始训练
4.训练效果
三、利用训练好了的模型进行预测
01
yolo算法原理实现思路
一.预测部分
1.yolo3的网络模型结构如下:
如图1所示:
输入一张图片任意大小的图片然后数据处理为416*416*3的图片大小到yolo3的模型中,首先经过主干特征提取网络darknet53会提取到3个初步的特征层用于进行目标检测,三个特征层位于yolo模型的主干特征提取网络darknet53的 不同位置,分别位于中间层P3、中下层P4、底层P5(P3,对应的是darknet从上向下的第3个网络模块,0开始),如上图红色框所示,三个特征层的shape分别为(52,52,256),(26,26,256),(13,13,1024)。
这里的52*52,26*26,13*13可视化的理解是指原始图片处理后得到模型可用的416*416的图片分为52*52,26*26,13*13大小的网格,也就是这样不同尺寸的特征图,分别用来检测小目标,中等大小的的目标,较大的目标,因为特征图其上我们预先设置的先验框的尺寸大小不一样,在13*13的特征图上(有最大的感受野)应用较大的先验框,用来检测较大目标,如下图所示,图中的蓝色框。
在由主干特征提取网络darknet53得到这样的3个初始特征层之后,还需要经过一定的处理,最终得到yolo3模型的最终3个有效的特征层out0(P5),out1(P4),out2(P3),也就是yolov3的网络预测结果。如上图1绿色框所示。
具体处理过程:
1.这个处理首先对P5经过5次卷积,之后有两个处理:一是再经过一次conv2D3*3和一次conv2D 1*1最终得到我们初始特征层P5的输出的有效特征层out0,用于检测小目标。二是P5这5次卷积之后的结果进行再一次卷积Conv2D和上采样UpSampling2D得到(batchsize,26,26,256),这用于和P4进行拼接。
2.P4和P5经过上采样之后的结果进行一个拼接Concat得到(batchsize,26,26,768)之后再次经过Conv2D Block 256这样的5次卷积之后得到(batchsize,26,26,256),然后也有俩个处理,和上述一样,一是再经过一次conv2D3*3和一次conv2D 1*1最终得到我们初始特征层P4的输出的有效特征层out1,用于检测中等大小的目标。二是进行Conv2D和上采样UpSampling2D用于和P3进行拼接。
3.P3和P4经过上采样之后的结果进行拼接之后,经过5次Conv2D Block 128之后,只有一个处理,就是一次conv2D3*3和一次conv2D 1*1即可最终得到我们初始特征层P3的输出的有效特征层out3。
2.主干特征网络darknet53介绍
YOLOv3相比于之前的yolo1和yolo2,改进较大,主要改进方向有:
1、主干网络修改为darknet53,其重要特点是使用了残差网络Residual,darknet53中的残差卷积块就是进行一次3X3、步长为2的卷积,然后保存该卷积layer,再进行一次1X1的卷积(用于减少通道数)和一次3X3的卷积(增加通道数),并把这个结果加上layer作为最后的结果, 残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。
残差块示意图:
将靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分。意味着后面的特征层的内容会有一部分由其前面的某一层线性贡献。深度残差网络的设计是为了克服由于网络深度加深而产生的学习效率变低与准确率无法有效提升的问题。
残差块
2、darknet53的每一个卷积部分使用了特有的DarknetConv2D结构,每一次卷积的时候进行l2正则化,完成卷积后进行BatchNormalization标准化与LeakyReLU。普通的ReLU是将所有的负值都设为零,Leaky ReLU则是给所有负值赋予一个非零斜率。以数学的方式我们可以表示为:
darknet53实现代码为:
详情请见:darknet53.py(定义主干darknet53的网络结构)
importtorch.nnasnn
importmath
领取专属 10元无门槛券
私享最新 技术干货