【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

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