当前位置: 首页 > article >正文

目标检测文献阅读-YOLO:统一的实时目标检测(12.23-12.29)

目录

摘要

Abstract

1 引言

2 统一的检测

3 网络设计

4 训练

5 YOLOv5训练猫狗识别模型

5.1 项目代码整体结构介绍

5.2 数据集和预训练权重的准备

5.3 训练猫狗识别模型

5.3.1 修改数据配置文件

5.3.2 修改模型配置文件

5.3.3 训练模型

5.3.4 启用tensorbord查看参数

5.4 推理测试

总结


摘要

本周阅读的论文题目是《You Only Look Once: Unified, Real-Time Object Detection》(你只看一次:统一的实时目标检测)。本文中提出了一种单阶段的目标检测算法YOLO,YOLO舍弃候选框提取,直接采用回归的方法进行物体分类和候选框预测。并且与之前两阶段的基于分类器的方法不同,YOLO是直接在对应检测性能的损失函数上训练,整个模型是联合训练的。本文中YOLO将图片平均分成eq?S%5Ctimes%20S 个网格,每个网格分别负责预测中心点落在该网格内的目标。这样“分而治之”的策略避免了大量的重复计算,大大提升了目标检测的速度,每秒可以处理45帧图片,能够轻松地实时运行。YOLO还很好地泛化到新领域,使其成为要求快速、强大目标检测应用的理想选择。由此,YOLO迅速成为了实时目标检测领域的主流方法,并在多个应用场景中得到了成功实践。最后简单尝试在YOLOv5上使用一个小型的数据集训练了一个猫狗识别模型。

Abstract

This week's paper is titled "You Only Look Once: Unified, Real-Time Object Detection." In this paper, a single-stage object detection algorithm YOLO is proposed, which discards candidate box extraction and directly uses the regression method for object classification and candidate box prediction. And unlike the previous two-stage classifier-based approach, YOLO is directly trained on the loss function corresponding to the detection performance, and the whole model is jointly trained. In this paper, YOLO divides the image into eq?S%5Ctimes%20S grids, and each grid is responsible for predicting the target in which the center point falls within the grid. This "divide and conquer" strategy avoids a lot of double counting, greatly improves the speed of object detection, and can process 45 frames per second, which can be easily run in real time. YOLO also generalizes well into new areas, making it ideal for applications that require fast, robust object detection. As a result, YOLO has quickly become the mainstream method in the field of real-time object detection and has been successfully practiced in multiple application scenarios.Finally, a simple attempt was made to train a cat and dog recognition model on a small dataset on YOLOv5.

文献链接🔗:You Only Look Once: Unified, Real-Time Object Detection

1 引言

目前的目标检测系统重复利用分类器来执行检测。为了检测目标,这些系统为该目标提供一个分类器,并在不同的位置对其进行评估,并在测试图像中进行缩放。如R-CNN使用region proposal方法首先在图像中生成潜在的边界框,然后在这些提出的框上运行分类器。在分类之后,通过后处理对边界框进行修正,消除重复的检测,并根据场景中的其它目标重新定位边界框。这就使得目标检测流程太过于复杂,每个组件需要单独训练导致检测速度慢,难以优化。

而本文中将目标检测重构并看作为单一的回归问题,直接从图像像素到边界框坐标和类别概率,即you only look once(YOLO),就能预测出现的目标和位置。YOLO主要分为以下三步:

  • 将待测图像进行归一化处理:调整大小为448×448
  • 将处理后的图像输入CNN中进行特征提取以及边界框置信度的预测:进行卷积处理
  • 采用NMS算法过滤边界框获得最优结果:根据模型的置信度对所得到的检测进行阈值处理

f8df35ed390b497f943e744b839221f5.png

2 统一的检测

首先将输入图像分为eq?S%5Ctimes%20S 的网格。如果一个目标的中心落入一个网格单元中,该网格单元就负责检测该目标。

每个网格单元预测eq?B 个边界框和这些框的置信度分数。这些置信度分数反映了模型对该框包含对象的置信度,以及模型认为该框的预测准确度。置信度定义为eq?Pr%28Object%29%5Cast%20IOU_%7Bpred%7D%5E%7Btruth%7D 。如果该单元格中不存在目标,则置信度分数应为0。否则,置信度分数等于预测框与真实值之间的IOU。

每个边界框包含5个预测:eq?x%2Cy%2Cw%2Ch 和置信度。eq?%28x%2Cy%29 表示边界框相对于网格单元边界框的中心;宽度eq?w 和高度eq?h 是相对于整张图像预测的;置信度预测表示预测框与实际边界框之间的IOU。

每个网格单元还预测eq?C 个条件类别概率eq?Pr%28Class_i%7CObject%29 。这些概率以包含目标的网格单元为条件。本文中每个网格单元只预测的一组类别概率,而不管边界框的数量eq?B 是多少。

由此,乘上条件类别概率和单个框的置信度预测值就是每个框特定类别的置信度分数:

eq?Pr%28Class_i%7CObject%29%5Cast%20Pr%28Object%29%5Cast%20IOU_%7Bpred%7D%5E%7Btruth%7D%3DPr%28Class_i%29%5Cast%20IOU_%7Bpred%7D%5E%7Btruth%7D 

这些分数编码了该类出现在框中的概率以及预测框拟合目标的程度。

如下图所示,将图像分成eq?S%5Ctimes%20S 的网格,并且对于每个网格单元都预测eq?B 个边界框和这些边界框的置信度以及eq?C 个类别概率。这些预测结果被编码为eq?S%5Ctimes%20S%5Ctimes%20%28B%5Cast%205+C%29的张量。

616af78b3e7748d88d803589dc15fe28.png

在本文中使用eq?S%3D7 、eq?B%3D2 、eq?C%3D20 ,所以最终的预测是eq?7%20%5Ctimes%207%5Ctimes30 的张量。

3 网络设计

本文中YOLOv1的网络架构借鉴了GoogLeNet:

  • 网络输入:输入为448×448×3的图片;
  • 中间层:由若干卷积层和最大池化层组成,用于提取图片的抽象特征;一些卷积层交替使用 1×1减少层来减少特征图的深度;对于最后一个卷积层,输出7×7×1024的张量;
  • 全连接层:由2个全连接层组成,作为线性回归用来预测目标的位置和类别概率值;
  • 网络输出:输出7×7×30的预测结果,即每个网格两个边界框预测。

a4e5db1cc8a14d1299b22319b4bdbbf6.png

4 训练

预训练分类网络:使用网络的前20个卷积层再加平均池化层和全连接层,在其他大型数据集上进行预训练。网络输入为224×224,是由于有平均池化层,这样不论输入尺寸是多少,在和最后的全连接层连接时都可以保证相同的神经元数目。

训练检测网络:在预训练网络的基础上添加4个卷积层和2个全连接层,并且对权重进行随机初始化。

由于最后一层预测类别概率和边界框坐标,要通过图像宽度和高度来归一化边界框的宽度和高度,使它们落在0和1之间。同样,将边界框x和y坐标参数化为特定网格单元位置的偏移量,所以它们边界也在0和1之间。本文中最后一层使用线性激活函数,而其他层使用leaky ReLU激活函数:

fc514fad334d4f8c80460be711f5418b.png

YOLO中每个网格单元预测多个边界框,这可以使每个边界框预测器可以更好地预测特定大小、长宽比或目标的类别,从而改善整体召回率。

由此,得到由坐标预测损失、置信度预测损失和类别预测损失三部分组成的目标损失函数:

bbfbe0d1327240a0994d8ff8f858b7ca.png

由于定位误差比分类误差更大,为了优化模型输出的平方和误差,所以本文中增加了边界框坐标预测的损失eq?%5Clambda%20_%7Bcoord%7D%3D5 ,并减少了不包含目标边界框的置信度预测的损失eq?%5Clambda%20_%7Bnoobj%7D%3D0.5 。

分别来看,坐标预测损失:

2ca0581312244cc0a90661ffa809a5ab.png

  • eq?%5Cmathbb%7BI%7D%5E%7Bobj%7D_%7Bij%7D  :第eq?i 个网格单元中的第eq?j 个边界框预测器负责这个eq?obj 时为1,否则为0;
  • 第一行:负责检测目标的框中心点(x,y)定位误差;
  • 第二行:复杂检测目标的框的高宽(w,h)定位误差,为了增强小框的重要性,削弱大框的误差,本文中使用预测边界框宽度和高度的平方根。

置信度预测损失分为两部分:

  • 负责检测目标的预测框的置信度误差:

abe071acccb04b8fa5b825650ea425ea.png

  • 不负责检测目标的预测框的置信度误差:

d452245ea370477d80333414449bc26e.png

  •  eq?%5Cmathbb%7BI%7D%5E%7Bnoobj%7D_%7Bij%7D :第eq?i 个网格单元中的第eq?j 个边界框预测器不负责这个eq?obj 时为1,否则为0;与eq?%5Cmathbb%7BI%7D%5E%7Bobj%7D_%7Bij%7D 相反。

类别预测损失:

c415599297ba4ac4842221d08558b07e.png

  • eq?%5Cmathbb%7BI%7D%5E%7Bobj%7D_%7Bi%7D :这个eq?obj 中心出现在第eq?i 个网格单元中时为1,否则为0;eq?%5Cmathbb%7BI%7D%5E%7Bobj%7D_%7Bij%7D 为1,eq?%5Cmathbb%7BI%7D%5E%7Bobj%7D_%7Bi%7D 必为1。

5 YOLOv5训练猫狗识别模型

代码参考:GitHub - ultralytics/yolov5 at v5.0 

5.1 项目代码整体结构介绍

  • data:存放一些超参数的配置文件,这些yaml文件是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称
  • models:一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x,他们的检测测度分别都是从快到慢,但是精确度分别是从低到高
  • runs:包含一些训练运行时的信息,可以作为评判标准来告诉我们所训练的效果如何,帮助我们更好的研究模型的性能,还有目标检测的运行结果
  • utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等
  • weights:放置训练好的权重参数
  • detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测
  • train.py:训练自己的数据集的函数
  • test.py:测试训练的结果的函数
  • requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包 

14497d2c58b84687bd8cc5b62d0cca6f.png

5.2 数据集和预训练权重的准备

数据集分为图像和标签,而图像和标签里面又分为训练集和测试集,本次猫狗识别使用的训练集大小为1000张图片,测试集大小为125张图片:

1b6341f0760a4a12a757097bfcd9345c.png

图像标注可以参考如下方法:make-sense | 图像标注工具_makesense标注-CSDN博客

一般为了缩短网络的训练时间,并达到更好的精度,一般通过加载预训练权重进行网络的训练。预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。所以本次猫狗识别中采用了较小的一个预训练权重yolov5s.pt:

ac1b673199664b88aea61b266320e3ed.png

5.3 训练猫狗识别模型

训练目标检测模型需要修改两个yaml文件中的参数:data目录下的相应的yaml文件和model目录文件下的相应的yaml文件。然后修改train.py中主函数的一些参数就可以训练模型了。

5.3.1 修改数据配置文件

找到data目录下的voc.yaml文件,将该文件复制一份,将复制的文件重命名为CatDog.yaml:

e8413431f4724c918ecba5c9a9b0ab75.png

修改数据集位置、检测的类别数和类别名称:

c0f076b99ba6447f9b0f0a28b0da5a76.png

5.3.2 修改模型配置文件

同样,找到models目录下的yolov5s.yaml文件,将该文件复制一份,将复制的文件重命名为yolov5s_CatDog.yaml:

49c12e616c304ad7ab06946cff493dcb.png

修改类别数:

8bbc8e0ed2b04df68b4fe46e6956e355.png

5.3.3 训练模型

找到主函数的入口,这里面有模型的主要参数。模型的主要参数解析如下所示:

  • --weights:初始化的权重文件的路径地址
  • --cfg:模型yaml文件的路径地址
  • --data:数据yaml文件的路径地址
  • --hyp:超参数文件路径地址
  • --epochs:训练轮次
  • --batch-size:喂入批次文件的多少
  • --img-size:输入图片尺寸
  • --rect:是否采用矩形训练,默认False
  • --resume:接着打断训练上次的结果接着训练
  • --nosave:不保存模型,默认False
  • --notest:不进行test,默认False
  • --noautoanchor:不自动调整anchor,默认False
  • --evolve:是否进行超参数进化,默认False
  • --bucket:谷歌云盘bucket,一般不会用到
  • --cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
  • --image-weights:使用加权图像选择进行训练
  • --device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
  • --multi-scale:是否进行多尺度训练,默认False
  • --single-cls:数据集是否只有一个类别,默认False
  • --adam:是否使用adam优化器
  • --sync-bn:是否使用跨卡同步BN,在DDP模式使用
  • --local_rank:DDP参数,请勿修改
  • --workers:最大工作核心数
  • --project:训练模型的保存位置
  • --name:模型保存的目录名称
  • --exist-ok:模型目录是否存在,不存在就创建

需要修改的是weights、cfg、data这前三个参数和按需修改epochs、batch-size、workers:

4481127d70e341e3a71b4af13fb79a8e.png

然后运行train.py函数训练模型:

7a80c3c2ad6f48b986a54a5257aa22ce.png

ea424ed3c9eb4352bdf8237d97b7a6d1.png

5.3.4 启用tensorbord查看参数

在pycharm的命令控制终端,输入tensorboard --logdir=runs/train,就会出现一个网址地址,将那行网址复制下来到浏览器打开就可以看到训练的过程:

79acb1b55e114fdb88cf2fc261e361b9.png

5.4 推理测试

等到数据训练好了以后,就会在主目录下产生一个runs文件夹,在runs/train/exp/weights目录下会产生两个权重文件,一个是最后一轮的权重文件,一个是最好的权重文件。除此以外还会产生一些验证文件的图片等一些文件,如下:

8171f356e08f4c388e3c1a2212839623.jpeg

修改detect.py文件中的weights和source:

d2b4e5ed7bf84c07a719d5e287145352.png

就可以对图片、视频进行推理:

67a458ee937543b69c6cafe952da230c.png

图片推理结果: 

ebdadd7c24c541f6bc06566287c9500e.jpeg

c9e1a6b4664946c194a455e3cdb1dc68.jpeg

视频推理结果:

a5f6559ea19e4a09b4f5c7b1eb596a43.png

总结

YOLO使用单阶段网络,采用回归的方法进行物体分类和候选框预测。YOLOv1的优点如下:

  • 速度非常快:由于将检测视为回归问题,所以不需要复杂的流程,能达到每秒45帧的检测速度;
  • 全局推理:YOLOv1在训练期间和测试时会看到整个图像,所以它隐式地编码了关于类的上下文信息以及它们的外形,能够减少背景块误检;
  • 学习目标的泛化表征:YOLOv1能学习到目标非常通用的表示,当从自然图像到艺术品等其它领域泛化时,具有更优秀的表现。

虽然YOLOv1的检测速度很快,但是相应的它存在一些缺点:

  • 准确度低:YOLOv1在准确度上仍然落后于最先进的检测系统;
  • 小目标的检测效果不好:虽然YOLOv1可以快速识别图像中的目标,但它仍在努力精确定位一些目标,尤其是一些小目标,因为每个网格单元只预测两个框,只能有一个类别。

 


http://www.kler.cn/a/457907.html

相关文章:

  • 使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色
  • word运行时错误‘-2147221164(80040154)’ 没有注册类的解决办法
  • [pdf、epub]260道《软件方法》强化自测题业务建模需求分析共216页(202412更新)
  • 机械臂的各种标定
  • phpstudy2018问题(技巧)总结
  • SQL-Server链接服务器访问Oracle数据
  • Go的对象在内存中分配原理
  • 使用 Webpack 优雅的构建微前端应用❕
  • C++ 设计模式:工厂方法(Factory Method)
  • QT 学习第十四天
  • 8-Gin 中间件 --[Gin 框架入门精讲与实战案例] 【文末有测试代码】
  • 《XML Schema 字符串数据类型》
  • 【学生管理系统】环境搭建
  • 实测数据处理(CS算法处理:可斜视)——SAR成像算法系列(十一)
  • MVCC实现原理以及解决脏读、不可重复读、幻读问题
  • Docker添加镜像加速器
  • 短视频矩阵账号管理技术源码搭建详解,支持OEM
  • 生成对抗网络,边缘计算,知识图谱,解释性AI
  • 0基础学前端-----CSS DAY11
  • RK3566和Robo_C的EMC防护设计细节
  • MySQL 服务器简介
  • QWT 之 QwtPlotDirectPainter直接绘制
  • LeetCode430周赛T3
  • BAPI_BATCH_CHANGE在更新后不自动更新批次特征
  • 区块链安全常见的攻击——ERC777 重入漏洞 (ERC777 Reentrancy Vulnerability)【5】
  • 【每日学点鸿蒙知识】WebView事件监听、构建工具校验规则、避让区域问题、Grid布局对齐、字符串转base64