第一次拿到地平线旭日X3开发板时,最让我头疼的就是环境配置问题。这块板子的BPU架构对软件版本有严格要求,稍有不慎就会导致后续步骤全盘失败。经过多次尝试,我总结出一套稳定可复现的环境搭建方法。
首先需要准备Ubuntu 18.04或20.04系统,这是地平线工具链兼容性最好的环境。我强烈建议使用物理机安装而非虚拟机,因为后续的Docker容器和BPU驱动对硬件直通有特殊要求。我的配置是i7-10700K+RTX 3060主机,实际测试发现CPU性能会影响模型转换速度。
关键工具链安装顺序很重要:
conda create -n horizon python=3.6pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 -f https://download.pytorch.org/whl/torch_stable.html数据集准备有个容易踩的坑——标注文件格式。虽然YOLOv5支持多种标注格式,但为了后续BPU量化时减少麻烦,建议统一使用YOLO格式的txt文件。我的项目需要检测5类工业零件,目录结构是这样组织的:
code复制dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
每个图片文件都对应一个同名的txt标注文件,内容格式为class_id x_center y_center width height,所有坐标值需要归一化到0-1之间。
选择YOLOv5-2.0版本是经过实际测试的明智之选。虽然最新版v7.0性能更好,但X3的BPU对v2.0的算子支持最完善。训练时有几个关键参数需要特别注意:
在models/yolov5s.yaml中,将nc改为你的实际类别数。我遇到过一个隐蔽的bug:当类别数超过10时,需要同步修改utils/loss.py中的BCEWithLogitsLoss初始化参数,否则会导致训练loss震荡。
数据增强配置直接影响最终模型精度。我的推荐配置是:
python复制# data/hyps/hyp.scratch.yaml
flipud: 0.3 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
mosaic: 1.0 # 马赛克增强
mixup: 0.2 # 图像混合比例
特别注意mosaic增强在X3部署时会带来后处理复杂度,如果推理速度不达标可以降低该值。
训练命令示例:
bash复制python train.py --img 672 --batch 32 --epochs 150 --data data.yaml --cfg models/yolov5s.yaml --weights '' --name industrial_parts
这里使用672x672分辨率是为了匹配X3的BPU最佳计算尺寸。实际测试发现,相比默认的640x640,672分辨率在X3上能提升约15%的推理速度。
模型转换是整个流程中最容易出错的环节。首先需要修改models/yolo.py中的输出层结构:
python复制# 修改前
y = y.view(bs, 3, -1, 85) # 修改为BPU兼容格式
# 修改后
y = y.permute(0, 3, 1, 2) # NHWC -> NCHW
这个改动是为了适配地平线BPU的专用指令集,不改会导致后续量化失败。
导出ONNX模型时要注意:
bash复制python export.py --weights runs/train/industrial_parts/weights/best.pt --img 672 --batch 1 --simplify --opset 11
必须指定opset_version=11,这是地平线工具链支持的最高版本。我在第一次尝试时忘了这个参数,结果浪费了三天时间排查转换失败原因。
量化校准阶段需要准备100-200张代表性图片。关键配置在yolov5s_config_X3.yaml中:
yaml复制quantized_dtype: 'int8'
calibration_type: 'max'
input_layout: 'NCHW'
使用max校准方式虽然会损失少许精度,但能保证最稳定的推理性能。实测在工业场景下,相比kl_divergence校准方式,帧率能提升20%以上。
部署到X3开发板后,真正的挑战才开始。我总结出三个性能调优的关键点:
内存分配策略直接影响推理稳定性。修改hrt_model_exec.py中的配置:
python复制self.model = hrt_model(config_file='./yolov5s_config_X3.yaml')
self.model.set_memory_strategy(2) # 使用内存池策略
策略2会预先分配固定大小的内存块,避免频繁内存申请释放带来的性能抖动。
后处理优化是提升帧率的关键。标准YOLOv5的后处理在X3上会消耗40%以上的计算时间。我的优化方案是:
hrt_preprocess进行图像缩放最终我的部署脚本核心逻辑如下:
python复制def inference(self, img):
# 预处理
input_data = self.preprocess(img)
# BPU推理
output = self.model.inference(input_data)
# 优化版后处理
results = self.postprocess(output)
return results
经过这些优化,在672x672输入分辨率下,X3开发板实现了62FPS的稳定推理性能,完全满足工业检测的实时性要求。
在实际产线部署时,我遇到了几个教科书上没提过的问题。第一个是温度导致的性能衰减:连续运行2小时后,帧率会从62FPS降到53FPS。解决方案是在/etc/hobot/hobot.conf中添加:
code复制[power]
thermal_throttling=0
关闭温度保护后,需要额外加装散热片,但性能稳定性得到明显改善。
第二个典型问题是夜间光照不足导致的误检。我的应对方案是:
内存泄漏是最难排查的问题。建议在部署初期添加内存监控:
bash复制watch -n 1 'cat /proc/meminfo | grep MemAvailable'
如果发现可用内存持续下降,很可能是后处理代码中存在未释放的资源。我的案例中是OpenCV的Mat对象没有及时释放导致的。
经过三个月的实际运行,这套系统在产线上的检测准确率达到99.7%,误检率低于0.3%。最让我自豪的是,通过持续优化,单台X3开发板可以同时处理4路1080P视频流,充分挖掘了BPU的并行计算潜力。