拓冰建站拓冰建站
首页 / 资讯中心 / 正文

YOLOv8药盒药品识别:从数据标注到一键部署实战

简介这套YOLOv8药盒药品识别系统面向计算机、人工智能、自动化等专业学生及目标检测初学者开箱即用地解决药盒内常见药品的自动定位与识别问题支持图片与视频输入。资源包共11个文件以模型权重、Python脚本与说明文档为主内置可直接推理的预训练模型和针对本场景训练好的最优权重并配有自定义训练、实时视频流检测与可视化界面三类脚本其中可视化界面可展示置信度框选、标签分布、F1分数曲线、精确率-召回率曲线与混淆矩阵等评估图表。数据集已完成多角度、不同光照下的标注压缩包仅15.92MB部署说明覆盖环境配置、依赖安装、权重加载及界面启动全流程Windows/Linux均可运行。目前已有160人学习使用特别适合毕业设计、课程设计或教学演示所有代码经实测通过并附清晰操作指引可作为完整学习参考项目。 上周在帮一家药房做备药复核流程的预研对方负责人给我看了一段录像窗口药师手里同时拿着三盒包装几乎一样的高血压药来来回回对了半分钟才敢确认。他问我这种靠肉眼判断的环节能不能用摄像头加算法兜底。于是我把方案定成了YOLOv8药盒药品识别系统训练模型负责把药盒找出来并判断是哪一个具体药品可视化界面让操作的人真正用得上再配合完整数据集和一键部署脚本四个部分串成一条能落地的流水线。这套东西核心解决三件事把药盒从画面里找出来判断是哪一种具体药品再让不写代码的现场人员也能双击运行。适合正在做药房自动化、家庭用药管理或者想用目标检测做包装识别的开发者参考。整个项目走下来我的最大感受是难点不在模型而在数据和使用场景的还原度。1. 先拆掉一个惯性思维识别的对象不是“盒子”是“盒面上的身份信息”1.1 药盒识别的真实任务很多朋友拿到这个题目第一反应是目标检测嘛把药盒框出来就行。真做起来你会发现单把盒子框出来没有意义。药剂科要的是“这是阿莫西林胶囊0.25g不是感冒灵颗粒”不是“画面里有一个纸盒”。所以药盒识别本质上是一个细粒度目标识别任务既要找目标又要在目标框内分辨出具体SKU。YOLOv8在这类任务里完全可以胜任但前提是训练数据里的类别名要落到具体药品而不是落到“药盒”这一个笼统类别上。预训练模型自带的COCO 80类里压根没有这些药品类别所以重新整理数据、重新训练是绕不开的。1.2 药盒数据为什么比一般物体难做药盒的麻烦在于“看上去差不多实际上不是同一个”。同一品类不同规格的产品名称只差一两个字同一厂家的系列化设计版式和配色几乎一致不同厂家的仿制药又喜欢贴近原研药的视觉风格。再加上塑封反光、磨砂材质、小字号印刷检测框把整个盒子框住之后特征已经糊成一片。还有更现实的SKU爆炸问题一个药房的常备药品可能上千种如果每种都当独立类别数据集的规模、标注成本、模型部署时的类别管理都会失控。所以我的建议是起步阶段不要追求全品类先选药房里单量最大、最容易混淆的二三十种做一个小而完整的最小可用集合跑通整条链路再说。2. 数据集这个项目的天花板在这不在模型2.1 素材采集怎么在真实环境拍出能用的药盒照片我给自己定的采集规范是三个角度正面、俯视、侧面、三种距离近拍、手持、桌面、两种光线自然光、日光灯。每一类药盒至少拍150张。看着很多但一个盒子多角度拍下来能出十几张二三十个品类一周就能搞定。需要特别提醒的是不要只拍正视图也不要拍得跟商品图一样干净。你要给模型看的是店员日常遇到的样子有手影、有反光、有歪斜、有被其他物品挡一半的。另外千万别为了凑数量把一个盒子放在桌上连续拍五六十张这种高度相似的帧在简单随机拆分下会同时进入训练集和验证集让验证指标虚高真实场景却翻车。我按“拍摄场景”分组同一组照片要么全部进训练集要么全部进验证集这样评估结果才有参考价值。2.2 标注工具和标注规范标注流程上我推荐先手动标一批种子数据训练一个初版模型然后加载这个模型到X-AnyLabeling做预标注人工只需要修改框的位置和标签。这一步能把标注时间压缩到原来的三分之一左右。标注规范上我踩过坑一开始我把药盒的正面主商标区和商品名分别框出来结果模型训练完既分不清类别也分不清该按哪个框输出。后来统一改成“标药盒主展示面的外边接矩形”一个目标只给一个框类别就是药品ID训练和部署的规则瞬间清爽了。一定要保证同一个类别所有图片的框语义一致不要这张标正面、那张标整体。2.3 增强策略不是越多越好YOLOv8默认会开Mosaic和MixUp但对药盒这种小字密集的目标Mosaic把多个盒子拼在一起容易出现不同药品特征的交叉污染。我的做法是训练前期开启Mosaic增加背景多样性最后十几轮把它关闭让模型在接近真实单目标的情况下收尾。翻转方面水平翻转可以用垂直翻转必须关因为药盒上的文字颠倒后就变成完全不合常理的样本。为了模拟柜台常见的反光我在增强里加了随机高光斑块和亮度扰动。增强策略要一边跑短验证一边调不要一次性把亮度、旋转、透视、噪声、模糊全堆上去否则出了问题根本不知道是谁害的。3. YOLOv8训练环境、参数、以及怎么看懂那张loss曲线图3.1 环境搭建的版本对齐问题训练环境我用的是conda装起来其实就两条命令但最容易翻车的不是安装步骤而是版本对齐。我建议固定一个组合比如 ultralytics8.2.x torch2.1 CUDA 12.1 Python 3.10这个组合在训练药盒数据集时很稳。经验是不要为了尝鲜频繁升级ultralytics小版本之间API经常变很多网上教程的报错方案根本对不上号就是因为版本漂移。显卡显存不够的时候优先减小batch而不是立马换更小的模型。yolov8n对药盒上的小字真的不友好宁可训练慢一点也要保证模型容量。3.2 训练命令和几个关键参数我的训练命令大概是这样的yolo detect train datapharma.yaml modelyolov8m.pt epochs200 imgsz640 batch16 patience30 projectruns namepharma_v1 device0dataset的yaml里必须写清楚path、train、val、names。names的顺序一定不要随意改它会影响类别ID后面所有部署导出都要跟它保持一致。imgsz我选了640因为药盒上的关键信息靠小字承载降到416之后精度掉得明显。batch大小取决于显存如果训练时报out of memory先减半不要硬扛。如果反复OOM再考虑换更小的输入尺寸或换有更多显存的机器。3.3 怎么读训练曲线训练完不要只看mAP50。0.95的mAP50也可能是过拟合在验证集上现场一测就露馅。我会把runs/pharma_v1/results.csv拖出来画几条曲线一起看box_loss、cls_loss、val/box_loss、val/cls_loss。如果训练loss一路走低验证loss不再下降反而抬头那就是过拟合如果验证loss震荡很厉害基本是标注质量有问题回去查标签。还要对比mAP50和mAP50-95的gapgap很大说明检测框不贴目标常见原因就是小目标密度高、遮挡多。看曲线这件事就像看化验单单看一个指标没用要几个指标放在一起互相印证。3.4 增量训练新药品的正确姿势项目一定会遇到“加一个新规格的药品”这种需求。我踩过的坑是直接在旧的best.pt上改data.yaml类别数量结果加载时分类头shape不匹配报错。YOLOv8的增量训练不像简单resume那样无脑官方resume是恢复原训练状态并不是学会一个旧模型再加新类别。我要新增类别时会保留旧模型作为特征提取的预训练但把分类层重新初始化整体用较低学习率训练如果新增类别数量比较多就干脆从官方yolov8m.pt重新训练别舍不得旧的训练时间。同时新类别的样本量要和旧类别大致持平不然模型对旧类会有严重偏向。4. 可视化界面从“模型能跑”到“店员愿意用”4.1 界面技术选型为什么最后选了PyQt6我同时对比过Streamlit、FlaskWeb和PyQt6。Streamlit搭演示页很快但摄像头连续帧、文件批量处理这些东西用起来很别扭而且启动之后还要在浏览器里操作现场人员不一定愿意接受。FlaskWeb适合做局域网服务但前端工作量不小。最终选PyQt6理由是现场就是一台Windows电脑PyQt6可以原生调摄像头、做表格控件、打包双击运行交互直接。如果你以后要多人远程访问再在PyQt外面包一层HTTP服务就行前期没必要自己给自己加负担。4.2 界面布局和核心交互界面我做成三栏左边是图片选择、摄像头开关和置信度阈值中间放实时画面或者当前图片右边是识别结果表列出药品名称、置信度、数量下面放一个导出CSV按钮。摄像头模式下我不会每一帧都跑推理而是每隔5帧检测一次检测结果叠到最新一帧上这样画面依旧流畅CPU也不会一直满载。批量识别文件夹里的图片时全部走同一个结果表最后导出带路径的CSV方便事后复盘。这里有个容易被忽略的产品细节一定要支持拖拽图片进窗口操作人员才觉得这是工具而不是一个演示程序。4.3 别把模型推理写进UI线程界面卡顿的头号原因就是把推理直接写在按钮回调里。我第一版就犯了这个问题每次点击识别界面能卡两三秒结果窗口直接变成未响应状态观感极差。后来改成单独建一个QThread摄像头或图片读到的数组传给工作线程模型predict在线程里跑识别完成后用信号把结果发回主线程更新界面。模型对象也要在程序启动时加载到全局不要每次识别都新建一个否则光是加载权重的两秒钟就让人怀疑程序死了。实测改完线程模型整体流畅度提升非常明显。5. 一键部署当模型离开你的电脑5.1 “一键”脚本究竟要干哪几件事现场人员不可能帮你配环境所以一键部署脚本不能只是pip install。我写了一个deploy.bat按顺序做四件事检查系统有没有装Python没有就给提示创建虚拟环境并安装requirements.txt把训练好的best.pt从备份目录复制到程序目录最后在桌面生成启动快捷方式。脚本每一步都打印当前进度方便现场反馈。requirements.txt里我尽量只放最小依赖ultralytics、onnxruntime、PyQt6、opencv-python、pandas。之前有一版图省事把训练相关的包也写进去结果其中某个间接依赖升级后把界面程序搞崩了从那以后部署依赖我一定单独维护。5.2 CPU机器的提速导出ONNX在onnxruntime里跑现场不保证有NVIDIA显卡所以我通常会多准备一条CPU路线把best.pt导出成ONNX格式然后用onnxruntime做推理。CPU上我实测过ONNX Runtime比直接调PyTorch能快一倍左右而且部署机不用装torch整个依赖体积小很多。导出命令很简单yolo export modelbest.pt formatonnx dynamicFalse opset12但这里有个极易踩的坑YOLO训练时图像会经过letterbox预处理你在UI里用OpenCV读图后也必须先letterbox再喂给模型否则精度掉一截。这个前处理一致性我建议封装成一个公共函数训练和部署都用同一份避免两边各写一遍然后对不上。5.3 部署验收清单每次交付前我都会在干净的机器上按清单走一遍模型文件和启动脚本是否在同一目录所有路径禁止写死成开发机路径中文药品名在表格和导出CSV里有没有乱码摄像头索引在无摄像头机器上要能优雅降级快捷方式双击后能不能正常拉起程序重启系统后是否仍可用日志文件能不能正常写入识别报错能不能留下记录。这五件事看起来琐碎但现场问题基本都是从这里冒出来的提前排查一次能少跑好几趟。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门