Toybrick

标题: caffe 模型转换为rknn后 识别一直错 [打印本页]

作者: jarvis    时间: 2019-5-16 16:09
标题: caffe 模型转换为rknn后 识别一直错
根据demo的代码转换caffe模型  转换成功了 可是预测结果一直不对
求大佬看下问题
# Create RKNN object
rknn = RKNN()

# pre-process config
print('--> config model')
rknn.config(channel_mean_value='84.29 84.8 83.61 1', reorder_channel='2 1 0')
print('done')

# Load tensorflow model
print('--> Loading model')
ret = rknn.load_caffe(model='./model.prototxt',
                      proto='caffe',
                      blobs='./model.caffemodel')
if ret != 0:
    print('Load mobilenet_v2 failed! Ret = {}'.format(ret))
    exit(ret)
print('done')

# Build model
print('--> Building model')
ret = rknn.build(do_quantization=
False)
if ret != 0:
   
print('Build mobilenet_v2 failed!')
    exit(ret)
print('done')

# Export rknn model
print('--> Export RKNN model')
ret = rknn.export_rknn(
'./model.rknn')
if ret != 0:
   
print('Export mobilenet_v2.rknn failed!')
    exit(ret)
print('done')

# Set inputs
img = cv2.imread('./000.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

print('--> Init runtime environment')
ret = rknn.init_runtime()
if ret != 0:
   
print('Init runtime environment failed')
    exit(ret)
print('done')

# Inference
print('--> Running model')
outputs = rknn.inference(
inputs=[img])
show_outputs(outputs)
print('done')


作者: jefferyzhang    时间: 2019-5-17 12:03
可以的话建议你一层一层输入输出转换调试,看看具体是哪一层造成的输出差异
作者: yoline    时间: 2019-6-12 09:08
我也是这样 caffe训练好的模型 转过来和caffe上的结果差异很大 LZ找到问题所在了么
作者: yoline    时间: 2019-6-12 09:49
把量化关了 结果基本一致了
作者: uuii9988    时间: 2019-7-26 21:57
jefferyzhang 发表于 2019-5-17 12:03
可以的话建议你一层一层输入输出转换调试,看看具体是哪一层造成的输出差异 ...

请问怎么一层层的输出,我的模型和转换完rknn差距也很大
作者: uuii9988    时间: 2019-7-26 22:01
jefferyzhang 发表于 2019-5-17 12:03
可以的话建议你一层一层输入输出转换调试,看看具体是哪一层造成的输出差异 ...

量化已经关掉了
作者: puyanan    时间: 2019-8-5 09:47
jefferyzhang 发表于 2019-5-17 12:03
可以的话建议你一层一层输入输出转换调试,看看具体是哪一层造成的输出差异 ...

您好,.pb模型转换成rknn模型后,只能查看输入层和输出层数据?  您说的一层一层输入输出转换调试,是不是要选择中间的两个层分别作为输入输出层重新转换成rknn模型,再查看这两层的数据?
作者: puyanan    时间: 2019-8-5 09:49
uuii9988 发表于 2019-7-26 21:57
请问怎么一层层的输出,我的模型和转换完rknn差距也很大

是否要将中间的两个层分别作为输入输出层,重新转换成rknn模型,然后再查看这两层的数据?我还没有试,你试过了吗?
作者: jefferyzhang    时间: 2019-8-5 11:58
puyanan 发表于 2019-8-5 09:49
是否要将中间的两个层分别作为输入输出层,重新转换成rknn模型,然后再查看这两层的数据?我还没有试,你 ...

是的,可以的,但是 建议你 卷积+激活+池化 不要拆开
作者: puyanan    时间: 2019-8-5 17:58
jefferyzhang 发表于 2019-8-5 11:58
是的,可以的,但是 建议你 卷积+激活+池化 不要拆开

您好。在RK虚拟机里面,将pb模型转换成rknn模型,不量化(do_quantization=False)。那么模型转换前后的中间层数据一样吗?我在PC端直接用pb模型,在RK虚拟机里面用转换后的rknn模型,发现经过第一个conv+relu后(该层没有池化),数据完全不一样,数量级都不同。请问,理论上应该一样的吗?
作者: jefferyzhang    时间: 2019-8-7 10:02
puyanan 发表于 2019-8-5 17:58
您好。在RK虚拟机里面,将pb模型转换成rknn模型,不量化(do_quantization=False)。那么模型转换前后的中 ...

一样的,但是要注意rknn转换默认用fp16,可以强制fp32和原模型一致。这里可能会造成一点点精度误差。
数量级不一样要检查你的代码和转换代码,是否归一化设置有问题。

rknn是可以自动归一化的,不要重复做了归一处理
作者: wzc    时间: 2019-8-15 10:44
jefferyzhang 发表于 2019-8-7 10:02
一样的,但是要注意rknn转换默认用fp16,可以强制fp32和原模型一致。这里可能会造成一点点精度误差。
数 ...

请问是不量化的话也是会转成fp16吗?然后怎么强制保持fp32不变呢?
作者: jefferyzhang    时间: 2019-8-15 12:14
wzc 发表于 2019-8-15 10:44
请问是不量化的话也是会转成fp16吗?然后怎么强制保持fp32不变呢?

你可以看下混合量化那章。
作者: wzc    时间: 2019-8-20 19:12
jefferyzhang 发表于 2019-8-15 12:14
你可以看下混合量化那章。

你好,我看了一下,是混合量化用delete模式,把dtype改为none就是代表不量化,那么它就是p32的吗?还是说和正常没有开量化一样fp16的?文档写的不是很清楚
作者: wzc    时间: 2019-8-20 19:58
jefferyzhang 发表于 2019-8-15 12:14
你可以看下混合量化那章。

另外,还有一个问题,如果想看用用toolkit量化之后的网络具体参数(权重、偏置等),toolkit有输出的方法吗?我看使用指南里只有混合量化能输出最大最小值。
作者: jefferyzhang    时间: 2019-8-21 09:11
wzc 发表于 2019-8-20 19:58
另外,还有一个问题,如果想看用用toolkit量化之后的网络具体参数(权重、偏置等),toolkit有输出的方法 ...

暂时没有办法查看,可以暂且认为和原模型是一样的
作者: jefferyzhang    时间: 2019-8-21 09:15
wzc 发表于 2019-8-20 19:12
你好,我看了一下,是混合量化用delete模式,把dtype改为none就是代表不量化,那么它就是p32的吗?还是说 ...

我具体问了下NPU部门,他们说内部有办法可以,暂时还没开放接口。不过我已经要求他们开放API接口了,请关注后续版本更新。
作者: wzc    时间: 2019-8-21 10:07
jefferyzhang 发表于 2019-8-21 09:15
我具体问了下NPU部门,他们说内部有办法可以,暂时还没开放接口。不过我已经要求他们开放API接口了,请关 ...

开放接口指的是,可以让模型转化成fp32,还是说可以输出量化后的网络参数呀?
作者: jefferyzhang    时间: 2019-8-21 10:22
wzc 发表于 2019-8-21 10:07
开放接口指的是,可以让模型转化成fp32,还是说可以输出量化后的网络参数呀? ...

说的是 FP32

网络参数不确定他们会不会提供,提供也不确定你们如何直观的去看他。
你们可以暂且认为参数是和原模型一样的,为什么要去怀疑参数呢。
作者: wzc    时间: 2019-8-23 08:55
jefferyzhang 发表于 2019-8-21 10:22
说的是 FP32

网络参数不确定他们会不会提供,提供也不确定你们如何直观的去看他。

感谢解答,我在做量化的事情,所以想看看toolkit量化的中间参数,和这个帖子的主题无关,让您误会了,抱歉。
作者: jefferyzhang    时间: 2019-8-23 10:46
wzc 发表于 2019-8-23 08:55
感谢解答,我在做量化的事情,所以想看看toolkit量化的中间参数,和这个帖子的主题无关,让您误会了,抱 ...

这个看NPU部门Roadmap有没有设计这么看了。目前他们是认为看rknn的参数并没有太大意义,量化后你需要经过反量化计算才能知道源参数是什么,去看这些参数并不是一个好的debug方式。
作者: wzc    时间: 2019-8-23 11:34
jefferyzhang 发表于 2019-8-23 10:46
这个看NPU部门Roadmap有没有设计这么看了。目前他们是认为看rknn的参数并没有太大意义,量化后你需要经过 ...

好的,然后现在又遇到一个问题,使用toolkit的时候,量化校正的数据集一张和两百多张的准确率没有什么差别是为什么呀?而且量化完了asymmetric_quantized-u8和dynamic_fixed_point-8的效果都很差,我看到建议图片是大于两百张,这个结果是因为网络比较简单一张就够了吗?还是说两百张也太少了需要更多呢?网络是mobilenetV1,做的图片分类
作者: jefferyzhang    时间: 2019-8-23 11:46
wzc 发表于 2019-8-23 11:34
好的,然后现在又遇到一个问题,使用toolkit的时候,量化校正的数据集一张和两百多张的准确率没有什么差 ...

这种东西就是只能靠不停的实验得出结果。200张其实也不够多,我们客户都是用上万张去量化的。
量化是个很复杂的技术,如果不满意结果,是可以通过混合量化来细调的,好的量化技术是可以无限接近于原模型精度,我们也只是提供了量化的渠道和方式,至于如何调参能达到完美的精度,这个只能具体问题具体分析。
甚至只能不停的尝试来解决(神经网络目前没有足够的理论支撑,大部分都是靠不停的实验来提高精度)




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