YOLOv8 从原理到代码实现的详细解读

该文章已生成可运行项目,

1.YOLOv8简介

       YOLO(you only look once)最早由华盛顿大学的Joseph Redmon和Ali Farhadi于2015年开发的流行目标检测和图像分割模型。

        YOLOv8是ultralytics公司在 2023 年 1月 10 号开源的,支持全范围的视觉AI任务,包括分类、检测、分割、姿态估计和跟踪。它只是一个算法框架(在github库的名字是ultralytics),这个框架支持以往所有版本的YOLO,并且能够在CPU到GPUs不同的硬件平台上运行。

2.YOLOv8的网络结构

3ea22d4f52424dec907dc0377b505db5.png

网络结构看起来非常复杂,但是仅仅从框架上理解不会很难。可以看这个视频解释得非常清楚。看这个视频前先把Ultralytics项目(yolo模型包)导入pycharm或者VScode看第3节),视频中会结合v8的样本文件来讲。

YoloV8Ultralytics模型结构详细讲解 带你学会Yolo的模型结构 小白也能学会的模型讲解教程_哔哩哔哩_bilibili

 🔵 网络有三个部分:

backbone:主干网络,用于图像特征提取

neck:进行特征融合

head:网络头部,进行解码,bbox边界框解码和class loss分类解码(主要是因为网络中对这两者的编码不方便我们解读,所以解码成我们常见的坐标和类别格式)

下面,这篇文章中对每个模块做了详细的解释:

YOLOv8详解 【网络结构+代码+实操】-CSDN博客

3,YOLOv8模型导入

建议跟着项目代码一起学习,这一步骤就是一起去看下项目代码。

3.1 虚拟环境配置

(1)安装Anaconda

可参考下方文章:

anaconda的安装和使用(管理python环境看这一篇就够了)-CSDN博客

(2)配置虚拟环境

虚拟环境可以将YOLOv8训练所需的依赖包和其他项目的依赖包隔离开来,避免版本冲突,而且更加便于管理。

在Anaconda prompt或者windows 命令行中输入

conda create -n yolov8 python=3.12.4

解释:虚拟环境的名字为yolov8,部署在虚拟环境中的python版本号为3.12.4.

(3)下载源代码

GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

可直接下载zip解压缩,也可用Git clone(需要先下载并安装Git软件,下载很快,安装的时候记得勾选to PATH选项)。存放的路径不要有中文。

如果操作不当,会出现ultralytics/ultralytics...嵌套的情况,一定选择第二层的utralytics用鼠标右键在pycharm中打开(注意,这里是文件夹嵌套的情况,就是打开ultralytics还要打开一个ultralytics才能看到文件列表)。

进入pycharm后,设置一下编译器,使用刚才创建的虚拟环境的编译器。

settings——python interpreter——add interpreter

323d1e4991da4e0b890f9e82e2391b24.png

点击三个点,找到刚才配置的虚拟环境的python。默认路径都是C:/Users/用户名/ .conda/envs/yolov8/python.exe

✔ 激活/进入虚拟环境,开始安装依赖:

 在pycharm的terminal或者windows的命令行中输入:

conda activate yolov8

(yolov8为自定义的虚拟环境名称)

56885339d6074ef2b0f45e38d006d537.png

如果在pycharm的terminal中输入conda命令无效,那根据这篇文章进行路径的配置:

pycharm终端配置,使用Anaconda_pycharm终端改不了anaconda位置-CSDN博客

继续安装模型所有依赖的ultralytics包

pip install ultralytics

(4)检测环境配置是否成功

在README文件中找到YOLOv8n,下载到项目代码的目录下。

799cb2b44ed8480c905a829b139838b1.png

运行下方推理(预测)命令:

yolo predict model=yolov8n.pt source='ultralytics/assets/bus.jpg'

如果运行过程中遇到ImportError: cannot import name '***' from 'collections'和No such command 'predict'的异常。

前者可以通过

[解决] 问题:ImportError: cannot import name ‘Callable‘ from ‘collections‘_importerror: cannot import name 'callable' from 'c-CSDN博客

后者的话重新卸载再安装ultralytics资源(setup.py已经在ultralytics包中了)

pip uninstall ultralytics
pip install ultralytics

然后再在终端运行

python setup.py install

最后执行推理命令

08cee7173db042168750b6991bdf7637.png

Speed说明,该图片在YOLOv8中的预处理时间为5ms,前向传播的时间为175.1ms,后处理时间为13.7ms,图像以1个批量,3个通道数,640像素宽, 480像素高进入网络。

3.2 代码结构

看到这样的项目目录结构

92eb4ef08598425c9879475f80db8be4.png

docker目录下用于进行各种环境下的封装使用(介绍Docker是什么)

改变软件行业的技术!程序员、软件爱好者必须掌握的Docker,到底是什么?_哔哩哔哩_bilibili

docs目录下存放各种说明文档;

examples目录下存放各种案例,部署到某种环境下或者和C++或python语言结合使用会用到;

runs目录存放模型输出结果,后面实训的时候可以自己定义;

tests目录下是自动化测试的脚本,测试命令行界面是否完善(test_cli.py),cuda是否正常(test_cuda.py),模型是否正常(test_python.py)等;

ultralytics目录下存放的是核心代码,assets是两张经典的测试图像,cfg目录下是配置文件(一些参数的默认值等在这里,datasets是数据集的配置文件,models模型配置文件,tracker是两个追踪的模型配置文件)

data目录下和数据处理相关;

engine目录下关于训练策略、预测方法和模型导出方法;

hub目录和可视化相关;

models目录下可以看到模型的网络结构;

nn目录下的modules可以看到网络的结构块,如C2f模块

solutions对应一些实际应用,如物体计数、队列管理等;

ultralytics.egg-info是安装时产生的安装文件;

gitignore是上传git时不需要使用的文件;

CITATION.cff 关乎引用以及如何为该项目做贡献的方式;

LICENSE 是使用许可需知,如果是mit/apache licence,那么把作者引用上去就可以,否则商用的话需要满足协议;

pyproject.toml 指明了需要的库及其版本

4. YOLOv8 重点内容

4.1 认识网络的超参数

(1)网络结构相关参数

在ultralytics-cfg-models-v8-yolov8.yaml的配置文件中有nc(类别数),scales(depth,width,max_channels)和各个模块的相关参数,在第2节的视频中有详细讲解

(2)代码中的默认参数或者训练策略设置

ultralytics-cfg-default.yaml

a5a6ebecaaec4b5c9ca51b32a427439d.png

4.2  损失函数

 3beed0530caa4e9582177bf280c51782.png

目标检测任务分为分类和定位两部分:分类损失(Cls Loss)用Focal Loss(解决类别不平衡的问题,关注难分类的对象);定位损失(Bbox Loss)用狄拉克分布函数(概率是无数个0和一个+∞,对于复杂问题是非常不灵活的)。

基于这两者,在YOLOv8中对于分类损失选择了CIoU和DFL,对于定位损失选择了BCE二进制交叉熵损失函数。最终用于反向传播的损失是这三个损失函数结果的加权和(代码如下)

【utils-loss.py--def __call__()函数】

027ef793613a46f992ac4380e08d0c43.png

loss[0]是CIoU LOSS,loss[1]是BCE LOSS,loss[2]是DFL。hyp.box,hyp.cls,hyp.dfl默认分别为7.5,0.5,1.5(在default.yaml的配置文件中)

🔴 注意,这三个损失函数均是针对正样本来计算的损失值:

正负样本的划分策略:使用了动态分布的策略中的TaskAlignedAssigner。该策略简单总结为:根据分类和回归的分数加权的分数选择正样本。根据如下公式计算出分数后,根据分数选取topK大的作为正样本,其余作为负样本。

188f2a38b1ce49dbbec0456fa23e44fe.png

对应代码:

公式定义在【ultralytics-utils-tal.py-get_box_metrics函数中】

align_metric = bbox_scores.pow(self.alpha) * overlaps.pow(self.beta)
overlaps[mask_gt] = self.iou_calculation(gt_boxes, pd_boxes)

下面介绍一下这三个损失函数:

0f018efd71ae4bf9a2ca18f4cd2e85cc.png

abb76ceb549c45c992ab6de15c30e8cc.png761797bceacd4b00ab46660382a26e82.png

4.3  训练数据增强

d8fd621720504071958c8c986a7c0395.png

  1. Mosaic:将四张图片随机裁剪并拼接成一张新的图片,增加样本多样性。
  2. RandomAffine:对图像进行随机仿射变换,包括旋转、缩放、平移和倾斜。
  3. MixUp(可选):通过将两张图片的部分区域混合在一起来生成新的训练样本。
  4. Albumentations(可选):使用Albumentations库进行更复杂的数据增强操作,如随机亮度调整、对比度调整等。
  5. Augment HSV:对图像的颜色空间(HSV)进行调整,包括色调、饱和度和亮度的变化。
  6. Horizontal Flip:对图像进行水平翻转
  7. LetterBox:将图像调整到指定大小,同时保持原始宽高比,边缘填充为指定颜色。

在最后10个epoch时关闭了数据增强,让网络的学习更加接近真实场景,可以提高模型的精度。

【ultralytics-cfg-default.yaml】

close_mosaic: 10 # (int) disable mosaic augmentation for final epochs (0 to disable)

5,YOLOv8项目实操

5.1 数据准备

建议自己去github上面找自己想要训练的数据集,当然也可以是自己的。这里我用的是PedestrianDetection数据集。n-aghaebrahim/Pedestrian-detection: Pedestrian detection using YOLOv8 for accurate and real-time results in computer vision applications. 🚶‍♂️👀 #YOLOv8 #PedestrianDetection (github.com)

进不去的可以用下面的数据集,这是up主“肆十二-”提供的数据集(带有标签):
百度网盘 请输入提取码 提取码:hete 

需要明确的是,训练数据集由图像(images)和标签(labels)组成。对于没有标签的数据集,下面进行标签标注。

标注图像

在虚拟环境下(虚拟环境相关见3.1(3))安装图像标注软件并启动:

pip install labelimg
labelimg

 f0d1096f4252408da54ec0537ffa33d7.png

 那个图标是YOLO就表示是符合yolov8要求的标注格式

目录按照下面这样新建好: 

654ae10386de48e18271796450fca492.png

 标签数据如下:

9cdf61795f3a474bbbe8faf66e4b9d3e.png

行数表示实例-人,每一行第一个数字类别int,第二三个数是边界框到中心点的坐标,第四五个数字是边界框的长和宽,做了归一化处理0-1之间,表示边界框占画幅的百分比

5.2 数据集配置

    打开 ultralytics文件夹 → cfg文件夹 → datasets文件夹

    新建file,我这里命名为A_my_data.yaml。这里为了方便我直接使用up主肆十二-提供的数据集,因为不用标注标签了(我马上就要学习进度汇报了😭)

# Train/val/test sets as
# 1) dir: path/to/imgs,
# 2) file: path/to/imgs.txt, or
# 3) list: [path/to/imgs1, path/to/imgs2, ..]

D:/00 ML/ultralytics/person_42_yolo_format  # 直接用绝对路径
train: # train images (relative to 'path') 16551 images
  - images/train    # 表示相对于path路径,即person_42_yolo_format目录下的images/train文件夹
val: # val images (relative to 'path') 4952 images
  - images/val
test: # test images (optional)
  - images/test

# Classes,实例的类别
names:
  0: person 

5.3 开始训练

在项目文件夹下新建一个train_main.py的文件,代码如下:

from ultralytics import YOLO

# load a model
model = YOLO("./ultralytics/cfg/models/v8/yolov8n.yaml")

# use the model
model.train(data="./ultralytics/cfg/datasets/A_my_data.yaml")

 训练完成可以得到如下结果(借用肆十二-博主的图,我的C盘直接给我跑红了,我就终止了)

aacbdf088c8b43609ccf76f0605c72e7.png

5.4 结果分析

其中如果你需要在你的报告中说明模型的训练过程和训练结果,使用最多的分别是results.png和PR_curve.png,如下图所示。(图片来源)使用YOLOv8训练自己的数据集(原理解析+数据标注说明+训练教程+图形化系统开发)_yolov8如何训练自己的数据集-CSDN博客

2376440b84d87c24da67e3caa63a0fd8.png

6fbd435ec1ea3880bdea1309d1508024.png

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值