专栏算法工具链J3 DVB板端,分割模型部署问题

J3 DVB板端,分割模型部署问题

已解决
lollipop2023-01-30
70
31

目前在做分割模型部署,

根据

根据这个代码,我更改了板端部署的代码,想请问下下面这个代码里面的perception 存储的是什么数据啊
for (int h = 0; h < height; ++h) {
for (int w = 0; w < width; ++w) {
float top_score = -1000000.0f;
int top_index = 0;
float *c_data = data + (width * h + w) * channel;
for (int c = 0; c < channel; c++) {
if (c_data[c] > top_score) {
          top_score = c_data[c];
          top_index = c;
        }
      }
perception->seg.seg[h * width + w] = top_index;
    }
算法工具链
征程3
评论2
0/1000
  • 颜值即正义
    Lv.2
    你好!在这段代码中,perception->seg.seg[h * width + w]存储的是语义分割结果,相当于在h*w的单通道灰度图中为每个像素点分配一个值,该值的大小对应物体的分类序号。对perception本身的理解可以先参考include/base/perception_common.h,该头文件定义了结构体Perception,包含了在ptq_unet_post_preocess_method.cc中调用的各种参数,需要认真梳理里面的代码关系;之后可以查看include/method_data.h,PerceptionPtr是对Perception使用了智能指针shared_ptr的结果;最后再来分析ptq_unet_post_preocess_method.cc,可以看出perception获取了模型的多种信息,比如图像的长宽,类别数量,任务类别为分割,以及分割结果等等。
    2023-01-31
    0
    29
    • 颜值即正义回复lollipop:

      正常来说做2类别的分割,输出通道应该也是2:一个通道是背景得分,一个通道是前景(可行驶区域)得分。如果用1通道的话,您是考虑用阈值来做前后景的区分吗?如果是这样可以参考这种写法:

      float *c_data = data + (width * h + w) * channel;

      if(c_data[0] > 0.5)

      top_index = 1;

      else

      top_index = 0;

      perception->seg.seg[h * width + w] = top_index;

      2023-01-31
      0
    • 颜值即正义回复lollipop:

      那你先试试不加这些后处理,直接打印模型输出的浮点结果,看看数值都正常吗

      2023-01-31
      0
    • 颜值即正义回复lollipop:

      可能是数据类型没选择对,可以用int之类的再尝试一下。刚才你提到有加入argmax,那等于已经把mask算出来了呀,直接用这个结果不可以吗。

      2023-01-31
      0
    • lollipop回复颜值即正义:

      是的,加入arg之后就是0,1通道的索引了,这个值要怎么取出来?

      2023-01-31
      0
    • 颜值即正义回复lollipop:

      可以先验证一下这两个模型的输出数据是否接近吗?第一个:使用地平线工具链之前的,你自己训练好的浮点模型。第二个模型:使用地平线工具链转换过程中生成的***_optimized_float_model.onnx模型。对同样一张图片做推理,不需要做后处理,就验证这两个模型的输出数值是不是能对上。

      2023-02-01
      0
    • lollipop回复颜值即正义:

      onnx这个是没问题的

      2023-02-01
      0
    • 颜值即正义回复lollipop:

      可以把这些数据保存下来,用python或者什么工具画一张灰度图,看一下可视化结果怎么样

      2023-02-01
      0
    • 颜值即正义回复lollipop:

      你有查看过自己训好的pytorch模型的可视化推理结果吗?

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      data是指针,是模型输出数据的首地址

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      您也可以参考我们的runtime_sample示例来理解C++代码编写思路。

      2023-02-02
      0
    • lollipop回复颜值即正义:

      麻烦您了,怎么打印出完整的输出数据啊~

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      可以利用numpy格式去查看

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      用于把H*W图中每个点分数最高的通道的序号给top_index

      2023-02-02
      0
    • lollipop回复颜值即正义:

      这里边的data和cdata不都是地址吗,是怎么参与的计算啊

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      c_data[c]就是*[c_data+c]

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      我看不出来哟,浮点输出的话和python那边的结果对一下看看呢

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      嗯嗯,这样看数值是能对上的

      2023-02-02
      0
    • 颜值即正义回复lollipop:

      不知道你在python那边做到哪一步了,建议先验证一下pytorch推理的可视化结果是不是OK的,然后再来考虑移植到J3上。

      2023-02-02
      0
    • lollipop回复颜值即正义:

      python那边都完事了,可视化结果也都正常

      2023-02-02
      0
    • lollipop回复lollipop:

      我还有个疑问就是,现在不是双通道了吗,我的模型shape是1*2*384*384,在Python端可以分别查看两个通道的输出数值,在板端这边怎么看呢,我现在输出的ss看着也只是一个通道下的结果

      2023-02-02
      0
    • 颜值即正义回复lollipop:
      可以利用c_data,在h和w的双循环内,打印c_data[0]就是通道0,c_data[1]就是通道1
      2023-02-02
      0
    • 颜值即正义回复lollipop:

      data是虚拟地址的首地址,输出数据是存储在一整块连续的内存空间中的。

      2023-02-02
      0
    • lollipop回复颜值即正义:

      那应该是cdata这边取值有问题,我在python端看两个通道的数值是对的上的,一个通道数值大,一个小,,,这个cdata 0和1的值差不多

      那两个通道的值是怎么存放的呢

      2023-02-03
      0
    • 颜值即正义回复lollipop:
      先存C,再存W,再存H,再存N。可以看一下for (int c = 0; c < channel; c++)这段循环,每个通道的值挨个比大小,所以对于特定的H和W,两个通道的值是连续存放的。
      2023-02-03
      0
    • 颜值即正义回复lollipop:

      这段后面cout每个变量看一下

      2023-02-03
      0
    • 颜值即正义回复颜值即正义:

      height width channel 和 h_index w_index c_index 这6个变量都看一下值

      2023-02-03
      0
    • lollipop回复颜值即正义:

      现在输出已经正确了,就是输出还是0,1(二分类分割),这个可视化是我将板端输出值拷贝出来,使用python可视化的。

      但是对于板端可视化有什么建议吗,就是板端后处理之后直接生成可视化图片这种

      2023-02-03
      0
    • 颜值即正义回复lollipop:

      一般来说板端推理出正确的结果,交给下游任务继续处理就可以了,不需要可视化。如果想把生成的结果作为图片保存,可以考虑利用opencv,背景就用0,前景用255,保存下来就是一张单通道的黑白图了。opencv的调用可以参考runtime sample的resize示例哈。

      2023-02-03
      0
    • lollipop回复颜值即正义:

      好的,感谢

      2023-02-03
      0
  • 颜值即正义
    Lv.2
    2023-04-24
    0
    0