专栏算法工具链sparse4D c++部署输入问题

sparse4D c++部署输入问题

已解决
爱学习的班马2026-02-26
108
17

J6M,OE包版本:v3.0.31

从附件图片中可以看到,模型的输入包括6张图片的y,uv输入,以及projection_mat,cached_anchor,cached_feature的输入,其中对于图片的y,uv输入是怎么获得的?

以及对于projection_mat,cached_anchor,cached_feature等信息我们怎么获得?

我看示例中C++调用的时候直接有std::string data_y_path以及 std::string data_uv_path的路径,这里面的bin文件是通过什么获得的?
附件:
算法工具链
技术深度解析征程6
评论5
0/1000
  • 爱学习的班马
    Lv.2
    2026-02-26
    0
    0
  • 爱学习的班马
    Lv.2

    我看对于npy数据是直接生成了一个bin文件,但是对于featuremap的C++调用里,是有一个y .bin文件以及一个uv.bin文件

    2026-02-26
    0
    0
  • 爱学习的班马
    Lv.2
    2026-02-26
    0
    3
    • 爱学习的班马回复爱学习的班马:

      还是说这里在读取6张图片的时候,已经生成了我们需要的y,uv?可是我们直接输入6张图片,在读取图片的时候是直接将6张图片存到一个张量中放到模型中吗?

      2026-02-26
      0
    • HuangHui回复爱学习的班马:
      2026-02-26
      1
    • 爱学习的班马回复HuangHui:

      还有一些问题,麻烦解答一下

      2026-02-26
      0
  • 爱学习的班马
    Lv.2
    2026-02-26
    0
    1
    • 爱学习的班马回复爱学习的班马:

      我看sparse4D的模型解码,只有cls_scores,box_preds以及qulity三个,为什么从模型输出中还有一个feature呀,那个feature是什么意思呀?

      2026-02-26
      0
  • HuangHui
    Lv.5
    1. img_0_y ... img_5_uv 是 6 路相机图像经过 NV12 预处理后拆成 Y 平面和 UV 平面的输入,读取图片后直接从mat取就OK了,这个的python参考代码在PTQ 每个参考示例都有,推理之前都要split,C++的在基础示例、ai_benmark、hrt_model_exec的实现中也有。
    2. projection_mat 来自相机内外参,并且要按实际输入图像的 resize/crop 做矩阵修正。
    3. cached_anchor / cached_feature 是 Sparse4D 的时序 memory bank 输入:首帧通常填零,后续帧用上一帧模型输出缓存回填。
    4. 输出里的 feature 不是检测结果解码输出,而是给下一帧做 memory bank 更新的实例特征历史参考的,所以模型会输出它,但 decoder 不直接消费它。

      另外,你用的OE包v3.0.31的太老太老了,升级一下吧,最新版本已经是v3.7.0了,下载地址:J6-HorizonOpenExplorer.下载
    2026-02-26
    0
    8
    • 爱学习的班马回复HuangHui:
      fighting_org.svg好哒好哒,我这边下载了最新的OE包,只是J6B需要这个低版本的OE包
      2026-02-27
      0
    • HuangHui回复爱学习的班马:

      J6B?这个比较特殊呀,我理解你们有专门的技术支持接口人吧。不过这里的问题好像是多个版本和芯片都类似的,我们最大努力解答~

      2026-02-27
      1
    • 爱学习的班马回复HuangHui:

      其中1,2,3这三点具体代码示例路径方便提供吗?以及projection_mat相机内外参这块的操作代码示例或者官网示例在哪呀?我好像并没有从官网部署介绍中找到相关的内容

      2026-02-27
      0
    • 爱学习的班马回复HuangHui:

      还有一个问题就是从附件图片中,对于PTQ的输入是4个,而对于QAT来说是15个,是因为PTQ中6张图片都放在了同一个内存地址中吗?

      2026-02-27
      0
    • HuangHui回复爱学习的班马:

      1)img_0_y / img_0_uv 输入生成:这是图像转 NV12 后拆成 Y 平面和 UV 平面得到的。

      Python代码(拆分逻辑):
      /open_explorer/samples/ai_toolchain/horizon_model_convert_sample/04_detection/det_inference.py
      函数:nv12_split_yuv(约 35 行)
      C++代码(图像转 NV12 + 填充到 Y/UV 输入 tensor):
      /open_explorer/samples/ucp_tutorial/dnn/ai_benchmark/code/src/utils/image_utils.cc
      函数:bgr_to_nv12(约 90 行)
      /open_explorer/samples/ucp_tutorial/dnn/ai_benchmark/code/src/utils/tensor_utils.cc
      函数:fill_image_to_tensor(约 107 行)
      /open_explorer/samples/ucp_tutorial/dnn/ai_benchmark/code/src/input/batch_image_list_data_iterator.cc
      多路输入顺序说明(约 79 行,Y_0+UV_0+Y_1+UV_1...)
      2026-02-27
      0
    • HuangHui回复HuangHui:

      2)projection_mat 获得?projection_mat 来自相机内外参(常见可由 lidar2img 表示),并且要随实际 resize/crop 做同步修正。

      Sparse 示例配置(读取和修正矩阵):
      /open_explorer/samples/ai_toolchain/horizon_model_train_sample/scripts/configs/bev/bev_sparse_henet_tinym_nuscenes.py
      - prepare_inputs(约 1137 行,读取 lidar2img.npy)
      - resize_homo(约 1102 行)
      - crop_homo(约 1110 行)
      - process_inputs(约 1161 行,应用修正后送模型)
      参数生成相关工具:
      /open_explorer/samples/ai_toolchain/horizon_model_train_sample/scripts/tools/gen_camera_param_nusc.py
      /open_explorer/samples/ai_toolchain/horizon_model_train_sample/scripts/tools/homography_generator.py
      2026-02-27
      0
    • HuangHui回复HuangHui:

      3)cached_anchor / cached_feature 怎么获得?

      这是时序 memory bank 输入:
      - 首帧通常置零
      - 后续帧由上一帧模型输出作为时序依赖回填
      示例配置(首帧输入):
      /open_explorer/samples/ai_toolchain/horizon_model_train_sample/scripts/configs/bev/bev_sparse_henet_tinym_nuscenes.py
      - first_frame_input(约 1004 行)
      - output_names(约 1003 行,包含 feature)
      时序回填逻辑在已安装 whl(hat)里:
      /usr/lib/python3.10/site-packages/hat/models/structures/sparsebevoe.py
      cache() 中会使用当前帧输出更新 cached_feature/cached_anchor,并作为下一帧输入
      2026-02-27
      0
    • HuangHui回复爱学习的班马:

      对,图像输入改成了 NV12 多输入格式,每个相机拆成 Y 和 UV 两个输入的原因,4 输入和 15 输入是同一业务语义的两种输入组织方式。不是“共用一个内存地址”,而是“一个大 img 张量” vs “按相机/平面拆分成多个输入节点”。可以是一个tensor包含多个图片,也可以分开。

      2026-02-27
      1