Toybrick

标题: CenterNet精度量化效果很差 [打印本页]

作者: LSC    时间: 2019-12-31 16:25
标题: CenterNet精度量化效果很差
感谢版主这两天的回复,量化终于跑通了,但是效果真的很差。不使用量化的结果和pytorch版效果一样,使用uint8量化时,结果值能检测到一个框(一共十几个框)。数据集是预先按照CenterNet中预处理方式对图片进行resize得到的图片,dataset为5000张图,batchsize=100,epochs=50。
个人猜想精度损失很大有以下原因:
(1)归一化方式:CenterNet预处理中对图片三个通道分别进行归一化(均值方差均不同,均值[0.408, 0.447, 0.470],方差[0.289, 0.274, 0.278]),而转换RKNN模型时,由于归一化参数中方差只有一位,所以我设置的是方差三个的平均值。但我觉得这一点影响不大,因为三个方差差不太多。
(2)后处理:CenterNet输出的是物体中心点的热力图,后处理要使用Maxpooling找到峰值,即9个点中的最大值。量化之后热力图上原本很多比较接近的点数值都变成一样的数,就找不到最大值的点了。
(3)这个警告的影响?
  1. W Adjust min from [-5.106467] to [0.] for relu relu8_39
  2. W Adjust min from [-5.106467] to [0.] for relu relu13_67
  3. W Adjust min from [-5.106467] to [0.] for relu relu15_76
  4. W Adjust min from [-5.106467] to [0.] for relu relu17_85
  5. W Adjust min from [-4.101224] to [0.] for relu relu18_90
  6. W Adjust min from [-2.5565655] to [0.] for relu relu43_218
  7. W Adjust min from [-4.101224] to [0.] for relu relu23_118
  8. W Adjust min from [-4.101224] to [0.] for relu relu25_127
  9. W Adjust min from [-4.101224] to [0.] for relu relu27_136
  10. W Adjust min from [-3.4539304] to [0.] for relu relu28_141
  11. W Adjust min from [-24.208406] to [0.] for relu relu38_193
  12. W Adjust min from [-1.8253068] to [0.] for relu relu44_223
复制代码
请问我该怎样混合量化?




作者: jefferyzhang    时间: 2020-1-2 08:53
1. 确定是精度差还是压根就算错了,如果得出来结果和pytorch或者tf差距很大,或者符号位都不一样,那就是计算结果出问题了,而不是精度问题
2. 混合量化可以用二分法尝试,先一半量化一半不量化,看精度和速度是否可接受,然后再不断的加减量化层数
作者: LSC    时间: 2020-1-2 09:36
file:///C:/Users/hello/Desktop/result1.jpg
作者: LSC    时间: 2020-1-2 09:46
jefferyzhang 发表于 2020-1-2 08:53
1. 确定是精度差还是压根就算错了,如果得出来结果和pytorch或者tf差距很大,或者符号位都不一样,那就是计 ...

好的感谢提供思路,请问有没有办法查看每一层的参数?开对比一下量化前后参数差异。
作者: jefferyzhang    时间: 2020-1-2 10:14
LSC 发表于 2020-1-2 09:46
好的感谢提供思路,请问有没有办法查看每一层的参数?开对比一下量化前后参数差异。 ...

看参数没啥用吧,
你要把output输出节点配置不断往前挪,来确定输出和原模型差异
作者: LSC    时间: 2020-1-2 10:48
jefferyzhang 发表于 2020-1-2 08:53
1. 确定是精度差还是压根就算错了,如果得出来结果和pytorch或者tf差距很大,或者符号位都不一样,那就是计 ...

我上传不了图片,所以我传到百度云里了,result1.jpg是不使用量化的结果,result3.jpg是u8量化的结果,result5.jpg是f8量化的结果。应该是精度的问题而不是算错了吧。

百度云
链接:https://pan.baidu.com/s/1KQ9ViKzAiy1nNOhbYmzFew
提取码:vy2t

作者: jefferyzhang    时间: 2020-1-2 11:05
本帖最后由 jefferyzhang 于 2020-1-2 11:07 编辑
LSC 发表于 2020-1-2 10:48
我上传不了图片,所以我传到百度云里了,result1.jpg是不使用量化的结果,result3.jpg是u8量化的结果,re ...

额,不是看图片啊,图片哪能看出具体结果,你要看模型输出的值打印出来。。。。
如果不是bug,那就只能试试二分法做混合量化

作者: LSC    时间: 2020-1-2 11:07
jefferyzhang 发表于 2020-1-2 11:05
如果不是bug,那就只能试试二分法做混合量化

明白,我传的是三张结果图,确认一下是不是只是精度问题。
作者: jefferyzhang    时间: 2020-1-2 12:01
LSC 发表于 2020-1-2 11:07
明白,我传的是三张结果图,确认一下是不是只是精度问题。

从图是看不出精度问题的,只能推断出很可能是精度问题。。。
检不捡的出还得看你NMS阈值设置多少,得看NMS之前的数据才有可能看出问题。

作者: LSC    时间: 2020-1-2 14:47
jefferyzhang 发表于 2020-1-2 12:01
从图是看不出精度问题的,只能推断出很可能是精度问题。。。
检不捡的出还得看你NMS阈值设置多少 ...

谢谢,我用二分法调一下试试看
作者: LSC    时间: 2020-1-2 16:42
本帖最后由 LSC 于 2020-1-2 16:47 编辑
jefferyzhang 发表于 2020-1-2 12:01
从图是看不出精度问题的,只能推断出很可能是精度问题。。。
检不捡的出还得看你NMS阈值设置多少 ...

版主大大,再请教两个问题:
1. 如何进行通道级量化?是将cfg文件中各项method参数由layer改成channel吗?
2. config file的作用是什么?

  1. ...
  2. I Config File "/home/lsc/anaconda3/envs/RKNN/lib/python3.6/site-packages/rknn/base/RK1808_PID0X82" load/generated successfully
  3. I Initialzing network optimizer by /home/lsc/anaconda3/envs/RKNN/lib/python3.6/site-packages/rknn/base/RK1808_PID0X82 ...
  4. ...
复制代码




作者: jefferyzhang    时间: 2020-1-2 16:46
per_channel的量化我们不支持
作者: LSC    时间: 2020-1-3 10:18
混合量化,将一些层从cfg文件中去掉,方法改成delete,生成模型之后运行会报这个错误。

  1. Create RKNN model fail!
  2. E Catch exception when init runtime!
  3. E Traceback (most recent call last):
  4. E   File "rknn/api/rknn_base.py", line 788, in rknn.api.rknn_base.RKNNBase.init_runtime
  5. E   File "rknn/api/rknn_runtime.py", line 303, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
  6. E Exception: RKNN init failed. error code: RKNN_ERR_DEVICE_UNAVAILABLE
  7. W We need do some initial work, it will increase call time of inference for the first time.
  8. Create RKNN model fail!
  9. E Catch exception when init model!
  10. E Traceback (most recent call last):
  11. E   File "rknn/api/rknn_base.py", line 901, in rknn.api.rknn_base.RKNNBase.inference
  12. E   File "rknn/api/rknn_runtime.py", line 303, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
  13. E Exception: RKNN init failed. error code: RKNN_ERR_DEVICE_UNAVAILABLE
  14. Traceback (most recent call last):
  15.   File "ctdet.py", line 10, in <module>
  16.     det.run(img)
  17.   File "/home/lsc/rknn-toolkit-v1.3.0/centernet/ctdet_rknn_v2/detector.py", line 93, in run
  18.     output, dets = self.process(images)
  19.   File "/home/lsc/rknn-toolkit-v1.3.0/centernet/ctdet_rknn_v2/detector.py", line 44, in process
  20.     hm = output[3].reshape((1,80,128,128))
  21. TypeError: 'NoneType' object is not subscriptable
复制代码






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