首页 > 编程语言 >地平线 bev 参考算法板端一致性验证教程

地平线 bev 参考算法板端一致性验证教程

时间:2024-12-08 12:21:03浏览次数:3  
标签:seg 教程 输出 pred self 板端 model bev infer

01 前言

由于部署时数据来源的硬件不同以及应用开发的高效性要求,往往会使得在板端部署阶段的数据准备操作与训练时有所差异,导致在同样的输入下,量化模型的输出结果和板端部署模型的输出结果不一致。

本文将基于开发者社区中已经发布的地平线 bev 参考算法板端输入数据准备教程,以 bev_mt_lss 参考算法为例,介绍 PC 端和板端输出一致性验证的过程。

02 PC 端输入获取

PC 端输入的获取主要包括输入数据准备、输出节点配置和运行推理脚本这三个步骤,下面将对其进行逐一介绍。

2.1 输入数据准备

bev_mt_lss 参考算法的 PC 端输入为:

获取到 6V 图像和 homography 矩阵后,配置 config 文件的 infer_cfg 字段中输入路径参数 infer_inputs:

infer_cfg = dict(
    model=model,
    infer_inputs=dict(
        #6V图像的存放路径
        imagedir="./tmp_orig_data/nuscenes/infer_imgs/single_frame/imgs",
        #homography矩阵的存放路径
        homo="./tmp_orig_data/nuscenes/infer_imgs/single_frame/homo/ego2img.npy",
    ),
    ...
)

bev 参考算法的输入的 6V 图像的有顺序的,所以需要在 config 文件的 process_inputs 函数中定义输入图像的顺序,如下所示:

def process_inputs(infer_inputs, transforms=None):

    resize_size = resize_shape[1:]
    input_size = val_data_shape[1:]
    orig_imgs = []
    #定义输入图像的顺序
    input_list=[
    'n008-2018-08-01-15-16-36-0400__CAM_FRONT_LEFT__1533151603504799.jpg',
    'n008-2018-08-01-15-16-36-0400__CAM_FRONT__1533151603512404.jpg',
    'n008-2018-08-01-15-16-36-0400__CAM_FRONT_RIGHT__1533151603520482.jpg',
    'n008-2018-08-01-15-16-36-0400__CAM_BACK_LEFT__1533151603547405.jpg',
    'n008-2018-08-01-15-16-36-0400__CAM_BACK__1533151603537558.jpg',
    'n008-2018-08-01-15-16-36-0400__CAM_BACK_RIGHT__1533151603528113.jpg'
    ]
    #for i, img in enumerate(os.listdir(infer_inputs["imagedir"])):
    for i,img in enumerate(input_list):
        img = os.path.join(infer_inputs["imagedir"], img)
        img, orig_shape = process_img(img, resize_size, input_size)
        orig_imgs.append({"name": i, "img": img})
        
        ...
    return model_input, vis_inputs

6V 图像的输入顺序为:FRONT_LEFT,FRONT,FRONT_RIGHT,BACK_LEFT,BACK,BACK_RIGHT

2.2 输出节点配置

2.2.1 dump 分割头输出

在 docker 环境下,进入到/usr/local/lib/python3.8/dist-packages/hat/models/task_modules/fcn/head.py 目录下,在 FCNHead 类的 forward 函数中保存分割头的输出,如下所示:

#step1:导入fx_wrap和numpy
from hat.utils.model_helpers import fx_wrap
import numpy as np 
 
    #step2:定义保存输出的函数saveoutput并使用fx_warp
    @fx_wrap()
    def saveoutput(self,seg_pred):
        seg_pred=seg_pred.as_subclass(torch.Tensor)
        seg_pred=seg_pred.view(-1,1).cpu().numpy()
        print("------start to save seghead output------")
        np.savetxt("./lss/seg_pred.txt",seg_pred,fmt='%d', delimiter=',')
        print("-----save seghead output ok------")
        return seg_pred
    def forward(self, inputs: List[torch.Tensor]):
        x = inputs[self.input_index]
        x = self.convs(x)
        if self.dropout:
            x = self.dropout(x)
        seg_pred = self.cls_seg(x)
        #step3:调用saveoutput函数
        seg_pred=self.saveoutput(seg_pred)
        if self.training:
            if self.upsample_output_scale:
                seg_pred = self.resize(seg_pred)
            if self.argmax_output:
                seg_pred = seg_pred.argmax(dim=1)
        
        if self.dequant_output:
            seg_pred = self.dequant(seg_pred)
        return seg_pred

2.2.2 dump 检测头输出

本节以 bev 参考算法检测头的“height"属性输出为例,介绍如何导出 PC 端的检测头输出,将其保存为 txt 文件。

在 docker 环境下,进入到/usr/local/lib/python3.8/dist-packages/hat/models/task_modules/centerpoint/head.py 目录下,在 TaskHead 类的 forward 函数中 dump 检测头的输出,如下所示:

#step1:导入fx_wrap和numpy
from hat.utils.model_helpers import fx_wrap
import numpy as np
    #step2:定义保存指定检测头的输出函数 
    @fx_wrap()
    def saveoutput(self,x):
        x=self.__getattr__("height")(x).as_subclass(torch.Tensor)
        x=x.view(-1,1).cpu().numpy()
        print("------start to save dethead output------")
        np.savetxt("./lss/output_height.txt",x,fmt='%d', delimiter=',')
        print("-----save dethead output ok------")
        return x  
    def forward(self, x):
        ret_dict = {}
        #step3:调用输出保存函数
        x = self.saveoutput(x)
        for head in self.heads:
            ret_dict[head] = self.dequant(self.__getattr__(head)(x))
        return ret_dict

本节仅选择了检测头的一个类别的 height 输出一致性的验证,也可以选择在/usr/local/lib/python3.8/dist-packages/hat/models/task_modules/centerpoint/head.py 中保存检测头的其它属性输出来验证一致性。

2.3 运行 infer.py

最后,运行推理脚本 infer.py:

#启动docker
#进入到OE包的ddk/samples/ai_toolchain/horizon_model_train_sample/scripts目录下
python3 tools/infer.py -c  ./configs/bev/bev_mt_lss_efficientnetb0_nuscenes.py

运行 infer.py 之前请参考【参考算法】地平线 Bev_mt_lss 参考算法-v1.2.1 3.1.3 节对 config 文件进行必要的修改

运行 infer.py 完毕后,生成的 seg_pred.txt 即为模型的分割头输出,output_height.txt 为检测头的 “height” 输出。

03 板端输入获取

板端端输入的获取主要包括输入数据准备和运行 hrt_model_exec 工具这两个步骤,下面将对其进行逐一介绍。

3.1 输入数据准备

3.2 运行 hrt_model_exec 工具

获取到 bev_mt_lss 板端 hbm 的 3 个输入后,在板端运行 hrt_model_exec 工具来 dump 模型的输出,命令如下:

hrt_model_exec infer --model_file=model.hbm --input_file=inputnv12_lss.bin,fpoints.bin,dpoints.bin --enable_dump True --dump_format txt

工具运行完成后,会在当前路径下生成数个 txt 文件,分割头对应的输出是 model_infer_output_0.txt,检测头的“height”属性对应的输出是 model_infer_output_32.txt 文件。

可通过 hrt_model_exec model_info --model_file model.hbm 来获取模型输出节点的信息。

04 输出结果对比

将 2.3 节导出的 PC 端分割头的输出 seg_pred.txt 和检测头输出 output_height.txt 分别与 3.2 节 dump 出的 model_infer_output_0.txt 和 model_infer_output_32.txt 对比,如果数值相同,则说明一致性验证通过。

标签:seg,教程,输出,pred,self,板端,model,bev,infer
From: https://www.cnblogs.com/horizondeveloper/p/18593262

相关文章

  • Kali Linux超详细安装教程(附镜像)
    一、镜像获取(任选其一)1.kali官网http://old.kali.org/kali-images/http://old.kali.org/kali-images/kali-2021.1/kali-linux-2021.1-installer-amd64/​2.阿里镜像站https://mirrors.aliyun.com/kali-images/​3.(建议使用,速度快)通过网盘分享的文件:kali-linux-2......
  • php网站修改教程,全面指导PHP网站修改
    修改PHP网站是一个涉及多个方面的任务,包括内容更新、模板修改、SEO优化等。以下是详细的步骤和指南:备份现有文件:在进行任何修改之前,确保备份当前的所有网站文件和数据库,以防出现问题时可以恢复。登录后台管理系统:使用管理员账户登录网站的后台管理系统。导航到内容管理:找到“......
  • DevEco Testing教程
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18592823➤如果链接不是为敢技术的博客园地址,则可能......
  • 8条笔记,30天涨粉1.8w!用AI做林黛玉怼人视频,涨粉太香了!(附完整教程)
    大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年+,也一名AIGC爱好者,持续分享更多前沿的「AI工具」和「AI副业玩法」,欢迎一起交流~最近「林黛玉怼人」系列的账号太火了!而且内容太太太让人上瘾了!在小红书刷到了林黛玉怼人的视频,愣是被硬控了10多分钟,才「依依不舍......
  • 短剧+网盘拉新新思路,教程分享
    近期,短剧的热度可谓是空前高涨,相信许多人都感受到了这股热潮。然而,当你想要一次性观看全集时,往往会发现只有前几集是免费的。一旦你被剧情吸引,想要继续观看后续内容,就必须支付费用了。通常来说,想要完整地观看一部短剧,要么成为会员,要么购买全集,而这样的花费平均在60元左右,有些甚......
  • 清华华子哥:AI科研入门教程(二)
    哈喽,各位童靴们好啊,上次华子哥和大家分享了找论文部分,这次来和大家分享一下读论文部分第一层:看山是山对于survey,全部看一遍,可以再借助gpt整理一下主要内容;对于**research,**最好的方法就是把筛选出来最有价值的论文原文进行逐句的精读,但是我们时间不够用,那就直接上翻译器......
  • 2024 IntelliJ IDEA安装使用教程(附激活,含常见问题解答)
    第一步:下载IDEA安装包访问IDEA官网,下载IDEA也可以在这里点击下载idea(含博主使用版本)下载idea第二步:安装IDEA点击xx关掉程序!第三步:下载补丁IntelliJIDEA补丁文件点击获取补丁下载成功后,打开标注的文件文件夹,进入到文件夹/jetbra注意:这个文件夹单......
  • 鸿蒙Next开发实战教程:实现抖音长按快速评论特效
    开篇点题,今天玩点花的。不知道大家有没有发现,抖音上的评论键长按会弹出一排表情框用于快速评论,不过现在鸿蒙原生版的抖音还没有这个功能,今天幽蓝君就小试牛刀,在鸿蒙上做一下这个功能,也是应一位友友的私信要求。不过幽蓝君学艺不精,水平有限,只能模仿个三分像,仅供大家参考。话不多......
  • 鸿蒙Next开发实战教程-使用WebSocket实现即时聊天
    鸿蒙系统提供了WebSocket库,使用它可以很方面的实现即时聊天功能,今天就使用WebSocket来实现一个完整的聊天功能。首先创建一个WebSocket实例:letws=webSocket.createWebSocket()然后创建WebSocket连接,我找到一个简单的ws地址,它直接返回我们发送的消息:leturl='ws://124.......
  • 超全致远OA整套视频学习教程及二次开发技转攻略(火)
    引言    致远OA作为国内领先的办公自动化系统,凭借其强大的功能和灵活的二次开发能力,成为众多企业数字化转型的首选平台。为了帮助广大开发者和企业用户更好地掌握致远OA的实施与二次开发技术,我精心准备了超全致远OA视频学习教程及二次开发技转攻略,全面覆盖应用实施、功......