如何在Windows子系统WSL2中安装并使用NCNN

WSL2 和 Windows 沙盒是目前 Windows 平台最常用的测试环境,Windows 沙盒可以用来校正全新环境下自己开发的软件是否正常运行,而 WSL2 可以校准 Linux 环境下的应用是否正常运行。

0. 效果截图

1. 为啥要用 WSL2?

测试一些不容易跨端的编程语言,比如 C++。最近我开发了多个人工智能 APP,其核心依赖 C++,使用 cmake 构建的 c++程序只能本地编译。

2. WSL2 环境安装

在微软应用商店搜索Linux,就可以找到比较熟悉的UbantuDebian等等,随便安装一个即可。

3. Opencv 安装

c++的通用安装步骤,clone 代码,cmke 创建 build 工程,然后 make 完成打包和安装。

# 基础工具
apt install build-essential cmake git pkg-config

# opencv clone
mkdir ~/opencv_build && cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

# 创建build工程
cd ~/opencv_build/opencv
mkdir -p build && cd build

# cmke
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
    -D BUILD_EXAMPLES=ON ..
# 等待一分钟完成输出

# 开始构建,数字20可以改成你的CPU实际线程数,越多构建速度越快
make -j20
# 等待2分钟即可完成所有构建过程

# 最后一步,完成install,这样就可以通过findpackage找到
sudo make install

检查是否正确安装:

pkg-config --modversion opencv4

成功后会输出如上结果。

4. NCNN 安装

基本符合 C++的通用安装步骤

# 安装基础依赖
apt install libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils

# clone代码
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init

# 创建build工程
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
# 等待1分钟完成cmake过程

# 开始构建,数字20可以改成你的CPU实际线程数,越多构建速度越快
make -j20
# 等待3秒钟即可完成所有构建过程

# 最后一步,完成install,这样就可以通过findpackage找到
sudo make install

验证安装

cd ../examples
../build/examples/squeezenet ../images/256-ncnn.png
[0 AMD RADV FIJI (LLVM 10.0.1)]  queueC=1[4]  queueG=0[1]  queueT=0[1]
[0 AMD RADV FIJI (LLVM 10.0.1)]  bugsbn1=0  buglbia=0  bugcopc=0  bugihfa=0
[0 AMD RADV FIJI (LLVM 10.0.1)]  fp16p=1  fp16s=1  fp16a=0  int8s=1  int8a=1
532 = 0.163452
920 = 0.093140
716 = 0.061584

5. Cocoyaxi 安装

这是一个类 Go 语言的协程库,go 和 chanel 都有,可以按照 go 语言的思维快速开发高并发程序

# clone代码
git https://github.com/idealvin/cocoyaxi.git
cd cocoyaxi

# 创建build工程
mkdir -p build && cd build
cmake ..
# 等待1分钟完成cmake过程

# 开始构建,数字20可以改成你的CPU实际线程数,越多构建速度越快
make -j20
# 等待1秒钟即可完成所有构建过程

# 最后一步,完成install,这样就可以通过findpackage找到
sudo make install

6. 整合所有这些环境

在 Windows 中打开终端工具,输入 wsl 或手动进入 WSL2 子系统,然后输入code .即可打开 vscode 工具,创建一个CMakeLists.txt文件,内容如下:

cmake_policy(SET CMP0091 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0091 NEW) # 确实解决内部cmake中文乱码的问题
cmake_minimum_required(VERSION 3.9) # 定义cmake最小版本号

set(CMAKE_BUILD_TYPE Release)

# Create project
set(ProjectName "cpp") # 定义变量
project(${ProjectName}) # 定义项目名称
message("ProjectName: ${ProjectName}") # 打印项目名称
add_executable(${ProjectName} main.cpp) # 定义编译的程序名称和程序文件
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) # 输出成功,但是Release\yolov5.exe

# 设置  opencv
find_package(OpenCV REQUIRED)
target_link_libraries(${ProjectName} ${OpenCV_LIBS})

set(ncnn_DIR "/root/ncnn_build/ncnn/build/install/lib/cmake/ncnn")   # ncnn编译后,lib文件里包含ncnnconfig.camke的目录
find_package(ncnn REQUIRED)
target_link_libraries(${ProjectName} ncnn) # 在项目中使用,缺少会报错

# # 并发库
find_package(cocoyaxi REQUIRED)
target_link_libraries(${ProjectName} cocoyaxi::co)

这样就算完整了,然后为了方便可以使用 pyton 来自动化这个过程,如果需要实时动态编译,可以调用 go 语言的 gowatch 工具对该项目进行实时编译,实现修改后所见即所得的效果。
此处列举 python 自动化脚本

import os

os.system("cmake -B.build .")  # 代表编译缓存
os.system("cmake --build .build --config Release --target cpp -- -j20")  # 执行前其实还有缓存这一步
os.system('./cpp')

众所周知,不论前端还是后端,临时文件都用.XXX文件,方便识别核心代码与自生成冗余文件。

7. 小结

最近学习 C++并完成了多个 AI 应用的开发,整体而言 C++现代编程虽然比较容易,但是面对较复杂的应用时,尤其是对比 Go 语言几乎没有优势。想要开发复杂多变的现实应用,Go 语言仍然比 C++更合适,也许未来某一天我会实现 Go 语言直接调用 C++,让愚蠢的 AI 迈向魔法系,让 AI 不再那么生硬。

联系方式
广告
网站统计

累计发布:211 篇

总点赞量:1322

累计运行:5 年 186 天

建站日期:2018-10-25