专栏算法工具链PETR 参考算法的pos_embed输入准备问题

PETR 参考算法的pos_embed输入准备问题

已解决
yy12342024-05-11
120
8

用户您好,请详细描述您所遇到的问题,详细的描述有助于帮助我们快速定位,解决问题~Thanks♪(・ω・)ノ

1. 芯片型号:J5

2. 天工开物开发包 OpenExplorer 版本:8 J5_OE_1.1.68

3. 问题定位:板端部署等

4. 问题具体描述:您好,请问地平线【参考算法】地平线 PETR 参考算法-v1.2.2,链接【参考算法】地平线 PETR 参考算法-v1.2.2 (horizon.ai) 最后转换成功板端hbm模型,板端除了图像输入,还有一个pos_embed的输入,这个输入怎么获取呢。
在论坛中有类似算法lss gkt ipm的非图像输入的参考。链接地平线bev参考算法板端输入数据准备教程 (horizon.ai)

参考这个教程,可以生成数据类型为float32的pos_embed.npy文件,此文件就是板端非图像的输入信息吗。但hbm模型的输入信息如下:

input[1]: 

name: arg0[pos_embed]

input source: HB_DNN_INPUT_FROM_DDR

valid shape: (1,256,60,20,)

aligned shape: (1,256,60,32,)

aligned byte size: 491520

tensor type: HB_DNN_TENSOR_TYPE_S8

tensor layout: HB_DNN_LAYOUT_NCHW

quanti type: SCALE

stride: (491520,1920,32,1,)

scale data: 0.296522,0.296522.......(256个相同的scale)

也就是数据类型要求int8,上述输入准备教程中也有对浮点Points做量化的过程,量化的scale就是hbm模型中读出来的 0.296522吗?我这样对参考点量化成int8,这个过程哪里有问题吗?与教程中量化成int16比较,主要就改了clip的范围从int16变成int8,数据类型从int16变成int8。

(qat量化后的pth模型pc端推理正确,pc端推理的未经过post_progress的输出和板端hbm模型的原始输出不一致,所以我们怀疑是板端hbm模型的输入不对)

麻烦帮忙看一下,谢谢

scale = [0.296522]

points = np.load(path)

idx=int(path[-5])

points = points.transpose(0, 3, 1, 2) / scale[idx]

points = np.floor(points + 0.5)

points = np.clip(points, -128, 127)

points = points.astype(np.int8)

points.tofile(save_name+".bin")


算法工具链
+1
评论8
0/1000
  • GOYU\XU
    Lv.2
    你好,目前你获取了float的pos_embed嵌入,但是板端部署输入需要为int8, 你将float pos_embed转为int8输入后,推理结果不一致?不知道我的理解对不对?
    2024-05-11
    0
    0
  • yy1234
    Lv.2
    2024-05-11
    0
    0
  • GOYU\XU
    Lv.2
    2024-05-11
    0
    0
  • yy1234
    Lv.2
    petr的模型配置petr_efficientnetb3_nuscenes.py中没有get_grid_quant_scale()这个函数,应该是没有用到这个,也没有grid_size信息。而这个路径/horizon_j5_open_explorer_v1.1.68-py38_20231014/ddk/samples/ai_toolchain/horizon_model_train_sample/scripts/configs/bev下其它bev算法如detr3d,lss,ipm等都有用到这个函数。因此不知道生成的浮点的pos_embed.npy在板端怎么使用。hbm模型要求此输入为HB_DNN_TENSOR_TYPE_S8,应该怎么转换呢?或者这个数据类型在量化编译阶段在哪里可以自定义吗?我们是否可以改成浮点输入pos_embed信息?
    2024-05-11
    0
    0
  • yy1234
    Lv.2
    @GOYU\XU 你好,pos_embed根据教程生成的应该是正确的。但hbm模型要求输入int8,float-int8损失太大了,请问这个数据类型在量化编译阶段在可以自定义?我们是否可以改成浮点输入pos_embed信息或者int16
    2024-05-13
    0
    0
  • GOYU\XU
    Lv.2

    >

    • 你好 pos_embed生成的顺序是,1. 参考地平线bev参考算法板端输入数据准备教程 (horizon.ai)获取points文件,然后就可以执行训练脚本下的/horizon_j5_open_explorer_v1.1.68-py38_20231014/ddk/samples/ai_toolchain/horizon_model_train_sample/scripts/tools/infer.py了,执行infer的时候保存下面这个:到文件中,上面保存数据时

    数据类型:模型输入需要S8,上面保存的应该就是int8的数据,如果不是int8, 就先量化成int8,数据shape: 保存时是按照valid_shape保存的,而模型input的shape需要与aligned shape一致。 目前模型的input source是DDR的,需要手动将valid chape padding 为 aligned shape, 最后保存成.bin给板端模型使用

    2024-05-15
    0
    0
  • yy1234
    Lv.2
    好的,谢谢。我们的pos_embed文件已经正确生成了,但是生成的是float的,量化成int8上板后有部分损失。我看地平线的l地平线bev参考算法板端输入数据准备教程 (horizon.ai) 里面的板端部署模型的points都是量化成int16的,请问编译hbm阶段在哪里配置呢?

    point量化后值进行反量化后与浮点对比,我们发现确实有部分差异,甚至有部分量化时超过128被截断的值,因此pc推理的int infer模型与板端推理的hbm结果也有一点差异。所以想尝试修改hbm模型对point输入为int16或者float输入,去hat里看,好像最后到了.so的库里,请问是无法自行更改编译后数据输入类型吗,如果可以的话,如何修改呢?

    谢谢

    2024-05-15
    0
    0
  • Huanghui
    Lv.5
    可以试试
    2024-05-17
    0
    0