ARTICLE DETAIL

资讯详情

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

安检X光目标检测实战:YOLOv5数据集格式与训练避坑指南

安检X光目标检测实战:YOLOv5数据集格式与训练避坑指南 简介本资源是面向计算机视觉初学者与安防AI应用开发者的YOLOv5兼容目标检测数据集聚焦安检场景下X光图像中的违禁/常见物品识别任务。数据集涵盖剪刀、充电宝、手机等10类典型包内物品共3600张300–500分辨率RGB图像训练集2880张、验证集720张全部按YOLOv5标准目录结构组织含对应txt标签文件及类别索引txt字典开箱即用。压缩包总计2000个文件以1999个标注txt文件为主体辅以1个可视化脚本show.py——该脚本无需修改即可随机加载图像并绘制带类别标签的边界框便于快速验证数据质量与模型输入格式。资源大小为377.08MB结构规范、场景真实、标注严谨已获386人学习下载特别适合YOLO系列模型训练、安检AI原型开发及小样本目标检测教学实践。 做安检机X光场景下的包里物品目标检测最让人头疼的往往不是模型选型而是数据集本身。最近我正好在整理一个10类别的安检X光目标检测数据集目录结构就是标准的YOLOv5格式类目覆盖了日常包里常见的物品。这类数据比自然光下的目标检测数据难搞得多因为X光透视图像里物品层层叠加、互相遮挡形状和纹理都被“压扁”了。如果你正准备做安检场景的目标检测或者想拿一份现成数据跑通YOLOv5训练到部署的全流程这篇内容应该能帮你省不少时间。我先把话放前面数据集本身不会直接让你模型起飞但目录格式、标签格式、类别顺序这些“看起来不起眼”的细节决定了你后面是顺畅训练还是反复踩坑。这篇文章不只是介绍数据集结构我会把YOLOv5训练这套数据时要命的关键点、容易翻车的细节还有我实际踩过的坑全部拆开讲。1. 安检X光场景下的数据集到底特殊在哪1.1 为什么自然图像训练出来的模型在安检机上会翻车很多刚接触安检目标检测的工程师第一反应是拿COCO预训练模型直接上。我可以明确告诉你效果一定不行。原因很简单X光成像和自然光成像本质上是两码事。自然光下物体靠反射光呈现颜色和纹理边界清晰物体之间有空间遮挡关系。但安检机的X光图像是透视成像所有物体在投影方向上完全重叠你看到的不是物体的表面而是物体内部密度和原子序数的综合响应。瓶装液体是半透明的笔记本电脑边缘锐利但内部结构密集刀类工具在侧视角下可能只是一条细线。COCO预训练权重的特征提取器学到的是RGB纹理、自然边缘、阴影关系拿到透视图像上基本全部失效。所以做这个场景必须要用专门的数据集去微调或者重新训练。而一个10类别的安检X光目标检测数据集恰恰提供了这个场景的“先验分布”。它告诉模型包里的东西在透视视角下长什么样、常见摆放姿态有哪些、物品叠加后的视觉特征如何区分。这是通用数据集给不了的。1.2 10个类别的数据集平时该怎么理解标题里写的是“包里物品”没有详细列出10个类别具体是哪些这在目标检测数据集里非常常见——不同来源的数据集类别定义差异很大。我建议你拿到数据后第一件事不是急着训练而是先看分类逻辑是否合理。以安检X光场景为例合理的10类别通常长这样刀类工具、瓶装液体、笔记本电脑、手机、雨伞、充电宝、钥匙串、金属工具、喷雾罐、眼镜盒。你会发现这里面既有普通随身物品也有可能有安全隐患的疑物品这正是安检场景的典型构成——模型不仅要识别“这是什么”还要在复杂背景中把目标从一堆叠加物体里“揪”出来。类别太少模型没区分度类别太多标注成本和训练难度一起涨。10个类目对一篇文章、一个项目或者一次工程验证来说是平衡点。我实际的经验是收到任何数据集之后先统计每个类别的样本量和目标框数量分布。安检X光数据集几乎都有类别不平衡的问题比如手机、笔记本电脑这种常见物品样本多喷雾罐、刀类工具样本少。如果某个类别只有几百个框训练时大概率学不好后面我会讲怎么处理。2. YOLOv5目录格式逐层拆解一个目录都不能错2.1 目录结构和标签文件格式所谓“YOLOv5目录格式”指的不是YOLOv5算法本身而是这套训练工具链约定俗成的数据组织方式。它的核心是图片和标签分开存放、训练验证分开目录、缩放和类别都用纯文本标记。标准的目录结构长这样security_xray/ ├── data.yaml ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ ├── 0002.jpg │ │ └── ... │ └── val/ │ ├── 0501.jpg │ ├── 0502.jpg │ └── ... └── labels/ ├── train/ │ ├── 0001.txt │ ├── 0002.txt │ └── ... └── val/ ├── 0501.txt ├── 0502.txt └── ...图片和标签必须一一对应图片叫0001.jpg标签就叫0001.txt。YOLOv5在加载数据时是拿图片文件名去labels目录里找同名文件找不到也不会报错——只会把这张图当作无目标的背景样本跳过。任何一个标签txt文本里每一行代表一个目标框5个取值空格分隔class_id x_center y_center width height举个例子如果类别序号是2目标框中心点落在图片的(0.45, 0.32)框宽高分别为(0.20, 0.15)对应这一行就是2 0.45 0.32 0.20 0.15很多人第一次接触这个格式时容易忽略一个关键点x_center,y_center,width,height全部是归一化之后的比值取值范围在0到1之间而不是像素绝对坐标。YOLOv5在训练时读取标签会直接拿这些归一化值和特征图的每个格子做匹配如果你填的是像素坐标轻则训练不收敛重则batch直接报NaN错误。2.2 把普通标注转换成YOLOv5格式的换算过程如果你手里拿到的不是现成YOLOv5格式而是VOC的XML或者COCO的JSON标注就需要做一次坐标换算。这个换算在代码里只有几行但很多新人在这里翻车。假设你在标注工具里得到了某个目标框的左上角坐标(x_min, y_min)和右下角坐标(x_max, y_max)图片宽高为img_w, img_h转换公式如下x_center (x_min x_max) / 2 / img_w y_center (y_min y_max) / 2 / img_h box_w (x_max - x_min) / img_w box_h (y_max - y_min) / img_h这种格式的好处很明显图片缩放、裁切之后归一化坐标不需要重新计算。YOLOv5在训练时会做大量随机缩放、letterbox、mosaic增强归一化坐标让这些增强操作不必关心原始图像尺寸统一在0~1的坐标系里处理就可以了。我建议你把VOC/COCO数据转成YOLOv5格式时写一个独立的转换脚本然后第一时间抽查转换结果。最简单的办法是加载一张原始图片把txt里的坐标反算成像素坐标画框跟原标注对比。别嫌这一步麻烦坐标偏移半个像素对训练结果的影响不大但如果缩放因子写反了框会整体跑偏模型学到的全是错误位置。2.3 一个顺手的数据集自检脚本数据集是不是能直接用别等训练启动了才发现问题。我每次拿到新数据集第一件事就是跑一遍自检脚本。这个脚本做三件事第一检查每个txt的格式是否合法第二检查目标框坐标是否落在0~1范围内第三检查类别id是否小于总类别数。import os from PIL import Image def check_dataset(img_dir, label_dir, nc10): bad_count 0 for img_name in os.listdir(img_dir): stem os.path.splitext(img_name)[0] label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): print(f[缺失] {label_path}) bad_count 1 continue img_path os.path.join(img_dir, img_name) with Image.open(img_path) as im: w, h im.size with open(label_path, r) as f: for line_no, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: print(f[格式错误] {label_path}:{line_no}) bad_count 1 continue cls, cx, cy, bw, bh map(float, parts) if not (0 cls nc): print(f[类别越界] {label_path}:{line_no} cls{cls}) bad_count 1 if not (0 cx 1 and 0 cy 1 and 0 bw 1 and 0 bh 1): print(f[坐标越界] {label_path}:{line_no}) bad_count 1 print(f完成异常数量: {bad_count}) if __name__ __main__: check_dataset(security_xray/images/train, security_xray/labels/train)这份脚本不用写得很复杂能防住80%的低级错误就够了。实际项目里我见过太多人拿到数据集不看目录不看标签直接敲训练命令结果训练到一半发现loss不下降最后排查半天是标签格式错了——这种时间浪费完全没必要。3. 用这个数据集跑通YOLOv5训练3.1 环境准备和目录归置YOLOv5的训练环境搭建其实没什么玄学核心就是PyTorch那边要装对。我个人建议用conda单独开一个环境python版本3.8到3.10之间都行PyTorch按你本机CUDA版本装。然后是克隆YOLOv5仓库、安装依赖git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt如果本机显卡显存不够也可以用CPU训练但安检X光图像普遍分辨率不低我建议还是至少搞一块8G以上显存的GPU不然batch size上不去训练时间会拉得很难受。把数据集目录放好之后需要写一个data.yaml配置文件YOLOv5靠它找到训练集和验证集。文件内容大概是这样# 建议用绝对路径相对路径在换机器时容易踩坑 train: /home/yourname/datasets/security_xray/images/train val: /home/yourname/datasets/security_xray/images/val nc: 10 names: 0: knife_tool 1: liquid_bottle 2: laptop 3: phone 4: umbrella 5: power_bank 6: keys 7: metal_tool 8: spray_can 9: glasses_case这里我提醒一句names的顺序必须和txt标签里的class_id严格对应class_id0对应names[0]以此类推。如果顺序对不上模型训练出来之后你检测到的“笔记本”实际上可能是一个手机框——这类错误不会体现在mAP指标上因为验证集也是同样错位的但实际部署时就会闹笑话。所以拿到数据集后一定要看一眼该数据集自带的类别顺序描述别自己臆测。3.2 训练命令和关键参数怎么选YOLOv5训练命令本身不复杂复杂的是参数怎么选。我以这份10类别的安检X光数据集为例给一套比较稳妥的启动命令python train.py \ --img 640 \ --batch 16 \ --epochs 300 \ --data security_xray.yaml \ --weights yolov5s.pt \ --cache这几个参数我逐个说。--img是输入分辨率默认640。安检X光场景下很多目标在整图里占比不大比如一把折叠刀在一个装得满满当当的背包里可能就占几十个像素。如果你显存够、能接受更慢的训练速度可以考虑升到1280对小目标检测有明显提升。不建议直接降到320会丢太多细节。--batch受显存限制如果训练时报CUDA out of memory就减半。16在常见场景下是个起步值不要为了追求大 batch 而把分辨率降得过低得不偿失。--epochs很多人喜欢设300甚至500但YOLOv5自带早停机制模型在验证集上长期不提升就会自动停止。我的经验是安检X光这种特征相对固定的场景配合数据增强一般在100~200个epoch之内就能看到mAP收敛。--weights yolov5s.pt是预训练权重。你可能会问前面不是说COCO预训练模型在X光图像上效果不行吗这里不是让你直接用预训练模型做推理而是把它作为训练的“初始化起点”。预训练骨干网络提取的基础边缘、形状特征还是有用的从头训练反而不容易收敛。如果你要追求更高精度可以换yolov5m.pt或yolov5l.pt但显存占用和训练时间都会涨一截。--cache参数会在第一次加载数据时把图片缓存到内存里前几次epoch会慢一点但后面能省大量磁盘IO时间。如果你的内存小于16G这个参数要慎用。3.3 训练过程中的观察点训练起来之后别光盯着终端里滚动的loss看起码要关注三个东西loss曲线、验证集指标、可视化预测图。YOLOv5训练时会在runs/train/exp/目录下生成日志跑tensorboard --logdir runs/train就能看到训练曲线。你要关注的不是loss前期多高而是它有没有持续下降、有没有剧烈震荡、是不是在某个点开始回弹。如果loss在前20个epoch内完全不动大概率是超参数或数据格式出了问题赶紧停下来排查别盲目加epoch。靠训练集loss判断模型好坏是不够的要看验证集上的mAP0.5。YOLOv5训练过程中每10个epoch会在验证集上测一次指标训练结束时会保留best.pt即验证集上指标最好的权重。如果你的训练过程中best.pt一直没有更新说明模型根本没有在验证集上持续变好要么数据分布有问题要么学习率设置不合理。还有一个实用习惯去看一眼验证集的可视化预测图。YOLOv5会在每个验证epoch结束时把带预测框的图片保存下来这些图片会直接告诉你模型是不是“学偏了”——比如把雨伞识别成了刀类工具或者重叠物体只检出其中一个。这些信息是mAP指标给不了的我几乎每次训练都会翻一遍。4. 评估、导出和部署模型不能只停在runs目录里4.1 用val.py做一次完整的指标体检训练结束后第一件事就是跑一次完整的验证拿到所有类别的详细指标python val.py \ --data security_xray.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640运行完会输出一张表包含每个类别的Precision、Recall、mAP0.5、mAP0.5:0.95。这张表是判断模型能不能上线的核心依据。我一直强调一个小技巧不要只看总的mAP要逐类看。总的mAP高不代表每个类别都好。比如整体mAP0.5到了0.85但某个样本少的类别Recall只有0.4那这个模型在真实场景里就会漏检。对于安检场景来说漏检一个目标比误检一个目标严重得多所以如果某个类别Recall偏低优先想的是怎么提升召回而不是整体mAP。另外mAP0.5:0.95这个指标在X光场景下经常比自然图像场景低不少原因是X光图片目标边缘模糊、类别间视觉差异小IoU一拉高匹配就变困难。我的经验是只要mAP0.5足够高模型的基本能力就是有的但如果想在更严格的IoU阈值下也表现好可能需要更高分辨率输入或者对验证集的标注精度做一次校验。4.2 导出ONNX和部署时的注意事项训练完模型只活在PyTorch里是没用的工程项目最终要把模型导出再部署到目标设备上。YOLOv5导出ONNX非常简单python export.py \ --weights runs/train/exp/weights/best.pt \ --include onnx \ --img 640导出之后你可以用onnxruntime或者TensorRT在目标平台跑推理。但这里有个特别容易被忽略的点部署阶段的预处理必须和训练阶段一致。YOLOv5训练时图像会被letterbox缩放到640x640长边被缩放到640短边填充成灰色。在推理代码里你也必须做完全一样的letterbox操作否则同一个目标在训练和推理时位置分布都不一样检测精度会掉得莫名其妙。NMS阈值和置信度阈值的设置也要注意X光场景下目标叠加严重置信度阈值设低了会出现大量误检设高了又漏检。一般先从0.25试起再根据实际误检和漏检情况调整。如果你要部署到边缘设备比如RK3568这类板子还要注意ONNX导出时模型结构算子是否被设备端NPU支持。YOLOv5的检测头里有些算子可能在板端跑不通需要做算子替换或自定义插件这个就不展开细说了但最好提前确认你目标平台的推理框架对YOLOv5模型结构的兼容性。5. 常见问题与避坑指南5.1 我踩过的那些格式坑做目标检测这几年我吃过的亏基本都集中在数据准备阶段。有些坑你网上搜不到只有自己踩一遍才会长记性。第一个坑类别id和names顺序错位。我接手过一个数据标注txt文件里的类别顺序是按“疑似物品优先”排列的但我没细看直接套用了默认的类别顺序。结果训练出来所有目标类别都偏了一位检测结果张冠李戴排查了很久才发现是names顺序对不上。所以拿到数据集一定先看类别说明文件然后抽几张家标签手动对照。第二个坑标注框超出图片边界。YOLOv5训练时标注框稍微越界一点不会报错但如果越界严重会在mosaic或者random affine增强时产生异常严重时会导致训练直接NaN。自检脚本里一定要检查框是否在0~1范围内越界的框要么裁剪要么剔除。第三个坑灰度图直接喂给模型。很多X光图片是灰度图但YOLOv5的模型输入是3通道。如果你不处理数据加载时可能会报通道不匹配或者被隐式复制扩展成3通道。我建议统一在预处理里把灰度图转成3通道最简单的方式就是用np.repeat把灰度值复制三次不要保留单通道不然可能绊在后面的模型结构上。我在下面整理了一份速查表可以直接当排查手册用。问题现象常见原因解决办法训练一开始loss就是NaN标签格式错误、坐标未归一化、学习率过大跑自检脚本确认坐标在0~1降低学习率loss不下降标签和图片不对应、类别顺序错乱检查同名文件是否一一对应核对类别顺序mAP很高但可视化效果差训练验证集划分有重叠重新划分数据集确保训练验证完全不重叠某个类别完全检不出来该类别样本太少、标注框太小增加该类样本考虑数据增强或过采样batch训练到一半OOM输入分辨率过大或batch过大降低batch或img开启cache推理结果偏移严重部署时预处理与训练不一致统一letterbox和resize逻辑5.2 安检X光场景特有的训练经验除了通用格式坑安检X光场景还有几个比较独特的经验这是我在普通目标检测项目里不怎么遇到的。第一mosaic数据增强要慎用。YOLOv5默认开启mosaic增强会把4张图拼在一起喂给模型。在自然图像上这个增强能显著提升鲁棒性但在X光数据上物体本身已经高度叠加再拼4张图目标之间的遮挡关系就更复杂了反而可能让模型学到“模糊一团”的错误特征。我试过把mosaic概率从默认降到0.3验证集mAP反而提升了2个百分点以上。你可以在YOLOv5的data/hyps里调整超参数比如mosaic: 0.3。第二灰度图转3通道之后颜色信息其实没有变化所以YOLOv5里那些依赖颜色区分的预处理意义不大。如果你发现模型对某些物体漏检不要折腾颜色增强而是增加更多不同角度、不同摆放方式的样本或者提高输入分辨率。这个思路比调增强参数更容易见效。第三类别不平衡在安检场景特别突出。常见做法是给样本少的类别加一个类别权重YOLOv5里可以用--cls参数或者调整超参数cls_pw。但更有效的办法是去补充真实的困难样本——多收集一些不同材质、不同密度的同类物品在不同遮挡程度下的X光图像。数据永远是这种场景的护城河模型结构反而不是瓶颈。最后再说一点实际体会拿到一份安检机X光包内物品的目标检测数据集技术栈其实没有多高深YOLOv5训练流程跑通也就一天时间。这个项目真正考研人的地方是在数据集质量把控和场景细节理解上格式对不对、类别对不对、灰度图怎么处理、目标严重叠加时怎么调参数、类别不平衡怎么补数据。我自己在实际操作中体会到这类场景80%的效果提升都来自数据层面的打磨模型结构的收益反而很小。所以如果你要用这份10类别的YOLOv5目录格式数据集把它当“原材料”而不是“成品”。先花点时间验证格式、梳理类别、统计分布再动手训练你会在后面省下成倍的时间。至少我现在拿到任何数据集第一动作永远是跑自检脚本这个习惯帮我避开了无数次深夜调bug。本文还有配套的精品资源点击获取
返回列表