【caffe-Windows】添加工程-以classification为例
前言
興趣所向,研究一下如何在caffe工程之外建立一個屬于自己的工程,這里以分類為例,將classification.cpp提取出來,然后調用相應的三方庫和libcaffe.lib進行編譯。這里比較建議有一丟丟C++功底的同志參考學習,主要涉及到利用VS新建工程,添加lib庫文件,包含頭文件,解決dll丟失問題。看完博客可以學會,如何不在復制別人的各種路徑的情況下,依據caffe-windows自行為新建的工程設置調用caffe的路徑。
國際慣例,貼一堆網址:
caffe下新建工程及編譯
caffe-window搭建自己的小項目例子
使用libcaffe為工程添加深度學習功能
利用caffe建立自己的工程
caffe C++接口使用配置
caffe框架在添加自己的MFC程序(上)
文章結束提供本文編譯所用代碼。
做這次筆記主要是,網上找的方法都有復雜的各種路徑的添加,包括上面的各個參考博客,各種lib,不可能每次新建項目我都要打開別人博客,然后把所有的lib文件復制下來。在編譯caffe-windows的時候,大家肯定發現這樣一個問題:我沒有手動加任何路徑,只需要它自動下載NugetPackages三方庫,然后就能編譯了。這就說明在某個地方肯定定義過路徑了,編譯時候直接調用。這就啟發我們找到它,按照它 就可以在不看任何博客情況下獨立編寫路徑信息。
【注】方法嚴格建立在BVLC或者微軟的caffe-Windows能夠正常使用的情況下,由于C++還不熟練,直接以classification.cpp為例。
建立新工程
創建項目
隨便在磁盤某個地方新建一個空文件夾,用于存儲我們所要新建的工程。
打開VS2013,新建一個工程,記得選空項目
添加源代碼信息
- 源文件->添加->新建項->classification.cpp
- 將caffe-windows路徑(E:\CaffeDev\caffe-master\examples\cpp_classification)里面的classification.cpp的內容拷貝,丟到新建的工程中的classification.cpp中去
- 看看配置管理器是什么,如果是Win32,就改成X64,最好是release
這就算是搞定了工程的創建,與我們寫控制臺helloword的步驟完全一樣。接下來就是解決各種編譯錯誤了。
逐步解決錯誤
caffe頭文件
首先引入眼簾的是
解決方法:加頭文件,把caffe-windows的include文件夾整體拷貝過來,我是放入到sln并列的地方了,這個路徑與后面要加的路徑要對應,這是后話
拷貝完畢,就去設置頭文件的包含目錄
三方庫頭文件
然后出現了更多的錯誤
不要慌,這個地方就是與網上的解決方法的不同之處了,當然你也可以按照前言中的博客配置。我這里主要是應對沒有聯網的,無法打開別人博客復制路徑的情況。
觀察原始caffe-Windows下E:\CaffeDev\caffe-master\windows下的任何一個工程,比如compute_image_mean文件夾下的compute_image_mean.vcxproj,有興趣可以搜一下這個vcxproj的文件包含什么信息,答案是路徑。那么我們就利用這里面的路徑去設置自己工程的路徑了,當然首先是把NugetPackages的三方庫拷貝到當前工程下,路徑自定,我的路徑如下
然后加入路徑的方法就在我們的E:\caffe-myproject\my_classification\my_classification\my_classification.vcxproj中了,我這里是對比著原始caffe的compute_image_mean.vcxproj和當前工程的my_classification.vcxproj修改的。我就不分析了,直接把關鍵點列出來:
【注意】以下步驟與路徑關系很大,../是跳轉一個目錄,起始位置是vcxproj所在當前文件夾。
- 首先是三個props
隨后是CommonSettings.props
如果不加入CommonSettings.props,會在后面提示opencv未啟用問題,為了方便,直接把caffe-windows的拷貝CommonSettings.props過來使用
<ImportGroup Label="PropertySheets" Condition="Exists('$(SolutionDir)\CommonSettings.props')"><Import Project="..\CommonSettings.props" /> </ImportGroup>
- 然后是libcaffe.lib
- 最后是所有的NugetPackage的頭文件相關文件包含
這幾步很容易遇到這樣的問題
提示很明顯了,看看第77行對應的 少了對應的 ,加上即可。
cuda相關頭文件
編譯運行發現出現下列錯誤
這個一看就可能是cuda的問題了,文件可以在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include中找到,當然不同的安裝位置由不同的路徑尋找,相同的是這個文件一定存在。加入到VS路徑中,操作同上面加caffe的include一樣,注意紅線部分
拷貝libcaffe
最后一個問題是
原因很簡單,因為我們上面只加了libcaffe.lib的路徑,并沒有指引它所在地方,這個就與你的VS功底有關了,詳細請看“如何調用C++的dll與lib文件”相關博客。我們這里直接把原始的caffe-windows下的release版本的libcaffe.lib拷貝到新建文件夾lib中去,路徑如下
拷貝進去以后,在VS中加入lib所在目錄
編譯工程
上述步驟都搞定以后,重新生成我們的工程
然后設置一下將警告視為錯誤為否
然后就看到了滿意的結果啦
解決dll相關問題
有時候會遇到這個問題,有時候不會遇到,可以先直接跳過此步驟,直接進行分類使用步驟,如果出現dll缺失問題,再回來添加dll。
方案1
當前編譯了不一定能運行,還有dll沒拷貝呢,網上博客說dll的使用方法是,將dll拷貝到一個文件夾,比如將caffe-windows的release下的所有dll全部拷貝到我們工程的如下新建文件夾中
然后在VS中
但是設置完畢以后,還是提示缺少dll,以后再試試,是不是哪里出問題了
方案2
跟前面一樣,把編譯的caffe-windows下的release文件夾加入到系統環境變量path中去,不再贅述,因為前面的caffe-Windows配置好像有過這個步驟,就是單純的將E:\CaffeDev\caffe-master\Build\x64\Release加入path,僅此而已。
方案3
最簡單粗暴的方法,上面編譯工程完事以后,可以發現我們的工程多了個build文件夾,那么把所有的dll拷貝到E:\caffe-myproject\Build\x64\Release即可,如果你發現這個文件夾中有dll,就不用拷貝了,應該不會提示缺dll的問題,如果還是提示,那就拷貝吧,如果還是不行,自行百度。
分類使用
準備相關文件
使用方法就是先將所有的文件準備好
分別是待分類圖片、模型結構、訓練好的模型參數、均值、標簽。前面cifar的模型建立和使用都介紹過這些東西的生成方法。
【注】按照上述方法完全不會出問題,最好最好是在原始的caffe-windows的基礎下操作,如果是自己改動的caffe-windows的話,可能會出現一些不必要的問題。
運行方法-bat形式
老樣子,直接寫bat文件:
E:\caffe-myproject\Build\x64\Release\my_classification.exe lenet.prototxt lenet_iter_10000.caffemodel mean.binaryproto synset_words.txt 2.bmp pause運行出錯
F0411 12:20:34.327227 14000 layer_factory.hpp:81] Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type: Input (known types: ) *** Check failure stack trace: ***此博客【邊喝caffee邊Caffe 】(三) Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type有講解為什么,那么就直接按照方法,建立一個head.h
#include "caffe/common.hpp" #include "caffe/layers/input_layer.hpp" #include "caffe/layers/inner_product_layer.hpp" #include "caffe/layers/dropout_layer.hpp" #include "caffe/layers/conv_layer.hpp" #include "caffe/layers/relu_layer.hpp"#include "caffe/layers/pooling_layer.hpp" #include "caffe/layers/lrn_layer.hpp" #include "caffe/layers/softmax_layer.hpp"namespace caffe {extern INSTANTIATE_CLASS(InputLayer);extern INSTANTIATE_CLASS(InnerProductLayer);extern INSTANTIATE_CLASS(DropoutLayer);extern INSTANTIATE_CLASS(ConvolutionLayer);REGISTER_LAYER_CLASS(Convolution);extern INSTANTIATE_CLASS(ReLULayer);REGISTER_LAYER_CLASS(ReLU);extern INSTANTIATE_CLASS(PoolingLayer);REGISTER_LAYER_CLASS(Pooling);extern INSTANTIATE_CLASS(LRNLayer);REGISTER_LAYER_CLASS(LRN);extern INSTANTIATE_CLASS(SoftmaxLayer);REGISTER_LAYER_CLASS(Softmax);}然后在classification.cpp頭部引用一下,注意是雙引號而非尖括號引用,以有智能提示為基準
#include "head.h"重新編譯以后,然后運行bat的結果:
E:\caffe-myproject\test\mnist>E:\caffe-myproject\Build\x64\Release\my_classifica tion.exe lenet.prototxt lenet_iter_10000.caffemodel mean.binaryproto synset_word s.txt 2.bmp ---------- Prediction for 2.bmp ---------- 1.0000 - "2" 0.0000 - "0" 0.0000 - "3" 0.0000 - "1" 0.0000 - "4"E:\caffe-myproject\test\mnist>pause 請按任意鍵繼續. . .運行方法-修改cpp方法
改一下main函數
int main(int argc, char** argv) {//if (argc != 6) {// std::cerr << "Usage: " << argv[0]// << " deploy.prototxt network.caffemodel"// << " mean.binaryproto labels.txt img.jpg" << std::endl;// return 1;//}::google::InitGoogleLogging(argv[0]);argv[1] = "E:\\caffe-myproject\\test\\cifar\\cifar10_quick.prototxt";argv[2] = "E:\\caffe-myproject\\test\\cifar\\cifar10_quick_iter_4000.caffemodel.h5";argv[3] = "E:\\caffe-myproject\\test\\cifar\\mean.binaryproto";argv[4] = "E:\\caffe-myproject\\test\\cifar\\synset_words.txt";argv[5] = "E:\\caffe-myproject\\test\\cifar\\dog.jpg";string model_file = argv[1];string trained_file = argv[2];string mean_file = argv[3];string label_file = argv[4];Classifier classifier(model_file, trained_file, mean_file, label_file);string file = argv[5];std::cout << "---------- Prediction for "<< file << " ----------" << std::endl;cv::Mat img = cv::imread(file, -1);CHECK(!img.empty()) << "Unable to decode image " << file;std::vector<Prediction> predictions = classifier.Classify(img);/* Print the top N predictions. */for (size_t i = 0; i < predictions.size(); ++i) {Prediction p = predictions[i];std::cout << std::fixed << std::setprecision(4) << p.second << " - \""<< p.first << "\"" << std::endl;} }然后ctrl+F5運行結果
后記
一定要不斷編譯、不斷嘗試、不斷查錯、不斷修改,此外熟能生巧。還有兩點強調:路徑路徑路徑、原版caffe原版caffe原版caffe
編譯方法多種多樣,上述步驟肯定有不必要的地方,后期逐步修改
第一次嘗試編譯的代碼
鏈接:http://pan.baidu.com/s/1i5vBPaP 密碼:x7ee
第二次嘗試編譯的代碼
鏈接:http://pan.baidu.com/s/1skIfYkH 密碼:w69a
主要相對于第一次編譯的代碼,刪除了部分冗余的文件,也就是不從原版的caffe-Windows拷貝的東西,包括:- CommonSettings.targets,在my_classification.vcxproj中不需要添加的話語是
- 下面這句話刪除也沒影響
總結
以上是生活随笔為你收集整理的【caffe-Windows】添加工程-以classification为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Delayed Ack(Ack确认延迟)
- 下一篇: Confluence Wiki Mark