Toybrick

标题: rknn多图推理参数设置 [打印本页]

作者: peng    时间: 2019-10-10 17:16
标题: rknn多图推理参数设置
rknn不仅支持单张图片推理,还支持多图同时进行推理,以mnist的模型为例,这里把batch_size设为3:
  1. def common_transfer(pb_name,export_name):
  2.         ret = 0
  3.         #看具体log 传入verbose=True
  4.         rknn = RKNN()
  5.         #灰度图无需此步操作
  6.         # rknn.config(channel_mean_value='', reorder_channel='')
  7.         print('--> Loading model')

  8.         ret = rknn.load_tensorflow(
  9.                 tf_pb='./mnist_frozen_graph.pb',
  10.                 inputs=['x'],
  11.                 outputs=['y_conv'],
  12.                 input_size_list=[[28,28,1]])
  13.         if ret != 0:
  14.                 print('load_tensorflow error')
  15.                 rknn.release()
  16.                 return ret
  17.         print('done')
  18.         print('--> Building model')
  19.         rknn.build(rknn_batch_size=3,do_quantization=False)
  20.         print('done')
  21.         # 导出保存rknn模型文件
  22.         rknn.export_rknn('./mnist.rknn')
  23.         # Release RKNN Context
  24.         rknn.release()
  25.         return ret
复制代码
然后进行推理,推理的结果会把三张图片的结果合并在一个list中,需要我们自己将其分割开:
  1. def predict(rknn,length):
  2.     acc_count = 0
  3.     mat = []
  4.     for i in range(length):
  5.         im = mnist.test.images[i]
  6.         # im = Image.open("../MNIST_data/mnist_test/test_%d.jpg"%i)   # 加载图片
  7.         # im = im.resize((28,28),Image.ANTIALIAS)
  8.         # im = np.asarray(im)
  9.         im = im.reshape(28,28,1)
  10.         mat.append(im)
  11.         if len(mat) == 3:
  12.             mat = np.array(mat).reshape(3,28,28,1)
  13.             outputs = rknn.inference(inputs=[mat])
  14.             outputs1 = outputs[0][0][0:10]
  15.             outputs2 = outputs[0][0][10:20]
  16.             outputs3 = outputs[0][0][20:]
  17.             outputs = [[[outputs1]],[[outputs2]],[[outputs3]]]
  18.             j = 2
  19.             for output in outputs:
  20.                 pred, prob = get_predict(output)
  21.                 if i == 2:
  22.                     print(output)
  23.                     print(prob)
  24.                     print(pred)
  25.                 if list(mnist.test.labels[i-j]).index(1) == pred:
  26.                     acc_count += 1
  27.                 j -= 1
  28.             mat = []
  29.         else:
  30.             pass
  31.         if i ==100 or i ==500 or i ==1000 or i ==10000:
  32.             result = float(acc_count)/i
  33.             print('result%d:'%i,result)
  34.     result = float(acc_count)/length
  35.     print('result:',result)
复制代码
最终其结果和单张推理的结果是相同的.

作者: gwjjj35    时间: 2019-10-15 10:38
您好       我按照您的代码风格重新写了一下,输出的结果还是对不上,而且有类似“0.      ”这样奇怪的数据。单图推理和多图推理的结果截图如下:




     希望您能解答一下  

     谢谢!

作者: peng    时间: 2019-10-15 11:13
你的输出是softmax分类吗,我看你的output的类别有点多
作者: peng    时间: 2019-10-15 11:13
gwjjj35 发表于 2019-10-15 10:38
您好       我按照您的代码风格重新写了一下,输出的结果还是对不上,而且有类似“0.      ”这样奇怪的数 ...


你的输出是softmax分类吗,我看你的output的类别有点多
作者: gwjjj35    时间: 2019-10-15 11:22
peng 发表于 2019-10-15 11:13
你的输出是softmax分类吗,我看你的output的类别有点多

不是的,我的输出也是640*480的图像
作者: peng    时间: 2019-10-15 14:16
gwjjj35 发表于 2019-10-15 11:22
不是的,我的输出也是640*480的图像

我的输出是十个类别,和你的例子应该是不一样的,可能需要调整下输入输出节点
作者: gwjjj35    时间: 2019-10-16 08:55
peng 发表于 2019-10-15 14:16
我的输出是十个类别,和你的例子应该是不一样的,可能需要调整下输入输出节点 ...

有没有官方技术人员解答一下呀!着急!
作者: jefferyzhang    时间: 2019-10-16 11:59
gwjjj35 发表于 2019-10-16 08:55
有没有官方技术人员解答一下呀!着急!

输出图片的要注意下是NCHW结构还是NHWC结构。
调换下试试结果。
不是很懂的情况下,可以用c接口枚举出输出类型看下。
作者: raul    时间: 2019-10-18 09:30
gwjjj35 发表于 2019-10-15 10:38
您好       我按照您的代码风格重新写了一下,输出的结果还是对不上,而且有类似“0.      ”这样奇怪的数 ...
  1. output0 = outputs[0]
  2. output1 = outputs[1]
  3. optput2 = outputs[2]
  4. print(output0)
复制代码

这样写试下。打印output0看跟单张是不是类似的?
作者: gwjjj35    时间: 2019-10-23 16:27
jefferyzhang 发表于 2019-10-16 11:59
输出图片的要注意下是NCHW结构还是NHWC结构。
调换下试试结果。
不是很懂的情况下,可以用c接口枚举出输 ...

我的数据是单通道的,试了batch_size=2和batch_size=3计算结果还是对不上,和单图推理相差很多,而且我也试了量化和不量化,都不行。就差这功能就大致能满足帧率要求了....有什么建议吗?

C接口枚举输出类型是什么意思?不是很明白,望解答,谢谢!
作者: gwjjj35    时间: 2019-10-23 16:28
raul 发表于 2019-10-18 09:30
这样写试下。打印output0看跟单张是不是类似的?

我尝试了一下,结果并不类似....
作者: jefferyzhang    时间: 2019-10-23 16:30
batchsize=1是否一致
作者: 几头米    时间: 2019-10-29 16:08
你好, 请问是否有c++ 接口的示例,谢谢
作者: 呱唧    时间: 2020-3-16 16:29
请问一下,这里将rknn_batch_size设为3,一次跑3张图片,比rknn_batch_size设为1,顺序执行3张图片要快吗?大概快多少?
作者: jefferyzhang    时间: 2020-3-17 09:49
呱唧 发表于 2020-3-16 16:29
请问一下,这里将rknn_batch_size设为3,一次跑3张图片,比rknn_batch_size设为1,顺序执行3张图片要快吗? ...

这个不一定快,得看NPU是不是刚好有空闲资源。
NPU是分时复用的,除非刚好遇到一个简单的OP出现NPU资源空闲,可以通过加大batch塞满计算资源外,其余都是分时复用的,batch=3和batch=1送三次没区别。




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