English | 简体中文
PaddleSlim对PaddleOCR发布的模型进行了压缩,产出了如下一系列小模型:
序号 | 任务 | 模型 | 压缩策略[3][4] | 精度(自建中文数据集) | 耗时[1](ms) | 整体耗时[2](ms) | 加速比 | 整体模型大小(M) | 压缩比例 | 下载链接 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 检测 | MobileNetV3_DB | 无 | 61.7 | 224 | 375 | - | 8.6 | - | |
识别 | MobileNetV3_CRNN | 无 | 62.0 | 9.52 | ||||||
1 | 检测 | SlimTextDet | PACT量化训练 | 62.1 | 195 | 348 | 8% | 2.8 | 67.82% | |
识别 | SlimTextRec | PACT量化训练 | 61.48 | 8.6 | ||||||
2 | 检测 | SlimTextDet_quat_pruning | 剪裁+PACT量化训练 | 60.86 | 142 | 288 | 30% | 2.8 | 67.82% | |
识别 | SlimTextRec | PACT量化训练 | 61.48 | 8.6 | ||||||
3 | 检测 | SlimTextDet_pruning | 剪裁 | 61.57 | 138 | 295 | 27% | 2.9 | 66.28% | |
识别 | SlimTextRec | PACT量化训练 | 61.48 | 8.6 |
注意:
- [1] 耗时评测环境为:骁龙855芯片+PaddleLite。
- [2] 整体耗时不等于检测耗时加识别耗时的原因是:识别模型的耗时为单个检测框的耗时,一张图片可能会有多个检测框。
- [3] 参考下面关于OCR量化的说明。
- [4] 参考下面关于OCR剪裁的说明。
对于OCR模型,普通的量化训练精度损失较大,并且训练不稳定。所以我们选择PACT方法进行量化
MobileNetV3_DB是一个全卷积模型,我们可以对整个模型进行量化。
整个量化训练的轮数与全精度模型的训练轮数一致,量化的配置如下所示:
quant_config = {
'weight_quantize_type': 'channel_wise_abs_max',
'activation_quantize_type': 'moving_average_abs_max',
'weight_bits': 8,
'activation_bits': 8,
'quantize_op_types': ['conv2d', 'depthwise_conv2d', 'mul'],
'dtype': 'int8',
'window_size': 10000,
'moving_rate': 0.9,
}
对于PACT参数,我们沿用了论文中的方法,截断阈值$\alpha$的学习率与原模型其他参数保持一致。另外,对其增加一个系数为0.0001的L2正则化,使用AdamOptimizer
对其进行优化,确保其能快速收敛。
MobileNetV3_CRNN模型包含一个LSTM组件,因为暂时不支持对LSTM进行量化,我们暂时跳过这一部分。
通过scope_guard API将LSTM切换到新的作用域skip_quant
,量化配置中通过not_quant_pattern
设置不对这一部分进行量化,具体量化配置如下:
quant_config = {
'weight_quantize_type': 'channel_wise_abs_max',
'activation_quantize_type': 'moving_average_abs_max',
'weight_bits': 8,
'activation_bits': 8,
'not_quant_pattern': ['skip_quant'],
'quantize_op_types': ['conv2d', 'depthwise_conv2d', 'mul'],
'dtype': 'int8',
'window_size': 10000,
'moving_rate': 0.9,
}
同样地,量化训练的轮数与全精度模型的训练轮数一致,PACT阈值$\alpha$的学习率与原模型其他参数保持一致。我们发现,对$\alpha$使用与原模型其他参数一样的L2正则化系数,量化训练就可以很好地收敛。关于优化器,使用AdamOptimizer
对其进行优化,确保其能快速收敛。
更多量化教程请参考OCR模型量化压缩教程
在对OCR文字检测模型进行裁剪敏感度分析时,分析对象为除depthwise convolution外的所有普通卷积层,裁剪的criterion被设置为'geometry_median',pruned_ratios推荐设置为[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]。
裁剪时通过之前的敏感度分析文件决定每个网络层的裁剪比例。在具体实现时,为了尽可能多的保留从图像中提取的低阶特征,我们跳过了backbone中靠近输入的4个卷积层。同样,为了减少由于裁剪导致的模型性能损失,我们通过之前敏感度分析所获得敏感度表,挑选出了一些冗余较少,对裁剪较为敏感网络层,并在之后的裁剪过程中选择避开这些网络层。裁剪过后finetune的过程沿用OCR检测模型原始的训练策略。
更多OCR剪裁教程请参考OCR模剪裁压缩教程