目标检测学习笔记(一)——YoloV4环境配置及代码实现

前言

环境配置

windows下的torch=1.2.0环境配置

查看有哪些 虚拟环境 :conda info --env

Anaconda+Pycharm环境下的PyTorch配置方法

参考

yolov3参考:

YOLOv3 深入理解

视频学习链接:

视频地址:Pytorch 搭建自己的YOLO3目标检测平台(Bubbliiiing 深度学习 教程)

博客地址:睿智的目标检测26——Pytorch搭建yolo3目标检测平台

源码地址


一、yoloV3算法原理及实现

参考:

睿智的目标检测26——Pytorch搭建yolo3目标检测平台

ResNet50 、 残差网络

神经网络学习小记录20——ResNet50模型的复现详解

昇腾

基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现v

yolov3 算法原理

实现代码darknet.py yolo3.py

img

主干提取网络 Darknet53 介绍

YoloV3所使用的主干特征提取网络为Darknet53,它具有两个重要特点:

1、Darknet53具有一个重要特点是使用了残差网络Residual,Darknet53中的残差卷积就是首先进行一次卷积核大小为3X3、步长为2的卷积,该卷积会压缩输入进来的特征层的宽和高,此时我们可以获得一个特征层,我们将该特征层命名为layer。之后我们再对该特征层进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer,此时我们便构成了残差结构。通过不断的1X1卷积和3X3卷积以及残差边的叠加,我们便大幅度的加深了网络。

残差网络的特点容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。

img

2、Darknet53的每一个卷积部分使用了特有的DarknetConv2D结构,每一次卷积的时候进行l2正则化,完成卷积后进行BatchNormalization标准化LeakyReLU

普通的ReLU是将所有的负值都设为零,Leaky ReLU则是给所有负值赋予一个非零斜率。以数学的方式我们可以表示为:

img

残差网络

参考:[神经网络学习小记录20——ResNet50模型的复现详解]((66条消息) 神经网络学习小记录20——ResNet50模型的复现详解_Bubbliiiing的学习小课堂-CSDN博客)

Residual net(残差网络):

将靠前若干层的某一层数据 输出直接 跳过多层 引入到后面数据层的输入部分。
意味着 后面的特征层的内容会有一部分由其前面的 某一层线性贡献。

其结构如下:

img

深度残差网络的设计是为了 克服由于 网络深度加深而产生的学习效率变低准确率无法有效提升的问题。

Darknet53

Darknet53 除了最开始的卷积块 Conv2D ,其他都是由残差网络构成的残差块Residual Block

img

PS:该图有一些小问题,宽高最小的特征层在经过Conv2D Block 5L的处理后,它的shape按照代码应该为(batch_size,13,13,512),而非图中的(batch_size,13,13,1024)。

  • 主干特征提取网络:提取特征

image-20210524153545354

输入是一个416x416x3——>进行下采样,宽高会不断的被压缩,在不断卷积之后 ,通道数(channel数/kernel的数目)由 3 逐渐增多,变为 1024。——>可以获得一堆特征层,用来表示输入进来图片的特征。

  • 下采样:

image-20201011092837904

52,52,256
26,26,512    会和  13,13,1024  层的上采样得到的特征层  进行堆叠,构建特征金字塔
13,13,1024   进行5次卷积的操作,会有两个方向的前进,即  分类预测  和  回归预测

  • 路径一:分类预测 和 回归预测的结果

image-20201011092845960

13×13×75 = 13×13×3×25 = 13×13×3×(20+1+4) 

13,13(把输入的图片划分成13 × 13的网格,每个网格上面存在 3 个先验框),75   -> 

13,13,3(3个先验框,它是预先标注在图片上的,用以检测物体)×25(25分为20+1+4)   ->   
13,13,3,20(框内部物体属于某一个类的概率,总共20个类)+1(判别是否有物体)+4(先验框的调整参数,4个参数确定一个框)

13×13×3×(20+1+4) 的理解:预测的结果判断各个网格(13)的 先验框(3)里 是否真的包含物体(1),然后判断物体的种类(20),然后对先验框进行 中心 和 宽高的调整(4),使其变成 预测框

  • 路径二:卷积后上采样

上采样会使得特征层宽高得到扩张, 会和 【26,26,512】 特征层进行堆叠,该过程就是在构建特征金字塔,利用特征金字塔可以进行多尺度特征融合,提取出更有效地特征。

image-20210524163713965

image-20201011093650791

26,26,512    会和  13,13,1024  上采样得到的特征层进行堆叠,构建特征金字塔
然后进行5次卷积  
得到:26,26,75  ——>   
分解:26,26,3x25   ——>   26x26x3x(20+1+4)

26x26x3x(20+1+4)理解同路径一:13×13×3×(20+1+4)
  • 路径三:

同理:

image-20201011094134564

预测部分

参考

神经网络学习小记录27——数据预处理

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

步骤:

从特征获取预则结果

预则结果的解码

在原图上进行绘制

训练部分

计算loss所需参数

pred是什么

target是什么

loss的计算过程

其他参考

yolo系列之yolo v3【深度解析】

img

DBL: 如图1左下角所示,也就是代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。

深度学习 BN 、LeakyReLU算法原理

resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。对于res_block的解释,可以在图1的右下角直观看到,其基本组件也是DBL。

concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

DBL

二维卷积操作(DarknetConv2D)

归一化(BatchNormalization)

非线性激活函数(LeakyReLU)

backbone

整个v3结构里面,是**没有池化层和全连接层**的(下采样层也叫池化层:池化层理解卷积层与池化层CNN 入门讲解:什么是全连接层)。

前向传播过程中,张量的尺寸变换是通过改变 卷积核 的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的1 / 2 5 1/2^51/25,即1/32。输入为416x416,则输出为13x13(416/32=13)。

yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。所以,通常都要求输入图片是32的倍数。可以对比v2和v3的backbone看看:(DarkNet-19 与 DarkNet-53)


二、YoloV4 算法原理

参见:睿智的目标检测30——Pytorch搭建YoloV4目标检测平台

YOLOV4改进的部分

1、主干特征提取网络:DarkNet53 => CSPDarkNet53

2、特征金字塔:SPP,PAN

3、分类回归层:YOLOv3(未改变)

4、训练用到的小技巧:Mosaic数据增强、Label Smoothing平滑、CIOU、学习率余弦退火衰减

5、激活函数:使用Mish激活函数

主干特征提取网络Backbone

当输入是416x416时,特征结构如下:

img

三、YoloV4 算法程序实现

1 训练及预测步骤

训练 P10

VOC2007文件夹 和 voc2yolo4.py

image-20201103200444770

Annotations 存放标签文件

JPEGimages 存放对应图片文件

ImageSets —》 train.txt 存放图片去掉后缀的名字,由

运行voc2yolo4.py程序自动生成的:

image-20201103201812605

voc_annotation.py
  • 修改classes为自己要检测的对象

image-20201103202956749

  • 运行该py文件,得到:

image-20201103202205130

训练的时候,只需要调用2007_train.txt,即可获取 图片 位置信息 和 图片 内部的信息。

image-20201103202255354

注:文件修改路径后,2007_train.txt也要重新生成:

需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》,课程链接 https://edu.csdn.net/course/detail/29865【为什么要学习这门课】 Linux创始人Linus Torvalds有句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来!  代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进步优化和创新。YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。YOLOv4实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。【课程内容与收获】 本课程将解析YOLOv4实现原理和源码,具体内容包括:- YOLOv4目标检测原理- 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算- 代码阅读工具及方法- 深度学习计算的利器:BLAS和GEMM- GPU的CUDA编程方法及在darknet的应用- YOLOv4的程序流程- YOLOv4各层及关键技术的源码解析本课程将提供注释后的darknet的源码程序文件。【相关课程】 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括:《YOLOv4目标检测实战:训练自己的数据集》《YOLOv4-tiny目标检测实战:训练自己的数据集》《YOLOv4目标检测实战:人脸口罩佩戴检测》《YOLOv4目标检测实战:中国交通标志识别》建议先学习YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。【YOLOv4网络模型架构图】 下图由白勇老师绘制  
需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:原理与源码解析》 【为什么要学习这门课】 Linux创始人Linus Torvalds有句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来! 代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进步优化和创新。YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。YOLOv4实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。【课程内容与收获】 本课程将解析YOLOv4实现原理和源码,具体内容包括:- YOLOv4目标检测原理- 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算- 代码阅读工具及方法- 深度学习计算的利器:BLAS和GEMM- GPU的CUDA编程方法及在darknet的应用- YOLOv4的程序流程- YOLOv4各层及关键技术的源码解析本课程将提供注释后的darknet的源码程序文件。【相关课程】 除本课程《Windows版YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括:《Windows版YOLOv4目标检测实战:训练自己的数据集》《Windows版YOLOv4-Tiny目标检测实战:训练自己的数据集》《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》《Windows版YOLOv4目标检测实战:中国交通标志识别》建议先学习YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。【YOLOv4网络模型架构图】 下图由白勇老师绘制  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值