一、简介
-
论文题目:YOLOv12: Attention-Centric Real-Time Object Detectors
-
研究机构:纽约州立大学布法罗分校、中科院大学
尽管注意力机制在建模能力上已证明具有优越性,但YOLO改进的重点一直放在基于CNN的改进上。这是因为基于注意力的模型无法与基于CNN的模型在速度上相匹配。本文提出了一种以注意力为中心的YOLO框架,即YOLOv12,它在保持与先前基于CNN的模型相同速度的同时,充分利用了注意力机制的性能优势。
YOLOv12在所有流行的实时目标检测器中,在准确性方面超越了它们,并且速度具有竞争力。例如,YOLOv12-N在T4 GPU上实现了40.6%的mAP,推理延迟为1.64毫秒,相比先进的YOLOv10-N/YOLOv11-N,在相当的速度下,mAP提高了2.1%/1.2%。这种优势也扩展到了其他模型规模。YOLOv12还超过了那些改进DETR的端到端实时检测器,如RT-DETR/RT-DETRv2:YOLOv12-S在运行速度比RT-DETR-R18/RT-DETRv2-R18快42%的情况下,仅使用了36%的计算量和45%的参数量。
- COCO数据集测试结果
Model | size (pixels) | mAPval 50-95 | Speed T4 TensorRT10 | params (M) | FLOPs (G) |
---|---|---|---|---|---|
YOLO12n | 640 | 40.6 | 1.64 | 2.6 | 6.5 |
YOLO12s | 640 | 48.0 | 2.61 | 9.3 | 21.4 |
YOLO12m | 640 | 52.5 | 4.86 | 20.2 | 67.5 |
YOLO12l | 640 | 53.7 | 6.77 | 26.4 | 88.9 |
YOLO12x | 640 | 55.2 | 11.79 | 59.1 | 199.0 |
官方提供的demo测试网址有:Demo2,可以使用图像或者视频进行测试,也可以打开本地摄像头进行测试。
二、安装测试
平台:Ubuntu
基本环境要求:Pytorch2.2及以上,CUDA12.1及以上,Python3.11,基本CONDA环境。
1、克隆项目
git clone https://github.com/sunsmarterjie/yolov12.git
cd yolov12
2、安装依赖第三方库
YOLOv12新增了对Flash-Attention的调用,用于加速注意力机制的计算。这里以pytorch2.2为例安装flash-attention(要求硬件: H100 / H800 GPU, CUDA >= 12.3),目前笔者并没有该硬件资源,所以后续测试的时候会提示FlashAttention不可用,但不影响测试代码的正常运行。
具体命令和其他第三方包安装命令如下:
wget https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.3/flash_attn-2.7.3+cu11torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
其中,requirement,txt
中的内容需要进行修改,具体内容如下:
torch==2.2.2
torchvision==0.17.2
flash_attn-2.7.3+cu11torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl
timm==1.0.14
albumentations==2.0.4
onnx==1.14.0
onnxruntime==1.15.1
pycocotools==2.0.7
PyYAML==6.0.1
scipy==1.13.0
onnxslim==0.1.31
onnxruntime-gpu==1.18.1
gradio==4.44.1
opencv-python==4.9.0.80
psutil==5.9.8
py-cpuinfo==9.0.0
huggingface-hub==0.23.2
safetensors==0.4.3
numpy==1.26.4
建议直接用conda安装pytorch和torchvision,具体安装命令如下:
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=12.1 -c pytorch -c nvidia
在安装完pytorch和pytorchvision后,建议对其可行性进行验证,具体python脚本(名为val_version.py
)内容如下所示:
import torch
print('PyTorch version: ' + str(torch.__version__))
print('CUDA available: ' + str(torch.cuda.is_available()))
print('cuDNN version: ' + str(torch.backends.cudnn.version()))
a = torch.tensor([0., 0.], dtype=torch.float32, device='cuda')
print('Tensor a =', a)
b = torch.randn(2, device='cuda')
print('Tensor b =', b)
c = a + b
print('Tensor c =', c)
import torchvision
print("Torchvision version: ", torchvision.__version__)
当输出如下图所示的信息时,则说明已成功安装带CUDA的pytorch和torchvision,
3、编译YOLO项目
将YOLO项目编译为可执行的命令行,在终端输入命令如下:
pip install -e .
安装完后,输入以下命令可以查看yolo相关配置:
yolo help
4、验证COCO8验证集结果
from ultralytics import YOLO
model = YOLO('yolov12n.pt') # yolov12{n/s/m/l/x}
model.val(data='coco8.yaml', batch=1, imgsz=640)
5、在COCO数据集上进行训练
笔者使用coco.yaml中的配置文件进行训练测试,其中改动了yolov12/ultralytics/cfg/datasets/
中的coco.yaml
文件第12行的path定义为:path: ../datasets/coco
,以此将数据集的路径指定到项目根路径的上一层路径名为datasets的coco文件夹中。
from ultralytics import YOLO
model = YOLO('yolov12n.yaml')
# Train the model
results = model.train(
data='coco.yaml',
lr0=0.001,
epochs=10,
batch=64,
imgsz=320,
scale=0.5, # S:0.9; M:0.9; L:0.9; X:0.9
mosaic=1.0,
mixup=0.0, # S:0.05; M:0.15; L:0.15; X:0.2
copy_paste=0.1, # S:0.15; M:0.4; L:0.5; X:0.6
device="0",
)
# Evaluate model performance on the validation set
metrics = model.val()
# Perform object detection on an image
results = model("bus.jpg")
results[0].show()
训练后的评价结果如下:
注意:这里只是进行简单地训练测试,该模型的优化效果还有待后续微调。
6、推理测试
model = YOLO(model='yolov12n.pt')
res = model.predict(source="bus.jpg",imgsz=640)[0]
# res.show()
res.save(filename="res.jpg") # 将结果保存为res.jpg文件
7、导出onnx格式
from ultralytics import YOLO
model = YOLO('yolov12n.pt')
model.export(format="onnx", imgsz=640, half=True) # or format="engine"
输入如下命令验证onnx模型的检测效果,用CPU测试具体命令如下:
yolo predict task=detect model=yolov12n.onnx imgsz=640 source=bus.jpg device="cpu"
用GPU测试具体命令如下:
yolo predict task=detect model=yolov12n.onnx imgsz=640 source=bus.jpg device="cuda"
同样地,可以使用以下python脚本进行测试:
from ultralytics import YOLO
model = YOLO(model='yolov12n.onnx')
res = model.predict(source="bus.jpg",imgsz=640)[0]
res.save(filename="res_onnx.jpg")
三、总结
YOLOv12提出了一种新颖的网络,该网络利用区域注意力来降低计算复杂度,并利用残差高效层聚合网络(R-ELAN)来增强特征聚合,此外还优化了原始注意力机制的关键组件,以更好地适应YOLO的实时约束,同时保持高速性能。作者成功地将通常被认为对实时要求低效的以注意力为中心的设计融入了YOLO框架,实现了最先进的延迟-精度平衡。在性能上超越了YOLOv11和DETR代表的轻量级模型RT-DETRv2。
- 遇到问题:
NumPy 2.2.3 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'
解决方法为重新安装numpy=1.xx.xx,终端输入命令如下:
pip install numpy==1.26.1
四、参考链接
[1] https://github.com/sunsmarterjie/yolov12?tab=readme-ov-file