likes
comments
collection
share

YOLOv8目标检测算法

作者站长头像
站长
· 阅读数 3

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目标检测算法

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

YOLOv8目标检测算法

YOLOv8目标检测算法

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目标检测算法的模型配置文件如下:

YOLOv8目标检测算法

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

YOLOv8目标检测算法

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

YOLOv8目标检测算法

当然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官方给定的训练方式:

YOLOv8目标检测算法

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

YOLOv8目标检测算法

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

YOLOv8目标检测算法

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

名称默认参数描述
modelNone模型或模型配置文件
dataNone数据集配置文件
epochs100训练的轮次
patience50准确率如果没有显著提升时停止的轮次
batch16训练的批次大小
imgsz640图像的尺寸
saveTrue是否需要保存训练的结果与模型
save_period-1每隔多少个epoch保留训练好的权重模型
cacheFalse是否使用缓存保存数据,可选True/ram、disk或者False
deviceNone训练设备,可选0或1或cpu等
workers8多线程数据集加载
projectNone项目名称
nameNone实验名称
exist_okFalse是否覆盖现有实验
pretrainedFalse是否使用预训练模型
optimizer'auto'优化器选择,有[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]
verboseFalse是否打印详细输出
seed0种子数
deterministicTrue是否启动确定性模式
single_clsFalse单类别模式训练
rectFalse是否支持矩形训练
cos_lrFalse是否使用余弦学习率调度器
resumeFalse是否从最近训练断掉的权重继续训练
ampTrue是否开启混合精度训练

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

YOLOv8验证

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

YOLOv8目标检测算法

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

 

名称默认参数描述
dataNone数据集配置文件,默认是coco.yaml
imgsz640输入图像尺寸
batch16验证批量大小
save_jsonFalse保存json格式的结果
save_hybridFalse保存标签的混合版本(标签+附加预测)
conf0.001目标置信分阈值
iou0.6非极大值后处理算法的IOU阈值
max_det300每张图像的最大检测数量
halfTrue是否使用半精度 (FP16)
deviceNone验证设备,可选0,1或者cpu等
dnnFalse是否使用OpenCV DNN 来做ONNX 推理
plotsFalse在训练期间画图
rectFalse是否支持矩形图像验证
splitval用于验证的数据集(可选train、val或者test)

 

YOLOv8推理测试

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

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.…'strURL
screenshot'screen'str屏幕截图
PILImage.open('im.jpg')PIL.ImageHWC format with RGB channels.
OpenCVcv2.imread('im.jpg')np.ndarrayHWC format with BGR channels uint8 (0-255)
numpynp.zeros((640,1280,3))np.ndarrayHWC format with BGR channels uint8 (0-255)
torchtorch.zeros(16,3,320,640)torch.TensorBCHW 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'strYouTube视频链接
stream ✅'rtsp://example.com/media.mp4'str视频或摄像头流地址
multi-stream ✅'list.streams'str or Path多个视频或摄像头流地址

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

名称参数默认值描述
sourcestr'ultralytics/assets'图片或视频的源路径
conffloat0.25置信分阈值
ioufloat0.7检测后处理IOU阈值
imgszint or tuple640图像尺寸(h,w)
halfboolFalse是否使用半精度
deviceNone or strNone推理设备(0,1,cpu等)
showboolFalse是否显示检测结果
saveboolFalse是否保存结果图像
save_txtboolFalse是否保存结果txt文件
save_confboolFalse是否保存结果是带有置信分
save_cropboolFalse是否保存裁剪之后的图像
hide_labelsboolFalse是否隐藏标签类名
hide_confboolFalse是否隐藏置信分
max_detint300图像的最大检测目标个数
vid_strideboolFalse是否视频间隔帧模式
line_widthNone or intNone目标框的宽度尺寸
visualizeboolFalse是否可视化模型特征
augmentboolFalse是否在推理阶段使用图像增强
agnostic_nmsboolFalseclass-agnostic NMS
retina_masksboolFalseuse high-resolution segmentation masks
classesNone or listNone是否通过类别过滤结果
boxesboolTrueShow boxes in segmentation predictions

 

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

YOLOv8导出

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

YOLOv8目标检测算法

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

参数项默认值描述
format‘torchscript’模型导出格式
imgsz640图像尺寸
kerasFalse是否在TF SaveModel导出时使用 keras
optimizeFalse是否用于移动端设备的TorchScript优化
halfFalse是否使用半精度量化
int8False是否使用int8量化
dynamicFalseONNX/Tensorrt 动态维度
simplifyFalseONNX/Tensorrt 简化模型
opsetNoneONNX导出版本
workspace4Tensorrt 模型导出工作空间
nmsFalse是否在CoreML中增加NMS

 

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

格式format参数模型参数
PyTorch-yolov8n.pt-
TorchScriptTorchscriptyolov8n.torchscriptimgsz, optimize
ONNXonnxyolov8n.onnximgsz, half, dynamic, simplify, opset
OpenVINOopenvinoyolov8n.openvino_modelimgsz, half
TensorRTengineyolov8n.engineimgsz, half, dynamic simplify, workspace
CoreMLcoremlyolov8n.mlpackageimgsz, half, int8. nms
TF SavedModelsaved_modelyolov8n.saved_model/imgsz, keras
TF GraphDefpbyolov8n.pbimgsz
TF Litetfliteyolov8n.tfliteimgsz, half, int8
TF Edge TPUedgetpuyolov8n.edgetpu.tfliteimgsz
TF.jstfjsyolov8n.web_model/imgsz
PaddlePaddlepaddleyolov8n.paddle_model/imgsz
ncnnncnnyolov8n.ncm_mode;/imgsz, half,