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

988 字
5 分钟
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-smi
python -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\activate
python -m pip install --upgrade pip
pip install -r requirements.txt

3. 数据与类别#

目录约定(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 dataset
python scripts/check_labels.py --data dataset/data.yaml --num-classes 42 --show-bad-samples 15

5. 第一轮训练: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 180

7. TensorBoard:曲线与计算图#

安装并开启 TensorBoard 日志(若尚未配置):

pip install tensorboard
yolo settings tensorboard=True
tensorboard --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`,再核对预处理与类别顺序是否与训练一致。

开源地址#

🎁https://github.com/uurani/Mahjong_YOLO

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

YOLO训练麻将(Mahjong)识别,导出ONNX
https://muxui.com/posts/mahjong_yolo训练导出onnx/
作者
Muxui
发布于
2026-04-20
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
自建 Headscale + DERP 全流程实战记录
文章记录一次完整、可上线、可长期运行的 Headscale + 自建 DERP 搭建过程。 本文不是“能跑就行”的教程,而是 生产可用、已多客户端验证 的配置方案。 简介 Tailscale(Headscale)就是组建一个大的局域网,可以将你
2
[开源]AI Summary - WordPress智能摘要生成插件
PHPAI Summary是一款专为WordPress设计的智能摘要生成插件,它集成了五大主流AI服务:百度文心一言、OpenAI ChatGPT、Google Gemini、字节豆包和阿里通义千问。无论您是个人博客作者还是企业网站运营者,这款插
3
Java线程池
Java总体设计 ThreadPoolExecutor实现的顶层接口是Executor,顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦。用户无需关注如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务
4
Java线程知识
Java线程基础 Java线程是什么? 线程 (Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 进程 (Process):程序运行的实例,每个进程有独立的内存空间。 线程 :进程内部的执行单元,可以
5
从 WordPress 到 Astro迁移实战全记录
文章记录将 Muxui 从 WordPress(B2 Pro)完整迁移到 Astro 静态博客主题 Firefly 的全过程:导出 WXR、HTML 转 Markdown、图床改写、友链与导航定制,以及迁移中踩过的坑。
随机文章随机推荐

评论区

Profile Image of the Author
Muxui
Hello, I'm Muxui.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
站点统计
文章
24
分类
8
标签
19
总字数
53,213
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.14.5
文章许可
CC BY-NC-SA 4.0