前言
本篇博客记录在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’ |
遇到的问题:
- _CRT_SECURE_NO_WARNINGS,这类问题比较普遍自行解决就好了链接
参考
- Visual Studio上编译ncnn
对于需要源码调试的请将src中源码配置到工程目录再做适当修改,这里偷懒就不写具体操作了,本人配置之后运行结果与链接库文件的结果一致,具体可以留言或是邮件交流,可以参考下面文章进行配置: - 腾讯ncnn-20180129版本在windows+VS2013上调试运行
- 腾讯开源ncnn:示例程序运行
本文档详细记录了在Windows10 64位系统上,使用Visual Studio 2015编译配置Tencent的ncnn库的过程,包括protobuf的编译、ncnn的编译及VS2015的配置步骤,并解决了编译过程中遇到的问题。
2333

被折叠的 条评论
为什么被折叠?



