VS2015搭建NCNN开发环境

古城微笑少年丶 2023-10-02 15:09 30阅读 0赞

一、简介

NCNN的编译依赖OpenCV和Protobuf,所以需要总共需要安装OpenCV、Protobuf和NCNN三个东西。

二、安装OpenCV

1、下载OpenCV Releases - OpenCV 一般选择最新版,这里以3.4.16为例。

2、选择喜欢的目录安装,这里以E:/soft-setup为例,安装之后生成下面几个文件。

" class="reference-link">watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16

3、添加path(vs2015对应:E:\soft-setup\opencv\build\x64\vc14\bin;vs2017对应:E:\soft-setup\opencv\build\x64\vc15\bin)到环境变量中,重启电脑生效。

4、打开VS2015,新建一个C++项目,点击属性管理器。

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 1

右键Release | x64属性,因为下面的ncnn,Debug | x64可能会有问题。

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_18_color_FFFFFF_t_70_g_se_x_16

下图中的“包含目录”填写:

  1. E:\soft-setup\opencv\build\include
  2. E:\soft-setup\opencv\build\include\opencv
  3. E:\soft-setup\opencv\build\include\opencv2

“库目录”填写:

  1. E:\soft-setup\opencv\build\x64\vc14\lib

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 2

下图中的“附加依赖项”填写:

  1. opencv_world3416.lib

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 3

4、写个demo,运行一下,OpenCV安装成功。

  1. #include "stdafx.h"
  2. #include <opencv.hpp>
  3. using namespace cv;
  4. int main()
  5. {
  6. Mat srcImage;
  7. srcImage = imread("1.jpg");
  8. imshow("显示图像", srcImage);
  9. waitKey();
  10. return 0;
  11. }

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 4

三、编译Protobuf

1、安装CMake

下载 Download | CMake

2、下载并解压:protobuf-3.4.0 https://github.com/google/protobuf/archive/v3.4.0.zip
打开CMake-GUI:cmd执行cmake-gui
设置 源文件目录:E:/soft-setup/protobuf-3.4.0/cmake
设置 目标文件目录:E:\soft-setup\protobuf-3.4.0\buildvs1
点击 Configure:选择VS2015 Win64->Finish
不勾选:protobuf_BUILD_TESTS和protobuf_MSVC_STATIC_RUNTIME
点击 Add Entry:CMAKE_BUILD_TYPE=Release
修改(可选):CMAKE_CONFIGURATION_TYPES=Release
修改:CMAKE_INSTALL_PREFIX=./install
再点2次 Configure
点击 Generate

3、打开VS2015:
打开 目标文件目录(E:\soft-setup\protobuf-3.4.0\buildvs1)中的工程文件(protobuf.sln),编译其中的INSTALL项目。解决方案-INSTALL-生成。

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 5

四、编译NCNN

1、下载并解压:ncnn https://github.com/Tencent/ncnn/archive/master.zip
2、打开CMake-GUI:cmd执行cmake-gui
设置 源文件目录:E:\soft-setup/ncnn-master
设置 目标文件目录:E:\soft-setup/ncnn-master/build/
点击 Configure:选择VS2015 Win64->Finish
点击 Add Entry:Protobuf_LIBRARIES=E:/soft-setup/protobuf-3.4.0\buildvs1\install\lib\libprotobuf.lib
点击 Add Entry:Protobuf_INCLUDE_DIR=E:/soft-setup/protobuf-3.4.0\buildvs1\install\include
点击 Add Entry:Protobuf_PROTOC_EXECUTABLE=E:/soft-setup/protobuf-3.4.0\buildvs1\install\install/bin/protoc.exe
修改(可选):CMAKE_CONFIGURATION_TYPES=Release
修改:Protobuf_SRC_ROOT_FOLDER=E:/soft-setup/protobuf-3.4.0/src
再次点击 Configure
点击 Generate

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 6
3、打开VS2015:
打开 目标文件目录(E:\soft-setup/ncnn-master/build/)中的工程文件(ncnn.sln),编译其中的INSTALL项目即可。
编译结束后,在目标文件目录的install和tools目录下,即可看到编译好的文件。至此,ncnn编译完成。

4、打开VS2015,点击属性管理器, 右键Release | x64属性。

下图中的“包含目录”添加:

  1. E:\soft-setup\ncnn-master\build\install\include\ncnn

“库目录”添加:

  1. E:\soft-setup\ncnn-master\build\install\lib

“Windows运行库目录”添加:

  1. E:\soft-setup\ncnn-master\build\install\bin

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 7

下图中的“附加依赖项”添加:

  1. ncnn.lib

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5bCP5q6K5bCP5q6K_size_20_color_FFFFFF_t_70_g_se_x_16 3

5、写个demo,运行一下,大功告成。

  1. #include "stdafx.h"
  2. #include <opencv2/highgui/highgui.hpp>
  3. #include <vector>
  4. #include "net.h"
  5. #include <stdio.h>
  6. using namespace std;
  7. vector<float> get_output(const ncnn::Mat& m)
  8. {
  9. vector<float> res;
  10. for (int q = 0; q<m.c; q++)
  11. {
  12. const float* ptr = m.channel(q);
  13. for (int y = 0; y<m.h; y++)
  14. {
  15. for (int x = 0; x<m.w; x++)
  16. {
  17. res.push_back(ptr[x]);
  18. }
  19. ptr += m.w;
  20. }
  21. }
  22. return res;
  23. }
  24. int main()
  25. {
  26. cv::Mat img = cv::imread("1.jpg");
  27. int w = img.cols;
  28. int h = img.rows;
  29. ncnn::Mat in = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_BGR, w, h, 224, 224);
  30. ncnn::Net net;
  31. net.load_param("mobilenetv2.param");
  32. net.load_model("mobilenetv2.bin");
  33. ncnn::Extractor ex = net.create_extractor();
  34. ex.set_light_mode(true);
  35. ex.set_num_threads(4);
  36. ex.input("x", in);
  37. ncnn::Mat feat;
  38. ex.extract("y", feat);
  39. vector<float> res = get_output(feat);
  40. vector<float>::iterator max_id = max_element(res.begin(), res.end());
  41. printf("predicted class: %d, predicted value: %f", max_id - res.begin(), res[max_id - res.begin()]);
  42. net.clear();
  43. return 0;
  44. }

发表评论

表情:
评论列表 (有 0 条评论,30人围观)

还没有评论,来说两句吧...

相关阅读