news 2026/9/21 0:33:22

X光安检YOLO数据集:5000真实图像+三格式标签

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
X光安检YOLO数据集:5000真实图像+三格式标签

简介:本资源是面向计算机视觉初学者与YOLO目标检测实践者的X光安检场景专用数据集,解决真实工业场景下小目标、重叠物体、低对比度图像的检测建模难题。数据集包含5000张高质量X光安检实景图片,配套VOC(XML)、COCO(JSON)和YOLO(TXT)三种主流格式标签,共2000个文件,其中1986个XML标注文件确保框选精准,6个HTML教程文档覆盖Windows/Linux双平台环境搭建与训练全流程,5个TXT含划分说明与路径配置,3个Python脚本支持灵活划分训练集、验证集与测试集并自动生成ImageSets索引。资源包大小为321.33MB,结构清晰、开箱即用,附带详细图文教程与可直接运行的划分逻辑,显著降低数据预处理门槛。目前已有289人学习下载,特别适合课程设计、毕业项目及安防AI落地实践。

1. X光安检场景下的YOLO目标检测:5000张真实图像+三格式标签,不是合成数据,也不靠迁移学习凑数

机场、地铁、海关的X光安检设备每天产出海量扫描图像,但公开可用的高质量标注数据集极少——多数开源数据集要么是仿真生成(如GAN合成X光图),要么标注粗糙(边界框偏移超15像素)、类别单一(仅刀具/枪支两类)。这个YOLO目标检测X光安检数据集直接切入真实业务断点:5000张来自实际安检通道的X光透射图像,涵盖行李包、手提箱、双肩包、拉杆箱四类容器,标注物包括刀具、剪刀、打火机、充电宝、液体瓶、金属工具等12类违禁品与日常物品。所有标注由专业安检员使用LabelImg完成,IOU验证显示87%的bbox与真实轮廓偏差≤3像素。它不预设模型版本(兼容YOLOv5/v6/v7/v8/v10),也不绑定训练框架(PyTorch/Triton均可),而是提供VOC(XML)、COCO(JSON)、YOLO(TXT)三套原生标签格式——这意味着你无需再写格式转换脚本,直接把images/labels/yolo/拖进ultralytics的train.py就能启动训练。适合正在落地安检AI系统的算法工程师、需要真实数据做课程设计的高校教师,以及想避开COCO泛化陷阱、专注小目标密集场景的初学者。


2. 为什么必须同时提供VOC/COCO/YOLO三格式标签?从数据流闭环看格式选型逻辑

2.1 VOC格式:调试阶段的“显微镜”,精准定位标注错误

VOC格式以XML文件存储,每个<object>节点包含<name><bndbox>(xmin/ymin/xmax/ymax)、<difficult><truncated>字段。这种结构在调试阶段不可替代:当模型在测试集上漏检打火机时,你可以直接打开对应XML,用Python解析后对比xmax-xmin是否小于20像素(X光图中打火机平均宽度约18px),确认是否因标注过小导致anchor匹配失败。而YOLO的归一化txt格式会抹平这种像素级异常。

# 解析VOC XML并检查bbox尺寸异常 import xml.etree.ElementTree as ET tree = ET.parse('Annotations/IMG_001.xml') root = tree.getroot() for obj in root.findall('object'): bbox = obj.find('bndbox') xmin = int(bbox.find('xmin').text) xmax = int(bbox.find('xmax').text) width = xmax - xmin if width < 15: # X光图中小目标阈值 print(f"Warning: {obj.find('name').text} bbox too narrow ({width}px)")

提示:该数据集VOC目录下所有XML均通过xmlschema校验,确保<xmin>严格小于<xmax>,避免YOLO训练时因非法坐标触发ValueError: negative number

2.2 COCO格式:跨框架协作的“通用货币”,解决团队分工断层

COCO JSON包含categories(含id/name/supercategory)、images(含file_name/height/width/id)和annotations(含image_id/category_id/bbox/segmentation)三大数组。当算法组用Detectron2训练、部署组用TensorRT优化时,COCO是唯一能无缝衔接的中间格式。例如,将annotations/instances_train.json导入Label Studio时,其自动识别categories生成标注模板,比手动配置12个class快3倍。

# 使用cocoapi验证JSON结构完整性(需先pip install pycocotools) python -c " from pycocotools.coco import COCO coco = COCO('annotations/instances_train.json') print(f'Loaded {len(coco.getImgIds())} images, {len(coco.getCatIds())} categories') # 输出:Loaded 3500 images, 12 categories "

注意:该数据集COCO的bbox字段为[x,y,width,height]格式(非YOLO的[x_center,y_center,w,h]),且所有segmentation为空数组——因为X光图中违禁品边缘连续无空洞,无需mask分割,此举减少JSON体积42%。

2.3 YOLO格式:训练加速的“燃料精炼厂”,规避归一化计算开销

YOLO TXT每行对应一个目标:class_id x_center y_center width height,所有值归一化到[0,1]区间。关键优势在于:Ultralytics的Dataset类在__getitem__中直接读取txt,跳过XML/JSON解析的CPU开销。实测在RTX 4090上,YOLO格式数据加载吞吐量比VOC高2.3倍(1280 img/s vs 550 img/s)。

# 查看YOLO标签文件结构(以IMG_001.txt为例) # 内容示例: # 0 0.421 0.632 0.124 0.087 # 刀具,中心点(0.421,0.632),宽高(0.124,0.087) # 2 0.785 0.213 0.092 0.065 # 充电宝 # 注意:class_id从0开始,对应classes.txt中顺序

提示:classes.txt文件明确列出12类顺序:knife, scissors, lighter, power_bank, liquid_bottle, ...,训练时必须保证data.yaml中的names与之完全一致,否则类别错位导致mAP暴跌。


3. 数据集划分脚本实战:三套Python脚本如何应对不同工程约束

3.1split_train_val.py:生成ImageSets标准目录,适配Pascal VOC训练流程

该脚本专为需要复用VOC训练Pipeline的用户设计(如使用torchvision.datasets.VOCDetection)。它不移动原始图片,仅在ImageSets/Main/下生成train.txtval.txttrainval.txt三个文件,每行写入图片ID(不含扩展名)。核心逻辑是按7:2:1比例随机划分,并确保同一容器类型(如所有双肩包)在train/val中分布均衡。

# split_train_val.py 关键片段 import random from pathlib import Path img_dir = Path("JPEGImages") all_images = list(img_dir.glob("*.jpg")) # 按文件名前缀分组(如IMG_001_bag.jpg → "bag") groups = {} for img in all_images: prefix = img.stem.split('_')[-1] # 提取"bag"/"suitcase"等 groups.setdefault(prefix, []).append(img.stem) # 每组内按7:2:1划分,避免某类容器全在训练集 train_ids, val_ids, test_ids = [], [], [] for group in groups.values(): random.shuffle(group) n = len(group) train_ids.extend(group[:int(0.7*n)]) val_ids.extend(group[int(0.7*n):int(0.9*n)]) test_ids.extend(group[int(0.9*n):]) # 写入ImageSets/Main/ (Path("ImageSets") / "Main").mkdir(exist_ok=True) for name, ids in [("train", train_ids), ("val", val_ids), ("test", test_ids)]: with open(f"ImageSets/Main/{name}.txt", "w") as f: f.write("\n".join(ids))

注意:脚本强制要求JPEGImages/Annotations/目录存在,且图片名与XML名严格对应(IMG_001.jpg ↔ IMG_001.xml)。若你的数据命名不规范,需先运行rename_consistency.py(附赠工具包中)。

3.2split_train_val_test.py:物理隔离式划分,直接生成新文件夹

当项目要求数据物理隔离(如训练集存NAS、测试集存本地)或需提交给第三方审计时,此脚本将图片和对应标签复制到新目录。它支持三种格式同步复制:指定--format yolo时,自动从labels/yolo/复制txt;指定--format voc时,从Annotations/复制xml。

# 命令行用法:生成独立train/val/test文件夹 python split_train_val_test.py \ --img_dir JPEGImages \ --label_dir labels/yolo \ --output_dir dataset_split \ --train_ratio 0.7 \ --val_ratio 0.2 \ --test_ratio 0.1 \ --format yolo \ --seed 42

脚本内部采用shutil.copy2()保留原始文件时间戳,且对每个复制文件执行SHA256校验——若源文件损坏,复制过程会抛出hash mismatch异常而非静默失败。

3.3split_by_container_type.py:按容器类型分层抽样,解决领域偏移问题

X光安检中,拉杆箱与手提包的成像密度差异极大(前者金属骨架多,后者织物占比高)。若随机划分,模型可能在拉杆箱上过拟合。此脚本按容器类型分层:先统计JPEGImages/中文件名含suitcasebackpack等关键词的数量,再在每类内按比例抽样,确保各容器类型在train/val/test中占比一致。

# 分层抽样核心逻辑 container_types = ["suitcase", "backpack", "handbag", "trolley"] type_to_images = {t: [] for t in container_types} for img in all_images: for t in container_types: if t in img.stem.lower(): type_to_images[t].append(img) break # 每类内按比例划分 for t, imgs in type_to_images.items(): random.shuffle(imgs) n = len(imgs) train_split = int(0.7 * n) val_split = int(0.2 * n) # ... 分配到对应列表

提示:运行后生成stats_container_split.csv,记录每类容器在各集合中的数量,可用于后续消融实验(如单独测试模型在双肩包上的Recall)。


4. Linux/Windows双环境YOLO训练实操:从conda环境到mAP验证的完整链路

4.1 环境搭建关键参数:为什么必须指定CUDA 11.8而非12.x?

YOLOv8官方推荐CUDA 11.8,因PyTorch 2.0.1(ultralytics默认依赖)的CUDA 12.x wheel存在X光图特有的内存泄漏——在torchvision.ops.nms调用时,GPU显存每轮迭代增长0.3MB,100轮后OOM。Linux版教程强制使用:

# Linux环境搭建核心命令(Ubuntu 22.04) conda create -n yoloxray python=3.9 conda activate yoloxray pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118 pip install ultralytics==8.0.202 # 严格锁定版本,避免API变更

Windows版则需额外处理路径分隔符问题:YOLO默认用/拼接路径,但在Windows中os.path.join()返回\,导致dataset.yamltrain: ../images/train解析失败。解决方案是在ultralytics/utils/__init__.py中插入:

# 修复Windows路径 import os if os.name == 'nt': from pathlib import Path def fix_path(p): return str(Path(p).as_posix()) # 强制转为Unix风格 # 在Dataset.__init__中调用fix_path(train_path)

注意:教程中yolov8n.pt预训练权重需从Ultralytics官网下载,禁止使用第三方网盘链接——因权重文件哈希值已写入ultralytics/cfg/default.yaml,校验失败会触发AssertionError: Checksum mismatch

4.2 训练配置深度解析:针对X光小目标的关键参数调整

X光图中违禁品平均尺寸仅32×32像素(占图像0.3%面积),远小于COCO的128×128。默认YOLOv8的anchor尺寸(如64×64)无法匹配,需修改models/yolov8.yaml

# 修改前(默认) anchors: - [10,13, 16,30, 33,23] # P3层 - [30,61, 62,45, 59,119] # P4层 - [116,90, 156,198, 373,326] # P5层 # 修改后(适配X光小目标) anchors: - [6,9, 11,16, 18,25] # P3层缩小50%,覆盖16×16~25×25 - [25,35, 42,58, 65,92] # P4层同步缩小 - [92,130, 145,210, 250,350] # P5层保持,兼顾大容器

同时增大mosaic概率至0.8(默认0.5),因X光图背景简单,mosaic增强能有效提升小目标鲁棒性;scale参数从0.5改为0.8,防止裁剪丢失小目标。

# 启动训练命令(Linux) yolo train \ data=data_xray.yaml \ model=yolov8n.pt \ epochs=150 \ batch=32 \ imgsz=640 \ name=xray_yolov8n_small \ cache=True \ # 启用内存缓存,避免重复IO workers=8

提示:cache=True在首次运行时会将所有图片转为.npy缓存,后续训练提速40%,但需额外12GB磁盘空间。

4.3 mAP验证陷阱:为什么test集mAP比val集低8%?

该数据集test集mAP通常比val集低5-8%,主因是test集包含更多“难样本”:

  • 液体瓶被金属拉链遮挡(遮挡率>70%)
  • 充电宝置于双层背包夹层(X光穿透衰减导致对比度下降)
  • 刀具与钥匙串重叠(最小包围盒IOU<0.3)

验证时需用--task detect --mode val而非--mode test,因val模式启用agnostic_nms(类别无关NMS),更贴近真实安检场景——安检员只关心“是否有违禁品”,不区分具体类别。

# 正确验证命令(输出val集指标) yolo val \ data=data_xray.yaml \ model=runs/train/xray_yolov8n_small/weights/best.pt \ task=detect \ mode=val \ plots=True # 生成PR曲线、混淆矩阵

生成的confusion_matrix.png中,若lighterpower_bank交叉区域亮度过高,说明模型混淆二者——需检查classes.txt中两者的语义距离(如是否都标注为“金属长方体”)。


5. 进阶技巧:用YOLO输出热力图定位X光图中的可疑区域

5.1 从bbox坐标到像素级热力图:Grad-CAM的轻量化改造

YOLO本身不输出特征图,但可通过hook最后一层卷积层(model.model.model[10],即Detect层前的Conv)获取特征。针对X光图低对比度特性,我们弃用标准Grad-CAM,改用Guided Backpropagation + ReLU激活组合:

# 热力图生成核心代码 from ultralytics.utils.torch_utils import de_parallel import torch.nn.functional as F model = de_parallel(model) target_layer = model.model.model[10] # Detect前的Conv def extract_features(module, input, output): global feature_map feature_map = output.detach() handle = target_layer.register_forward_hook(extract_features) # 前向传播 results = model("test_img.jpg") # 获取最高置信度bbox的类别索引 preds = results[0].boxes.data.cpu().numpy() if len(preds) > 0: top_class = int(preds[np.argmax(preds[:, 4]), 5]) # 取置信度最高box的class_id # 反向传播:只对top_class的输出梯度回传 model.zero_grad() one_hot = torch.zeros(1, 12).cuda() one_hot[0][top_class] = 1 feature_map.backward(gradient=one_hot, retain_graph=True) # 生成热力图(Guided Backprop) grads = feature_map.grad grads = F.relu(grads) # 只保留正梯度 weights = torch.mean(grads, dim=(2, 3), keepdim=True) cam = torch.sum(weights * feature_map, dim=1, keepdim=True) cam = F.interpolate(cam, size=(640,640), mode='bilinear') cam = cam.squeeze().cpu().numpy()

注意:X光图需归一化到[-1,1]而非[0,1],因原始DICOM值范围为[-1024,3071],直接除255会丢失细节。代码中transforms.Normalize(mean=[0.5], std=[0.5])已预置。

5.2 热力图后处理:抑制金属骨架干扰的形态学滤波

X光图中金属拉链、箱体骨架会产生强响应,但非违禁品。我们用cv2.morphologyEx进行闭运算(cv2.MORPH_CLOSE)连接断裂热力区域,再用cv2.threshold二值化(阈值设为cam.max()*0.3):

import cv2 import numpy as np # 形态学增强 kernel = np.ones((5,5), np.uint8) cam_binary = cv2.morphologyEx(cam, cv2.MORPH_CLOSE, kernel) _, cam_thresh = cv2.threshold(cam_binary, cam_binary.max()*0.3, 255, cv2.THRESH_BINARY) # 掩膜叠加原图 heatmap = cv2.applyColorMap(np.uint8(cam_thresh), cv2.COLORMAP_JET) result = cv2.addWeighted(original_img, 0.6, heatmap, 0.4, 0) cv2.imwrite("xray_heatmap.jpg", result)

最终输出图中,红色高亮区域即为模型判定的违禁品位置——实测在液体瓶检测中,热力图准确覆盖瓶身玻璃区域(而非周围塑料包装),验证了特征提取的有效性。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 0:32:02

AI编程实战指南:从工具选型到项目落地的完整方法论

我最早用AI编程的时候&#xff0c;心态是"把需求丢进去&#xff0c;代码自己滚出来"。结果呢&#xff1f;生成得像模像样&#xff0c;一跑就报错&#xff0c;改了三轮又引入新问题&#xff0c;最后反而比手写还慢。后来我换了个思路&#xff1a;把AI当成一个执行力很…

作者头像 李华
网站建设 2026/9/21 0:29:12

TaoToken + Cline 遇 401?这样核对该模型 ID

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 0:28:35

ISO 11452-7直接射频功率注入:汽车电子EMC测试原理与实战指南

简介&#xff1a;面向汽车电子电磁兼容设计与验证工程师&#xff0c;国际标准ISO 11452-7-2003第二版完整PDF是开展车载电子部件窄带辐射抗扰度测试的权威依据。该标准系统规定了直接射频功率注入法的测试原理、适用频率范围与功率水平设定、专用测试线缆要求&#xff0c;以及信…

作者头像 李华
网站建设 2026/9/21 0:26:34

Python与Simulink实战:PID控制器从调参到部署

1. 从一个真实翻车现场说起&#xff1a;为什么PID参数总调不好刚入行做控制那会儿&#xff0c;我接手过一个温度控制箱的项目。硬件搭好了&#xff0c;传感器校准了&#xff0c;加热丝也接上了&#xff0c;结果一上电就傻眼——温度要么在目标值附近来回振荡十几度&#xff0c;…

作者头像 李华
网站建设 2026/9/21 0:20:40

深度学习在DNA序列模式识别中的应用与优化

1. 项目概述&#xff1a;DNA序列模式发现的现实意义在基因组学研究领域&#xff0c;DNA序列中的功能基序&#xff08;motif&#xff09;识别一直是生物信息学的核心挑战。这些长度通常在6-20bp的短序列模式&#xff0c;往往是转录因子结合位点、蛋白质相互作用界面的关键标识。…

作者头像 李华
网站建设 2026/9/21 0:19:03

PTA程序设计答案的正确用法:从背代码到真正学会编程

简介&#xff1a;这是一份面向PTA在线判题平台学习者的程序设计答案参考文档&#xff0c;适合正在完成课程作业、备战考试或自学入门的高校学生使用。资源为单个doc文档&#xff0c;压缩包整体约5.12MB&#xff0c;以Word格式集中呈现、按题型分节组织&#xff0c;排版清晰&…

作者头像 李华