1. 项目概述:YOLOv5在机场安检中的实战应用
机场安检作为航空安全的第一道防线,每天需要处理海量行李物品的检查工作。传统人工安检模式存在效率低下、漏检率高、安检员工作强度大等问题。我在实际参与某国际机场智能化改造项目时,发现X光机操作员平均每6秒就要判断一件行李的安全性,长时间工作后漏检率会显著上升30%以上。
基于这个痛点,我们团队尝试将YOLOv5目标检测技术应用于X射线图像分析,开发了一套危险品实时检测系统。实测表明,在保持98%检测准确率的同时,系统处理单帧图像仅需40ms,完全满足机场实时安检的时效要求。这个项目从数据采集到最终部署历时4个月,期间我们攻克了多个技术难点,包括小目标检测优化、多类别物品区分、复杂背景干扰等问题。
2. 技术选型:为什么选择YOLOv5?
2.1 主流目标检测算法对比
在项目初期,我们对比了Faster R-CNN、SSD和YOLO系列等主流算法:
| 算法 | 推理速度(FPS) | mAP@0.5 | 模型大小 | 硬件要求 |
|---|---|---|---|---|
| Faster R-CNN | 7 | 76.8 | 200MB | 高 |
| SSD512 | 22 | 75.8 | 100MB | 中 |
| YOLOv5s | 140 | 76.8 | 27MB | 低 |
实测数据基于COCO数据集,硬件环境为RTX 2080Ti
2.2 YOLOv5的独特优势
YOLOv5在安检场景中展现出三大核心优势:
-
卓越的实时性能:YOLOv5s版本在1080p分辨率下可达140FPS,完全满足机场安检的实时性要求。我们在实际测试中发现,即使是配置较低的X光机工控机(i5-8500+GTX1050),也能稳定运行在45FPS以上。
-
出色的精度平衡:通过改进的PANet特征金字塔和自适应锚框计算,YOLOv5对小尺寸危险品(如刀片、打火机)的检测精度比YOLOv4提升约12%。
-
便捷的工程部署:PyTorch框架的生态优势加上YOLOv5完善的export.py工具,可以轻松转换为ONNX、TensorRT等格式,适应不同硬件平台。
3. 数据准备与增强策略
3.1 数据集构建
我们从三个渠道获取了初始数据:
- 公开数据集:SIXray(含1,059,231张X光图像)
- 合作机场提供的脱敏数据(约50,000张)
- 自建模拟数据集(使用不同角度拍摄的200种常见物品)
经过清洗后得到包含6大类、32小类危险品的标注数据集:
python复制# 类别分布示例
classes = {
'刀具': ['水果刀', '瑞士军刀', '匕首'],
'枪支': ['手枪', '步枪零件'],
'液体': ['易燃液体', '超量液体'],
'电子设备': ['改装手机', '充电宝'],
'工具': ['钳子', '扳手'],
'其他': ['打火机', '爆竹']
}
3.2 数据标注技巧
使用CVAT工具标注时,我们总结了以下经验:
- 对于重叠物品采用"显露部分优先"原则
- 金属物品标注边界向内收缩2-3像素以抵消X光散射效应
- 对半透明物品采用"实体+轮廓"双标注法
3.3 数据增强方案
针对X光图像特性,我们设计了特殊的增强策略:
yaml复制# data/hyp.scratch.yaml
augment:
hsv_h: 0.015 # 调整色调模拟不同X光机参数
hsv_s: 0.7 # 增强饱和度突出金属物品
hsv_v: 0.4 # 控制亮度避免过曝
degrees: 5 # 小角度旋转适应行李摆放差异
translate: 0.05 # 小幅平移增强位置鲁棒性
scale: 0.2 # 尺度变化适应物品大小差异
shear: 2 # 剪切变换模拟传送带运动
perspective: 0.0005 # 透视变换
flipud: 0.3 # 上下翻转
fliplr: 0.5 # 左右翻转
mosaic: 1.0 # 使用mosaic增强
mixup: 0.1 # 控制mixup比例
4. 模型训练与优化
4.1 环境配置
我们使用Docker构建了可复现的训练环境:
dockerfile复制FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
RUN apt-get update && apt-get install -y \
python3.8 \
python3-pip \
git \
libgl1-mesa-glx
RUN pip3 install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html
RUN git clone https://github.com/ultralytics/yolov5 && \
cd yolov5 && \
pip install -r requirements.txt
4.2 关键训练参数
bash复制python train.py \
--img 640 \
--batch 32 \
--epochs 300 \
--data airport.yaml \
--cfg models/yolov5s.yaml \
--weights yolov5s.pt \
--cache \
--device 0,1 \
--adam \
--sync-bn \
--bbox_interval 10
特别说明几个关键参数选择:
--img 640:平衡检测精度和推理速度--adam:相比SGD在早期收敛更快--sync-bn:多GPU训练时保持BN层同步--bbox_interval 10:每10个batch验证一次bbox精度
4.3 模型优化技巧
- 小目标检测优化:
- 在Backbone末端增加一个160x160的特征图输出
- 使用BiFPN替换原PANet
- 添加CBAM注意力模块
python复制# models/yolov5s_custom.yaml
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # 增加浅层特征融合
[-1, 3, C3, [512, False]],
[-1, 1, CBAM, [512]], # 添加注意力
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]],
[-1, 3, C3, [256, False]],
[-1, 1, CBAM, [256]], # 添加注意力
[-1, 1, Conv, [128, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 2], 1, Concat, [1]],
[-1, 3, C3, [128, False]],
[-1, 1, CBAM, [128]], # 添加注意力
[-1, 1, Conv, [64, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 0], 1, Concat, [1]],
[-1, 3, C3, [64, False]],
[-1, 1, Conv, [32, 1, 1]]]
- 类别不平衡处理:
- 使用Focal Loss替换原BCE Loss
- 对稀有类别(如枪支)设置3倍采样权重
- 采用Class-aware采样策略
5. 系统集成与部署
5.1 系统架构设计
code复制X光机 → 图像采集卡 → 检测服务器 → 报警终端
↑
(RTSP视频流)
我们采用多进程架构:
- 进程1:负责图像采集和预处理(OpenCV)
- 进程2:运行YOLOv5模型推理
- 进程3:处理报警逻辑和界面更新
5.2 关键实现代码
python复制class Detector:
def __init__(self):
self.model = torch.hub.load('ultralytics/yolov5', 'custom',
path='best.pt', force_reload=True)
self.model.conf = 0.65 # 置信度阈值
self.model.iou = 0.45 # NMS阈值
def process_frame(self, img):
# 预处理
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = letterbox(img, new_shape=640)[0]
# 推理
results = self.model(img)
# 后处理
detections = []
for *xyxy, conf, cls in results.xyxy[0]:
if conf > self.model.conf:
detections.append({
'bbox': [int(x) for x in xyxy],
'score': float(conf),
'class_id': int(cls),
'class_name': self.model.names[int(cls)]
})
return detections
5.3 性能优化技巧
- TensorRT加速:
bash复制python export.py --weights best.pt --include engine --device 0 --half
- FP16精度下推理速度提升2.3倍
- 内存占用减少40%
- 多流并行处理:
- 使用Python的multiprocessing模块
- 每个摄像头流分配独立进程
- 共享内存传递检测结果
6. 实际应用效果
6.1 性能指标
| 指标 | 数值 | 测试条件 |
|---|---|---|
| mAP@0.5 | 98.2% | 测试集2000张 |
| 推理速度 | 45FPS | i7-10700+RTX3060 |
| 漏检率 | 0.8% | 连续24小时测试 |
| 误报率 | 1.2% | 包含10000件正常行李 |
6.2 界面展示
我们开发了基于PyQt的监控界面,主要功能包括:
- 实时检测画面显示
- 危险品自动标注(红框高亮)
- 声音+弹窗报警
- 历史记录查询
实际部署中发现,将报警声音设置为不同于其他系统提示音的独特音效,能显著提高安检员响应速度
7. 常见问题与解决方案
7.1 金属物品误检问题
现象:金属纽扣、拉链等常被误判为刀具
解决方案:
- 在数据标注时明确区分"危险金属"和"普通金属"
- 添加形状特征判断(长宽比>4:1才视为刀具)
- 引入二次验证机制(仅当同时检测到握柄特征才确认)
7.2 重叠物品漏检问题
现象:多个物品重叠时小目标容易被忽略
优化方法:
- 训练时增加重叠物品的mosaic增强
- 在推理时采用滑动窗口+多尺度检测
- 后处理阶段使用soft-NMS替代传统NMS
7.3 模型部署内存泄漏
现象:长时间运行后内存持续增长
排查步骤:
- 使用memory_profiler定位泄漏点
- 发现是OpenCV的imdecode未释放
- 添加显式内存回收:
python复制def safe_imdecode(buffer):
img = cv2.imdecode(np.frombuffer(buffer, np.uint8), cv2.IMREAD_COLOR)
del buffer # 显式释放
gc.collect() # 手动触发垃圾回收
return img
8. 项目演进方向
- 多模态融合:结合红外成像和金属探测数据
- 3D检测:使用CT扫描数据实现立体检测
- 行为分析:通过乘客微表情辅助判断
- 知识图谱:构建违禁品关联规则库
在实际部署中我们发现,将检测系统与机场行李系统联动(如在检测到危险品时自动暂停传送带),能进一步提升处置效率。目前系统已在三个机场试运行,平均每班次可减少人工开箱检查次数约40%,大幅提升了通关效率。
