日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【caffe-Windows】添加工程-以classification为例

發(fā)布時間:2023/12/13 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【caffe-Windows】添加工程-以classification为例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

興趣所向,研究一下如何在caffe工程之外建立一個屬于自己的工程,這里以分類為例,將classification.cpp提取出來,然后調(diào)用相應(yīng)的三方庫和libcaffe.lib進行編譯。這里比較建議有一丟丟C++功底的同志參考學(xué)習(xí),主要涉及到利用VS新建工程,添加lib庫文件,包含頭文件,解決dll丟失問題。看完博客可以學(xué)會,如何不在復(fù)制別人的各種路徑的情況下,依據(jù)caffe-windows自行為新建的工程設(shè)置調(diào)用caffe的路徑。

國際慣例,貼一堆網(wǎng)址:

caffe下新建工程及編譯

caffe-window搭建自己的小項目例子

使用libcaffe為工程添加深度學(xué)習(xí)功能

利用caffe建立自己的工程

caffe C++接口使用配置

caffe框架在添加自己的MFC程序(上)

文章結(jié)束提供本文編譯所用代碼。

做這次筆記主要是,網(wǎng)上找的方法都有復(fù)雜的各種路徑的添加,包括上面的各個參考博客,各種lib,不可能每次新建項目我都要打開別人博客,然后把所有的lib文件復(fù)制下來。在編譯caffe-windows的時候,大家肯定發(fā)現(xiàn)這樣一個問題:我沒有手動加任何路徑,只需要它自動下載NugetPackages三方庫,然后就能編譯了。這就說明在某個地方肯定定義過路徑了,編譯時候直接調(diào)用。這就啟發(fā)我們找到它,按照它 就可以在不看任何博客情況下獨立編寫路徑信息。

【注】方法嚴格建立在BVLC或者微軟的caffe-Windows能夠正常使用的情況下,由于C++還不熟練,直接以classification.cpp為例。

建立新工程

創(chuàng)建項目

隨便在磁盤某個地方新建一個空文件夾,用于存儲我們所要新建的工程。

打開VS2013,新建一個工程,記得選空項目

添加源代碼信息

  • 源文件->添加->新建項->classification.cpp
  • 將caffe-windows路徑(E:\CaffeDev\caffe-master\examples\cpp_classification)里面的classification.cpp的內(nèi)容拷貝,丟到新建的工程中的classification.cpp中去
  • 看看配置管理器是什么,如果是Win32,就改成X64,最好是release

這就算是搞定了工程的創(chuàng)建,與我們寫控制臺helloword的步驟完全一樣。接下來就是解決各種編譯錯誤了。

逐步解決錯誤

caffe頭文件

首先引入眼簾的是

解決方法:加頭文件,把caffe-windows的include文件夾整體拷貝過來,我是放入到sln并列的地方了,這個路徑與后面要加的路徑要對應(yīng),這是后話

拷貝完畢,就去設(shè)置頭文件的包含目錄

三方庫頭文件

然后出現(xiàn)了更多的錯誤

不要慌,這個地方就是與網(wǎng)上的解決方法的不同之處了,當然你也可以按照前言中的博客配置。我這里主要是應(yīng)對沒有聯(lián)網(wǎng)的,無法打開別人博客復(fù)制路徑的情況。

觀察原始caffe-Windows下E:\CaffeDev\caffe-master\windows下的任何一個工程,比如compute_image_mean文件夾下的compute_image_mean.vcxproj,有興趣可以搜一下這個vcxproj的文件包含什么信息,答案是路徑。那么我們就利用這里面的路徑去設(shè)置自己工程的路徑了,當然首先是把NugetPackages的三方庫拷貝到當前工程下,路徑自定,我的路徑如下

然后加入路徑的方法就在我們的E:\caffe-myproject\my_classification\my_classification\my_classification.vcxproj中了,我這里是對比著原始caffe的compute_image_mean.vcxproj和當前工程的my_classification.vcxproj修改的。我就不分析了,直接把關(guān)鍵點列出來:

【注意】以下步驟與路徑關(guān)系很大,../是跳轉(zhuǎn)一個目錄,起始位置是vcxproj所在當前文件夾。

  • 首先是三個props
<Import Project="..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props" Condition="Exists('..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props')" /><Import Project="..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props" Condition="Exists('..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props')" /><Import Project="..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props" Condition="Exists('..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.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
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><Link><AdditionalDependencies>libcaffe.lib;$(CudaDependencies);%(AdditionalDependencies)</AdditionalDependencies><SubSystem>Console</SubSystem></Link></ItemDefinitionGroup><ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><Link><AdditionalDependencies>libcaffe.lib;$(CudaDependencies);%(AdditionalDependencies)</AdditionalDependencies><SubSystem>Console</SubSystem></Link>
  • 最后是所有的NugetPackage的頭文件相關(guān)文件包含
<ImportGroup Label="ExtensionTargets"><Import Project="..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.targets" Condition="Exists('..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.targets')" /><Import Project="..\..\NugetPackages\OpenBLAS.0.2.14.1\build\native\openblas.targets" Condition="Exists('..\..\NugetPackages\OpenBLAS.0.2.14.1\build\native\openblas.targets')" /><Import Project="..\..\NugetPackages\glog.0.3.3.0\build\native\glog.targets" Condition="Exists('..\..\NugetPackages\glog.0.3.3.0\build\native\glog.targets')" /><Import Project="..\..\NugetPackages\hdf5-v120-complete.1.8.15.2\build\native\hdf5-v120.targets" Condition="Exists('..\..\NugetPackages\hdf5-v120-complete.1.8.15.2\build\native\hdf5-v120.targets')" /><Import Project="..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.targets" Condition="Exists('..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.targets')" /><Import Project="..\..\NugetPackages\boost_chrono-vc120.1.59.0.0\build\native\boost_chrono-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_chrono-vc120.1.59.0.0\build\native\boost_chrono-vc120.targets')" /><Import Project="..\..\NugetPackages\boost_date_time-vc120.1.59.0.0\build\native\boost_date_time-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_date_time-vc120.1.59.0.0\build\native\boost_date_time-vc120.targets')" /><Import Project="..\..\NugetPackages\boost_filesystem-vc120.1.59.0.0\build\native\boost_filesystem-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_filesystem-vc120.1.59.0.0\build\native\boost_filesystem-vc120.targets')" /><Import Project="..\..\NugetPackages\boost_system-vc120.1.59.0.0\build\native\boost_system-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_system-vc120.1.59.0.0\build\native\boost_system-vc120.targets')" /><Import Project="..\..\NugetPackages\boost.1.59.0.0\build\native\boost.targets" Condition="Exists('..\..\NugetPackages\boost.1.59.0.0\build\native\boost.targets')" /><Import Project="..\..\NugetPackages\boost_thread-vc120.1.59.0.0\build\native\boost_thread-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_thread-vc120.1.59.0.0\build\native\boost_thread-vc120.targets')" /><Import Project="..\..\NugetPackages\boost_python2.7-vc120.1.59.0.0\build\native\boost_python-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_python2.7-vc120.1.59.0.0\build\native\boost_python-vc120.targets')" /><Import Project="..\..\NugetPackages\protobuf-v120.2.6.1\build\native\protobuf-v120.targets" Condition="Exists('..\..\NugetPackages\protobuf-v120.2.6.1\build\native\protobuf-v120.targets')" /><Import Project="..\..\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\LevelDB-vc120.targets" Condition="Exists('..\..\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\LevelDB-vc120.targets')" /><Import Project="..\..\NugetPackages\lmdb-v120-clean.0.9.14.0\build\native\lmdb-v120-clean.targets" Condition="Exists('..\..\NugetPackages\lmdb-v120-clean.0.9.14.0\build\native\lmdb-v120-clean.targets')" /></ImportGroup>

這幾步很容易遇到這樣的問題

提示很明顯了,看看第77行對應(yīng)的 少了對應(yīng)的 ,加上即可。

cuda相關(guān)頭文件

編譯運行發(fā)現(xiàn)出現(xiàn)下列錯誤

這個一看就可能是cuda的問題了,文件可以在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include中找到,當然不同的安裝位置由不同的路徑尋找,相同的是這個文件一定存在。加入到VS路徑中,操作同上面加caffe的include一樣,注意紅線部分

拷貝libcaffe

最后一個問題是

原因很簡單,因為我們上面只加了libcaffe.lib的路徑,并沒有指引它所在地方,這個就與你的VS功底有關(guān)了,詳細請看“如何調(diào)用C++的dll與lib文件”相關(guān)博客。我們這里直接把原始的caffe-windows下的release版本的libcaffe.lib拷貝到新建文件夾lib中去,路徑如下

拷貝進去以后,在VS中加入lib所在目錄

編譯工程

上述步驟都搞定以后,重新生成我們的工程

然后設(shè)置一下將警告視為錯誤

然后就看到了滿意的結(jié)果啦

解決dll相關(guān)問題

有時候會遇到這個問題,有時候不會遇到,可以先直接跳過此步驟,直接進行分類使用步驟,如果出現(xiàn)dll缺失問題,再回來添加dll。

方案1

當前編譯了不一定能運行,還有dll沒拷貝呢,網(wǎng)上博客說dll的使用方法是,將dll拷貝到一個文件夾,比如將caffe-windows的release下的所有dll全部拷貝到我們工程的如下新建文件夾中

然后在VS中

但是設(shè)置完畢以后,還是提示缺少dll,以后再試試,是不是哪里出問題了

方案2

跟前面一樣,把編譯的caffe-windows下的release文件夾加入到系統(tǒng)環(huán)境變量path中去,不再贅述,因為前面的caffe-Windows配置好像有過這個步驟,就是單純的將E:\CaffeDev\caffe-master\Build\x64\Release加入path,僅此而已。

方案3

最簡單粗暴的方法,上面編譯工程完事以后,可以發(fā)現(xiàn)我們的工程多了個build文件夾,那么把所有的dll拷貝到E:\caffe-myproject\Build\x64\Release即可,如果你發(fā)現(xiàn)這個文件夾中有dll,就不用拷貝了,應(yīng)該不會提示缺dll的問題,如果還是提示,那就拷貝吧,如果還是不行,自行百度。

分類使用

準備相關(guān)文件

使用方法就是先將所有的文件準備好

分別是待分類圖片、模型結(jié)構(gòu)、訓(xùn)練好的模型參數(shù)、均值、標簽。前面cifar的模型建立和使用都介紹過這些東西的生成方法。

【注】按照上述方法完全不會出問題,最好最好是在原始的caffe-windows的基礎(chǔ)下操作,如果是自己改動的caffe-windows的話,可能會出現(xiàn)一些不必要的問題。

運行方法-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的結(jié)果:

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 請按任意鍵繼續(xù). . .

運行方法-修改cpp方法

改一下main函數(shù)

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運行結(jié)果

后記

一定要不斷編譯、不斷嘗試、不斷查錯、不斷修改,此外熟能生巧。還有兩點強調(diào):路徑路徑路徑原版caffe原版caffe原版caffe

編譯方法多種多樣,上述步驟肯定有不必要的地方,后期逐步修改

  • 第一次嘗試編譯的代碼

    鏈接:http://pan.baidu.com/s/1i5vBPaP 密碼:x7ee

  • 第二次嘗試編譯的代碼
    鏈接:http://pan.baidu.com/s/1skIfYkH 密碼:w69a
    主要相對于第一次編譯的代碼,刪除了部分冗余的文件,也就是不從原版的caffe-Windows拷貝的東西,包括:

    • CommonSettings.targets,在my_classification.vcxproj中不需要添加的話語是
    <ItemGroup><ClInclude Include="head.h" /> </ItemGroup>
    • 下面這句話刪除也沒影響
    <ItemGroup><None Include="packages.config" /> </ItemGroup>

總結(jié)

以上是生活随笔為你收集整理的【caffe-Windows】添加工程-以classification为例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。