YOLO训练麻将(Mahjong)识别,导出ONNX

本文基于 Roboflow Universe 数据集(例如
http://(https://universe.roboflow.com/jon-chan-gnsoa/mahjong-baq4s”
)与仓库内脚本,在 Windows 上完成训练,并导出 ONNX 供后端推理。下文配图均为本机实测截图,便于对照。快速体验
小程序
1. 环境要求
- Windows 10 / 11
- Python 3.10 或 3.11
- NVIDIA 显卡:建议已安装 CUDA 驱动;训练阶段 GPU 会持续高占用
命令行自检:
nvidia-smipython -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'no gpu')"训练中若希望直观确认显卡是否在干活,可打开 **任务管理器 → 性能 → GPU**。下图为本机训练时 **RTX 3070** 的占用:**利用率接近满载、专用显存占用约数 GB**,说明计算确实在显卡上跑(温度因机型与散热而异,只要在合理区间即可)。

2. 安装依赖
在 Mahjong_YOLO 根目录:
python -m venv .venv.\.venv\Scripts\activatepython -m pip install --upgrade pippip install -r requirements.txt3. 数据与类别
目录约定(Roboflow 导出常见结构):
dataset/ train/images/ train/labels/ valid/images/ valid/labels/ test/images/ test/labels/ data.yaml- 类别数与名称以 `dataset/data.yaml` 为准(示例工程为 42 类,`nc: 42`)。
- 标签为 YOLO 检测格式,每行:`class_id x_center y_center width height`(均为 0~1 归一化坐标)。
4. 训练前:标签体检
在根目录、已激活 `.venv`:
python scripts/check_labels.py --data dataset/data.yaml --num-classes 42 --show-bad-samples 15若误用 分割标注 当检测,可能出现大量 `invalid_lines`,可先:
python scripts/convert_seg_labels_to_det.py --dataset-root datasetpython scripts/check_labels.py --data dataset/data.yaml --num-classes 42 --show-bad-samples 155. 第一轮训练:YOLOv8n 跑通
python scripts/train.py --data dataset/data.yaml --model yolov8n.pt --imgsz 960 --epochs 80 --batch 8 --workers 2 --device 0 --name mahjong_42cls_n显存紧张时可改为更小输入、更小 batch,例如:
python scripts/train.py --data dataset/data.yaml --model yolov8n.pt --imgsz 640 --epochs 80 --batch 4 --workers 0 --device 0 --name mahjong_42cls_n_safe终端里应能看到:验证集路径、`save_dir`、优化器、TensorBoard 提示、当前 epoch 进度条、GPU 显存占用、各项 loss 等。下图示例为 第 1 轮训练进行中(路径中的 `mahjong_42cls_n` 即本次 `—name`,具体以你机器打印为准)。

6. 训练输出目录(务必核对)
默认输出在:
runs/detect/<run_name>/`<run_name>` 对应你传入的 `—name`。若同名目录已存在,Ultralytics 往往会自动顺延为 `mahjong_42cls_n2`、`mahjong_42cls_n3` 等,请以终端里的 `save_dir` 或 `runs/detect` 下实际文件夹为准。
常用文件:
| 路径 | 说明 |
runs/detect/<run_name>/weights/best.pt | 验证集上表现最佳的权重,导出 ONNX 首选 |
runs/detect/<run_name>/results.csv | 每 epoch 指标,便于脚本汇总或自行画图 |
训练结束后可看摘要:
python scripts/show_train_summary.py --results-csv runs/detect/<run_name>/results.csv训练中另开终端可选:
python scripts/watch_train.py --results-csv runs/detect/<run_name>/results.csv --interval 5 --idle-timeout 1807. TensorBoard:曲线与计算图
安装并开启 TensorBoard 日志(若尚未配置):
pip install tensorboardyolo settings tensorboard=Truetensorboard --logdir runs\detect\<run_name> --port 6006浏览器访问:`http://localhost:6006\`。左侧 Runs 中选择对应目录(例如界面中的 `detect/mahjong_42cls_n`)。
GRAPHS 页可查看模型数据流概览(input → DetectionModel → output),用于确认当前跑的是检测结构、日志是否挂在本次 run 上:

SCALARS 页重点看 lr(学习率调度是否如预期)、metrics(mAP50、mAP50-95、precision、recall)。训练初期曲线通常整体向上;若长期横盘或发散,再回头查数据与超参。

同一 run 在训练后期,指标会趋于稳定。下图示例中可见 mAP50、mAP50-95、precision、recall 等读数(具体数值随数据与随机种子变化,以你本地 `results.csv` 为准)。

8. 第二轮(可选):换更大模型提精度
第一轮流程与指标正常后,可再跑例如 YOLOv8s、加长 epoch:
python scripts/train.py --data dataset/data.yaml --model yolov8s.pt --imgsz 960 --epochs 150 --batch 8 --workers 2 --device 0 --name mahjong_42cls_s同样注意 输出目录名是否带 `2` 后缀。
9. 导出 ONNX
将 `—weights` 换成你选定的那次训练的 `best.pt`,`—imgsz` 与训练一致,便于与后端输入尺寸(如 `MAHJONG_OCR_IMGSZ`)对齐:
python scripts/export_onnx.py --weights runs/detect/mahjong_42cls_s/weights/best.pt --imgsz 960 --opset 12 --dynamic产物示例:`artifacts/best.onnx`。类别文件复制给后端使用:
copy tools\label_classes.txt artifacts\classes.txt## 10. ONNX 快速验证
python scripts/predict_onnx_check.py --onnx artifacts/best.onnx --source dataset/test/images --imgsz 960 --conf 0.35 --iou 0.55 --device 0可视化一般在 `artifacts/onnx_check/pred/`。若几乎全空或误检爆炸,先调 `conf`/`iou`,再核对预处理与类别顺序是否与训练一致。
开源地址
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!















