ncnn环境编译及其模型使用

ncnn编译过程腾讯在GitHub上虽然写的很清楚,不过我试了两台电脑均不能成功编译环境

于是开始摸索

注意:我这里是在win10上面进行编译的,因为想在win10上面编写代码,因此需要一个vs2019的环境

首先编译protobuf ,我直接使用那个zip下载链接,但是在新建build文件夹的过程不成功,因为会提示我有重复的build文件,因此我新建的tmp,实际上是一样的

只是在到时候编译ncnn的时候需要修改路径就行

protobuf 编译过程如下:

cd protobuf-3.4.0
mkdir tmp
cd tmp
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

编译的过程很容易,一般不会出错

接下来直接编译ncnn了,这里记得这样clone ncnn的源码,因为会关联其他的子模块,直接git clone会不完整,编译的时候会出错

git clone https://github.com.cnpmjs.org/Tencent/ncnn
cd ncnn
git  submodule update --init

从上面可以看出,这里还修改成了cnpmjs国内镜像源,提高下载速度

编译的过程按照官方的链接编译即可,不过我遇到了一个bug,cmake编译不成功,一直卡在一个地方

我在GitHub上面看到有人说可以先忽略掉,可以加个参数跳过这个bug

-DNCNN_BUILD_TOOLS=OFF

cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=C:/protobuf-3.4.0/protobuf-3.4.0/tmp/install/install/include -DProtobuf_LIBRARIES=C:/protobuf-3.4.0/protobuf-3.4.0/tmp/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=C:/protobuf-3.4.0/protobuf-3.4.0/tmp/install/bin/protoc.exe -DNCNN_VULKAN=OFF -DNCNN_BUILD_TOOLS=OFF  ..

然后就可以cmake成功

其余的按照ncnn提供的安装指南即可

至此vs2019下编译ncnn成功了

可以看一下

现在可以打开vs2019进行配置环境了

(1)包含目录

(2) 库目录

(3)附加依赖项

(4)附加库目录

现在就可以直接使用ncnn了

使用之前肯定需要准备模型文件

模型文件还是使用之前文章的模型文件,在Linux环境下的ncnn下转换成功的ncnn文件

使用的onnx模型文件转成ncnn模型文件

ncnn模型文件分为两部分,和caffe类似

转换命令如下:

./tools/onnx/onnx2ncnn FashionMNIST.onnx FashionMNIST.param  FashionMNIST.bin

然后使用ncnnoptimize对文件进行优化

tools/ncnnoptimize FashionMNIST.param FashionMNIST.bin FashionMNIST_OPT.param FashionMNIST_OPT.bin 1

结果如下:

明显优化后的模型文件变小了,主要是使用的float16,ncnnoptimize的使用帮助如下:

usage: tools/ncnnoptimize [inparam] [inbin] [outparam] [outbin] [flag]

其中,flag可以是0或者1,0 代表float32,1代表float16

我们这里使用的float16

拿到模型文件后,我就可以直接在vs2019里面进行读取模型了

不过这里采用是加密的方式进行读取,ncnn提供了一个ncnn2mem工具将模型文件 转内存的方式读取

转换代码如下:

ncnn2mem.exe FashionMNIST.param FashionMNIST.bin FashionMNIST.id.h FashionMNIST_de.mem.h

调用就很简单直接将两个.h 文件进行include就行

完整调用代码如下:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<ncnn/net.h>
#include "FashionMNIST.id.h"
#include "FashionMNIST_de.mem.h"

int main() {
	//读取模型文件
	ncnn::Net net;
	net.load_param(FashionMNIST_param_bin);
	net.load_model(FashionMNIST_bin);

	//ncnn::Mat in;
	ncnn::Mat out;
	cv::Mat m = cv::imread("C:\\123.jpg", CV_8U);
	ncnn::Mat in = ncnn::Mat::from_pixels(m.data, ncnn::Mat::PIXEL_GRAY, m.cols, m.rows);

	ncnn::Extractor ex = net.create_extractor();
	ex.set_light_mode(true);
	ex.input(FashionMNIST_param_id::BLOB_input, in);
	ex.extract(FashionMNIST_param_id::BLOB_output, out);
	 
	for (int j = 0; j < out.w; j++)
	{
		std::cout << out[j] << std::endl;
}	
	return 0;
}

运行结果:

同理将优化的模型也转.h的方式调用进行对比

ncnn2mem.exe FashionMNIST_OPT.param FashionMNIST_OPT.bin FashionMNIST_OPT.id.h FashionMNIST_OPT.mem.h

调用代码:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<ncnn/net.h>
#include "FashionMNIST_OPT.id.h"
#include "FashionMNIST_OPT.mem.h"

int main() {
	//读取模型文件
	ncnn::Net net;
	net.load_param(FashionMNIST_OPT_param_bin);
	net.load_model(FashionMNIST_OPT_bin);

	//ncnn::Mat in;
	ncnn::Mat out;
	cv::Mat m = cv::imread("C:\\123.jpg", CV_8U);
	ncnn::Mat in = ncnn::Mat::from_pixels(m.data, ncnn::Mat::PIXEL_GRAY, m.cols, m.rows);

	ncnn::Extractor ex = net.create_extractor();
	ex.set_light_mode(true);
	ex.input(FashionMNIST_OPT_param_id::BLOB_input, in);
	ex.extract(FashionMNIST_OPT_param_id::BLOB_output, out);
	 
	for (int j = 0; j < out.w; j++)
	{
		std::cout << out[j] << std::endl;
}	
	return 0;
}

运行结果如下: 

可以看出结果几乎一致,肯定会存在精度的差异

猜你喜欢

转载自blog.csdn.net/zhou_438/article/details/112436476
今日推荐