核心目标:使用 YOLO(优先选择 YOLOv8,工业界主流且易用)检测图像中每个独立数字的边界框(bounding box) 并识别数字类别(0-9),即「逐位标注、逐位检测」,而非检测整串数字的整体框。本教程聚焦 digit 框检测的核心环节(标注规范、训练适配、框精度优化),覆盖从环境搭建到推理验证的全流程。

一、核心前提:digit 框检测的关键要求

  1. 标注粒度:每个数字(0-9)必须单独标注一个框,即使数字粘连(如 “69”),也需尽可能拆分标注独立框;

  2. 框的精度:标注框需紧贴数字边缘(上下左右无多余背景、不裁切数字);

  3. 类别对应:每个框对应唯一类别(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.015hsv_s=0.7hsv_v=0.4,模拟不同光照下的 digit 框);

  • 标注优化:确保框紧贴 digit 边缘,无多余背景。

3. 数字粘连(如 69、85)的框检测优化

  • 标注时尽可能拆分独立框(即使粘连,也标注各自的最小包围框);

  • 训练时增加mosaic增强(默认开启),提升模型对粘连数字的拆分能力;

  • 推理时启用agnostic_nms=True(类别无关 NMS),避免粘连框被误过滤。

六、常见问题解决

  1. 训练时框损失不下降
  • 检查标注文件:确保坐标是归一化值(0-1),无超出范围的情况;

  • 确认数据集配置文件路径正确,ncnames与标注匹配;

  • 降低学习率(lr0=0.001),增大box损失权重。

  1. 推理时 digit 框重复 / 重叠
  • 增大 NMS 的 IOU 阈值(推理时iou=0.6);

  • 训练时减少mosaic增强比例(mosaic=0.5),避免模型学错框位置。

  1. 数字类别混淆(如 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:验证集框检测可视化结果(直观查看框精度)。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐