YOLOv8目标检测算法

YOLOv8目标检测算法相较于前几代YOLO系列算法具有如下的几点优势:

  • 更友好的安装/运行方式
  • 速度更快、准确率更高
  • 新的backbone,将YOLOv5中的C3更换为C2F
  • YOLO系列第一次尝试使用anchor-free
  • 新的损失函数

YOLOv8简介

YOLOv8 是 Ultralytics 公司继YOLOv5算法之后开发的下一代算法模型,目前支持图像分类、物体检测和实例分割任务。YOLOv8 是一个 SOTA 模型,它建立在之前YOLO系列模型的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括:一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数,可以在从 CPU 到 GPU 的各种硬件平台上运行。注意到ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 Ultralytics这个单词,原因是Ultralytics这个库的定位是算法框架,而非特指某一个特定算法,其希望这个库不仅仅能够用于 YOLO 系列模型,同时也能支持其他的视觉任务如图像分类、实例分割等。下图画图YOLOv8目标检测算法同其他YOLO系列算法(YOLOv5、6、7)的实验对比图,左边是模型参数量对比,右边是速度对比。

下面两个表分别是YOLOv8和YOLOv5(v7.0版本)官方在 COCO Val 2017 数据集上测试结果,从中看出 YOLOv8 相比 YOLOv5 精度提升大,但是 N/S/M 模型相应的参数量、FLOPS等提高了不少。

YOLOv8概述

  • 提供了一个全新的SOTA模型,和YOLOv5一样,基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型,用于满足不同场景需求,同时支持图像分类、目标检测、实例分割和姿态检测任务
  • 在骨干网络和Neck部分将YOLOv5的C3结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数,大幅提升了模型性能;需要注意的是C2f 模块中存在Split等操作对特定硬件部署没有之前那么友好
  • Head部分换成了目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based换成了Anchor-Free
  • Loss 计算方面采用了 TaskAlignedAssigner 正样本分配策略,并引入了 Distribution Focal Loss

下图画出YOLOv8目标检测算法的整体结构图,原图从mmyolo仓库(github.com/open-mmlab/...

YOLOv8模型

YOLOv8目标检测算法的模型配置文件如下:

从配置文件可以看出,YOLOv8与YOLOv5模型最明显的差异是使用C2F模块替换了原来的C3模块,两个模块的结构图(原图:mmyolo.readthedocs.io/zh_CN/lates...

另外Head 部分变化最大,从原先的耦合头变成了解耦头,并且从 YOLOv5 的 Anchor-Based 变成了 Anchor-Free。其结构对比图(原图:mmyolo.readthedocs.io/zh_CN/lates...

当然YOLOv8相较于之前YOLO系列算法还有其他的改变,具体参考官方源码库(github.com/ultralytics...

YOLOv8安装

(1)直接安装: pip install ultralytics

(2)下载仓库安装:git clone github.com/ultralytics...

cd ultralytics

pip install -e .

OLOv8训练

yolov8的训练采用命令行的模型(当然也可以使用api调用的方式),下面是yolov8官方给定的训练方式:

一个简单的单卡模型训练命令如下:

一个简单的多卡模型训练命令如下:

当然更多的参数在训练时可以被指定,这些参数包括如下:

名称 默认参数 描述
model None 模型或模型配置文件
data None 数据集配置文件
epochs 100 训练的轮次
patience 50 准确率如果没有显著提升时停止的轮次
batch 16 训练的批次大小
imgsz 640 图像的尺寸
save True 是否需要保存训练的结果与模型
save_period -1 每隔多少个epoch保留训练好的权重模型
cache False 是否使用缓存保存数据,可选True/ram、disk或者False
device None 训练设备,可选0或1或cpu等
workers 8 多线程数据集加载
project None 项目名称
name None 实验名称
exist_ok False 是否覆盖现有实验
pretrained False 是否使用预训练模型
optimizer 'auto' 优化器选择,有[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]
verbose False 是否打印详细输出
seed 0 种子数
deterministic True 是否启动确定性模式
single_cls False 单类别模式训练
rect False 是否支持矩形训练
cos_lr False 是否使用余弦学习率调度器
resume False 是否从最近训练断掉的权重继续训练
amp True 是否开启混合精度训练

上面列举一些常见的参数,还有一些如训练策略的一些参数可从一下链接查看:docs.ultralytics.com/modes/train...

YOLOv8验证

yolov8的验证采用命令行的模型(当然也可以使用api调用的方式),下面是yolov8官方给定的验证方式:

当然更多的参数在验证时可以被指定,这些参数包括如下:

名称 默认参数 描述
data None 数据集配置文件,默认是coco.yaml
imgsz 640 输入图像尺寸
batch 16 验证批量大小
save_json False 保存json格式的结果
save_hybrid False 保存标签的混合版本(标签+附加预测)
conf 0.001 目标置信分阈值
iou 0.6 非极大值后处理算法的IOU阈值
max_det 300 每张图像的最大检测数量
half True 是否使用半精度 (FP16)
device None 验证设备,可选0,1或者cpu等
dnn False 是否使用OpenCV DNN 来做ONNX 推理
plots False 在训练期间画图
rect False 是否支持矩形图像验证
split val 用于验证的数据集(可选train、val或者test)

YOLOv8推理测试

yolov8的推理测试采用api调用的方式,下面是yolov8官方给定的测试方式:

YOLOv8推理可为各种任务生成预测结果,可返回一个结果对象列表或一个节省内存的结果对象生成器(在使用流模式时,即在model中设置stream=True)

YOLOv8可以处理不同类型的输入源(如下表所示)进行推理,输入源包括静态图像、视频流和各种数据格式。表中还显示了参数 stream=True表示可以在流模式下使用这个源。流模式有利于处理视频或实时流,因为它会创建一个结果生成器,而不是将所有帧加载到内存中。(在处理长视频或大型数据集时,使用 stream=True 可以有效管理内存。当 stream=False 时,所有帧或数据点的结果都会存储在内存中,这可能会迅速增加数据量,最终导致内存不足错误。相比之下,stream=True利用生成器,只将当前帧或数据点的结果保存在内存中,从而大大减少了内存消耗,防止出现内存不足问题)

数据源 参数 类型 描述
image 'image.jpg' str or Path 图像路径
URL 'ultralytics.com/images/bus....' str URL
screenshot 'screen' str 屏幕截图
PIL Image.open('im.jpg') PIL.Image HWC format with RGB channels.
OpenCV cv2.imread('im.jpg') np.ndarray HWC format with BGR channels uint8 (0-255)
numpy np.zeros((640,1280,3)) np.ndarray HWC format with BGR channels uint8 (0-255)
torch torch.zeros(16,3,320,640) torch.Tensor BCHW format with RGB channels float32 (0.0-1.0)
CSV 'sources.csv' str or Path 包含图像、视频或目录的CSV文件
video ✅ 'video.mp4' str or Path 视频格式的字符串
directory ✅ 'path/' str or Path 包含图像或视频的目录
glob ✅ 'path/*.jpg' str 用于匹配多个文件的全局模式,使用*字符作为通配符
YouTube ✅ 'youtu.be/Zgi9g1ksQHc' str YouTube视频链接
stream ✅ 'rtsp://example.com/media.mp4' str 视频或摄像头流地址
multi-stream ✅ 'list.streams' str or Path 多个视频或摄像头流地址

model.predict()接受多个参数,可在推理时通过下面的这些参数覆盖默认值:

名称 参数 默认值 描述
source str 'ultralytics/assets' 图片或视频的源路径
conf float 0.25 置信分阈值
iou float 0.7 检测后处理IOU阈值
imgsz int or tuple 640 图像尺寸(h,w)
half bool False 是否使用半精度
device None or str None 推理设备(0,1,cpu等)
show bool False 是否显示检测结果
save bool False 是否保存结果图像
save_txt bool False 是否保存结果txt文件
save_conf bool False 是否保存结果是带有置信分
save_crop bool False 是否保存裁剪之后的图像
hide_labels bool False 是否隐藏标签类名
hide_conf bool False 是否隐藏置信分
max_det int 300 图像的最大检测目标个数
vid_stride bool False 是否视频间隔帧模式
line_width None or int None 目标框的宽度尺寸
visualize bool False 是否可视化模型特征
augment bool False 是否在推理阶段使用图像增强
agnostic_nms bool False class-agnostic NMS
retina_masks bool False use high-resolution segmentation masks
classes None or list None 是否通过类别过滤结果
boxes bool True Show boxes in segmentation predictions

更多的信息如图像格式、视频格式、检测结果格式等信息请参考官网:docs.ultralytics.com/modes/predi...

YOLOv8导出

yolov8模型的导出采用命令行的模型(当然也可以使用api调用的方式),下面是yolov8官方给定的模型导出方式:

YOLOv8模型的导出设置是指用于保存或导出模型以便在其他环境或平台中使用的各种配置和选项。这些设置会影响模型的性能、大小以及与不同系统的兼容性。一些常见的YOLOv8导出设置包括导出模型文件的格式(如 ONNX、TensorFlow等)、运行模型的设备(如 CPU、GPU),以及是否存在掩码或每个方框多个标签等附加功能。可能影响导出过程的其他因素包括模型用于的特定任务以及目标环境或平台的要求或限制,必须仔细考虑和配置这些设置,以确保导出的模型针对预期用例进行了优化,并能在目标环境中有效使用。下表列出模型在导出过程中常见的一些配置信息:

参数项 默认值 描述
format 'torchscript' 模型导出格式
imgsz 640 图像尺寸
keras False 是否在TF SaveModel导出时使用 keras
optimize False 是否用于移动端设备的TorchScript优化
half False 是否使用半精度量化
int8 False 是否使用int8量化
dynamic False ONNX/Tensorrt 动态维度
simplify False ONNX/Tensorrt 简化模型
opset None ONNX导出版本
workspace 4 Tensorrt 模型导出工作空间
nms False 是否在CoreML中增加NMS

可用的YOLOv8模型的导出格式如下表所示,您可以使用format参数导出任何格式,例如format='onnx' 或 format='engine'等

格式 format参数 模型 参数
PyTorch - yolov8n.pt -
TorchScript Torchscript yolov8n.torchscript imgsz, optimize
ONNX onnx yolov8n.onnx imgsz, half, dynamic, simplify, opset
OpenVINO openvino yolov8n.openvino_model imgsz, half
TensorRT engine yolov8n.engine imgsz, half, dynamic simplify, workspace
CoreML coreml yolov8n.mlpackage imgsz, half, int8. nms
TF SavedModel saved_model yolov8n.saved_model/ imgsz, keras
TF GraphDef pb yolov8n.pb imgsz
TF Lite tflite yolov8n.tflite imgsz, half, int8
TF Edge TPU edgetpu yolov8n.edgetpu.tflite imgsz
TF.js tfjs yolov8n.web_model/ imgsz
PaddlePaddle paddle yolov8n.paddle_model/ imgsz
ncnn ncnn yolov8n.ncm_mode;/ imgsz, half,
相关推荐
刚学HTML3 分钟前
leetcode 05 回文字符串
算法·leetcode
galileo20164 分钟前
LLM与金融
人工智能
DREAM依旧20 分钟前
隐马尔科夫模型|前向算法|Viterbi 算法
人工智能
AC使者22 分钟前
#B1630. 数字走向4
算法
ROBOT玲玉23 分钟前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
冠位观测者26 分钟前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
GocNeverGiveUp33 分钟前
机器学习2-NumPy
人工智能·机器学习·numpy
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca1 小时前
洛谷 P1706 全排列问题 C语言
算法
Kai HVZ1 小时前
python爬虫----爬取视频实战
爬虫·python·音视频