讨论背景
书接上文,介绍了一个简单的AI智能条码识别系统的初步架构以及实现。其中自主模型训练这部分比较简略带过,应掘友的要求,再次做个明细补充和介绍。
主要标注工具优缺点对比
工具名称 | 优点 | 缺点 | 支持任务类型 |
---|---|---|---|
LabelImg | - 开源免费 - 支持 Pascal VOC 和 YOLO 格式 - 简单轻量 | - 功能简单 - 只支持矩形框标注 - 不适合多种任务 | 目标检测(矩形框) |
Labelme | - 支持多种标注类型(多边形、线、关键点) - 格式灵活(JSON) | - 标注速度慢 - 批量处理功能弱 | 图像分割、多边形、关键点标注等 |
CVAT | - 功能强大 - Web界面友好 - 支持团队协作 - 支持视频标注 | - 安装较复杂(需Docker) - 对计算资源有要求 | 检测、分割、追踪、关键点等 |
VIA (VGG Image Annotator) | - 无需安装,纯网页运行 - 文件小,开箱即用 | - UI不够友好 - 不支持复杂项目管理 | 检测、分割、多边形、关键点 |
在这我选择上手简单,开源免费的LabelImg
作为我们的标注工具。
准备数据并训练你自己的 YOLO 条码检测模型
📦 第一步:准备条码图片数据集
我们想要识别条形码,那我们就得收集准备足够的条码图片,用于机器学习。图片格式大小尽量统一,不要相差太大,因为我们的上篇文章已经讲到OpenCV
对图像进行裁剪,一个图像100x100px
,一个图片3200x3200px
,规格相差太大是不利于裁剪和识别区域标注的。
- 收集10-50张条码图片,多多益善。
- 内容越丰富越好(不同角度、背景、光线)。
💡 命名建议:
erlang
复制编辑
images/
├── barcode_01.jpg
├── barcode_02.jpg
├── ...
🏷️ 第二步:使用 LabelImg 工具
使用python环境安装LabelImg
pip install labelImg
打开工具
labelImg
打开界面如下图所示:

使用工具
- 点
File
菜单下的 "Open Dir" 打开你的图片目录 - 点菜单
YOLO
,启用 YOLO 格式(坐标将自动保存为.txt
) - 开始标注
标注过程
- 点击
Edit
菜单下的create ReactBox
开始标注 - 用鼠标框选图中的条码区域
- 输入一个类别名:比如
barcode
- 按
Ctrl+S
保存(会自动生成.txt
文件)
标注过程示例:

每张图片都会有对应的标签文件,如:
复制编辑
barcode_01.jpg
barcode_01.txt
.txt
文件内容格式如下(YOLO 格式):
复制编辑
0 0.532 0.651 0.210 0.123
含义为:
- 类别编号(0 表示"barcode")
- 中心点 X、Y(归一化 0~1)
- 宽度、高度(归一化)
📁 第三步:构建 YOLO 数据集结构
创建如下结构:
kotlin
复制编辑
barcode_dataset/
├── images/
│ ├── train/
│ └── val/
├── labels/
│ ├── train/
│ └── val/
✅ 第四步:分割数据:
- 把 80% 图片放到
images/train/
- 剩下 20% 放到
images/val/
.txt
标签文件也要放到对应的labels/train/
和labels/val/
📄 第五步:准备 YAML 配置文件
在项目目录下创建 barcode.yaml
文件:
yaml
yaml
复制编辑
path: ./barcode_dataset
train: images/train
val: images/val
names:
0: barcode
开始训练
在命令行中进入你的项目目录,执行以下命令:
ini
yolo detect train data=barcode.yaml model=yolov8n.pt epochs=50 imgsz=640 batch=16
参数说明:
参数 | 说明 |
---|---|
data= |
配置文件路径(你写的 barcode.yaml ) |
model= |
使用的基础模型(yolov8n.pt 比较小) |
epochs= |
训练轮数,50 一般够用(你可以调高) |
imgsz= |
输入图像尺寸,默认 640 即可 |
batch= |
批量训练张数(内存小就用 8 或更小) |
训练过程示例图:

训练完成
训练完成后,YOLO 会自动创建以下目录结构:
bash
runs/detect/train/
├── weights/
│ ├── best.pt ← 用这个模型来做条码识别
│ └── last.pt
├── results.png ← 训练过程可视化图
训练参数:

使用训练好的模型进行识别
回到你之前的 barcode_detect.py
文件,把这行:
ini
python
复制编辑
model = YOLO("yolov8n.pt")
替换成:
ini
python
复制编辑
model = YOLO("runs/detect/train/weights/best.pt")
然后重新运行这个文件,就可以用你自己训练的模型进行条码区域检测了!
分享
到这整个标注训练过程就已经完成,终于也有了一个属于自己的模型了,是不是有点小激动。要是觉得有趣,赶紧行动起来试试吧。作者自己也算是初步入门,有兴趣的掘友一同进步。在这又有了新的构想,下次把功能做的完善一些,比如开放出来一个接口,供外部api使用。或者打包成一个apk,或者桌面端应用。