用于检测的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:终于成功了!

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

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

  1. [转] Windows下编译OpenSSL

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

  2. Windows下编译objective-C

    Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode   目录 ...

  3. 在Windows下编译FFmpeg详细说明

    MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...

  4. 如何在WINDOWS下编译BOOST C++库 .

    如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25   写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0.   1)下载boost ...

  5. 在Windows下编译OpenSSL(VS2005和VC6)

    需要说明的是请一定安装openssl-0.9.8a .  openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装Activ ...

  6. windows下编译java源文件的编码错误

    import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...

  7. Windows下编译SDL

    Windows下编译SDL的理由我就不多说了,无论用VS来编译或调试SDL库都是很方便的.而且SDL源代码中也包含了VC工程,你所要做的只是解压VC工程,进行适当的配置,然后编译.调试. 编译SDL大 ...

  8. Windows下编译安装 FFmpeg

    在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...

  9. windows下编译php7图形库php_ui.dll

    CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...

随机推荐

  1. 第五节:DataFrame聚合函数

  2. elasticsearch 权威指南Mapping(映射)

    什么是映射 类似于数据库中的表结构定义,主要作用如下: 定义Index下字段名(Field Name) 定义字段的类型,比如数值型,字符串型.布尔型等 定义倒排索引的相关配置,比如是否索引.记录pos ...

  3. 数字统计(2010年NOIP全国联赛普及组)

    题目描述 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出 现 1 次 ...

  4. 虚拟机+centOS挂载ISO步骤

    https://blog.csdn.net/u010612373/article/details/52240447

  5. [bzoj4025]二分图_LCT

    二分图 bzoj-4025 题目大意:给定一个n个节点的图,m条边,每条边有一个产生时间和一个删除时间,询问所有时间点是否是连通图. 注释:$1\le n\le 10^5$,$1\le m\le 2\ ...

  6. [转]数据库查询 sysobjects

    sysobjects sysobjects是系统自建的表,里面存储了在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等),各在表中占一行.只有在 tempdb 内,每个临时对象才在该表中占 ...

  7. PF, Page File, 页面文件

    PF, Page File, 页面文件 是硬盘中用来当作内存使用的,仅仅提高物理内存可能导致CPU使用率高,因为降低了命中率: 学习了:https://baike.baidu.com/item/PF% ...

  8. XMPP基本内容简单介绍

    即时通讯技术简单介绍 即时通讯技术(IM)支持用户在线实时交谈.假设要发送一条信息,用户须要打开一个小窗体,以便让用户及其朋友在当中输入信息并让交谈两方都看到交谈的内容.有很多的IM系统,如AOL I ...

  9. discuz新的单点论坛(不依赖UCenter)

    discuz 本身提供UCENTER用户中心能够实现单点登录. 可是其它应用要单点登录到discuz还是存在若干问题: 须要2次激活.可能造成server无响应,论坛显示的最新注冊用户无法同步更新,官 ...

  10. Qt为啥从4.8直接就跳到5.3了呢?这不科学吧

    http://qt-project.org/downloads Qt 5.3 Select the file according to your operating system from the l ...