PaddleOCR/deploy/slim/prune/README_ch.md

4.9 KiB
Raw Blame History

> 运行示例前请先安装develop版本PaddleSlim

模型裁剪压缩教程

压缩结果:

序号 任务 模型 压缩策略[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

概述

复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余,模型裁剪通过移出网络模型中的子模型来减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。

该示例使用PaddleSlim提供的裁剪压缩API对OCR模型进行压缩。

在阅读该示例前,建议您先了解以下内容:

- OCR模型的常规训练方法

- PaddleSlim使用文档

安装PaddleSlim


git clone https://github.com/PaddlePaddle/PaddleSlim.git

cd Paddleslim

python setup.py install

获取预训练模型

检测预训练模型下载地址

敏感度分析训练

加载预训练模型后,通过对现有模型的每个网络层进行敏感度分析,了解各网络层冗余度,从而决定每个网络层的裁剪比例。敏感度分析的具体细节见:敏感度分析

进入PaddleOCR根目录通过以下命令对模型进行敏感度分析


python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1

裁剪模型与fine-tune

裁剪时通过之前的敏感度分析文件决定每个网络层的裁剪比例。在具体实现时为了尽可能多的保留从图像中提取的低阶特征我们跳过了backbone中靠近输入的4个卷积层。同样为了减少由于裁剪导致的模型性能损失我们通过之前敏感度分析所获得的敏感度表挑选出了一些冗余较少对裁剪较为敏感的网络层并在之后的裁剪过程中选择避开这些网络层。裁剪过后finetune的过程沿用OCR检测模型原始的训练策略。


python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1

导出模型

在得到裁剪训练保存的模型后我们可以将其导出为inference_model用于预测部署


python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model