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整个流程没有问题,再调数据传输。