ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

YOLOv8+YOLOv5条形码检测与生产日期识别:商品保质期检测系统实战与数据集构建

YOLOv8+YOLOv5条形码检测与生产日期识别:商品保质期检测系统实战与数据集构建 1. 商品包装检测的真实痛点与场景拆解商品包装上的条形码、生产日期、保质期这三类信息看起来都是印刷字符但检测难度完全不在一个量级。条形码是规则的黑白条纹边缘锐利、对比度高理论上最好检测生产日期和保质期往往是点阵喷码或激光打码字符细、颜色浅、还经常印在曲面或反光材质上一不留神就漏检。我在零售仓储的质检项目里踩过最典型的坑同一批货正面条形码识别率能到 98%侧面喷码的生产日期却只有 60% 出头原因就是打码角度和光照不一致。这个场景的核心需求可以拆成三层。第一层是定位把条形码、生产日期、保质期三个目标框出来这是 YOLOv8 和 YOLOv5 最擅长的目标检测任务。第二层是识别条形码需要解码成数字串日期需要 OCR 转成文本这一步检测模型本身不做得靠后处理。第三层是业务判断拿到生产日期和保质期后计算是否临期或过期这才是零售质检真正要的结论。适合读这篇的人有三类做零售/仓储质检系统的工程师想用 YOLO 系列快速搭一个可跑通的检测 demo做智能硬件或边缘设备的朋友需要评估模型在摄像头实时流上的推理速度还有做课程设计或论文的同学需要一套完整的数据集构建加训练加验证流程。我下面给的配置和目录结构都是可以直接复制去跑的数据集标注规范也会讲清楚避免你标完发现类别对不上。先说清楚技术选型。YOLOv8 是 Ultralytics 维护的较新版本API 更统一训练和导出都走一套命令YOLOv5 生态成熟、资料多很多老项目还在用。两者我都保留因为实际部署时你可能受限于推理框架或历史代码。检测类别就三个Barcode、ExpireDate、ProduceDate生产日期和保质期如果喷码格式接近可以合并成一个ExpireDate类excerpt 里就是这么做的我后面按三类讲你可以按需合并。数据集规模参考 2000 张图片这个量级对三个类别来说够用但要注意类别平衡。条形码样本通常最多日期类样本偏少如果直接训模型会偏向条形码。我的做法是日期类样本至少占 40%不够就用数据增强补。训练轮数 117 轮是个经验值实际要看 mAP 曲线什么时候平别死磕轮数。这一节先把问题和场景讲透下一节讲怎么用 TaoToken 把模型对话和 API 调用串起来方便你在训练过程中快速验证想法、调试 prompt 或做 OCR 后处理的联调。2. TaoToken 前置准备模型对话与 API 接入配置做这个商品检测系统除了本地训练 YOLO你大概率还需要调大模型来做 OCR 后处理、日期格式归一化或者干脆用多模态模型辅助判断喷码内容。TaoToken 在这里的角色是统一的模型调用入口你不用为每个模型单独配一套鉴权和地址。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置时别搞混。先说清楚它能做什么。TaoToken 提供兼容 OpenAI 风格的接口你可以用同一套 SDK 调用不同模型做模型对话、代码生成、文本处理都行。对于这个项目我主要用它做两件事一是训练过程中遇到报错或配置疑问直接开模型对话快速定位二是把 YOLO 检测出的日期区域裁剪图送去做 OCR 或语义校验比如判断「2025.03.15」和「保质期 12 个月」是否匹配。适合谁用如果你只是本地跑 YOLO 训练不调外部模型那这节可以跳过直接看第 3 节的训练配置。但如果你要做完整的商品系统涉及日期识别和业务判断建议把 API 接入配好后面联调会省很多事。配置步骤我按最小可用来写。首先去控制台创建 API Key地址是 https://taotoken.net/console/api-keys 登录后新建一个 Key复制保存好后面配置里要用。然后确认你要用的模型 ID不同模型能力不同做 OCR 后处理选文本能力强的做图像理解选多模态的。模型对话入口在 https://taotoken.net/models 可以先去试几条确认返回格式符合预期。这里有个关键点Base URL、API Key、Model ID 三件套必须配套。Base URL 填https://taotoken.net/apiKey 填你刚创建的Model ID 填你选定的模型名。三者缺一或填错最常见的报错就是 401 或 model not found。我见过有人 Base URL 填了带 UTM 的官网地址结果一直连不上记住 API 和官网是两个地址。如果你用 Claude Code 做辅助开发可以走 https://taotoken.net/claude-code 这个入口它把 Anthropic 风格的调用也统一了。Coding Plan 适合长期做编码和 Agent 任务的场景地址是 https://taotoken.net/coding-plan 如果你这个项目要持续迭代可以考虑。接入文档在 https://taotoken.net/doc 配置细节以文档为准。这一节的目标是让你把调用链路打通下一节进入 YOLOv8 和 YOLOv5 的具体训练配置包括数据集目录、YAML 文件和可复制的训练命令。3. 可复制配置数据集目录、YOLOv8 与 YOLOv5 训练文件这一节是全文最核心的操作部分我把数据集结构、标注规范、两个版本的训练配置都写成可直接复制的形式。先讲目录结构这是最容易出错的地方YOLO 对路径和文件名很敏感。数据集按标准 YOLO 格式组织根目录叫barcode_dataset里面分images和labels各自再分train、val、test。图片和标签文件名必须一一对应比如images/train/001.jpg对应labels/train/001.txt。标签文件每行格式是class_id x_center y_center width height坐标都是归一化到 0-1 的值。类别顺序在data.yaml里定义必须和标签里的 class_id 对应。barcode_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml内容如下路径按你的实际位置改类别名和顺序要和标注时一致path: ./barcode_dataset train: images/train val: images/val test: images/test names: 0: Barcode 1: ExpireDate 2: ProduceDate标注规范重点说三条。第一条形码框要贴紧条纹区域别把周围空白框进去否则解码时容易带入噪声。第二日期类目标如果字符分两行比如「生产日期」和具体日期框成一个整体不要拆成两个框OCR 时按整块处理更稳。第三喷码模糊或部分遮挡的样本也要标但可以在训练时通过--rect或 mosaic 增强提升鲁棒性别直接丢弃否则模型没见过难样本上线就翻车。YOLOv8 训练配置。Ultralytics 的 YOLOv8 用命令行或 Python 都行我习惯用 Python 脚本方便调参。先装依赖pip install ultralytics然后写训练脚本from ultralytics import YOLO model YOLO(yolov8n.pt) model.train( databarcode_dataset/data.yaml, epochs117, imgsz640, batch16, conf0.25, iou0.45, device0, projectruns/barcode, nameyolov8_exp, pretrainedTrue, optimizerSGD, lr00.01, patience30, )epochs117对应 excerpt 里的训练轮数imgsz640是常用输入尺寸batch16按显存调显存不够就降到 8。patience30表示 30 轮没提升就早停避免过拟合。训练完模型存在runs/barcode/yolov8_exp/weights/best.pt。YOLOv5 训练配置。YOLOv5 用train.py先克隆仓库装依赖然后python train.py \ --data barcode_dataset/data.yaml \ --weights yolov5s.pt \ --epochs 117 \ --img 640 \ --batch 16 \ --conf 0.25 \ --iou 0.45 \ --device 0 \ --project runs/barcode \ --name yolov5_exp两个版本的参数含义基本一致--weights指定预训练权重--img是输入尺寸。YOLOv5 的配置文件在data/下你也可以直接改data/coco128.yaml的副本把路径和类别换成自己的。如果你用 Cline 或 MCP 做辅助开发配置里同样要写全 Base URL、Key、Model ID 三件套Base URL 用https://taotoken.net/api别漏了/api后缀。Codex 的auth.json如果涉及自定义端点也要把地址和 Key 对应填好格式参考接入文档。这一节给的是可跑通的骨架下一节讲怎么验证训练结果包括 mAP 计算、推理速度测试和条码解码成功率。4. 验证请求与成功结果mAP、推理速度与条码解码成功率训练跑完不代表能用必须做三类验证检测精度、推理速度、业务指标。我按顺序讲怎么测、看什么数、什么算合格。检测精度看 mAP。YOLOv8 训练完会自动在 val 集上算 mAP50 和 mAP50-95结果在runs/barcode/yolov8_exp/results.csv里。mAP50 是 IoU 阈值 0.5 时的平均精度mAP50-95 是 0.5 到 0.95 多个阈值的平均后者更严格。excerpt 里精确率 75%这个数如果是 mAP50对三个类别来说偏低正常应该能到 85% 以上如果是 mAP50-9575% 算不错。你要先确认自己看的是哪个指标别被数字误导。单独验证命令yolo val modelruns/barcode/yolov8_exp/weights/best.pt databarcode_dataset/data.yaml imgsz640 batch16输出会按类别给 precision、recall、mAP50、mAP50-95。重点看日期类的 recall因为漏检比误检更致命漏了一个过期商品可能就出质量问题。如果日期类 recall 低于 0.8回去补样本或调conf阈值。推理速度测 FPS。用yolo predict或直接写脚本测单张耗时import time from ultralytics import YOLO model YOLO(runs/barcode/yolov8_exp/weights/best.pt) img test.jpg for _ in range(10): model(img) start time.time() for _ in range(100): model(img) print(avg ms:, (time.time() - start) / 100 * 1000)GPU 上 YOLOv8n 单张 640 输入大概 5-10msYOLOv5s 差不多。如果要做摄像头实时检测FPS 至少要 25 以上也就是单张 40ms 以内。达不到就换更小的模型或降输入尺寸imgsz416能明显提速但小目标精度会掉日期喷码本来就小慎降。条码解码成功率是业务指标。检测框出来后裁剪条形码区域送解码库比如pyzbar或zxing解码统计成功比例from pyzbar.pyzbar import decode from PIL import Image def decode_barcode(crop_path): img Image.open(crop_path) results decode(img) return results[0].data.decode(utf-8) if results else None测试集上跑一遍解码成功率低于 90% 就要查原因是检测框不准导致裁多了还是图像模糊、分辨率不够。我实测下来检测框贴紧条纹区域能把解码率提升 10 个点以上。日期识别验证。裁剪日期区域后送 OCR 或大模型检查返回文本是否包含合法日期格式。可以用正则先过滤import re pattern r(20\d{2})[.\-/年](\d{1,2})[.\-/月](\d{1,2}) match re.search(pattern, ocr_text)匹配到就说明格式基本对再和保质期做业务判断。这一步如果调 TaoToken 的模型记得 Base URL 用https://taotoken.net/apiKey 和 Model ID 配套返回异常先查 401 和 model not found。验证通过的标准我定三条mAP50 三个类别都 ≥0.85日期类 recall ≥0.8条码解码成功率 ≥0.9。达到就可以进系统集成达不到就回训练或数据环节调。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节把实际会撞到的报错列出来对照解决。这些错我在不同项目里都遇到过按报错信息定位最快。401 Unauthorized。调 TaoToken API 时最常见原因就三个Key 没填、Key 填错、Key 过期。检查你的配置里 API Key 是不是从 https://taotoken.net/console/api-keys 复制的完整串有没有多余空格。Base URL 必须是https://taotoken.net/api填成官网地址会直接 401。如果 Key 确认没问题还报 401去控制台看下额度或状态。local proxy failed。这个报错通常出现在本地网络环境有额外代理设置时请求没走到目标地址。检查你的环境变量里有没有HTTP_PROXY、HTTPS_PROXY之类的设置有就临时清掉再试。代码里如果显式设了 proxy 参数也去掉。这个错和 TaoToken 本身无关是本地网络配置问题。reading choices 相关报错。调模型接口时如果返回结构里没有choices字段解析就会报 KeyError 或 reading choices 失败。先打印完整返回体看结构确认是不是请求格式不对导致返回了错误信息。常见原因是 messages 格式写错或者 model ID 不存在。Model ID 去 https://taotoken.net/models 核对别自己拼。OAuth 相关报错。如果你用 Claude Code 或某些需要 OAuth 的工具接入报 OAuth 失败一般是回调地址或 token 配置不对。走 https://taotoken.net/claude-code 这个入口按文档配别手动改 OAuth 流程。Coding Plan 用户遇到鉴权问题先确认套餐状态和 Key 是否匹配。YOLO 训练侧报错。data.yaml路径写错会报 dataset not found检查path是相对还是绝对相对路径是相对于运行目录。标签格式错会报 label class out of range检查 class_id 有没有超过 names 数量。显存不足报 CUDA out of memory降 batch 或 imgsz。条码解码失败。检测框有了但解不出码先看裁剪图是不是太模糊或分辨率太低可以放大 2 倍再解。如果条形码是反色白条黑底pyzbar 可能解不出需要先做反色处理。曲面上的条码要校正透视简单做法是用检测框四点做透视变换。日期 OCR 乱码。喷码字体特殊或点阵断裂时 OCR 容易错可以把裁剪图二值化再送识别或者直接调多模态模型看图识别。调模型时三件套写全Base URL、Key、Model ID 一个都别少。排查顺序建议先确认 API 侧三件套和网络再确认 YOLO 数据和配置最后查后处理逻辑。大部分问题在前两步就能定位。6. 语义一致 CTA按你的下一步选入口走到这里你应该已经有一套能跑的检测流程了。接下来看你的目标选入口别乱点。如果你卡在接入或报错排查比如 401、local proxy failed、reading choices 这些直接去 API Keys 页面拿 Key再对照接入文档配https://taotoken.net/console/api-keys 和 https://taotoken.net/doc 。文档里有完整的 Base URL、鉴权方式和请求示例照着改最快。如果你想先验证模型能力比如试试多模态能不能直接读日期喷码去模型对话入口开几条测试https://taotoken.net/models 。先用小样本确认返回格式和准确度再决定要不要接进系统。如果你这个商品检测系统要长期迭代涉及持续编码、Agent 任务或批量处理看 Coding Planhttps://taotoken.net/coding-plan 。它适合有稳定调用需求的场景比按次调更省心。Claude Code 用户走这个入口https://taotoken.net/claude-code 配置按文档来别自己改 OAuth 流程。最后给个实用建议训练完先把best.pt和data.yaml一起备份标注文件和图片也打包存好。我见过有人模型训好了数据集被覆盖想复现都复现不了。验证指标记在 README 里mAP、FPS、解码成功率三个数写清楚下次迭代有对比基准。系统集成时检测和后处理解耦YOLO 只负责框解码和 OCR 单独模块哪个环节出问题都好替换。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进