
简介这份感冒药品分类检测数据集面向目标检测初学者与药品识别方向的研究者用于训练和验证常见感冒药品的检测模型可应用于智能药房、药品分拣等场景。资源同时提供Pascal VOC与YOLO两种标注格式包含jpg图片及对应的xml、txt标注文件方便直接接入主流检测框架。压缩包共2000个文件以962个txt标注、960个xml标注和78个jpg图片为主整体约44.17MB目录结构清晰便于按格式快速取用。数据集共标注4类分别为999ganmaoling、banlangen、buluofen和drugs总框数1365其中buluofen与999ganmaoling样本较多drugs仅1框类别分布差异明显适合用来观察长尾类别对检测效果的影响。目前已有395人学习下载可作为药品检测练手或课程实验的现成数据来源。1. 感冒药品分类检测数据集959 张、3 类别、VOCYOLO 双格式到底能干什么手里有一批药盒照片想做一个能自动分辨感冒药类别的检测模型最卡脖子的往往不是网络结构而是数据。这个标题讲的是一份已经整理好的目标检测数据集959 张图像、3 个类别、同时提供 VOC 与 YOLO 两种标注格式。它解决的是「从零标注太慢、格式转换太烦」这两个前置问题让你能把精力放在训练和调参上。适合谁做药品分拣、药房盘点、智能药柜、零售货架识别的工程师和在校做课题的同学。959 张不算大属于典型的小样本场景所以后面我会重点讲小数据集怎么防止过拟合、VOC 和 YOLO 格式怎么互转、以及训练时哪些参数必须改。先把这份数据集的定位说清楚它是一个起点不是终点能不能用出效果取决于你怎么扩增和怎么设阈值。2. 拆开这份数据集3 类别、959 张、VOC 与 YOLO 的差异在哪2.1 VOC 的 XML 和 YOLO 的 txt 到底差在哪VOC 格式每张图对应一个 XML 文件里面用object节点记录类别名和xmin/ymin/xmax/ymax四个绝对像素坐标。YOLO 格式每张图对应一个 txt每行是class_id x_center y_center width height全部归一化到 0~1。两者描述的是同一批框只是坐标系和存储方式不同。很多人拿到双格式数据集后直接混用结果训练时框全偏了这就是没搞清差异。维度VOC (XML)YOLO (txt)坐标类型绝对像素归一化 0~1类别表示字符串名称从 0 开始的整数 id一图多框多个 object 节点多行常用框架Faster R-CNN、SSDYOLO 系列类别 id 的映射顺序必须固定否则同一份数据两次训练结果对不上。常见做法是建一个classes.txt按行写类别名行号就是 id。2.2 959 张 3 类别意味着什么平均每类约 320 张属于小样本。小样本最怕的是类别不均衡和背景单一。先做一次统计别急着开训import os from collections import Counter label_dir labels # YOLO txt 目录 counter Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: line line.strip() if line: counter[int(line.split()[0])] 1 # 第一列是 class_id print(counter) # 看每类框数量差距超过 3 倍就要考虑重采样这段代码统计每个类别的标注框数量。参数上只需改label_dir。如果发现某一类框数只有另一类的三分之一训练时该类召回会明显偏低解决办法是对少样本类做复制增强或调高其损失权重。959 张里如果还有大量近似重复帧比如同一药盒连拍要先去重否则验证集指标虚高上线就翻车。2.3 从 VOC 转 YOLO 的最小脚本数据集虽然给了双格式但你可能只拿到 VOC或者需要重新划分。转换脚本必须处理边界坐标越界、宽高为 0、类别名不在表里。import xml.etree.ElementTree as ET import os classes [cold_a, cold_b, cold_c] # 按你的实际类别名改 def voc_to_yolo(xml_path, out_path, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text if name not in classes: continue # 类别不在表里直接跳过避免 id 错乱 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) # 裁剪到图像范围内防止越界 xmin, xmax max(0, xmin), min(img_w, xmax) ymin, ymax max(0, ymin), min(img_h, ymax) w, h xmax - xmin, ymax - ymin if w 1 or h 1: continue # 过滤无效框 xc (xmin xmax) / 2 / img_w yc (ymin ymax) / 2 / img_h lines.append(f{classes.index(name)} {xc:.6f} {yc:.6f} {w/img_w:.6f} {h/img_h:.6f}) with open(out_path, w) as f: f.write(\n.join(lines))逻辑说明先按类别表过滤再做坐标裁剪最后归一化。参数img_w/img_h必须和真实图像尺寸一致读图时用 PIL 或 OpenCV 获取不要写死。归一化保留 6 位小数足够YOLO 官方也是这个精度。转换完抽查几张用可视化脚本把框画回图上确认没偏移再开训。3. 用 YOLO 跑通第一版环境、配置、训练命令3.1 环境搭建与数据目录规范YOLO 系列对目录结构有约定放错位置会直接报找不到标签。标准结构如下dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml是入口配置path: ./dataset train: images/train val: images/val nc: 3 names: [cold_a, cold_b, cold_c]nc是类别数必须和 names 长度一致。names 顺序要和转换时的 classes 完全对应差一个顺序模型学到的就是错的类别。安装依赖用 pip 即可GPU 环境记得装对应 CUDA 版本的 torch否则会退回 CPU 训练959 张也能跑但慢很多。3.2 训练命令与关键参数yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ patience30 \ augmentTrue参数逐个说model选 nano 版是因为 959 张小数据大模型更容易过拟合epochs150配合patience3030 轮验证指标不升就早停省时间imgsz640是通用值药盒目标通常不小640 够用batch16按显存调爆显存就降到 8lr00.01是默认起点小数据可以降到 0.005 更稳augmentTrue开启内置增强对小样本很关键。训练完看runs/detect/train/下的混淆矩阵和 PR 曲线别只看 mAP 一个数。3.3 小样本下必须做的增强策略959 张直接训验证集 mAP 可能还行但换一批新照片就掉。原因是模型记住了背景。增强要针对药品场景随机亮度对比度药盒反光差异大、随机旋转小角度±10°、马赛克增强YOLO 内置。颜色抖动幅度别太大否则药盒颜色特征被破坏类别混淆。常见做法是把验证集比例提到 20%即约 190 张保证评估可信。如果某类样本太少用离线复制加随机裁剪生成额外样本但要注意别把同一张图的副本同时放进训练和验证那是数据泄漏指标会骗你。4. 避坑与排查959 张数据训崩的 5 个真实原因4.1 现象loss 一直不降mAP 接近 0原因通常是类别 id 错位或标签路径不对。YOLO 找不到标签时不会报错而是当负样本处理。解决检查labels/train下 txt 数量是否和images/train一致再抽查一个 txt 的 class_id 是否在 0~nc-1 范围内。4.2 现象训练正常但验证框全偏原因多为 VOC 转 YOLO 时图像尺寸读错比如用了缩略图尺寸而非原图。解决转换脚本里统一用原图宽高转换后可视化抽查 10 张框贴合目标才算过。4.3 现象某一类召回极低原因是类别不均衡或该类样本背景单一。解决统计框数对少样本类做增强或在损失里调高该类权重。别直接删掉多样本类那会丢信息。4.4 现象训练集 mAP 高验证集低典型过拟合。959 张太小模型容量相对过大。解决换更小模型、加权重衰减、提高增强强度、早停。血泪经验是别为了刷高训练指标把增强关掉那等于自欺欺人。4.5 现象推理时漏检小药盒原因可能是 imgsz 太小或 anchor 不匹配。解决把推理尺寸提到 640 以上或检查数据里小目标占比必要时用切片推理。注意别盲目调低置信度阈值那会引入大量误检药品种类错检的代价比漏检更高。5. 把 959 张用出 5000 张的效果进阶技巧与验证习惯数据量固定时提升空间在「怎么用」而不是「堆模型」。第一个技巧是分层采样划分验证集按类别和拍摄角度分层保证验证集覆盖每个类的多种外观这样指标才有参考价值。第二个技巧是伪标签半监督先用当前模型对未标注药盒图推理人工复核后加入训练集一轮下来通常能扩几百张有效样本。第三个技巧是冻结 backbone 先训 head 再解冻全量微调小数据下这样收敛更稳。验证习惯上我一般固定一个「黄金测试集」从原始数据里单独留出 50 张不参与任何训练和调参只在最后跑一次。很多人反复用验证集调参调到最后验证集也被间接拟合了黄金测试集是唯一的后悔药。导出模型时用 ONNX 做一次跨框架验证确认推理结果和训练框架一致避免部署时才发现坐标对不上。yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640导出后拿同一张图分别用原模型和 ONNX 跑比对框坐标误差应在小数点后两位内。这一步花十分钟能省掉上线后排查半天的黑匣子问题。最后说个习惯每次改参数前先记录当前基线指标改完只动一个变量否则你永远不知道是哪个改动起了作用。959 张的数据集不值得反复推倒重来把增强、划分、阈值这三件事做扎实效果比换模型明显得多。希望帮到你。本文还有配套的精品资源点击获取