整个模型流程是disk+knnransac,目标是实现图像匹配,但是在模型转换的时候软硬件差距比较大,类似结果如下,找到的关键点数很少,软硬件disk模型输出的按scores排序的前十个关键点坐标也相差很大。

这是软件平台结果。
这是硬件平台结果


我们定位到模型转换出问题之后,下面是我们对disk模型转换过程一些的debug记录。希望能得到帮助!
模型转换ATC命令 atc --input_shape="inputs:512,640,3" --input_format=ND --soc_version=Ascend310B1 --framework=5 --model="./models/disk2.onnx" --output="./models/disk2"
导出disk-onnx模型的代码在网盘链接中,有点不同的操作就是预处理放在了模型的推理里面,所以整个模型输入是HWC,但是之前也尝试把图片的预处理解码出来,结果会好一点,但是输出的结果和软件对比还是差距比较大。
目前的硬件版本环境如下

尝试msit debug compare分析,命令如下
msit debug compare -gm /home/HwHiAiUser/project/cnn-matching-200DK-A2/models/disk2.onnx -om /home/HwHiAiUser/project/cnn-matching-200DK-A2/models/disk2.om -i /home/HwHiAiUser/project/cnn-matching-200DK-A2/test_640_512_3_uint8.bin -o ./debug_result/ --advisor
在尝试的几次模型转化的过程中会分别出现fp16 overflow 和gatherv2算子精度误差很大原因

对于前者我们定位其的问题可能是在软件代码中有一句F.normalize()这里归一化的时候为了防止除0有个1e-12的eps,超出了fp16的精度范围,但是这里修改位1e-7之后同样还是会有fp16overflow问题。

解决办法是在模型ATC转换的时候加了precision_mode这个参数,尝试了force_fp32和allow_fp32_to_fp16,会没有fp16 overflow的专家诊断。但是其精度差异还是比较大。



查看几次msit debug compare的result文件中,定位到这个gather_2算子的位置,是出现在软件代码中尝试按索引取出前topk个张量的地方。


于是在软件模型到处的时候尝试后面全部注释掉,不进行后面的逻辑操作,导出disk_initial.onnx模型

但是进行模型转换调用,打印软硬件对应的输出的还是不太对,两者还是有误差。



整个模型流程是disk+knnransac,目标是实现图像匹配,但是在模型转换的时候软硬件差距比较大,类似结果如下,找到的关键点数很少,软硬件disk模型输出的按scores排序的前十个关键点坐标也相差很大。
这是硬件平台结果
我们定位到模型转换出问题之后,下面是我们对disk模型转换过程一些的debug记录。希望能得到帮助!
模型转换ATC命令 atc --input_shape="inputs:512,640,3" --input_format=ND --soc_version=Ascend310B1 --framework=5 --model="./models/disk2.onnx" --output="./models/disk2"
导出disk-onnx模型的代码在网盘链接中,有点不同的操作就是预处理放在了模型的推理里面,所以整个模型输入是HWC,但是之前也尝试把图片的预处理解码出来,结果会好一点,但是输出的结果和软件对比还是差距比较大。
目前的硬件版本环境如下
尝试msit debug compare分析,命令如下
msit debug compare -gm /home/HwHiAiUser/project/cnn-matching-200DK-A2/models/disk2.onnx -om /home/HwHiAiUser/project/cnn-matching-200DK-A2/models/disk2.om -i /home/HwHiAiUser/project/cnn-matching-200DK-A2/test_640_512_3_uint8.bin -o ./debug_result/ --advisor
在尝试的几次模型转化的过程中会分别出现fp16 overflow 和gatherv2算子精度误差很大原因
对于前者我们定位其的问题可能是在软件代码中有一句F.normalize()这里归一化的时候为了防止除0有个1e-12的eps,超出了fp16的精度范围,但是这里修改位1e-7之后同样还是会有fp16overflow问题。
解决办法是在模型ATC转换的时候加了precision_mode这个参数,尝试了force_fp32和allow_fp32_to_fp16,会没有fp16 overflow的专家诊断。但是其精度差异还是比较大。
查看几次msit debug compare的result文件中,定位到这个gather_2算子的位置,是出现在软件代码中尝试按索引取出前topk个张量的地方。
于是在软件模型到处的时候尝试后面全部注释掉,不进行后面的逻辑操作,导出disk_initial.onnx模型
但是进行模型转换调用,打印软硬件对应的输出的还是不太对,两者还是有误差。