基于L1-Norm评价准则,我们采用了一种自适应与固定比例相结合(Adaptive and Fixed-scale Pruning)的启发式剪枝策略对视频人像抠图模型MODNet进行压缩,该策略较大程度去除了MODNet中的冗余参数,并降低了计算代价,在存储资源的利用上节省了79%!🎆
此外,我们采用OpenVINO将边缘计算引入视频人像抠图技术,通过边缘端推理测试,剪枝模型MODNet-P取得了一定的速度提升与较好的视觉推理效果!🎆
🚩论文地址
git clone https://github.com/sisyphus-cv-lab/MODNet-ModelCompression
cd MODNet-ModelCompression
pip install -r requirements.txt
wget -c https://paddleseg.bj.bcebos.com/matting/datasets/PPM-100.zip -O src/datasets/PPM-100.zip
mkdir src/datasets
unzip src/datasets/PPM-100.zip -d src/datasets
获取地址,各模型含义如下:
- new_modnet:MODNet官方预训练模型。但为了便于剪枝,网络结构定义发生了轻微改变;
- new_mobilenetv2_human_seg:backbone官方预训练模型(改变同上);
- our_modnet:通过在合成数据集上训练得到,作为剪枝的基准模型;
- pruned_modnet:剪枝与再训练后的模型;
python main_prune.py --ckpt_path .\pretrained\our_modnet.ckpt --ratio 0.5 --threshold 0.5
🔥NOTE:
- python main.py -h 获取剪枝时待输入的参数及相关介绍;
- threshold:用于控制MODNet主干网络MobileNetV2部分的剪枝阈值;
- ratio:用于控制MODNet其他网络分支的剪枝比例;
- 剪枝完成后,得到剪枝后的模型及其对应的网络配制文件(.json);该配制文件用于再训练、模型评估、模型推理以及模型导出时网络的构建;
json文件信息如下:
{
"ratio": 模型剪枝比例,
"threshold": 自适应分析阈值,
"new_cfg": [
MobileNetV2倒置残差块的输出通道数
],
"new_expansion_cfg": [
MobileNetV2倒置残差块中膨胀因子的大小
],
"new_lr_channels": [
LR分支的输出通道数
],
"new_hr_channels": [
HR分支的输出通道数
],
"new_f_channels": [
F分支的输出通道数
]
}
对步骤4中剪枝得到的模型进行再训练,恢复精度。
python .\src\trainer.py --model-path .\result\modnet_p_ratio_0.5_thresh_0.5.ckpt --batch-size 2 --epoch 4
🔥NOTE:默认每一个轮次保存模型,以便通过模型评价得到最佳模型;
python .\src\eval.py --ckpt-path .\result\modnet_p_ratio_0.5_thresh_0.5_epoch0.ckpt --prune-info .\result\modnet_p_ratio_0.5_thresh_0.5.json
python .\src\infer.py --ckpt-path .\result\modnet_p_ratio_0.5_thresh_0.5_epoch0.ckpt --prune-info .\result\modnet_p_ratio_0.5_thresh_0.5.json
将再训练后的最优剪枝模型导出,例如epoch0为最优模型,导出指令如下:
python .\onnx\export_onnx.py --ckpt-path .\result\modnet_p_ratio_0.5_thresh_0.5_epoch0.ckpt --prune-info .\result\modnet_p_ratio_0.5_thresh_0.5.json --output-path .\result\modnet_p_ratio_0.5_thresh_0.5_best.onnx
使用OpenVINO 中的模型优化器(model optimizer)融合BN层,从而实现模型的进一步压缩与加速。
mo --input_model .\result\modnet_p_ratio_0.5_thresh_0.5_best.onnx --model_name pruned_modnet --output_dir .\result\
得到模型优化得到xml与bin文件后,利用OpenVINO Python API 装载、完成模型推理。
python inference_openvino.py --model-path .\result\pruned_modnet.xml --image-path .\data\img.jpg --device CPU
评估指标 | MODNet | MODNet-P |
---|---|---|
参数量/M | 6.45 | 1.34 |
计算量/G | 18.32 | 4.38 |
模型大小/M | 25.64 | 5.66 |
均方误差(MSE) | 0.009912 | 0.018713 |
平均绝对误差(MAD) | 0.013661 | 0.022816 |
🔥NOTE:
- 训练数据集通过随机组合得到,因此,表格中MODNet精度指标MSE、MAD与原论文不一致。
硬件推理设备 | MODNet | MODNet-P |
---|---|---|
Intel i7-8565U CPU | 88.86 ms | 45.93 ms |
NSC2 | 167.93 ms | 101.93 ms |
... | ... | ... |
🔥NOTE:
- 使用OpenVINO在NSC2上推理时,需要采用USB3.0接口;
微调 | 从头训练 | |
---|---|---|
固定主干网络剪枝 | 0.018291 | 0.015588 |
对整个模型进行剪枝 | 0.018632 | 0.016826 |
🔥NOTE:
-
进一步对比微调与从头训练两种方式的性能,固定主干网络与否对MODNet进行剪枝、测试;
-
为了便于观察比较,这里仅使用MSE作为评价准则。
关于本项目任何的疑问、建议,欢迎submit issue或联系 hbchenstu@outlook.com.
https://github.com/ZHKKKe/MODNet
https://github.com/actboy/MODNet
https://github.com/Eric-mingjie/rethinking-network-pruning