/ultralytics

NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

Primary LanguagePythonGNU Affero General Public License v3.0AGPL-3.0

简体中文

Ultralytics YOLOv8 是一款前沿、最先进(SOTA)的模型,基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升性能和灵活性。YOLOv8 设计快速、准确且易于使用,使其成为各种物体检测与跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。

此项目使用yolov8在KITTI数据集上进行微调,得到了车辆和行人检测模型

Train Result

模型的检测精度如下表所示:

Class Images Instances Box(P R mAP50 mAP50-95)
all 1497 7465 0.934 0.866 0.929 0.713
Pedestrian 1497 965 0.922 0.772 0.877 0.554
Car 1497 6500 0.945 0.96 0.982 0.873

Car为例说明,精确率P=0.945,召回率R=0.96mAP50=0.982mAP50-95=0.873
评估指标显示Car的召回率和mAP50-95Pedestrian高出较多,这是因为整个KITTI数据集中行人的数据量大量少于车的数据量。
上述指标的计算公式如博客所描述。

文档

文档前半部分包括环境准备和如何使用此项目的车辆-行人检测模型

后半部分包括如何微调自己的模型。

最后一部分的预训练模型描述摘自YOLOv8

车辆-行人检测模型

环境准备(同微调自定义的模型的环境准备)

安装

使用Pip或Conda在一个Python>=3.8环境中安装ultralytics包。

pip install ultralytics

根据本地实验环境的CUDA版本,安装对应的PyTorch>=1.8,下面给出PyTorch2.0.1-cuda11.8的安装命令。

pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118

安装其余必要的依赖项

pip install -r requirements.txt
验证

在命令行中运行命令:

yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

该命令会下载yolov8n的预训练模型和一张图片,并对该图片进行检测,若命令运行成功,则在./runs/detect/predict目录下会出现检测结果图。

Confirm install

使用

CLI

在本地命令行界面(CLI)中直接使用,只需输入 yolo 命令:

yolo predict model=./runs/train/weights/best.pt source=./car.png

可以通过修改source指定待检测的图片,包含预测结果的图片的具体位置(取决于第几次预测)由命令行输出给出。

Python

模型也可以在 Python 环境中直接使用,并接受与上述 CLI 示例中相同的参数

from ultralytics import YOLO

# 加载模型
model = YOLO("./runs/train/weights/best.pt")  # 加载车辆-行人检测模型

# 使用模型
model.predict('car.png', save=True)

可以通过修改source指定待检测的图片,包含预测结果的图片的具体位置(取决于第几次预测)由命令行输出给出。

微调自定义模型

环境准备(同上述环境准备),以KITTI数据集为例。

数据集

首先需要将KITTI数据集格式转换为YOLO格式,可以通过github上的开源项目kitti_for_yolo完成该步骤。

KITTI数据集内容如下:

标签 类别
Pedestrian 行人
Cyclist 自行车骑者
Car 车辆
Van 货车
Misc 杂项
Truck 卡车
Person_sitting 坐姿行人
Tram 电车
DontCare 其他

由于训练资源有限,此项目只聚焦于行人和车辆,因此把TramTruckVan都归到和Car一类;Person_sittingCyclist,都归到Pedestrian一类进行训练。

数据集的结构应该如下所示:

datasets
│
└── kitti
    ├── images
    │   ├── eval
    │   │   ├── 000003.png
    │   │   └── ...
    │   └── train
    │       ├── 000001.png
    │       └── ...
    └── labels
        ├── eval
        │   ├── 000003.txt
        │   └── ...
        └── train
            ├── 000001.txt
            └── ...

此项目的data_split.py可以用于从源数据集中拆分训练集和测试集,使用方法:

python .\data_split.py --train_data_path datasets/kitti/images/train --train_label_path datasets/kitti/labels/train --eval_data_path datasets/kitti/images/eval --eval_label_path datasets/kitti/labels/eval --r 0.8

可以修改参数适应具体配置:

参数 含义
train_data_path 训练集数据路径(需要文件夹存在)
train_label_path 训练集标签路径(需要文件夹存在)
eval_data_path 测试集数据路径(需要文件夹存在)
eval_label_path 测试集标签路径(需要文件夹存在)
r 训练集与测试集比例

此外还需要准备一个关于数据集的配置文件,位置任意,后续训练时使用,此项目的kitti.yaml存储在ultralytics\cfg\datasets下,内容包括训练数据位置,验证数据位置,测试数据位置(可省略)和类别情况,kitti.yaml的内容已经是最简短的,可以参照kitti.yaml修改。

预训练模型

YOLOv8提供了不同尺寸的预训练模型,具体信息如模型中描述。可以下载预训练模型到本地,也可以训练时自动下载。

训练

在本地命令行界面(CLI)中直接使用,只需输入 yolo 命令:

yolo detect train data=ultralytics/cfg/datasets/kitti.yaml model=yolov8s.yaml pretrained=./yolov8s.pt epochs=300 batch=4 lr0=0.01 resume=True

此项目使用了YOLOv8s的预训练模型,可以按照修改上面的参数以更改训练配置。

参数 含义
data 数据集的描述配置文件路径
model 目标模型的配置文件(只需修改名称选择使用什么模型)
pretrained 预训练模型(可以是本地路径也可以是训练时下载)
epochs 迭代次数
batch 批次大小(根据GPU的显存大小设置)
lr0 学习率
resume 中断后是否可恢复继续训练
训练结果

训练完成后会在train目录下保存最优模型best.pt,以及训练过程中的各种数据图。

runs
│
└── train
    ├── weights
    │   ├── best.pt
    │   └── last.pt
    ├── results.csv
    ├── results.png
    └── ...

训练损失,测试损失等数据在results.png中,如下图所示: Train Result

模型文件

模型文件可以在百度网盘(提取码1234)中下载,模型文件应该放在runs/train/weights/下。

模型(取自YOLOv8)

这里只给出在COCO数据集上预训练的YOLOv8 检测分割姿态模型。其余预训练模型可以在YOLOv8主页找到

Ultralytics YOLO supported tasks

所有模型在首次使用时会自动从最新的Ultralytics 发布版本下载。

检测 (COCO)

查看检测文档以获取这些在COCO上训练的模型的使用示例,其中包括80个预训练类别。

模型 尺寸
(像素)
mAPval
50-95
速度
CPU ONNX
(ms)
速度
A100 TensorRT
(ms)
参数
(M)
FLOPs
(B)
YOLOv8n 640 37.3 80.4 0.99 3.2 8.7
YOLOv8s 640 44.9 128.4 1.20 11.2 28.6
YOLOv8m 640 50.2 234.7 1.83 25.9 78.9
YOLOv8l 640 52.9 375.2 2.39 43.7 165.2
YOLOv8x 640 53.9 479.1 3.53 68.2 257.8
  • mAPval 值是基于单模型单尺度在 COCO val2017 数据集上的结果。
    通过 yolo val detect data=coco.yaml device=0 复现
  • 速度 是使用 Amazon EC2 P4d 实例对 COCO val 图像进行平均计算的。
    通过 yolo val detect data=coco.yaml batch=1 device=0|cpu 复现