当前位置:   article > 正文

ncnn环境编译及其模型使用_ncnn 编译

ncnn 编译

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

于是开始摸索

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

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

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

protobuf 编译过程如下:

  1. cd protobuf-3.4.0
  2. mkdir tmp
  3. cd tmp
  4. cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
  5. nmake
  6. nmake install

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

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

  1. git clone https://github.com.cnpmjs.org/Tencent/ncnn
  2. cd ncnn
  3. 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就行

完整调用代码如下:

  1. #include<iostream>
  2. #include<opencv2/core/core.hpp>
  3. #include<opencv2/imgproc.hpp>
  4. #include<opencv2/highgui.hpp>
  5. #include<ncnn/net.h>
  6. #include "FashionMNIST.id.h"
  7. #include "FashionMNIST_de.mem.h"
  8. int main() {
  9. //读取模型文件
  10. ncnn::Net net;
  11. net.load_param(FashionMNIST_param_bin);
  12. net.load_model(FashionMNIST_bin);
  13. //ncnn::Mat in;
  14. ncnn::Mat out;
  15. cv::Mat m = cv::imread("C:\\123.jpg", CV_8U);
  16. ncnn::Mat in = ncnn::Mat::from_pixels(m.data, ncnn::Mat::PIXEL_GRAY, m.cols, m.rows);
  17. ncnn::Extractor ex = net.create_extractor();
  18. ex.set_light_mode(true);
  19. ex.input(FashionMNIST_param_id::BLOB_input, in);
  20. ex.extract(FashionMNIST_param_id::BLOB_output, out);
  21. for (int j = 0; j < out.w; j++)
  22. {
  23. std::cout << out[j] << std::endl;
  24. }
  25. return 0;
  26. }

运行结果:

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

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

调用代码:

  1. #include<iostream>
  2. #include<opencv2/core/core.hpp>
  3. #include<opencv2/imgproc.hpp>
  4. #include<opencv2/highgui.hpp>
  5. #include<ncnn/net.h>
  6. #include "FashionMNIST_OPT.id.h"
  7. #include "FashionMNIST_OPT.mem.h"
  8. int main() {
  9. //读取模型文件
  10. ncnn::Net net;
  11. net.load_param(FashionMNIST_OPT_param_bin);
  12. net.load_model(FashionMNIST_OPT_bin);
  13. //ncnn::Mat in;
  14. ncnn::Mat out;
  15. cv::Mat m = cv::imread("C:\\123.jpg", CV_8U);
  16. ncnn::Mat in = ncnn::Mat::from_pixels(m.data, ncnn::Mat::PIXEL_GRAY, m.cols, m.rows);
  17. ncnn::Extractor ex = net.create_extractor();
  18. ex.set_light_mode(true);
  19. ex.input(FashionMNIST_OPT_param_id::BLOB_input, in);
  20. ex.extract(FashionMNIST_OPT_param_id::BLOB_output, out);
  21. for (int j = 0; j < out.w; j++)
  22. {
  23. std::cout << out[j] << std::endl;
  24. }
  25. return 0;
  26. }

运行结果如下: 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/298100
推荐阅读
相关标签
  

闽ICP备14008679号