写在前面
因整理简历需要,将项目放在博客简单介绍一下。
项目描述
应需在国产无人机上执行匹配定位任务,将当前主流的 SuperGlue 和 LoFTR 两种特征匹配方法 pytorch模型转换为 rknn 模型并部署在 npu 中。
RKNN模型的整体开发
整体开发流程主要包括模型转换、模型评估和板端部署。
为使用RKNPU,需要在PC上运行rknn-toolkit2工具,将训练好的模型转换为RKNN格式模型,之后使用RKNN C API或Python API在开发板上进行部署。
模型压缩和优化
模型算子适配问题
官方文档查询不支持ReduceLogSumExp,但是因为在superglue当中的sinkhorn算法会有这个算子进行计算,因此需要自定义这个算子,根据查询文档,在rknn-toolkit2转换模型过程中先对这个算子进行注册即可。
并在onnx模型中将所有node的type是ReduceLogSumExp都替换为cstReduceLogSumExp,在C API同样编写自定义算子并加载注册加执行。
因为转换过程中部分算子损失精度严重,加上算子适配问题,superglue的部署方案定为:onnx + rknn 混合部署,最终模型推理时间为0.63秒,相比纯onnx部署快近5.7倍。
rknn模型静态输入
rknn-toolkit2文档明确确定模型输入可以给动态输入形状列表(例如[[1,3,224,224], [1,3,512,512]]),但是不能是动态输入([1,3,h,w]),而两阶段的特征匹配模型superglue的特征提取部分superpoint输出是动态的关键点和描述子,这并不满足rknn模型转换规则,因此采用的是在superpoint输出部分去topk个输出,让superglue处理更可靠的关键点。