ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

布洛芬泡罩包装检测数据集:VOC与YOLO格式解析及YOLO训练实战

布洛芬泡罩包装检测数据集:VOC与YOLO格式解析及YOLO训练实战 简介本资源为药品布洛芬目标检测数据集面向从事药品识别、智能零售与医药分拣等方向的算法工程师、学生及科研人员可用于训练和验证单类别目标检测模型。压缩包共1430个文件包含476张jpg图片、476个VOC格式xml标注文件、476个YOLO格式txt标注文件及少量说明文件整体约19.62MB图片与标注一一对应方便直接接入YOLO或Pascal VOC训练流程。标注采用labelImg完成仅设buluofen一个类别共657个矩形框平均每张图约1.4个目标适合小样本单类检测的快速实验与迁移学习验证。目前已有175人学习下载可作为药品检测赛题或课程设计的基础数据帮助读者省去采集与标注成本快速搭建训练与评估管线。1. 药品泡罩包装检测的起点476张布洛芬数据集的真实定位药品泡罩包装的视觉检测是个容易被低估的场景。铝塑板反光、药片排列紧密、包装边缘与背景对比度低这些因素叠加在一起让通用目标检测模型直接迁移过来时经常出现漏检。我最近拆了一份专门针对布洛芬药片的目标检测数据集476张jpg图片配套476个VOC格式xml和476个YOLO格式txt标注类别只有一个buluofen总框数657。标注工具用的是labelImg规则就是画矩形框没有分割路径的txt文件纯粹的目标检测任务。这份数据集适合什么人如果你正在做药品分拣、泡罩包装缺陷检测、或者医药自动化产线上的视觉定位这个数据集能直接拿来跑通YOLO训练流程。它不是那种几万张的大规模数据集但胜在类别单一、标注干净适合快速验证模型结构和训练参数也适合作为小样本场景下的基线实验材料。476张图片对应657个框平均每张图1.38个目标说明大部分图片里布洛芬药片数量不多可能是单粒或双粒的特写拍摄这对检测小目标和密集排列的能力要求反而更高。2. VOC与YOLO双格式拆解目录结构、字段含义与转换逻辑2.1 VOC格式的xml里到底存了什么Pascal VOC格式的标注文件是xml结构每个xml对应一张jpg图片。打开一个典型的xml你会看到几个关键节点filename记录图片文件名size里包含width、height、depth三个值object节点下是标注信息包括name、pose、truncated、difficult、bndbox。bndbox里有xmin、ymin、xmax、ymax四个坐标值这是矩形框的左上角和右下角像素坐标。对于这份布洛芬数据集name字段的值固定是buluofen没有其他类别。pose、truncated、difficult这三个字段在标注时通常保持默认值labelImg默认pose为Unspecifiedtruncated和difficult为0。实际训练时YOLO格式并不读取这些字段但如果你要做数据清洗或筛选困难样本difficult字段可以作为过滤依据。xml文件的数量和jpg完全对应476个xml对应476张图没有遗漏。这意味着你不需要做额外的文件名匹配检查直接按文件名前缀就能配对。2.2 YOLO格式的txt坐标归一化规则YOLO格式的txt文件每行代表一个目标格式是class_id x_center y_center width height。这五个值用空格分隔其中x_center、y_center、width、height都是相对于图片宽高的归一化值范围在0到1之间。class_id从0开始编号这份数据集只有一个类别buluofen所以class_id恒为0。归一化的计算方式是x_center (xmin xmax) / 2 / image_widthy_center (ymin ymax) / 2 / image_heightwidth (xmax - xmin) / image_widthheight (ymax - ymin) / image_height。这里有个容易翻车的点如果你的图片尺寸在标注之后被修改过xml里的size和实际图片尺寸不一致归一化就会出错。这份数据集的xml里size字段和实际jpg尺寸应该是一致的但保险起见训练前还是用脚本校验一遍。2.3 用Python做格式校验与可视化检查拿到数据集后不要急着丢进训练脚本先跑一遍校验。下面这段代码检查jpg、xml、txt三者是否一一对应同时验证YOLO坐标是否在合法范围内。import os import xml.etree.ElementTree as ET from PIL import Image img_dir images xml_dir annotations_xml txt_dir labels_yolo img_files set(os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(.jpg)) xml_files set(os.path.splitext(f)[0] for f in os.listdir(xml_dir) if f.endswith(.xml)) txt_files set(os.path.splitext(f)[0] for f in os.listdir(txt_dir) if f.endswith(.txt)) # 检查三者是否完全一致 print(jpg-xml差集:, img_files - xml_files) print(jpg-txt差集:, img_files - txt_files) for name in list(img_files)[:5]: img_path os.path.join(img_dir, name .jpg) txt_path os.path.join(txt_dir, name .txt) w, h Image.open(img_path).size with open(txt_path) as f: for line in f: cls, xc, yc, bw, bh map(float, line.strip().split()) # 检查归一化值是否越界 assert 0 xc 1 and 0 yc 1, f{name} center越界 assert 0 bw 1 and 0 bh 1, f{name} 宽高越界 # 对比xml中的size和实际图片尺寸 tree ET.parse(os.path.join(xml_dir, name .xml)) root tree.getroot() xml_w int(root.find(size/width).text) xml_h int(root.find(size/height).text) if xml_w ! w or xml_h ! h: print(f{name} 尺寸不一致: xml({xml_w}x{xml_h}) vs 实际({w}x{h}))这段代码做了三件事第一用集合差集找出缺失的配对文件第二逐行读取YOLO txt断言归一化坐标在0到1之间第三对比xml里的size和PIL读出的实际图片尺寸。如果尺寸不一致说明标注后图片被裁剪或缩放需要重新计算归一化坐标。我一般会在训练前强制跑一遍这个校验避免训练到一半发现loss不降反升。3. 从零跑通YOLO训练环境配置、数据yaml与参数调优3.1 环境搭建与版本选择YOLO系列版本很多这份数据集规模不大用YOLOv8n或YOLOv8s就够。环境配置上Python 3.8到3.10都行PyTorch选1.13以上CUDA版本根据你的显卡驱动来。如果你用Anaconda创建一个独立环境避免和系统包冲突。conda create -n yolo_buluofen python3.9 conda activate yolo_buluofen pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118ultralytics包会自动安装YOLOv8所需的依赖。安装完成后用yolo checks命令验证环境它会输出PyTorch版本、CUDA是否可用、以及当前YOLO版本。如果CUDA不可用训练会回退到CPU速度会慢很多476张图在CPU上跑100轮可能要几个小时。3.2 数据集目录组织与yaml配置YOLO训练要求特定的目录结构。我一般这样组织buluofen_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml把476张jpg按8:2划分380张训练96张验证。对应的txt文件放到labels下同名子目录。划分时注意随机种子固定保证每次划分一致。然后写data.yamlpath: /absolute/path/to/buluofen_dataset train: images/train val: images/val nc: 1 names: [buluofen]nc是类别数names是类别名称列表。这里只有一个类别所以nc1。path写绝对路径避免相对路径解析出错。如果你的数据集里图片和标签在同一目录下YOLO也能自动匹配但分开存放更清晰。3.3 训练命令与关键参数含义启动训练的命令很简单yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsz640 batch16 lr00.01逐个参数说modelyolov8n.pt表示从预训练权重开始微调这对小数据集很重要能显著加快收敛。epochs100是训练轮数476张图跑100轮大概十几分钟到半小时取决于显卡。imgsz640是输入分辨率如果你的图片本身分辨率远大于640可以适当调大但显存占用也会增加。batch16是批次大小显存不够就降到8或4。lr00.01是初始学习率YOLOv8默认是0.01小数据集可以降到0.001避免过拟合。训练过程中关注几个指标box_loss和cls_loss应该持续下降mAP50在验证集上逐步上升。如果box_loss震荡不降可能是学习率太大或标注框有问题。如果mAP50很低但loss在降可能是验证集划分不合理或类别不平衡。3.4 推理测试与置信度门限调整训练完成后用best.pt做推理yolo detect predict modelruns/detect/train/weights/best.pt sourcetest_images saveTrue conf0.25conf0.25是置信度门限低于这个值的检测框会被过滤。对于药品检测场景漏检比误检更严重所以可以适当降低门限到0.15或0.2宁可多检几个假阳性也不要漏掉真药片。但门限太低会引入大量误检需要根据实际业务做权衡。我一般会跑几组不同conf值对比precision和recall曲线选一个F1分数最高的点。4. 避坑与排查标注、格式、训练中的五个血泪教训4.1 现象训练loss正常但mAP始终为0原因YOLO格式的class_id从0开始但有些转换脚本从1开始编号。这份数据集只有一个类别如果txt里写的是1而不是0YOLO会认为类别索引越界所有标注被忽略。解决打开任意一个txt文件确认第一列是0。如果是1用脚本批量减1。另外检查data.yaml里的nc是否和实际类别数一致nc1时class_id只能是0。4.2 现象图片尺寸和xml里的size不一致导致框偏移原因标注完成后图片被裁剪或缩放但xml里的size字段没有同步更新。YOLO格式的归一化坐标是基于xml里的size计算的如果实际图片尺寸变了框的位置就会偏移。解决用2.3节的校验脚本检查所有图片。如果发现不一致要么恢复原始图片尺寸要么用实际图片尺寸重新计算归一化坐标。我一般会在标注前统一图片尺寸避免后期返工。4.3 现象验证集mAP波动大每次训练结果差异明显原因476张图的数据集规模偏小如果验证集划分时没有固定随机种子每次训练用的验证集不同mAP自然波动。另外小数据集对batch size和学习率敏感参数稍微一变结果就差很多。解决固定随机种子划分数据集训练时设置deterministicTrue。如果波动仍然大可以用交叉验证把476张图分成5折每折轮流做验证集取平均mAP作为最终指标。4.4 现象推理时检测框重叠严重同一个药片被检出多次原因NMS的iou阈值设置过高导致重叠框没有被抑制。YOLO默认iou0.7对于密集排列的药片这个值可能偏大。解决推理时降低iou阈值到0.5或0.45让NMS更激进地合并重叠框。命令里加iou0.5即可。但iou太低也会导致相邻药片被误合并需要根据实际图片中药片的间距来调。4.5 现象训练到后期loss突然变成NaN原因学习率太大或数据中有异常标注框。比如某个框的width或height为0归一化后出现除零错误。或者某张图片的txt文件为空但图片存在YOLO读取时可能出错。解决先用校验脚本检查所有txt确保没有空文件、没有宽高为0的框。然后把学习率降到0.001加梯度裁剪clip_grad10.0。如果还有NaN检查图片是否有损坏用PIL打开所有图片验证完整性。5. 小样本下的进阶技巧数据增强、模型微调与部署前验证476张图在目标检测里属于小样本直接训练容易过拟合。我一般会开YOLO内置的数据增强包括mosaic、mixup、随机翻转、HSV抖动。mosaic把四张图拼成一张能显著增加背景多样性。mixup把两张图按透明度叠加对药品这种形状固定的目标效果不错。但要注意如果药片颜色是判断类别的关键特征HSV抖动幅度不要太大否则颜色失真会导致误检。模型微调方面可以冻结backbone的前几层只训练head部分。YOLOv8里用freeze10冻结前10层这样训练速度更快也能防止小数据集把预训练特征带偏。等head收敛后再解冻全部层做微调学习率降到0.0001。部署前验证有个容易被忽略的步骤用实际产线相机拍几张图不标注直接跑推理看检测框是否稳定。实验室图片和产线图片在光照、角度、背景上差异很大这一步能提前暴露域偏移问题。如果产线图片检测效果差可以用少量产线图片做微调或者调整推理时的图像预处理参数比如对比度增强、直方图均衡化。我自己的习惯是每次拿到新数据集先跑一遍2.3节的校验脚本再跑一遍5张图的推理可视化确认标注框和检测框能对上才正式启动训练。这个流程帮我省过好几次返工的时间。希望这份拆解能帮到你少走一些我踩过的弯路。本文还有配套的精品资源点击获取
返回列表