Caffe测试:输入任意一张图片抽取任意一层的feature map,借助MemoryDataLayer

基于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 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值