新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于476张药品布洛芬数据集的小样本目标检测实战

发布时间:2026/9/30 1:48:13来源:尧图网络
基于476张药品布洛芬数据集的小样本目标检测实战
简介这份资源是面向目标检测初学者与药品包装质检场景的布洛芬检测数据集适合需要快速验证模型、练习标注流程或搭建药品识别原型的开发者与研究人员。数据集共476张jpg图片每张均配有对应的VOC格式xml标注与YOLO格式txt标注标注工具为labelImg采用矩形框方式类别仅含buluofen一类共657个标注框样本分布相对集中便于直接用于单类别检测任务。压缩包内文件总数为1430个其中txt文件478个、xml文件476个、jpg图片476个整体大小约19.62MB体积轻量下载与解压成本低。目前已有175人学习下载说明该数据集在药品检测方向具有一定参考价值。读者可借助VOC与YOLO双格式标注灵活适配Faster R-CNN、YOLO系列等主流框架省去自行采集与标注的时间快速投入模型训练、数据增强与评估实验也可作为药品包装缺陷检测或相似单类别任务的迁移学习起点。1. 476张药品布洛芬检测数据集小样本目标检测的试金石手里只有几百张图却要跑通一个药品检测模型这是很多做工业视觉和医药分拣的工程师都会遇到的真实开局。药品布洛芬检测数据集476张VOCYOLO格式本质上就是这样一个“小而精”的起点476张标注好的药品图像同时提供VOC的XML和YOLO的TXT两套标注让你不用在格式转换上浪费时间直接把精力放在模型能不能收敛、小目标能不能召回上。它适合三类人一是刚接触目标检测、想找一个真实场景练手的新手二是做药品分拣、药房自动化、智能药柜的从业者需要快速验证一个检测方案是否可行三是想研究小样本、类别不均衡问题的熟手因为药品包装的类间差异小、类内差异大天然是个有挑战的测试集。别小看这476张它足够让你把YOLO训练、验证、部署的整条链路走一遍也能让你踩到小数据集最典型的坑。2. 拆开这个数据集VOC与YOLO双格式到底怎么用2.1 VOC格式的目录结构与XML字段含义拿到压缩包解压后常见做法是看到两个顶层目录VOC2007和YOLO或者labels和images分开。VOC格式的核心是Annotations文件夹里每张图对应一个XML文件名与图片同名。XML里真正影响训练的是这几个字段filename记录图片名size里的width和height是原图尺寸object下的name是类别名bndbox里的xmin、ymin、xmax、ymax是左上角和右下角坐标。注意VOC的坐标是绝对像素值且原点在左上角xmax和ymax是包含边界的转换时不要习惯性减一否则框会整体偏小一个像素。对于药品布洛芬这种单类或少数类场景name字段通常就是ibuprofen或者pill你要先确认类别名是否统一有没有写成Ibuprofen、ibuprofen、布洛芬混用的情况这会导致训练时类别数对不上。2.2 YOLO格式的归一化坐标与类别索引YOLO格式的标注是每张图一个TXT每行一个目标格式为class_id x_center y_center width height。这里的坐标全部是归一化到0到1之间的浮点数x_center和y_center是框中心点相对于图宽和图高的比例width和height是框宽高相对于图宽和图高的比例。class_id是从0开始的整数索引对应一个classes.txt或data.yaml里的类别列表。很多新手直接拿VOC的绝对坐标除以图片尺寸却忘了VOC的xmax是包含边界的正确做法是x_center (xmin xmax) / 2.0 / widthw (xmax - xmin) / width不要额外加一或减一。如果你拿到的YOLO标注里出现了大于1的值说明转换脚本写错了或者原图尺寸记录有误这种数据直接训练会导致损失爆炸。2.3 用Python脚本做一次格式自检与可视化在投入训练之前我一般会写一个短脚本把标注画到图上肉眼确认框的位置和类别是否正确。下面这段代码同时读取VOC和YOLO两种格式把框画出来保存到check目录你只需要改img_dir和label_dir两个路径。import os import cv2 import xml.etree.ElementTree as ET # 配置路径图片目录和标注目录VOC用AnnotationsYOLO用labels img_dir dataset/images voc_dir dataset/Annotations yolo_dir dataset/labels save_dir check os.makedirs(save_dir, exist_okTrue) # 读取YOLO格式并画框 def draw_yolo(img_path, label_path, save_path): img cv2.imread(img_path) h, w img.shape[:2] if os.path.exists(label_path): with open(label_path, r) as f: for line in f.readlines(): parts line.strip().split() if len(parts) ! 5: continue cls_id, xc, yc, bw, bh map(float, parts) # 反归一化到像素坐标 x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(int(cls_id)), (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imwrite(save_path, img) # 读取VOC格式并画框 def draw_voc(img_path, xml_path, save_path): img cv2.imread(img_path) if os.path.exists(xml_path): tree ET.parse(xml_path) root tree.getroot() for obj in root.findall(object): name obj.find(name).text bbox obj.find(bndbox) x1 int(bbox.find(xmin).text) y1 int(bbox.find(ymin).text) x2 int(bbox.find(xmax).text) y2 int(bbox.find(ymax).text) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.putText(img, name, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.imwrite(save_path, img) # 遍历图片同时检查两种格式 for img_name in os.listdir(img_dir): if not img_name.lower().endswith((.jpg, .png, .jpeg)): continue img_path os.path.join(img_dir, img_name) base os.path.splitext(img_name)[0] # YOLO检查 yolo_label os.path.join(yolo_dir, base .txt) draw_yolo(img_path, yolo_label, os.path.join(save_dir, yolo_ img_name)) # VOC检查 voc_xml os.path.join(voc_dir, base .xml) draw_voc(img_path, voc_xml, os.path.join(save_dir, voc_ img_name)) print(可视化完成请检查check目录)这段代码的逻辑很直接对每张图分别用YOLO和VOC的解析方式画框YOLO用绿色VOC用红色保存到check目录。参数上你只需要改三个路径img_dir指向图片文件夹voc_dir指向XML文件夹yolo_dir指向TXT文件夹。跑完之后重点看三件事框有没有明显偏移、有没有漏标的目标、类别文字是不是你预期的那个。如果发现YOLO的框整体偏小一圈大概率是转换时把xmax减了1如果VOC的框跑到图像外面去了检查XML里的size和实际图片尺寸是否一致。这一步花十分钟能省掉后面几个小时的训练排错。3. 用YOLOv8跑通476张药品检测从data.yaml到训练命令3.1 组织数据集目录与编写data.yamlYOLOv8对目录结构有固定要求常见做法是建一个datasets文件夹里面放images和labels再各自分train、val、test。对于476张图我一般按7:2:1切分也就是训练集333张、验证集95张、测试集48张。切分时要注意同一类药品的不同角度、不同光照尽量均匀分布不要把所有正面图都放进训练集否则验证集指标会虚高。切分脚本可以用sklearn.model_selection.train_test_split也可以用简单的随机打乱后按比例复制。目录建好后在datasets同级写一个ibuprofen.yaml内容如下path: ./datasets train: images/train val: images/val test: images/test nc: 1 names: [ibuprofen]nc是类别数药品布洛芬数据集如果只有布洛芬一种药就写1如果还包含其他药品按实际类别数改。names列表的顺序必须和YOLO标注里的class_id一致否则模型会把布洛芬学成别的类别。这个文件是YOLOv8训练的唯一入口路径写错会直接报Dataset not found。3.2 训练命令与关键参数怎么设YOLOv8的训练命令很简洁但参数设不对476张小数据集很容易过拟合或者不收敛。我常用的起手命令是yolo detect train \ dataibuprofen.yaml \ modelyolov8n.pt \ epochs200 \ imgsz640 \ batch16 \ lr00.001 \ lrf0.01 \ patience50 \ augmentTrue \ cacheTrue \ device0逐项说明modelyolov8n.pt用nano版本因为数据量小大模型反而容易过拟合epochs200配合patience50如果50轮验证指标不升就早停避免浪费时间imgsz640是默认输入尺寸药品包装上的文字和图案通常在这个分辨率下能看清如果药盒很小可以提到imgsz960但显存要够batch16在单卡12G显存下比较稳显存小就降到8lr00.001是初始学习率小数据集不要用默认的0.01容易震荡lrf0.01是最终学习率因子让学习率在训练末期降到初始值的1%augmentTrue开启Mosaic、HSV等增强对476张图来说增强是防止过拟合的关键cacheTrue把图片缓存到内存加快训练速度但内存小于16G就别开。训练过程中重点看mAP50和mAP50-95如果mAP50在0.8以上说明模型基本可用如果一直在0.3以下先回去检查标注。3.3 训练日志里必须盯住的三个指标训练启动后控制台会打印每个epoch的损失和指标。第一个要盯的是box_loss它衡量预测框和真实框的差距正常应该从1.0左右稳步下降到0.3以下。如果box_loss不降反升检查学习率是不是太大或者标注里有没有宽高为0的无效框。第二个是cls_loss分类损失单类场景下它应该很快降到接近0如果一直很高说明类别索引对不上比如标注里写了class_id1但nc1只允许0。第三个是mAP50这是最直观的指标476张图训练集上mAP50到0.9以上不稀奇但验证集能到0.75以上才算真的学到了东西。如果训练集mAP50很高、验证集很低那就是过拟合需要加增强、减模型复杂度或者早停。另外注意val/box_loss和val/cls_loss它们和训练损失差距太大也是过拟合的信号。4. 小数据集训练避坑476张图最容易翻车的五个地方4.1 标注类别名不一致导致类别数错乱现象训练启动时报AssertionError: nc mismatch或者训练完发现模型把所有药都预测成同一个类别。原因VOC的XML里name字段有的写ibuprofen有的写Ibuprofen有的写布洛芬而YOLO的classes.txt只定义了一个类别。解决在转换前统一类别名用脚本把所有XML里的name替换成同一个字符串再重新生成YOLO的TXT和data.yaml。我一般会先跑一遍grep -r name Annotations | sort | uniq -c看看有多少种写法。4.2 图片与标注文件名不匹配现象训练时提示No labels found或者某张图被跳过。原因图片是IMG_001.jpg标注是IMG_001.xml或IMG_001.txt但中间多了空格、大小写不一致或者图片是.jpeg而标注是.jpg。解决写一个重命名脚本把所有图片和标注的后缀统一成小写去掉文件名里的空格和特殊字符确保os.path.splitext出来的base完全一致。这个坑在Windows和Linux之间拷贝文件时尤其常见。4.3 验证集里出现训练集图片导致指标虚高现象验证集mAP50高得离谱比如0.98但拿新图片测试时一塌糊涂。原因切分数据集时用了随机切分但同一张图的不同增强版本或者同一批次连拍的图片被分到了训练集和验证集。解决按图片的原始来源分组切分比如同一盒药的不同角度算一组整组进训练集或验证集。如果数据里没有分组信息至少用hash去重确保验证集的图片没有在训练集里出现过。4.4 小目标漏检严重现象大药盒能检测到小药板或者远处药盒漏检。原因476张图里小目标占比高而YOLOv8默认的imgsz640下小目标经过下采样后特征太弱。解决把imgsz提到960或1280同时开启mosaic增强让模型多见小目标在不同位置的情况。如果显存不够用yolov8s代替yolov8n稍微增加模型容量。另外检查标注里小目标的框是不是太小比如宽高只有几个像素这种框在训练时会被忽略需要合并或剔除。4.5 训练到一半loss突然变成NaN现象前几十轮正常突然box_loss变成nan训练中断。原因学习率太大导致梯度爆炸或者标注里有坐标超出图片范围的异常框。解决先把lr0降到0.0005加warmup_epochs3让学习率慢慢升上去。然后检查所有YOLO标注确保x_center、y_center、width、height都在0到1之间如果有大于1的值定位到具体图片重新标注或修正。另外batch太大也可能导致NaN降到8试试。5. 从476张到可用模型验证、导出与一个提点技巧训练完不是终点你得知道模型到底能不能用。我一般会做三件事第一用yolo detect val在测试集上跑一遍看mAP50和mAP50-95同时生成混淆矩阵确认有没有把布洛芬误判成背景第二拿几张训练时没见过的真实药盒照片用yolo detect predict跑一下看置信度分布如果大部分框的置信度在0.5以下说明模型还没学好第三用yolo export导出ONNX或TensorRT测一下推理速度药品分拣场景通常要求单张图在50毫秒以内如果超过这个数考虑换更小的模型或者量化。这里分享一个我常用的提点技巧用训练好的模型对训练集做一次推理把置信度低但实际正确的框挑出来人工确认后加入训练集。476张图里总有一些目标因为角度、遮挡导致模型学不好通过这种“模型挖矿”的方式往往能再提升2到3个点的mAP50。具体操作是先用yolo detect predict生成预测结果然后写脚本对比预测框和真实框的IoU把IoU大于0.5但置信度小于0.4的图片挑出来这些就是模型的“困难样本”把它们复制一份到训练集重新训练一轮。注意不要直接把预测框当标注一定要人工核对否则会引入噪声。导出ONNX的命令很简单yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640导出后可以用onnxruntime加载测一下单张图的推理时间。如果部署在边缘设备上还可以用formatengine导出TensorRT速度能再快一倍但需要设备支持。最后说一句血泪经验小数据集训练数据质量比模型结构重要十倍。476张图如果标注得干净、类别统一、切分合理YOLOv8n就能跑出可用的效果如果标注乱七八糟换再大的模型也是白搭。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Keil C51与A51混合编程:C调汇编的三种方式与调用约定 2026/9/30 5:20:17

Keil C51与A51混合编程:C调汇编的三种方式与调用约定

1. 什么时候真的需要在 C51 工程里塞汇编8051 这颗核虽然老,但在工控板、小家电、传感器节点里活得比谁都久。只要在用 Keil C51 写这类项目,早晚会遇到一个岔路口:这段代码用 C 写出来就是不对劲,要么时序差几十个机器周期&#…

阅读更多 →
Jev模型在风控领域的应用:长序列建模与稀疏事件捕捉 2026/9/30 5:20:16

Jev模型在风控领域的应用:长序列建模与稀疏事件捕捉

1. Jev模型到底是什么,为什么风控圈子突然都在聊它第一次看到“Jev模型”这个词,是在几个风控技术群里。有人甩了一张截图,说某个新出的模型在行为序列建模上的表现有点意思,紧接着就有人问“这玩意儿能用在风控上吗”。再往后&am…

阅读更多 →
天津口碑好的防水LED显示屏制造厂家实力盘点 2026/9/30 5:20:16

天津口碑好的防水LED显示屏制造厂家实力盘点

天津做户外广告工程,想要安装防水LED显示屏,都会有几个躲不开的问题。Q1:天津找防水LED显示屏,为什么很多人都选本地周边靠谱厂家?其实不管是户外道路路口的大屏,还是商业广场的展示屏,或是楼顶的广告载体…

阅读更多 →
DeepSeek大模型驱动因子库自动扩充与投资逻辑可解释性方案 2026/9/30 5:20:16

DeepSeek大模型驱动因子库自动扩充与投资逻辑可解释性方案

简介:这份279页PDF文档面向量化研究员、金融科技开发者与证券投资策略工程师,系统讲解如何借助DeepSeek大模型实现证券因子库的自动扩充与投资逻辑的可解释性分析。内容从整体技术架构、因子库基础规范、多源数据采集与预处理,到Prompt工程设…

阅读更多 →
Ubuntu 20.04安装ROS Noetic全攻略:从换源到环境验证,亲测有效 2026/9/30 5:20:16

Ubuntu 20.04安装ROS Noetic全攻略:从换源到环境验证,亲测有效

开头Ubuntu 20.04装ROS Noetic这件事,我前前后后在不同的机器上折腾了不下二十次,有全新裸机、双系统、虚拟机,也有从ROS Melodic升级上来的老环境。说“亲测有效”不是标题党,而是每一步都真实跑过,踩过的坑比安装步骤…

阅读更多 →
Redis 接入 AI 实战:缓存、向量检索与运维避坑指南 2026/9/30 5:20:09

Redis 接入 AI 实战:缓存、向量检索与运维避坑指南

Redis 已正式接入 AI 这件事,我一开始是当营销口号看的。毕竟 Redis 火了这么多年,核心标签一直是缓存、队列、分布式锁,和 AI 看起来八竿子打不着。直到自己在一个 AI Agent 项目里,被模型响应延迟和 token 成本折磨得够呛&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉