ncnn编译与安装
ncnn
是由腾讯开发一个跨平台的神经网络前向计算框架,为手机端推理提供了极致优化的高性能。其源码编译可参考官方教程Building。这里记录一下编译安装流程(Windows/Linux)。
一、安装所需依赖
- git
- g++
- cmake
- Protobuf
- GLslang
- Vulkan(可选,GPU推理)
- opencv (可选,编译例子需要)
其中git、g++、cmake是编译所需的工具。Protobuf(protocol buffers)是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。GLslang(GLSL - OpenGL Shading Language)是一个以C语言为基础的高阶着色语言,它是由 OpenGL ARB 所建立,提供开发者对绘图管线更多的直接控制,而无需使用汇编语言或硬件规格语言。Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口(API)。
二、编译安装Protobuf
2.1 下载
下载Protobuf-3.11.2: https://github.com/google/protobuf/archive/v3.11.2.zip 。
下载后解压。
2.2 编译安装
- windows
我windows安装了Visual Studio 2019,因此直接用其自带的cmake,也可以单独安装cmake,然后利用cmake.gui。
在开始菜单找到Visual Studio 2019然后找到x64 Native Tools Command Prompt for VS 2019
右击,点击更多,以管理员身份运行以下命令,以下命令是安装Release版本,如果安装Debug版本需把以下命令中的Release修改为Debug
cd <protobuf-root-dir>
mkdir build
cd build
cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
cmake --build . --config Release -j 2
cmake --build . --config Release --target install
- Linux
Linux则执行以下命令进行安装
sudo apt install libprotobuf-dev protobuf-compiler
三、编译安装vulkan
3.1 下载
进入官网:https://vulkan.lunarg.com/sdk/home 下载相应版本
3.2 编译安装
- windows
windows下载相应的exe文件直接进行安装即可,另外还需安装vulkan_intel驱动和vulkan_NVIDIA驱动。vulkan_intel驱动在 https://downloadcenter.intel.com/zh-cn/product/80939/- 找到与本机相应的驱动。安装vulkan_NVIDIA驱动先在 https://developer.nvidia.com/vulkan-driver 中选择显卡对应的驱动。
windows下修改CMakeLists.txt,相应的更改为vulkan的安装路径
- Linux
Linux下执行以下命令进行安装
sudo apt install libvulkan-dev vulkan-utils
四、编译安装openCV
参考 https://www.cnblogs.com/xiaxuexiaoab/p/15894993.html
五、编译安装ncnn
Windows
前面步骤执行完后,可安装ncnn,执行以下命令进行安装。注意如果编译Release,则对应的依赖如:Protobuf也需要编译成Release版本
cd <ncnn-root-dir>
mkdir -p build
cd build
cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/build/install/include -DProtobuf_LIBRARIES=<protobuf-root-dir>/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build/install/bin/protoc.exe -DNCNN_VULKAN=ON ..
cmake --build . --config Release -j 2
cmake --build . --config Release --target install
Linux
cd <ncnn-root-dir>
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j4
make install
六、使用ncnn
在CMakeLists.txt里面指定ncnn安装路径以及VulKan库路径
点击展开
set(USE_VULKAN ON)
# Ncnn
if(WIN32)
if (USE_VULKAN)
set(NCNN_ROOT "D:/ncnn/ncnn_install/Release/ncnn_install_vulkan")
set(NCNN_ROOT_DEBUG "D:/ncnn/ncnn_install/Debug/ncnn_install_vulkan")
set(NCNN_LIBRARIES
"${NCNN_ROOT}/lib/ncnn.lib"
"${NCNN_ROOT}/lib/SPIRV.lib"
"${NCNN_ROOT}/lib/glslang.lib"
"${NCNN_ROOT}/lib/GenericCodeGen.lib"
"${NCNN_ROOT}/lib/MachineIndependent.lib"
"${NCNN_ROOT}/lib/OGLCompiler.lib"
"${NCNN_ROOT}/lib/OSDependent.lib"
CACHE INTERNAL "")
set(NCNN_LIBRARIES_DEBUG
"${NCNN_ROOT_DEBUG}/lib/ncnnd.lib"
"${NCNN_ROOT}/lib/SPIRVd.lib"
"${NCNN_ROOT}/lib/glslangd.lib"
"${NCNN_ROOT}/lib/GenericCodeGend.lib"
"${NCNN_ROOT}/lib/MachineIndependentd.lib"
"${NCNN_ROOT}/lib/OGLCompilerd.lib"
"${NCNN_ROOT}/lib/OSDependentd.lib"
CACHE INTERNAL "")
else()
set(NCNN_ROOT "D:/ncnn/ncnn_install/Release/ncnn_install_no_vulkan")
set(NCNN_ROOT_DEBUG "D:/ncnn/ncnn_install/Debug/ncnn_install_no_vulkan")
set(NCNN_LIBRARIES
"${NCNN_ROOT}/lib/ncnn.lib"
CACHE INTERNAL "")
set(NCNN_LIBRARIES_DEBUG
"${NCNN_ROOT_DEBUG}/lib/ncnnd.lib"
CACHE INTERNAL "")
endif()
set(NCNN_INCLUDE_PATH "${NCNN_ROOT_DEBUG}/include" CACHE INTERNAL "")
elseif(UNIX)
endif()
if (USE_VULKAN)
# Vulkan
if(WIN32)
set(VULKAN_ROOT "D:/ncnn/VulkanSDK-1.3.216")
set(VULKAN_LIBRARIES
"${VULKAN_ROOT}/Lib/vulkan-1.lib"
"${VULKAN_ROOT}/Lib/shaderc_combined.lib"
CACHE INTERNAL "")
set(VULKAN_LIBRARIES_DEBUG
"${VULKAN_ROOT}/Lib/vulkan-1.lib"
"${VULKAN_ROOT}/Lib/shaderc_combinedd.lib"
CACHE INTERNAL "")
set(VULKAN_INCLUDE_PATH "${VULKAN_ROOT}/Include" CACHE INTERNAL "")
message("vulkan " ${VULKAN_INCLUDE_PATH})
elseif(UNIX)
endif()
endif()
if (USE_VULKAN)
target_link_libraries(${PROJECT_NAME}
PUBLIC
# debug ${NCNN_LIBRARIES_DEBUG}
# optimized ${NCNN_LIBRARIES}
"$<IF:$<CONFIG:Debug>,${NCNN_LIBRARIES_DEBUG},${NCNN_LIBRARIES}>"
debug ${OPENCV_LIBRARIES_DEBUG}
optimized ${OPENCV_LIBRARIES}
# debug ${VULKAN_LIBRARIES_DEBUG}
# optimized ${VULKAN_LIBRARIES}
"$<IF:$<CONFIG:Debug>,${VULKAN_LIBRARIES_DEBUG},${VULKAN_LIBRARIES}>"
)
else()
target_link_libraries(${PROJECT_NAME}
PUBLIC
debug ${NCNN_LIBRARIES_DEBUG}
optimized ${NCNN_LIBRARIES}
debug ${OPENCV_LIBRARIES_DEBUG}
optimized ${OPENCV_LIBRARIES}
)
endif()
注意: 如果使用GPU,则退出前需要调用ncnn::destroy_gpu_instance();
,否则会异常退出。