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, |