Restructure include files.
This way main.o is much faster to compile, leaving Simulator.o the only file that really takes time.
This commit is contained in:
@@ -3,24 +3,29 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "Simulator.hpp"
|
#include "Simulator.hpp"
|
||||||
|
#include <caffe/caffe.hpp>
|
||||||
|
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
#include <opencv2/imgproc/imgproc.hpp>
|
||||||
|
|
||||||
using namespace caffe;
|
using namespace caffe;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace fmri;
|
using namespace fmri;
|
||||||
|
|
||||||
Simulator::Simulator(const string& model_file, const string& weights_file, const string& means_file) :
|
Simulator::Simulator(const string& model_file, const string& weights_file, const string& means_file) :
|
||||||
net(model_file, TEST)
|
net(new Net<DType>(model_file, TEST))
|
||||||
{
|
{
|
||||||
net.CopyTrainedLayersFrom(weights_file);
|
net->CopyTrainedLayersFrom(weights_file);
|
||||||
|
|
||||||
Blob<DType>* input_layer = net.input_blobs()[0];
|
Blob<DType>* input_layer = net->input_blobs()[0];
|
||||||
input_geometry = cv::Size(input_layer->width(), input_layer->height());
|
input_geometry = cv::Size(input_layer->width(), input_layer->height());
|
||||||
num_channels = input_layer->channels();
|
num_channels = input_layer->channels();
|
||||||
|
|
||||||
input_layer->Reshape(1, num_channels,
|
input_layer->Reshape(1, num_channels,
|
||||||
input_geometry.height, input_geometry.width);
|
input_geometry.height, input_geometry.width);
|
||||||
/* Forward dimension change to all layers. */
|
/* Forward dimension change to all layers. */
|
||||||
net.Reshape();
|
net->Reshape();
|
||||||
|
|
||||||
if (means_file != "") {
|
if (means_file != "") {
|
||||||
means = processMeans(means_file);
|
means = processMeans(means_file);
|
||||||
@@ -41,15 +46,15 @@ vector<LayerData> Simulator::simulate(const string& image_file)
|
|||||||
|
|
||||||
cv::split(input, channels);
|
cv::split(input, channels);
|
||||||
|
|
||||||
net.Forward();
|
net->Forward();
|
||||||
|
|
||||||
vector<LayerData> result;
|
vector<LayerData> result;
|
||||||
|
|
||||||
Blob<DType>* input_layer = net.input_blobs()[0];
|
Blob<DType>* input_layer = net->input_blobs()[0];
|
||||||
|
|
||||||
const auto& names = net.layer_names();
|
const auto& names = net->layer_names();
|
||||||
const auto& results = net.top_vecs();
|
const auto& results = net->top_vecs();
|
||||||
const auto& layers = net.layers();
|
const auto& layers = net->layers();
|
||||||
|
|
||||||
for (unsigned int i = 0; i < names.size(); ++i) {
|
for (unsigned int i = 0; i < names.size(); ++i) {
|
||||||
CHECK_EQ(results[i].size(), 1) << "Multiple outputs per layer are not supported!" << endl;
|
CHECK_EQ(results[i].size(), 1) << "Multiple outputs per layer are not supported!" << endl;
|
||||||
@@ -64,7 +69,7 @@ vector<LayerData> Simulator::simulate(const string& image_file)
|
|||||||
vector<cv::Mat> Simulator::getWrappedInputLayer()
|
vector<cv::Mat> Simulator::getWrappedInputLayer()
|
||||||
{
|
{
|
||||||
vector<cv::Mat> channels;
|
vector<cv::Mat> channels;
|
||||||
Blob<DType>* input_layer = net.input_blobs()[0];
|
Blob<DType>* input_layer = net->input_blobs()[0];
|
||||||
|
|
||||||
const int width = input_geometry.width;
|
const int width = input_geometry.width;
|
||||||
const int height = input_geometry.height;
|
const int height = input_geometry.height;
|
||||||
@@ -151,3 +156,8 @@ cv::Mat Simulator::processMeans(const string &means_file) const
|
|||||||
|
|
||||||
return cv::Mat(input_geometry, mean.type(), cv::mean(mean));
|
return cv::Mat(input_geometry, mean.type(), cv::mean(mean));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Simulator::~Simulator()
|
||||||
|
{
|
||||||
|
// Empty but defined constructor.
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,14 +4,18 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <caffe/caffe.hpp>
|
#include <opencv2/core/types.hpp>
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/mat.hpp>
|
||||||
#include <opencv2/highgui/highgui.hpp>
|
|
||||||
#include <opencv2/imgproc/imgproc.hpp>
|
|
||||||
|
|
||||||
#include "utils.hpp"
|
#include "utils.hpp"
|
||||||
#include "LayerData.hpp"
|
#include "LayerData.hpp"
|
||||||
|
|
||||||
|
namespace caffe
|
||||||
|
{
|
||||||
|
template<class DType>
|
||||||
|
class Net;
|
||||||
|
}
|
||||||
|
|
||||||
namespace fmri {
|
namespace fmri {
|
||||||
using std::string;
|
using std::string;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
@@ -19,11 +23,12 @@ namespace fmri {
|
|||||||
class Simulator {
|
class Simulator {
|
||||||
public:
|
public:
|
||||||
Simulator(const string &model_file, const string &weights_file, const string &means_file = "");
|
Simulator(const string &model_file, const string &weights_file, const string &means_file = "");
|
||||||
|
~Simulator();
|
||||||
|
|
||||||
vector<LayerData> simulate(const string &input_file);
|
vector<LayerData> simulate(const string &input_file);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
caffe::Net<DType> net;
|
std::unique_ptr<caffe::Net<DType>> net;
|
||||||
cv::Size input_geometry;
|
cv::Size input_geometry;
|
||||||
cv::Mat means;
|
cv::Mat means;
|
||||||
unsigned int num_channels;
|
unsigned int num_channels;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
#include "Options.hpp"
|
#include "Options.hpp"
|
||||||
#include "Simulator.hpp"
|
#include "Simulator.hpp"
|
||||||
#include "PNGDumper.hpp"
|
#include "PNGDumper.hpp"
|
||||||
|
|||||||
Reference in New Issue
Block a user