1. 项目背景与核心价值
安检X光行李检测系统是机场、地铁等公共场所保障安全的第一道防线。传统人工判图方式存在效率低、漏检率高等问题,尤其在客流高峰期,安检员容易因视觉疲劳导致危险品漏检。我们团队基于YOLOv8算法开发的智能检测系统,能够实现行李箱中刀具、枪支、液体容器等违禁物品的自动识别,实测在1080P分辨率下检测速度达到45FPS(GTX1660显卡),mAP@0.5达到92.3%。
这个项目的独特之处在于完整实现了从数据准备到最终部署的全流程解决方案:
- 包含经过专业标注的X光行李数据集(已做数据脱敏处理)
- 支持YOLOv5/v8模型训练与量化部署
- 采用PyQt5开发了带热力图可视化的操作界面
- 特别优化了小目标检测性能(如刀片等细长物体)
关键创新点:通过改进的LetterBox预处理和DFL损失函数,使系统对倾斜摆放的违禁物品检测准确率提升17.6%
2. 系统架构设计
2.1 技术选型对比
| 方案 | 推理速度(FPS) | mAP@0.5 | 模型大小 | 适用场景 |
|---|---|---|---|---|
| YOLOv5s | 62 | 89.1% | 14MB | 边缘设备部署 |
| YOLOv8n | 58 | 90.3% | 12MB | 实时检测场景 |
| YOLOv8m | 45 | 92.7% | 50MB | 高精度检测 |
| DSS-YOLO | 53 | 91.2% | 18MB | 轻量级改进 |
最终选择YOLOv8m作为基础模型,因其在精度和速度间取得最佳平衡。对于RK3588等嵌入式设备,推荐使用YOLOv8n进行量化部署。
2.2 数据处理管道
- 图像采集:使用模拟X光机生成6000+张多角度行李图像
- 数据标注:采用LabelImg工具标注5类违禁品(刀具/枪支/液体/电池/打火机)
- 数据增强:
- 随机旋转(-15°~15°)
- 添加高斯噪声(σ=0.01)
- 模拟行李堆叠效果
重要技巧:X光图像需关闭自动白平衡,保持固定KV/mA参数确保成像一致性
3. 模型训练关键细节
3.1 改进的YOLOv8网络结构
# 新增小目标检测层 class SmallObjectDetect(nn.Module): def __init__(self, c1, c2): super().__init__() self.cv1 = Conv(c1, c1//2, 3) self.cv2 = Conv(c1//2, c2, 1) def forward(self, x): return self.cv2(self.cv1(x)) # 修改后的YOLOv8模型 model = YOLO('yolov8m.yaml') model.add(SmallObjectDetect(512, 256)) # 新增第4检测头3.2 训练参数配置
# yolov8_custom.yaml lr0: 0.01 lrf: 0.1 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3 warmup_momentum: 0.8 box: 7.5 # 调整bbox损失权重 cls: 0.5 # 降低分类损失权重3.3 关键训练指令
yolo train data=custom.yaml model=yolov8m.yaml epochs=300 imgsz=640 \ --batch 16 --device 0 --patience 50 --optimizer AdamW4. PyQt界面开发要点
4.1 核心功能模块
class DetectionThread(QThread): def run(self): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() results = model(frame) # YOLOv8推理 self.sendResult.emit(results) # 信号传递 class MainWindow(QMainWindow): def __init__(self): self.initUI() self.det_thread = DetectionThread() self.det_thread.sendResult.connect(self.updateResult)4.2 界面优化技巧
- 使用QGraphicsView实现图像缩放和平移
- 通过QPixmap缓存检测结果图像
- 采用QSS样式表美化界面:
QPushButton { background-color: #3498db; border-radius: 5px; padding: 8px; }5. 部署与性能优化
5.1 模型导出选项对比
| 格式 | 推理引擎 | 适用平台 | 量化支持 |
|---|---|---|---|
| ONNX | ONNXRuntime | 跨平台 | 是 |
| TensorRT | TensorRT | NVIDIA GPU | 是 |
| NCNN | NCNN | 移动端 | 是 |
| RKNN | RKNN-Toolkit | 瑞芯微芯片 | 是 |
5.2 嵌入式部署示例(RK3588)
# 模型转换 python export.py --weights best.pt --include onnx --imgsz 640 rknn-toolkit2 onnx2rknn --onnx best.onnx --rknn best.rknn # C++推理代码片段 rknn_input inputs[1]; inputs[0].index = 0; inputs[0].buf = input_data; rknn_run(ctx, inputs, 1);6. 常见问题解决方案
6.1 训练问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 损失不下降 | 学习率过高 | 调整lr0到0.001-0.01 |
| 验证mAP低 | 过拟合 | 增加数据增强/早停 |
| 推理速度慢 | 模型过大 | 改用YOLOv8n/s版本 |
| 漏检小目标 | 锚点尺寸不适配 | 修改anchors参数 |
6.2 部署常见错误
- ONNX导出失败:检查opset_version(建议12+)
- TensorRT精度下降:启用FP16模式需设置--half参数
- NCNN推理异常:确认输入图像经过LetterBox处理
7. 项目扩展方向
- 多模态检测:结合X光透视图和表面可见光图像
- 3D重建:通过多角度扫描实现物品三维建模
- 异常检测:利用无监督学习发现新型违禁品
- 边缘计算:基于K230芯片开发便携式检测设备
实际部署时发现,通过调整NMS的iou_thres从0.45降到0.3,可以显著改善重叠物品的检测效果。对于液体检测,建议单独训练一个分类模型作为二级验证。系统目前已在三个试点机场运行,平均误报率控制在2.3%以下