电路板玩家
我觉得最容易忽略但坑死人的是“模型预处理和后处理与DPU的对接”环节。很多人以为量化编译完就万事大吉,其实不然。
痛点在于:你在Python训练时,预处理(比如归一化、缩放)可能是用OpenCV或PIL做的。但部署时,为了极致性能,Vitis AI推荐使用DPU的预处理单元(如DPU的Pre-Processing)或者在FPGA逻辑里实现的预处理。这时,如果处理逻辑和训练时对不上,精度就会暴跌。
同样,后处理(如目标检测的NMS)如果放在CPU做,也可能成为瓶颈。
我的建议是:
在模型训练和导出时,就把预处理固定下来,并且最好做成模型的一部分(比如在模型最前面加一个归一化层)。这样,量化校准和最终部署时,输入就是原始的图像数据(比如uint8的BGR),避免前后不一致。
仔细阅读Vitis AI提供的应用示例代码(比如在`Vitis-AI/demo`目录下)。看他们是怎么在C++或Python的VART代码里处理图像输入输出的。特别注意他们如何调用`setInputImage`或类似函数,以及如何配置输入张量的格式(NHWC还是NCHW)。
调试精度问题时,做一个黄金参考测试:在量化后、编译前,用Vitis AI量化工具提供的“浮点模拟”功能,在CPU上运行量化后的模型,与原始浮点模型对比同一批数据的输出。如果这里就有误差,那部署后肯定不对,问题出在量化阶段。如果这里没问题,但部署后有问题,那肯定是部署时的数据流(预处理/后处理)出了问题。
最后,善用社区。Xilinx的GitHub仓库Issues和官方论坛里有很多实际案例。搜索你的错误信息关键词,很可能别人已经遇到过并解决了。
