1. 项目概述:X光安检场景下的危险物品检测
在安检领域,X光成像技术一直是核心检测手段。传统的人工判图方式存在效率低、漏检率高等问题,尤其面对海量行李时,安检员容易因视觉疲劳导致判断失误。我们团队基于YOLOv5构建的自动检测系统,专门针对X光图像中的8类危险物品(刀、剪刀等)进行实时识别,实测在1080P分辨率下单帧处理时间仅15ms,满足机场、地铁等场景的实时性要求。
这个项目的核心价值在于三点:首先,针对X光图像特有的灰度特征和物品重叠问题,我们优化了YOLO的预处理模块;其次,标注数据集时采用穿透轮廓与材质特征双重标注策略;最后,部署阶段通过TensorRT加速使模型在国产化硬件(如华为昇腾310)上也能保持90%以上的原始精度。目前该系统已在三个省级机场完成试点,误报率控制在行业要求的0.5%以下。
2. 数据集构建与标注规范
2.1 数据采集与清洗
我们收集了超过20万张真实安检X光图像,覆盖不同品牌设备(包括Smiths HI-SCAN、Rapiscan Systems等)的成像结果。由于涉及隐私保护,所有个人信息均通过以下处理流程脱敏:
- 使用OpenCV进行人脸和证件区域的马赛克处理
- 对行李内部文本信息进行高斯模糊
- 通过直方图均衡化统一不同设备的成像风格
特别注意:原始数据中约30%的图像因物品堆叠严重需人工筛选,最终保留8.7万张合格样本。数据增强时采用针对X光特性的方法:
- 模拟不同穿透强度(调整gamma值0.7-1.3)
- 添加金属伪影(使用放射状噪声模板)
- 物品重叠合成(泊松图像编辑)
2.2 标注标准与工具优化
采用改进的LabelImg标注工具,主要调整包括:
- 标签保存路径自动按
/类别/设备型号/日期分级存储 - 支持穿透深度标注(0-255灰度值区间划分)
- 添加材质属性标记(金属/液体/复合材料)
标注规范示例表:
| 类别 | 英文标签 | 最小像素面积 | 穿透深度范围 | 典型误标示例 |
|---|---|---|---|---|
| 刀具 | knife | 32×32 | 120-200 | 金属尺子 |
| 剪刀 | scissor | 40×40 | 90-180 | 指甲钳 |
3. 模型训练关键技术
3.1 YOLOv5架构改进
在YOLOv5s基础上进行三项关键修改:
- 输入层:替换常规RGB卷积为单通道专用层,计算公式:
class XrayConv(nn.Module): def __init__(self): super().__init__() self.conv = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3) self.gamma = nn.Parameter(torch.ones(1)) # 可学习穿透系数 - Neck部分:添加自研的DenseFPN模块,提升小目标检测能力
- 损失函数:结合穿透深度预测增加MSE分支损失
3.2 训练参数配置
使用超参进化算法得到的优化配置:
lr0: 0.0032 lrf: 0.12 momentum: 0.843 weight_decay: 0.00036 warmup_epochs: 3.2 batch_size: 48 # 使用A100显卡时关键训练技巧:
- 采用渐进式图片尺寸策略(640→896→1280)
- 每轮验证时使用Focal-EIoU指标替代常规mAP
- 对剪刀类样本应用OHEM(在线难例挖掘)
4. 部署落地实践
4.1 跨平台加速方案
针对不同硬件平台的优化对比:
| 平台 | 推理引擎 | 量化方式 | 帧率(FPS) | 显存占用 |
|---|---|---|---|---|
| NVIDIA Jetson | TensorRT | INT8 + QAT | 62 | 1.2GB |
| 华为昇腾310 | ACL | FP16 | 58 | 0.9GB |
| 国产CPU | ONNX Runtime | 动态量化 | 17 | - |
4.2 实际场景调优
在深圳宝安机场部署时遇到的典型问题及解决方案:
误报问题:雨伞骨架触发刀具报警
- 解决方法:增加局部形状特征匹配(Hu矩分析)
漏检问题:塑料刀具穿透度不足
- 解决方法:在预处理阶段增强低对比度区域(CLAHE算法)
性能波动:早晚班X光机参数差异
- 解决方法:动态调整gamma值的自适应归一化模块
5. 效果评估与行业对比
我们在自建测试集(含2万张图像)上的性能表现:
| 指标 | 本系统 | 传统CV方案 | 商业软件A |
|---|---|---|---|
| mAP@0.5 | 98.2% | 76.5% | 95.7% |
| 小目标检出率 | 93.4% | 58.1% | 89.2% |
| 推理延迟(ms) | 15 | 120 | 28 |
| 模型大小(MB) | 14.7 | - | 256 |
目前系统在三个典型场景的日处理量:
- 地铁安检通道:约5,000件/天
- 机场托运行李:约12,000件/天
- 物流分拣中心:超30,000件/天
6. 常见问题与解决记录
6.1 训练阶段问题
Q1:样本不均衡导致剪刀类别AP低
- 现象:剪刀AP仅65%,其他类均>90%
- 排查:发现80%剪刀样本处于重叠状态
- 解决:采用Copy-Paste增强策略,AP提升至89%
Q2:梯度爆炸发生在第15轮
- 错误日志:
RuntimeError: NaN detected in loss - 原因分析:自适应gamma参数导致数值不稳定
- 修复方案:添加梯度裁剪(max_norm=10.0)
6.2 部署阶段问题
Q3:Jetson设备上出现内存泄漏
- 现象:连续运行8小时后帧率下降50%
- 诊断工具:
tegrastats --interval 1000 - 根本原因:TensorRT的dynamic_shape未正确释放
- 解决方案:强制每1000次推理后重建上下文
Q4:华为昇腾310上精度下降
- 现象:FP32→FP16转换后mAP下降8%
- 调试步骤:
- 使用ATC工具分析逐层精度损失
- 识别出SPPF层的数值溢出
- 最终方案:对该层保持FP32计算
7. 未来优化方向
当前正在测试的改进方案包括:
- 多视角融合检测:结合双能X光信息
- 3D轮廓重建:基于行李通过时的连续帧
- 异常物品主动学习:针对新型危险品自动更新模型
在实际部署中发现,早晨时段金属物品检出率会降低约2%。经过排查发现与设备预热不足导致的成像质量波动有关,目前正在开发基于物理模型的补偿算法。另一个有意思的现象是,系统对瑞士军刀的检测准确率显著高于普通水果刀,这与训练数据中军刀样本轮廓更典型有关。我们正在通过合成数据增强来解决这类长尾问题。