YOLO 目标检测实战项目『原理篇』

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YOLO 目标检测实战项目『原理篇』相关的知识,希望对你有一定的参考价值。

参考技术A

在目标检测中,IoU 为预测框 (Prediction) 和真实框 (Ground truth) 的交并比。如下图所示,在关于小猫的目标检测中,紫线边框为预测框 (Prediction),红线边框为真实框 (Ground truth)。

在目标检测任务中,通常取 IoU≥0.5,认为召回。如果 IoU 阈值设置更高,召回率将会降低,但定位框则更加精确。

理想的情况,当然是预测框与真实框重叠越多越好,如果两者完全重叠,则交集与并集面积相同,此时 IoU 等于 1。

之前的目标检测方法需要先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。

YOLO 将识别与定位合二为一,结构简便,检测速度快,更快的 Fast YOLO 可以达到 155FPS。

YOLO 网络借鉴了 GoogLeNet 分类网络结构,不同的是 YOLO 使用 1x1 卷积层和 3x3 卷积层替代 inception module。如下图所示,整个检测网络包括 24 个卷积层和 2 个全连接层。其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。

如上图所示,损失函数分为坐标预测(蓝色框)、含有物体的边界框的 confidence 预测(红色框)、不含有物体的边界框的 confidence 预测(黄色框)、分类预测(紫色框)四个部分。

由于不同大小的边界框对预测偏差的敏感度不同,小的边界框对预测偏差的敏感度更大。为了均衡不同尺寸边界框对预测偏差的敏感度的差异。作者巧妙的对边界框的 w,h 取均值再求 L2 loss. YOLO 中更重视坐标预测,赋予坐标损失更大的权重,记为 coord,在 pascal voc 训练中 coodd=5 ,classification error 部分的权重取 1。

某边界框的置信度定义为:某边界框的 confidence = 该边界框存在某类对象的概率 pr (object)* 该边界框与该对象的 ground truth 的 IOU 值 ,若该边界框存在某个对象 pr (object)=1 ,否则 pr (object)=0 。由于一幅图中大部分网格中是没有物体的,这些网格中的边界框的 confidence 置为 0,相比于有物体的网格,这些不包含物体的网格更多,对梯度更新的贡献更大,会导致网络不稳定。为了平衡上述问题,YOLO 损失函数中对没有物体的边界框的 confidence error 赋予较小的权重,记为 noobj,对有物体的边界框的 confidence error 赋予较大的权重。在 pascal VOC 训练中 noobj=0.5 ,有物体的边界框的 confidence error 的权重设为 1.

YOLOv1 虽然检测速度快,但在定位方面不够准确,并且召回率较低。为了提升定位准确度,改善召回率,YOLOv2 在 YOLOv1 的基础上提出了几种改进策略

YOLOv2 中在每个卷积层后加 Batch Normalization (BN) 层,去掉 dropout. BN 层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。YOLOv2 通过使用 BN 层使得 mAP 提高了 2%。

目前的大部分检测模型都会使用主流分类网络(如 vgg、resnet)在 ImageNet 上的预训练模型作为特征提取器,而这些分类网络大部分都是以小于 256x256 的图片作为输入进行训练的,低分辨率会影响模型检测能力。YOLOv2 将输入图片的分辨率提升至 448x448,为了使网络适应新的分辨率,YOLOv2 先在 ImageNet 上以 448x448 的分辨率对网络进行 10 个 epoch 的微调,让网络适应高分辨率的输入。通过使用高分辨率的输入,YOLOv2 的 mAP 提升了约 4%。

YOLOv1 利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLOv2 去掉了 YOLOv1 中的全连接层,使用 Anchor Boxes 预测边界框,同时为了得到更高分辨率的特征图,YOLOv2 还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2 通过缩减网络,使用 416x416 的输入,模型下采样的总步长为 32,最后得到 13x13 的特征图, 然后对 13x13 的特征图的每个 cell 预测 5 个 anchor boxes ,对每个 anchor box 预测边界框的位置信息、置信度和一套分类概率值。使用 anchor boxes 之后,YOLOv2 可以预测 13x13x5=845 个边界框,模型的召回率由原来的 81% 提升到 88%,mAP 由原来的 69.5% 降低到 69.2%. 召回率提升了 7%,准确率下降了 0.3%。

YOLOv2 采用 Darknet-19,其网络结构如下图所示,包括 19 个卷积层和 5 个 max pooling 层,主要采用 3x3 卷积和 1x1 卷积, 这里 1x1 卷积可以压缩特征图通道数以降低模型计算量和参数 ,每个卷积层后使用 BN 层 以加快模型收敛同时防止过拟合。最终采用 global avg pool 做预测。采用 YOLOv2,模型的 mAP 值没有显著提升,但计算量减少了。

在 Faster R-CNN 和 SSD 中,先验框都是手动设定的,带有一定的主观性。YOLOv2 采用 k-means 聚类算法对训练集中的边界框做了聚类分析,选用 boxes 之间的 IOU 值作为聚类指标。综合考虑模型复杂度和召回率,最终选择 5 个聚类中心,得到 5 个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均 IOU 值,这使得模型更容易训练学习。

Faster R-CNN 使用 anchor boxes 预测边界框相对先验框的偏移量,由于没有对偏移量进行约束,每个位置预测的边界框可以落在图片任何位置,会导致模型不稳定,加长训练时间。YOLOv2 沿用 YOLOv1 的方法,根据所在网格单元的位置来预测坐标,则 Ground Truth 的值介于 0 到 1 之间。网络中将得到的网络预测结果再输入 sigmoid 函数中,让输出结果介于 0 到 1 之间。设一个网格相对于图片左上角的偏移量是 cx,cy。先验框的宽度和高度分别是 pw 和 ph,则预测的边界框相对于特征图的中心坐标 (bx,by) 和宽高 bw、bh 的计算公式如下图所示。

YOLOv2 结合 Dimention Clusters, 通过对边界框的位置预测进行约束,使模型更容易稳定训练,这种方式使得模型的 mAP 值提升了约 5%。

YOLOv2 借鉴 SSD 使用多尺度的特征图做检测,提出 pass through 层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。YOLOv2 提取 Darknet-19 最后一个 max pool 层的输入,得到 26x26x512 的特征图。经过 1x1x64 的卷积以降低特征图的维度,得到 26x26x64 的特征图,然后经过 pass through 层的处理变成 13x13x256 的特征图(抽取原特征图每个 2x2 的局部区域组成新的 channel,即原特征图大小降低 4 倍,channel 增加 4 倍),再与 13x13x1024 大小的特征图连接,变成 13x13x1280 的特征图,最后在这些特征图上做预测。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%.

YOLOv2 中使用的 Darknet-19 网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLOv2 采用多尺度输入的方式训练,在训练过程中每隔 10 个 batches , 重新随机选择输入图片的尺寸,由于 Darknet-19 下采样总步长为 32,输入图片的尺寸一般选择 32 的倍数 320,352,…,608。采用 Multi-Scale Training, 可以适应不同大小的图片输入,** 当采用低分辨率的图片输入时,mAP 值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高 mAP 值,但速度有所下降。**

YOLOv2 借鉴了很多其它目标检测方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度检测。除此之外,YOLOv2 在网络设计上做了很多 tricks, 使它能在保证速度的同时提高检测准确率,Multi-Scale Training 更使得同一个模型适应不同大小的输入,从而可以在速度和精度上进行自由权衡。

YOLO v2 对 YOLO v1 的缺陷进行优化,大幅度高了检测的性能,但仍存在一定的问题, 如无法解决重叠问题的分类等

将 256x256 的图片分别输入以 Darknet-19,ResNet-101,ResNet-152 和 Darknet-53 为基础网络的分类模型中,实验得到的结果如下图所示。可以看到 Darknet-53 比 ResNet-101 的性能更好,而且速度是其 1.5 倍,Darknet-53 与 ResNet-152 性能相似但速度几乎是其 2 倍。注意到,Darknet-53 相比于其它网络结构实现了每秒最高的浮点计算量,说明其网络结构能更好的利用 GPU。

YOLOv3 借鉴了 FPN 的思想,从不同尺度提取特征。相比 YOLOv2,YOLOv3 提取最后 3 层特征图,不仅在每个特征图上分别独立做预测,同时通过将小特征图上采样到与大的特征图相同大小,然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出 9 种尺度的 anchor box,将 9 种尺度的 anchor box 均匀的分配给 3 种尺度的特征图 .

在实际应用场合中,一个物体有可能输入多个类别,单纯的单标签分类在实际场景中存在一定的限制。举例来说,一辆车它既可以属于 car(小汽车)类别,也可以属于 vehicle(交通工具),用单标签分类只能得到一个类别。因此在 YOLO v3 在网络结构中把原先的 softmax 层换成了逻辑回归层,从而实现把单标签分类改成多标签分类。用多个 logistic 分类器代替 softmax 并不会降低准确率,可以维持 YOLO 的检测精度不下降。

对于对象检测,不仅要考虑精度,还要考虑实时运行的性能,虽然现在算力大幅度上升,但是普通的设备跑起来还是有点吃力。提高精度和加快速率仍是目标检测的重大课题,道阻且长!

参考:

YOLOv1 参考

YOLOv2 参考

YOLOv3 参考

https://mp.weixin.qq.com/s/yccBloK5pOVxDIFkmoY7xg :非极大抑制

目标检测yolov5简单实战

最近在学习计算机视觉目标检测的相关内容,主要学习了yolov5 7.0版本

博主也是初学者,最近刚学完李沐的动深和yolo部分内容,写的错误的地方还请指出

本文只会简单概述yolov5相关的原理,需要详细了解可以看如下博客

YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)_AI 菌的博客

yolov5整体网络架构

input部分,一般为图片输入

yolov5的图片输入部分,使用了Mosaic进行数据增强,将几张图片融合在一起,丰富了检测目标的背景,同时在计算batch_size normalization 时计算更快

backbone部分,一般为提取特征(feature_map)

使用Focus进行切片操作,切成很多特征图(转换为单张feature_map很小,通道数较多),不属于下采样

使用了CSP结构,将feature_map分为两个part,一个part用于继续使用网络处理,其余经过简单处理直接加在第一个part的输出上(整体与ResNet有区别,ResNet是整个加上去)

关于CSP,可以看这一篇博客

深度学习_经典网络_CSPNet网络详解_WeThinkIn的博客

neck部分,一般用于学习特征

使用了FPN+PAN,可以进行高低层特征融合

head部分,一般用于输出预测

和yolov3,yolov4类似,生成多尺度的anchors,可以进行多尺度的预测

同时,从yolov3开始使用logistic回归代替了softmax,可以进行多标签判定

以上是对于yolov5的简单理论介绍,下面进行一个简单的yolov5实战

安装yolov5 7.0

通过终端拉取yolov5安装包

要求在 Python>=3.7.0 环境中安装 requirements.txt ,且要求 PyTorch>=1.7

pytorch一定要安装gpu版本,不然训练速度会很慢

git clone https://github.com/ultralytics/yolov5

国内github访问速度较慢,可以使用镜像源

git clone https://gitcode.net/mirrors/ultralytics/yolov5.git

接着是安装依赖项

cd yolov5
pip install -r requirements.txt

如何测试安装是否成功?

linux系统,在yolov5文件夹输入

python detect.py

若linux系统中有多个python版本,有时候需要

python3 detect.py

windows系统则直接运行python文件即可

若运行成功且在runs/detect/exp有处理好的图片则说明运行成功

注:多次运行会出现exp1,exp2等等,如果你拉取的yolov5不是官方文件会出现这个问题

另外,在yolov5运行过程中经常出现如下字体缺少报错

Downloading https://ultralytics.com/assets/Arial.ttf

然后一直下载不下来(下载很慢之类的),可以先把这个字体下载好放在yolov5根目录里面

方法:

linux系统直接使用如下代码拉去字体文件

wget https://ultralytics.com/assets/Arial.ttf

windows系统可以下载好文件后拷贝

如果还是下载不了,可以使用我分享的这个文件

链接:https://pan.baidu.com/s/1-wvA_ft3q8WfWjPUWmyu-A?pwd=07l9

提取码:07l9

进行简单的yolov5实战

我是跟着这个博客做的,做出来的东西也差不多

【Yolov5】1.认真总结6000字Yolov5保姆级教程(2022.06.28全新版本v6.1)_若oo尘的博客-CSDN博客

唯一不同是我使用的是yolov5 7.0版本

我做出来的成品如下 目标检测王者荣耀-CSDN直播

以上是关于YOLO 目标检测实战项目『原理篇』的主要内容,如果未能解决你的问题,请参考以下文章

实战小项目之基于yolo的目标检测web api实现

Keras深度学习实战(15)——从零开始实现YOLO目标检测

YOLO_Online 将深度学习最火的目标检测做成在线服务实战经验分享

#yyds干货盘点#项目实战 <-; DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测

实战小项目之ffmpeg推流yolo视频实时检测

目标检测实战:4种YOLO目标检测的C++和Python两种版本实现