配置SOLOV2_ncnn相关环境并运行Demo

  今天最开心的事情是终于在Windows环境下运行起来Github上这个项目的Demo,对于我一个电脑小白而言那背后的可都是泪呀TAT,因此有必要记录一下整个流程以方便其他人的需要~

  简述一下相关背景:ncnn是一个前向神经网络框架,由纯C++实现所实现。而SOLOV2是一个快速的实例分割算法,关于什么是实例分割,可参考图像处理的相关文章。此外,笔者的相关环境配置一并列举于此处,方便读者参考:

环境 版本
Windows 10 专业版 20H2
Visual Studio 2019 Community Edition
16.11.31702.278
OpenCV 3.4.5
CMake 3.21.3
ncnn Release 2c4ae09604
即目前的lateset release(20210720)

01 ncnn编译

  理论上来讲,根据自身的需求直接使用release下官方的预编译静/动态库应该不会出现错误,然而笔者在实际配置项目时,添加了ncnn.lib这一附加依赖项后,在运行中依旧会产生Vulkan相关报错,如图所示:

vulkan报错

  推测可能为官方打包的库中默认调用了VulkanSDK与glslang这一submoudle,因此我们需要自己来对ncnn打包了。

  在使用VS 2019命令行编译ncnn的过程中,也同样遇到了这样或那样的问题,不过所幸被Github上这条issue解决了,大体上只要按照issue作者提示的操作就不会出现问题。

  首先在开始菜单下找到Visual Studio 2019的文件夹,打开x64 Native Tools Command Prompt这个VS 2019的命令行工具。

操作步骤

  下载 protobuf 3.4.0 的源码(不知道其它版本是否可行),解压,编译ncnn前需要编译protobuf。

Command Prompt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 进入protobuf-3.4.0文件夹
cd protobuf-3.4.0

// 新建build-vs2019文件夹并跳转进入
mkdir build-vs2019
cd build-vs2019

// cmake -DCMAKE_BUILD_TYPE参数也可设为debug,但总之要前后一致
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install ^
-Dprotobuf_BUILD_TESTS=OFF ^
-Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake

nmake
nmake install

// 返回上级文件夹,即protobuf-3.4.0文件夹之外
cd ..
cd ..

  通过git克隆ncnn的源码并编译ncnn:

提示:请务必注意路径问题!

Command Prompt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 克隆远端仓库代码,放在ncnn文件夹下
git clone https://github.com/Tencent/ncnn.git

// 进入ncnn文件夹
cd ncnn

// 拉取submodule
git submodule update --init

// 新建build-vs2019文件夹并跳转进入
mkdir build-vs2019
cd build-vs2019

// 同上,-DCMAKE_BUILD_TYPE参数也可设为debug
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install ^

// 更改为自己电脑上Protobuf对应文件夹所在的路径,注意:请务必改为绝对路径而不是相对路径!
-DProtobuf_INCLUDE_DIR=E:/Project/protobuf-3.4.0/build-vs2019/install/include ^
-DProtobuf_LIBRARIES=E:/Project/protobuf-3.4.0/build-vs2019/install/lib/libprotobuf.lib ^
-DProtobuf_PROTOC_EXECUTABLE=E:/Project/protobuf-3.4.0/build-vs2019/install/bin/protoc.exe ^
// 更改为自己电脑上OpenCV3.4.5对应文件夹所在的路径,依然是注意绝对路径的问题
-DOpenCV_DIR=E:/opencv/build/x64/vc15/lib ..

nmake
nmake install

// 返回上级文件夹,即ncnn文件夹之外
cd ..
cd ..

  至此,运行此项目demo的环境构建工作就做好了,接下来就可以准备开始调试SOLOv2 ncnn的项目。

02 项目调试

  与上一步相同,首先需要使用获得一份源码:

Command Prompt
1
git clone https://github.com/DayBreak-u/SOLOV2_ncnn.git

  根据项目主页的README.md,执行前三行代码:

Command Prompt
1
2
3
4
5
cd ncnn

mkdir build
cd build
cmake ..

  如果存在报错信息如CMake Error at CMakeLists.txt:xx (find_package):Could not find module FindOpenCV.cmake or a configuration file for package OpenCV.则是没有寻找到OpenCV的CMake文件,可在文件中添加一行set(OpenCV_DIR E:/opencv/build/x64/vc15/lib) (请替换为自己OpenCV的路径)或者是配置OpenCV_DIR这一环境变量即可。提示-- Configuring done-- Generating done时即意味着项目解决方案的成功生成。

  下载模型权重:

链接: https://pan.baidu.com/s/1W1AiKdI4JJq2LW50uGOVng 密码: phh8

  在Windows环境下,由于没有Linux下的GNU Make,所以我们直接用VS来编译代码:

VS配置ncnn和opencv环境

  点击项目->属性->VC++目录,在Release配置、x64平台下,根据自己目录的实际情况添加以下路径至包含目录

注意:如果前文中您将protobuf、ncnn的源码编译为debug版本,则此处也要将其改为debug配置。

  E:\opencv\build\include
  E:\opencv\build\include\opencv
  E:\opencv\build\include\opencv2
  E:\Project\ncnn\build-vs2019\install\include
  E:\Project\ncnn\build-vs2019\install\include\ncnn

  同样,在库目录 中根据自身情况添加以下路径:

  E:\opencv\build\x64\vc15\lib
  E:\Project\ncnn\build-vs2019\install\lib

  在链接器->输入中加入ncnn.libopencv_world345.lib这两个附加依赖项就可以进行下一步操作了。

修改代码

  为方便运行demo查看效果,我对其进行了一定修改,以solov2.cpp为例(才不是我没有测试过solov2_fast.cpp的原因呢,哼o(~ヘ~o#)):

  根据前文下载的模型权重存储路径修改权重读取位置:

修改代码

  注释并重写main函数:

solov2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main() {

const char* imagepath = "E:/Project/SOLOV2_ncnn/imgs/horses.jpg";

cv::Mat m = cv::imread(imagepath, 1);
if (m.empty()) {
fprintf(stderr, "cv::imread %s failed\n", imagepath);
return -1;
}

std::vector <Object> objects;
detect_solov2(m, objects);

draw_objects(m, objects);

return 0;
}

  程序生成的结果result.png默认放在项目build文件夹下,如果您想要直观地看见程序运行的效果,可以将main函数上方原作者注释掉的两行代码取消注释:
  // cv::imshow("image", image);
  // cv::waitKey(0);

运行代码

  做完上述操作后,在解决方案资源管理器中右键我们修改代码后的solov2并设为启动项目:

修改代码

  然后点击本地Windows调试器编译并运行程序。一般情况下,我们的solov2.exe就成功生成了。如果控制台打开提示找不到 opencv_world345.dll,就在../opencv/build/x64/vc15/bin文件夹下拷贝一份放在../SOLOv2_ncnn/build/Release下,该文件夹也是solov2.exe所在的地方。

  运行窗口如图:

运行窗口

  运行效果如图:

运行效果1

运行效果2