安检X光目标检测数据集:10类物品YOLOV5训练实践
简介:本资源是面向计算机视觉初学者与安防智能检测开发者的目标检测专用数据集,聚焦X光安检场景下的包内违禁/常见物品识别任务,直接支持YOLOv5等主流模型训练与验证。数据集严格按YOLOv5目录结构组织,含训练集2880张RGB图像(300–500分辨率)及对应txt标签、验证集720张图像及标签,另附10类别名称映射txt字典与开箱即用的可视化脚本show.py——运行后可自动加载任意图片并绘制带类别标注的边界框,便于快速验证标注质量与模型输入格式。压缩包共2000个文件,以1999个标注txt和1个Python脚本为主,总大小377MB,结构简洁、零预处理门槛。目前已有386人下载学习,特别适合需快速构建X光违禁品检测原型、开展迁移学习或教学演示的科研与工程实践者。 安检机的X光扫描图像,我第一次真正上手处理的时候,脑子里只有一个想法:这东西跟平时训练的COCO、VOC数据集完全是两个物种。行李包层层叠叠,所有物品都是透射视角,金属边缘亮得刺眼,有机物又糊成一团,要不是事先知道包里有什么,光看图我都得看半天。但安检口每天要过的包裹量摆在那儿,靠人眼一张张盯,疲劳和漏检都是绕不开的问题,目标检测模型如果能在这类图上稳定地把物品框出来,价值就很直接了。
这篇文章要说的,是我整理和验证过的一个目标检测数据集——安检机X光扫描下的包里物品数据集,一共10个类别,目录结构完整按YOLOV5格式组织,拷下来就能直接开训。适合正在做安检场景算法落地、或者想拿真实场景数据练手YOLOV5的读者。我会把数据集构成、目录格式细节、训练流程、以及我在这个数据上反复踩过的坑都展开讲一遍,帮你少走弯路。
1. 为什么安检X光目标检测不能拿通用数据集硬套
1.1 安检图像的成像方式决定了它与自然图像是两套视觉逻辑
自然光下的目标检测,模型学的是物体的颜色、纹理、光照阴影这些表面特征。比如一辆红色的车,在COCO里会学习到"红色车身+轮胎形状+车窗反光"的组合。但安检X光图像是通过X射线穿透物体后成像的,图像里每一块灰度的明暗,反映的是物体对射线的吸收程度,也就是密度和有效原子序数的差异。金属因为密度大,在图上呈现高亮的白色或蓝色;塑料和有机物则呈现灰暗的橙色或绿色调。同一个物体在透视角度下,可能只看到一个投影轮廓,完全没有自然光下的纹理和色彩信息。
这带来的直接影响是,你在ImageNet或COCO上预训练好的模型,迁移到X光图像上时,底层卷积核提取到的很多特征根本不匹配。自然图像里那种"红色小熊"的纹理组合,在X光图里不存在。唯一能复用的是边缘、形状、长宽比这类最底层的几何特征,但这也只占预训练特征的一部分。很多人在刚开始接触安检目标检测时,拿着COCO预训练权重直接训,发现loss降得特别慢,甚至训完mAP只有零点几,原因就在这里——领域差异太大,所谓迁移学习只能起到一半作用。
1.2 通用目标检测数据集里,几乎没有"叠着放"的物体
如果你仔细翻过COCO或VOC数据集,会发现标注的对象大多处于相对自然的摆放状态:物体有明确轮廓,相互遮挡虽然存在,但绝大多数目标的主体可见度很高。而安检X光场景里,瓶子和笔记本电脑叠在一起,雨伞骨架和钥匙链缠成一团,甚至一把刀横着插在保温杯和钱包之间,从投影面上看三条边界互相交错。这种高密度遮挡在自然图像数据集里很少成为标注对象,模型没见过这种"冲突特征",自然容易把多个重叠目标错检成一个,或者直接漏掉被压在下层的物体。
我一开始从常见目标检测数据集里抽了一部分做预实验,专门挑那些带遮挡的图片来测,效果也不理想。后来才意识到,问题不在模型,而在数据分布。要解决这类场景,靠的是大量X光图像作为训练样本,让模型自己去学这种"半透明重叠"的视觉模式。这也是这个数据集存在的核心价值——它把真实安检场景中物品互相遮挡、旋转方向随机、背景干扰复杂的样本都涵盖了进去。
1.3 这个数据集适合谁,解决什么问题
这个10类别数据集,针对的是安检机最常见的检查对象:随身行李、快递包裹里的典型物品。我整理时参考了安检口实际频繁出现的物品类型,既有刀、剪刀、打火机这类需要警惕的品类,也有手机、钱包、钥匙、水瓶、笔记本电脑这类的常规随身物品。如果你正在做地铁、机场、车站、物流安检方向的视觉检测项目,或者想研究X光图像下的目标检测算法,这个数据集的目录格式和标注规范可以直接作为训练的起点。
2. 数据集构成:10个类别、样本分布与标注标准
2.1 十个类别具体有哪些,样本数量怎么分布
数据集一共标注了10个类别,完整类别名和样本标签映射如下:
| 类别ID | 英文标签 | 中文说明 | 标注框数量 |
|---|---|---|---|
| 0 | knife | 刀(含匕首、水果刀、菜刀等) | 2450 |
| 1 | scissors | 剪刀 | 1830 |
| 2 | lighter | 打火机 | 5200 |
| 3 | gun | 枪支(含模型、玩具枪外形) | 860 |
| 4 | phone | 手机 | 7800 |
| 5 | wallet | 钱包 | 4100 |
| 6 | keys | 钥匙(含钥匙串、钥匙扣) | 5600 |
| 7 | bottle | 水瓶/饮料瓶 | 3200 |
| 8 | laptop | 笔记本电脑 | 2100 |
| 9 | umbrella | 雨伞(含折叠伞) | 1500 |
整个数据集共包含12500张X光扫描图像,其中训练集10000张,验证集2500张,全部标注框总共约34600个。图像来源上,一部分来自可以合法获取的公开X光安检图像,另一部分是在受控环境下用安检机设备扫描模拟行李包采集的,之后做了统一的筛选、清洗和人工标注。像素尺寸以1024x768和1280x1024为主,训练时YOLOV5会做自适应缩放。
从样本分布能看出,手机、钥匙、打火机这类小件物品数量明显多,因为它们在真实行李包里出现频率高;而枪支因为天然少见,标注框数量最少,只有860个。这个不平衡在后面训练时带来了不少麻烦,我在第5部分专门说。
2.2 标注边界框时定的规则是什么
标注标准直接决定模型能学到什么。这个数据集的标注规则我总结下来大概四条,也是我认为在X光图像上必须坚持的:
第一,边界框采用常见的轴对齐矩形,紧贴物品的可见轮廓。如果物品之间有重叠,边界框按被遮挡后的可见区域来框,不推测被完全遮住的边缘。因为推测出的框会引入噪声,而且重叠区域本身就是模型要学习的"遮挡模式"。
第二,如果某个物品超过一半面积被其他物体挡住,就不标注。这样避免标注那种几乎看不见、人也无法确认边界的目标,数据集里的正样本质量会高很多。
第三,同一图像里同类物品出现多个,全部独立标注。比如一串钥匙上有七八把钥匙,如果整体呈一个密集簇,视为一个"钥匙串"目标;如果分散开,就分别框。
第四,对于"枪支"这个类别,凡外形一眼可辨的枪形物都归入此类,包括教学模型和玩具枪外观。真实安检场景中这一类需要模型给出尽可能高的检出率,所以宁可覆盖边界样本,也不能漏标。
2.3 训练集和验证集的划分方式
划分时我做了严格的空间隔离:同一批行李包裹的多次扫描图像,全部放入同一个子集,不允许一张在训练集、另一个角度在验证集。这样做是为了避免数据泄露——如果模型在训练时见过同一个包的近似图像,验证集精度会虚高,部署时立刻现原形。最终划分是按照扫描场景来源随机切分,训练集占80%,验证集占20%。
验证集里专门保留了大约300张高遮挡难例,这些图里包的物品数量多、重叠严重,是故意用来压力测试的。后面实测结果部分你会看到,模型在这些难例上的表现,跟整体平均数据差了不少,这很真实。
3. YOLOV5目录格式细节:从目录结构到标签坐标换算
3.1 标准目录结构长什么样
拿到数据集后,你第一件事应该看目录。完整结构是这样的:
security_xray/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ └── ... │ └── val/ │ ├── 010001.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── 000001.txt │ │ ├── 000002.txt │ │ └── ... │ └── val/ │ ├── 010001.txt │ └── ... └── data.yaml关键点就是images目录和labels目录严格一一对应。image文件夹下面按train和val分两级,labels目录同样按train和val分两级,每一张图像在labels里都有一个同名的txt文件。假如000001.jpg有对应的标注,就必须存在000001.txt;如果训练时提示"No labels found",八成是目录对不上或文件名不一致。
这里要特别说一下,YOLOV5在读取目录时,是根据data.yaml里train和val两个字段指向images目录,再根据images路径自动推断labels目录。所以你的目录结构必须保持这种"images和labels同级"的固定形式,否则YOLOV5的通用加载逻辑会找不到标签文件。
3.2 标签TXT文件里每一行代表什么
YOLOV5的标签文件是纯文本,每一行代表一个目标,格式是:
class_id x_center y_center width height其中x_center、y_center、width、height全部是归一化到0到1之间的浮点数,而class_id是整数。比如某一行是:
4 0.512 0.684 0.178 0.214意思是这个目标属于类别ID 4(手机),边界框中心点位于整张图的水平方向51.2%和垂直方向68.4%的位置,框的宽度占图像宽度的17.8%,高度占图像高度的21.4%。
如果你拿到的是VOC格式或者更原始的像素坐标标注,要转换成YOLO格式,直接用这几个公式:
x_center = (x_min + x_max) / 2 / image_width y_center = (y_min + y_max) / 2 / image_height width = (x_max - x_min) / image_width height = (y_max - y_min) / image_height注意这里x_min、x_max、y_min、y_max必须是原始像素坐标,且x_center对应的是边界框中心点的列位置,y_center对应的是行位置。不少人在转格式时会把x_center和y_center弄反,导致模型训练出来预测框全部偏到对角线方向。遇到这种诡异现象,先检查一下坐标是不是转对了。
我给这个数据集也附带了一个检查脚本,核心逻辑就是遍历所有标签文件,校验每一行的取值是否在合法范围内:
import os def check_labels(label_dir, num_classes=10): bad_files = 0 for fname in os.listdir(label_dir): if not fname.endswith('.txt'): continue path = os.path.join(label_dir, fname) with open(path, 'r') as f: lines = f.readlines() for line in lines: parts = line.strip().split() if len(parts) != 5: print(f'{fname}: 字段数不对 -> {line}') bad_files += 1 continue cls = int(parts[0]) vals = [float(x) for x in parts[1:]] if cls >= num_classes: print(f'{fname}: 类别ID越界 -> {line}') bad_files += 1 if not all(0.0 <= v <= 1.0 for v in vals): print(f'{fname}: 归一化坐标越界 -> {line}') bad_files += 1 print(f'检查完毕,共发现 {bad_files} 个问题文件')3.3 data.yaml配置文件中要写哪些字段
YOLOV5训练时靠data.yaml配置文件来定位数据。这个文件内容非常简单:
# 注意换成你自己机器上的绝对路径 train: /data/security_xray/images/train val: /data/security_xray/images/val nc: 10 names: ['knife', 'scissors', 'lighter', 'gun', 'phone', 'wallet', 'keys', 'bottle', 'laptop', 'umbrella']train和val字段指向的是images目录,而不是labels目录。YOLOV5会自动把路径中的images替换成labels来定位标注文件。nc表示类别总数,names是类别名称列表,顺序必须和标签文件里的class_id保持一致,否则预测结果里类别标签就对不上。
一个常见的坑是:train和val字段用了相对路径。如果你的终端当前目录不在YOLOV5工程下,训练时就容易报路径找不到。我的建议是直接在data.yaml里写绝对路径,或者用如下方式动态定位,避免换机器后踩坑:
# 动态路径写法,在训练命令里通过 --data 传入 train: ./security_xray/images/train val: ./security_xray/images/val总之,data.yaml文件里的路径问题,是新手最容易卡住的地方,务必确认train指向的目录里确有图像文件,val同理。
4. 用YOLOV5训练这个数据集:环境准备与参数配置
4.1 环境安装和数据校验
训练之前,先确认环境里已经装好了YOLOV5。我用的版本是ultralytics的YOLOV5工程,操作上先是克隆仓库再装依赖:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt如果你的机器有NVIDIA显卡,建议先装好对应版本的CUDA和PyTorch,再执行上面的requirements安装。纯CPU训练不是不能跑,但100个epoch在普通笔记本上可能要跑几十个小时,不太现实。我这边用的是单张RTX 3090,训练大约耗时4小时左右。
环境准备好后,第一步不是急着开训,而是做一次数据完整性校验。我会跑一个匹配检查,确保每张图像都存在对应的标签文件,并且标签没有空文件:
import os img_dir = 'security_xray/images/train' label_dir = 'security_xray/labels/train' missing = [] empty = [] 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): missing.append(img_name) elif os.path.getsize(label_path) == 0: empty.append(img_name) print(f'缺少标签的图像数: {len(missing)}') print(f'空标签文件数: {len(empty)}')如果你在训练时看到类似"WARNING: No labels found in ..."的提示,就用上面这个脚本查一下。在我整理数据的过程中,发现大约有几十张图存在空标签,后来都通过重新标注或者直接删除图像的方式处理掉了。Pytorch在数据加载时遇到空标签文件会直接跳过,这些图其实不会被利用,但会浪费加载时间。
4.2 基于YOLOV5s和YOLOV5m的训练参数推荐
针对安检X光场景,我训练时的推荐配置是YOLOV5s或YOLOV5m作为主模型。YOLOV5s速度快,推理时能跑到几十毫秒一帧,满足实时安检的需求;YOLOV5m精度更高,对密集小目标更友好,适合放在算力不是瓶颈的服务器上离线检测。我自己测试时,两个模型都训过,先给一个基本命令:
python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data /data/security_xray/data.yaml \ --weights yolov5s.pt \ --cache ram \ --name security_xray几个参数的选择理由说一下:
--img 640是YOLOV5的默认输入尺寸。数据里原始的1024x768图像会被缩放并letterbox到640x640再做训练。如果你的显卡显存较大,比如24GB,可以试试--img 896或--img 1024,对小目标的检测精度会有提升,我实测大概能带来mAP提升0.5到1个百分点。代价是训练时间和推理时间同步增加。
--batch 16在单卡3090上是比较稳妥的选择。显存小的可以用8或4,但batch太小时BN层的统计量会不太稳定,可能影响收敛,可以相应地把学习率调低一些。
--cache ram表示把图片缓存到内存中,能大幅减少训练时从硬盘反复读取图片的时间。如果内存不够,可以不加这个参数,或用--cache disk缓存到磁盘。
至于epochs,100轮在我的训练中基本够用。因为X光图像本身比较规整,不像真实场景的自动驾驶那么复杂,训练到80轮以后mAP涨幅就非常缓慢了。我还开了早停机制,如果40轮之内验证集指标没有明显提升,训练会自动停止:
python train.py ... --patience 304.3 针对安检场景调整数据增强策略
YOLOV5默认开启的增强策略包含mosaic、随机仿射变换、色彩抖动、水平翻转等。这些默认增强在自然图像上效果都不错,但面对X光图像,有两个地方需要调整。
第一,不要把旋转角度设太大。默认的旋转范围是正负90度,这在自然图像里问题不大,但在安检场景中,物品的物理形态决定了模型判断方向很重要。比如刀有刀柄和刀尖,伞有伞骨,你把它垂直翻转或旋转180度,模型学到的特征会混乱。我的做法是在训练时给--degrees参数传一个较小的值,比如15度到30度之间:
python train.py ... --degrees 30第二,mosaic增强尽量保留。X光图像里大量出现的是小物体密集场景,mosaic通过把四张图拼在一起的方式,让模型每轮迭代能看到更多小目标,对小物体检测很有效。不过mosaic也会把不同包裹的内容硬拼到一张图里,导致部分目标重叠、截断,这个就靠模型自身的鲁棒性去消化了。如果你的数据集中已经有很多密集目标,mosaic的作用就是锦上添花,开着问题不大。
另外水平翻转这个增强我建议保留,因为安检物品入包方向随机,左右镜像对模型来说应该是等价形态。色彩抖动那块我觉得可以关闭,X光图像本来就没有丰富的自然色彩,过度调整亮度色相反而可能把材质差异抹平。
5. 实测效果:检测精度、速度表现与典型失败案例
5.1 指标表现:mAP和推理速度
用YOLOV5s在100个epoch训练完成后,验证集上的整体结果是:
- mAP@0.5: 0.873
- mAP@0.5:0.95: 0.618
- 推理速度(单张640x640输入,3090显卡):约12毫秒
用YOLOV5m在同一批数据上训练,mAP@0.5提升到0.901,mAP@0.5:0.95提升到0.655,推理速度约20毫秒。这个结果说明,在算力允许的情况下,YOLOV5m更值得推荐。如果你要部署到边缘设备或者实时管线里,YOLOV5s反而更实用,毕竟漏检率受速度限制的影响较小。
分类别来看,手机、钥匙、打火机这三个类别的AP最高,基本都在0.9以上。原因很好理解,样本量最多,形状相对规整,而且这些物品在图中一般面积较小但边界清楚。剪刀和刀的AP稍微低一些,主要是形状多变,折叠刀和直刀的轮廓差异大,模型要学出"刀"的抽象概念难度更高。最低的是枪支和雨伞,枪支主要是因为样本少,雨伞则是因为折叠和展开两种形态在外观上差异太大,像是两个不同的类别。这个类别人均表现,我在下面的表格里列出来:
| 类别 | AP@0.5 |
|---|---|
| knife | 0.85 |
| scissors | 0.82 |
| lighter | 0.94 |
| gun | 0.71 |
| phone | 0.96 |
| wallet | 0.92 |
| keys | 0.95 |
| bottle | 0.87 |
| laptop | 0.88 |
| umbrella | 0.78 |
5.2 典型失败案例:重叠密集场景下的漏检
我重点分析了一个很典型的失败案例:一张包里同时塞了笔记本电脑、一个水瓶、一把雨伞和一把刀,四样东西几乎叠在同一个区域。模型最终只检测出了笔记本电脑和水瓶,雨伞被漏掉了,刀则被误检成剪刀。
问题的根源有两个层面。一是重叠导致的遮挡太严重,雨伞的伞骨在X光投影面上和笔记本电脑的金属框架几乎全部重叠,模型看到的是两种纹理的叠加,很难分割出独立目标;二是刀和剪刀这两个类别本身形状接近,都是一个长条状物体加一个把手,在低分辨率和重叠污染的图里,模型会把刀的轮廓特征错误匹配到剪刀上。
要缓解这个问题,一个直观的思路是把输入尺寸调大,比如把--img从640调整到1024,给模型更多像素去分辨细节。我在1024输入下重新测试,雨伞的AP从0.78提升到0.83,刀和剪刀的混淆也减少了。第二个思路是给这类困难样本分配更高的损失权重,比如在损失函数里对"重叠区域的目标框"加权,这个做法实现起来稍微复杂一些,需要改动YOLOV5的损失计算逻辑,但对于追求极致精度的项目是值得的。
5.3 误检情况:模型把非目标物体当成违禁品
另一个观察是误检主要集中在金属物品上。因为X光图像里金属的高亮特征太明显,模型很容易把钥匙串、硬币、金属拉链这些没有标注过的物品误判为"打火机"或"刀"。比如一枚纽扣电池在投影图上呈现为一个小亮圆,跟打火机内部结构有点相似,就被模型高置信度检成了打火机。
这说明模型并没有真正学会"打火机"的结构特征,而是在学"图片里有个高亮的小圆点"这个表象。想要压制这类误检,一种办法是增加负样本训练,让模型学"哪些高亮物体不是目标"。我在训练集中加入了几百张没有目标或者只含拉链、硬币、钥匙扣等干扰物的空包X光图,但标注文件是空的,让模型接触这类负样本后,误检数明显下降。
你可以用下面的简单命令直接测试训练好的模型,看看在真实图片上的效果:
python detect.py \ --weights runs/train/security_xray/weights/best.pt \ --source /data/security_xray/images/val/010001.jpg \ --conf-thres 0.25--conf-thres的默认值通常是0.25,如果你发现误检比较多,可以适当调高到0.35或0.4。不过调高阈值会同时降低召回率,需要在具体场景里做平衡。
6. 反复踩过的坑和针对性的解决思路
6.1 类别不平衡:样本少的类别AP上不去
我前面提过,数据集中手机、钥匙、打火机样本多,而枪支、雨伞、剪刀这几个类别样本少。直接用原始数据训练,小样本类别的AP明显低于大样本类别,而且容易在训练中期卡住不再提升。对此我试了几种方法,比较有效的是给少样本类别加权重。
YOLOV5本身没有直接的类别权重参数,但可以在训练前用数据配置文件里添加一个可选的weight字段,或者用代码给损失函数按类别加权。更简单的办法是:在训练时开启--cls 0.5参数调节分类损失权重,同时用图像级复制增强——把少样本类别的图像复制几份随机增强后混入训练集。我在保持epochs不变的前提下,把含有枪支的图像复制了两遍,AP从0.71提高到0.76,效果比调损失权重更明显,实现也简单。
6.2 X光图像通道与灰度问题
不少安检机输出的原始图像是14位灰度图,而YOLOV5训练时默认以3通道RGB图像为输入。如果你直接把一个单通道灰度图喂进去,可能在数据集加载阶段就报错,或者在训练时模型看到的是伪三通道重复图像,效果不受影响但会浪费一点计算量。
遇到这种情况,推荐在整理数据集时统一做一次转码,把灰度图转成三通道图像再保存。我写了一个简单的批量处理脚本,在数据集打包前就处理完了:
from PIL import Image import os def convert_gray_to_rgb(src_dir, dst_dir): os.makedirs(dst_dir, exist_ok=True) for fname in os.listdir(src_dir): if not fname.lower().endswith(('.jpg', '.jpeg', '.png')): continue img = Image.open(os.path.join(src_dir, fname)) if img.mode != 'RGB': img = img.convert('RGB') img.save(os.path.join(dst_dir, fname))还有一点,如果你的图像是16位PNG格式,PIL默认可能无法直接读取,建议提前转成8位JPG或PNG。我整理数据时就遇到过一批16位PNG,YOLOV5训练过程中直接报"image file is truncated"或"cannot identify image file"。后来用OpenCV批量读取再转存为8位JPG,问题就解决了。
6.3 重叠密集场景中的NMS与重叠抑制问题
YOLOV5默认的NMS阈值是IoU为0.45。在普通场景里,这个值比较合理,它能帮模型去掉重复框。但在安检X光场景里,物品之间的实际IoU可能本身就很高,比如钥匙串里的多把钥匙、叠放的雨伞和背包,它们的边界框天然大面积重叠。模型检测出的两个真实目标框,因为IoU超过0.45,被NMS当成同一个目标,直接抑制掉一个,这就造成了漏检。
我在训练后推理阶段,专门把NMS的IoU阈值下调到0.3,发现重叠场景下的检出数量明显增加。虽然也出现了一些冗余框,但整体漏检率下降。如果你用的是YOLOV5的detect.py,可以直接修改推理代码里的iou=0.45为iou=0.3。如果自己接后处理,也建议把这一项纳入调参范围。
6.4 标注噪声与标签清洗
X光图像因为透视重叠,人工标注的边界框质量参差不齐。我做过一次标签抽查,发现大约有2%的标注框存在明显问题:比如框住了部分无关背景、框的中心点有偏移、或者把一个目标框得过大把相邻目标也包了进去。这些噪声对训练的影响,比我想象中更大——尤其是中心点偏移,会直接干扰anchor的正负样本分配。
我的清洗方法是写脚本统计每个框的宽高比和面积分布,找出异常值人工复核。比如正常情况下刀类的宽高比大约在3到8之间,如果出现一个宽高比接近1的"刀"框,那多半是标错了。面积异常大的框也值得检查。这个清洗过程虽然耗时,但能明显提升最终模型的精度。我清洗掉约1%的问题标签后,mAP@0.5提升了约0.6个百分点。
6.5 空间隔离与数据泄露带来的假象
我在划分训练集和验证集时,特意避免了同一个包裹出现在两个子集中,但实际整理过程中,有的包裹从不同角度、不同速度扫描出来的图像非常多。如果我不做空间隔离,验证集上可能会出现接近100%的mAP,给你一种"模型已经完美"的错觉,等你拿到真实安检机上一测,精度立刻掉回去不少。
所以我也建议你,不管是在这个数据集上继续微调,还是在自建数据集上训练,划分数据时一定要按"扫描场景"分组,而不是按"图像文件"随机切分。具体操作很简单:先给每个包裹分配一个唯一ID,把该ID下的所有图像归到同一个子集,再做随机划分。这个细节决定你的验证指标到底有多少参考价值,值得多花几分钟处理。
如果你打算拿这个数据集做起点,我个人的建议是:先跑通标准训练流程,把baseline精度记录下来,然后再针对你的实际场景去调输入尺寸、增强策略和置信度阈值。安检X光检测跟通用目标检测有个很大的不同——你最终关心的往往不是所有类别的平均精度,而是那几种违禁品的召回率。宁可误检多一点,也不能让刀和枪支从眼皮底下溜过去。这个取舍,要在数据处理和阈值设置阶段就想清楚。
本文还有配套的精品资源,点击获取
