Toybrick

rknn_toolkit FAQ

toybrick

管理员

积分
0
发表于 2019-4-28 11:58:08    查看: 31601|回复: 11 | [复制链接]    打印 | 显示全部楼层
1. RKNN Toolkit 用法相关问题
1.1.rknn.config 函数,为什么 channel_mean_value 有 4 个值?如果是 rgb图像,还是 4 个值吗?

rknn.config 里面的 channel-mean-value: 用来设置预处理的命令行参数。包括四个值(M0 M1 M2 S0),前三个值为均值参数,后面一个值为 Scale 参数。对于输入数据是三通的(Cin0, Cin1, Cin2)数据来讲,经过预处理后,输出的数据为(Cout0,Cout1, Cout2),计算过程如下:
Cout0 = (Cin0 - M0)/S0
Cout1 = (Cin1 - M1)/S0
Cout2 = (Cin2 - M2)/S0
例如,如果需要将输入数据归一化到[-1, 1]之间,则可以设置这个参数为(128 128 128 128);
如果需要将输入数据归一化到[0, 1]之间,则可以设置这个参数为 (0 0 0 255)


1.2.当输入图像是单通道灰度图片时, rknn.config 接口如何设定?


请参考 1.1 的回答, 当输入图像是单通道时, 只用到”Cout0 = (Cin0 - M0)/S0”, 因此你可以设置为(M0, 0, 0, S0)M1M2 的值不会被用到。

1.3.rknn.config 函数,怎么设定 scale 参数,即把输入的 range
压缩到一定的范围。 e.g. from (0-255) to (0-1)。

参考 1.1 的回答。

1.4.rknn.Inference()接口调用多次后出错或者卡住如果出错信息类似:



请将 RKNN Toolkit 升级到 0.9.9 及以后。

1.5.rknn.inference()推理速度慢的问题。
这个问题有两方面的现象:
1) 进行前向推理测试速度慢,经测试 mobilenet-ssd 有的图片耗时在 0.5 秒以上
2) 模型 rknn.inference 的时间和 rknn.eval_perf()时间相差较大,比如
理论计算时间(单图)
1.79ms
8.23ms
7.485ms
30.55ms
实际计算时间(单图)
21.37ms
39.82ms
33.12ms
76.13ms

实测帧率慢的问题,有两方面的原因:
1. 使用 pc + adb 的方式传图片比较慢,这种对高帧率的网络影响很大比如理论 1.79ms 的网络。
2. RKNN Toolkit 0.9.8 及以前的版本的实现有 BUG,这个问题在 0.9.9 中已经解决。
对于更真实的实测帧率,可以直接在板子上使用
c/c++ api 进行测试。


1.6.RKNN Toolkit 0.9.9 版本第一次 inference 很慢。

RKNN Toolkit 0.9.9 版本将加载模型推迟到第一次 inference 时,因此第一次 inference 比较慢,这个问题将在下个版本中解决。

1.7.在开发板上用 RKNN Toolkit 转换模型时开启 pre_compile=true
出错。

Arm64 版本的 RKNN Toolkit 暂时还不支持 pre_compile,如果需要打开 pre_compile,建议在开发机上用 x86 版本 RKNN Toolkit 进行转换。

1.8.YOLO 前向测试返回的 outputs 为[array1 , array2],长度分别为[10140 ,40560],返回值含义是什么?

rknn.inference 返回的 outputs 是一个 numpy ndarray 的列表,每个模型输出数据大小个数都不一样,用户需要自行查找模型的对应输出和解析规则。

1.9.RKNN Toolkit 支持的量化方式。


RKNN 支持两种量化机制:
Quantization-aware training
可以参考 Tensorflow quantization-aware training(https://github.com/tensorflow/te ... ow/contrib/quantize),这种方法要求用户有一定的 fine tune 重训练的基础。使用 RKNN Toolkit 导入量化后的模型时使用rknn.build(do_quantization=False),这时 RKNN Toolkit 将使用模型自身的量化参数,因此在量化精度上不会有损失。
Post training quantization
使用这种方式时,用户导入已训练好的 float point 模型, RKNN Toolkit 根据用户提供的dataset 进行量化。 Dataset 应尽量覆盖模型可能的输入类型。官方提供的 example 为了简单一般只放一张图片,建议多放一些。

目前 RKNN Toolkit 支持 3 种量化方式:
asymmetric_quantized-u8default)这是 tensorflow支持的量化方式,也是 google推荐的。根据”Quantizing deep convolutionalnetworks for efficient inference: A whitepaper”论文的描述,对于大部分网络,这种量化方式对精度的损失最小。


dynamic_fixed_point-8
对于有些模型而言, dynamic_fixed_point-8 量化的精度比 asymmetric_quantized-u8 高。


dynamic_fixed_point-16
dynamic_fixed_point-16
的量化公式与 dynamic_fixed_point-8 一样,只不过 bw=16。对于rk3399pro/rk1808 而言, NPU 里面都带有 300Gops int16 的计算单元,对于某些量化到 8 位精度损失较大的网络,可以考虑使用此量化方式。


1.10.转换模型时如果 do_quantization 为 False,是否也会进行量化,量化精度是什么?(因为转换后模型体积小了接近一半)
分两种情况,当导入的模型是量化的模型时, do_quantization=False 会使用该模型里面的量化参数,具体请参考 1.9 的回答。当导入的模型是非量化模型时, do_quantization=False
不会做量化的操作,但是会把权重从 float32 转成 float16,这块不会有精度损失。

1.11.构建 RKNN 模型(调用 build 接口)时,设置 do_quantization=False 能构建成功,但是设成 True,构建失败
错误信息如下:



这是由于 dataset.txt 里没有数据,或者数据是我们不支持的格式,建议用 jpg npy

1.12.安装 RKNN-Toolkit 时出现”undefined symbol: PyFPE_jbuf”
错误。
出现这个错误的原因是 Python 环境不干净,比如在两个不同的路径里都安装了 numpy。可以重新创建一个干净的 Python 环境后再试。

1.13.Toybrick 上安装 RKNN-Toolkit 出现“Permission Denied”错误。
原因是没有 root 权限,安装的时候需要加上’ --user’选项。

1.14.RKNN 是否多输入的模型转换?
目前不支持多输入模型转换,该功能正在评估中。

1.15.RKNN 量化过程中的 dataset 起什么作用?为什么量化需要和 dataset 关联?
RKNN 量化过程中,需要找到合适的量化参数,比如 scale 或者 zero point,这些量化参数的选择需要根据实际的输入做 inference 来确定。

1.16.rknn.inference()是否支持同时输入多张图片?或者说支持 batch 输入。
目前不支持同时输入多张图片。

1.17.什么时候能支持 pytorch mxnet 模型直接转成 rknn

Pytorch 直接转换成 rknn 的功能正在开发中, mxnet 暂时没有计划。
[size=14.6667px]

2. 关于量化精度的问题
2.1.量化后精度与原来模型对不上,如何调试?
首先确保 float 类型的精度和原始平台测试结果相近:
(1) 使用 RKNN Toolkit 导入量化后的模型时使 rknn.build(do_quantization=False);
(2)
参考 1.1 设置 channel_mean_value 参数,确保其和训练模型时使用的参数相同;
(3)
务必确保测试时输入图像通道顺序为 R,G,B。(不论训练时使用的图像通道顺序如何,使用 RKNN 做测试时都按 R,G,B 输入)
(4) rknn.config 函数里面设置 reorder_channel 参数, ’0 1 2’代表 RGB’2 1 0’代表BGR,务必和训练时候图像通道顺序一致
量化后的精度测试
(1) 使用多张图进行量化,确保量化精度稳定。在 rknn.config 中设置 batch_size 参数 (建议设置 batch_size = 200) 并且在 dataset.txt 中给出大于 200 张图像路径用于量化。如果显存不够,可以设置 batch_size =1, epochs=200 代替 batch_size = 200 进行量化
(2) 精度对比,尽量用较大数据集进行测试。分类网络比较 top-1,top-5 精度,检测网络比较数据集的 mAP, Recall 等。

2.2.如何 dump
网络每层输出
目前 PC 模拟器可以支持 dump 出每一层网络的数据,在执行 inference 的脚本前需要设置一个环境变量,命令如下:
  1. export NN_LAYER_DUMP=1
  2. python xxx.py
复制代码

执行完之后,会在当前目录生成每层网络的 tensor 数据文件,这样可以和别的框架的数据进行逐层比对。
注意:有些层会被合并,比如
conv+bn+scale 会合并成一个 conv,这时候就需要和原来
模型的
scale 层的输出进行对比。

3. Caffe 模型转换常见问题

3.1.转换模型时,出现“Deprecated caffe input usage”错误
该模型是旧版的 caffe 的模式,需要修改输入层成如下类似格式。
  1. layer {
  2. name: "data"
  3. type: "Input"
  4. top: "data"
  5. input_param {
  6. shape {
  7. dim: 1
  8. dim: 3
  9. dim: 224
  10. dim: 224
  11. }
  12. }
  13. }
复制代码
3.2.转换模型时,出现“Message type "caffe.PoolingParameter" has no fieldnamed "round_mode"”错误。
Pool 层的 round_mode 字段不能识别,可以改成 ceil_model,比如原来是 round_mode:CEIL,那么可以删掉(默认 ceil_mode True)或者改成 ceil_mode:True

3.3.在进行 caffe 或者其他模型转换时, 出现”ValueError("'%s' is not a validscope name" % name)”的错误。

详细的错误信息类似如下:
T raise ValueError("'%s' is not a valid scope name" % name)
T ValueError: '_plus0_17' is not a valid scope name


对于这种情况是因为: layer name '_plusxxx' 用下划线开头不合法,要遵循 tensorflow 的命名规则:
  1. [A-Za-z0-9.][A-Za-z0-9_.\\-/]* (for scopes at the root)
  2. [A-Za-z0-9_.\\-/]* (for other scopes)
复制代码

3.4.Caffe 版 本 的 SSD 转 换 失 败 , 出 现 “Invalid tensor id(1),tensor(@mbox_conf_flatten_188:ut0)”的错误。

不支持 detectionoutput 这个 layer,可以删掉,改成在 CPU 做。

3.5.Caffe版本的 SSD模型去掉 detectionoutput后应该有 3output tensor,但 RKNN 推理时实际只返回两个 tensor。

这个缺失的 tensor 是先验框,它在训练、推理阶段都一样,且对所有输入都一样,为了提高性能, RKNN-Toolkit 在模型中将相关的层优化掉了。而要得到该先验框 tensor,可以在训练阶段将先验框的 tensor 保存下,或者用 Caffe inference 一次。

3.6.py-faster-rcnn 模 型 转 换 时 出 现 “ValueError: Invalid tensor id(1),tensor(@rpn_bbox_pred_18:ut0)”错误。

与官方相比需要修改 prototxt 中的'proposal'层如下:


  1. layer {
  2. name: 'proposal'
  3. type: 'proposal'
  4. bottom: 'rpn_cls_prob_reshape'
  5. bottom: 'rpn_bbox_pred'
  6. top: 'rois'
  7. top: 'scores'
  8. proposal_param {
  9. ratio: 0.5 ratio: 1.0 ratio: 2.0
  10. scale: 8 scale: 16 scale: 32
  11. base_size: 16
  12. feat_stride: 16
  13. pre_nms_topn: 6000
  14. post_nms_topn: 300
  15. nms_thresh: 0.7
  16. min_size: 16
  17. }
  18. }
复制代码

4. Tensorflow 模型转换常见问题

4.1.转 换 google 官 方的 ssd_mobilenet_v2 模 型出现 “AttributeError:‘NoneType’ object has no attribute op” 错误。
一个可能的原因是 input 节点没有取对,可以改成如下:

4.2.转换 SSD_Resnet50_v1_FPN_640x640 模型出现“Cannot convert value dtype ([‘resource’, ‘u1’]) to a Tensorflow Dtype” 错误。
需更新 RKNN Toolkit 0.9.8 及以后版本。
  1. rknn.load_tensorflow(tf_pb='./ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb',
  2. inputs=['FeatureExtractor/MobilenetV2/MobilenetV2/input'],
  3. outputs=['concat', 'concat_1'],
  4. input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])
复制代码


5. Pytorch 模型转换常见问题

目前 RKNN Toolkit 通过 ONNX 间接支持 pytorch,因此需要将 pytorch 先转成 ONNX。如果转换过程遇到问题,请先将 RKNN Toolkit 升级到最新版本。

5.1.转换时遇到类似“assert(tsr.op_type == 'Constant')”的错误。
这是 pytorch 0.4.5 以后的版本引入的问题,在你的模型中,有类似“x = x.view(x.size(0),-1)”这样的语句,需要改成“x = x.view(int(x.size(0)), -1)” 。  





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

momo

注册会员

积分
104
发表于 2019-4-28 16:52:59 | 显示全部楼层
楼主,关于dataset的图片,采用模型训练时用的图片吗?
回复

使用道具 举报

zhangzj

超级版主

积分
1109
发表于 2019-4-28 17:53:56 | 显示全部楼层
momo 发表于 2019-4-28 16:52
楼主,关于dataset的图片,采用模型训练时用的图片吗?

可以的,只要图片格式满足模型的输入要求
回复

使用道具 举报

vanilla

注册会员

积分
90
发表于 2019-5-6 11:06:11 | 显示全部楼层
请教楼主,还不是很懂量化时为啥要做inference,直接用model里的各层权值不能计算出zero point这些数值吗?
回复

使用道具 举报

metaphor22

新手上路

积分
23
发表于 2019-5-7 09:31:46 | 显示全部楼层
请问楼主,rknn的源码开放吗?是否可以通过商业途径向你们获取?
回复

使用道具 举报

jefferyzhang

版主

积分
12844
发表于 2019-5-17 12:15:37 | 显示全部楼层
vanilla 发表于 2019-5-6 11:06
请教楼主,还不是很懂量化时为啥要做inference,直接用model里的各层权值不能计算出zero point这些数值吗? ...

因为需要知道每一层运算后的结果精度范围,而不是权值的精度范围.
量化输入的图片越多,精度会越高
回复

使用道具 举报

jefferyzhang

版主

积分
12844
发表于 2019-5-17 12:16:25 | 显示全部楼层
metaphor22 发表于 2019-5-7 09:31
请问楼主,rknn的源码开放吗?是否可以通过商业途径向你们获取?

当前没有开放的消息,任何渠道都无法获取
回复

使用道具 举报

evalu

新手上路

积分
44
发表于 2019-5-28 17:15:52 | 显示全部楼层
现在板子还可以申请试用吗?
回复

使用道具 举报

linpanda

注册会员

积分
135
发表于 2019-8-20 08:45:31 | 显示全部楼层
请问楼主,我现在需要转换一个caffe模型,该模型的输入是一个9通道的矩阵,因为build模型的时候需要图片来校正精度,但是9通道的图片整不出来,有什么方法吗
回复

使用道具 举报

zwj1234

注册会员

积分
84
发表于 2020-3-5 13:49:02 | 显示全部楼层
再用rknn做推理的时候,rknn_output得到的数组结果和在gpu上获取到的推理结果不同,用的是同一个模型,同一个网络,相同的输入,结果相差很大,是哪块处理的不对呢
回复

使用道具 举报

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

本版积分规则

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


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