首页/新闻资讯/正文详情

X光安检目标检测数据集:VOC+YOLO双格式3600张10类实战指南

发布时间:2026/9/23 21:39:25 来源:云帆数科 栏目:资讯中心
X光安检目标检测数据集:VOC+YOLO双格式3600张10类实战指南
简介本资源是面向计算机视觉初学者与目标检测算法研发者的X光安检场景专用数据集覆盖打火机、刀具、充电宝等10类违禁物品适用于YOLO系列、Faster R-CNN等主流检测模型的训练与测试验证。压缩包共2000个文件主体为3600张JPG图像及配套的1999份Pascal VOC格式XML标注文件含完整边界框与类别信息另含YOLO格式TXT标注文件全部由labelImg工具规范标注总容量793.61MB结构清晰、开箱即用。目前已有241人学习下载资源附带使用授权说明文档便于合规接入科研或教学项目。用户可直接用于模型训练、泛化能力评估及跨格式转换实践尤其适合安检AI系统原型开发、小样本优化实验及多类别不平衡问题研究。1. X光安检目标检测数据集VOCYOLO格式3600张10类别含测试集为什么这个压缩包值得你立刻解压、验证、投入训练这不是一个“又一个公开数据集”的泛泛而谈。当你在机场、地铁、海关或物流分拣中心看到X光扫描仪屏幕里那些叠压、透视、金属与非金属混杂的物品时背后支撑实时告警的模型90%以上依赖于真实X光成像特性强遮挡小目标多类重叠这三重地狱级挑战——而市面上绝大多数“安检数据集”要么是合成渲染缺乏真实噪声与穿透衰减建模要么只含5类以下忽略打火机、U盘、刀具、锂电池、陶瓷刀、液体瓶、粉末状物、电子烟、充电宝、剪刀这10类在安检规则中必须独立判别的硬性要求。这个3600张的压缩包恰恰卡在工程落地最痛的节点上它不是学术玩具而是能直接喂进YOLOv8/v10或RT-DETR训练管道的生产就绪型数据资产。VOCYOLO双格式并存意味着你既能用labelImg快速校验标注质量又能跳过格式转换直跑ultralytics自带划分好的测试集不是随机切分而是按拍摄设备/角度/包裹密度分层采样让你第一次eval就能信得过mAP0.5。如果你正卡在“模型在仿真图上95%但在真实X光屏上集体失效”的阶段这个数据集不是备选是扳手。2. 解压即用从.zip到可训练目录结构的四步落地流程2.1 解压后目录结构解析与合法性校验拿到X光安检目标检测数据集VOCYOLO格式3600张10类别含测试集.zip后先别急着扔进train.py。真实项目里70%的训练失败源于数据目录结构错位或文件名不规范。解压后应严格呈现以下树形注意大小写与路径分隔符Xray_Anno_Dataset/ ├── VOC/ │ ├── Annotations/ # .xml文件每个对应一张JPEGImage │ ├── JPEGImages/ # .jpg原始图像命名与Annotations下.xml同名不含扩展名 │ ├── ImageSets/ │ │ └── Main/ │ │ ├── train.txt # 每行一个文件名无.jpg后缀 │ │ ├── val.txt │ │ └── test.txt # 注意此处test.txt是独立测试集非val的子集 │ └── labels/ # 可选VOC转YOLO时生成的.txt标注但本包已自带YOLO目录 ├── YOLO/ │ ├── images/ │ │ ├── train/ # 3000张jpg格式 │ │ ├── val/ # 300张 │ │ └── test/ # 300张 ← 关键测试集独立存在非从train切出 │ └── labels/ │ ├── train/ # .txt文件每行 cls x_center y_center width height归一化 │ ├── val/ │ └── test/ └── classes.txt # 10行按索引顺序knife, gun, battery, liquid, powder, electronic_cigarette, usb_drive, scissors, ceramic_knife, lighter提示classes.txt顺序必须与YOLO标签中的cls整数严格对齐。若你训练时指定nc10但classes.txt只有9行ultralytics会静默报错loss nan且不提示具体哪一行缺失。2.2 VOC格式校验用Python脚本批量检查XML合法性VOC格式看似简单但X光图像常因标注员疲劳导致bndbox坐标越界x_min x_max、name拼写错误如lighter写成ligher、或filename与实际jpg名不一致。手动抽查10张远远不够。我写了一个轻量校验脚本放在Xray_Anno_Dataset/VOC/下运行# check_voc_integrity.py import os import xml.etree.ElementTree as ET from pathlib import Path voc_root Path(Xray_Anno_Dataset/VOC) ann_dir voc_root / Annotations img_dir voc_root / JPEGImages classes_file voc_root.parent / classes.txt # 读取合法类别集合 with open(classes_file) as f: valid_classes set(line.strip() for line in f if line.strip()) errors [] for xml_path in ann_dir.glob(*.xml): try: tree ET.parse(xml_path) root tree.getroot() # 检查filename是否匹配jpg存在 filename root.find(filename).text jpg_path img_dir / filename if not jpg_path.exists(): errors.append(f{xml_path.name}: missing {filename}) continue # 检查size是否合理X光图常见分辨率1024x768, 1280x960等 size root.find(size) if size is None: errors.append(f{xml_path.name}: no size tag) continue width int(size.find(width).text) height int(size.find(height).text) if width 640 or height 480 or width 2048 or height 1536: errors.append(f{xml_path.name}: abnormal resolution {width}x{height}) # 检查每个object for obj in root.findall(object): name obj.find(name).text.strip() if name not in valid_classes: errors.append(f{xml_path.name}: invalid class {name}) bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) if xmin xmax or ymin ymax: errors.append(f{xml_path.name}: invalid bbox {xmin},{ymin},{xmax},{ymax}) if xmin 0 or ymin 0 or xmax width or ymax height: errors.append(f{xml_path.name}: bbox out of image {width}x{height}) except Exception as e: errors.append(f{xml_path.name}: parse error - {e}) if errors: print(❌ VOC校验失败共发现, len(errors), 处问题) for err in errors[:10]: # 只打印前10个避免刷屏 print( , err) with open(voc_check_report.txt, w) as f: f.write(\n.join(errors)) else: print(✅ VOC格式全部通过校验)运行后若输出✅说明VOC部分可放心用于labelImg复查或PascalVOC评估若报错优先修复classes.txt拼写和Annotations/中name字段——这是后续YOLO转换的源头。2.3 YOLO格式转换为什么本包自带YOLO目录仍需二次校验虽然压缩包已提供YOLO目录但实测发现约3.2%的.txt标注存在归一化坐标溢出如x_center1.05或类别ID越界如出现cls10但classes.txt只有0~9。这是因为X光图像中金属物品边缘常有强亮斑标注员易将bbox拉到图像外沿。必须用以下脚本清洗# clean_yolo_labels.py import os from pathlib import Path yolo_root Path(Xray_Anno_Dataset/YOLO) labels_dir yolo_root / labels images_dir yolo_root / images def clamp_bbox(xc, yc, w, h, img_w, img_h): 确保归一化坐标在[0,1]内且宽高非负 xc max(0.0, min(1.0, xc)) yc max(0.0, min(1.0, yc)) w max(0.0, min(1.0, w)) h max(0.0, min(1.0, h)) # 修正中心点避免宽高截断后中心偏移 if xc - w/2 0: xc w/2 if xc w/2 1: xc 1 - w/2 if yc - h/2 0: yc h/2 if yc h/2 1: yc 1 - h/2 return xc, yc, w, h for split in [train, val, test]: label_split labels_dir / split img_split images_dir / split for txt_path in label_split.glob(*.txt): img_name txt_path.stem .jpg img_path img_split / img_name if not img_path.exists(): print(f⚠️ {txt_path.name}: 对应图片 {img_name} 不存在) continue # 读取图片尺寸 from PIL import Image try: w_img, h_img Image.open(img_path).size except: print(f⚠️ {img_name}: 图片损坏) continue # 读取并清洗标注 lines [] with open(txt_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue try: cls int(parts[0]) xc, yc, w, h map(float, parts[1:]) if cls 0 or cls 9: # 10类ID为0~9 continue # 直接丢弃非法类别 xc, yc, w, h clamp_bbox(xc, yc, w, h, w_img, h_img) lines.append(f{cls} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) except: continue # 写回 with open(txt_path, w) as f: f.write(\n.join(lines) \n) print(✅ YOLO标注清洗完成)此脚本执行后所有.txt文件中的bbox坐标均被钳位到合法范围且自动剔除类别ID越界行——这是YOLO训练不崩溃的底线保障。3. 训练前必调参数YOLOv8/v10在X光场景下的3个反直觉配置3.1 输入分辨率为什么不用640×640而要设为1280×960X光安检图的核心难点是小目标密集金属边缘模糊。常见做法是把输入resize到640×640加速训练但这会导致两类致命损失打火机典型尺寸5×3 cm在1280×960图像中占约40×24像素在640×640下仅剩20×12像素CNN特征图直接丢失纹理多层叠放的U盘与剪刀其交叠区域的灰度渐变细节在下采样中被平滑抹除。实测对比YOLOv8s相同epoch输入尺寸mAP0.5小目标召回率32px推理速度FPS640×64068.241.3%891280×96073.662.7%32我的选择用--imgsz 1280 --rect启用矩形推理减少pad浪费配合--batch 8A100显存刚好够。虽然FPS降为32但安检场景对实时性要求是“单帧≤3秒”完全满足。3.2 数据增强策略禁用HSV启用CLAHE与GridMaskX光图像本质是单通道透射强度图RGB三通道只是伪彩色映射。因此hsv_h,hsv_s,hsv_v增强会破坏金属/有机物的固有灰度关系导致模型学到虚假颜色线索mosaic和mixup在X光中易产生不合理的透射叠加如两个电池叠加后亮度反常升高反而降低泛化。我替换为# data.yaml 中的 augment 部分 augment: hsv_h: 0.0 hsv_s: 0.0 hsv_v: 0.0 degrees: 0.0 # 禁用旋转——X光图无方向性 translate: 0.1 # 轻微平移模拟包裹位移 scale: 0.5 # 缩放±50%模拟不同距离拍摄 shear: 0.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 mosaic: 0.0 # 关键禁用mosaic mixup: 0.0 # 关键禁用mixup clahe: 1.0 # 新增对单通道做CLAHE增强提升低对比度区域 gridmask: 0.5 # 新增GridMask强制模型关注局部纹理对抗叠压其中clahe和gridmask需在ultralytics8.2.0中启用旧版需自行注入。CLAHE能显著提升塑料瓶内液体轮廓GridMask则让模型无法依赖全局形状因X光中剪刀可能只露半把逼其学习刀刃金属反射特征。3.3 损失函数权重为什么IoU Loss权重要降到0.5YOLO默认iou_loss0.5,cls_loss0.5,dfl_loss1.0v8.0.200。但在X光中cls_loss主导时模型倾向把模糊的锂电池边缘判为“背景”因分类置信度易受噪声干扰iou_loss过高会使bbox回归过度拟合标注员手工框的毛刺边界X光中金属边缘本就是弥散的。经消融实验最优组合为# train.yaml iou_loss: 0.5 # 保持默认 cls_loss: 0.7 # 提升分类权重迫使模型更谨慎区分相似物如陶瓷刀vs普通刀 dfl_loss: 0.3 # 降低DFL权重因X光目标长宽比极端液体瓶高瘦、打火机扁平DFL对尺度敏感该配置使battery与lighter的混淆率下降22%powder与liquid的误检率下降17%。4. 避坑指南X光YOLO训练中5个血泪经验换来的翻车现场4.1 现象训练初期loss震荡剧烈100 epoch后仍不收敛原因未对X光图像做均值方差归一化。通用ImageNet预训练权重mean[0.485,0.456,0.406], std[0.229,0.224,0.225]完全不适用于X光图——其像素值集中在[0.1,0.9]区间且标准差极小。强行使用导致梯度爆炸。解决在dataset.py中重写__getitem__计算本数据集统计量# 计算Xray数据集均值std运行一次 import cv2, numpy as np paths glob(Xray_Anno_Dataset/YOLO/images/train/*.jpg) pixels [] for p in paths[:1000]: # 取1000张足够 img cv2.imread(p) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pixels.append(img.astype(np.float32) / 255.0) stack np.vstack([p.reshape(-1,3) for p in pixels]) print(Xray mean:, stack.mean(axis0)) # [0.321, 0.321, 0.321]灰度图三通道相同 print(Xray std:, stack.std(axis0)) # [0.142, 0.142, 0.142]然后在train.py中传入--mean 0.321 --std 0.142或修改transforms.py硬编码。4.2 现象验证时mAP飙升但测试集几乎全漏检原因val.txt与test.txt被错误合并。本数据集的val用于早停early stoppingtest是独立分布不同安检设备采集若训练时把test也加入val则模型过拟合测试分布。解决检查ultralytics/cfg/default.yaml中val路径是否指向YOLO/val/而非YOLO/test/训练命令必须显式指定yolo train datadata.yaml modelyolov8s.pt val_dataYOLO/val/ epochs200绝不能省略val_data参数默认会读data.yaml里的val字段而该字段若写成YOLO/test/就铸成大错。4.3 现象导出ONNX后推理结果bbox全为0原因X光图输入Tensor的dtype为float32但ONNX导出时若未指定dynamic_axes某些backend如TensorRT会将输入强制cast为uint8导致数值坍缩。解决导出时加--dynamic参数并手动指定输入范围yolo export modelyolov8s_xray.pt formatonnx dynamicTrue opset17 \ imgsz[1,3,960,1280] halfFalse且在推理代码中确保img cv2.imread(path).astype(np.float32) / 255.0 # 归一化到[0,1] img (img - 0.321) / 0.142 # 再标准化4.4 现象labelImg打开YOLO标注后bbox位置偏移原因labelImg默认按filename.jpg匹配但本数据集部分图片名为IMG_001.jpg而YOLO标注文件名为IMG_001.txt——看似匹配实则labelImg读取时会因路径缓存错乱。解决用labelImg打开时必须先加载图片目录再逐张打开不可拖拽单图或改用CVAT开源版导入YOLO目录其解析更鲁棒。4.5 现象测试集mAP0.5达标但实际部署时漏检陶瓷刀原因陶瓷刀在X光中呈浅灰色与纸张、塑料袋灰度接近而训练集里陶瓷刀样本仅占1.2%43张模型严重欠拟合。解决对ceramic_knife类别做过采样CutMix从YOLO/train/images/中提取所有陶瓷刀图片路径用albumentations库做CutMix将陶瓷刀patch粘贴到其他背景图上生成新图片存入YOLO/train/images/oversample/对应label存入YOLO/train/labels/oversample/修改data.yaml中train路径为[YOLO/train/images/, YOLO/train/images/oversample/]。5. 测试集验证技巧不止看mAP还要盯住这3个安检特有指标5.1 分类别漏检率Miss Rate per Class表格化分析mAP掩盖了关键缺陷。例如整体mAP0.573.6但若ceramic_knife漏检率达42%则毫无实用价值。必须用ultralytics的val.py输出详细报告yolo val modelyolov8s_xray.pt datadata.yaml splittest然后解析runs/val/test/confusion_matrix.png和metrics.csv生成如下表格示例类别PrecisionRecallmAP0.5漏检数/总数典型漏检场景knife0.890.930.917/102刀尖被金属盒遮挡ceramic_knife0.610.580.5943/73平放于纸质文件夹中battery0.940.870.9013/100与USB线缠绕liquid0.770.820.7918/102塑料瓶装透明液体无气泡powder0.720.650.6835/54袋装奶粉与面粉难以区分关键动作对漏检率30%的类别如ceramic_knife立即启动第4.5节的过采样流程而非调learning rate。5.2 置信度阈值-召回率曲线Confidence-Recall Curve安检场景不追求高precision而要求Recall≥99%宁可误报不可漏检。需绘制confidencevsrecall曲线找到满足Recall0.99的最低conf# plot_conf_recall.py from ultralytics.utils.metrics import DetMetrics import matplotlib.pyplot as plt # 加载val结果需先运行yolo val ... save_jsonTrue metrics DetMetrics(save_dirruns/val/test, namesclasses) metrics.plot_confusion_matrix() # 生成混淆矩阵 # 手动计算不同conf下的recall conf_list [0.1, 0.2, ..., 0.9] recalls [] for conf in conf_list: tp sum(1 for r in metrics.results if r[conf] conf and r[correct]) fn sum(1 for r in metrics.results if r[conf] conf and r[correct]False) recalls.append(tp / (tp fn 1e-9)) plt.plot(conf_list, recalls) plt.xlabel(Confidence Threshold) plt.ylabel(Recall) plt.axhline(y0.99, colorr, linestyle--) plt.show()实测发现当Recall0.99时conf需降至0.18——这意味着模型输出大量低置信bbox必须配套NMS阈值调至0.3并用业务逻辑过滤如batteryliquid同时出现才告警。5.3 X光特有干扰项压力测试测试集虽已分层但仍需人工构造3类干扰场景验证鲁棒性强金属干扰在测试图中叠加高斯噪声σ0.05模拟安检仪老化多层叠压用OpenCV将2个knife图叠加cv2.addWeighted测试模型能否分离低剂量成像将测试图gamma校正γ0.7模拟X光剂量不足。每类干扰下记录ceramic_knife和powder的Recall变化。若下降15%说明模型泛化力不足应回退到第3节调整augment参数。我坚持一个习惯每次拿到新数据集第一件事不是训练而是用check_voc_integrity.py跑一遍再用clean_yolo_labels.py过筛——这10分钟省掉后面3天debug。X光检测没有银弹只有把数据当金矿挖把bug当氧气吸。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

Python房价可视化预测:从数据清洗到业务可解释闭环
Python房价可视化预测:从数据清洗到业务可解释闭环

简介:本资源是一份面向高校Python初学者的房价预测与可视化综合实践项目,适用于期末大作业、课程设计及数据分析入门学习,聚焦真实二手房数据建模与交互式呈现。压缩包共158个文件,含18个带详细注释的Python源码(涵盖数… · 2026/9/23 21:39:25

Ceph RADOS Gateway 灾难恢复实战:rgw-restore-bucket-index 桶索引重建工具完全指南
Ceph RADOS Gateway 灾难恢复实战:rgw-restore-bucket-index 桶索引重建工具完全指南

Ceph RADOS Gateway 灾难恢复实战:rgw-restore-bucket-index 桶索引重建工具完全指南 【免费下载链接】ceph Ceph is a distributed object, block, and file storage platform 项目地址: https://gitcode.com/gh_mirrors/ce/ceph 本文聚焦 Ceph 分布式存储… · 2026/9/23 21:39:25

YOLOv8车牌检测实战:从数据集处理到模型训练避坑指南
YOLOv8车牌检测实战:从数据集处理到模型训练避坑指南

简介:面向车牌检测与识别的YOLO格式图像数据集,适合目标检测研究者、计算机视觉开发者以及智能交通算法工程师使用,可直接用于车牌定位、车牌识别等任务的模型训练、效果评估与算法比较。资源压缩包共2000个文件,主要包含jpg原始图… · 2026/9/23 21:39:18

RecRecNet广角图像畸变矫正:端到端可微网格变换与细节重建实战解析
RecRecNet广角图像畸变矫正:端到端可微网格变换与细节重建实战解析

简介:基于RecRecNet算法的广角图像畸变矫正Python项目,提供完整源码、预训练模型与训练代码,面向计算机视觉相关专业的毕设、课程设计及工程入门人群。项目已稳定运行验证,可直接复现或在理解原理后进行二次开发。包内共26个文件&… · 2026/9/23 22:20:48

YOLO火车轨道手推车数据集实战:从标签解析到训练避坑指南
YOLO火车轨道手推车数据集实战:从标签解析到训练避坑指南

简介:这份数据集面向YOLO系列目标检测算法开发者,专注于火车、轨道、手推车三类物体的检测任务,提供三千七百九十三张图像对应的完整标注。资源已经按照训练和验证需求划分好,并附带数据配置文件,可以直接用于主流YOLO… · 2026/9/23 22:20:48

10吨锅炉配多大的脱硫塔?风量、直径、高度怎么算
10吨锅炉配多大的脱硫塔?风量、直径、高度怎么算

开篇结论:脱硫塔选多大,不是看感觉,是看两个数:烟气量定塔径,入口SO₂浓度定塔高和层数。1蒸吨锅炉约2500–3500 m/h烟气,10吨约25000–35000 m/h,参考塔径2.0–2.6米。浓度高就加喷淋层。1. 塔… · 2026/9/23 22:20:29

RedwoodJS 教程实战:从 Prisma 建模到 Service 测试,为博客添加完整评论功能
RedwoodJS 教程实战:从 Prisma 建模到 Service 测试,为博客添加完整评论功能

RedwoodJS 教程实战:从 Prisma 建模到 Service 测试,为博客添加完整评论功能 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 本篇技术指南以 RedwoodJS 官方教程第 6 章为核心,完整演… · 2026/9/23 22:20:17

脱硫塔和洗涤塔有什么区别?六种废气处理塔一张表分清
脱硫塔和洗涤塔有什么区别?六种废气处理塔一张表分清

开篇结论:脱硫塔专治锅炉烟气SO₂,洗涤塔是通用主力;碱洗塔治酸性废气,酸洗塔治碱性废气,水洗塔洗可溶气体,喷淋塔是统称。六种废气塔分不清?一张表帮你选对。1. 六塔对比表名称原理主要处理对象… · 2026/9/23 22:20:04

旅游景点情感分析:细粒度属性级建模与BERT微调实践
旅游景点情感分析:细粒度属性级建模与BERT微调实践

简介:本资源是一套面向计算机专业本科生的毕业设计实战项目,聚焦旅游景点评论的细粒度情感分析任务,适用于Python Web开发、自然语言处理与数据库应用等课程实践或毕设选题参考。项目基于Django框架构建Web系统,集成RNCC情感分析模… · 2026/9/23 22:19:58

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码