C++环境下部署深度学习模型方案

目录

一、问题背景

二、解决方案

2.1 C++调用python

2.2 Python服务接口

2.3 Python转c++(不推荐)

2.4 深度学习部署框架(推荐)

三、总结

3.1 接口形式分类

3.2 优缺点比较


一、问题背景

        现在的深度学习框架一般都是基于 Python 来实现,构建、训练、保存和调用模型都可以很容易地在 Python 下完成。但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将总结在C++环境下如何部署Py训练好的模型。

二、解决方案

2.1 C++调用python

Python 提供了一套 C API库,使得开发者能很方便地从C/ C++ 程序中调用 Python 模块。

参考我另一篇博客

C++调用Python完成“表达式计算”功能并打包发布_俊俊的博客-CSDN博客

2.2 Python服务接口

使用flask后台框架创建一个http服务器

客户端POST一个请求上来(例如上传了一张图片的url),服务器检测到有请求,就会解析url的图片,接着调用深度学习模型,得到推理结果后以json的格式把结果返回给客户端

模型部署3/3-手把手实现利用flask深度学习模型部署 - 知乎

Flask深度学习模型服务端部署 - 简书

或者自己手写一个TCP通信,自定义通信数据格式,可采用yaml或者json格式

2.3 Python转c++(不推荐)

Pythran翻译

 一条命令自动把 Python 翻译成等价 C++ - 知乎

有些语法、函数不识别,不适合转复杂项目,只适合简单运算

比如:字符串格式化format

#pythran export eval_function(str)
def eval_function(a):
    print("input:{}".format(a))
    try:
        val = eval(a)
        return float(val)
    except Exception as e:
        print("err:{}".format(str(e)))
        return 0

报错

demo.py:18:10 error: Attribute 'format' unknown
----
    print("input:{}".format(a))
          ^~~~ (o_0)
----

又如 :不识别eval函数

#pythran export eval_function(str)
def eval_function(a):
    try:
        val = eval(a)
        return float(val)
    except Exception as e:
        return 0

报错

pythran.analyses.aliases.UnboundIdentifierError

2.4 深度学习部署框架(推荐)

        训练使用Python接口,部署使用部署框架的 C/C++ 接口来导入训练好的模型。目前主流的深度学习部署平台包含GPU、CPU、ARM等。模型部署框架则有英伟达推出的TensorRT,谷歌的Tensorflow和用于ARM平台的TF-Lite,开源的Caffe,百度的飞浆,腾讯的NCNN。

  • Nvidia GPU平台

框架 资料
Caffe
TensorRT TensorRT部署深度学习模型 - 知乎 深度学习模型部署(1)-Pytorch转TensorRT(C++版) - 知乎
TensorFlow C++部署TensorFlow模型_蓬莱道人的博客-CSDN博客_c++ tensorflow
PaddlePaddle
  • Intel CPU平台

框架 资料
Caffe
OpenVINO YOLOv5在最新OpenVINO 2021R02版本的部署与代码演示详解 - 云+社区 - 腾讯云 YOLOX之OpenVINO部署:C++版 - 知乎

  • ARM平台

框架 资料
NCNN
TF-Lite
Paddle-mobile
  • FPGA平台

框架 资料
xilinx

三、总结

3.1 接口形式分类

Python接口封装

1、采用C++调用Python的方式

2、采用Python服务接口的方式

C++接口封装

1、采用python转c++

2、采用现有的C++深度学习部署框架

3.2 优缺点比较

方案 优点 缺点
C++调用python 直接交互 无法隐藏Py代码、Py运行库体积较大
Python服务接口 客户端与服务器分离,有利于维护,且可跨主机 间接交互,无法满足实时性强的场景
Python转C++ 直接交互 并非所有python语法都能转换成功
深度学习部署框架 直接交互

你可能感兴趣的:(QT学习之路,深度学习,c++,qt,python)