【ncnn系列一】Win10 + protobuf3.4.0 + NCNN + VS2017 + OpenCV3.4.2 编译和测试

目录

一、下载vs2017

二、下载安装cmake

三、编译protobuf

1.解压下载的文件,然后从“开始”打开vs2017本机工具

2.编译protobuf

四、编译ncnn

1.解压下载文件,开始编译ncnn

2.由于ncnn缺少某些头文件,因此需要编译来获得。

五、下载opencv

1.下载之后双击.exe文件,解压得到即可opencv文件夹

2.配置环境变量,此电脑->属性->高级系统设置->环境变量->系统环境变量PATH

六、在VS2017中配置和测试

1.打开Visual Studio 2017,新建一个C++项目。选择【视图】->【其他窗口】->【属性管理器】,点击之后,选择“Debug|x64”。双击“Microsoft.Cpp.x64.user”,并添加包含目录

2.添加库目录

3.添加windows运行库目录,该目录为protobuf的bin路径

4.在链接器-常规添加附加库目录

4.在链接器-输入中添加附加依赖项

5.测试用例a

6.测试用例b,需指定ncnn格式的squeezenet模型路径和并在工程中(和main.cpp同目录下)预先添加测试图片test.jpg。注意要把OpenCV的头文件放在最上面,深度网络的头文件放到下面


一、下载vs2017

vs2017下载地址:http://visual studio community 2017

下载之后双击.exe文件,选择安装“.NET桌面开发、使用C++的桌面开发、使用window平台开发”三项。

可以自己选择安装路径,避免C盘占用过大。

 

二、下载安装cmake

下载地址:https://cmake.org/download/

解压下载文件,将bin目录添加到系统路径,此电脑->属性->高级系统设置->环境变量->系统环境变量PATH:

 

三、编译protobuf

protobuf3.4.0下载地址:protobuf3.4.0

1.解压下载的文件,然后从“开始”打开vs2017本机工具

2.编译protobuf

> cd <protobuf-root-dir>
> mkdir build-vs2017
> cd build-vs2017
> 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-root-dir>是你解压后protobuf所在的目录,例如D:/yolov3/protobuf-3.4.0。

 

四、编译ncnn

ncnn下载地址:https://github.com/Tencent/ncnn。点击“clone or download”下载zip格式文件。

1.解压下载文件,编译ncnn

> cd <ncnn-root-dir>
> mkdir -p build-vs2017
> cd build-vs2017

# cmake option NCNN_VULKAN for enabling vulkan
> cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=%cd%/install \
-DProtobuf_INCLUDE_DIR=<protobuf-root-dir>/build-vs2017/install/include \
-DProtobuf_LIBRARIES=<protobuf-root-dir>/build-vs2017/install/lib/libprotobuf.lib \
-DProtobuf_PROTOC_EXECUTABLE=<protobuf-root-dir>/build-vs2017/install/bin/protoc.exe \
-DNCNN_VULKAN=OFF ..

> nmake
> nmake install

pick build-vs2017/install folder for further usage

注意以上命令也是在vs2017本机工具执行,并且需要将<ncnn-root-dir>和<protobuf-root-dir>替换成自己的下载的ncnn和protobuf的路径,例如:D:/yolov3/ncnn-master和D:/yolov3/protobuf-3.4.0。

 

五、下载opencv

opencv3.4.2下载地址:https://github.com/opencv/opencv/releases

1.下载之后双击.exe文件,解压得到即可opencv文件夹

2.配置环境变量,此电脑->属性->高级系统设置->环境变量->系统环境变量PATH

 

六、在VS2017中配置和测试

1.打开Visual Studio 2017,新建一个C++项目。选择【视图】->【其他窗口】->【属性管理器】点击之后,选择“Debug|x64”。双击“Microsoft.Cpp.x64.user”,并添加包含目录

2.添加库目录

3.添加windows运行库目录,该目录为protobuf的bin路径

4.在链接器-常规添加附加库目录

4.在链接器-输入中添加附加依赖项

5.测试用例a

//打开摄像头样例  
#include <opencv2/highgui/highgui.hpp>    
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/core/core.hpp>    
using namespace cv;

int main()
{
	VideoCapture cap(0);
	Mat frame;
	while (1)
	{
		cap >> frame;
		imshow("调用摄像头", frame);
		waitKey(30);
	}
	return 0;
}

6.测试用例b,需指定ncnn格式的squeezenet模型路径和并在工程中(和main.cpp同目录下)预先添加测试图片test.jpg。注意要把OpenCV的头文件放在最上面,深度网络的头文件放到下面

#include <opencv2\opencv.hpp>
#include <map>
#include <vector>  
#include <algorithm>  
#include <functional>  
#include <cstdlib> 
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <net.h>

static int detect_squeezenet(const cv::Mat& bgr, std::vector<float>& cls_scores)
{
	ncnn::Net squeezenet;
	squeezenet.load_param("D:/yolov3/ncnn-master/examples/squeezenet_v1.1.param");
	squeezenet.load_model("D:/yolov3/ncnn-master/ncnn-20190611/examples/squeezenet_v1.1.bin");

	ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 227, 227);

	const float mean_vals[3] = { 104.f, 117.f, 123.f };
	in.substract_mean_normalize(mean_vals, 0);

	ncnn::Extractor ex = squeezenet.create_extractor();

	ex.input("data", in);

	ncnn::Mat out;
	ex.extract("prob", out);

	cls_scores.resize(out.w);
	for (int j = 0; j<out.w; j++)
	{
		cls_scores[j] = out[j];
	}

	return 0;
}

static int print_topk(const std::vector<float>& cls_scores, int topk)
{
	// partial sort topk with index
	int size = cls_scores.size();
	std::vector< std::pair<float, int> > vec;
	vec.resize(size);
	for (int i = 0; i<size; i++)
	{
		vec[i] = std::make_pair(cls_scores[i], i);
	}

	std::partial_sort(vec.begin(), vec.begin() + topk, vec.end(),
		std::greater< std::pair<float, int> >());

	// print topk and score
	for (int i = 0; i<topk; i++)
	{
		float score = vec[i].first;
		int index = vec[i].second;
		fprintf(stderr, "%d = %f\n", index, score);
	}

	return 0;
}

int main()
{
	std::string imagepath = "./test.jpg";
	cv::Mat m = cv::imread(imagepath, CV_LOAD_IMAGE_COLOR);
	if (m.empty())
	{
		std::cout << "cv::imread " << imagepath << " failed\n" << std::endl;
		return -1;
	}

	std::vector<float> cls_scores;
	detect_squeezenet(m, cls_scores);

	print_topk(cls_scores, 3);

	return 0;
}

注:调试时需选择X64

 

参考文章:

https://blog.csdn.net/zhaotun123/article/details/99671286

https://blog.csdn.net/lolzhzhzh/article/details/81278014

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章