简介这份资源是面向计算机、通信、人工智能、自动化等专业学生与从业者的机器学习期末大作业完整方案聚焦轮胎字符识别这一典型图像分类任务适合作为课程设计、毕业设计或自学进阶的参考项目。压缩包共156个文件约333MB包含19个Python源码文件、63张png与27张jpg图像样本、6组pdmodel与pdiparams推理模型文件以及若干txt说明、md文档和ttf字体资源覆盖数据、训练、推理与结果展示的完整链路。项目代码经过调试测试答辩评审分达到98分已有130人学习下载。读者可从中获得可运行的识别流程、预训练模型权重、结果示例图与使用说明既能直接复现实验也能在此基础上调整网络结构或更换数据集实现车牌、仪表盘等相似字符识别功能具备较高的学习借鉴价值。1. 轮胎字符识别到底难在哪从一条产线质检的翻车说起轮胎胎侧的字符识别是机器学习期末作业里少见的「看起来简单、跑起来全是坑」的题目。字符本身只有字母和数字类别不过几十个但工业现场拍出来的图字符是压在弧形胎面上的光照不均、油污反光、字符拉伸变形再加上模具磨损导致的笔画断裂直接套用印刷体 OCR 的模型准确率能掉到六成以下。这个项目的价值就在于它把「机器学习期末作业」这个场景和真实的工业质检需求接上了你要交付的不只是一个能跑通的脚本而是一套从数据标注、预处理、模型训练到推理部署的完整链路外加模型权重和一份别人能照着跑起来的使用说明。适合谁做正在赶机器学习课程设计、想拿一个不烂大街的题目、又愿意花两三天把数据管线搭明白的本科生或初级工程师。下面我按自己踩过的顺序把这条链路拆开讲。2. 数据从哪来、怎么标轮胎字符识别的数据集构建与增强策略2.1 轮胎字符图像的三类来源与采集注意点做这个题目第一道坎不是模型是数据。常见做法有三类来源一是公开数据集比如一些工业缺陷检测比赛里附带的轮胎字符子集数量少但标注干净二是自己用手机或工业相机在汽修厂、轮胎店拍这类数据最贴近真实分布但需要自己标三是用合成工具生成把标准字符贴到轮胎纹理背景上做预训练补充。我一般会以第二类为主、第一类做验证、第三类做增强。采集时有几个硬性注意点。拍摄距离控制在 30 到 50 厘米太近畸变大太远字符像素不够尽量让字符区域占画面宽度的三分之一以上避免正对强光源侧光更容易显出字符的凹凸轮廓。如果只能拿到少量真实图别急着上复杂模型先把数据增强做扎实否则模型学到的全是背景噪声。2.2 标注格式选择与 LabelImg 实操字符识别本质是「检测 识别」两阶段标注方式决定了你后面用哪套模型。如果走检测路线用矩形框标出每个字符的位置和类别如果走整行识别路线用四点框标出整段字符区域再交给 CTC 解码。期末作业建议走检测路线因为可解释性强答辩时好讲。用 LabelImg 标注的流程如下# 安装标注工具 pip install labelImg # 启动指定图片目录和预定义类别文件 labelImg ./images ./predefined_classes.txt标注时按W画框选类别按D下一张。predefined_classes.txt里一行一个类别比如0到9、A到Z。标完导出 YOLO 格式每张图对应一个.txt每行是类别索引 中心x 中心y 宽 高坐标都归一化到 0 到 1。注意轮胎字符里0和O、1和I极易混标注阶段就要定死规则比如统一把字母 O 标成数字 0否则模型学出来的类别边界是乱的。2.3 针对轮胎场景的四种增强手段通用增强在轮胎图上会失效比如随机裁剪容易把字符切掉一半。我常用的四种是随机亮度对比度扰动模拟车间光照变化小角度旋转正负 10 度以内模拟胎面弧度高斯噪声模拟油污和传感器噪声随机擦除模拟字符被泥污遮挡。用 Albumentations 写起来最省事import albumentations as A transform A.Compose([ A.RandomBrightnessContrast(brightness_limit0.3, contrast_limit0.3, p0.7), A.Rotate(limit10, border_mode0, p0.5), A.GaussNoise(var_limit(10.0, 50.0), p0.4), A.CoarseDropout(max_holes4, max_height12, max_width12, p0.3), ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels]))brightness_limit和contrast_limit控制扰动幅度轮胎图建议不超过 0.3再大字符就糊了。Rotate的border_mode0是补黑边避免旋转后出现镜像填充。CoarseDropout的max_holes别超过 4否则一张图里字符被遮太多模型会学偏。增强只对训练集做验证集保持原图否则你评估的指标是虚高的。3. 模型怎么选、怎么训从 YOLO 检测到 CRNN 识别的两阶段方案3.1 为什么期末作业优先选 YOLOv8 而不是两阶段检测器轮胎字符检测属于小目标密集场景Faster R-CNN 这类两阶段检测器精度够但推理慢训练也吃显存期末作业的机器未必扛得住。YOLOv8n 或 YOLOv8s 在 640 分辨率下单张图推理能到几十毫秒mAP 在字符这种规整目标上足够用。更重要的是 Ultralytics 的接口封装得好训练脚本几行就能跑省下来的时间可以花在数据清洗上。选型时看三个参数imgsz设 640字符小的话可以提到 960但显存翻倍batch根据显存调8G 显存跑 YOLOv8n 可以到 16epochs先跑 100 看收敛曲线不够再加。别一上来就上 YOLOv8x参数量大十倍期末作业的数据量根本喂不饱过拟合是必然的。3.2 训练脚本与关键参数逐行说明from ultralytics import YOLO # 加载预训练权重迁移学习比从头训快得多 model YOLO(yolov8n.pt) # 开始训练 results model.train( datatire_chars.yaml, # 数据集配置文件路径 epochs100, # 训练轮数 imgsz640, # 输入分辨率 batch16, # 批大小 lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 patience20, # 早停耐心值 augmentTrue, # 开启内置增强 device0 # 使用第一块 GPUCPU 填 cpu )data指向的 yaml 文件里要写清train、val两个目录和names类别列表。lr00.01是 YOLOv8 的默认值数据量小于两千张时可以降到 0.005防止震荡。patience20表示验证指标 20 轮不提升就停省时间。augmentTrue会启用 Ultralytics 内置的 mosaic 增强但轮胎图里 mosaic 拼接容易把不同图的字符拼在一起造成语义混乱如果发现训练 loss 降不下去可以关掉它改用第 2 章那套自定义增强。3.3 检测完的字符怎么拼成完整编号CRNN 识别与 CTC 解码检测框出来只是单个字符轮胎编号是一串需要按位置排序后拼接。简单做法是按框的中心 x 坐标从左到右排直接输出类别序列。但实际会有漏检和误检更稳的做法是接一个轻量 CRNN 做整行识别把检测框裁出来送进去用 CTC 解码出字符串。CRNN 的核心是 CNN 提特征、RNN 学序列、CTC 做对齐。训练时标签是整串字符不用逐字对齐这对轮胎字符这种长度不固定的场景很友好。损失函数用CTCLoss解码用贪心或束搜索。期末作业如果时间紧可以先不做 CRNN用检测结果排序拼接答辩时说明这是简化方案后续可扩展老师一般能接受。4. 训练完怎么用模型导出、推理脚本与使用说明的写法4.1 导出 ONNX 与推理脚本训练完的.pt权重只能在 PyTorch 环境跑交付时最好导出 ONNX方便别人在没有深度学习框架的机器上推理# 导出 ONNX指定输入分辨率 yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640导出后得到一个.onnx文件用onnxruntime推理import onnxruntime as ort import numpy as np import cv2 # 加载模型 session ort.InferenceSession(best.onnx) # 预处理缩放、归一化、转 NCHW img cv2.imread(test.jpg) img cv2.resize(img, (640, 640)) img img[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0 img np.expand_dims(img, axis0) # 推理 outputs session.run(None, {session.get_inputs()[0].name: img})预处理里的[:, :, ::-1]是 BGR 转 RGBYOLO 训练时用的是 RGB推理时必须一致否则颜色通道反了精度会掉。/ 255.0是归一化和训练时的预处理保持一致。输出是[1, 84, 8400]的张量需要自己写后处理做 NMS 和坐标还原这部分代码量不小建议直接参考 Ultralytics 的导出脚本别自己从头写。4.2 使用说明该写哪几块内容一份能让别人跑起来的使用说明至少包含四块环境依赖、数据准备、训练命令、推理示例。环境依赖写清 Python 版本、PyTorch 版本、Ultralytics 版本别写「安装最新版」版本不匹配是新手翻车最多的地方。数据准备写清目录结构和标注格式最好附一个样例。训练命令直接给可复制的完整命令别只写「运行 train.py」。推理示例给一张测试图和预期输出让别人能对照验证。提示使用说明里加一节「常见报错」把你训练时遇到的显存不足、路径错误、类别不匹配写进去这份说明的实用价值会翻倍。5. 避坑与排查轮胎字符识别项目里最容易翻车的五件事现象一训练 loss 正常下降但验证 mAP 一直上不去。原因通常是训练集和验证集分布不一致比如训练集全是白天拍的验证集混了夜间图。解决方法是先做数据分布统计按光照条件分层划分数据集别用纯随机划分。现象二推理时检测框位置整体偏移。原因是预处理时用了 letterbox 填充但后处理还原坐标时没减掉填充偏移。解决方法是记录缩放比例和填充量在还原时按同样参数逆变换回去。现象三模型把0和O混为一类。这是标注阶段规则不统一导致的模型本身没错。解决方法是回到标注文件统一映射规则后重新训练或者在推理后处理里加一层规则校正比如轮胎编号里字母和数字的位置是固定的按位置强制纠正。现象四换一台机器跑推理结果和训练时对不上。常见原因是 OpenCV 读图和 PIL 读图的通道顺序不同或者归一化参数不一致。解决方法是把预处理写成一个独立函数训练和推理共用同一份代码别各写各的。现象五显存不足batch 调到 1 还是 OOM。原因可能是imgsz设太大或者数据加载时开了太多 worker。解决方法是先把imgsz降到 416 跑通流程再逐步往上加workers设成 2 到 4 就够设太大反而抢内存。6. 把准确率再抬一截三个我反复验证过的调优技巧第一个技巧是难例挖掘。训练完第一轮后把验证集里置信度低或预测错的图挑出来人工检查标注是否有误修正后加入训练集再训一轮。轮胎字符项目里这一步通常能把 mAP 抬 3 到 5 个点比调超参管用得多。第二个技巧是测试时增强。推理时把原图、水平翻转图、轻微旋转图各跑一遍把检测框做加权融合。代价是推理时间翻三倍但期末作业的演示场景对速度不敏感精度优先。融合时用 NMS 的变体 WBF比普通 NMS 更稳。第三个技巧是类别权重平衡。轮胎字符里数字出现频率远高于字母直接训练会让模型偏向数字。在损失函数里给稀有类别加权重或者对稀有类别做过采样能明显改善字母的召回率。调优手段预期提升代价难例挖掘mAP 3~5需要人工复查测试时增强mAP 1~2推理时间 x3类别权重平衡稀有类召回 5~10需改损失函数这三个技巧我一般按顺序上先做难例挖掘再做类别平衡最后加测试时增强。别一次全上否则出了问题你分不清是哪个环节带来的。做这个项目最大的教训是数据质量决定上限模型和技巧只是逼近上限的手段我见过太多人把时间花在换模型上却不肯花半天把标注里的错框改干净。希望帮到你。本文还有配套的精品资源点击获取