基于extract_feature.cpp修改
extract_feature.cpp是根据prototxt进行测试,因此需要将数据转成特定的格式放入datalayer,一般都是lmdb。
但是在实际应用中,将数据先转成lmdb很麻烦,本文意在实现直接读入3D数据,输入到网络中进行测试,输出一个3D特征图,不需格式转换。
本文的输入数据是三维图像,截成二维的slice进行训练,但是在测试的时候期望能实现输入一张三维图像,直接得到测试后的输出三维feature。因此在以下博文的基础上做了修改
https://blog.csdn.net/u011559236/article/details/78516725
关键由三个部分:
一。数据输入
现将数据读入内存,再使用memorydatalayer将数据放入数据层的Blob中。
memorydatalayer是使用cv::mat读取二维图像,再通过以下代码放入blob
caffe::MemoryDataLayer<NetF> *layer = (caffe::MemoryDataLayer<NetF> *)feature_extraction_net->layers()[0].get();
layer->AddMatVector(cv_mat, label);
在3D图像中,需要改一下AddMatVector,不要改原函数,以防以后还会用这个函数,可以在memory_data_layer.cpp和memory_data_layer.hpp中加上一个新的函数的定义和声明。
template <typename Dtype>
void MemoryDataLayer<Dtype>::AddRawData(float* mat_vector,
const vector<int>& labels, int num) {
//size_t num = mat_vector.size();
//size_t num = batch_size_;
std::cout << "nSlice:" << num << endl;
std::cout << "nchannels:" << channels_ << endl;
std::cout << "nheight:" << height_ << endl;
std::cout << "nwidth:" << width_ << endl;
CHECK(!has_new_data_) <<
"Can't add mat until current data has been consumed.";
CHECK_GT(num, 0) << "There is no mat to add";
CHECK_EQ(num % batch_size_, 0) <<
"The added data must be a multiple of the batch size.";
added_data_.Reshape(num, channels_, height_, width_);
added_label_.Reshape(num, 1, 1, 1);
// Apply data transformations (mirror, scale, crop...)
//this->data_transformer_->Transform(mat_vector, &added_data_);// this layer doesn't need transform //useless in this function, turn it off
//Dtype* transformed_data = transformed_blob->mutable_cpu_data();
Dtype* feature_blob_data = added_data_.mutable_cpu_data();
for (int i = 0; i < num*channels_*height_*width_; i++){
feature_blob_data[i] = mat_vector[i];
}// put mat_vector into Blob
这里的mat_vector是一个存储图像数据的数组,不是cv::mat矩阵。
我没有继续用cv::mat,原因是三维数据的格式是rawdata,不能使用opencv读取,若是在AddRawData里沿用cv::mat,还需要将数组转成cv::mat,没有必要。
同时,还要在memory_data_layer.hpp中加上一个声明,一句话
virtual void AddRawData(float* mat_vector,
const vector<int>& labels, int num);
这里仅实现把数据放入Data层的Blob中,没有做data_transform的操作,data transform是在数据层外面做的。
二。extract_feature.cpp
读取数据》normalization》interpolation》cropping or padding》extract features》save features
#include <string>
#include <vector>
#include "boost/algorithm/string.hpp"
#include "google/protobuf/text_format.h"
#include "caffe/blob.hpp"
#include "caffe/common.hpp"
#include "caffe/net.hpp"
#include "caffe/layer.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/util/db.hpp"
#include "