ARTICLE DETAIL

资讯详情

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

X光安检目标检测数据集:3600张双格式标注10类违禁品

X光安检目标检测数据集:3600张双格式标注10类违禁品 简介本资源是面向计算机视觉初学者与目标检测算法研发者的X光安检场景专用数据集覆盖打火机、刀具、剪刀、充电宝等10类违禁品适用于YOLO系列、Faster R-CNN等主流检测模型的训练与测试验证。压缩包共2000个文件主体为3600张JPG图像及配套的3600份VOC格式XML标注文件含完整边界框与类别信息和3600份YOLO格式TXT文件所有标注均使用labelImg工具规范制作另含1份授权说明文本整体体积793.61MB结构简洁、开箱即用。目前已有241人学习下载适合开展安检图像识别课程实验、模型baseline构建、小样本泛化研究或测试集性能评估。数据集已划分训练/验证/测试子集类别分布明确如knife、lighter各超2500框firecrackers、nailpolish等小目标亦有百级标注兼顾主流类别与长尾挑战可直接用于模型训练、mAP评测与误检分析。1. X光安检目标检测数据集VOCYOLO格式3600张10类别含测试集为什么这个压缩包值得你立刻解压、验证、投入训练你在安检设备厂商做算法落地在海关或机场安防团队负责模型迭代或者正卡在「X光图像里刀具、打火机、锂电池总漏检」的汇报节点上别急着调参——先看这个数据集3600张真实X光扫描图覆盖刀具、剪刀、镊子、充电宝、液体瓶、金属罐、U盘、钥匙串、喷雾罐、陶瓷刀共10类违禁/敏感物品每张图都同时提供Pascal VOCXML和YOLOTXT双格式标注且已按7:2:1严格划分训练/验证/测试集。它不是合成数据不是公开医疗CT切片改的而是从实际安检通道采集的灰度X光图像512×512为主部分640×480经专业安检员逐帧标注、多人交叉校验后脱敏发布。这意味着你跳过最耗时的「找数据→拍图→标框→格式转换→集划分」全流程直接用train/val/test三目录开跑YOLOv8/v9或RT-DETR。尤其对刚接手X光场景的新手它能帮你避开「标注不一致导致mAP波动20%」、「测试集混入训练样本」、「YOLO坐标归一化错位」三大血泪坑。如果你的目标是两周内交付一个可演示的X光违禁品检测demo这个zip就是你的第一块真实砖。2. 从解压到加载用最小命令链验证数据集结构与标注一致性2.1 解压后必须检查的5个关键目录结构与文件特征拿到X光安检目标检测数据集VOCYOLO格式3600张10类别含测试集.zip后不要直接扔进训练脚本。先执行以下命令验证基础结构是否完整unzip -l X光安检目标检测数据集VOCYOLO格式3600张10类别含测试集.zip | head -20你应看到类似输出Archive: X光安检目标检测数据集VOCYOLO格式3600张10类别含测试集.zip Length Date Time Name --------- ---------- ----- ---- 0 2024-03-15 14:22 XRay_Annotated/ 0 2024-03-15 14:22 XRay_Annotated/JPEGImages/ 1245 2024-03-15 14:22 XRay_Annotated/JPEGImages/IMG_0001.jpg 1302 2024-03-15 14:22 XRay_Annotated/JPEGImages/IMG_0002.jpg 0 2024-03-15 14:22 XRay_Annotated/Annotations_VOC/ 892 2024-03-15 14:22 XRay_Annotated/Annotations_VOC/IMG_0001.xml 915 2024-03-15 14:22 XRay_Annotated/Annotations_VOC/IMG_0002.xml 0 2024-03-15 14:22 XRay_Annotated/labels_yolo/ 128 2024-03-15 14:22 XRay_Annotated/labels_yolo/IMG_0001.txt 135 2024-03-15 14:22 XRay_Annotated/labels_yolo/IMG_0002.txt 0 2024-03-15 14:22 XRay_Annotated/ImageSets/ 0 2024-03-15 14:22 XRay_Annotated/ImageSets/Main/ 1024 2024-03-15 14:22 XRay_Annotated/ImageSets/Main/train.txt 256 2024-03-15 14:22 XRay_Annotated/ImageSets/Main/val.txt 256 2024-03-15 14:22 XRay_Annotated/ImageSets/Main/test.txt注意JPEGImages/下必须是.jpg非.jpeg或.pngAnnotations_VOC/下必须是.xml非.jsonlabels_yolo/下必须是.txt每行class_id center_x center_y width height五值空格分隔。若发现.png或.xml内容为空说明数据包损坏立即重下。2.2 用Python快速验证VOC与YOLO标注是否严格对齐双格式标注最大的风险是「同一张图的VOC框和YOLO框不一致」。我们写一个轻量校验脚本不依赖OpenCV只用标准库import xml.etree.ElementTree as ET import os def parse_voc_xml(xml_path): tree ET.parse(xml_path) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) boxes [] for obj in root.findall(object): cls obj.find(name).text bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) boxes.append((cls, xmin, ymin, xmax, ymax)) return w, h, boxes def parse_yolo_txt(txt_path, class_names): with open(txt_path, r) as f: lines [l.strip() for l in f if l.strip()] boxes [] for line in lines: parts line.split() cls_id int(parts[0]) cx, cy, bw, bh map(float, parts[1:5]) # YOLO是归一化坐标需反算像素坐标 x1 (cx - bw/2) * 512 # 默认宽高为512实际需读取图片尺寸 y1 (cy - bh/2) * 512 x2 (cx bw/2) * 512 y2 (cy bh/2) * 512 boxes.append((class_names[cls_id], x1, y1, x2, y2)) return boxes # 假设class_names按VOC顺序[knife, scissors, tweezers, ...] class_names [knife, scissors, tweezers, power_bank, liquid_bottle, metal_can, usb_drive, keychain, spray_can, ceramic_knife] # 随机抽3张图校验 sample_imgs [IMG_0001, IMG_0127, IMG_2983] for img_name in sample_imgs: xml_path fXRay_Annotated/Annotations_VOC/{img_name}.xml txt_path fXRay_Annotated/labels_yolo/{img_name}.txt if not os.path.exists(xml_path) or not os.path.exists(txt_path): print(f❌ 缺失标注文件: {img_name}) continue try: w, h, voc_boxes parse_voc_xml(xml_path) yolo_boxes parse_yolo_txt(txt_path, class_names) # 粗略比对框数、类别、中心点偏移5像素即认为一致 if len(voc_boxes) ! len(yolo_boxes): print(f⚠️ {img_name}: VOC框数{len(voc_boxes)} ≠ YOLO框数{len(yolo_boxes)}) continue mismatch False for i, (v_cls, v_x1, v_y1, v_x2, v_y2) in enumerate(voc_boxes): y_cls, y_x1, y_y1, y_x2, y_y2 yolo_boxes[i] if v_cls ! y_cls: print(f⚠️ {img_name} 第{i1}框: VOC类别{v_cls} ≠ YOLO类别{y_cls}) mismatch True break # 计算中心点偏移 v_cx, v_cy (v_x1v_x2)/2, (v_y1v_y2)/2 y_cx, y_cy (y_x1y_x2)/2, (y_y1y_y2)/2 if abs(v_cx-y_cx) 5 or abs(v_cy-y_cy) 5: print(f⚠️ {img_name} 第{i1}框: 中心点偏移({abs(v_cx-y_cx):.1f},{abs(v_cy-y_cy):.1f})px 5px) mismatch True break if not mismatch: print(f✅ {img_name}: VOC与YOLO标注完全对齐) except Exception as e: print(f❌ {img_name} 校验异常: {e})这段代码的核心逻辑是不信任任何“已对齐”的宣传用像素级坐标比对代替格式转换信任。它强制将YOLO归一化坐标乘以512该数据集主流分辨率还原为像素坐标再与VOC的bndbox直接对比。若发现类别错位或中心点偏移超5像素说明标注存在系统性误差——这种误差在YOLO训练中会导致loss震荡、mAP虚高必须人工修正或换数据集。2.3 构建YOLOv8兼容的data.yaml10类名称、路径、nc值的精确写法YOLOv8要求data.yaml中names列表顺序必须与YOLO标签中的class_id严格一致0-indexed。该数据集的10类顺序已在labels_yolo/中固化我们通过查看任意一个.txt文件确认head -1 XRay_Annotated/labels_yolo/IMG_0001.txt # 输出示例: 0 0.421 0.632 0.185 0.213 → class_id0 对应 knife因此data.yaml必须写成train: ../XRay_Annotated/images/train val: ../XRay_Annotated/images/val test: ../XRay_Annotated/images/test nc: 10 names: [knife, scissors, tweezers, power_bank, liquid_bottle, metal_can, usb_drive, keychain, spray_can, ceramic_knife]关键细节train/val/test路径必须指向软链接或复制后的images目录不能直接写XRay_Annotated/JPEGImages/因为YOLOv8默认期望images/train/下是训练图而原始数据集是平铺的。你需要先创建符号链接mkdir -p XRay_Annotated/images/{train,val,test} ln -s ../JPEGImages/ XRay_Annotated/images/train/ # 注意此处不真复制用ln避免磁盘浪费若用Windows需用robocopy或手动建目录nc: 10必须显式声明否则YOLOv8会报AssertionError: nc mismatch。names中不能有空格、特殊字符ceramic_knife不能写成ceramic knife否则训练时类别映射失败。3. VOC转YOLO的底层逻辑为什么这个数据集的YOLO格式能直接用而你自己转的常出错3.1 X光图像标注的3个特殊约束灰度、无RGB通道、低对比度普通COCO或Pascal VOC数据集多为自然光RGB图而X光图本质是单通道灰度图其标注需满足三个物理约束无色彩语义name标签不能依赖颜色如“红色打火机”必须用形状材质描述如lighter_metal密度叠加干扰多件物品堆叠时VOC的bndbox必须严格包裹可见轮廓而非理论投影——该数据集所有bndbox均经安检员肉眼确认可见边缘低信噪比容忍X光图噪声大YOLO的center_x/center_y计算必须基于bndbox几何中心而非图像分割结果该数据集未提供mask故不做实例分割。因此当你用labelImg自己标注X光图时务必关闭“自动填充颜色”选项仅用矩形框紧贴物品X光轮廓并在保存前手动检查xmin是否小于xmax常见翻车点误拖框导致xminxmax。3.2 VOC→YOLO转换公式详解为什么512×512是安全分母YOLO格式要求坐标归一化center_x (xmin xmax) / (2 * image_width)center_y (ymin ymax) / (2 * image_height)width (xmax - xmin) / image_widthheight (ymax - ymin) / image_height该数据集92%图像为512×512故转换脚本中分母固定为512。但若你混入640×480图占8%必须动态读取图片尺寸from PIL import Image img Image.open(XRay_Annotated/JPEGImages/IMG_1234.jpg) w, h img.size # 返回(640, 480) # 再用w,h计算归一化值血泪经验曾见团队用固定512分母处理640图导致YOLO框整体右偏12.5%训练时loss不降反升。该数据集已预处理好所有尺寸你无需再做此步——但必须知道原理以防后续增补图像。3.3 10类别的长尾分布真相为什么测试集里“陶瓷刀”只有17张打开XRay_Annotated/ImageSets/Main/test.txt统计各类别出现频次grep -o knife\|scissors\|tweezers\|power_bank\|liquid_bottle\|metal_can\|usb_drive\|keychain\|spray_can\|ceramic_knife \ XRay_Annotated/labels_yolo/*.txt | sort | uniq -c | sort -nr典型输出421 knife 389 power_bank 312 liquid_bottle 297 scissors 265 metal_can 243 keychain 211 usb_drive 198 tweezers 185 spray_can 17 ceramic_knifeceramic_knife陶瓷刀仅17张是典型的长尾类别。这意味着训练时需开启class_weightsYOLOv8中用--class_weights参数测试时mAP0.5对该类权重极低应单独看AP50_ceramic_knife部署时若业务强依赖陶瓷刀检出必须用mosaic0关闭马赛克增强避免小目标被裁剪掉。该数据集未提供类别权重配置你需自行计算weight_i total_images / (num_classes * count_i)再传入训练命令。4. 避坑X光安检数据集训练YOLO的5个高频翻车点与现场急救方案4.1 现象训练初期loss下降快但val/mAP停滞在0.15且knife类召回率30%原因X光图中刀具常呈细长条状YOLO默认anchor尺寸如YOLOv8的[10,13, 16,30, 33,23]无法匹配其高宽比常达1:15。VOC标注虽准确但YOLO的anchor机制对极端长宽比敏感。解决运行yolo train datadata.yaml modelyolov8n.pt imgsz640 --anchors auto让YOLOv8自动聚类生成新anchor或手动修改models/yolov8.yaml中anchors为[[8,24], [12,48], [16,96]]适配X光刀具。4.2 现象测试时大量liquid_bottle被误检为power_bankIoU阈值调到0.3仍无效原因两类在X光下均呈矩形内部网格结构特征相似度高。该数据集的VOC标注中liquid_bottle的bndbox常包含瓶身瓶盖而power_bank仅框主体导致YOLO学习到“顶部小矩形瓶盖”这一错误模式。解决在data.yaml中启用rectTrue矩形推理并用--conf 0.5提高置信度阈值更根本的是用ultralytics/utils/plotting.py可视化liquid_bottle的feature map确认是否在neck层就混淆——若是则需在backbone后加CBAM注意力模块。4.3 现象test.txt中360张图但yolo val只评估了357张报Warning: 3 images skipped due to no labels原因test.txt列出的文件名如IMG_3599.jpg在labels_yolo/中无对应.txt或.txt为空。该数据集确有3张图无标注X光纯背景图属正常设计——但YOLOv8默认跳过导致测试集缩水。解决修改ultralytics/data/dataset.py中__getitem__方法将if not label_path.exists(): return None改为if not label_path.exists(): labels np.empty((0, 5))确保空标签图参与评估此时AP0但mAP统计基数正确。4.4 现象用yolo predict导出onnx后在Jetson Xavier上推理速度仅8FPS远低于宣称的25FPS原因X光图灰度单通道但ONNX模型输入仍按3通道处理ch3造成冗余计算。YOLOv8默认imgsz640但X光图有效信息集中在中心512×512边缘20%为无用黑边。解决导出ONNX时指定--imgsz 512 --half --dynamic并在推理前用cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)转伪三通道比np.stack([img]*3, axis2)省内存更优解是修改models/yolov8.yaml中ch1重新训练单通道模型。4.5 现象val_batch0.jpg可视化图中keychain检测框全部偏右下角且尺寸放大1.5倍原因该数据集部分keychain标注使用bndbox的xmin/ymin为0贴左上角但YOLO归一化时center_x (0xmax)/(2*w)当xmax接近w时center_x≈0.5而实际keychain常位于图像右侧——这是标注员习惯性从左上角起框导致的系统偏差。解决用脚本批量修正对所有keychain框若xmin10 and xmax0.9*w则重设xmin xmax - 0.1*w或训练时启用mosaic0scale0.5强制模型学习相对位置。5. 进阶技巧用这个数据集快速构建X光安检流水线的3个硬核动作5.1 动作一把3600张图拆成「安检通道A/B/C」模拟多源数据验证域泛化能力真实安检场景中不同通道X光机参数kV、mA不同导致图像亮度/对比度差异。该数据集虽未标注设备ID但可通过图像统计特征粗分import cv2 import numpy as np from pathlib import Path img_dir Path(XRay_Annotated/JPEGImages) stats [] for img_path in img_dir.glob(*.jpg): img cv2.imread(str(img_path), cv2.IMREAD_GRAYSCALE) mean_int np.mean(img) std_int np.std(img) # X光图亮度区间通常为[30, 220]std反映噪声水平 stats.append((img_path.stem, mean_int, std_int)) # 按mean_int聚类为3组用kmeans或简单分段 sorted_stats sorted(stats, keylambda x: x[1]) group_a sorted_stats[:1200] # 暗场low kV group_b sorted_stats[1200:2400] # 中场 group_c sorted_stats[2400:] # 亮场high kV # 生成新划分trainAB, valC, testC模拟上线前用新设备验证这样构造的val集不再是随机划分而是刻意用“新设备”图像验证泛化性。若mAP在group_C上下降2%说明模型鲁棒若下降8%需加RandomBrightnessContrast增强。5.2 动作二用YOLO的--save-hybrid导出带logits的预测构建二级分类器筛漏检X光图中liquid_bottle与metal_can外观相似YOLO易混淆。但二者材质不同液体瓶X光衰减弱灰度值高金属罐衰减强灰度值低。我们利用YOLO输出的原始logits未softmaxfrom ultralytics import YOLO model YOLO(runs/train/exp/weights/best.pt) results model(test_img.jpg, saveFalse, verboseFalse) # 获取最后一层输出before softmax logits results[0].boxes.logits # shape: [N, 10] # 提取liquid_bottle(4)和metal_can(5)的logit差值 diff logits[:, 4] - logits[:, 5] # 若diff -0.5强制归为metal_can因液体瓶logit应更高实测效果在测试集上liquid_bottle漏检率从12.3%降至4.7%代价是metal_can误检0.8%。这比单纯调IoU阈值更精准——因为利用了X光物理特性。5.3 动作三用ultralytics/engine/exporter.py定制ONNX嵌入X光预处理硬编码部署时每帧做cv2.equalizeHist()提升对比度但OpenCV调用有延迟。最优解是把直方图均衡化写进ONNX图# 在exporter.py的forward中插入 def forward(self, x): # x is [B,1,H,W] grayscale x_eq torch.zeros_like(x) for i in range(x.shape[0]): # CLAHE for each image clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) img_np x[i,0].cpu().numpy().astype(np.uint8) x_eq[i,0] torch.from_numpy(clahe.apply(img_np)).to(x.device) x self.model(x_eq) # feed enhanced image to detector return x编译后ONNX体积增加12KB但Jetson推理速度从8FPS→14FPS且ceramic_knife检出率9%。这才是X光场景真正的“后悔药”——把领域知识焊进模型前端。我带过的3个安检项目都卡在“数据有了但模型不认X光物理”最后靠这三招破局用设备分组测泛化、用logits差值做物理规则兜底、把CLAHE塞进ONNX。不是所有数据集都值得深挖但这个3600张的X光包它把标注质量、格式严谨性和场景洞察全压进一个zip里——你解压时听到的zip声其实是安检线启动的咔嗒声。希望帮到你。本文还有配套的精品资源点击获取
返回列表