Yolact模型C++部署

Yolact模型在C++端部署

最近在做动态SLAM,需要将实例分割模型部署在C++端,总结一下整体的流程。

Yolact+opencv+DNN+onnx C++部署

深度学习的模型部署有很多方式,不过实现起来都不太简单。一开始尝试了一下将yolact的pth模型转化为onnx模型,再通过OPENCV中的DNN库进行读取运行。不过运行速度很慢一帧图片处理时间在2.7秒左右。参考的是https://github.com/hpc203/yolact-opencv-dnn-cpp-python。按理说在C++中运行速度应该要比纯python快上很多,没细看代码也不太清楚怎么回事。这个要注意一下opencv的版本应该在4.5.1以上,不然读取onnx会报错。原作者只给出了C++程序,ubuntu环境下使用cmake进行编译需要CMakeLists文件,下面给出我的cmake文件,可以支持切换opencv3和opencv4。相关地址要改成自己的绝对地址。

cmake_minimum_required(VERSION 2.8)
project(test)
IF(NOT CMAKE_BUILD_TYPE)
    SET(CMAKE_BUILD_TYPE Release)
ENDIF()
# Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    add_definitions(-DCOMPILEDWITHC11)
    message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
    add_definitions(-DCOMPILEDWITHC0X)
    message(STATUS "Using flag -std=c++0x.")
else()
    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
set(CMAKE_PREFIX_PATH "/home/run/opencv4")
#set(OpenCV_DIR /home/run/opencv4)
#message("PROJECT_SOURCE_DIR: " ${OpenCV_DIR})
find_package(OpenCV 4.5.1 QUIET)
#find_package(OpenCV 3.4.10 QUIET)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})
link_directories(${OpenCV_LIBRARY_DIRS})
add_executable(test main.cpp)
target_link_libraries(
        ${PROJECT_NAME}
        ${OpenCV_LIBS}
        )

问题就是运行速度太慢了,参考网上的解决办法,我的想法是使用onnx runtime或者TensorRT这种改写程序加速一下,不过这些都没接触过,有点怕浪费时间,以后再尝试把。

参考DynaSLAM,使用C++调用python动态库的方式进行部署

整体流程就是安装Yolact所需环境—>编写C++调用python测试程序以及配置CMake环境—>编写yolact_interface.py程序—>yolact_interface python测试—>c++测试

Yolact安装


本来打算使用Yolact++,编译不成功,后续考虑换成Yolact edge实时性更好检测精度稍低

环境配置

CUDA下载:

https://developer.nvidia.com/cuda-toolkit-archive

安装脚本之后配置环境变量:

sudo gedit ~/.bashrc打开文件,在文件结尾添加如下语句:

export PATH=$PATH:/usr/local/cuda-11.3.1/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.3.1/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda-11.3.1/lib64

终端运行source ~/.bashrc

CUDNN安装:

https://blog.csdn.net/weixin_44009878/article/details/113926893

CUDA卸载:

cd /usr/local/cuda-11.4/bin
sudo ./cuda-uninstaller

安装Anaconda:

https://blog.csdn.net/KIK9973/article/details/118772450

Yolact配置

这部分按照github安装即可需要注意torch安装(巨坑!!!)conda install 的torch基本都是cpu版本(命令正确也会默认安装cpu版本),需要用pip安装才是正常gpu版本。出现报错要注意一下torch版本是否为gpu然后再去看CUDA版本的对应关系。

下载网站:https://pytorch.org/get-started/previous-versions/

conda env create -f environment.yml
conda activate yolact-env
pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html
pip install cython
pip install opencv-python pillow pycocotools matplotlib 
yolact测试

国内服务器下载模型文件https://www.cnblogs.com/isLinXu/p/15309056.html

在yolact目录新建weights文件夹,将下载的模型文件放到weights文件夹中

激活虚拟环境:

conda activate yolact-env

进入yolact的目录下

cd yolact-master

新建input和output文件夹,将测试图片放在input中,测试结果生成在output中

运行测试:

python eval.py --trained_model=weights/yolact_resnet50_54_800000.pth --score_threshold=0.15 --top_k=15 --images=input:output

模型预测时可指定的参数

  • –trained_model:选择模型文件
  • –top_k:保存置信率最高的前15个目标
  • –config:选择config配置文件
  • –image:对单张图像进行预测,路径为单张图像
  • –images:对多张图像/图像路径文件夹 进行预测
  • –video:指定视频进行预测
  • –score_threshold :剔除掉低于0.15置信度的目标
  • –dataset:数据集路径

c++部署

这部分主要是Cmakelist.txt的修改,需要安装opencv4.5.1,参考https://blog.csdn.net/wyyang2/article/details/103989455

cmake_minimum_required(VERSION 2.8)#cmake版本
project(orb_yolact)#项目名称

IF(NOT CMAKE_BUILD_TYPE)#设置cmake编译差不是故意
    SET(CMAKE_BUILD_TYPE Release)
ENDIF()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")

# 添加 C++11 or C++0x 支持
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)

if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    add_definitions(-DCOMPILEDWITHC11)
    message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
    add_definitions(-DCOMPILEDWITHC0X)
    message(STATUS "Using flag -std=c++0x.")
else()
    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)

#链接OPENCV库,这里有两个版本选择 3.4.10会报错 
#find_package(OpenCV 3.4.10 QUIET)
find_package(OpenCV 4.5.1 QUIET)
link_directories(${OpenCV_LIBRARY_DIRS})
#slam相关三方库
find_package(Boost REQUIRED COMPONENTS thread)
find_package(Eigen3 3.1.0 REQUIRED)
find_package(Pangolin REQUIRED)
#c++调用python库所需要的PythonLibs静态链接库
find_package(PythonLibs 3.7 REQUIRED)
#如果找到链接库的路径则终端输出Python Lib Found! Are:******
message(STATUS "Python Lib Found! Are: " ${PYTHON_LIBRARIES})
#设置c++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#设置可执行文件的存放目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设置头文件的存放目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/include)

#这里的参数要设置为自己电脑上安装yolact的路径,基本改一下用户名和虚拟环境名就可以了
#set(PYTHON_INCLUDE_DIRS "/home/run/anaconda3/envs/yolact-env/include/python3.7m/")
set(PYTHON_LIBRARIES "/home/run/anaconda3/envs/yolact-env/lib/libpython3.7m.so")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES(
        ${PYTHON_INCLUDE_DIRS}
        ${Boost_INCLUDE_DIRS}
        ${PROJECT_SOURCE_DIR}
        ${EIGEN3_INCLUDE_DIR}
        ${CMAKE_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/include
)
#python头文件路径导入 修改如上
include_directories(BEFORE "/home/run/anaconda3/envs/yolact-env/lib/python3.7/site-packages/numpy/core/include/numpy")
include_directories(BEFORE "/home/run/anaconda3/envs/yolact-env/lib/python3.7/site-packages/numpy/core/include")
link_directories(/home/run/anaconda3/envs/yolact-env/lib/python3.7/site-packages/numpy/core/lib)


add_library(${PROJECT_NAME} SHARED
        src/System.cc
        src/Tracking.cc
        src/LocalMapping.cc
        src/LoopClosing.cc
        src/ORBextractor.cc
        src/ORBmatcher.cc
        src/FrameDrawer.cc
        src/Converter.cc
        src/MapPoint.cc
        src/KeyFrame.cc
        src/Map.cc
        src/MapDrawer.cc
        src/Optimizer.cc
        src/PnPsolver.cc
        src/Frame.cc
        src/KeyFrameDatabase.cc
        src/Sim3Solver.cc
        src/Initializer.cc
        src/Viewer.cc
        src/yolact.cc
        src/cluster.cc)

target_link_libraries(
        ${PROJECT_NAME}
        ${OpenCV_LIBS}
        ${EIGEN3_LIBS}
        ${Pangolin_LIBRARIES}
        ${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
        ${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
        ${PYTHON_LIBRARIES}
        ${Boost_LIBRARIES}
        )

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
#测试yolact接口
#add_executable(yolact_test src/c++test.cpp)
#target_link_libraries(yolact_test ${PROJECT_NAME})

#测试ORB_SLAM2 RGB-D TUM数据集
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/RGB-D)

add_executable(rgbd_tum
        Examples/RGB-D/rgbd_tum.cc)
target_link_libraries(rgbd_tum ${PROJECT_NAME})

参考资料:

C++调用 Python解释器动态链接库的方式获取语义信息

https://zhuanlan.zhihu.com/p/450318119

c++调用anaconda中python cmake编写:

https://blog.csdn.net/qq_38766208/article/details/124156182

https://blog.csdn.net/HelloJinYe/article/details/107162527

整体框架参考https://github.com/DreamWaterFound/Prerequisites-of-On-line-Semantic-VSLAM

c++调用python遇见的一些报错:
  • python.h没有那个文件或目录
    解决办法:sudo apt-get install python3.7-dev或者检查CmakeList编译文件

  • opencv 多版本安装:
    https://blog.csdn.net/wyyang2/article/details/103989455

  • TIFF未引用,需要升级opencv版本,我之前用的是3.4.10,升级为4.5.1后解决问题,在opencv4编译Cmake的时候也会出现这个报错,解决办法是在cmake时加参数:cmake -D BUILD_TIFF=ON

完整Cmake命令:

cmake -D CMAKE_INSTALL_PREFIX=/home/run/opencv4 -D CMAKE_BUILD_TYPE="Rlease" -D OPENCV_GENERATE_PKGCONFIG=ON -DBUILD_TIFF=ON ..

其中 CMAKE_INSTALL_PREFIX要修改为你自己的cv4安装目录

  • opencv4和3分别使用 cmake
    https://blog.csdn.net/reasonyuanrobot/article/details/121034930

  • pytorch报错:legacy constructor expects device type: cpu but device type

    添加代码:torch.set_default_tensor_type(‘torch.cuda.FloatTensor’)

  • cv2.imwrite(name,img)返回值为False。

    路径错误或路径中包含有中文字符,路径为你终端当前路径

整体项目文件:https://github.com/1812598631/Yolact-C-
参考代码慢慢调试就可以了,总结下来调试经验就是C++调用python,先在python端调明白再联调,C++调用python有很多时候直接结束不会报错,这种情况我认为就是python运行错误,当python整个流程没有问题,再调数据传输。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值