
(二)項目編譯前的步驟:
(1)設置配置文件
在 .\caffe-mastter\windows路徑下
新建一個文本文檔,重命名為CommonSettings.props ,並復制.\windows\CommonSettings.props.example
文件中的內容到 .\windows\CommonSettings.props。默認情況下windows編譯需要CUDA和cuDNN,當然你也可以在配置文檔(
.\windows\CommonSettings.props)中去修改為不用,直接將為true的配置設置為false即可。但是python默認情況下是不能使用的,我這里需要用python進行caffe學習,所以就設置為true了。其他三方的庫,VS編譯時會通過NuGet進行自動獲取,非常方便!
為了便於在訓練模型時減少輸出信息,建議去\caffe-master\caffe-master\src\caffe\layers\data_layer.cpp文件,將如下打印信息的代碼用"//"注釋掉:
(2)下載相關軟件
CUDA
下載 CUDA Toolkit 7.5
(https://developer.nvidia.com/cuda-toolkit)。如果你電腦沒有NVIDIA的獨立顯卡,那么只能選擇用CPU進行編譯,就不需要安裝CUDA,去配置文件 .\windows\CommonSettings.props
設置<CpuOnlyBuild>false</CpuOnlyBuild> ,同時設置 <UseCuDNN>false</UseCuDNN>。
cuDNN
下載 cuDNN v4
或者 cuDNN v5
(https://developer.nvidia.com/cudnn)。 解壓下載的文件到 %CUDA_PATH% (這個路徑是CUDA安裝時默認設置的一個環境變量路徑,通過【系統】-》【高級設置】-》【環境變量】就可以找到)。當然如果你沒下載CUDA,也可以直接設置<UseCuDNN>false</UseCuDNN>
Python
為了能使用python調用Caffe,需要在 .\windows\CommonSettings.props中設置<PythonSupport>true</PythonSupport>。如果本機沒安裝python,可以下載
Miniconda 2.7 64-bit Windows installer,從官方網址:http://conda.pydata.org/miniconda.html選擇下載,默認配置路徑安裝即可。同時需要以管理員權限安裝numpy、scipy、matplotlib、scikit-image、protobuf包,安裝命令如下:
conda install --yes numpy scipy matplotlib scikit-image pip
pip install protobuf
注意:
(1)在你編譯通過后,需要將編譯好的 <caffe_root>\Build\x64\Release\pycaffe\caffe文件復制到python的
<python_root>\lib\site-packages文件夾下面,這樣python中才能引用到caffe,不然會報錯。
GPU | Computer Capability |
GTX660, 680, 760, 770 | compute_30,sm_30 |
GTX780, Titan Z, Titan Black, K20, K40 | compute_35,sm_35 |
GTX960, 970, 980, Titan X | compute_52,sm_52 |
根據需要,我的配置如下圖:
(三)項目編譯
用VS2013,在caffe-master\windows目錄下打開caffe.sln,進去后如下圖(共16個項目):
其中capthaTest是我測試caffe進行驗證碼識別的python項目。編譯時可以直接右鍵【解決方案caffe】進行生成,當然這會報很多錯誤,都是些資源文件引用問題,通過一個個項目單獨編譯都可以很快解決。因為我這里只用到其中幾個項目,所以我編譯的順序是:
libcafffe->caffe->pycaffe->convert_imageset,每個項目編譯前都需要設置相應的引用路徑,這里有兩種路徑,include路徑和libs路徑,詳細怎么添加見下面。
(1)libcaffe在編譯前先設置資源引用路徑,點擊項目右鍵-》屬性-》配置屬性-》c/c++,【附加包含目錄中】中加入python的include路徑,我這是D:\Python27\include,如下圖:
(2)caffe在編譯前先設置資源引用路徑,點擊項目右鍵-》屬性-》配置屬性-》c/c++,【附加包含目錄中】加入python的include路徑,我這是D:\Python27\include,同時,在鏈接器中的【附加庫目錄】中加入python的libs路徑,我這里是D:\Python27\libs,如果顯卡安裝不是默認路徑也相應把C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include和libs加入到里面,如下圖:
(3)pycaffe在編譯前先設置資源引用路徑,點擊項目右鍵-》屬性-》配置屬性-》c/c++,【附加包含目錄中】加入python的include路徑和numpy的include路徑,我這里分別是D:\Python27\include和D:\Python27\Lib\site-packages\numpy\core\include,同時,在鏈接器中的【附加庫目錄】中加入python的libs路徑和numpy的libs路徑,我這里分別是D:\Python27\libs和D:\Python27\Lib\site-packages\numpy\core\lib,如下圖:
如果這個編譯時出現:
error LNK2001: 無法解析的外部符號 __imp_PyString_FromString
error LNK2001: 無法解析的外部符號 __imp_PyCallable_Check
error LNK2001: 無法解析的外部符號 __imp_PyObject_CallObject
error LNK2001: 無法解析的外部符號 __imp_Py_Initialize
error LNK2001: 無法解析的外部符號 __imp_Py_IsInitialized
error LNK2001: 無法解析的外部符號 __imp_PyImport_Import
error LNK2001: 無法解析的外部符號 __imp_PyModule_GetDict
error LNK2001: 無法解析的外部符號 __imp_PyDict_GetItemString
error LNK2001: 無法解析的外部符號 __imp_PyRun_SimpleStringFlags
error LNK2001: 無法解析的外部符號 __imp_Py_Finalize
等無法解析外部符號等問題,說明C++編譯器在調用python.exe時出錯了,我遇到這個坑,解決了很久,具體原因我也不清楚,猜測是因為編碼問題導致的,因為我下載的python有問題,而我同事的沒問題,最終我把他所有的python文件拷貝覆蓋我這里的,最終才算ok!
如果有出現error C2220: warning treated as error - no object file generated 這樣的錯誤,右擊項目,屬性,在C/C++那里把treat warning as error設為no,再重新編譯一次,就完成編譯了。
(4)其他項目我想應該也是這種添加模式,應該問題不大
(四)編譯完成后檢查
如果編譯成功了,會在caffe-master同路徑下生成NugetPackages文件夾,同時在caffe-master文件夾下生成Build文件夾
(1)NugetPackages里面內容
一個都不能少,如果少了的話,可能是nuget通信問題,多編譯幾次就下載完了。
(2)Build文件夾下的內容,一定有caffe.exe文件,不然說明沒編譯成功
(3)編譯成功后,將caffe-master\caffe-master\Build\x64\Debug\pycaffe路徑下的caffe文件夾拷貝到python的site-packages下面(也可設置PYTHONPATH指向caffe文件夾),然后用python測試能不能正常import caffe,如果沒報錯說明一切OK。我這里引用時遇到一個問題AttributeError: 'module' object has no attribute 'bool_',追蹤錯誤堆棧發現如下:
原來是import io出了問題,caffe文件夾里面也有一個io.py,而系統要求的是numpy里面的io.py,所以沒有bool_這個模塊,解決辦法:
1、不要在caffe目錄下打開python.exe,或者你一定要在此目錄打開,那么請把caffe文件夾移出site-packages路徑,並配置環境變量,變量名=PYTHONPATH,值=caffe包的路徑
2、如果在VS2013項目里面,請刪除References下面的_caffe.pyd引用,如下圖:
(下面一篇文章將詳細介紹利用caffe識別中文驗證碼的內容:卷積神經網絡(CNN)學習算法之----基於LeNet網絡的中文驗證碼識別)