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的网络结构

网络结构看起来非常复杂,但是仅仅从框架上理解不会很难。可以看这个视频解释得非常清楚。看这个视频前先把Ultralytics项目(yolo模型包)导入pycharm或者VScode(看第3节),视频中会结合v8的样本文件来讲。
YoloV8Ultralytics模型结构详细讲解 带你学会Yolo的模型结构 小白也能学会的模型讲解教程_哔哩哔哩_bilibili
🔵 网络有三个部分:
backbone:主干网络,用于图像特征提取
neck:进行特征融合
head:网络头部,进行解码,bbox边界框解码和class loss分类解码(主要是因为网络中对这两者的编码不方便我们解读,所以解码成我们常见的坐标和类别格式)
下面,这篇文章中对每个模块做了详细的解释:
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

点击三个点,找到刚才配置的虚拟环境的python。默认路径都是C:/Users/用户名/ .conda/envs/yolov8/python.exe
✔ 激活/进入虚拟环境,开始安装依赖:
在pycharm的terminal或者windows的命令行中输入:
conda activate yolov8
(yolov8为自定义的虚拟环境名称)

如果在pycharm的terminal中输入conda命令无效,那根据这篇文章进行路径的配置:
继续安装模型所有依赖的ultralytics包
pip install ultralytics
(4)检测环境配置是否成功
在README文件中找到YOLOv8n,下载到项目代码的目录下。

运行下方推理(预测)命令:
yolo predict model=yolov8n.pt source='ultralytics/assets/bus.jpg'
如果运行过程中遇到ImportError: cannot import name '***' from 'collections'和No such command 'predict'的异常。
前者可以通过
后者的话重新卸载再安装ultralytics资源(setup.py已经在ultralytics包中了)
pip uninstall ultralytics
pip install ultralytics
然后再在终端运行
python setup.py install
最后执行推理命令

Speed说明,该图片在YOLOv8中的预处理时间为5ms,前向传播的时间为175.1ms,后处理时间为13.7ms,图像以1个批量,3个通道数,640像素宽, 480像素高进入网络。
3.2 代码结构
看到这样的项目目录结构

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

4.2 损失函数

目标检测任务分为分类和定位两部分:分类损失(Cls Loss)用Focal Loss(解决类别不平衡的问题,关注难分类的对象);定位损失(Bbox Loss)用狄拉克分布函数(概率是无数个0和一个+∞,对于复杂问题是非常不灵活的)。
基于这两者,在YOLOv8中对于分类损失选择了CIoU和DFL,对于定位损失选择了BCE二进制交叉熵损失函数。最终用于反向传播的损失是这三个损失函数结果的加权和(代码如下)。
【utils-loss.py--def __call__()函数】

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大的作为正样本,其余作为负样本。

对应代码:
公式定义在【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)
下面介绍一下这三个损失函数:



4.3 训练数据增强

- Mosaic:将四张图片随机裁剪并拼接成一张新的图片,增加样本多样性。
- RandomAffine:对图像进行随机仿射变换,包括旋转、缩放、平移和倾斜。
- MixUp(可选):通过将两张图片的部分区域混合在一起来生成新的训练样本。
- Albumentations(可选):使用Albumentations库进行更复杂的数据增强操作,如随机亮度调整、对比度调整等。
- Augment HSV:对图像的颜色空间(HSV)进行调整,包括色调、饱和度和亮度的变化。
- Horizontal Flip:对图像进行水平翻转
- 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

那个图标是YOLO就表示是符合yolov8要求的标注格式
目录按照下面这样新建好:

标签数据如下:

行数表示实例-人,每一行第一个数字类别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盘直接给我跑红了,我就终止了)

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


1635

被折叠的 条评论
为什么被折叠?



