CNN:Windows下编译使用Caffe和Caffe2

2023-11-18

       用于检测的CNN分为基于回归网络的方法和基于区域+CNN网络的方法,其中基于回归网络的方法典型为YOLO9000,可以兼容使用VGG-Net框架。其中基于区域+CNN网络方法,大量使用了Caffe作为基础CNN框架。


 准备工作(python27环境,X64平台,使用Vs2013和Vs2015):

      1. 安装 VcforPython27 9.0或者安装VS2010版本。此步骤涉及到Python库的安装是否成功。

      2. 安装 Python27 X64;

      3. 使用pip安装Python 包:numpy、matlpotlib、six、scipy、scikit-image、scikit-learn。

          scipy 最好使用 下载版本的X64版本的 whl包。


一、使用FasterR-CNN

         原文链接:Windows下使用Faster R-CNN 

        Windows下faster-rcnn的编译可以分为2个部分,caffe的编译和faster-rcnn的编译。由于原始的版本大多基于linux,感谢各位前辈的移植与分享,现在windows版本的在网上都可以找到。但对于初学者可能还是有一些坑要填。以下是我遇到的一些问题和解决方法,用以存档。


二、Vs2013安装使用MS-Caffe


C++版本编译过程

      原文链接:Windows+VS2013爆详细Caffe编译安装教程                                          

     3. Microsoft官方Github上下载Caffe的源码压缩包.

       微软官方也移植了Caffe,windows下面的配置会比较简单一点.

        https://github.com/Microsoft/caffe

      建议使用Git 克隆整个工程到本地


     4.编译工程文件

     4.1打开caffe-master文件夹,然后看到一个windows文件夹,然后继续打开windows文件夹,看到里面一个CommonSettings.props.example文件,复制出来一份,并改名字为CommonSettings.props                                     

      

       注意:

        1. 编辑模式打开 CommonSettings.props 文件,找到CUDA version一栏,修改7.5 为8.0 

         否则会出现libCaffe打不开/载入不了的情况。

        2.编译boost时出现错误,忽视掉错误,把文件保存,即可编译boost通过。

        3.此外找到:<cuDnnPath></cuDnnPath>这一行,在中间添加cudnn目录,我的是C:\Tools\cdunn;

           同步修改接下来第11、12行的 <LibraryPath>和<IncludePath>

          但是这样做,会导致出现错误

错误 1 error MSB3073: 命令“"D:\caffe-windows\windows\\scripts\BinplaceCudaDependencies.cmd" "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin" "" false true "D:\caffe-windows\windows\..\Build\x64\Debug\"
:VCEnd”已退出,代码为 1。 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets 132 5 libcaffe
      解决方法:不要修改 CommonSettings.props里面关乎cudnn的行,把cudnn的文件复制到CUDA的目录里面。


      4.2 VS2013打开Caffe.sln(就到刚刚那个文件夹里面),打开效果如下

             

       4.3. 使用Vs2013打开,可以进行编译。

               使用Ms-Caffe需要在线下载一些依赖库,需要消耗较多的时间,要慢慢地等一会.......


C++版本测试运行:

     编译测试成功

     

      ................................


Python版本编译测试运行


文章链接: 微软官方caffe之 Python接口配置及图片生成实例         仔细看,不要遗漏细节.               

修改配置文件CommonSettings.props,

修改Python支持为true

<PythonSupport>true</PythonSupport>  

添加自身机子的Python安装目录

<PythonDir>C:\Python2\</PythonDir>  
       然后保存,去编译 Release版本的pycaffe,好像如果编译Debug版本会出现python27_d.lib找不的。不用管它。

       编译pycaffe工程,在X64/realease 文件夹下面生成 pycaffe的文件夹。

使用

      把文件夹里面的caffe文件夹 复制到 Python的文件夹 lib/site-packages 下面,可以在eclipse中直接使用。


import时候出现ImportError: No module named google.protobuf.internal   错误

解决方法:到安装目录 scripts下面 使用pip 或者conda 安装protobuf,默认安装libprotobuf、protobuf、vc9.0.

安装完成,可以使用



三、Vs2015平台Caffe2的安装

按照官网的指示安装Caffe2:  https://caffe2.ai/docs/getting-started.html?platform=windows&configuration=compil                   

预编译阶段cmd、Cmake:

1.编译protobuf

  1. Install Cmake
  2. Run Developer Command Prompt for VS 2017.
  3. Install protobuf. Go tocaffe2\scripts\ and runbuild_host_protoc.bat. This should build protobuf from source for your system.
  4. build protobuf

编译protobuf完成后,出现错误

在cmd窗口,运行caffe2\scripts\build_windows.bat,会出现错误

再次使用Cmake生成配置方案

原路径:D:/git/DeepLearning/caffe2
目标路径:D:/git/DeepLearning/caffe2/build

Configure出现此种问题

CMake Error at cmake/ProtoBuf.cmake:21 (message):
  To build protobufs locally (required for Android/iOS/Windows), you will
  need to manually specify a PROTOBUF_PROTOC_EXECUTABLE.  See
  scripts/build_host_protoc.{sh,bat} for more details.
Call Stack (most recent call first):
  cmake/ProtoBuf.cmake:32 (custom_protobuf_find)
  cmake/Dependencies.cmake:6 (include)
  CMakeLists.txt:85 (include)

修改:

//删除掉 protobuf那一行

添加PROTOBUF_PROTOC_EXECUTABLE变量到cmake-gui配置中。做法: -----------Add Entry 条目添加。
PROTOBUF_PROTOC_EXECUTABLE=D:\git\DeepLearning\caffe2\build_host_protoc\Release\protoc.exe

此时配置生成成功!

若不执行此步骤,则出现:error MSB6006: “cmd.exe”已退出,代码为 1。


编译阶段2:可以使用VS2015打开编译。

编译遇到问题:

2.1 error C2398: 元素“1”: 从“google::protobuf::int64”转换到“int”需要收缩转                                      

解决方法:暂时没有解决

代码修改为:

 //int x = b_dim1;//wishchin
	  int x = in[0].dims(0);//wishchin
      return vector<TensorShape> {
          CreateTensorShape(
			  vector<int> { x , a_dim0, b_dim1 },//wishchin //vector<int> { in[0].dims(0), a_dim0, b_dim1 },
              in[0].data_type()
		  )
      };//(int)b_dim1},//b_dim1 修改为(int)b_dim1//wishchin

强制转换,已解决。


2.2 error C2059: 语法错误:“volatile” (编译源文件 D:\Works\CNN\Caffe\Caffe2\caffe2\utils\threadpool\ThreadPool.cc)

代码段:

inline int Do256NOPs() {
  asm volatile(GEMMLOWP_NOP64);
  return 64;
}

GCC在C语言中内嵌汇编 asm  __volatile__    

asm volatile内嵌汇编用法                            

解决方法:尝试去掉asm volatile(GEMMLOWP_NOP64); 这一句


2.3 错误在 Caffe2_CPU工程 conv_op.cc文件

1>D:\Works\CNN\Caffe\Caffe2\caffe2\operators\conv_op.cc(76): error C2664: “caffe2::OpSchema &caffe2::OpSchema::CostInferenceFunction(caffe2::OpSchema::CostInferenceFunctionType &&)”:
无法将参数 1 从“caffe2::OpSchema::Cost (__cdecl *)(const caffe2::OperatorDef &,const std::vector<caffe2::TensorShape,std::allocator<_Ty>> &)”转换为“caffe2::OpSchema::CostInferenceFunctionType &&”

原始代码:

OPERATOR_SCHEMA(Conv2D)
    .NumInputs(2, 3)
    .NumOutputs(1)
    .CostInferenceFunction(ConvPoolOpBase<CPUContext>::CostInferenceForConv)//76行
    .TensorInferenceFunction(ConvPoolOpBase<CPUContext>::TensorInferenceForConv)
    .FillUsing(ConvDocGenerator("2D "));
修改代码:

注销点尝试一下

分析:为什么windows版本的OPERATOR_SCHEMA()比Linux版本要多好几个???


2.4.找不到定义:posix_memalign(

ThreadPool文件,包含#include "WorkersPool.h" 头文件里面,使用到
#if !defined(__ANDROID__)
    posix_memalign((void**)&p, kGEMMLOWPCacheLineSize, sizeof(T));
在Windows <stdlib.h>下面找不到 函数定义!!!

添加定义
#define posix_memalign(p, a, s) (((*(p)) = _aligned_malloc((s), (a))), *(p) ?0 :errno)//wishchin

到"WorkersPool.h" 头文件

编译成功


2.5. 编译 convert_caffe_image_db,出现

1>Caffe2_CPU.lib(caffe2.pb.obj) : error LNK2019: 无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string" (?fixed_address_empty_string@internal@protobuf@google@@3V?$ExplicitlyConstructed@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@123@A),该符号在函数 "public: __cdecl caffe2::Argument::Argument(class caffe2::Argument const &)" (??0Argument@caffe2@@QEAA@AEBV01@@Z) 中被引用
1>Caffe2_CPU.lib(caffe.pb.obj) : error LNK2001: 无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string" (?fixed_address_empty_string@internal@protobuf@google@@3V?$ExplicitlyConstructed@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@123@A)
1>Caffe2_CPU.lib(caffe2.pb.obj) : error LNK2019: 无法解析的外部符号 "__int64 google::protobuf::internal::empty_string_once_init_" (?empty_string_once_init_@internal@protobuf@google@@3_JA),该符号在函数 "void __cdecl caffe2::protobuf_InitDefaults_caffe2_2fproto_2fcaffe2_2eproto_impl(void)" (?protobuf_InitDefaults_caffe2_2fproto_2fcaffe2_2eproto_impl@caffe2@@YAXXZ) 中被引用
1>Caffe2_CPU.lib(caffe.pb.obj) : error LNK2001: 无法解析的外部符号 "__int64 google::protobuf::internal::empty_string_once_init_" (?empty_string_once_init_@internal@protobuf@google@@3_JA)

问题:在libprotobuf 添加

分析:caffe2::GlobalInit(&argc, &argv);

使用了函数,待调试....

解决方法:尝试编译libprotobuf为静态库!!!

解决了大部分问题


2.6. 在protobuf仍然出现 链接错误  protobuf/compile/main.cc

8>main.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::protobuf::compiler::CommandLineInterface::CommandLineInterface(void)" (__imp_??0CommandLineInterface@compiler@protobuf@google@@QEAA@XZ),该符号在函数 main 中被引用
8>main.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::protobuf::compiler::CommandLineInterface::~CommandLineInterface(void)" (__imp_??1CommandLineInterface@compiler@protobuf@google@@QEAA@XZ),该符号在函数 main 中被引用
.....................
.error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __cdecl google::protobuf::compiler::objectivec::ObjectiveCGenerator::~ObjectiveCGenerator(void)" (__imp_??1ObjectiveCGenerator@objectivec@compiler@protobuf@google@@UEAA@XZ),该符号在函数 main 中被引用
8>main.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::protobuf::compiler::js::Generator::Generator(void)" (__imp_??0Generator@js@compiler@protobuf@google@@QEAA@XZ),该符号在函数 main 中被引用
8>main.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __cdecl google::protobuf::compiler::js::Generator::~Generator(void)" (__imp_??1Generator@js@compiler@protobuf@google@@UEAA@XZ),该符号在函数 main 中被引用
8>D:\Works\CNN\Caffe\Caffe2\build\third_party\protobuf\cmake\Release\protoc.exe : fatal error LNK1120: 24 个无法解析的外部命令

解决方法:

尝试去掉main()函数里面的代码,应该用不着!


3. 运行阶段:

X:终于成功了!可怜

测试可以运行................



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CNN:Windows下编译使用Caffe和Caffe2 的相关文章

  • 什么是哈夫曼编码

    在上一篇 我们介绍了一种特殊的数据结构 哈夫曼树 也被称为最优二叉树 没看过的小伙伴可以点击链接 什么是哈夫曼树 那么 这种数据结构究竟有什么用呢 我们今天就来揭晓答案 计算机系统是如何存储信息的呢 计算机不是人 它不认识中文和英文 更不认
  • HDFS 分布式文件系统详解

    1 HDFS概述 Hadoop 分布式系统框架中 首要的基础功能就是文件系统 在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统 这个抽象类下面有很多子实现类 究竟使用哪一种 需要看我们具体的实现类 在我们实际工
  • 理解React的虚拟DOM

    一 背景 React是一个用于构建用户界面的JavaScript库 区别于老的前端开发技术 其最核心的就是引入了虚拟DOM的技术 为了对React有一个比较全面和深入的了解 所以把最近学习React虚拟DOM的知识 做个笔记 仅供学习 二
  • LRU LFU 概念、底层原理及其实现 超详细~

    0 前置提要 本篇约为8650字 阅读完需要约40 60分钟 主要介绍页面置换算法 LRU和LFU的原理及其实现 对应leetcode140和460 如果能给个赞就更好了 1 从内存置换算法说起 计算机的运行的程序和数据保存在内存中 内存的
  • C++ MYSQL 多线程并发查询处理数据

    1 ThreadPool hpp pragma once ifndef THREAD POOL H define THREAD POOL H include
  • ERROR: Could not find a version that satisfies the requirement keras-nightly (from versions: none)

    问题描述 这个错误发生于博主在python 3 8的环境里安装tensorflow 2 5 0时 执行pip install tensorflow 2 5 0 出现了以下错误 ERROR Could not find a version t
  • Java正则表达式详解

    1 1 正则表达式的概念以及演示 正则表达式可以用一些规定的字符来制定规则 并用来校验数据格式的合法性 正则表达式就是用来验证各种字符串的规则 它内部描述了一些规则 我们可以验证用户输入的字符串是否匹配这个规则 正则表达式是一种强大的校验机
  • 2023-8-23 堆排序

    题目链接 堆排序 include
  • python写程序计算无穷级数_[python][计算方法]利用无穷级数计算幂运算(开根号)...

    encoding gbk a的n次方函数 def exp a n ret 1 for i in range 0 n ret a return float ret n n 1 n 2 def getN minus n n x ret floa
  • 【教程】加速访问和下载github项目,原来替换一个域名就可以加速了

    目录 前言 gitee方法 更简便方法 使用教程 前言 大家平时下载github项目的时候 非常的慢 有时候浏览某个项目的md介绍时候 图片就是加载不出来 让人很苦恼 想锤电脑 gitee方法 于是有很多人都是用gitee的方法 先导入到g
  • 【存储管理】brk()系统调用

    尽管应用程序编程时很少直接调用brk 系统调用 但是它是最经常使用的系统调用 1 C语言中的malloc以及C 语言中的new都在间接的调用着brk 这个系统调用 内核中含有3GB的用户虚存空间 会部分映射到物理存储空间 用户程序经过编译
  • vue中怎么引入element以及使用的详细教程

    引入element 安装依赖 在使用 Element 之前 需要先安装 Element 的依赖库 可以使用 npm 或者 yarn 安装 npm npm i element ui S yarn yarn add element ui 引入C
  • Qt 如何关闭 Debug信息输出

    在pro文件中加上DEFINES QT NO DEBUG OUTPUT 然后重新构建一下程序 qDebug的信息就不再输出了 不过qWarning qCritical等信息仍然可以输出 类似的宏还有 QT NO INFO OUTPUT QT
  • 剑指Offer第五十八题:对称的二叉树

    题目描述 请实现一个函数 用来判断一颗二叉树是不是对称的 注意 如果一个二叉树同此二叉树的镜像是同样的 定义其为对称的 1 思路 我们通常有三种不同的二叉树遍历算法 即前序遍历 中序遍历和后序遍历 在这三种遍历算法中 都是先遍历左子结点再遍
  • 良许Linux

    Linux 服务器我们天天打交道 特别是 Linux 工程师更是如此 为了保证服务器的安全与性能 我们经常需要监控服务器的一些状态 以保证工作能顺利开展 本文介绍的几个命令 不仅仅适用于服务器监控 也适用于我们日常情况下的开发 1 watc
  • depcheck检测缺失哪些依赖包

    npm install g depcheck 如果不想全局安装 npm i depcheck后可以在package json的scripts中输入 check depcheck 之后使用 npm run check depcheck npm
  • umi-request 网络请求之路

    umi request 网络请求之路 背景 在做中台业务应用开发的过程中 我们发现在请求链路上存在以下问题 请求库各式各样 没有统一 每次新起应用都需要重复实现一套请求层逻辑 切换应用时需要重新学习请求库 API 各应用接口设计不一致 混乱
  • sql注入Less11-20

    Less 11 POST 1 先登录 在表格中输入admin admin 登录成功后为下图 2 在post data中输入以下 uname passwd 1 submit submit 返回的结果显示存在sql语法错误 证明存在注入漏洞 u

随机推荐

  • 修改别人代码的原则

    工作过程中难免会涉及到修改或维护别人写的代码 如 代码原作者请假 离职 或相关的bug落到了你的头上 或用别人写的通用方法不爽时 如果碰到修改别人的代码时 需要注意哪些事项呢 1 和原作者沟通 当用到了他人写的通用方法 又感觉不爽时 如果原
  • 各个版本chrome允许加载使用flash的方法

    根除办法 在html中嵌入标签 用户自动选择是否加载flash 69 0 之前的版本 1 打开 chrome settings content flash 2 禁止网站运行Flash gt 改为 Ask Default 3 允许 gt 添加
  • golang开发的准备 - gvm(go版本管理软件)的安装

    0 系统环境 ubuntu18 04 1 前置条件 sudo apt get install bison 2 安装步骤 1 从github下载安装包文件 git clone https github com moovweb gvm git
  • 【c++】14.编译proto和proto相关用法

    编译proto和proto相关用法 关于proto相关的知识可以参考系列博客 https blog csdn net daaikuaichuan category 9869251 html xx proto文件中如果要注释的话 注释符号也是
  • 【Kaggle】Stable Diffusion - Image to Prompts竞赛代码初步理解

    文章目录 一 前言 二 导包 三 加载预训练的 OFA 模型 四 模型EDA 五 Inference 六 安装并导入所有依赖项 七 设置配置 八 加载示例提交 九 Build index from images 十 CLIP interro
  • grep命令

    grep 全称是global regular expressions print 功能就是查找匹配模式的行 grep对文本内容的处理是以行为单位 输出也是输出匹配的行 也可以使用两个变种程序egrep和fgrep egrep与grep E相
  • linux下绑定任务到特定的CPU

    一 linux c查看cpu核 1 命令行查看cpu有几个核 cat proc cpuinfo grep processor wc l 或 nproc 2 linux c代码查看 include
  • 一文了解全面静态代码分析

    在开发具有安全性 可靠性和合规性的软件时 全面静态代码分析是一种有效的方法 在这里 我们将就静态分析而言 讨论全面静态代码分析的不同之处 阐述全面静态代码分析的重要性 以及如何进行全面静态代码分析 什么是全面静态代码分析 全面静态代码分析
  • 计算机行业应届生秋招春招究竟拼的是什么?

    计算机行业是被行外人神话的行业 也是被行内人吐槽的行业 2020年中国高校IT行业毕业生达到了将近70万人 这是什么概念 这样的情况下应届生的顺利就业将会是很大的问题 也就是说几十计算机行业的人才需求很大 也将面临着很大一部分毕业生找不到工
  • iOS系统语音识别

    iOS10语音识别框架Speech 项目中用到语音识别功能 这里简单的进行了一下封装 大概实现了系统语音识别的功能 还没测试 应该会有很多坑 语音识别功能封装 系统的语音识别 外部语音输入 实现语音转文字功能 项目地址 https gith
  • Tello无人机飞控(Python)程序设计

    Tello无人机飞控 Python 程序设计总结 1 py飞控库介绍 tello的几个不同的飞控库有什么区别吗 用哪个好些 Tello的几个不同飞控库主要是针对Python开发者提供的控制无人机的工具包 它们各有特点和使用方式 以下是对一些
  • 闪回版本查询+闪回版本查询案例1+闪回版本查询案例2

    闪回版本查询 闪回版本查询提供了一个审计 检查行改变的查询功能 通过它可以查找到 所有已经提交了的行记录 语法 select column name column name from table name versions between
  • 5G智慧交通白皮书 附下载地址

    智慧交通是人民对美好生活的向往之一 智慧交通从安全 效率 节能等方面改善人民的出行体验 无人驾驶的发展和普及进一步改变人们的生活方式 智慧交通业务丰富 面对不同的应用场景 需要专属的解决方案 网络联接 实时通信是智慧交通的基础 5G 赋能智
  • 围棋:一间低夹

    一间低夹 搜索结果 哔哩哔哩 Bilibili 1 复杂的新版一间高夹 第一集 复杂的新版一间高夹 第一集 哔哩哔哩 bilibili 2 复杂的新版一间高夹 第二集 复杂的新版一间高夹 第二集 哔哩哔哩 bilibili 3 复杂的新版一
  • java的六大框架_常用的java开发框架介绍 (初学者必备的六大框架)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 常用的java开发框架java作为主流的开发语言之一其框架的使用也是非常广泛的 java到javaee部分全部是在以框架来开发 因为框架可以大大节约时间以及成本 那么java中常用的主流框架都有
  • Freetype编译

    编译freetype步骤 1 解压包freetype 2 10 0 tar 2 cd freetype 2 10 0 3 cd builds unix 4 chmod 777 configure 创建一个文件夹 media private
  • java8特性:Stream高效操作数组集合

    简介 Stream 作为 java8 的新特性 基于 lambda 表达式 是对集合对象功能的增强 它专注于对集合对象进行各种高效 便利的聚合操作或者大批量的数据操作 提高了编程效率和代码可读性 Stream 的原理 将要处理的元素看做一种
  • 通讯录管理系统C语言链表实现

    本程序采用链表的方式可以实现对于通讯录信息的管理操作主要有增 删 改 查 显示全部信息 退出六个功能 代码注释都有逻辑简单易懂适合初学者进行链表的学习 代码如下 include
  • 全新范式

    在本文中提出了一种简单的注意力机制Box Attention 它支持网格特征之间的空间交互 从感兴趣的Box中采样 并提高了Transformer针对多个视觉任务的学习能力 具体来说 介绍的BoxeR 即Box Transformer的缩写
  • CNN:Windows下编译使用Caffe和Caffe2

    用于检测的CNN分为基于回归网络的方法和基于区域 CNN网络的方法 其中基于回归网络的方法典型为YOLO9000 可以兼容使用VGG Net框架 其中基于区域 CNN网络方法 大量使用了Caffe作为基础CNN框架 准备工作 python2