YOLOv8 逐位数字框(digit 框)检测模型训练
核心目标:使用 YOLO(优先选择 YOLOv8,工业界主流且易用)检测图像中并识别数字类别(0-9),即「逐位标注、逐位检测」,而非检测整串数字的整体框。本教程聚焦 digit 框检测的核心环节(标注规范、训练适配、框精度优化),覆盖从环境搭建到推理验证的全流程。
核心目标:使用 YOLO(优先选择 YOLOv8,工业界主流且易用)检测图像中每个独立数字的边界框(bounding box) 并识别数字类别(0-9),即「逐位标注、逐位检测」,而非检测整串数字的整体框。本教程聚焦 digit 框检测的核心环节(标注规范、训练适配、框精度优化),覆盖从环境搭建到推理验证的全流程。
一、核心前提:digit 框检测的关键要求
-
标注粒度:每个数字(0-9)必须单独标注一个框,即使数字粘连(如 “69”),也需尽可能拆分标注独立框;
-
框的精度:标注框需紧贴数字边缘(上下左右无多余背景、不裁切数字);
-
类别对应:每个框对应唯一类别(0-9),class_id 与数字一一映射。
二 digit 框检测专用数据集构建(核心环节)
1. 数据集结构(YOLO 标准格式)
digit_box_dataset # 数据集根目录
├── images/ # 图片目录(按训练/验证/测试划分)
│ ├── train/ # 训练集图片(70%)
│ ├── val/ # 验证集图片(20%)
│ └── test/ # 测试集图片(10%)
├── labels/ # 标注文件目录(与images目录结构完全一致)
│ ├── train/
│ ├── val/
│ └── test/
└── digit\_box.yaml # 数据集配置文件
2. digit 框标注规则(必须严格遵守)
(1)标注格式(YOLOv8 要求)
每个图片对应一个.txt标注文件,每行对应一个 digit 框,格式:
<class_id> <x_center> <y_center><width> <height>
-
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
# 训练/验证/测试集图片路径(相对于path)
train: images/train
val: images/val
test: images/test
# digit类别配置(固定10类)
nc: 10
# 类别数:0-9
names: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # class_id与数字一一对应
三、digit 框检测模型训练
1. 训练策略适配(digit 框特点)
digit 框通常是「小目标 / 中等目标」,训练时需侧重:
-
输入尺寸:建议 640×640(32 的倍数,适配小框检测);
-
批次大小:根据 GPU 显存调整(1080Ti→16,3090→32,CPU→8);
-
预训练模型:优先用
yolov8n.pt(轻量化)或yolov8s.pt(平衡精度 / 速度),小目标可自定义锚框。
3.训练
from ultralytics import YOLO
# 1. 加载预训练模型(适配digit框检测)
model = YOLO("yolov8s.pt") # 小目标可选yolov8n.pt,高精度可选yolov8m.pt
# 2. 启动训练(重点优化digit框精度)
train\_results = model.train(
data="digit\_box.yaml", # 数据集配置
epochs=100, # 训练轮数
imgsz=640, # 输入尺寸
batch=16, # 批次大小
device=0, # 训练设备
lr0=0.01, # 初始学习率
lrf=0.01, # 最终学习率(lr0\*lrf)
weight\_decay=0.0005, # 权重衰减(防止过拟合)
warmup\_epochs=3, # 热身轮数(小数据集1-3)
box=7.5, # 框损失权重(核心:提升digit框定位精度)
cls=0.5, # 类别损失权重
save=True, # 保存最佳模型
project="digit_box\train",# 训练结果保存目录
name="digit_box_model", # 模型名称
exist_ok=True # 覆盖已有目录
)
# 3. 打印训练关键结果
print("最佳模型路径:", model.best)
print("训练集框损失:", train_results.results_dict["train/box_loss"])
print("验证集mAP@0.5(框精度核心指标):", train_results.metrics["metrics/mAP50(B)"])
4. 关键参数说明(针对 digit 框检测)
| 参数 | 作用 | 推荐值 |
|---|---|---|
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 # 以IOU=0.5为标准评估框精度
)
#打印核心评估指标(digit框检测重点关注)
print(f"框平均精度mAP@0.5:{val_metrics.box.map:.4f}") # 核心指标,目标>0.9
print(f"框精确率(框定位准不准):{val_metrics.box.mp:.4f}")
print(f"框召回率(框有没有漏检):{val_metrics.box.mr:.4f}")
print(f"类别准确率:{val\_metrics.box.mc:.4f}") # digit类别简单,目标>0.95
# 查看单类别精度(比如数字6/9易混淆)
for cls_id, cls_name in model.names.items():
print(f"数字{cls_name}的框精度:{val_metrics.box.ap50\[cls_id]:.4f}")
3. 评估结果解读
-
mAP@0.5≥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 # NMS IOU阈值(去重框)
# 加载模型
model = YOLO(MODEL_PATH)
# 1. 推理(检测digit框)
results = model(
TEST_IMG_PATH,
imgsz=640,
conf=CONF_THRESH,
iou=IOU\_THRESH,
device=0
)
# 2. 解析digit框+数字
digit_boxes = []
for r in results:
; boxes = r.boxes # 所有digit框
for box in boxes:
# 解析框坐标(像素值)
x1, y1, x2, y2 = map(int, box.xyxy\[0]) # 左上角(x1,y1),右下角(x2,y2)
# 解析数字类别
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), # digit框坐标
"center": ((x1+x2)/2, (y1+y2)/2) # 框中心(用于排序)
})
# 3. 按框中心x坐标排序(还原数字顺序)
digit_boxes = sorted(digit_boxes, key=lambda x: x["center"]\[0])
detected\_digits = [d["digit"] for d in digit_boxes]
# 4. 可视化digit框(绘制到图片上)
img = cv2.imread(TEST_IMG_PATH)
for d in digit_boxes:
x1, y1, x2, y2 = d["bbox"]
# 绘制digit框(绿色,线宽2)
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)
# 5. 输出结果
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] # 超小digit框
- [23,33, 30,61, 62,45] # 中小digit框
- [59,119, 116,90, 156,198] # 大digit框
-
增大输入尺寸(如 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:验证集框精度(mAP@0.5)最高的模型(推荐部署); -
last.pt:最后一轮训练的模型; -
results.csv:训练日志(含框损失、mAP 等指标); -
confusion_matrix.png:类别混淆矩阵(查看数字混淆情况); -
val_batch0_pred.jpg:验证集框检测可视化结果(直观查看框精度)。
更多推荐

所有评论(0)