1. 项目背景与核心价值
药片检测是医药行业质量控制的关键环节。传统人工检测方式存在效率低、漏检率高、成本高等问题。我们团队基于YOLOv6算法开发的药片检测系统,在医药企业实际产线上实现了99.2%的检测准确率,误检率控制在0.3%以下。
这个教程将完整还原我们实际项目中的技术方案,包含数据准备、模型训练、部署优化的全流程。特别适合有以下需求的读者:
- 医药企业质量部门的技术人员
- 计算机视觉领域的算法工程师
- 希望将AI技术落地到工业场景的开发者
2. 环境准备与数据采集
2.1 硬件配置方案
我们推荐以下两种配置方案:
-
训练环境:
- GPU:NVIDIA RTX 3090(24GB显存)
- CPU:Intel i7-12700K
- 内存:64GB DDR4
- 存储:1TB NVMe SSD
-
部署环境:
- 边缘计算设备:NVIDIA Jetson AGX Xavier
- 工业相机:Basler ace acA2000-50gc(500万像素)
提示:如果预算有限,可以使用Colab Pro进行模型训练,但batch size需要相应调小。
2.2 数据采集规范
我们与某大型药企合作采集了超过10万张药片图像,总结出以下采集要点:
-
光照条件:
- 使用环形LED光源(色温5500K)
- 照度控制在1000-1200lux
- 避免直射反光
-
拍摄角度:
- 相机与传送带呈45°夹角
- 拍摄距离30-50cm
- 确保药片在图像中占比60%-80%
-
样本多样性:
- 包含完整、破损、污染等6种缺陷类型
- 覆盖10种常见药片规格
- 不同摆放角度各采集1000+样本
3. 数据标注与增强
3.1 标注规范详解
使用LabelImg工具进行标注时,我们制定了严格的标注标准:
-
边界框要求:
- 与药片边缘保持1-2像素间距
- 倾斜药片采用最小外接矩形
- 重叠药片分别标注
-
分类体系:
- 完整:normal
- 缺角:chipped
- 裂纹:cracked
- 污染:stained
- 变形:deformed
- 异物:foreign
-
质量检查:
- 采用双人标注-复核机制
- 使用CVAT进行标注质量审核
- 最终mAP要求达到0.98以上
3.2 数据增强策略
我们开发了针对药片检测的特效增强方法:
python复制transform = A.Compose([
A.RandomRotate90(p=0.5),
A.HueSaturationValue(hue_shift_limit=10,
sat_shift_limit=20,
val_shift_limit=10, p=0.3),
A.GaussNoise(var_limit=(10, 30), p=0.2),
A.RandomShadow(shadow_roi=(0,0,1,1),
num_shadows_lower=1,
num_shadows_upper=2,
shadow_dimension=3, p=0.1),
A.RandomBrightnessContrast(brightness_limit=0.1,
contrast_limit=0.1, p=0.3),
], bbox_params=A.BboxParams(format='yolo'))
注意:避免使用翻转增强,因为药片正反面特征差异较大。
4. 模型训练与调优
4.1 YOLOv6模型配置
我们修改了官方默认配置:
yaml复制model:
type: yolov6s
depth_multiple: 0.33
width_multiple: 0.50
backbone:
name: EfficientRep
use_se: True
neck:
name: RepPAN
num_repeats: [4, 4, 4, 4]
head:
name: EffiDeHead
num_layers: 3
train:
img_size: 640
batch_size: 32
epochs: 300
optimizer:
name: SGD
lr0: 0.01
momentum: 0.937
weight_decay: 0.0005
关键改进点:
- 在Backbone中加入SE注意力模块
- 使用RepPAN颈部结构增强特征融合
- 采用动态正样本分配策略
4.2 训练技巧分享
我们总结了三个关键训练技巧:
-
学习率调整:
- 前5epoch使用线性warmup
- 100epoch后切换cosine衰减
- 最终lr降至初始值的1/100
-
损失函数优化:
- 分类损失使用VarifocalLoss
- CIOU损失权重设为2.5
- 加入DFL损失提升定位精度
-
早停策略:
- 连续15个epoch验证集mAP提升<0.1%时停止
- 保存最佳3个checkpoint
训练曲线示例:
| Epoch | Train Loss | Val mAP@0.5 |
|---|---|---|
| 50 | 1.25 | 0.872 |
| 100 | 0.68 | 0.923 |
| 150 | 0.45 | 0.945 |
| 200 | 0.32 | 0.961 |
| 250 | 0.28 | 0.968 |
| 300 | 0.25 | 0.971 |
5. 模型部署与优化
5.1 TensorRT加速方案
我们使用以下命令进行模型转换:
bash复制python deploy/ONNX/TensorRT/export.py \
--weights runs/train/exp/weights/best_ckpt.pt \
--img 640 \
--batch 1 \
--device 0 \
--half \
--simplify \
--include onnx engine
关键优化参数:
- 使用FP16精度
- 启用DLA核心
- 设置opt_shape参数:
python复制profile = builder.create_optimization_profile() profile.set_shape("images", (1,3,640,640), (1,3,640,640), (1,3,640,640))
5.2 推理性能对比
优化前后性能对比(Jetson AGX Xavier):
| 指标 | 原始模型 | TensorRT优化 |
|---|---|---|
| 推理速度(FPS) | 23 | 58 |
| 显存占用(MB) | 1520 | 890 |
| CPU利用率(%) | 75 | 32 |
6. 实际应用案例
在某药企泡罩包装线的部署中,我们实现了:
- 检测速度:每分钟检测600粒药片
- 准确率:
- 完整药片识别率:99.4%
- 缺陷检出率:98.7%
- 误检率:0.28%
系统架构示意图:
code复制工业相机 → 边缘计算盒 → 检测结果 → PLC控制 → 剔除装置
↑
质量监控平台
7. 常见问题解决
我们整理了实施过程中的典型问题:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 检测框抖动 | NMS阈值过高 | 调整nms_thres为0.4-0.5 |
| 小目标漏检 | 下采样过大 | 使用640x640输入分辨率 |
| 同类药片误判 | 特征相似度过高 | 在neck层加入CBAM注意力 |
| 边缘设备内存溢出 | 模型参数量过大 | 改用yolov6n-tiny版本 |
| 光照变化导致性能下降 | 训练数据光照单一 | 增加光照增强数据 |
8. 项目优化方向
根据实际使用反馈,我们正在推进以下改进:
- 多光谱检测:增加近红外相机识别成分异常
- 3D检测:结合TOF相机检测厚度缺陷
- 自适应学习:开发在线学习模块适应新药片类型
这个项目给我们最大的启示是:工业AI项目成功的关键不在于算法有多先进,而在于对业务场景的深入理解。我们在药企生产线跟班作业两周,才真正理解质检员的工作方式和判断标准,这些经验最终都转化成了模型设计的改进点。