Toybrick

Tensorflow模型转换图像长宽不相等时会出现问题

protossw512

中级会员

积分
252
发表于 2019-4-23 04:49:03    查看: 8525|回复: 6 | [复制链接]    打印 | 显示全部楼层
本帖最后由 protossw512 于 2019-4-23 04:50 编辑

在转换tensorflow pb文件的时候,发现长宽不相等的图像会出现问题。不知道是不是 load_tensorflow函数里面的imput_size_list长和宽的顺序反了。我们自己训练了一个输入是300(高,height)x400(长,width)x3的deeplabv3+(官方的代码库),在转化的时候,这是我们的设置:

  1.     rknn = RKNN(verbose=True)
  2.     rknn.config(channel_mean_value='127.5 127.5 127.5 127.5', reorder_channel='0 1 2')

  3.     print('--> loading model')

  4.     ret = rknn.load_tensorflow(
  5.         tf_pb='./deeplab_300x400.pb',
  6.         inputs=['MobilenetV2/MobilenetV2/input'],
  7.         outputs=['logits/semantic/BiasAdd'],
  8.         input_size_list=[[300, 400, 3]])

  9.     if ret != 0:
  10.         print('Load model failed! Ret = {}'.format(ret))
  11.         exit(ret)

  12.     print('--> building model')
  13.     ret = rknn.build(do_quantization=True, dataset='./dataset_300x400.txt')
  14.     if ret != 0:
  15.         print('export error')
  16.         exit(ret)

  17.     print('done')
复制代码
模型能够正常转化,但是在inference的时候会出现init失败:
  1. E Catch exception when releasing runtime environment!
  2. T Traceback (most recent call last):
  3. T   File "rknn/api/rknn_base.py", line 837, in rknn.api.rknn_base.RKNNBase.perf
  4. T   File "rknn/api/redirect_stdout.py", line 76, in rknn.api.redirect_stdout.redirect_stdouter.redirect_stdout.func_wrapper
  5. T   File "rknn/api/redirect_stdout.py", line 77, in rknn.api.redirect_stdout.redirect_stdouter.redirect_stdout.func_wrapper
  6. T   File "rknn/api/rknn_base.py", line 932, in rknn.api.rknn_base.RKNNBase._recreate_rknn_runtime
  7. T   File "rknn/api/rknn_runtime.py", line 275, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
  8. T Exception: RKNN init failed. error code: RKNN_ERR_FAIL
  9. E Performance information is empty, some mistakes may happened.
  10. E [op_check:280]Concat input dims size(25 vs 19)
  11. E [setup_node:337]Check node[103] CONCAT fail
  12. E Catch exception when init model!
  13. T Traceback (most recent call last):
  14. T   File "rknn/api/rknn_base.py", line 625, in rknn.api.rknn_base.RKNNBase.inference
  15. T   File "rknn/api/rknn_runtime.py", line 275, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
  16. T Exception: RKNN init failed. error code: RKNN_ERR_FAIL
复制代码
这里会说“E [op_check:280]Concat input dims size(25 vs 19)” 19是300尺寸的那个边对应的维度,25是400尺寸的那个边对应的维度,这里的错误显然是原本应该是19现在成了25(或者反过来)

我认为应该是在初始化的时候和转化模型的时候对长宽边的顺序判断有问题。当使用400x400的pb文件之后,则没有任何问题。

回复

使用道具 举报

zhangzj

超级版主

积分
1117
发表于 2019-4-24 09:04:55 | 显示全部楼层
长宽不一样的这个pb用TensorFlow可以正常推理吗?
回复

使用道具 举报

protossw512

中级会员

积分
252
 楼主| 发表于 2019-4-25 09:39:15 | 显示全部楼层
zhangzj 发表于 2019-4-24 09:04
长宽不一样的这个pb用TensorFlow可以正常推理吗?

测试过了,pb可以用tensorflow正常输出结果(使用的输入,输出节点和rknn模型相同)。而且本来也就是用300x400的分辨率训练的。
回复

使用道具 举报

protossw512

中级会员

积分
252
 楼主| 发表于 2019-4-30 01:26:03 | 显示全部楼层
能反馈给开发组看看吗?
回复

使用道具 举报

zhangzj

超级版主

积分
1117
发表于 2019-4-30 09:56:42 | 显示全部楼层
protossw512 发表于 2019-4-30 01:26
能反馈给开发组看看吗?

原始的pb文件能发出来吗?开发组需要原始模型才能看。
回复

使用道具 举报

protossw512

中级会员

积分
252
 楼主| 发表于 2019-5-3 06:34:48 | 显示全部楼层
本帖最后由 protossw512 于 2019-5-3 07:00 编辑
zhangzj 发表于 2019-4-30 09:56
原始的pb文件能发出来吗?开发组需要原始模型才能看。

好的,模型在这里(其实就是tensorflow的deeplabv3+):
https://www.dropbox.com/s/kvipjd ... x400_epoch0.pb?dl=0
这个并不是训练好的模型,只是在变量初始化好就保存的,所以输出会比较随机,但是不影响调试。

我转换时的配置如下:
  1. rknn.config(channel_mean_value='127.5 127.5 127.5 127.5', reorder_channel='0 1 2')

  2.     ret = rknn.load_tensorflow(
  3.         tf_pb='./frozen_inference_graph-300x400_epoch0.pb',
  4.         inputs=['MobilenetV2/MobilenetV2/input'],
  5.         outputs=['logits/semantic/BiasAdd'],
  6.         input_size_list=[[300, 400, 3]])

  7.     ret = rknn.build(do_quantization=True, dataset='./300x400_data.txt')
复制代码
模型可以正常转换,但是在读取的时候会报错:
在x86版本的rknn上运行会报错:
  1. --> Init runtime environment
  2. done
  3. E [op_check:280]Concat input dims size(25 vs 19)
  4. E [setup_node:337]Check node[106] CONCAT fail
  5. E Catch exception when init model!
  6. T Traceback (most recent call last):
  7. T   File "rknn/api/rknn_base.py", line 625, in rknn.api.rknn_base.RKNNBase.inference
  8. T   File "rknn/api/rknn_runtime.py", line 275, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
  9. T Exception: RKNN init failed. error code: RKNN_ERR_FAIL
  10. Traceback (most recent call last):
  11.   File "eval_performance.py", line 44, in <module>
  12.     pred = prediction[0]
  13. TypeError: 'NoneType' object is not subscriptable
复制代码
注意这行:E [op_check:280]Concat input dims size(25 vs 19)   实际就是在25x19的feature map上concat的时候尺寸不对,长宽反了,但是在转换模型的时候,包括量化的时候都没有报错。

在3399pro上运行也是初始化报错,但是没有说为什么

  1. --> Init runtime environment
  2. done
  3. E Catch exception when init model!
  4. T Traceback (most recent call last):
  5. T   File "rknn/api/rknn_base.py", line 679, in rknn.api.rknn_base.RKNNBase.get_run_perf_on_hardware
  6. T   File "rknn/api/rknn_runtime.py", line 275, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
  7. T Exception: RKNN init failed. error code: RKNN_ERR_MODEL_INVALID
  8. E Performance information is empty, some mistakes may happened.
  9. E Catch exception when init model!
  10. T Traceback (most recent call last):
  11. T   File "rknn/api/rknn_base.py", line 625, in rknn.api.rknn_base.RKNNBase.inference
  12. T   File "rknn/api/rknn_runtime.py", line 275, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
  13. T Exception: RKNN init failed. error code: RKNN_ERR_MODEL_INVALID
  14. Traceback (most recent call last):
  15.   File "eval_performance.py", line 44, in <module>
  16.     pred = prediction[0]
  17. TypeError: 'NoneType' object is not subscriptable
复制代码

在3399pro的c++版本也会报错:
  1. init model done
  2. rknn_init fail! ret=-6
复制代码
查了下也是"RKNN_ERROR_MODEL_INVALID"

如果我在转换模型的时候把input_size_list设置成[[400, 300, 3]],那么无法通过量化:
  1. T ValueError: Negative dimension size caused by subtracting 25 from 19 for 'AvgPool2D/AvgPool_54/AvgPool' (op: 'AvgPool') with input shapes: [100,25,19,160].
  2. export error
复制代码
但是如果我不量化直接转换成16bit,可以正常转换,但是在inference的时候会卡死在init上不动:
  1. --> Init runtime environment
  2. done
复制代码
所以我分析在量化的时候和实际读取inference的时候长宽的维度给弄反了,希望能够调查一下,否则只能输入400x400的图像,对运算速度会是不小的增加。


回复

使用道具 举报

protossw512

中级会员

积分
252
 楼主| 发表于 2019-5-7 01:21:41 | 显示全部楼层
zhangzj 发表于 2019-4-30 09:56
原始的pb文件能发出来吗?开发组需要原始模型才能看。

超版麻烦帮忙反馈一下,谢谢了
回复

使用道具 举报

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

本版积分规则

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


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