
简介这是一份面向目标检测初学者与药品识别应用开发者的布洛芬检测数据集可用于训练和验证单类别目标检测模型适用于药品分拣、智能零售货架识别等场景。资源包共1430个文件包含476张jpg图片、476个VOC格式xml标注文件、476个YOLO格式txt标注文件及少量说明文件压缩包约19.62MB两种标注格式可直接对接YOLO系列与Faster R-CNN等主流框架。全部图片由labelImg手工画框标注类别为buluofen共657个标注框平均每张约1.4个目标标注规范统一。目前已有175人学习下载适合需要快速验证药品检测算法、补充单类别数据集或进行迁移学习实验的读者可省去自行采集与标注的成本直接投入模型训练与效果对比。1. 药品泡罩包装检测的 476 张图这份布洛芬数据集到底能干什么产线上泡罩板跑得飞快反光、叠片、缺粒、空泡混在一起靠人眼盯一天下来漏检率能飙到两位数。想上视觉检测第一个卡住你的往往不是模型而是数据——网上公开的药品检测集少得可怜自己拍又要重新标一遍。这份布洛芬检测数据集就是冲着这个缺口来的476 张 jpg 图片配套 476 个 Pascal VOC 格式 xml 和 476 个 YOLO 格式 txt单类别buluofen总框数 657用 labelImg 画的矩形框。它不包含分割路径的 txt就是最朴素的「图 双格式标注」。适合谁做药品包装质检、泡罩板缺陷检测、小样本单类目标检测的从业者以及想拿一个干净单类数据集跑通 YOLO 全流程的新手。476 张不算多但胜在格式齐全、类别单一拿来验证训练管线、做迁移学习起点比从零攒数据省事得多。2. VOC 与 YOLO 双格式拆解657 个框是怎么落到文件里的拿到压缩包先别急着喂模型得先搞清楚这两种格式各自长什么样、坐标怎么换算。很多人翻车就翻在「以为两种格式能直接混用」结果训练时框全飘到图外。2.1 Pascal VOC 的 xml 结构VOC 格式是 XML一张图对应一个 xml核心信息在object节点里。这份数据集每个 xml 只有一个object单类但框数 657 大于图片数 476说明有部分图片里存在多个目标实例也就是一张图里画了多个buluofen框。打开一个 xml 大概长这样annotation folderbuluofen/folder filenamebuluofen_xyxr_369.jpg/filename size width640/width height480/height depth3/depth /size object namebuluofen/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin112/xmin ymin88/ymin xmax305/xmax ymax240/ymax /bndbox /object /annotationxmin/ymin/xmax/ymax是绝对像素坐标左上角为原点。difficult标 0 表示不是难样本训练时一般全保留。注意size里的宽高必须和真实图片一致如果标注时图片被缩放而 xml 没同步框就会整体偏移——这是 VOC 数据集最常见的暗坑。2.2 YOLO 的 txt 归一化坐标YOLO 格式是每张图一个同名 txt每行一个目标类别索引 cx cy w h全部是相对图片宽高的归一化值0~1。这份数据集只有一个类别所以类别索引恒为 0。换算关系是# VOC 绝对坐标 - YOLO 归一化坐标 # xmin, ymin, xmax, ymax 来自 xmlimg_w, img_h 来自图片实际尺寸 cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 写入时保留 6 位小数类别索引 0 在最前 line f0 {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}\n参数说明cx/cy是框中心点归一化坐标w/h是框宽高归一化值。归一化用的是每张图自己的宽高不是数据集统一尺寸。如果图片尺寸不一千万别用固定值去算否则小图上的框会算错。这份数据集图片命名带xyxr后缀尺寸未必统一转换脚本里必须逐张读图取尺寸。2.3 两种格式的对应关系与校验项目VOC (xml)YOLO (txt)坐标类型绝对像素归一化 0~1每图文件数1 个 xml1 个 txt类别表示name文本类别索引整数框数承载多个object多行本数据集框数657657校验时最直接的办法是写个脚本统计两边框数是否一致再抽查几张图把 YOLO 坐标反算回像素画到图上肉眼比对。常见做法是随机抽 10 张可视化只要有一张框偏移就说明转换或标注环节有问题。3. 从零跑通训练划分数据集、写 data.yaml、启动 YOLO格式搞明白了接下来是把它变成模型能吃的输入。这一步的核心是三件事划分 train/val、生成 YOLO 需要的目录结构和 yaml、确认类别名对齐。3.1 划分训练集与验证集476 张按 8:2 划分约 380 训练、96 验证。单类数据集样本量不大划分时要注意别让某个子场景比如某种拍摄角度全落进验证集。我一般用固定随机种子保证每次划分一致方便复现。import os, random, shutil random.seed(42) # 固定种子保证划分可复现 img_dir images # 所有 jpg 所在目录 txt_dir labels # 所有 yolo txt 所在目录 out_root dataset imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(imgs) split int(len(imgs) * 0.8) train_imgs, val_imgs imgs[:split], imgs[split:] for subset, files in [(train, train_imgs), (val, val_imgs)]: os.makedirs(f{out_root}/images/{subset}, exist_okTrue) os.makedirs(f{out_root}/labels/{subset}, exist_okTrue) for f in files: shutil.copy(f{img_dir}/{f}, f{out_root}/images/{subset}/{f}) txt f.replace(.jpg, .txt) shutil.copy(f{txt_dir}/{txt}, f{out_root}/labels/{subset}/{txt}) print(ftrain{len(train_imgs)}, val{len(val_imgs)})逻辑说明图片和同名 txt 必须成对搬运YOLO 靠文件名匹配图与标签少一个 txt 那张图就会被当成负样本或直接报错。random.seed(42)是后悔药换机器重跑划分结果不变。参数上 0.8 是经验值样本少于 500 时验证集别低于 15%否则指标抖动大。3.2 写 data.yaml 并核对类别YOLO 训练靠一个 yaml 描述数据位置和类别。这份数据集只有一个类别names里就写buluofen索引 0 对应它。# data.yaml path: ./dataset # 数据集根目录 train: images/train # 相对 path 的训练图目录 val: images/val # 相对 path 的验证图目录 nc: 1 # 类别数 names: 0: buluofen # 类别名必须和标注里的 name 对应注意nc和names的索引必须严格对应。如果哪天你往这个数据集里加了第二个类别nc要改成 2names补上索引 1同时所有 txt 里新类别的行首索引也要改漏改一处训练就会把新类别当背景。3.3 启动训练与关键参数环境装好后一条命令就能起训。以常见的 YOLO 系列为例yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/buluofen \ nameexp1参数说明model选 nano 版是因为 476 张图撑不起大模型容易过拟合imgsz640是通用起点若原图分辨率远大于此可上调到 960 但显存吃紧batch16在 8G 显存上比较稳爆显存就降到 8patience20表示 20 轮验证指标不升就早停省时间。训练完看runs/buluofen/exp1下的results.csv和混淆矩阵单类任务重点看召回率漏检比误检在质检场景里更致命。4. 避坑与排查单类小数据集最容易栽的五个地方数据集不大坑却不少。下面这几条是我在类似单类检测任务里反复踩过的按「现象 → 原因 → 解决」记下来。现象一训练 loss 正常下降但验证集框全糊在一起。原因多半是 YOLO txt 坐标没归一化或者归一化时用了错误的图片尺寸。解决抽一张图把 txt 反算成像素画框和原图比对确认cx/w乘的是该图真实宽高。现象二报错「No labels found」或大量图片被跳过。原因是图片和 txt 文件名不一致或 txt 放在错误目录。YOLO 要求images/train/xxx.jpg对应labels/train/xxx.txt路径层级必须镜像。解决写脚本比对两个目录的文件名集合差集就是问题文件。现象三训练几轮后 mAP 卡在很低的值不动。单类数据集常见原因是data.yaml里nc写成 0 或类别名拼错。解决核对nc: 1和names里的buluofen注意大小写和空格标注里是什么就写什么。现象四验证集指标虚高实际推理漏检严重。原因是划分时相似图片同一批次连拍同时进了训练和验证造成数据泄漏。解决按拍摄批次或时间分组划分而不是纯随机。这份数据集文件名带序号可以按序号段粗分降低泄漏。现象五框位置对但类别置信度普遍偏低。476 张、657 框对单类来说偏少模型没学充分。解决开数据增强 mosaic、翻转、HSV 抖动或先用通用预训练权重再微调别从随机初始化硬训。提示每次改完标注或 yaml先跑一轮 1 epoch 的冒烟训练确认能正常读数据、loss 有变化再开长训能省下大量白等的时间。5. 把 657 个框用透小样本单类检测的进阶技巧476 张图想榨出可用模型光靠默认配置不够。这一章讲几个我实际用过、能明显拉开效果差距的做法。第一是框数分布分析。657 框 / 476 图 ≈ 1.38说明大部分图只有 1 个目标少数图有多个。先把每张图的框数统计出来看看多框图占比多少。如果多框图很少模型会偏向「一图一框」的先验遇到密集排列的泡罩板就漏。对策是在增强里加入copy_paste或 mosaic人为制造多目标场景逼模型学会区分相邻实例。第二是锚框与输入尺寸匹配。药品泡罩板上的单粒目标通常偏小如果原图分辨率高而训练时压到 640小目标特征会被抹掉。做法是先统计所有框的宽高分布import os ws, hs [], [] for f in os.listdir(labels/train): for line in open(flabels/train/{f}): _, _, _, w, h map(float, line.split()) ws.append(w); hs.append(h) print(w均值, sum(ws)/len(ws), h均值, sum(hs)/len(hs)) print(最小w, min(ws), 最小h, min(hs))如果最小框归一化后小于 0.02说明目标很小imgsz建议提到 960 甚至 1280或者改用带 P2 小目标检测层的结构。参数上别盲目拉大显存和时间成本要一起算。第三是验证要落到业务指标。mAP 好看不代表产线能用。单类质检真正关心的是漏检率和误检率做法是在验证集上导出预测框和真值按 IoU 0.5 匹配统计漏检真值没匹配上和误检预测没匹配上。下面这段逻辑可以直接套# 简化版漏检/误检统计思路 # 对每张验证图preds 为模型输出框gts 为真值框 # 按 IoU 贪心匹配未匹配的 gt 记为漏检未匹配的 pred 记为误检 def iou(a, b): # a, b 格式 [x1,y1,x2,y2] ix1, iy1 max(a[0], b[0]), max(a[1], b[1]) ix2, iy2 min(a[2], b[2]), min(a[3], b[3]) iw, ih max(0, ix2-ix1), max(0, iy2-iy1) inter iw * ih ua (a[2]-a[0])*(a[3]-a[1]) (b[2]-b[0])*(b[3]-b[1]) - inter return inter / ua if ua 0 else 0把置信度阈值从 0.25 往上扫画一条漏检-误检曲线选业务能接受的那个点而不是直接用默认 0.25。这一步做完你才知道这个模型到底能不能上线。第四是增量标注的闭环。476 张只是起点实际部署后模型一定会遇到没见过的拍摄条件。把线上漏检的图存下来用 labelImg 按同样规则补框定期并入训练集重训。类别名保持buluofen不变格式继续走 VOCYOLO 双份这样新旧数据能无缝合并。我一般每积累 50 张新图就重训一次观察漏检率是否下降不降就回滚。最后说个习惯每次拿到新数据集我第一件事不是开训而是随机抽 20 张把标注画出来肉眼过一遍确认框贴不贴、类别对不对、有没有漏标。这份布洛芬数据集标注规则是矩形框、单类别看着简单但药品包装反光导致的边界模糊标注时框大框小很影响小目标学习。从那以后我每次拿到标注数据都强制走一遍可视化抽检宁可花半小时也不愿训完两天才发现标签有问题。希望这份拆解帮到你需要这套 476 张 VOCYOLO 布洛芬检测数据集的话直接拿去跑通你的第一条质检管线。本文还有配套的精品资源点击获取