1. 项目背景与核心价值
交通标志识别作为智能驾驶系统的"眼睛",直接影响着车辆对道路环境的理解能力。TT100K数据集作为目前亚洲地区规模最大的交通标志基准库,包含10万张真实道路场景图像和221类标志。但在实际工程应用中,我们发现原始数据集存在三个典型问题:类别冗余(如不同光照下的同一标志被分为多类)、标注噪声(部分标志被错误标记)以及类别不平衡(常见标志样本量远超冷门标志)。这些问题直接导致模型在实际道路测试中出现误检和漏检。
针对上述痛点,我们设计了一套完整的解决方案:
- 基于视觉相似度和语义相关性的数据清洗流程
- 改进的YOLOv5s网络结构
- 配套的PyQt5可视化系统 实测表明,清洗后的数据集使模型mAP@0.5提升17.6%,而定制算法在嵌入式设备Jetson Xavier NX上达到38FPS的实时性能。
2. 数据集深度清洗实战
2.1 噪声过滤与类别合并
原始TT100K的221类中,约15%的类别样本量不足30张,这类样本往往导致模型过拟合。我们采用层次聚类算法进行类别合并:
from sklearn.cluster import AgglomerativeClustering import cv2 def visual_clustering(images, n_clusters=5): # 使用ORB特征提取器 orb = cv2.ORB_create() descriptors = [orb.detectAndCompute(img, None)[1] for img in images] # 构建特征矩阵 X = np.vstack([d.mean(axis=0) for d in descriptors if d is not None]) # 层次聚类 cluster = AgglomerativeClustering(n_clusters=n_clusters) labels = cluster.fit_predict(X) return labels关键参数说明:
- ORB特征比SIFT更适合实时系统
- 聚类阈值设为0.85(余弦相似度)
- 保留至少100张样本的类别
2.2 数据增强策略
针对限速标志等关键类别,采用定向增强:
albumentations.Compose([ # 模拟雨天模糊 RandomRain(drop_length=5, blur_value=3, p=0.3), # 运动模糊 MotionBlur(blur_limit=7, p=0.2), # 透视变换 Perspective(scale=(0.05, 0.1), p=0.5), ])特别注意:禁止对"禁止通行"等禁令类标志做透视变换,避免改变其标准几何形状
3. 算法优化关键技术
3.1 网络结构改进
在YOLOv5s基础上进行三处关键修改:
- 替换Backbone为MobileNetV3的轻量化设计
- 在Neck部分增加CBAM注意力模块
- 采用SIoU损失函数替代CIoU
class CBAM(nn.Module): def __init__(self, channels, reduction=16): super().__init__() self.ca = ChannelAttention(channels, reduction) self.sa = SpatialAttention() def forward(self, x): x = self.ca(x) * x x = self.sa(x) * x return x3.2 迁移学习技巧
采用两阶段训练策略:
- 第一阶段:在GTSRB数据集(德国交通标志)上预训练
- 第二阶段:使用TT100K微调最后三层
实测表明该方法可使小样本类别识别率提升23%
4. 系统实现与部署
4.1 PyQt5交互界面设计
核心功能模块:
graph TD A[视频流输入] --> B(帧提取) B --> C{检测模式} C -->|实时| D[YOLOv5推理] C -->|单图| E[图像预处理] D --> F[结果可视化] E --> F F --> G[日志记录]关键代码片段:
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.model = load_model('best.pt') self.video_thread = VideoThread() self.video_thread.change_pixmap.connect(self.update_image) @pyqtSlot(np.ndarray) def update_image(self, cv_img): results = self.model(cv_img) qt_img = convert_cv_qt(results.render()[0]) self.label.setPixmap(qt_img)4.2 边缘设备优化
在Jetson Xavier NX上的部署要点:
- 使用TensorRT加速:
python export.py --weights best.pt --include engine --device 0- 启用DLA核心:
import tensorrt as trt runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING)) engine = runtime.deserialize_cuda_engine(plan) context = engine.create_execution_context()5. 实测性能对比
| 指标 | 原始模型 | 优化后 | 提升幅度 |
|---|---|---|---|
| mAP@0.5 | 0.683 | 0.803 | +17.6% |
| 推理速度(FPS) | 28 | 38 | +35.7% |
| 内存占用(MB) | 520 | 310 | -40.4% |
典型误检案例处理方案:
- 相似标志混淆(如限速60 vs 80):
- 增加数字区域ROI校验
- 应用Tesseract OCR二次验证
- 遮挡标志漏检:
- 引入Copy-Paste数据增强
- 添加遮挡敏感度损失项
6. 工程经验总结
在实际部署中我们发现了几个教科书上不会提及的关键点:
- 温度影响:当设备持续工作超过2小时后,模型推理速度会下降约15%。解决方案是添加散热风扇并启用动态频率调节:
sudo jetson_clocks --show光线条件:黄昏时段的识别准确率比正午低22%。我们通过以下方式缓解:
- 训练集增加Gamma变换样本
- 在预处理中引入AutoContrast
模型更新策略:采用"影子模式"运行新模型,即同时运行新旧模型但不切换输出,直到新模型在验证集上持续3天保持95%以上准确率。