YOLOv5 7.0:配置与使用

06 配置与使用

6.1 安装

1
2
3
4
cd /home/cp/work2/visualAlgo/YOLO/yolov5-7.0
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

PyTorch 是否带 CUDA,应按本机驱动从 PyTorch 官方安装对应版本。仅执行 requirements.txt 不保证获得正确的 CUDA wheel。

验证环境:

1
2
3
4
5
6
python - <<'PY'
import torch, cv2
print("torch:", torch.__version__)
print("cuda:", torch.cuda.is_available())
print("opencv:", cv2.__version__)
PY

6.2 权重

源码目录不等于权重包。常用权重:

1
2
3
4
5
yolov5n.pt  最小最快
yolov5s.pt 常用入门
yolov5m.pt
yolov5l.pt
yolov5x.pt 最大

传入不存在的官方权重名时,attempt_download() 会尝试下载。离线机器应提前复制 .pt

也可执行:

1
bash data/scripts/download_weights.sh

6.3 快速检测

1
2
3
4
5
6
python detect.py \
--weights yolov5s.pt \
--source data/images \
--img 640 \
--conf-thres 0.25 \
--iou-thres 0.45

结果默认写入:

1
runs/detect/exp/

常见 source:

1
2
3
4
5
6
--source image.jpg
--source images/
--source video.mp4
--source 0
--source rtsp://...
--source screen

常见选项:

1
2
3
4
5
6
7
--save-txt           # 保存 class xywh
--save-conf # TXT 追加置信度
--save-crop # 保存目标裁剪
--classes 0 2 # 只保留指定类别
--agnostic-nms # 类别无关 NMS
--half # 支持的 GPU/后端上 FP16
--vid-stride 2 # 视频隔帧

6.4 自定义数据集

目录:

1
2
3
4
5
6
7
datasets/mydata/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/

data/mydata.yaml

1
2
3
4
5
6
path: ../datasets/mydata
train: images/train
val: images/val
names:
0: cat
1: dog

标签:

1
0 0.512 0.480 0.200 0.350

含义为 class cx cy w h,坐标归一化。类别必须从 0 连续编号,且小于 nc

6.5 训练

迁移学习

1
2
3
4
5
6
7
python train.py \
--weights yolov5s.pt \
--data data/mydata.yaml \
--epochs 100 \
--img 640 \
--batch-size 16 \
--device 0

从零训练

1
2
3
4
5
6
python train.py \
--weights '' \
--cfg models/yolov5s.yaml \
--data data/mydata.yaml \
--hyp data/hyps/hyp.scratch-low.yaml \
--epochs 300

自动 Batch

单 GPU 可使用:

1
--batch-size -1

冻结 Backbone

1
--freeze 10

表示冻结模型前 10 层,适合小数据集初期迁移。

6.6 恢复训练

1
python train.py --resume runs/train/exp/weights/last.pt

恢复需要 last.pt 中仍包含:

  • epoch
  • optimizer
  • EMA
  • opt/hyp

训练结束时 strip_optimizer() 会移除优化器状态并转 FP16;被 strip 的部署权重不适合完整恢复。

6.7 多 GPU DDP

1
2
3
4
5
6
python -m torch.distributed.run \
--nproc_per_node 4 \
train.py \
--batch-size 64 \
--device 0,1,2,3 \
--data data/mydata.yaml

源码明确不推荐传统 DataParallel。DDP 的 batch-size 是总 batch,会按 WORLD_SIZE 分给各 GPU。

6.8 验证

1
2
3
4
5
6
python val.py \
--weights runs/train/exp/weights/best.pt \
--data data/mydata.yaml \
--img 640 \
--conf-thres 0.001 \
--iou-thres 0.6

主要输出:

  • Precision
  • Recall
  • mAP@0.5
  • mAP@0.5:0.95
  • 各类别 AP
  • 混淆矩阵和 PR 曲线(未关闭 plots 时)

验证时低 conf-thres 是为了保留完整 PR 曲线,不等同于部署阈值。

6.9 分割

1
2
3
4
5
6
7
8
9
10
11
12
13
python segment/train.py \
--model yolov5s-seg.pt \
--data data/coco128-seg.yaml \
--epochs 5 \
--img 640

python segment/val.py \
--weights yolov5s-seg.pt \
--data data/coco128-seg.yaml

python segment/predict.py \
--weights yolov5s-seg.pt \
--source data/images

6.10 分类

1
2
3
4
5
6
7
8
9
10
11
12
13
python classify/train.py \
--model yolov5s-cls.pt \
--data cifar100 \
--epochs 5 \
--img 224

python classify/val.py \
--weights yolov5s-cls.pt \
--data ../datasets/imagenet

python classify/predict.py \
--weights yolov5s-cls.pt \
--source data/images

6.11 PyTorch Hub

本地源码(以下直接传图片的写法适用于检测模型;v7.0 的分类/分割模型不会自动套用 AutoShape):

1
2
3
4
5
6
7
8
9
10
11
import torch

model = torch.hub.load(
"/home/cp/work2/visualAlgo/YOLO/yolov5-7.0",
"custom",
path="best.pt",
source="local",
)
results = model("image.jpg")
results.print()
results.save()

若输入是 OpenCV 数组,AutoShape 注释期望 RGB:

1
2
rgb = cv2.imread("image.jpg")[:, :, ::-1]
results = model(rgb)

仓库中的 sample_detect.py 是该模式的最小示例。

6.12 导出

ONNX

1
2
3
4
5
6
python export.py \
--weights best.pt \
--include onnx \
--img 640 \
--opset 12 \
--simplify

TensorRT

1
2
3
4
5
python export.py \
--weights best.pt \
--include engine \
--device 0 \
--half

OpenVINO

1
python export.py --weights best.pt --include openvino

其他 --include 格式见:

1
python export.py --help

6.13 ONNX + OpenCV DNN

1
2
3
4
python detect.py \
--weights best.onnx \
--source image.jpg \
--dnn

这会让 DetectMultiBackend 调用 cv2.dnn.readNetFromONNX(),而不是 ONNX Runtime。

6.14 常见问题

yolov5s.pt 不存在

源码没有内置权重。联网时自动下载;离线时手动放到当前目录或传绝对路径。

CUDA 不可用

检查:

1
torch.cuda.is_available()

若为 False,通常是安装了 CPU 版 PyTorch、驱动不匹配或容器没挂 GPU。

标签越界

日志出现:

1
Label class X exceeds nc=N

说明标签类别 ID 大于数据集 YAML 中类别数,或类别不是从 0 开始。

OOM

依次尝试:

  • 减小 --batch-size
  • 减小 --img
  • 使用 --batch-size -1
  • 使用更小模型
  • 关闭 cache 或改 disk

框映射不准

不要直接把网络输入坐标画到原图;必须用 scale_boxes() 消除 Letterbox 的缩放和 padding。

RK3588 NPU

.pt 默认只能走 PyTorch CPU/GPU。RK3588 NPU 通常要:

1
.pt → ONNX → RKNN → RKNN Runtime

--device 不能让 PyTorch .pt 自动运行在 RK NPU。

文章互动

阅读 --

留言

0 条留言

正在加载留言…