zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

ncnn Windows10 64bit编译配置

配置 编译 Windows10 64bit
2023-09-11 14:22:29 时间

前言

本篇博客记录在Windows10 64bit上配置Tencent ncnn的过程,这里使用的Visual Studio版本为2015,CMake-3.14。注意: 这里配置的并不可以在VS中跟踪到cpp文件,这样的需要通过工程添加源码配置但是这样的安装方式并不是性能最优的

安装参考文档:Build for Windows x64 using Visual Studio Community 2017

step1: protobuf编译

Protobuf的下载路径是:protobuf。下载完成之后解压压缩包,之后打开VS2015 x64本机工具命令提示符
在这里插入图片描述
之后进入压缩目录,执行如下命令:

mkdir build-vs2015
cd build-vs2015
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

出现这样便是安装成功:
在这里插入图片描述

step2:编译ncnn

解压下载下来的ncnn压缩包,进入ncnn目录创建build文件夹:

mkdir -p build-vs2015
cd build-vs2015

这里需要注意的是依赖库和主项目,要使用同样的build type(Debug/Release)。这里都通过cmake的-DCMAKE_BUILD_TYPE=Release指定,这里选用的type是Release

cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=E:/VS_ncnn/protobuf/build_vs2015/install/include -DProtobuf_LIBRARIES=E:/VS_ncnn/protobuf/build_vs2015/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=E:/VS_ncnn/protobuf/build_vs2015/install/bin/protoc.exe ..
nmake
nmake install

安装log:
在这里插入图片描述

step3:VS2015配置

首先,新建Win32应用台控制程序,之后开始配置过程,配置包含目录
在这里插入图片描述
配置库目录
在这里插入图片描述
配置Windows运行库目录
在这里插入图片描述
配置附加依赖项
在这里插入图片描述
编写示例代码:

#include "stdafx.h"
#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("E:/VS_ncnn/ncnn/examples/squeezenet_v1.1.param");
	squeezenet.load_model("E:/VS_ncnn/ncnn/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;
}

从网上搜索一张喵咪的图片进行测试得到测试结果:
在这里插入图片描述
上面的分类在ImageNet中去查找对应的分类为:

类别序号分类描述
281‘tabby, tabby cat’
282:‘tiger cat’
285:‘Egyptian cat’

遇到的问题:

  1. _CRT_SECURE_NO_WARNINGS,这类问题比较普遍自行解决就好了链接

参考

  1. Visual Studio上编译ncnn
    对于需要源码调试的请将src中源码配置到工程目录再做适当修改,这里偷懒就不写具体操作了,本人配置之后运行结果与链接库文件的结果一致,具体可以留言或是邮件交流,可以参考下面文章进行配置:
  2. 腾讯ncnn-20180129版本在windows+VS2013上调试运行
  3. 腾讯开源ncnn:示例程序运行