尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

YOLO目标检测X光安检数据集:三种标签格式与实战训练全解析

发布时间:2026/9/28 16:10:16

资讯中心
01
ARTICLE

YOLO目标检测X光安检数据集:三种标签格式与实战训练全解析

YOLO目标检测X光安检数据集:三种标签格式与实战训练全解析
简介面向YOLO目标检测研究者和安检场景开发者X光安检数据集内含1000张真实场景图片涵盖多种安检成像条件下的违禁品目标借助LabelImg完成高质量标注并同时输出VOCxml、COCOjson和YOLOtxt三种格式标签可直接接入YOLO系列训练流程免去格式转换烦恼。资源共2000个文件包括1000个xml标签、990个txt标签、6个HTML教程、3个Python划分脚本和1个yaml配置文件压缩包整体约105.65MB目录按标签格式与脚本用途分装便于检索。随包附赠YOLO环境搭建Windows/Linux与训练案例教程以及训练集、验证集、测试集划分脚本用户可根据需求一键拆分数据并配合教程完成从数据准备到模型部署的完整流程。目前已有254人学习浏览适合目标检测入门者、安检算法研发人员及课程实训使用可大幅压缩数据准备与模型调试时间。1. YOLO目标检测X光安检数据集一套带三格式标签的真实场景资源做目标检测的人大概都有同感公开数据集不缺缺的是“能直接拿来训练自己业务模型”的行业数据。这套YOLO目标检测X光安检数据集恰好补的是安检这个细分方向——1000张真实X光安检图片用labelimg人工标注同时给出VOCxml、COCOjson、YOLOtxt三种格式标签外加三个数据集划分脚本和Linux/Windows双平台的YOLO环境搭建与训练教程。对正在做安检违禁品识别、行李扫描分类、或者工业X光检测的工程师来说它省掉的不是下载时间而是从找图、清洗、标注到格式转换这一整条数据准备链。新手可以用它跑通YOLOv5/v8全流程熟手则可以拿它当基准数据测试不同模型结构在遮挡多、背景杂乱这类X光场景下的真实表现。2. 标签格式是门面VOC、COCO、YOLO三种格式到底差在哪拿到数据集第一步不是急着训练而是搞清楚三个文件夹里的标签分别是什么结构、字段怎么对应。很多人在这一步翻车——用YOLO格式的txt直接套COCO的json解析逻辑或者反过来导致类别数对不上、坐标全乱。下面把这三种格式逐一拆开看。2.1 VOC的xml结构anchor框的坐标是绝对值VOC格式的标签是xml文件每个图片对应一个同名xml。核心结构是annotation标签下的object节点一个object代表一个标注目标里面包含name和bndbox。bndbox里四个值xmin、ymin、xmax、ymax是像素绝对值注意这里的坐标系原点在图片左上角x向右增大y向下增大。labelimg导出xml时就是这么存的。打开数据集里任意一个xml文件基本长这样annotation folderimages/folder filename0001.jpg/filename size width640/width height640/height depth3/depth /size object namegun/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin120/xmin ymin340/ymin xmax280/xmax ymax420/ymax /bndbox /object /annotationsize节点下的width和height很重要后续转YOLO格式的归一化坐标要靠它做分母。object节点可以重复出现同一张图上有几个目标就有几个object块。truncated和difficult字段在训练时一般不参与计算但转格式时最好保留避免信息丢失。2.2 COCO的jsoncategories和annotations通过id关联COCO格式是单个json文件集中描述所有图片的标注不像VOC那样每张图一个xml。这个数据集里的coco标签用的是标准COCO结构images数组存图片id、文件名、宽高categories数组定义类别名称和idannotations数组存每个目标的bbox、area、category_id。bbox的四个值是[x, y, width, height]同样基于像素绝对值但x、y是框左上角坐标width和height是框的宽高。用python读json时最常见的操作是建立category_id到类别名的映射然后遍历annotations把bbox取出来画框验证。一个容易被忽略的点是COCO里area字段——有些工具会用它过滤小目标但如果你直接用这个数据集训练area对YOLO系模型没有实际作用不用管它。反过来如果你要用mmdetection这类支持COCO评测的框架category_id必须从1开始连续编号0一般留给背景类这个数据集里已经按这个规则排好了不用再改。2.3 YOLO的txt归一化坐标直接喂给训练器YOLO格式的标签是txt文件每行一个目标五个字段依次是class_id、x_center、y_center、width、height。前两个是归一化后的中心点坐标后两个是归一化后的框宽高换算公式是x_center (xmin xmax) / 2 / img_width。这个格式是YOLO系模型v5/v6/v8等直接读取的data.yaml里配好nc和names训练器就能直接用不需要额外转换。# 打开任意一个yolo标签看内容0代表第一类比如gun 0 0.3125 0.59375 0.25 0.125一行五列空格分隔。这个数据集里的txt标签已经把归一化做好了直接用就行。需要注意class_id是从0开始计数的而前面COCO格式里category_id从1开始两个格式之间差1很多人转换时报类别数错误就是没意识到这个偏移。3. 把三种格式对齐到自己要的训练框架选择与转换拿到三种格式标签理论上想用哪个用哪个但实际训练时格式选择基本由框架决定。YOLOv5和YOLOv8官方仓库默认吃txt格式mmdetection、detectron2这类框架原生支持COCO格式VOC格式则常见于老一点的项目或者需要做PASCAL VOC评测对比的场景。所以落地时格式转换不是可选项而是必经步骤。# xml标签转yolo格式的核心代码示例 import xml.etree.ElementTree as ET def convert_xml_to_yolo(xml_file, out_file, class_map): tree ET.parse(xml_file) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) with open(out_file, w) as f: for obj in root.iter(object): cls obj.find(name).text if cls not in class_map: continue # 跳过未映射的类 cls_id class_map[cls] box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n) class_map {gun: 0, knife: 1} # 按数据集实际类别改转换逻辑其实很简单核心陷阱在两个地方一是cls的映射表必须和data.yaml里的names顺序严格一致否则类别错位训练出来的一切指标都是假的二是边界框坐标做除法前先确认img_w和img_h取的是原图尺寸有些xml里size节点缺失时得从图片本身读别用零值除。转换完不要急着训用openCV在图片上把框画出来检查一遍。COCO json转YOLO txt的思路稍有不同因为json里坐标是[x, y, width, height]转归一化时需要把中心点算回来x_center x width/2y_center y height/2再分别除以图片宽高。这个数据集里coco标签的filename字段直接对应图片文件名处理时按文件名匹配就行不用管images数组里的id。转换完成后我一般会做三项校验。第一随机抽20张图画出标注框看位置是否贴合目标第二统计每个类别有多少目标确认没有类别数缺失第三用脚本检查有没有越界框、空标签文件、尺寸维度不匹配的文件这些不处理干净训练时轻则Loss异常重则直接崩。4. 划分脚本实操train/val/test七三开还是八二开数据集自带三个划分脚本这在实际项目中比想象中重要。安检数据往往按场景采集如果划分时不注意同一场景的多张图可能同时进训练集和验证集导致验证指标虚高。这三个脚本的用途和适用场景不一样逐个说清楚。4.1 三个划分脚本各自解决什么问题第一个是“训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py”它把图片和对应标签按比例复制到三个新文件夹里适合训练前一次性准备好目录结构。第二个是“训练集、验证集划分脚本图片标签划分写入新文件夹.py”只分训练和验证不保留测试集适合你在做实验阶段不需要最终评测的情况。第三个是split_train_val生成ImageSets下txt文件划分脚本.py它不复制物理文件只生成txt列表文件这是VOC风格训练流程里常见的数据组织方式YOLO早期版本也支持这种路径列表读取方式。# 官方教程里的典型步骤先跑divider脚本再检查目录结构 python divide_train_val_test.py --train_ratio 0.7 --val_ratio 0.2 --test_ratio 0.1 tree datasets/三个比例加起来必须是1脚本会按随机种子打乱图片顺序再按比例切分。4.2 split_train_val如何生成ImageSets下的txt这个脚本面向的是需要ImageSets/main目录结构的训练流程。它读取全部图片名打乱后按指定比例分成train.txt和val.txt每行一个不带扩展名的图片名前缀。文件写入ImageSets/main目录下而实际图片和标签文件不动。这么做的好处是同一份数据可以生成多组划分方便做多次实验评测均值坏处是训练时要保证图片路径能被正确解析。python split_train_val.py --img_path ./images --txt_path ./ImageSets/main --val_percent 0.2跑完后打开train.txt检查一下内容应该类似“0001\n0003\n0005”每行一个文件名。训练框架里的train参数指向这个txt的路径时注意框架内部还会再拼接图片目录路径两个路径要能正确组合出最终文件位置不然报“找不到图片”。我第一次用这类脚本时就栽在这data.yaml里给的train路径指向了ImageSets/main/train.txt但框架默认图片根目录是datasets/images最终拼出来的路径不对训练一启动就报错。4.3 自定义比例划分并写入新文件夹用第一个脚本时有个细节它只复制图片和标签文件不复制你训练时可能用到的其他附属文件。数据集里图片和标签都在各自目录下脚本会按文件名前缀匹配复制。修改比例时要确认三个比例之和为1另外注意随机种子需要固定下来。# 自定义比例的实现思路参考 import os, random, shutil def split_dataset(img_dir, label_dir, save_dir, ratios(0.8, 0.1, 0.1), seed42): imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.seed(seed) random.shuffle(imgs) n_train int(len(imgs) * ratios[0]) n_val int(len(imgs) * ratios[1]) # 按索引切片分配图片同时复制同名标签 for split_name, split_imgs in zip([train, val, test], [imgs[:n_train], imgs[n_train:n_trainn_val], imgs[n_trainn_val:]]): os.makedirs(os.path.join(save_dir, split_name, images), exist_okTrue) os.makedirs(os.path.join(save_dir, split_name, labels), exist_okTrue) for img in split_imgs: shutil.copy(os.path.join(img_dir, img), os.path.join(save_dir, split_name, images, img)) label img.replace(.jpg, .txt) shutil.copy(os.path.join(label_dir, label), os.path.join(save_dir, split_name, labels, label))这个示例代码逻辑简单但够用核心是随机打乱后按比例切片再按同名规则复制标签。如果你把seed固定别人复现你的实验时数据划分完全一致训练结果才有可比性。注意labelimg标注的图片可能有.jpg和.png混用的情况代码里要兼容建议直接用文件主名匹配而非硬编码.jpg后缀。5. 环境搭建与训练避坑从Ubuntu到Windows的六条血泪记录数据集附带的四个教程HTML页面覆盖了Linux和Windows两个平台的环境搭建与训练流程这正好对应了YOLO训练的两种主流环境选择。Linux下训练效率高Windows下调试方便但两边踩的坑不完全一样。这里把教程里涉及的关键步骤和实际训练中常见的问题汇总成六条实操记录。5.1 环境搭建看两件事CUDA版本和torch版本教程里Ubuntu环境安装和Windows环境搭建是分开讲的但核心其实就两件事显卡驱动/CUDA版本和PyTorch版本要匹配。常见做法是先确认显卡驱动的CUDA版本再装对应的PyTorch。用nvidia-smi看驱动支持的CUDA版本用python -c import torch; print(torch.version, torch.cuda.is_available())验证PyTorch是否真的能用GPU。很多人装了PyTorch但没装CUDA版导致训练时用的是CPU速度慢到怀疑人生。# Linux下验证环境的核心命令 nvidia-smi # 查看驱动版本与支持的CUDA版本 python -c import torch; print(torch.cuda.is_available()) # True才代表GPU可用 pip install ultralytics # YOLOv8官方的安装方式Windows下安装时教程里给出的做法是先装Visual Studio的C Build Tools再安装对应CUDA和cuDNN最后pip安装PyTorch。这一步不要跳过C Build Tools否则后续某些依赖包编译会报错。最容易翻车的是torch版本装成cpu版——PyTorch官网默认给Linux的是CUDA版但Windows下用pip install torch默认装的是CPU版除非你在官网选了CUDA版本再用对应的wheel链接。5.2 训练自己的数据集改data.yaml和模型参数就够了教程里明确写了“根据案例修改训练自己的数据集”这一步落到实操上就是三件事改data.yaml里的path、train、val和nc、names然后选预训练权重最后调batch-size和epochs。data.yaml是YOLO训练的数据入口里面的names列表顺序必须和标签txt里的class_id严格对应这一点在格式转换章节强调过但实际操作时还是经常错——尤其当数据集里类别数超过10个时漏写一个类别或者顺序错位训练出来mAP会忽高忽低。train: datasets/train/images val: datasets/val/images nc: 2 names: [gun, knife]训练命令本身不复杂真正值得调的是模型大小。1000张图属于中小规模数据集用yolov8n或yolov8s就够了没必要上yolov8l或x——数据量不够时大模型不仅速度慢过拟合还更严重。batch-size根据显存来定6G显存跑yolov8n用batch-size 16一般没问题训练时如果报OOM就把batch减半或把图片尺寸从640降到512。5.3 避坑记录标注质量、路径乱码、显存炸、过拟合以下踩坑记录是训练过程中最常遇到的问题按“现象 → 原因 → 解决”列出踩坑一训练时Loss为nanloss曲线断崖式下跌后变nan。现象前几个epoch Loss正常到中间某个epoch突然变nan。原因学习率过大导致梯度爆炸或数据里有异常标注框如宽高为0。解决先降学习率默认值0.01到0.001再用清洗脚本排查标注文件里有没有宽度或高度小于等于0的框有则删除对应行或重新标注。踩坑二验证集mAP很高但实际测试效果很差。现象val mAP达到0.95拿没见过的X光图测试时频繁漏检。原因数据划分不均匀同一批X光场景图同时进了训练和验证集模型记住的是场景特征而非目标特征。解决用带固定随机种子的划分脚本重新划分确保来自同一场景的图片不会跨集合出现。踩坑三Windows下训练时路径中带中文导致读取失败。现象报FileNotFoundError但实际上文件存在。原因Windows系统编码问题中文路径下OpenCV或PyTorch读取失败。解决数据集全路径改用纯英文杜绝中文字符。踩坑四显存充足但训练中途OOM。现象前几十步正常中途报CUDA out of memory。原因验证阶段同时加载大量图片到显存或accumulate梯度累计导致显存峰值升高。解决调小batch-size同时把workers调低减少内存/显存缓存压力。踩坑五训练轮次很多但验证集指标不升反降。现象epoch 50之后val mAP开始下降纯训练Loss还在降。原因典型过拟合数据量小且模型容量大。解决换更小的模型如从yolov8s换yolov8n增加数据增强参数或提前停止早停在指标下降时终止。踩坑六标签txt里出现class_id超出nc范围。现象训练时报IndexError或类别嵌入错误。原因格式转换或标注过程产生了错误类别编号。解决写个脚本扫描所有txt检查每行的第一个数字是否在0到nc-1之间超界则输出文件名和行号。6. 验证模型不是看mAP可视化推理与bad case分析技巧训练完模型官方验证脚本输出的mAP数值只是一个基准参考真正判断能不能用必须拿新图做可视化推理再逐个分析bad case。这一步很多人跳过导致模型上线后在实际X光图上表现远低于预期。我的一般做法是写一个批量推理脚本把测试集图片全部跑一遍带标注框输出到文件夹里。from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) # conf和iou是关键参数conf太低会出大量误检太高会漏检 results model.predict(sourcedatasets/test/images/, conf0.25, iou0.5, saveTrue)跑完看三件事。第一误检类型——X光场景里背景杂乱模型容易把叠在一起的物品轮廓当成危险物这时候优先加难负样本而不是调阈值。第二遮挡情况——行李箱里多个目标叠放时小目标可能完全被大目标盖住检测不到是正常物理遮挡标注时这部分目标本身也可能漏标了。第三不同成像角度的稳定性——同一种物品在不同摆放角度下检测框是否稳定如果某个角度频繁漏检要考虑训练数据里该角度图片是否不足。分析完bad case再回头补数据、调阈值、改数据增强比盲目调网络结构有效得多。从那以后我每次训练完都会强制走一遍“可视化推理 bad case归类 针对性补样本”这套流程哪怕mAP数值再好看也要过这一关才敢说模型能用。这套数据集的1000张图片虽然不算多但配合三种格式标签和划分脚本足够你完整跑通YOLO目标检测从数据准备到训练评测再到问题分析的全链路。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。