YOLOv4-TT100K 中国交通标志识别 (Ascend NPU Adapted)
YOLOv4 中国交通标志识别模型,专为中国复杂交通环境设计,已在华为昇腾 NPU (Ascend910B) 上完成适配与验证。
模型简介
YOLOv4-TT100K 在 YOLOv4 算法基础上进行优化,适应中国特有的交通标志识别需求。模型采用 CSPDarknet53 骨干网络、SPP 空间金字塔池化、PANet 路径聚合网络,结合多尺度预测机制,显著提升了对不同尺寸和角度交通标志的识别精度。
在 CCTSDB 2021 数据集上的测试显示:
- 检测准确率: 96.62%
- 召回率: 79.73%
- F-1 分数: 87.37%
- mAP: 92.77%
- 帧率: ~81 FPS (GPU) / ~40 FPS (Ascend NPU)
昇腾 NPU 适配信息
| 项目 | 详情 |
|---|
| 适配设备 | Ascend910B (华为 Atlas 800 A2) |
| CANN 版本 | 8.5.1 |
| torch_npu 版本 | 2.9.0.post1 |
| PyTorch 版本 | 2.9.0 |
| 输入尺寸 | 608×608 |
| 类别数 | 45 类中国交通标志 |
| 模型大小 | 63.9M 参数 |
| NPU 显存占用 | ~931 MB (峰值) |
性能基准 (Ascend910B)
| 指标 | NPU (Ascend910B) | 说明 |
|---|
| 端到端延迟 | 24.76 ms | 含同步开销 |
| 吞吐量 | 40.38 FPS | Batch=1 |
| P99 延迟 | 29.35 ms | 长尾延迟 |
| 最小延迟 | 22.10 ms | 最优情况 |
精度验证 (NPU vs CPU)
| 指标 | 结果 | 状态 |
|---|
| 最大绝对误差 | < 0.012 | ✅ 通过 |
| 平均绝对误差 | < 0.002 | ✅ 通过 |
| 余弦相似度 | > 0.99999 | ✅ 通过 |
| 精度偏差 | < 0.01% | ✅ 通过 |
NPU 推理输出与 CPU 参考输出高度一致,精度损失可忽略不计。
快速开始
环境要求
# 确认 NPU 环境
npu-smi info
# Python 环境
pip install torch==2.9.0 torch_npu==2.9.0.post1
pip install opencv-python numpy modelscope
下载模型
pip install modelscope
modelscope download --model Genius-Society/yolov4_tt100k --local_dir ./yolo_model
NPU 推理
import torch
import torch_npu
from yolov4_pytorch import YOLOv4
# 加载模型
model = YOLOv4('yolov4-tt100k.cfg')
model.load_darknet_weights('yolov4-tt100k_best.weights')
model.eval()
model = model.to('npu:0')
# 推理
import cv2
import numpy as np
img = cv2.imread('traffic_sign.jpg')
img = cv2.resize(img, (608, 608))
tensor = torch.from_numpy(img.transpose(2,0,1)/255.0).float().unsqueeze(0).to('npu:0')
with torch.no_grad():
outputs = model(tensor)
命令行推理
# 图片推理
python3 inference.py --source traffic.jpg --output result.jpg --device npu
# 性能基准测试
python3 inference.py --device npu --benchmark --benchmark-iters 100
# 精度评估
python3 evaluate.py --device npu --iters 100
模型架构
YOLOv4-TT100K
├── CSPDarknet53 Backbone (Mish activation)
│ ├── Stem: Conv 3→32, stride=1
│ ├── Stage1: Conv 32→64, stride=2 + CSPBlock(1×)
│ ├── Stage2: Conv 64→128, stride=2 + CSPBlock(2×)
│ ├── Stage3: Conv 128→256, stride=2 + CSPBlock(8×)
│ ├── Stage4: Conv 256→512, stride=2 + CSPBlock(8×)
│ └── Stage5: Conv 512→1024, stride=2 + CSPBlock(4×)
├── SPP (Spatial Pyramid Pooling)
├── PANet (Path Aggregation Network)
│ ├── FPN Top-down path (2× Upsample)
│ └── PAN Bottom-up path (2× Downsample)
└── YOLOv3 Head (3 scales)
├── Head1: 76×76 (stride 8, small objects)
├── Head2: 38×38 (stride 16, medium objects)
└── Head3: 19×19 (stride 32, large objects)
45 类中国交通标志
| 类别 | 含义 | 类别 | 含义 |
|---|
| i2 | 限速2 | i4 | 限速4 |
| i5 | 限速5 | il100 | 最低限速100 |
| il60 | 最低限速60 | il80 | 最低限速80 |
| io | 禁止超车 | ip | 禁止停车 |
| p10 | 限速10 | p11 | 限速11 |
| p12 | 人行道 | p19 | 注意行人 |
| p23 | 注意儿童 | p26 | 注意非机动车 |
| p27 | 注意信号灯 | p3 | 限速3 |
| p5 | 限速5 | p6 | 注意危险 |
| pg | 停车场 | ph4 | 限高4m |
| ph4.5 | 限高4.5m | ph5 | 限高5m |
| pl100 | 限重100t | pl120 | 限重120t |
| pl20 | 限重20t | pl30 | 限重30t |
| pl40 | 限重40t | pl5 | 限重5t |
| pl50 | 限重50t | pl60 | 限重60t |
| pl70 | 限重70t | pl80 | 限重80t |
| pm20 | 限宽2m | pm30 | 限宽3m |
| pm55 | 限宽5.5m | pn | 禁止通行 |
| pne | 禁止驶入 | po | 禁止停留 |
| pr40 | 限速40 | w13 | 警告13 |
| w32 | 警告32 | w55 | 警告55 |
| w57 | 警告57 | w59 | 警告59 |
| wo | 警告其他 | | |
交付件清单
| 文件 | 说明 |
|---|
yolov4_pytorch.py | YOLOv4 PyTorch 模型定义 + Darknet 权重加载 |
inference.py | NPU 推理脚本 (支持图片/视频/摄像头) |
evaluate.py | 精度验证 + 性能基准测试脚本 |
eval_results.json | 评测结果数据 |
yolov4-tt100k.cfg | Darknet 模型配置文件 |
适配要点
- 模型解析: 直接从 Darknet
.cfg 解析构建 PyTorch 模型,确保层序与权重文件一致
- 权重加载: 按 Darknet 存储顺序读取
.weights (BN bias → BN weight → BN mean → BN var → Conv weight)
- NPU 迁移: 使用
model.to('npu:0') 自动迁移,无需手动算子替换
- 精度保持: Mish 激活使用
x * tanh(softplus(x)) 原生实现,与 Darknet 一致
致谢