Toybrick

为什么 rknn.inference 模型输出的数组维度与原生模型不同

kitedream

中级会员

积分
284
楼主
发表于 2019-3-20 20:54:25    查看: 12802|回复: 6 | [复制链接]    打印 | 只看该作者
原来的pb文件输出的是四维数组  [1, a, b, c] ,转换为rknn文件后,输出的维度是二维 [1,a*b*c]
回复

使用道具 举报

程子

中级会员

积分
386
沙发
发表于 2019-3-20 21:40:03 | 只看该作者
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

版主

积分
13580
板凳
发表于 2019-3-21 09:06:17 | 只看该作者
需要reshape的,因为对于硬件存储的数据来说,都只是一维数组指针而已,需要显式转化你所知道的输出形状。
回复

使用道具 举报

kitedream

中级会员

积分
284
地板
 楼主| 发表于 2019-3-21 09:32:33 | 只看该作者
本帖最后由 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

版主

积分
13580
5#
发表于 2019-3-21 10:01:19 | 只看该作者
kitedream 发表于 2019-3-21 09:32
你好,请问 input_size_list 的尺寸,是按照维度顺序输入的吗?我目前在移植网上开源的openpose tensorfl ...

input size需要根据模型的第一个输入参数确认,不能随意写的。模型的输入shape是224你这里就只能输入224,否则就会出错
回复

使用道具 举报

kitedream

中级会员

积分
284
6#
 楼主| 发表于 2019-3-21 11:09:41 | 只看该作者
本帖最后由 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

新手上路

积分
20
7#
发表于 2020-1-13 16:44:39 | 只看该作者
我也遇到同样的问题,结果一直不对,请问楼上解决了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表