ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

感冒药品分类检测数据集:959张图3类别VOC与YOLO双格式实战指南

感冒药品分类检测数据集:959张图3类别VOC与YOLO双格式实战指南 简介本资源为面向目标检测入门与药品识别场景的感冒药品分类检测数据集适合计算机视觉学习者、算法工程师及高校学生用于模型训练与算法验证。数据集采用Pascal VOC与YOLO双格式标注包含960张jpg图片及对应的960个xml和960个txt标注文件标注类别涵盖999ganmaoling、banlangen、buluofen及drugs四类总标注框数达1365个使用labelImg工具按矩形框规则完成标注。压缩包共2000个文件以xml、txt标注文件和jpg图像为主整体约44.17MB目录结构清晰便于直接接入YOLO或VOC训练流程。目前已有395人学习下载可作为药品检测赛题或课程实验的现成数据基础帮助读者快速完成数据加载、类别统计与模型训练验证节省自行采集与标注的时间成本。1. 感冒药品分类检测数据集959 张、3 类别、VOC 与 YOLO 双格式到底能干什么电商仓库的拣货口、药店自动盘点机、药品分拣线这些场景里最烦的不是识别不出药盒而是把「感冒灵」和「复方氨酚烷胺」混成一类。我拿到这个标题的第一反应不是「又一个数据集」而是它把三件事一次性说清了959 张图、3 个类别、VOC 与 YOLO 双格式。这意味着你不需要从零标注也不用纠结格式转换直接就能把数据灌进 YOLO 训练流程里跑一版基线。它适合两类人一类是想验证「药品分类检测」这条业务线能不能用目标检测落地的小团队另一类是刚学完 YOLO 理论、想找一个类别少、体量小、当天就能跑出结果的数据集练手的人。959 张不算多3 类也不算复杂但正因为小它才适合做快速验证——先跑通再谈精度。2. 先看清数据959 张、3 类别、VOC 与 YOLO 双格式的目录结构2.1 为什么这个数据集同时给 VOC 和 YOLO 两种格式VOC 格式是目标检测里的老牌标准标注文件是 XML每个目标一个object节点里面写类别名和xmin/ymin/xmax/ymax四个坐标。YOLO 格式则是每张图对应一个.txt每行类别索引 cx cy w h坐标全部归一化到 0 到 1 之间。这个数据集同时给两套实际是照顾了两拨人用 LabelImg 打标、习惯看 XML 的人可以直接核对标注质量用 YOLOv5/v8 训练的人可以直接拿.txt和data.yaml开跑。常见做法是VOC 留作标注溯源和可视化检查YOLO 格式直接进训练脚本。我一般会先拿 VOC 的 XML 抽查十几张确认框没画歪再切到 YOLO 格式训练这样出问题时分得清是标注问题还是训练问题。2.2 目录应该长什么样以及怎么快速核对类别数拿到压缩包解压后合理的目录结构通常是这样你可以对照检查dataset/ ├── VOCdevkit/ │ └── VOC2007/ │ ├── Annotations/ # 每张图一个 XML │ ├── JPEGImages/ # 原始图片 │ └── ImageSets/Main/ # train/val 划分文件 └── yolo/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml核对类别数不要靠肉眼数直接跑一段脚本统计 XML 里出现过的类别名import os import xml.etree.ElementTree as ET from collections import Counter anno_dir dataset/VOCdevkit/VOC2007/Annotations counter Counter() for fname in os.listdir(anno_dir): if not fname.endswith(.xml): continue tree ET.parse(os.path.join(anno_dir, fname)) for obj in tree.findall(object): name obj.find(name).text.strip() counter[name] 1 print(counter) # 每个类别的框数量 print(类别数:, len(counter))这段逻辑很直白遍历所有 XML把每个object的name取出来计数。counter输出的是每个类别的实例数不是图片数——这点要分清959 张图里某个类别可能只出现几十次。如果统计出来类别数不是 3或者出现拼写不一致的类别名比如「感冒药」和「感冒药品」混用那说明标注有脏数据必须先统一再训练否则模型会把它当成两个类。2.3 从 VOC 转 YOLO坐标归一化的四个边界坑虽然数据集号称双格式但实际拿到手经常只有 VOC 是完整的YOLO 那套要么缺data.yaml要么划分不对。自己转一遍最稳import os import xml.etree.ElementTree as ET classes [class0, class1, class2] # 按你的实际类别顺序改 anno_dir dataset/VOCdevkit/VOC2007/Annotations img_dir dataset/VOCdevkit/VOC2007/JPEGImages out_dir dataset/yolo/labels/all os.makedirs(out_dir, exist_okTrue) for fname in os.listdir(anno_dir): if not fname.endswith(.xml): continue tree ET.parse(os.path.join(anno_dir, fname)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.findall(object): cls_name obj.find(name).text.strip() if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化并转中心点宽高 cx (xmin xmax) / 2.0 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(os.path.join(out_dir, fname.replace(.xml, .txt)), w) as f: f.write(\n.join(lines))逻辑说明先读图片宽高再把 VOC 的左上右下坐标转成 YOLO 的中心点加宽高并且全部除以宽高做归一化。参数上classes的顺序必须和后面data.yaml里的names完全一致错一个位置整个类别就全乱了。四个边界坑分别是坐标超出图片范围xmax大于w要截断宽或高为 0 的框要丢弃类别名不在classes里的要跳过并记录图片宽高读不到的要单独列出来人工看。转完随便抽一张图用可视化脚本画框确认框和药盒对得上再进训练。3. 用 YOLOv8 在本地跑通第一版药品检测基线3.1 环境配置Anaconda 建环境到 ultralytics 安装YOLOv8 现在通过ultralytics包直接调用环境干净点不容易出玄学问题。我一般用 conda 建一个独立环境conda create -n yolo_drug python3.10 -y conda activate yolo_drug pip install ultralytics opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simplepython3.10是当前兼容性比较稳的版本3.12 有些依赖轮子还没跟上。装完ultralytics会自带 torch如果你的机器有 NVIDIA 显卡装完用python -c import torch; print(torch.cuda.is_available())确认一下是不是 True。返回 False 说明装成了 CPU 版训练会慢到让你怀疑人生需要按官网对应 CUDA 版本重装 torch。这一步是新手最容易翻车的地方先确认再往下走。3.2 data.yaml 怎么写路径和类别顺序别搞反data.yaml是训练入口写错路径是最常见的报错来源path: /home/user/dataset/yolo train: images/train val: images/val nc: 3 names: 0: class0 1: class1 2: class2path是数据集根目录train和val是相对path的路径。nc是类别数必须和names的条目数一致。names的顺序必须和转换脚本里classes的顺序一模一样否则训练不报错但预测出来的类别名全是错的——这种错误最坑因为 loss 看着正常下降你以为训好了一推理发现标签张冠李戴。改完 yaml 先用yolo checks跑一下环境自检确认路径能被读到。3.3 训练命令与关键参数epochs、imgsz、batch 怎么定959 张图属于小数据集训练命令不用太复杂yolo detect train \ datadataset/yolo/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/drug \ namebaseline参数逐个说modelyolov8n.pt用 nano 版小数据集上 nano 往往比大模型更不容易过拟合而且训练快epochs100配合patience20意思是 20 轮验证指标不提升就早停避免白跑imgsz640是 YOLO 默认输入尺寸药盒这种中等目标够用batch16看显存8G 显存跑 640 一般能到 16爆显存就降到 8lr00.01是初始学习率小数据集不建议调太大。训练过程中重点看mAP50和mAP50-95两个指标前者宽松后者严格如果 mAP50 上去了但 mAP50-95 很低说明框的位置不够准多半是标注框偏大或偏小。3.4 推理与置信度门限为什么默认 0.25 不一定适合药品训练完拿验证集或自己拍的图跑推理yolo detect predict \ modelruns/drug/baseline/weights/best.pt \ sourcetest_images/ \ conf0.4 \ saveTrueconf0.4是我在药品场景常用的门限比默认 0.25 高。原因是药品包装相似度高低门限会冒出一堆重叠的误检框拣货场景里误检比漏检更烦人。如果业务允许漏一点但不能错就把conf提到 0.5 甚至 0.6如果追求召回、宁可多框几个再人工筛就降到 0.3。这个值没有标准答案拿一批真实场景图跑几组对比看误检和漏检哪个代价大再定。4. 小数据集训练药品检测的避坑与排查清单4.1 现象训练 loss 正常下降但验证 mAP 一直是 0原因通常有两个一是data.yaml里val路径指向的图片和标签对不上YOLO 找不到标签就当成背景验证自然全错二是类别索引错位标签里的cls_id超出了nc范围被静默忽略。解决方法是先跑一遍标签校验脚本检查每个.txt里的类别索引是否都在0到nc-1之间再确认images/val和labels/val文件名一一对应。我习惯在训练前用yolo detect train加--verbose看它实际加载了多少张图和多少个标签数字对不上就停下来查。4.2 现象模型把三个类别全预测成同一类原因多半是类别极度不均衡959 张里某一类占了绝大多数另外两类样本太少模型干脆全押多数类。解决方法是先统计每类的实例数如果某类少于总实例的 10%要么补数据要么在训练时用cls权重或过采样。另一个可能是names顺序和标签索引不一致这种属于人为错误重新核对一遍就能排除。4.3 现象推理时框大量重叠、同一个药盒出好几个框原因是conf门限太低或者 NMS 的iou阈值不合适。YOLO 默认iou0.7药品包装密集摆放时相邻框容易被误合并或误保留。解决方法是先把conf提到 0.4 以上再试iou0.5观察重叠框是否减少。如果还是多说明模型本身没学好回到训练阶段加数据或加 epoch别指望后处理能救回来。4.4 现象换一台机器或换一个路径训练直接报 FileNotFound原因是data.yaml里用了绝对路径或者path写死到了某台机器的目录。解决方法是统一用相对路径把数据集和训练脚本放在同一级path写./dataset/yolo。另外 Windows 和 Linux 的路径分隔符不同跨平台时用os.path.join或正斜杠别手写反斜杠。4.5 现象训练到一半显存爆了进程被 kill原因是batch或imgsz设太大或者workers开太多导致内存也吃紧。解决方法是先把batch减半imgsz从 640 降到 512 试一轮workers设成 4 或 8 别拉满。如果还爆用yolov8n而不是yolov8m/l小数据集上 nano 的性价比最高。显存不够时不要硬扛降配置比换卡现实。5. 把 959 张用到极致数据增强、验证与持续迭代的几个技巧小数据集的瓶颈从来不是模型不够大而是数据不够多样。959 张如果都是同一角度、同一光照拍的模型换个货架就废。我一般会在 YOLO 训练配置里打开几项增强hsv_h0.015、hsv_s0.7、hsv_v0.4做颜色扰动模拟不同灯光degrees10做小角度旋转模拟拍摄倾斜mosaic1.0默认开着把四张图拼一张等效增加场景组合。但要注意药品包装上的文字方向敏感flipud上下翻转最好关掉否则文字倒过来模型学到的特征就乱了。fliplr左右翻转一般可以留除非包装左右不对称且业务在意。验证不能只看 mAP。我习惯把验证集预测结果导出来按类别分别看混淆矩阵确认没有两类互相混。然后拿一批训练时没见过的真实场景图——比如不同货架、不同手机拍的——单独跑一遍统计误检和漏检。这一步才是决定这个方案能不能上线的关键。如果真实场景掉点严重优先补那类场景的图而不是调模型结构。迭代节奏上第一版跑通后不要急着换更大的模型。先把yolov8n训到 mAP50 稳定在 0.85 以上再考虑换yolov8s看有没有提升。如果换了模型提升不到 2 个点说明瓶颈在数据不在模型回去补数据更划算。另外best.pt和last.pt都要留着best.pt用于推理last.pt用于断点续训别只存一个。最后说个我自己的习惯每次训练完把data.yaml、转换脚本、训练命令和当时的 mAP 记在一个experiment.md里。小数据集实验迭代快不记的话两周后你根本想不起来哪版用了什么参数。这个数据集体量小正好适合拿来练这套记录习惯——跑通一次后面换任何药品品类流程都是同一套。希望帮到你。本文还有配套的精品资源点击获取
返回列表