1. 项目背景与行业痛点
在制药行业干了十几年,我见过太多因为包装缺陷导致的药品召回事件。药品泡罩包装(业内俗称"铝塑板")作为片剂、胶囊的主流包装形式,其质量直接关系到用药安全。传统的人工检测方式,一个熟练工人每天要检查上万粒药品,到了下午难免会出现视觉疲劳。记得2018年某药厂就发生过因为夜班工人漏检,导致一批缺粒药品流入市场的事故。
目前主流的自动化检测设备大多采用传统机器视觉方案,通过预设的规则和阈值来判断缺陷。这类系统对光照条件、药品摆放位置要求极高,稍微有点偏差就会误判。更头疼的是,不同药品的泡罩形状、颜色差异很大,每换一个品种就得重新调试参数,费时费力。
2. 技术选型与方案设计
2.1 为什么选择YOLO系列模型
在比较了Faster R-CNN、SSD等主流目标检测算法后,我们最终锁定YOLO系列,主要基于三个实际考量:
速度优势:生产线上的检测节拍通常要求在100ms以内,YOLO的单阶段检测特性天然适合实时场景。实测下来,YOLOv5s在RTX 3060上跑一张药板图像仅需23ms
精度平衡:虽然两阶段检测器精度略高,但对于泡罩检测这种小目标居多的场景,YOLOv8的anchor-free设计反而表现出更好的召回率
工业友好性:YOLO系列的PyTorch实现生态完善,从训练到部署的工具链成熟。特别是YOLOv5提供的export.py,能一键转换到ONNX/TensorRT格式
2.2 系统架构设计
整套系统采用经典的"前后端分离"架构:
[工业相机] → [推理服务器] → [MES系统] ↑ [质检员终端] ← [结果数据库]核心模块包括:
- 图像采集模块:使用Basler ace系列工业相机,配合环形光源消除反光
- 推理服务模块:基于FastAPI封装模型推理接口
- 业务逻辑模块:处理药板追溯码识别、缺陷分类等业务规则
- 人机交互模块:PyQt5开发的图形界面,支持缺陷标注复核
3. 数据集构建与标注实践
3.1 数据采集的坑与经验
最初我们直接用产线上的正常品拍照,结果训练出的模型遇到新型缺陷就抓瞎。后来摸索出一套有效的数据采集方法:
缺陷模拟:与工艺部门合作,人为制造各类缺陷样本
- 用镊子取出部分药片模拟缺粒
- 调整热封温度制造泡罩成型不良
- 撒入细小颗粒模拟异物污染
多工况覆盖:在不同光照条件、不同角度下各采集3组数据
- 正常顶光
- 侧光(模拟设备振动导致的阴影)
- 低照度(模拟光源老化)
数据增强策略:
transform = A.Compose([ A.RandomBrightnessContrast(p=0.5), A.MotionBlur(blur_limit=3, p=0.2), # 模拟传送带抖动 A.GridDistortion(p=0.3), # 模拟包装变形 A.RandomGamma(p=0.2) ])
3.2 标注规范与技巧
使用LabelImg标注时,我们制定了严格的标注规范:
- 每个泡罩作为一个独立目标
- 缺陷类别细分:
- 缺粒(missing_pill)
- 空泡(empty_blister)
- 破损(broken_pill)
- 异物(foreign_matter)
关键技巧:对于部分遮挡的泡罩,标注可见部分的50%以上才计入,避免引入模糊样本
最终构建的数据集包含:
- 12,845张药板图像
- 平均每张图像含56个泡罩
- 缺陷样本占比15%(符合产线实际缺陷率)
4. 模型训练与优化实战
4.1 训练参数配置对比
以YOLOv8n为例,我们的超参数设置如下:
lr0: 0.01 # 初始学习率 lrf: 0.1 # 最终学习率衰减系数 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1关键调整点:
- 使用cosine学习率调度,避免后期震荡
- 开启mosaic增强但降低概率到0.3(小目标过多时mosaic反而有害)
- 添加自定义损失权重:
loss = { 'box': 0.05, # 降低框回归权重 'cls': 0.3, # 提高分类权重 'dfl': 0.02 }
4.2 模型对比实测数据
在测试集上的表现对比(RTX 3060, TensorRT FP16):
| 模型 | 参数量(M) | 推理时延(ms) | mAP@0.5 | 缺粒召回率 |
|---|---|---|---|---|
| YOLOv5s | 7.2 | 23 | 0.892 | 0.876 |
| YOLOv8n | 3.2 | 18 | 0.901 | 0.887 |
| YOLOv10n | 3.8 | 21 | 0.913 | 0.902 |
| YOLOv8m | 25.4 | 42 | 0.921 | 0.915 |
生产环境选择建议:对精度要求高的场景用YOLOv8m,追求性价比选YOLOv8n
5. 工程部署与性能优化
5.1 TensorRT加速实战
将PyTorch模型转换到TensorRT的踩坑记录:
- 使用YOLOv8官方export.py导出ONNX时,务必添加
--dynamic参数:python export.py --weights best.pt --include onnx --dynamic - ONNX转TensorRT时显存不足的解决方案:
builder = trt.Builder(TRT_LOGGER) config = builder.create_builder_config() config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) # 限制1GB
5.2 多线程处理框架
为提高吞吐量,我们设计了三级流水线:
class InferencePipeline: def __init__(self): self.preprocess_queue = Queue(maxsize=4) self.infer_queue = Queue(maxsize=2) self.postprocess_queue = Queue(maxsize=4) def preprocess_thread(self): while True: img = load_image() img = preprocess(img) # 归一化+padding self.preprocess_queue.put(img) def infer_thread(self): while True: img = self.preprocess_queue.get() detections = model(img) self.infer_queue.put(detections) def postprocess_thread(self): while True: detections = self.infer_queue.get() results = nms(detections) save_results(results)实测表明,该设计在Intel Xeon Silver 4210上可实现每秒处理45张药板图像。
6. 界面设计与交互优化
6.1 PyQt5界面核心功能
主界面采用"三视图"设计:
- 实时检测视图:显示当前相机画面和检测结果
- 历史记录视图:按时间轴展示缺陷药板缩略图
- 统计报表视图:生成每小时/每班的缺陷率趋势图
关键代码片段(信号槽连接):
class MainWindow(QMainWindow): def __init__(self): self.start_btn.clicked.connect(self.start_inference) self.stop_btn.clicked.connect(self.stop_inference) self.export_btn.clicked.connect(self.export_report) def update_result(self, img, results): self.result_view.setPixmap(QPixmap.fromImage(img)) for *xyxy, conf, cls in results: self.draw_box(xyxy, cls)6.2 用户体验优化点
颜色编码系统:
- 红色边框:缺粒(最高优先级)
- 黄色边框:空泡
- 蓝色边框:其他缺陷
声音提示设计:
- 连续短鸣:发现一般缺陷
- 长鸣:连续3板出现同类缺陷(可能设备故障)
快捷键方案:
- F1:暂停检测
- F2:保存当前结果
- F3:切换视图模式
7. 产线实测与调优记录
7.1 现场部署问题排查
在首批试点产线遇到的典型问题:
误检问题:
- 现象:铝箔反光被误判为缺粒
- 解决方案:调整环形光源角度+增加偏振片
漏检问题:
- 现象:部分边缘泡罩检测不到
- 修复:修改模型输入分辨率从640→1280
性能波动:
- 现象:连续运行后推理速度下降
- 根因:GPU温度过高导致降频
- 改进:增加机箱风扇+设置推理间隔冷却
7.2 系统稳定性提升
采取的可靠性措施:
- 看门狗机制:每5分钟检查一次服务心跳
- 断点续传:相机断线后自动重连并补拍
- 冗余存储:检测结果同时写入本地和网络数据库
最终达到的运行指标:
- 平均无故障时间:>45天
- 最大连续运行时长:6个月(需定期清灰)
8. 效果验证与业务价值
8.1 量化指标对比
与传统检测方式对比:
| 指标 | 人工检测 | 传统视觉 | 本系统 |
|---|---|---|---|
| 检测速度(板/分钟) | 30 | 120 | 300 |
| 缺粒检出率 | 92.3% | 85.7% | 98.6% |
| 误检率 | 1.2% | 3.5% | 0.8% |
| 人力成本(人/线) | 2 | 0.5 | 0.2 |
8.2 实际业务收益
在某制药企业3条包装线的应用成果:
- 年减少质量事故:23起 → 2起
- 客户投诉下降:67%
- 人工成本节约:¥1.2M/年
- 通过FDA现场审计时获得特别表扬
9. 扩展应用与未来改进
9.1 同类场景迁移
本方案经少量调整即可应用于:
- 食品行业的泡罩包装检测(如口香糖板)
- 电子元件的载带包装检测
- 医疗器械的灭菌包装检测
9.2 技术演进方向
- 加入少样本学习能力,适应新药板类型的快速迭代
- 开发基于3D视觉的泡罩高度检测模块
- 与MES系统深度集成,实现缺陷根因分析
在最近一次系统升级中,我们加入了defect-GAN模块,通过生成对抗网络扩充罕见缺陷样本,使空泡检测的召回率又提升了2.3个百分点。这让我深刻体会到,工业AI项目的优化永无止境,必须持续跟进最新技术进展。