1. 项目概述
在医疗安全和药品管理领域,准确识别药物种类一直是个重要但具有挑战性的任务。传统的人工识别方式不仅效率低下,还容易因视觉疲劳导致错误。为了解决这个问题,我开发了一套基于YOLOv12深度学习算法的药物识别检测系统。
这个系统能够识别8类常见药物(包括Cipro 500、Ibuphil 600 mg等)以及不同颜色(蓝色、粉色、红色、白色)的药片。在实际测试中,系统在自定义数据集上达到了98%的平均精度(mAP),表现相当出色。除了核心的识别功能外,我还为系统设计了用户友好的UI界面,并加入了登录注册功能,使其更贴近实际应用场景。
1.1 系统核心功能
系统主要具备以下功能特点:
- 支持图片、视频和实时摄像头三种检测模式
- 提供双画面对比显示(原始画面与检测结果)
- 实时表格展示检测目标的类别、置信度及坐标
- 可调节的置信度和IoU阈值参数
- 科幻风格的交互界面设计
- 多线程架构确保流畅运行
2. 技术架构解析
2.1 YOLOv12算法选择
在目标检测领域,YOLO系列算法因其出色的速度和精度平衡而广受欢迎。我选择YOLOv12主要基于以下考虑:
精度优势:相比前代版本,YOLOv12在保持实时性的同时,进一步提升了检测精度,这对于药物识别这种需要高准确率的场景尤为重要。
模型多样性:YOLOv12提供了从nano到large多种规模的预训练模型,可以根据实际需求灵活选择。在我们的系统中,默认使用small模型,在精度和速度间取得了良好平衡。
易用性:Ultralytics团队提供的Python接口非常友好,大大降低了开发难度。
注意:在实际部署时,如果硬件资源有限,可以考虑使用更轻量级的nano模型;如果对精度要求极高,则可以切换到large模型。
2.2 系统架构设计
整个系统采用模块化设计,主要分为以下几个部分:
- 前端界面:使用PyQt5开发,负责用户交互和结果显示。
- 检测引擎:基于YOLOv12的核心检测模块,运行在独立线程中。
- 数据管理:处理用户账户信息存储和检测结果保存。
- 配置系统:管理模型参数和检测阈值。
这种架构设计确保了系统的高响应性,即使在进行密集计算时,UI界面也能保持流畅。
3. 数据集准备与训练
3.1 数据集构建
一个高质量的数据集是模型性能的基础。我们的数据集包含8个类别的药物和药片:
- Cipro 500(环丙沙星500mg)
- Ibuphil 600 mg(布洛芬600mg)
- Ibuphil Cold 400-60(布洛芬复方感冒药)
- Xyzall 5mg(盐酸左西替利嗪5mg)
- 蓝色药片
- 粉色药片
- 红色药片
- 白色药片
数据集采用标准的YOLO格式组织,分为train、val和test三个子集。每个图像都配有对应的txt标注文件,包含物体类别和边界框坐标。
3.2 数据增强策略
为了提高模型的泛化能力,我们在训练中采用了多种数据增强技术:
- 随机水平翻转
- 色彩空间变换(亮度、饱和度、色调调整)
- 马赛克增强(将4张训练图像合并为1张)
- 随机裁剪和缩放
这些增强手段有效提升了模型对不同光照条件和拍摄角度的适应能力。
3.3 模型训练细节
训练代码非常简洁,这得益于Ultralytics提供的优秀API:
from ultralytics import YOLO model = YOLO('yolov12s.pt') # 加载预训练模型 results = model.train( data='data.yaml', epochs=100, batch=8, device='0', # 使用GPU 0 workers=0, # 数据加载线程数 project='runs', name='exp' )关键训练参数说明:
epochs=100:训练100轮batch=8:每批次处理8张图像device='0':使用第一个GPU进行训练workers=0:在Windows系统下建议设为0以避免多进程问题
训练过程中,我们可以通过TensorBoard监控各项指标的变化,包括损失函数、mAP等。
4. 系统实现详解
4.1 用户界面设计
系统UI采用PyQt5实现,主要包含以下功能区域:
- 登录/注册界面:处理用户认证,密码要求至少6位
- 主检测界面:
- 模式选择区(图片/视频/摄像头)
- 参数调节区(置信度、IoU阈值)
- 结果显示区(双画面对比+检测结果表格)
- 状态栏(显示系统状态和最后更新时间)
界面设计采用了深色主题搭配发光效果,不仅美观还能减轻长时间使用的视觉疲劳。
4.2 核心检测逻辑
检测功能通过多线程实现,确保UI不会因计算任务而卡顿。核心代码如下:
class DetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray, list) def __init__(self, model, source, conf, iou): super().__init__() self.model = model self.source = source self.conf = conf self.iou = iou self.running = True def run(self): cap = cv2.VideoCapture(self.source) if isinstance(self.source, int) or self.source.endswith(('.mp4', '.avi', '.mov')) else None try: while self.running: if cap: # 视频或摄像头模式 ret, frame = cap.read() if not ret: break else: # 图片模式 frame = cv2.imread(self.source) if frame is None: break # 执行检测 results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot() # 提取检测结果 detections = [] for box in results[0].boxes: detections.append(( self.model.names[int(box.cls)], float(box.conf), *box.xywh[0].tolist() )) # 发送结果 self.frame_received.emit( cv2.cvtColor(frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) if not cap: break # 图片模式只处理一次 time.sleep(0.03) # 控制帧率 finally: if cap: cap.release() self.running = False4.3 参数配置系统
系统提供了灵活的检测参数调节功能:
- 置信度阈值:控制检测结果的严格程度
- IoU阈值:调节非极大值抑制的强度
这两个参数都提供了滑块和数值输入框两种调节方式,且保持实时同步:
# 置信度阈值同步 def update_confidence(self, value): confidence = value / 100.0 self.confidence_spinbox.setValue(confidence) self.confidence_label.setText(f"置信度阈值: {confidence:.2f}") # IoU阈值同步 def update_iou(self, value): iou = value / 100.0 self.iou_spinbox.setValue(iou)5. 部署与优化建议
5.1 环境配置
建议使用Anaconda创建独立的Python环境:
conda create -n yolov12 python=3.9 conda activate yolov12 pip install torch torchvision torchaudio pip install -r requirements.txt对于GPU加速,需要安装对应版本的CUDA和cuDNN。如果只有CPU可用,可以安装CPU版本的PyTorch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu5.2 性能优化技巧
模型选择:根据硬件条件选择合适的YOLOv12模型变体:
- yolov12n:最轻量,适合嵌入式设备
- yolov12s:平衡型,推荐大多数场景
- yolov12m/l:更高精度,需要更强硬件
推理优化:
- 启用半精度推理(FP16)
- 使用TensorRT加速
- 调整检测线程数
内存管理:
- 及时释放不再使用的变量
- 避免在循环中创建大对象
5.3 常见问题排查
在实际开发和使用过程中,可能会遇到以下问题:
模型加载失败:
- 检查模型文件路径是否正确
- 确保PyTorch版本与模型兼容
- 验证CUDA是否可用(对于GPU版本)
检测结果不准确:
- 调整置信度和IoU阈值
- 检查训练数据是否覆盖了所有场景
- 考虑重新训练或微调模型
界面卡顿:
- 确保检测运行在独立线程
- 降低检测帧率
- 检查是否有内存泄漏
6. 项目扩展方向
这个药物识别系统还有很大的扩展空间:
- 增加更多药物类别:收集更多种类的药物数据,扩展系统的识别范围
- 剂量识别:结合OCR技术识别药物剂量信息
- 药品相互作用检查:集成药品知识库,提供用药安全提示
- 移动端部署:将模型转换为ONNX或TFLite格式,部署到移动设备
- 云端服务:开发REST API接口,支持远程调用
我在实际开发中发现,YOLOv12的检测精度已经相当出色,但在极端光照条件下仍有提升空间。后续可以考虑加入更复杂的数据增强,或者尝试模型集成技术来进一步提高鲁棒性。