Paddle分割模型部署到windows平台的QT软件中(C++)

目的:使用paddleseg开源框架训练分割模型,并将训好的模型转为C++代码,部署到已有的C++项目中,提供视觉检测模块,平台为windows10, QT5.12.8。

硬件环境:

  • 服务器或者带有GPU的电脑,用于训练paddleseg模型;
  • 目标部署电脑: windows10系统,QT5.12.8, VS2017,;

软件环境:

  • CUDA11.0, cudnn8.0 模型训练电脑;

  • Paddlepaddle, PaddleSeg, labelme(标注数据);

  • Paddleinference, opencv, yaml-cpp(按照paddleinference 文档安装);

部署步骤:

  1. 数据标注(prepare dataset),labelme标注分割标签,并且转换为VOC训练格式;
  2. 模型训练(train model),将标注好的数据放到相应的文件夹下,选择合适的模型(deeplabv3),修改相应的yaml文件,开始训练;
  3. 模型预测(predict model),使用实际图片验证当前模型是否已经训好达到要求,如果效果一般,可以继续增加训练iter;
  4. 模型导出(export model),一键导出,主要提供给c++调用,包含模型参数和模型结构,yaml配置等,将导出的文件拷贝到自己的项目目录中;
  5. 环境准备(deploy prepare),安装paddleinference,从官网下载,安装opencv,一般自己的项目提前已经安装好,安装yaml-cpp,并进行编译,获得yaml-cpp lib文件,并将其拷贝到项目的lib文件夹;
  6. QT编译运行(running),在QT中编译运行,解决各种环境问题,比如需要在.pro中添加各种包和库,比如paddle_infer, yaml, mkdl等;

遇到的问题:

  1. 在QT中如何使用C++导入模型进行测试,官网的例程是Linux平台的运行代码,如果需要迁移到qt中使用,需要进行相应的修改,首先,.pro项目文件中Include和LIB路径需要包含paddle_inference, yaml-cppmd.lib, mkldnn, gflags等,INCLUDEPATH += \$\$PWD/paddle_inference/paddle/include LIBS += -L\$\$PWD/paddle_inference/paddle/lib/ -llibpaddle_inference\ -lpaddle_inference INCLUDEPATH += \$\$PWD/paddle_inference/third_party/install/mkldnn/include LIBS += -L\$\$PWD/paddle_inference/third_party/install/mkldnn/lib/ -lmkldnn INCLUDEPATH += \$\$PWD/paddle_inference/third_party/install/gflags/include LIBS += -L\$\$PWD/paddle_inference/third_party/install/gflags/lib/ -lgflags_static INCLUDEPATH += \$\$PWD/env/yaml-cpp-yaml-cpp-0.7.0/include LIBS += -L\$\$PWD/env/yaml-cpp-yaml-cpp-0.7.0/lib -llibyaml-cppmd
    如果没有正常导入这些包和库,编译无法通过;其中各个包都按官网要求进行安装,并将相应的文件夹放到项目目录下;在配置过程中遇到的最大问题是yaml-cpp的lib文件需要自己编译,但是由于其需要vs和cmake等多步骤编译,导致无法得到md动态链接库,只能得到.lib文件静态库,使得qt一直无法编译成功,报错:YAML::detailed::node_data........等诸多问题,这个时候需要搜索windows安装yaml-cpp的方法,检查vs等版本,配置问题,直到能够编译出md.lib为止;
  2. Paddle_inference在下载过程中一定要注意版本,它有cpu版,GPU版,tensorRT版本,tensorRT版本需要额外安装对应版本的tesorRT,需要的版本号在paddle_inference的version.txt文件中有,安装过程百度搜索,因为我不需要使用这个功能,但又下载了trt版本,项目编译时就会一直提示安装tensorRT, 报错E0405 11:46:05.512908 24584 port.h:50] Load symbol getPluginRegistry failed.;经过检查发现下载的paddle_inference版本是经过tensorRT编译的,所以重新下载了notrt版本,解决了这个问题;
  3. 在编译成功后,运行代码创建predictor时,总会出现异常,显示问题PreconditionNotMetError: The third-party dynamic library (mklml.dll) that Paddle depends on is not configured correctly. (error code is 126),程序异常停止,开始以为是提示的cuda,cudnn版本不对,进行了重装,没有解决,而且项目中没有使用GPU,因为寻常的电脑不一定含有GPU,所以设置成在CPU上运行,经过请教,是mklml.dll文件没有正常导入,所以手动从paddle_inference中复制mklml目录下的dll文件到release版本生成的文件夹下(该文件夹包含.exe),最终可以解决该问题。

你可能感兴趣的:(Knowledges,c++,python,qt5,paddlepaddle)