个人博客:YOLOv8实现手写数字识别系统:从MNIST到实时摄像头检测 - iDing's 博客
这个项目结合了传统的MNIST数据集和现代的目标检测算法YOLOv8,实现了以下功能:
将MNIST数据集转换为YOLO格式
使用YOLOv8训练手写数字识别模型
通过摄像头实时识别手写数字
相比传统的分类方法,使用YOLOv8进行目标检测的优势在于:能同时检测多个数字、处理不同尺寸的输入图像,并在复杂背景中定位识别数字。
完整代码已经开源在Github Yolo8 手写体识别 欢迎start!
MNIST是深度学习领域最著名的数据集之一,包含60,000张训练图像和10,000张测试图像,每张图像为28×28像素的手写数字(0-9)。
在本项目中,我们首先将MNIST数据集转换为YOLO格式。YOLO格式的标注文件格式为:<类别ID> <中心点x> <中心点y> <宽度> <高度>
,所有值都归一化到0-1之间。
def _process_dataset(dataset, images_dir, labels_dir):
for idx in range(len(dataset)):
img, label = dataset[idx]
# 保存图像
img_path = os.path.join(images_dir, f"{idx:05d}.png")
img.save(img_path)
# 创建YOLO格式标签文件
label_path = os.path.join(labels_dir, f"{idx:05d}.txt")
with open(label_path, 'w') as f:
# 设定数字在图像中心,占据图像约80%的面积
f.write(f"{label} 0.5 0.5 0.8 0.8\n")
YOLOv8是目前最先进的目标检测算法之一,在速度和精度方面取得了很好的平衡。我们使用YOLOv8 nano版本,该版本体积小、推理速度快,非常适合实时应用。
训练参数设置如下:
输入图像尺寸:32×32像素
训练轮数:50轮
批次大小:64
初始学习率:0.01
数据增强:水平翻转、马赛克增强、混合增强等
model.train(
data=data_yaml_path,
epochs=50,
imgsz=32,
batch=64,
lr0=0.01,
# 数据增强参数
mosaic=1.0,
mixup=0.1,
degrees=10.0,
translate=0.2
)
模型训练完成后,系统会自动调用摄像头进行实时识别。关键步骤包括:
图像预处理:将摄像头捕获的帧转换为灰度图,应用高斯模糊减少噪声,使用自适应阈值提取手写区域
使用YOLOv8模型预测
对预测结果进行可视化展示
def camera_recognition(model_path):
# 加载模型
model = YOLO(model_path)
# 启动摄像头
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, frame = cap.read()
if success:
# 预处理帧
preprocessed_frame = preprocess_frame(frame)
# 进行预测
results = model.predict(preprocessed_frame)
# 显示结果
for result in results:
boxes = result.boxes
for box in boxes:
# 绘制边界框和标签
x1, y1, x2, y2 = box.xyxy[0]
conf = box.conf[0]
cls = int(box.cls[0])
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.putText(frame, f"{cls}: {conf:.2f}", (int(x1), int(y1)-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
经过50轮训练,模型在MNIST测试集上达到了约99%的准确率。在实时摄像头测试中,模型能够成功识别清晰手写的数字,甚至在不同角度、大小和光照条件下也表现良好。
实际应用时,我们发现以下因素会影响识别效果:
笔迹的清晰度和粗细
背景的复杂度
光照条件
摄像头与纸张的角度
这样的手写数字识别系统可以应用于多个场景:
教育领域:帮助儿童学习数字书写
表单自动化处理:识别手写表格中的数字
邮政编码识别:自动分拣信件
银行支票处理:识别支票上的金额
未来可以对系统进行以下改进:
扩展到手写字母和符号的识别
优化模型以提高识别速度,适合在移动设备上运行
改进预处理算法,增强在复杂背景下的识别能力
集成OCR技术,实现对完整文本的识别
本项目展示了如何将经典的MNIST数据集与现代的YOLOv8目标检测算法结合,构建一个实时手写数字识别系统。通过这种结合,我们既能享受MNIST数据集丰富的训练样本,又能利用YOLO算法在目标检测领域的优势,实现更实用的应用场景。
对于想要入门计算机视觉和深度学习的开发者来说,这是一个很好的起点项目,不仅能够学习到模型训练的基础知识,还能掌握如何将训练好的模型应用到实际场景中。