① 深度學習caffe的代碼怎麼讀
我認為這個問題我是這樣看的,希望可以幫到你。
Caffe框架主要有五個組件,Blob,Solver,Net,Layer,Proto,其結構圖如下圖1所示。Solver負責深度網路的訓練,每個Solver中包含一個訓練網路對象和一個測試網路對象。每個網路則由若干個Layer構成。每個Layer的輸入和輸出Feature map表示為Input Blob和Output Blob。
最後因為我自己也不是專業的程序員所以如果有不對的地方歡迎更正。
② 如何調用caffe已經訓練好的net
cifar10資料庫
60000張32*32 彩色圖片 共10類
50000張訓練
10000張測試
下載cifar10資料庫
這是binary格式的,所以我們要把它轉換成leveldb格式。
2 在../caffe-windows/examples/cifar10文件夾中有一個 convert_cifar_data.cpp
將他include到MainCaller.cpp中。如下:編譯....我是一次就通過了 ,在bin文件夾里出現convert_cifar_data.exe。然後 就可以進行格式轉換。binary→leveldb
可以在bin文件夾下新建一個input文件夾。將cifar10.binary文件放在input文件夾中,這樣轉換時就不用寫路徑了。
③ 如何調用caffe已經訓練好的net
你想調用你的模型,最簡單的辦法是看examples/cpp_classification裡面的cpp文件,那是教你如何調用caffe獲取分類結果的...(你沒接觸過caffe的話,建議你直接按照這個文件來操作可能會比較簡單,下面我的代碼我也不知道沒接觸過caffe的人看起來難度會有多大)
不過那個代碼我看著不太習慣,所以之前自己稍微寫了一個簡易的版本,不知道怎麼上傳附件,懶人一個就直接把代碼貼在最後了。
先簡單解釋一下如何使用,把這個代碼復制到一個頭文件中,然後放在examples裡面一個自己創建的文件夾裡面,然後寫一個main函數調用這個類就可以了,比如:
復制,保存到caffe/examples/myproject/net_operator.hpp,然後同目錄下寫一個main.cpp,在main函數裡面#include "net_operator.hpp",就可以使用這個類了:
const string net_prototxt = "..."; // 你的網路的prototxt文件,用絕對路徑,下面同理
const string pre_trained_file = "..."; // 你訓練好的.caffemodel文件
const string img_path = "..."; // 你要測試的圖片路徑
// 創建NetOperator對象
NetOperator net_operator(net_prototxt, pre_trained_file);
Blob<float> *blob = net_operator.processImage(img_path);
// blob就得到了最後一層的輸出結果,至於blob裡面是怎麼存放數據的,你需要去看看官網對它的定義
寫完main.cpp之後,到caffe目錄下,make,然後它會編譯你寫的文件,對應生成的可執行文件。比如按我上面寫的那樣,make之後就會在caffe/build/examples/myproject文件夾裡面生成一個main.bin,執行這個文件就可以了。因為生成的可執行文件並不是直接在代碼目錄下,所以前面我建議你寫的路徑用絕對路徑
另外如果你要獲取的不是最後一層的輸出,你需要修改一下processImage函數的返回值,通過NetOperator的成員變數net_來獲取你需要的blob,比如有個blob名稱為"label",你想獲取這個blob,可以通過net_->blob_by_name("label")來獲取,當然獲取到的是shared_ptr<Blob<float> >類型的,搜一下boost shared_ptr就知道跟普通指針有什麼不同了
好了,接下來是貼代碼了:
#include <caffe/caffe.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iosfwd>
#include <memory>
#include <string>
#include <utility>
#include <vector>
using namespace caffe; // NOLINT(build/namespaces)
using std::string;
class NetOperator
{
public:
NetOperator(const string& net_prototxt);
NetOperator(const string& net_prototxt, const string& trained_file);
~NetOperator() { }
int batch_size() { return batch_size_; }
Blob<float>* processImage(const string &img_path, bool is_color = true);
Blob<float>* processImages(const vector<string> &img_paths, bool is_color = true);
private:
void createNet(const string& net_prototxt);
// read the image and store it in the idx position of images in the blob
void readImageToBlob(const string &img_path, int idx = 0, bool is_color = true);
shared_ptr<Net<float> > net_;
cv::Size input_geometry_;
int batch_size_;
int num_channels_;
Blob<float>* input_blob_;
TransformationParameter transform_param_;
shared_ptr<DataTransformer<float> > data_transformer_;
Blob<float> transformed_data_;
};
NetOperator::NetOperator(const string& net_prototxt) {
createNet(net_prototxt);
}
NetOperator::NetOperator(const string& net_prototxt, const string& trained_file) {
createNet(net_prototxt);
net_->CopyTrainedLayersFrom(trained_file);
}
void NetOperator::createNet(const string& net_prototxt) {
#ifdef CPU_ONLY
Caffe::set_mode(Caffe::CPU);
#else
Caffe::set_mode(Caffe::GPU);
#endif
net_.reset(new Net<float>(net_prototxt, TEST));
CHECK_EQ(net_->num_inputs(), 1) << "Network should have exactly one input.";
CHECK_EQ(net_->num_outputs(), 1) << "Network should have exactly one output.";
Blob<float>* input_layer = net_->input_blobs()[0];
batch_size_ = input_layer->num();
num_channels_ = input_layer->channels();
CHECK(num_channels_ == 3 || num_channels_ == 1)
<< "Input layer should have 1 or 3 channels.";
input_geometry_ = cv::Size(input_layer->width(), input_layer->height());
// reshape the output shape of the DataTransformer
vector<int> top_shape(4);
top_shape[0] = 1;
top_shape[1] = num_channels_;
top_shape[2] = input_geometry_.height;
top_shape[3] = input_geometry_.width;
this->transformed_data_.Reshape(top_shape);
}
Blob<float>* NetOperator::processImage(const string &img_path, bool is_color) {
// reshape the net for the input
input_blob_ = net_->input_blobs()[0];
input_blob_->Reshape(1, num_channels_,
input_geometry_.height, input_geometry_.width);
net_->Reshape();
readImageToBlob(img_path, 0, is_color);
net_->ForwardPrefilled();
return net_->output_blobs()[0];
}
Blob<float>* NetOperator::processImages(const vector<string> &img_paths, bool is_color) {
int img_num = img_paths.size();
// reshape the net for the input
input_blob_ = net_->input_blobs()[0];
input_blob_->Reshape(img_num, num_channels_,
input_geometry_.height, input_geometry_.width);
net_->Reshape();
for (int i=0; i<img_num; i++) {
readImageToBlob(img_paths[i], i, is_color);
}
net_->ForwardPrefilled();
return net_->output_blobs()[0];
}
void NetOperator::readImageToBlob(const string &img_path, int idx, bool is_color) {
// read the image and resize to the target size
cv::Mat img;
int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat cv_img_origin = cv::imread(img_path, cv_read_flag);
if (!cv_img_origin.data) {
LOG(ERROR) << "Could not open or find file " << img_path;
return ;
}
if (input_geometry_.height > 0 && input_geometry_.width > 0) {
cv::resize(cv_img_origin, img, input_geometry_);
} else {
img = cv_img_origin;
}
// transform the image to a blob using DataTransformer
// create a DataTransformer using default TransformationParameter (no transformation)
data_transformer_.reset(
new DataTransformer<float>(transform_param_, TEST));
data_transformer_->InitRand();
// set the output of DataTransformer to the idx image of the input blob
int offset = input_blob_->offset(idx);
this->transformed_data_.set_cpu_data(input_blob_->mutable_cpu_data() + offset);
// transform the input image
data_transformer_->Transform(img, &(this->transformed_data_));
}
④ 如何調用caffe已經訓練好的net
1 cifar10資料庫 60000張32*32 彩色圖片 共10類 50000張訓練 10000張測試 下載cifar10資料庫 這是binary格式的,所以我們要把它轉換成leveldb格式。 2 在../caffe-windows/examples/cifar10文件夾中有一個 convert_cifar_data.cpp 將他include到...
⑤ 如何調用caffe已經訓練好的net
文件夾裡面,然後寫一個main函數調用這個類就可以了,比如:復制,保存到caffe/examples/myproject/net_operator.hpp,然後同目錄下寫一個main.cpp,在main函數裡面#include "net_operator.hpp",就可以使用這個類了:const string net_prototxt = "..."; // 你的網路的prototxt文件,用絕對路徑,下面同理const string pre_trained_file = "..."; // 你訓練好的.caffemodel文件const string img_path = "..."; // 你要測試的圖片路徑// 創建NetOperator對象NetOperator net_operator(net_prototxt, pre_trained_file);Blob<float> *blob = net_operator.processImage(img_path);// blob就得到了最後一層的輸出結果,至於blob裡面是怎麼存放數據的,你需要去看看官網對它的定義寫完main.cpp之後,到caffe目錄下,make,然後它會編譯你寫的文件,對應生成的可執行文件。比如按我上面寫的那樣,make之後就會在caffe/build/examples/myproject文件夾裡面生成一個main.bin,執行這個文件就可以了。因為生成的可執行文件並不是直接在代碼目錄下,所以前面我建議你寫的路徑用絕對路徑另外如果你要獲取的不是最後一層的輸出,你需要修改一下processImage函數的返回值,通過NetOperator的成員變數net_來獲取你需要的blob,比如有個blob名稱為"label",你想獲取這個blob,可以通過net_->blob_by_name("label")來獲取,當然獲取到的是shared_ptr<Blob<float> >類型的,搜一下boost shared_ptr就知道跟普通指針有什麼不同了好了,接下來是貼代碼了:#include <caffe/caffe.hpp>#include <opencv2/core/core.hpp>#include <opencv2/highgui www.hbbz08.com /highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <iosfwd>#include <memory>#include <string>#include <utility>#include <vector>using namespace caffe; // NOLINT(build/namespaces)using std::string;class NetOperator{public: NetOperator(const string& net_prototxt); NetOperator(const string& net_prototxt, const string& trained_file); ~NetOperator() { } int batch_size() { return batch_size_; } Blob<float>* processImage(const string &img_path, bool is_color = true); Blob<float>* processImages(const vector<string> &img_paths, bool is_color = true);private: void createNet(const string& net_prototxt); // read the image and store it in the idx position of images in the blob void readImageToBlob(const string &img_path, int idx = 0, bool is_color = true); shared_ptr<Net<float> > net_; cv::Size input_geometry_; int batch_size_; int num_channels_; Blob<float>* input_blob_; TransformationParameter transform_param_; shared_ptr<DataTransformer<float> > data_transformer_; Blob<float> transformed_data_;};NetOperator::NetOperator(const string& net_prototxt) { createNet(net_prototxt);}NetOperator::NetOperator(const string& net_prototxt, const string& trained_file) { createNet(net_prototxt); net_->CopyTrainedLayersFrom(trained_file);}void NetOperator::createNet(const string& net_prototxt) {#ifdef CPU_ONLY Caffe::set_mode(Caffe::CPU);#else Caffe::set_mode(Caff www.hnne.com e::GPU);#endif net_.reset(new Net<float>(net_prototxt, TEST)); CHECK_EQ(net_->num_inputs(), 1) << "Network should have exactly one input."; CHECK_EQ(net_->num_outputs(), 1) << "Network should have exactly one output."; Blob<float>* input_layer = net_->input_blobs()[0]; batch_size_ = input_layer->num(); num_channels_ = input_layer->channels(); CHECK(num_channels_ == 3 || num_channels_ == 1) << "Input layer should have 1 or 3 channels."; input_geometry_ = cv::Size(input_layer->width(), input_layer->height()); // reshape the output shape of the DataTransformer vector<int> top_shape(4); top_shape[0] = 1; top_shape[1] = num_channels_; top_shape[2] = input_geometry_.height; top_shape[3] = input_geometry_.width; this->transformed_data_.Reshape(top_shape);}Blob<float>* NetOperator::processImage(const string &img_path, bool is_color) { // reshape the net for the input input_blob_ = net_->input_blobs()[0]; input_blob_->Reshape(1, num_channels_, input_geometry_.height, input_geometry_.width); net_->Reshape(); readImageToBlob(img_path, 0, is_color); net_->ForwardPrefilled(); return net_->output_blobs()[0];}Blob<float>* NetOperator::processImages(const vector<string> &img_paths, bool is_color) { int img_num = img_paths.size(); // reshape the net for the input input_blob_ = net_->input_blobs()[0]; input_blob_->Reshape(img_num, num_channels_, input_geometry_.height, input_geometry_.width); net_->Reshape(); for (int i=0; i<img_num; i++) { readImageToBlob(img_paths[i], i, is_color); } net_->ForwardPrefilled(); return net_->output_blobs()[0];}void NetOperator::readImageToBlob(const string &img_path, int idx, bool is_color) { // read the image and resize to the target size cv::Mat img; int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE); cv::Mat cv_img_origin = cv::imread(img_path, cv_read_flag); if (!cv_img_origin.data) { LOG(ERROR) << "Could not open or find file " << img_path; return ; } if (input_geometry_.height > 0 && input_geometry_.width > 0) { cv::resize(cv_img_origin, img, input_geometry_); } else { img = cv_img_origin; } // transform the image to a blob using DataTransformer // create a DataTransformer using default TransformationParameter (no transformation) data_transformer_.reset( new DataTransformer<float>(transform_param_, TEST)); data_transformer_->InitRand(); // set the output of DataTransformer to the idx image of the input blob int offset = input_blob_->offset(idx); this->transformed_data_.set_cpu_data(input_blob_->mutable_cpu_data() + offset); // transform the input image data_transformer_->Transform(img, &(this->transformed_data_));
⑥ java 可以調用caffe模型嗎
具有速度快,模型定義方便等優點。學習了幾天過後,發現也有一個不方便的地方,就是在我的程序中調用Caffe做圖像分類沒有直接的介面。
⑦ 求助waifu2x-caffe無法運行
一般java虛擬機默認安裝在系統盤(C:/)根目錄下,但環境變數中的路徑卻需要設置。右鍵電擊「我的電腦」屬性,在高級選項中有個環境變數,將下邊的系統變數中的path路徑後面追加「C;/jre1.5.0_05/bin;」就可以了。 至於編譯運行,可在「運行」中輸入cmd,進入你代碼所在文件夾,javac命令編譯,java命令運行。