Toybrick

标题: 模型转换,量化的一些问题 [打印本页]

作者: zhuhairong    时间: 2019-7-18 11:17
标题: 模型转换,量化的一些问题
mobilenet ssd caffe模型转换到 rknn 模型,转换过程的打印:
--> config model
done
--> Loading model
W Unhandle status: the input shape of reshape layer mbox_conf_reshape_186 is not 4-D
done
--> Building model
W The RKNN Model generated can not run on simulator when pre_compile is True.
W Unhandle status: the input shape of reshape layer mbox_conf_reshape_186 is not 4-D
W Unhandle status: the input shape of reshape layer mbox_conf_reshape_186 is not 4-D
done
--> Export RKNN model
done


转换完的模型效果和pc有比较大的差距。
1. 请问W Unhandle status: the input shape of reshape layer mbox_conf_reshape_186 is not 4-D, 会引起什么问题?
2. 量化的时候图片多少,差别很大,图片多效果也不一定好,甚至出现乱框。如何量化可以达到和原始模型一样的效果 ?

作者: jefferyzhang    时间: 2019-7-23 10:11
量化是个比较大的专题,我个人也在研究,很难给出一个完美的答案。
不过量化图片肯定是越多越好,我有一个算法公司的客户模型都是用了10w+张照片量化,半个多小时才量化完,
而且rknn支持混合量化,需要微调每一层的量化结构,如果某些层需要精度很高可以关闭量化。可调性很强,需要多调试。
作者: Qmax    时间: 2019-7-24 17:46
jefferyzhang 发表于 2019-7-23 10:11
量化是个比较大的专题,我个人也在研究,很难给出一个完美的答案。
不过量化图片肯定是越多越好,我有一个 ...

我只想问下,已经用tflite量化好的模型在转的时候要指定量化类型吗
作者: jefferyzhang    时间: 2019-7-25 10:22
Qmax 发表于 2019-7-24 17:46
我只想问下,已经用tflite量化好的模型在转的时候要指定量化类型吗

我问不到这个问题的答案,理论上是不需要的,你存储时候就已经是int8了,转换时候还是int8,不需要再次量化
作者: zhuhairong    时间: 2019-7-29 19:13
多谢,混合量化也是个麻烦的事情,不清楚哪些层影响大。
作者: protossw512    时间: 2019-7-30 07:47
jefferyzhang 发表于 2019-7-23 10:11
量化是个比较大的专题,我个人也在研究,很难给出一个完美的答案。
不过量化图片肯定是越多越好,我有一个 ...

请问一下,有没有办法把tflite量化好的模型的rknn量化参数读出来进行手动调整?我怀疑自动转换的环节有些地方match的不对,我们现在相同的输入tflite的量化模型输出和转成rknn的模型输出差距很大。
作者: abcehac    时间: 2019-8-8 12:12
jefferyzhang 发表于 2019-7-23 10:11
量化是个比较大的专题,我个人也在研究,很难给出一个完美的答案。
不过量化图片肯定是越多越好,我有一个 ...

请问,我是不是可以理解成,在执行 rknn_transform.py 时,do_quantization=True,我在data中放入的图片越多,那么量化后转换出来的模型就会更好呢?

如果不开启量化,转换后的模型和yolo原模型的精度是不是基本一致的?

这个量化是说在提高了转换模型的速度还是说回头可以提高实际使用时的识别速度?
作者: jefferyzhang    时间: 2019-8-8 14:00
abcehac 发表于 2019-8-8 12:12
请问,我是不是可以理解成,在执行 rknn_transform.py 时,do_quantization=True,我在data中放入的图片 ...

量化提高了速度,降低了成本。正常来说肯定是量化图片越多精度越高。
不开启量化默认是用FP16,可以手动设置成FP32。只要类型一致,计算结果和原模型运算结果是一样的。

NPU计算单元最多的是INT8,其次是FP16,最少的是FP32。量化后全部使用INT8,是可以达到满3T的算力的。FP16和FP32算力就会下降很多。

作者: abcehac    时间: 2019-8-8 14:26
jefferyzhang 发表于 2019-8-8 14:00
量化提高了速度,降低了成本。正常来说肯定是量化图片越多精度越高。
不开启量化默认是用FP16,可以手动 ...

感谢解答!!!也就是说不开启量化的话,NPU的计算力达不到最大!

也麻烦您帮忙看看《yolov3_demo中py文件源代码是不是有点小问题?原贴有问题重发》仔细看了下yolov3_demo的python代码,有些地方似乎有点小问题,多谢!
作者: jefferyzhang    时间: 2019-8-9 12:57
abcehac 发表于 2019-8-8 14:26
感谢解答!!!也就是说不开启量化的话,NPU的计算力达不到最大!

也麻烦您帮忙看看《yolov3_demo中py文 ...

是的,量化后才能达到最大算力。这也是目前业界算力功耗比最高的做法。
作者: abcehac    时间: 2019-8-9 15:45
jefferyzhang 发表于 2019-8-9 12:57
是的,量化后才能达到最大算力。这也是目前业界算力功耗比最高的做法。 ...

好滴!我发现,如果只用demo中的几张图做transform的话,运行yolov3tiny根本识别不到东西,识别到了也基本都是错的。不知道您用的coco80个label的是哪版coco?

这个3399pro板子tranform darnet53的weights,cpu直接超频了……看来全网络只能在电脑上transform……
作者: 17708867778    时间: 2019-8-12 13:56
jefferyzhang 发表于 2019-7-23 10:11
量化是个比较大的专题,我个人也在研究,很难给出一个完美的答案。
不过量化图片肯定是越多越好,我有一个 ...

版主您好,我们在量化的时候用了8W+的图,但是在转换的过程,感觉根本没有加载图片去量化,量化函数是True,请问还有可能是哪些问题,或者调哪些函数解决这样的情况?
作者: jefferyzhang    时间: 2019-8-12 15:48
17708867778 发表于 2019-8-12 13:56
版主您好,我们在量化的时候用了8W+的图,但是在转换的过程,感觉根本没有加载图片去量化,量化函数是Tru ...

为什么会有这种感觉。8W+都写入dataset.txt里了么
作者: 17708867778    时间: 2019-8-12 22:52
本帖最后由 17708867778 于 2019-8-12 22:54 编辑
jefferyzhang 发表于 2019-8-12 15:48
为什么会有这种感觉。8W+都写入dataset.txt里了么

8W+的数据全部写入了,出现这种感觉是因为3分钟就转化完成了C:\Users\yhy\Desktop\11.png

作者: abcehac    时间: 2019-8-12 23:00
jefferyzhang 发表于 2019-7-23 10:11
量化是个比较大的专题,我个人也在研究,很难给出一个完美的答案。
不过量化图片肯定是越多越好,我有一个 ...

如果要是量化10W+的图片,那是不是batch_size = 1000000?
我现在开启量化,把coco2014的所有图片名字都放在 dataset.txt中,但是依旧1-2分钟就量化完了。是不是我也要根据txt中的图片数量调整batch_size的数值?
作者: 17708867778    时间: 2019-8-13 01:34
jefferyzhang 发表于 2019-8-12 15:48
为什么会有这种感觉。8W+都写入dataset.txt里了么

rknn.config(channel_mean_value='0 0 0 255', reorder_channel='0 1 2', batch_size=16)

上面的这个batch_size的数量只会被加载一次,也就是只会量化batch_size数量这么多的图片

我看rknn.py文件中有个rknn_batch_size,这个函数是不是把batch_size加载进来的图片分rknn_batch_size次量化完,然后就执行rknn.export_rknn了?

我把batch_size=600,再往上加电脑就崩溃了,16g内存扛不住


作者: jefferyzhang    时间: 2019-8-13 11:00
本帖最后由 jefferyzhang 于 2019-8-13 11:02 编辑
abcehac 发表于 2019-8-12 23:00
如果要是量化10W+的图片,那是不是batch_size = 1000000?
我现在开启量化,把coco2014的所有图片名字都放 ...

rknn只支持batch_size=1,10w+图片就是epoch=10w,batch_size=1.
量化时候的batch_size应该是指多少张图片作为一组结果进行量化,所以你10w的batchsize实际上只计算了一组量化数据,还是需要开高epoch

作者: abcehac    时间: 2019-8-13 13:12
jefferyzhang 发表于 2019-8-13 11:00
rknn只支持batch_size=1,10w+图片就是epoch=10w,batch_size=1.
量化时候的batch_size应该是指多少张图片 ...

噢噢!好嘞!!!多谢!

模型转换这里我觉得很神奇,我只需要给模型resize后的图片,都不用给每个图片的label,它就能参考图片调整精度,它是怎么做到的???是不是我每个图片名字必须是这个图片中物体的label才行?

我只是在板子上的python库中的rknn/api/rknn.py中看到
def config(self, batch_size=100, ......)发现默认值是100。没想到它竟然只支持1!我要是用PC转换模型,这batch_size可以设置的更大吗?


作者: jefferyzhang    时间: 2019-8-13 18:34
abcehac 发表于 2019-8-13 13:12
噢噢!好嘞!!!多谢!

模型转换这里我觉得很神奇,我只需要给模型resize后的图片,都不用给每个图片的 ...

就用默认就好了,设置多少合理是没有准确答案的,只能不停的试验(深度学习不就是这样)
量化和Label是没有关系的,他的目的是将每一层的float转成int8 + 反量化参数,所以需要大量图片来测试每层数据通过时候这层的定浮点转换如何在最小精度损失情况下完成量化。
量化是一门很大的学问,要具体研究下,我对量化的理解可能也不够专业。
作者: abcehac    时间: 2019-8-13 22:19
jefferyzhang 发表于 2019-8-13 18:34
就用默认就好了,设置多少合理是没有准确答案的,只能不停的试验(深度学习不就是这样)
量化和Label是没 ...

噢!!原来是这个逻辑!那我是不是也应该放进去一些假的图片或者说不在我label内的图片,这样是不是能起到防止量化后的模型过度拟合呢???

我在1.1.0版本的rknn/api/rknn.py 中看到 config和build两个类中都有了batch_size参数,build中是rknn_batch_size ,范围是[0-128),默认值为1。官方文档和py中都没有写明这两个batch_size的关系。所以我准备把他们都先设置成30看看,数大了,我的电脑跑不动。
作者: jefferyzhang    时间: 2019-8-13 23:27
abcehac 发表于 2019-8-13 22:19
噢!!原来是这个逻辑!那我是不是也应该放进去一些假的图片或者说不在我label内的图片,这样是不是能起 ...

量化不是训练!!!
量化只是把浮点转定点,运算速度快而已
作者: abcehac    时间: 2019-8-14 12:48
jefferyzhang 发表于 2019-8-13 23:27
量化不是训练!!!
量化只是把浮点转定点,运算速度快而已

哈哈哈哈, 看来我又想多了……
作者: 呱唧    时间: 2020-4-2 18:04
jefferyzhang 发表于 2019-8-8 14:00
量化提高了速度,降低了成本。正常来说肯定是量化图片越多精度越高。
不开启量化默认是用FP16,可以手动 ...

do_quantization设置成False的时候默认是FP16吗?那要怎么设置成FP32呢?
作者: jefferyzhang    时间: 2020-4-2 18:08
呱唧 发表于 2020-4-2 18:04
do_quantization设置成False的时候默认是FP16吗?那要怎么设置成FP32呢?

混合量化后一层层改fp32.
不提供直接的接口,因为没人用




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