MaochengHu 576cda45b8 first commit 2 years ago
..
README.md 576cda45b8 first commit 2 years ago
distill_pruned_model.py 576cda45b8 first commit 2 years ago
distill_pruned_model_demo.ipynb 576cda45b8 first commit 2 years ago

README.md

蒸馏通道剪裁模型教程

该文档介绍如何使用PaddleSlim的蒸馏接口和卷积通道剪裁接口对检测库中的模型进行卷积层的通道剪裁并使用较高精度模型对其蒸馏。

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

请确保已正确安装PaddleDetection及其依赖。

已发布蒸馏通道剪裁模型见压缩模型库

蒸馏通道剪裁模型示例见Ipython notebook示例

1. 数据准备

请参考检测库数据下载文档准备数据。

2. 模型选择

通过-c选项指定待剪裁模型的配置文件的相对路径,更多可选配置文件请参考: 检测库配置文件

蒸馏通道剪裁模型中,我们使用原模型全量权重来初始化待剪裁模型,已发布模型的权重可在模型库中获取。

通过-o pretrain_weights指定待剪裁模型的预训练权重,可以指定url或本地文件系统的路径。如下所示:

-o pretrain_weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_voc.tar

-o pretrain_weights=output/yolov3_mobilenet_v1_voc/model_final

4. 启动蒸馏剪裁任务

使用distill_pruned_model.py启动蒸馏剪裁任务时,通过--pruned_params选项指定待剪裁的参数名称列表,参数名之间用空格分隔,通过--pruned_ratios选项指定各个参数被裁掉的比例。 获取待裁剪模型参数名称方法可参考通道剪裁模教程

通过-t参数指定teacher模型配置文件,--teacher_pretrained指定teacher模型权重,更多关于蒸馏模型设置可参考模型蒸馏文档

蒸馏通道检测模型脚本目前只支持使用YOLOv3细粒度损失训练,即训练过程中须指定-o use_fine_grained_loss=true

python distill_pruned_model.py \
-c ../../../configs/yolov3_mobilenet_v1_voc.yml \
-t ../../../configs/yolov3_r34_voc.yml \
--teacher_pretrained=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r34_voc.tar \
--pruned_params "yolo_block.0.0.0.conv.weights,yolo_block.0.0.1.conv.weights,yolo_block.0.1.0.conv.weights" \
--pruned_ratios="0.2,0.3,0.4" \
-o use_fine_grained_loss=true pretrain_weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_voc.tar

5. 评估模型

由于产出模型为通道剪裁模型,训练完成后,可通过通道剪裁中提供的评估脚本../../prune/eval.py评估模型精度,通过--pruned_params--pruned_ratios指定剪裁的参数名称列表和各参数剪裁比例。

python ../../prune/eval.py \
-c ../../../configs/yolov3_mobilenet_v1_voc.yml \
--pruned_params "yolo_block.0.0.0.conv.weights,yolo_block.0.0.1.conv.weights,yolo_block.0.1.0.conv.weights" \
--pruned_ratios="0.2,0.3,0.4" \
-o weights=output/yolov3_mobilenet_v1_voc/model_final

6. 模型导出

如果想要将剪裁模型接入到C++预测库或者Serving服务,可通过../../prune/export_model.py导出该模型。

python ../../prune/export_model.py \
-c ../../../configs/yolov3_mobilenet_v1_voc.yml \
--pruned_params "yolo_block.0.0.0.conv.weights,yolo_block.0.0.1.conv.weights,yolo_block.0.1.0.conv.weights" \
--pruned_ratios="0.2,0.3,0.4" \
-o weights=output/yolov3_mobilenet_v1_voc/model_final