跳到主要内容YOLOv8 逐位数字框检测模型训练实战 | 极客日志PythonAI算法
YOLOv8 逐位数字框检测模型训练实战
YOLOv8 逐位数字框检测方案涵盖数据标注规范、模型训练配置及推理优化细节。重点解决小目标定位精度、数字粘连拆分及类别混淆问题。通过调整损失权重、输入尺寸及锚框策略,可实现工业级检测效果。流程包括环境搭建、数据集构建、训练调优及最终部署验证,适用于 OCR 前处理等场景。
佛系玩家3 浏览 YOLOv8 逐位数字框检测模型训练实战
核心目标是利用 YOLOv8 检测图像中每个独立数字的边界框(bounding box)并识别数字类别(0-9),实现「逐位标注、逐位检测」,而非检测整串数字的整体框。本教程聚焦 digit 框检测的核心环节,覆盖从环境搭建到推理验证的全流程。
一、核心前提:digit 框检测的关键要求
- 标注粒度:每个数字(0-9)必须单独标注一个框,即使数字粘连(如'69'),也需尽可能拆分标注独立框;
- 框的精度:标注框需紧贴数字边缘(上下左右无多余背景、不裁切数字);
- 类别对应:每个框对应唯一类别(0-9),class_id 与数字一一映射。
二、digit 框检测专用数据集构建
1. 数据集结构(YOLO 标准格式)
digit_box_dataset
├── images/
│ ├── train/
│ ├── val/
│ └── test/
├── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── digit_box.yaml
2. digit 框标注规则
(1)标注格式(YOLOv8 要求)
每个图片对应一个 .txt 标注文件,每行对应一个 digit 框,格式如下:
class_id:0→0,1→1,…,9→9(固定映射);
x_center/y_center:digit 框中心的归一化坐标(除以图片宽 / 高,范围 0-1);
width/height:digit 框宽 / 高的归一化值(除以图片宽 / 高,范围 0-1)。
(2)逐位标注示例
假设图片 859.jpg(宽 640,高 480)包含数字 8、5、9,各自的框坐标如下:
| 数字 | 像素框(x1,y1,x2,y2) | 归一化中心 (xc,yc) | 归一化宽高 (w,h) | class_id |
|---|
| 8 | (120, 200, 180, 280) | (0.234, 0.417) | (0.094, 0.167) | 8 |
| 5 | (220, 200, 280, 280) | (0.391, 0.417) | (0.094, 0.167) | 5 |
| 9 | (320, 200, 380, 280) | (0.547, 0.417) | (0.094, 0.167) | 9 |
则 859.txt 标注文件内容为:
8 0.234 0.417 0.094 0.167
5 0.391 0.417 0.094 0.167
9 0.547 0.417 0.094 0.167
(3)标注工具推荐
- 可视化标注:LabelImg(直接支持 YOLO 格式,勾选「YOLO」模式即可);
- 批量标注:LabelStudio(适合大量数据,可导出 YOLO 格式);
- 自定义脚本:若有数字定位规则(如固定间距),可写脚本批量生成标注。
3. 数据集配置文件(digit_box.yaml)
创建于数据集根目录,内容如下(路径替换为实际路径):
path: /home/user/digit_box_dataset
train: images/train
val: images/val
test: images/test
nc: 10
names: ['0','1','2','3','4','5','6','7','8','9']
三、digit 框检测模型训练
1. 训练策略适配
digit 框通常是「小目标 / 中等目标」,训练时需侧重以下几点:
- 输入尺寸:建议 640×640(32 的倍数,适配小框检测);
- 批次大小:根据 GPU 显存调整(1080Ti→16,3090→32,CPU→8);
- 预训练模型:优先用
yolov8n.pt(轻量化)或 yolov8s.pt(平衡精度 / 速度),小目标可自定义锚框。
2. 启动训练
from ultralytics import YOLO
model = YOLO("yolov8s.pt")
train_results = model.train(
data="digit_box.yaml",
epochs=100,
imgsz=640,
batch=16,
device=0,
lr0=0.01,
lrf=0.01,
weight_decay=0.0005,
warmup_epochs=3,
box=7.5,
cls=0.5,
save=True,
project="digit_box_train",
name="digit_box_model",
exist_ok=True
)
print("最佳模型路径:", model.best)
print("训练集框损失:", train_results.results_dict["train/box_loss"])
print("验证集 [email protected](框精度核心指标):", train_results.metrics["metrics/mAP50(B)"])
3. 关键参数说明
| 参数 | 作用 | 推荐值 |
|---|
box | 框损失权重(提升框定位精度) | 7.0-8.0 |
imgsz | 输入尺寸(越大越易检测小 digit 框) | 640/800 |
patience | 早停阈值(避免过拟合) | 20-30 |
batch | 批次大小(显存允许则越大越好) | 16-32 |
lr0 | 初始学习率(小数据集调小) | 0.001-0.01 |
四、digit 框检测模型评估
训练完成后,重点评估 digit 框的「定位精度」和「类别准确率」。
1. 评估解析
model = YOLO("digit_box_train/digit_box_model/weights/best.pt")
val_metrics = model.val(
data="digit_box.yaml",
imgsz=640,
device=0,
iou=0.5
)
print(f"框平均精度 [email protected]:{val_metrics.box.map:.4f}")
print(f"框精确率(框定位准不准):{val_metrics.box.mp:.4f}")
print(f"框召回率(框有没有漏检):{val_metrics.box.mr:.4f}")
print(f"类别准确率:{val_metrics.box.mc:.4f}")
for cls_id, cls_name in model.names.items():
print(f"数字{cls_name}的框精度:{val_metrics.box.ap50[cls_id]:.4f}")
2. 评估结果解读
- [email protected]≥0.9:digit 框检测达标(工业场景可接受);
- 框精确率低:标注框不规范 / 模型过拟合 → 优化标注、增加数据增强;
- 框召回率低:小 digit 框漏检 → 增大 imgsz、自定义小锚框;
- 类别准确率低:数字混淆(如 6/9) → 增加混淆数字的标注样本。
五、digit 框检测推理
训练完成后,用最佳模型检测图片中的 digit 框,并解析每个框的位置和数字。
完整推理脚本
import cv2
from ultralytics import YOLO
MODEL_PATH = "digit_box_train/digit_box_model/weights/best.pt"
TEST_IMG_PATH = "test_digit.jpg"
CONF_THRESH = 0.5
IOU_THRESH = 0.5
model = YOLO(MODEL_PATH)
results = model(
TEST_IMG_PATH,
imgsz=640,
conf=CONF_THRESH,
iou=IOU_THRESH,
device=0
)
digit_boxes = []
for r in results:
boxes = r.boxes
for box in boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0])
cls_id = int(box.cls[0])
digit = model.names[cls_id]
conf = round(float(box.conf[0]), 3)
digit_boxes.append({
"digit": digit,
"confidence": conf,
"bbox": (x1, y1, x2, y2),
"center": ((x1+x2)/2, (y1+y2)/2)
})
digit_boxes = sorted(digit_boxes, key=lambda x: x["center"][0])
detected_digits = [d["digit"] for d in digit_boxes]
img = cv2.imread(TEST_IMG_PATH)
for d in digit_boxes:
x1, y1, x2, y2 = d["bbox"]
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
label = f"{d['digit']} ({d['confidence']})"
cv2.putText(img, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
print("检测到的逐位数字:", detected_digits)
print("每个 digit 框详情:", digit_boxes)
cv2.imwrite("digit_box_detect_result.jpg", img)
cv2.imshow("Digit Box Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
六、digit 框检测优化技巧
1. 小 digit 框漏检优化
- 自定义小锚框(适配 digit 尺寸):在
digit_box.yaml 中添加锚框配置:
anchors:
- [6,8, 10,13, 16,23]
- [23,33, 30,61, 62,45]
- [59,119, 116,90, 156,198]
- 增大输入尺寸(如 800×800),提升小框检测能力;
- 降低置信度阈值(推理时
conf=0.3),减少漏检。
2. digit 框定位不准优化
- 加大
box 损失权重(训练时 box=8.0);
- 增强数据增强(训练时开启
hsv_h=0.015、hsv_s=0.7、hsv_v=0.4,模拟不同光照下的 digit 框);
- 标注优化:确保框紧贴 digit 边缘,无多余背景。
3. 数字粘连(如 69、85)的框检测优化
- 标注时尽可能拆分独立框(即使粘连,也标注各自的最小包围框);
- 训练时增加
mosaic 增强(默认开启),提升模型对粘连数字的拆分能力;
- 推理时启用
agnostic_nms=True(类别无关 NMS),避免粘连框被误过滤。
七、常见问题解决
-
训练时框损失不下降:
- 检查标注文件:确保坐标是归一化值(0-1),无超出范围的情况;
- 确认数据集配置文件路径正确,
nc 和 names 与标注匹配;
- 降低学习率(
lr0=0.001),增大 box 损失权重。
-
推理时 digit 框重复 / 重叠:
- 增大 NMS 的 IOU 阈值(推理时
iou=0.6);
- 训练时减少
mosaic 增强比例(mosaic=0.5),避免模型学错框位置。
-
数字类别混淆(如 6/9、0/8):
- 增加混淆数字的标注样本;
- 训练时增大
cls 损失权重(cls=1.0);
- 推理时对混淆数字做后处理(如根据框的方向区分 6/9)。
八、最终输出
训练完成后,digit_box_train/digit_box_model/weights/ 目录下的文件:
best.pt:验证集框精度([email protected])最高的模型(推荐部署);
last.pt:最后一轮训练的模型;
results.csv:训练日志(含框损失、mAP 等指标);
confusion_matrix.png:类别混淆矩阵(查看数字混淆情况);
val_batch0_pred.jpg:验证集框检测可视化结果(直观查看框精度)。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online