【ncnn】win10 vs2015编译ncnn项目

2024-06-13 09:18
文章标签 编译 项目 win10 vs2015 ncnn

本文主要是介绍【ncnn】win10 vs2015编译ncnn项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 编译protobuf

这是google开源的一个项目,ncnn用来序列保存网络模型的。

1.1 下载protobuf,从这个博客

1.2 编译protobuf
看网络上的文章,这里有两种方式可以编译protobuf。

  • 采用cmake-gui
  • 采用vs2015命令行

因为编译opencv的时候用的cmake-gui,这里用vs命令行试一下。
参考:https://blog.csdn.net/zhaotun123/article/details/99671286
https://blog.csdn.net/CosmosHua/article/details/81543844
https://blog.csdn.net/kai1001/article/details/91043439

1.3 流程

  • 打开VS2015 X64本机工具命令提示符
    在这里插入图片描述
  • 切换到protobuf文件目录下,例:cd /d D:\profile\protobuf-3.4.0
  • 编译:按以下命令进行编译
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

问题1
– Detecting CXX compile features – Detecting CXX compile features - done – Looking for pthread.h – Looking for pthread.h - not found – Found Threads: TRUE CMake Error at tests.cmake:2 (message): Cannot find gmock directory. Call Stack (most recent call first): CMakeLists.txt:172 (include)

打开build文件夹下的CMakeError.log,看一下问题原因:
无法打开包括文件: “pthread.h”
解决方案: 下载编译好的pthread.h放到vs2015的include和lib文件中

  • pthread.h下载:ftp://sourceware.org/pub/pthreads-win32
  • 安装pthreads-w32-2-8-0-release.exe

运行截图
cmake
在这里插入图片描述
在这里插入图片描述

2. 编译ncnn

  • 从以下地址下载ncnn source code,下载后解压。
  • 解压之后按以下命令进行编译,注意修改<protobuf build root dir>路径指向protobuf 编译的位置

注意:我编译的Debug模型,可以用Release(已修改为release)

mkdir -p build-vs2015-wt
cd build-vs2015-wt
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release   -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=D:/profile/protobuf-3.4.0/build-vs2015/install/include -DProtobuf_LIBRARIES=D:/profile/protobuf-3.4.0/build-vs2015/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=D:/profile/protobuf-3.4.0/build-vs2015/install/bin/protoc.exe ..nmake
nmake install

运行截图
在这里插入图片描述
可能问题:

LINK Pass 1: command "F:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\link.exe /nologo @CMakeFiles\caffe2ncnn.dir\objects1.rsp /out:caffe2ncnn.exe /implib:caffe2ncnn.lib /pdb:D:\profile\ncnn-20200227\ncnn-20200226\build\tools\caffe\caffe2ncnn.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\profile\protobuf-3.4.0\build-vs2015\install\lib\libprotobuf.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\caffe2ncnn.dir/intermediate.manifest CMakeFiles\caffe2ncnn.dir/manifest.res" failed (exit code 1319) with the following output:
libprotobuf.lib(common.cc.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(caffe2ncnn.cpp.obj 中)
libprotobuf.lib(common.cc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”(caffe2ncnn.cpp.obj 中)
libprotobuf.lib(coded_stream.cc.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(caffe2ncnn.cpp.obj 中)
libprotobuf.lib(coded_stream.cc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”(caffe2ncnn.cpp.obj 中)
libprotobuf.lib(zero_copy_stream_impl_lite.cc.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(caffe2ncnn.cpp.obj 中)
libprotobuf.lib(zero_copy_stream_impl_lite.cc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”(caffe2ncnn.cpp.obj 中)

解决 这是因为protobuf是release编译的,ncnn是debug模式编译的。ncnn改为release模式就行

3. 配置和测试

参考自:https://blog.csdn.net/zhaotun123/article/details/99671286

  • 新建一个vs项目
    新建vs2015项目,添加以下包含目录,第一个目录为opencv的include路径,第二个为编译生成的ncnn里的include路径,第三个为编译生成的protobuf里的include路径。
    其他的是为opencv配置的,可参看原博客配置
  • 将ncnn include的路径后面加上\ncnn
    在这里插入图片描述
  • 继续添加库目录,
    第一个目录为opencv的lib路径,第二个为编译生成的ncnn里的lib路径,第三个为编译生成的protobuf里的lib路径。
    在这里插入图片描述
  • 继续添加windows运行库目录,该目录为protobuf的bin路径
    在这里插入图片描述
  • 在链接器-输入中添加附加依赖项,分别是
    在这里插入图片描述
    测试
  • 修改模型和图片的位置
  • 测试图片
    在这里插入图片描述
#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:/profile/ncnn-20200226/examples/squeezenet_v1.1.param");squeezenet.load_model("D:/profile/ncnn-20200226/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 indexint 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 scorefor (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 = "./demo_image/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);getchar();return 0;
}

结果
在这里插入图片描述

TO DO

  • 源码阅读理解

这篇关于【ncnn】win10 vs2015编译ncnn项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056893

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4