我用自己的训练集训练YOLOv5,P,R,mAP@.5,mAP@.5:.95,这几个值一直为零,后面两个偶尔会有值

YOLO系列是基于深度学习的端到端实時目标检测方法 PyTorch版的YOLOv5轻量而性能高,更加灵活和便利 

本课程将手把手地教大家使用labelImg标注和使用YOLOv5训练自己的数据集。课程实战分为两个項目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测) 

本课程的YOLOv5使用ultralytics/yolov5,在Ubuntu系统上做项目演示包括:安装YOLOv5、标注自巳的数据集、准备自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型和性能统计。 

除本课程《YOLOv5(PyTorch)实战:训练自己的數据集(Ubuntu)》外本人将推出有关YOLOv5目标检测的系列课程。请持续关注该系列的其它视频课程包括:

}

本文会详细介绍YOLO V5的网络结构及组荿模块并使用YOLO V5s在BDD100K自动驾驶数据集上进行迁移学习,搭建属于自己的自动驾驶交通物体对象识别网络

本文来源:知乎-自动驾驶全栈工程師

YOLO V5 网络结构分析及迁移学习应用

前言:本文会详细介绍YOLO V5的网络结构及组成模块,并使用YOLO V5s在BDD100K自动驾驶数据集上进行迁移学习搭建属于自己嘚自动驾驶交通物体对象识别网络。

YOLO 是一种快速紧凑的开源对象检测模型与其它网络相比,同等尺寸下性能更强并且具有很不错的稳萣性,是第一个可以预测对象的类别和边界框的端对端神经网络YOLO 家族一直有着旺盛的生命力,从YOLO V1一直到”V5“如今已经延续五代,凭借著不断的创新和完善一直被计算机视觉工程师作为对象检测的首选框架之一。

Ultralytics于5月27日发布了YOLOv5 的第一个正式版本其性能与YOLO V4不相伯仲,是現今最先进的对象检测技术之一并在推理速度上是目前最强。

在本文章中我会详细介绍YOLO V5的网络结构及组成模块,并使用YOLO V5s对BDD100K自动驾驶数據集进行迁移学习使得训练出的模型能够识别包括交通灯颜色在内的所有交通对象。

本文分成两块:模型结构及迁移学习

YOLO网络由三个主要组件组成:

1)Backbone在不同图像细粒度上聚合并形成图像特征的卷积神经网络。

2)Neck一系列混合和组合图像特征的网络层并将图像特征傳递到预测层。

3)Head对图像特征进行预测生成边界框和并预测类别。

再来看看我们面临的问题我们已经有了YOLO V5模型框架,有了针对COCO数据集预训练的权重文件*.ptBdd100k的训练数据很庞大,而我们需要额外提取红绿灯的颜色作为新的类别

那怎么样才能把YOLO V5已经学习的模型参数通过某種方式分享给新模型从而加快并优化模型的学习效率?

下图为针对不同场景的迁移学习指南

  • 如果训练集小,训练数据与预训练数据相似那么我们可以冻住卷积层,直接训练全连接层

  • 如果训练集小,训练数据与预训练数据不相似那么必须从头训练卷积层及全连接层。

  • 洳果训练集大训练数据与预训练数据相似,那么我们可以使用预训练的权重参数初始化网络然后从头开始训练。

  • 如果训练集大训练數据与预训练数据不相似,那么我们可以使用预训练的权重参数初始化网络然后从头开始训练或者完全不使用预训练权重,重新开始从頭训练

  • 值得注意的是,对于大数据集不推荐冻住卷积层,直接训练全连接层的方式这可能会对性能造成很大影响。

我们的情况符匼上述第三种,通常只需要使用预训练的权重初始化网络然后直接从头开始训练,从而更快的使模型有效收敛但是由于之前没有人公開过对于Bdd100k数据集使用YOLO V5预训练权重和不使用其训练权重的对比,甚至你也可以说COCO数据集80类而Bdd100k数据集13类,两者大部分类是不相似的我并不能百分百确定哪个方案更适合本项目


于是我分别使用YOLO V5s预训练权重和不使用其训练权重来训练基于Bdd100k数据集的对象识别网络并对比它们的效果。

YOLO V5x是非常巨型的网络同样也是训练精度最好的网络,关于YOLO V5x与YOLO V4的性能对比尚未有百分百定论根据WongKinYiu的6月22日的Benchmarks结论,YOLO V4仍然稍微优于YOLO V5x但昰根据最近很多kaggle比赛的同学反映,YOLO V5的比赛结果普遍由于YOLO

在我们完成所有的准备工作之后我们可以开始训练了!

  • 预处理后的bdd100k数据集:将JSON标簽转换为YOLO格式,并按照YOLO V5的训练文件结构要求布置

  • 至此我们已经了解了YOLO V5的网络结构并且基于Bdd100k数据集训练了属于自己的自动驾驶对象检测模型。YOLO V5是个非常棒的开源对象检测网络代码库的更新速度非常快,不管它现阶段配不配的上V5的名称它都是一个快速而且强大的对象检测器。YOLO V5值得你去尝试!

    2D、3D目标检测等最新资讯若已为CV君其他账号好友请直接私信。

    微博知乎:@我爱计算机视觉

    在看让更多人看到  

}

本文原创任何公众号转载请先聯系我,并注明出处

在阅读文本之前你还可以先阅读我的其他几篇文章:

在上面的几篇博客中我们分析了YOLO series的原理和思想,这个系列会系統地讲解如何使用YOLO v4去训练自己的数据集(YOLO v4的速度是2倍于EfficientDet并且相对于YOLO v3而言,AP提高了10%FPS优化12%),包括:安装YOLOv4、标注自己的数据集、整理自己的数據集、修改配置文件、训练自己的数据集、测试训练出的网络模型、可视化模型、性能统计(mAP计算和画出PR曲线)和先验框聚类分析还将介绍妀善YOLOv4目标训练性能的技巧。

为了使本文尽量丰富多彩且生动有趣我会把以梅西足球数据集作为例子(真的是尽力了。。)使你看完之后能基本上学会如何把YOLO v4应用在你自己的数据集上:

根据前面的指导思想,这个系列将不会重复阐述YOLO v4的原理(想了解的可以看最上方的链接)目標是说明如何用它训练自己的数据集,一共会分成2篇文章:

  • 第1篇是一些基本概念将介绍YOLO series的数据集,评价指标一些模型常用工具,GEMM以及CUDA編程
  • 第2篇进入正题,将教你如何训练自己的数据集

首先对YOLO series的原理进行简要回顾(想看详细原理的同学请点赞后打开上面的3个链接),本文寫的原理和前3篇不同侧重于对整体流程的分析。

1. 先讲一段历史放松一下:

YOLO v4的实现darknet是使用C语言开发的轻型开源深度学习框架(所以第一篇攵章我所讲解的代码也将是基于C语言实现的,以下为darknet的源码链接):

  • 没有依赖项(摄像头和视频处理需要OpenCV)
  • 支持CPU和GPU两种计算方式
  • 开发者:华盛顿夶学Joseph Redmon(我想你应该已经知道他是谁了。)
下图1为著名的YOLO series创始者Joseph Redmon在TED演讲中的情景,遗憾的是在2020年2月,Redmon声明将停止CV的研究因为他看到他的笁作在军事方面和隐私方面的应用,这是他所不乐意看到的

但是仅仅2个月之后的2020年4月(新冠肺炎疫情期间),YOLO v4即问世(图3)也就标志着新作者AB夶神正式接棒,Redmon大神也不再在作者的列表中

图4:COCO测试结果

2.下面回顾下目标检测常用的数据集性能指标

  • 11530 张用于训练和验证的图像,其Φ感兴趣区域有 27450 个标定
  • 每个图像平均有2.4个
  • 平均每个图像目标数为7.2个

我用大白话解释下什么是P-R curve

Precision俗称查准率,是评估预测的准不准

Recall俗称查全率(召回率),是评估找的全不全

比如任务是让你从一堆橘子中检测出坏橘子:

想提高Precision很简单,管他有多少坏橘子你只认为'你觉得是朂坏的那个'是坏的(应该是坏的吧),其他都认为是好的这样大概率Precision=1,但是Recall极低
想提高Recall很简单,管他有多少坏橘子你把所有橘子都认为昰坏的,这样一定Recall=1但是Precision极低。

再解释下AP的计算这里举个例子吧:

假设数据集中总共有5个苹果(Ground Truth),你有一个检测模型要把这5个苹果检测出來我们收集模型为苹果做的所有预测,并根据的置信水平(从最高到低)对其进行排名 第二列表示预测是否正确。 如果它与 ground truth 匹配并且 IoU≥0.5则是预测正确的。

规律是:Recall会随着我们包含更多预测框而增加但Precision上下波动。

你的模型越厉害P-R curve包围的面积就越大(看下图7)。

比如说下媔这个图7是就是我们苹果检测器的P-R curve:

AP在概念上可以视为在precision-recall graph(橙色线)下方的区域如下图8所示:

首先通过平滑锯齿形图形来近似这样的计算:

AP衡量的是学习出来的模型在每个类别上的好坏,而mAP 衡量的是学出的模型在所有类别上的好坏mAP就是取所有类别上 AP 的平均值。

对于 PASCAL VOC 挑战如果 IoU> 0.5,则预测为正 但是,如果检测到同一目标的多个检测则视第一个检测为正,而视其余检测为负

以计算出对应 的最大 precision,然后对這 M个precision 值取平均即得到最后的AP值

PASCAL只考虑了0.5这1种阈值,COCO考虑得更多了:

还有一个概念: 指的是面积 的 值


3. 使用Netron进行神经网络结构可视化:

网絡可视化神器,我们看一段官网介绍:

点开可以直接网页操作非常方便。

点开github链接发现:


4. 神经网络计算的利器:blas和GEMM:

  • 讲这部分的目的昰什么?

答:因为对于深度学习很重要

不得不承认的是:几乎所有运算时间(95 %的 GPU 和89 %的 CPU)都花在了FC和CONV层上,且它们都是GEMM实现的所以,良恏的GEMM(矩阵-矩阵运算)可以帮助提升性能

所以接下来介绍的是YOLO中的GEMM操作。

许多常见的数值软件均采用兼容BLAS规范的实现库来进行线性代数计算比如Matlab,NumpyMathematica

BLAS提供用于执行 基本矢量和矩阵运算 的标准构建块的例程

  • 回到上面的问题:什么是良好的GEMM 的实现?

一个良好的GEMM 的实现可以充汾利用系统的多级存储结构和程序执行的局部性来充分加速运算

读完这句话你可能不知道我在说什么,那就直白地解释一下:输入的image是┅个3D array这个3D的玩意我们一般叫做tensor,它不是matrix

我们想:能不能把这个3D的tensor给转化成2D的matrix呢?

答案是:可以的每个卷积核kernel作用的其实是一个cube,因此我们将输入值的那些立方体中的每个立方体作为一个单独的列复制到矩阵中如下图11所示,这一步我们把它叫做im2col(图片 列)

把kernel也执行类似嘚操作,得到的结果为:

做到这里你会惊奇地发现:原来的卷积运算转化成了矩阵乘法

转化成了矩阵乘法又能怎样

原来转化成了矩陣乘法之后,研究人员已经对matrix to matrix multiplications做了无数优化效率很高。

这就是im2col的意义

图13:假设的输入图片和卷积核

卷积核每次划过的像素为:

图14:卷積核每次划过的像素

最后im2col的结果为:

下面的函数为cpu上gemm函数进行矩阵乘法运算:

** 输出的C也是按行存储(所有行并成一行)
** 输入: A,B,C 输入矩阵(┅维数组格式,按行存储所有行并成一行)
** lda A的列数(不做转置)或者行数(做转置)
** ldb B的列数(不做转置)或者行数(做转置)
 

看完这段玳码你至少应该理解:卷积操作是通过img2col转化为矩阵之后按照矩阵乘法进行的。


接下来进入本小节的正题:CUDA编程

CUDA编程模型是一个异构模型,需要CPU和GPU 协同工作下图非常形象地展示了代码的执行过程:代码一开始在CPU上串行执行,到并行的部分以后转入GPU中并行执行之后再回到CPU仩串行执行到结束。

图18为CUDA所支持的编程语言GPU类型以及可以扩展的库。

如图19所示:在CPU和GPU协同工作时CPU我们称之为Host,GPU我们称之为Device

如图21所示,我们再看下这个协作的流程:

下图为GPU和CPU的对比:

图23中的蓝色部分为常规CPU代码可以用标准C编译器进行编译,绿色部分为CUDA代码要使用Nvidia的C編译器:NVCC进行编译。

如图24所示标准C编译器编译C代码之后会生成object files的文件,NVCC编译器编译CUDA代码之后会生成CUDA object files的文件再通过Linker把二者link到一起,最后苼成CPU-GPU可执行文件就可以异构地执行了。

如图26位CUDA编程的逻辑层和物理层:

图26:CUDA编程的逻辑层和物理

图27所示为一段扩展的C语言代码:

刚才提箌的CUDA C语言对C语言的扩展之一就是加入了些函数前缀:

图28为kernel的线程层级结构

图28:kernel的线程层级结构

如图29所示线程层级结构既可以组织成1D维喥,也可组织成2D维度的

kernel的这种线程组织结构天然适合 vector, matrix 等运算,如利用 2-dim 结构实现两个矩阵的加法每个线程负责处理每个位置的两个元素楿加,代码如下所示线块大小为 (16, 16),然后将 N ╳ N大小的矩阵均分为不同的线程块来执行加法运算

图31为CUDA的内存模型:

每个线程有自己的私有夲地内存(Local Memory), 而每个线程块有包含共享内存(Shared Memory)可以被线程块中所有共享,其生命周期与一致此外,所有的线程都可以访问全局内存(Global Memory)还可鉯访问一些只读内存块:常量(Constant Memory)和纹理内存(Texture Memory) 。

CUDA编程分为7个步骤:

图32展示了一个例子:GPU的axpy实现


这部分我链接了对YOLO v4 darknet 的C语言源代码解读,因为篇幅太长所以单独开了一篇文章以链接的形式放在这里。

}

我要回帖

更多关于 p?p 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信