1. 程式人生 > >CNN:Windows下編譯使用Caffe和Caffe2

CNN:Windows下編譯使用Caffe和Caffe2

       用於檢測的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-rcnn的編譯可以分為2個部分,caffe的編譯和faster-rcnn的編譯。由於原始的版本大多基於linux,感謝各位前輩的移植與分享,現在windows版本的在網上都可以找到。但對於初學者可能還是有一些坑要填。以下是我遇到的一些問題和解決方法,用以存檔。

二、Vs2013安裝使用MS-Caffe

C++版本編譯過程

     3. Microsoft官方Github上下載Caffe的原始碼壓縮包.

       微軟官方也移植了Caffe,windows
下面的配置會比較簡單一點.

      建議使用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. 錯誤 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\"  
  2. :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版本編譯測試執行

修改配置檔案CommonSettings.props,

修改Python支援為true

  1. <PythonSupport>true</PythonSupport>

新增自身機子的Python安裝目錄

  1. <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的安裝

預編譯階段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

此時配置生成成功!

編譯階段2:可以使用VS2015開啟編譯。

編譯遇到問題:

2.1 error C2398: 元素“1”: 從“google::protobuf::int64”轉換到“int”需要收縮轉                                      

解決方法:暫時沒有解決

程式碼修改為:

  1. //int x = b_dim1;//wishchin
  2.   int x = in[0].dims(0);//wishchin
  3.      return vector<TensorShape> {  
  4.          CreateTensorShape(  
  5.           vector<int> { x , a_dim0, b_dim1 },//wishchin //vector<int> { in[0].dims(0), a_dim0, b_dim1 },
  6.              in[0].data_type()  
  7.       )  
  8.      };//(int)b_dim1},//b_dim1 修改為(int)b_dim1//wishchin

強制轉換,已解決。

2.2 error C2059: 語法錯誤:“volatile” (編譯原始檔 D:\Works\CNN\Caffe\Caffe2\caffe2\utils\threadpool\ThreadPool.cc)

程式碼段:

  1. inlineint Do256NOPs() {  
  2.   asm volatile(GEMMLOWP_NOP64);  
  3.   return 64;  
  4. }  
  5. GCC在C語言中內嵌彙編 asm  __volatile__      

解決方法:嘗試去掉asm volatile(GEMMLOWP_NOP64); 這一句

2.3 錯誤在 Caffe2_CPU工程 conv_op.cc檔案

  1. 1>D:\Works\CNN\Caffe\Caffe2\caffe2\operators\conv_op.cc(76): error C2664: “caffe2::OpSchema &caffe2::OpSchema::CostInferenceFunction(caffe2::OpSchema::CostInferenceFunctionType &&)”:  
  2. 無法將引數 1 從“caffe2::OpSchema::Cost (__cdecl *)(const caffe2::OperatorDef &,const std::vector<caffe2::TensorShape,std::allocator<_Ty>> &)”轉換為“caffe2::OpSchema::CostInferenceFunctionType &&”  

原始程式碼:

  1. OPERATOR_SCHEMA(Conv2D)  
  2.     .NumInputs(2, 3)  
  3.     .NumOutputs(1)  
  4.     .CostInferenceFunction(ConvPoolOpBase<CPUContext>::CostInferenceForConv)//76行
  5.     .TensorInferenceFunction(ConvPoolOpBase<CPUContext>::TensorInferenceForConv)  
  6.     .FillUsing(ConvDocGenerator("2D "));  
修改程式碼:

登出點嘗試一下

分析:為什麼windows版本的OPERATOR_SCHEMA()比Linux版本要多好幾個???

2.4.找不到定義:posix_memalign(

  1. ThreadPool檔案,包含#include "WorkersPool.h" 標頭檔案裡面,使用到  
  2. #if !defined(__ANDROID__)
  3.     posix_memalign((void**)&p, kGEMMLOWPCacheLineSize, sizeof(T));  
  4. 在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. 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" ([email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]),該符號在函式 "public: __cdecl caffe2::Argument::Argument(class caffe2::Argument const &)" ([email protected]@@[email protected]@@Z) 中被引用  
  2. 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" ([email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected])  
  3. 1>Caffe2_CPU.lib(caffe2.pb.obj) : error LNK2019: 無法解析的外部符號 "__int64 google::protobuf::internal::empty_string_once_init_" ([email protected]@[email protected]@@3_JA),該符號在函式 "void __cdecl caffe2::protobuf_InitDefaults_caffe2_2fproto_2fcaffe2_2eproto_impl(void)" ([email protected][email protected]@YAXXZ) 中被引用  
  4. 1>Caffe2_CPU.lib(caffe.pb.obj) : error LNK2001: 無法解析的外部符號 "__int64 google::protobuf::internal::empty_string_once_init_" ([email protected]@[email protected]@@3_JA)  

問題:在libprotobuf 新增 

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

使用了函式,待除錯....

解決方法:嘗試編譯libprotobuf為靜態庫!!!

解決了大部分問題

2.6. 在protobuf仍然出現 連結錯誤  protobuf/compile/main.cc

  1. 8>main.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __cdecl google::protobuf::compiler::CommandLineInterface::CommandLineInterface(void)" ([email protected]@[email protected]@@[email protected]),該符號在函式 main 中被引用  
  2. 8>main.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __cdecl google::protobuf::compiler::CommandLineInterface::~CommandLineInterface(void)" ([email protected]@[email protected]@@[email protected]),該符號在函式 main 中被引用  
  3. .....................  
  4. .error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: virtual __cdecl google::protobuf::compiler::objectivec::ObjectiveCGenerator::~ObjectiveCGenerator(void)" ([email protected]@[email protected]@[email protected]@[email protected]),該符號在函式 main 中被引用  
  5. 8>main.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __cdecl google::protobuf::compiler::js::Generator::Generator(void)" ([email protected]@[email protected]@[email protected]@[email protected]),該符號在函式 main 中被引用  
  6. 8>main.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: virtual __cdecl google::protobuf::compiler::js::Generator::~Generator(void)" ([email protected]@[email protected]@[email protected]@[email protected]),該符號在函式 main 中被引用  
  7. 8>D:\Works\CNN\Caffe\Caffe2\build\third_party\protobuf\cmake\Release\protoc.exe : fatal error LNK1120: 24 個無法解析的外部命令  

解決方法:

嘗試去掉main()函式裡面的程式碼,應該用不著!

3. 執行階段:

X:終於成功了!可憐

測試可以執行................

相關推薦

CNNWindows編譯使用CaffeCaffe2

       用於檢測的CNN分為基於迴歸網路的方法和基於區域+CNN網路的方法,其中基於迴歸網路的方法典型為YOLO9000,可以相容使用VGG-Net框架。其中基於區域+CNN網路方法,大量使用了Caffe作為基礎CNN框架。 準備工作(python27環境,X64平臺,使用Vs2013和Vs2015):

我的AI之路(23)--在Windows編譯Bazel使用Bazel編譯tensorflow

    谷歌廢棄使用CMake改用併力推自己的Bazel看來這是大勢所趨,花了幾天時間琢磨了下Bazel的編譯和使用Bazel編譯tensorflow,一般人工作都沒同時配有幾臺機器,Windows日常工作又得時時開著,至於自己花錢攢機器的就不要說了,為了使用Linux環境弄

windows編譯boost提取boost子集

編譯boost 一.下載boost 從boost官網( http://www.boost.org )上下載最新的boost版本,現在最新是1.55版本,解壓到自定義目錄(為了後面好說明,這裡假設為boost_1_55) 2.編譯安裝boost boost_1_55目錄下會

windows編譯caffe

windows在編譯caffe有兩種途徑, 第一直接從github上clone windows分支的原始碼,根據提供的cmakeLIsts開始編譯,這種方法自由選擇編譯器、依賴的庫檔案版本等,可能自由度更大,但是也有比較多的問題; https://github.com/BV

Caffe學習筆記2Windows安裝搭建caffe框架

小菜在這裡要感謝實習老師張xx,是他的無私奉獻。他把他之前安裝和搭建caffe框架的過程全部記錄下來了寫成文件了,小菜是按照他caffe學習筆記一步一步安裝的,讓小菜少走了許多彎路,不過小菜在安裝的額

CAFFE(0)Ubuntu 安裝anaconda2anaconda3

AR sdn tail art 技術分享 1.0 3.5 blank 條件 這個步驟可以看做是安裝caffe可以進行或者不必要的步驟,不過筆者建議安裝anaconda2和anaconda3,裏面會包含很多的模塊,省去caffe學習過程中出現模塊不存在的各種錯誤。 第一步、進

windows安裝python的C擴展編譯環境(解決“Unable to find vcvarsall.bat”

鏈接 ros link mman ipy nload whl 包名 好的 個人文章除註明轉載外,均為個人原創或者翻譯。 個人文章歡迎各種形式的轉載,但請18歲以上的轉載者註明文章出處,尊重我的勞動,也尊重你的智商; 本文鏈接:http://www.cnblogs.com/

Elam的caffe筆記之配置篇(六)Centos6.5編譯caffecaffe的python3.6介面

Elam的caffe筆記之配置篇(六):Centos6.5下編譯caffe及caffe的python3.6介面 配置要求: 系統:centos6.5 目標:基於CUDA8.0+Opencv3.1+Cudnnv5.1+python3.6介面的caffe框架 綜合來說,caf

Windows編譯memcached-1.4.5(32bit64bit)

原文地址:https://blog.csdn.net/FLxyzsby/article/details/6430106   1.簡介 Memcached 是一個高效能的分散式記憶體物件快取系統。它通過將資料快取在記憶體中來減少對資料庫和檔案系統的訪問,減輕資料庫及作業系統的負擔

大資料求索(5)Windows使用IDEA開發Kafka程式伺服器通訊失敗問題

問題描述 在windows下使用IDEA開發完生產者程式以後,在伺服器端開啟消費者程序,發現傳送失敗,無法進行通訊,報錯如下: kafka .FailedToSendMessageException: Failed to send messages after 3 tries

Windows編譯eXosip、osip,以及UACUAS的例子

osip2.dll osipparser2.lib osipparser2.dll 第三步,解壓,編譯eXosip 進入libeXosip2-3.6.0\platform\vsnet目錄,用VS2010直接開啟eXosip.sln檔案,專案自動轉換: 1.將osip2.lib,osip2

windows編譯安裝boost庫

   編譯位boost庫       我用的編譯器是vs2008,剛開始我下載的是boost_1_65_1.zip,可能boost版本太高編譯錯誤,後來我就選用boost_1_57_0.zip   

深度學習之Windows安裝caffe及配置Pythonmatlab介面

去年下半年看了相關目標檢測的論文,一些傳統的演算法,一些CVPR,TPAMI,ECCV,ICCV,,NIPS,比較前沿的進展,主要都是基於深度學習卷積神經網路方面的,包括RCNN,SPP-NET,Fast-RCNN,Faster-RCNN,以及YOLO,SSD,然後明天準備

Windows編譯並使用libcurl(curlhttp客戶端庫c++版本)

一、下載最新版本libcurlhttps://curl.haxx.se/libcurl/    二、編譯 解壓進入curl-curl-7_59_0\winbuild\下 靜態庫,debug nmake /f Makefile.vc mode=static VC=14 DE

windows使用cmakendk編譯android所用動態庫.so靜態庫.a

      不在linux上編譯android所用.a和.so,在windows上如何編譯呢?  1.準備工作:  2.開始寫一點點程式碼 使用java宣告個native函式: package android.jni.test; public class Nativ

關於OPENSSL在WINDOWS編譯使用的坑

因為最近使用OPENSSL 編譯使用RSA做開發,但是出現了各種問題。找了網上資源整合一下,不過還是有問題啊,在多次試驗中終於找到了使用方法。 首先 openssl編譯步驟: 32位編譯: 1、到C:\Program Files (x86)\Microsoft

CEF3Windows用VS2015編譯CEF3

下載並解壓 [解壓目錄] |-include -- 標頭檔案目錄 |-Debug -- 編譯好的CEF庫,Debug版 |-Release -- 編譯好的CEF庫,Release版 |-Resources

Windows編譯Cef3.2623並加入mp3、mp4支持(附帶源碼包最終DLL)《轉》

cef bug 程序 lib 網盤 red 嘗試 edr ase https://blog.csdn.net/zhuhongshu/article/details/54193842 源碼包下載地址:點我下載 最終Dll、Lib、PDB、頭文件下載地址(release、de

Windows編譯Lua

play pre functions aries programs mem lba other pil http://blog.csdn.net/yue7603835/article/details/41739085 http://blog.csdn.net/birdfl

Windows編譯WebRTC

obj 自己 war invalid bds amd clu out tail 前言 這篇文章的目的在於為你節省生命中寶貴的10小時(甚至更多),或者浪費你10分鐘。作為Google更新頻繁的大型跨平臺基礎庫,WebRTC的編譯一直被人稱為噩夢。如果恰巧你偏要在Windo