背景
当你在开源平台上看到一个优质的深度学习模型并想使用它时,很多时候会遇到一个棘手的问题,就是这个模型所使用的深度学习框架与你所熟悉的框架并不相同,导致你难以快速的使用这个模型。
深度学习模型跨框架迁移一直是一件不太容易的事情,面对这个问题时一般有两个选择,一是手动转换代码至你所熟悉的框架并重新训练模型;二是使用各种模型转换工具对模型进行直接一键的转换。前者难度高、耗时长而且还需要算力的支持;而后者使用方便快捷,但是普适性不强,对于一些特殊的模型直接使用工具转换可能是行不通的。
今天就通过一个实例:使用飞桨X2Paddle将Caffe框架训练的OpenPose 手部关键点检测模型的迁移至PaddlePaddle框架上,并实现推理部署,介绍一下如何使用模型转换工具来解决深度学习模型跨框架迁移的问题。
本文包含了模型从转换到部署预测的相关代码实现,并以教程的形式开放在AI Studio平台上,大家可以直接在AI Studio平台上直接运行本文中的完整代码。(AI Studio链接:
https://aistudio.baidu.com/aistudio/projectdetail/1150796)
X2Paddle简介
X2Paddle是飞桨官方开发的一个模型转换工具,支持将其它深度学习框架训练得到的模型,转换至PaddlePaddle模型。目前X2Paddle支持如下三种模型转换方式,即:TensorFlow、Caffe和ONNX。上述的三种转换方式基本能够直接或者间接地覆盖大部分主流框架,如:TensorFlow、Caffe和其他支持导出ONNX模型的框架(Pytorch、MXNet等)。
X2Paddle安装:一般使用pip的方式来安装X2Paddle,命令如下:
pip install x2paddle --index https://pypi.Python.org/simple/
模型介绍
手部关键点检测,旨在找出给定图片中手指上的关节点及指尖关节点,其类似于面部关键点检测(Facial Landmark Detection) 和人体关键点检测(Human Body Pose Estimation)。手部关键点检测的应用场景包括:手势识别、手语识别与理解和手部的行为识别等。
模型检测效果如下图:
模型转换
转换模型首先需要下载源模型,对于一个Caffe模型,一般包括如下两个文件,即模型计算图文件(* .prototxt)和模型权重文件(* .caffemodel),本次转换的模型就包含如下文件:pose_deploy.prototxt和pose_iter_102000.caffemodel。
模型准备好之后,就可以使用X2Paddle进行模型转换。只需要通过下面的命令,就可以将上述的Caffe模型转换成PaddlePaddle的模型了:
x2paddle --framework=caffe # 源模型类型 (tensorflow、caffe、onnx)
--prototxt=pose_deploy.prototxt # 指定caffe模型的proto文件路径
--weight=pose_iter_102000.caffemodel # 指定caffe模型的参数文件路径
--save_dir=pd_model # 指定转换后的模型保存目录路径
--params_merge # 当指定该参数时,转换完成后,inference_model中的所有模
执行完上述命令,等待转换完成后,你将会在指定的模型保存目录下看到可供PaddlePaddle框架调用的模型,该目录下包含如下两个文件夹:model_with_code和inference_model。前者包含Paddle模型代码和训练可加载模型权重文件;后者则为Paddle推理模型。因为本次只介绍推理部署,所以主要关注于转换生成的推理模型。
在生成的推理模型文件夹中同样包含模型计算图文件(__model__)和模型权重文件(__params__)两个文件,这样的推理模型可直接被Paddle Inference高性能推理引擎调用,完成推理部署的操作。
模型部署
PaddlePaddle推理模型部署一般使用Paddle Inference高性能推理引擎进行部署,下面就通过代码讲解一下如何Paddle Inference的使用方法,需要如下十个步骤。
1. 导入必要的包。
import os
import numpy as np
from paddle.fluid.core import AnalysisConfig, PaddleTensor
from paddle.fluid.core import create_paddle_predictor
2. 设置模型路径。
modelpath = 'pd_model/inference_model'
model = os.path.join