0x01 什么是YOLO
模型大小对比
这边拿YOLO8来对比,通过这组数据可以看出典型的深度学习模型缩放定律(Scaling Laws):
- 边际效用递减:从 Nano 升级到 Small,参数量增加了约 3.5 倍,mAP 提升了 7.6 点;但从 Medium 升级到 Large,参数量增加了 1.7 倍,mAP 仅提升了 2.7 点。
- 计算量激增:Large 版本的精度仅比 Medium 高出不到 3 点,但计算量(FLOPs)却翻了一倍多(78.9G -> 165.2G),这意味着在实际部署时,Large 版本对显存和推理延迟的要求会高得多。
| 模型规格 |
参数量 |
模型文件体积 |
FLOPs |
精度 (mAP) |
| Nano (n) |
3.2M |
~6 MB |
8.7G |
37.3 |
| Small (s) |
11.2M |
~22 MB |
28.6G |
44.9 |
| Medium (m) |
25.9M |
~52 MB |
78.9G |
50.2 |
| Large (l) |
43.7M |
~87 MB |
165.2G |
52.9 |
标注工具对比与推荐
| 工具 (推荐度) |
安装/运行 |
核心特点与适用场景 |
自动标注 |
| Label Studio (⭐首选) |
pip 安装 |
开源免费,支持多任务及 YOLO 导出,适合通用/批量标注 |
✅ |
| Roboflow |
浏览器在线 |
自带数据增强与格式转换,导出灵活,适合小项目快速出活 |
✅ |
| CVAT |
Docker/在线 |
Intel 开源专业级,支持视频/团队协作,适合大项目/企业级 |
✅ |
| LabelImg |
pip/brew |
经典极简,原生保存 YOLO 格式,上手快但已停更 |
❌ |
| Makesense.ai |
浏览器在线 |
免注册、即开即用,轻量极速,适合临时/少量快速标注 |
❌ |
# 安装
# 激活你的虚拟环境
source /Users/myluzh/Desktop/yolo/.venv/bin/activate
# 安装 Label Studio
pip install label-studio
# 启动
(.venv) myluzh@myluzhMacBookPro yolo % label-studio start
Starting development server at http://0.0.0.0:8080/
如何下载数据集
https://www.kaggle.com/
0x02 安装yolo环境
myluzh@myluzhMacBookPro Desktop % mkdir yolo
myluzh@myluzhMacBookPro Desktop % cd yolo
# 创建一个虚拟环境
myluzh@myluzhMacBookPro yolo % python3 -m venv .venv
myluzh@myluzhMacBookPro yolo % source .venv/bin/activate
(.venv) myluzh@myluzhMacBookPro yolo % pip install --upgrade pip
# 安装YOLO 的核心库 ultralytics
(.venv) myluzh@myluzhMacBookPro yolo % pip install ultralytics
Installing collected packages: mpmath, urllib3, typing-extensions, sympy, six, setuptools, pyyaml, pyparsing, psutil, polars-runtime-32, pillow, packaging, numpy, networkx, MarkupSafe, kiwisolver, idna, fsspec, fonttools, filelock, cycler, charset_normalizer, certifi, scipy, requests, python-dateutil, polars, opencv-python, jinja2, contourpy, torch, matplotlib, ultralytics-thop, torchvision, ultralytics
Successfully installed MarkupSafe-3.0.3 certifi-2026.2.25 charset_normalizer-3.4.7 contourpy-1.3.3 cycler-0.12.1 filelock-3.25.2 fonttools-4.62.1 fsspec-2026.3.0 idna-3.11 jinja2-3.1.6 kiwisolver-1.5.0 matplotlib-3.10.8 mpmath-1.3.0 networkx-3.6.1 numpy-2.4.4 opencv-python-4.13.0.92 packaging-26.0 pillow-12.2.0 polars-1.39.3 polars-runtime-32-1.39.3 psutil-7.2.2 pyparsing-3.3.2 python-dateutil-2.9.0.post0 pyyaml-6.0.3 requests-2.33.1 scipy-1.17.1 setuptools-81.0.0 six-1.17.0 sympy-1.14.0 torch-2.11.0 torchvision-0.26.0 typing-extensions-4.15.0 ultralytics-8.4.36 ultralytics-thop-2.0.18 urllib3-2.6.3
# 测试 如果True就是可以了
(.venv) myluzh@myluzhMacBookPro yolo % python3
Python 3.13.3 (main, Apr 8 2025, 13:54:08) [Clang 17.0.0 (clang-1700.0.13.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
... print(torch.backends.mps.is_available())
True
训练
猫检测模型训练
(.venv) myluzh@myluzhMacBookPro yolo % /Users/myluzh/Desktop/yolo/.venv/bin/python /Users/myluzh/Desktop/yolo/train_cat_yolo26.py
============================================================
YOLOv26 猫检测模型训练
============================================================
训练配置:
model: yolo26s.pt
data: cat-dataset/data.yaml
epochs: 100
imgsz: 640
batch: 16
device: mps
workers: 8
patience: 20
save: True
project: runs
name: cat_detect_yolo26
exist_ok: True
pretrained: True
optimizer: AdamW
lr0: 0.01
verbose: True
split: auto
正在加载模型: yolo26s.pt
模型任务类型: detect
模型类别数: 80
开始训练...
------------------------------------------------------------
Ultralytics 8.4.36 🚀 Python-3.13.3 torch-2.11.0 MPS (Apple M1 Pro)
engine/trainer: agnostic_nms=False, amp=True, angle=1.0, augment=False, auto_augment=randaugment, batch=16, bgr=0.0, box=7.5, cache=False, cfg=None, classes=None, close_mosaic=10, cls=0.5, compile=False, conf=None, copy_paste=0.0, copy_paste_mode=flip, cos_lr=False, cutmix=0.0, data=cat-dataset/data.yaml, degrees=0.0, deterministic=True, device=mps, dfl=1.5, dnn=False, dropout=0.0, dynamic=False, embed=None, end2end=None, epochs=100, erasing=0.4, exist_ok=True, fliplr=0.5, flipud=0.0, format=torchscript, fraction=1.0, freeze=None, half=False, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, imgsz=640, int8=False, iou=0.7, keras=False, kobj=1.0, line_width=None, lr0=0.01, lrf=0.01, mask_ratio=4, max_det=300, mixup=0.0, mode=train, model=yolo26s.pt, momentum=0.937, mosaic=1.0, multi_scale=0.0, name=cat_detect_yolo26, nbs=64, nms=False, opset=None, optimize=False, optimizer=AdamW, overlap_mask=True, patience=20, perspective=0.0, plots=True, pose=12.0, pretrained=True, profile=False, project=runs, rect=False, resume=False, retina_masks=False, rle=1.0, save=True, save_conf=False, save_crop=False, save_dir=/Users/myluzh/Desktop/yolo/runs/detect/runs/cat_detect_yolo26, save_frames=False, save_json=False, save_period=-1, save_txt=False, scale=0.5, seed=0, shear=0.0, show=False, show_boxes=True, show_conf=True, show_labels=True, simplify=True, single_cls=False, source=None, split=val, stream_buffer=False, task=detect, time=None, tracker=botsort.yaml, translate=0.1, val=True, verbose=True, vid_stride=1, visualize=False, warmup_bias_lr=0.1, warmup_epochs=3.0, warmup_momentum=0.8, weight_decay=0.0005, workers=8, workspace=None
Overriding model.yaml nc=80 with nc=1
from n params module arguments
0 -1 1 928 ultralytics.nn.modules.conv.Conv [3, 32, 3, 2]
1 -1 1 18560 ultralytics.nn.modules.conv.Conv [32, 64, 3, 2]
2 -1 1 26080 ultralytics.nn.modules.block.C3k2 [64, 128, 1, False, 0.25]
3 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2]
4 -1 1 103360 ultralytics.nn.modules.block.C3k2 [128, 256, 1, False, 0.25]
5 -1 1 590336 ultralytics.nn.modules.conv.Conv [256, 256, 3, 2]
6 -1 1 346112 ultralytics.nn.modules.block.C3k2 [256, 256, 1, True]
7 -1 1 1180672 ultralytics.nn.modules.conv.Conv [256, 512, 3, 2]
8 -1 1 1380352 ultralytics.nn.modules.block.C3k2 [512, 512, 1, True]
9 -1 1 656896 ultralytics.nn.modules.block.SPPF [512, 512, 5, 3, True]
10 -1 1 990976 ultralytics.nn.modules.block.C2PSA [512, 512, 1]
11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
12 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1]
13 -1 1 477184 ultralytics.nn.modules.block.C3k2 [768, 256, 1, True]
14 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
15 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1]
16 -1 1 136192 ultralytics.nn.modules.block.C3k2 [512, 128, 1, True]
17 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2]
18 [-1, 13] 1 0 ultralytics.nn.modules.conv.Concat [1]
19 -1 1 378880 ultralytics.nn.modules.block.C3k2 [384, 256, 1, True]
20 -1 1 590336 ultralytics.nn.modules.conv.Conv [256, 256, 3, 2]
21 [-1, 10] 1 0 ultralytics.nn.modules.conv.Concat [1]
22 -1 1 1843712 ultralytics.nn.modules.block.C3k2 [768, 512, 1, True, 0.5, True]
23 [16, 19, 22] 1 932638 ultralytics.nn.modules.head.Detect [1, 1, True, [128, 256, 512]]
YOLO26s summary: 260 layers, 9,948,638 parameters, 9,948,638 gradients, 22.5 GFLOPs
Transferred 696/708 items from pretrained weights
train: Fast image access ✅ (ping: 0.0±0.0 ms, read: 68.2±35.1 MB/s, size: 22.2 KB)
train: Scanning /Users/myluzh/Desktop/yolo/cat-dataset/labels... 100 images, 3 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 100/100 3.2Kit/s 0.0s
train: New cache created: /Users/myluzh/Desktop/yolo/cat-dataset/labels.cache
val: Fast image access ✅ (ping: 0.0±0.0 ms, read: 961.4±475.6 MB/s, size: 22.5 KB)
val: Scanning /Users/myluzh/Desktop/yolo/cat-dataset/labels.cache... 100 images, 3 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 100/100 104.9Mit/s 0.0s
optimizer: AdamW(lr=0.01, momentum=0.937) with parameter groups 114 weight(decay=0.0), 126 weight(decay=0.0005), 126 bias(decay=0.0)
Plotting labels to /Users/myluzh/Desktop/yolo/runs/detect/runs/cat_detect_yolo26/labels.jpg...
Image sizes 640 train, 640 val
Using 0 dataloader workers
Logging results to /Users/myluzh/Desktop/yolo/runs/detect/runs/cat_detect_yolo26
Starting training for 100 epochs...
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
1/100 9.46G 1.453 3.394 0.02397 8 640: 100% ━━━━━━━━━━━━ 7/7 4.7s/it 33.0s
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 2.6s/it 10.5s
all 100 107 0.0314 0.0841 0.00818 0.00189
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
5/100 9.52G 2.042 2.469 0.03278 11 640: 100% ━━━━━━━━━━━━ 7/7 1.6s/it 11.3s
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 1.0s/it 4.1s
all 100 107 0.00164 0.00935 0.000188 3.5e-05
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
35/100 9.46G 1.872 1.949 0.02874 22 640: 100% ━━━━━━━━━━━━ 7/7 1.5s/it 10.8s
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 1.0s/it 4.1s
all 100 107 0.623 0.542 0.597 0.297
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
60/100 9.52G 1.476 1.231 0.02238 7 640: 100% ━━━━━━━━━━━━ 7/7 1.8s/it 12.8s
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 1.0s/it 4.2s
all 100 107 0.812 0.804 0.905 0.591
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
80/100 9.52G 1.203 0.8899 0.01873 7 640: 100% ━━━━━━━━━━━━ 7/7 1.6s/it 11.2s
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 1.1s/it 4.4s
all 100 107 0.932 0.9 0.975 0.718
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
95/100 9.5G 1.009 0.6364 0.02076 4 640: 100% ━━━━━━━━━━━━ 7/7 1.6s/it 11.4s
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 1.1s/it 4.3s
all 100 107 0.91 0.907 0.975 0.737
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
100/100 9.52G 1.009 0.5043 0.02291 4 640: 100% ━━━━━━━━━━━━ 7/7 1.6s/it 11.1s
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 1.0s/it 4.2s
all 100 107 0.875 0.915 0.971 0.75
100 epochs completed in 0.503 hours.
Optimizer stripped from /Users/myluzh/Desktop/yolo/runs/detect/runs/cat_detect_yolo26/weights/last.pt, 20.3MB
Optimizer stripped from /Users/myluzh/Desktop/yolo/runs/detect/runs/cat_detect_yolo26/weights/best.pt, 20.3MB
Validating /Users/myluzh/Desktop/yolo/runs/detect/runs/cat_detect_yolo26/weights/best.pt...
Ultralytics 8.4.36 🚀 Python-3.13.3 torch-2.11.0 MPS (Apple M1 Pro)
YOLO26s summary (fused): 122 layers, 9,465,567 parameters, 0 gradients, 20.5 GFLOPs
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 4/4 2.8s/it 11.3s
all 100 107 0.969 0.887 0.979 0.749
Speed: 0.8ms preprocess, 65.5ms inference, 0.0ms loss, 1.5ms postprocess per image
Results saved to /Users/myluzh/Desktop/yolo/runs/detect/runs/cat_detect_yolo26
训练完成!
最佳模型保存在: runs/cat_detect_yolo26/weights/best.pt
(.venv) myluzh@myluzhMacBookPro yolo %