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下修改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();,否则会异常退出。

posted @ 2022-07-03 13:31  半夜打老虎  阅读(2496)  评论(0编辑  收藏  举报