1. 项目概述:用YOLO守护用药安全的毕设实践
去年我在药房实习时,亲眼目睹一位老人因为看不清药品标签而误服过期药物。这件事让我意识到,药品标签识别不仅是技术问题,更是关乎生命安全的刚需。基于这个背景,我决定开发一套基于YOLO的药品标签识别系统,这也是我最终获得优秀毕业设计的关键项目。
这个系统的核心价值在于:通过计算机视觉技术实现药品标签的自动检测、关键信息提取和有效性核验。相比传统人工检查方式,它能将识别准确率提升至98%以上,处理速度达到每秒30帧,完全可以满足药店、医院等场景的实时需求。
2. 技术选型:YOLO三兄弟的实战对比
2.1 YOLOv5:轻量高效的入门首选
作为YOLO系列中最成熟的版本,v5特别适合硬件资源有限的毕设场景。在我的测试中,使用默认yolov5s模型(仅14MB)在GTX 1660显卡上就能达到45FPS的推理速度。对于药品标签这种尺寸固定、背景相对简单的检测任务,其mAP@0.5能达到0.89。
实际部署时,我推荐使用以下配置:
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) model.classes = [0] # 只保留药品标签类别2.2 YOLOv8:精度与速度的平衡之选
v8引入了Anchor-Free检测头和更高效的CSP结构。在相同数据集上,v8的mAP@0.5比v5提升约3%,但模型体积增大了20%。如果答辩需要展示技术深度,v8是更好的选择。训练时建议启用TTA(Test Time Augmentation):
# yolov8.yaml augment: True tta: True2.3 YOLOv10:前沿技术的尝鲜选择
虽然v10刚发布不久,但其NMS-Free设计和一致性匹配策略确实带来了性能突破。不过需要注意:
- 需要PyTorch 2.0+环境
- 目前社区资源较少
- 训练耗时比v5长约30%
实操建议:毕设时间有限的话,建议用v5或v8。我在实际项目中最终选择v8n(nano版),在保持90%精度的同时,模型尺寸仅3.7MB。
3. 数据工程:构建高质量的药品标签数据集
3.1 数据采集的实用技巧
我通过三种渠道获取了1278张药品标签图片:
- 药房实拍(占比60%):使用手机+简易摄影棚,确保光线均匀
- 公开数据集(占比30%):如Open Images中的药品子集
- 数据合成(占比10%):用Pillow库模拟不同光照条件
3.2 标注规范与工具选择
使用LabelImg标注时,我制定了这些规则:
- 标注范围包含整个标签区域
- 对模糊标签额外标注"unclear"类别
- 保留10%数据作为测试集
标注文件示例:
<object> <name>drug_label</name> <bndbox> <xmin>256</xmin> <ymin>189</ymin> <xmax>512</xmax> <ymax>378</ymax> </bndbox> </object>3.3 数据增强策略
通过albumentations库实现动态增强:
transform = A.Compose([ A.RandomBrightnessContrast(p=0.5), A.GaussNoise(var_limit=(10,50),p=0.3), A.Rotate(limit=15,p=0.8) ], bbox_params=A.BboxParams(format='pascal_voc'))4. 模型训练与优化实战
4.1 环境配置避坑指南
常见问题解决方案:
| 问题现象 | 解决方法 |
|---|---|
| CUDA out of memory | 减小batch_size至8或4 |
| NaN loss | 检查数据标注是否越界 |
| 验证集mAP不升 | 调整学习率(建议0.01→0.001) |
4.2 关键训练参数
我的最佳实践配置:
lr0: 0.01 lrf: 0.1 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 34.3 模型评估指标解读
重点关注这三个指标:
- Precision:误检率(如将包装文字误认为标签)
- Recall:漏检率
- mAP@0.5:0.95:综合性能
我的v8n最终成绩:
Class Images Instances P R mAP50 all 214 428 0.956 0.943 0.9215. 系统集成与功能扩展
5.1 核心功能模块设计
系统架构图:
摄像头输入 → YOLO检测 → OCR识别 → 数据库比对 → 结果可视化5.2 界面开发技巧
使用PyQt5实现交互界面时:
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.detector = DrugLabelDetector() # 封装好的检测类 self.initUI() def on_detect(self): img = self.camera.get_frame() results = self.detector.detect(img) self.show_results(results)5.3 关键业务逻辑实现
药品有效期核验算法:
def check_expiry(date_str): expiry = datetime.strptime(date_str, "%Y-%m-%d") if expiry < datetime.now(): return (False, "药品已过期") elif (expiry - datetime.now()).days < 30: return (False, "即将过期") return (True, "有效期正常")6. 项目答辩与成果展示
6.1 答辩演示技巧
建议准备三个演示场景:
- 正常药品快速识别(展示速度)
- 模糊标签检测(展示鲁棒性)
- 过期药品报警(展示实用性)
6.2 常见答辩问题准备
我遇到过的典型问题:
- 如何处理反光标签?(回答:数据增强中加入反光模拟)
- 系统响应时间是多少?(回答:端到端延迟<200ms)
- 如何保证隐私安全?(回答:本地处理不上传图片)
7. 项目优化方向
在实际部署中发现几个可改进点:
- 加入半监督学习:利用未标注数据提升性能
- 开发移动端应用:基于TensorFlow Lite优化
- 对接药监数据库:实现假药实时比对
训练过程中有个有趣的发现:当药品标签上有反光时,常规数据增强效果有限。后来我通过在摄影棚喷洒水雾模拟冷凝效果,使模型对这类场景的识别率提升了17%。这个小技巧后来成为我答辩时的亮点。