专栏算法工具链关于上板部署模型输入格式的疑惑

关于上板部署模型输入格式的疑惑

已解决
YUANYI2025-09-08
303
30

【j5】

按照QAT文档,在模型训练时将图像转换成 了centered_yuv444 格式

但是如果要使用nv12输入,那在QAT模型训练时候如何进行前处理呢?(应该不再是使用 rgb2centered_yuv了吧)

算法工具链
征程5技术深度解析
评论2
0/1000
  • Vincent
    Lv.4

    你好,你可以用 import horizon_plugin_pytorch.functional as F 然后print(dir(F)) 看一下里面有没有 对应的转换到NV12数据类型的方法。一般来说是QAT训练用的是centered_yuv444数据类型。

    2025-09-08
    0
    3
    • YUANYI回复Vincent:

      你好,请问如果使用centered_yuv444了,上板部署是不是必须使用C++接口

      2025-09-08
      0
    • Vincent回复YUANYI:

      是的,板端部署是用的UCP库,都是C++实现的接口

      2025-09-08
      0
    • YUANYI回复Vincent:

      你好,我的疑惑在于,按照QAT文档在训练时使用了rgb2centered_yuv,那么我最终上板部署hbm的时候,模型的输入应该是什么格式?(是直接输出yuv444?,但是有看到别的贴子里说hbm推理是会自动完成nv12到yuv444的转换,有点混乱)

      2025-09-08
      0
  • DR_KAN
    Lv.4

    模型训练就使用yuv444的就行了,nv12无法直接训练的

    2025-09-08
    0
    25
    • YUANYI回复DR_KAN:

      你好,那使用yuv444训练的话,那么我最终上板部署hbm的时候,也就是往infer的input里塞的输入数据应该是什么格式呢?

      2025-09-08
      0
    • YUANYI回复DR_KAN:

      我看到文档示意里都是转成nv12进行输入,但是nv12的数据shape和训练时的yuv444不一样(u和v都下采样了),对这点很困惑

      2025-09-08
      0
    • DR_KAN回复YUANYI:

      编译之前也是得差一个yuv444的转换节点的,编译出的hbm就可以给nv12(y+uv)的输入了。你可以先不着急做训练,先把这个流程走到底看看最后的模型符不符合预期。

      2025-09-08
      0
    • YUANYI回复DR_KAN:

      转定点模型以后的精度是符合预期的,目前卡在hbm上板推理的环节上

      2025-09-08
      0
    • YUANYI回复DR_KAN:
      嗯嗯没错,训练的时候按照文档插入了这两句进行了转换:

      然后经过训练编译等流程得到了hbm文件,上板推理的时候,按照下面的方法进行预处理就行了吗:

      2025-09-08
      0
    • DR_KAN回复YUANYI:

      编译hbm前也得插 centered_yuv2rgb ,这样hbm的输入就直接给nv12就行

      2025-09-08
      0
    • YUANYI回复DR_KAN:
      这点有点没太理解,按照文档,似乎是在训练时没有插入rgb2centered_yuv的情况下,才需要部署是插入centered_yuv2rgb?
      2025-09-08
      0
    • DR_KAN回复YUANYI:

      你说的对,因为我之前用只过部署时插入的方法,这里搞混淆了。你现在hbm的输入数据类型是什么?是否已经是nv12_separate?

      2025-09-08
      0
    • YUANYI回复DR_KAN:
      刚看了下,已经是nv12_separate
      2025-09-08
      0
    • YUANYI回复DR_KAN:

      我发现模型output的valid_shape是[1, 320, 1, 240],但是我代码中的输出是[1, 1, 240, 320],这个不一致正常吗?并且我看到aligned_shape是[1, 320, 1, 256],不太理解256是怎么出现的~

      2025-09-08
      0
    • DR_KAN回复YUANYI:

      这个输出看着还好,其实就是把240x320变成了320x240,然后因为是BPU算子直接输出,所以带上了硬件对齐的padding区域,后厨需要自行跳过这些无效区域并且做反量化,才能得到正确的浮点计算结果

      2025-09-08
      0
    • DR_KAN:

      是后处理,不是后厨

      2025-09-08
      0
    • YUANYI回复DR_KAN:

      大概理解了,请问跳过这些无效区域是怎么操作呢,并且反量化的参数该怎么获取呢

      2025-09-08
      0
    • DR_KAN回复YUANYI:

      你取值的时候不取那一块就行了。反量化参数有api,可以看下runtime接口的介绍

      2025-09-08
      0
    • YUANYI回复DR_KAN:
      老师你好,我发现我打印模型的输出维度,直接就是[1, 320, 1, 240],这样好像不能自行操作跳过无效区域:

      并且我打印输出的反量化参数self.quantize_model[0].outputs[0].properties.scale_data,这个scale_data的维度为什么是[320, ],这和我的输出维度不匹配。
      2025-09-09
      0
    • YUANYI回复DR_KAN:

      突然想到,scale_data的维度是[320, ]应该是因为量化是per-channel对吧,但是他把320视为了channel维度,这样会导致操他自动作跳过无效区域的时候出错吧

      2025-09-09
      0
    • DR_KAN回复YUANYI:

      https://developer.horizon.auto/blog/10424

      2025-09-09
      0
    • YUANYI回复DR_KAN:
      你好,现在输出部分已经修改了(乘scale),但是模型输出结果还是不对,我怀疑是否是输入数据预处理的问题。
      我的模型在QAT训练的时候是按照文档修改了(转YUV444_128再除以128进行归一化,然后模型输入设置了QuantStub(scale=1 / 128)),这种设置下,我在板子上做推理的时候,对图像(加载本地的图片)进行bgr2nv12,然后直接输入到模型,最终出来的结果是不对的。
      请问我是有哪里的操作不正确吗?
      2025-09-09
      0
    • 2025-09-09
      0
    • YUANYI回复DR_KAN:

      使用hrt_model_exec infer推理出来的结果是没问题的,我现在怀疑是python接口处理不了nv12_separate(需要开辟两块内存分别存储y和uv)

      2025-09-10
      0
    • DR_KAN回复YUANYI:

      用C++

      2025-09-10
      0
    • YUANYI回复DR_KAN:

      好的我正在尝试,谢谢大佬

      2025-09-10
      0
    • YUANYI回复DR_KAN:
      你好大佬,抱歉又打扰了~
      我这边尝试了C++,如果按照sample中的实例,运行的时候会报输入数据的错误,应该是和nv12_separate相关(输入的alignedSize是115200):

      因此我做了如下修改:

      修改之后到推理那一步直接segmentation fault了。
      请问我这样的修改是不是有问题呢?
      2025-09-11
      0
    • DR_KAN回复YUANYI:

      重新开一个问题提问吧

      2025-09-11
      0
    • YUANYI回复DR_KAN:

      已开:https://developer.horizon.auto/forum/13101

      2025-09-11
      0