Toybrick

标题: 为什么 rknn.inference 模型输出的数组维度与原生模型不同 [打印本页]

作者: kitedream    时间: 2019-3-20 20:54
标题: 为什么 rknn.inference 模型输出的数组维度与原生模型不同
原来的pb文件输出的是四维数组  [1, a, b, c] ,转换为rknn文件后,输出的维度是二维 [1,a*b*c]

作者: 程子    时间: 2019-3-20 21:40
RKNN的维度格式是 BCHW (Batch, Channel, Height, Width),并且输出是摊平的。
  1. output = rknn.inference(inputs=[input])
  2. output = np.transpose(output.reshape((batch, channel, height, width)), (0, 2, 3, 1))
复制代码

作者: jefferyzhang    时间: 2019-3-21 09:06
需要reshape的,因为对于硬件存储的数据来说,都只是一维数组指针而已,需要显式转化你所知道的输出形状。
作者: kitedream    时间: 2019-3-21 09:32
本帖最后由 kitedream 于 2019-3-21 11:11 编辑
jefferyzhang 发表于 2019-3-21 09:06
需要reshape的,因为对于硬件存储的数据来说,都只是一维数组指针而已,需要显式转化你所知道的输出形状。 ...

你好,请问 input_size_list 的尺寸,是按照维度顺序输入的吗?我目前在移植网上开源的openpose tensorflow 其中的mobile thin 版本,(https://github.com/alesolano/openpose_explained ),目前只卡在rknn输出结果和pb 文件输出结果在经过相同的处理后,pb文件结果正确,rknn输出结果经上述reshape后,结果完全错乱,其他的reshape方案都测试过。rknn模型我是在pc上编译的,尝试过多种尺寸。
  1.     rknn.load_tensorflow(tf_pb='./models/mobilenet_thin/graph_opt.pb',
  2.                          inputs=['image'],
  3.                          outputs=['Openpose/concat_stage7'],
  4.                          input_size_list=[[224,224, 3]])
复制代码
  1. input_size_list=[[432,368, 3]]
  2. input_size_list=[[224,224, 3]]
  3. input_size_list=[[416,416, 3]]
复制代码

  1. rknn.config(channel_mean_value='0 0 0 255', reorder_channel='0 1 2', batch_size=1)
复制代码

  1.     # Build model
  2.     print('--> Building model')
  3.     rknn.build(do_quantization=True, dataset='./data.txt',pre_compile=False)
  4.     # rknn.build(do_quantization=False)
  5.     print('done')
复制代码

其中,quantization 的数据是我将一张图片resize到相应输入尺寸得到的。

作者: jefferyzhang    时间: 2019-3-21 10:01
kitedream 发表于 2019-3-21 09:32
你好,请问 input_size_list 的尺寸,是按照维度顺序输入的吗?我目前在移植网上开源的openpose tensorfl ...

input size需要根据模型的第一个输入参数确认,不能随意写的。模型的输入shape是224你这里就只能输入224,否则就会出错
作者: kitedream    时间: 2019-3-21 11:09
本帖最后由 kitedream 于 2019-3-21 11:11 编辑
jefferyzhang 发表于 2019-3-21 10:01
input size需要根据模型的第一个输入参数确认,不能随意写的。模型的输入shape是224你这里就只能输入224 ...

你好,原pb模型是用432×368尺寸训练,输入为opencv的image图片,这样input_size_list=[[368,432,3]]
rknn转换输出如下信息

  1. D [rknn_init:749] Input Tensors:
  2. D [printRKNNTensor:662] index=0 name= n_dims=4 dims=[1 3 368 432] n_elems=476928 size=476928 fmt=NCHW type=UINT8 qnt_type=AFFINE fl=0 zp=0 scale=0.003922
  3. D [rknn_init:762] Output Tensors:
  4. D [printRKNNTensor:662] index=0 name= n_dims=4 dims=[1 57 46 54] n_elems=141588 size=141588 fmt=NCHW type=UINT8 qnt_type=AFFINE fl=6 zp=6 scale=0.004017
复制代码


然后我进行维度转换

  1.         output=output.reshape(1, 57, 46, 54)
  2.         output = np.transpose(output, (0, 2, 3, 1))
复制代码


试了一下,结果依然不正常
模型信息可见 https://github.com/ildoonet/tf-pose-estimation

作者: jessbrick    时间: 2020-1-13 16:44
我也遇到同样的问题,结果一直不对,请问楼上解决了吗




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3