parent
a6963b4abb
commit
6e23d93b39
16 changed files with 4294 additions and 61 deletions
@ -0,0 +1,178 @@ |
||||
#pragma once |
||||
#include <opencv2/core.hpp> |
||||
|
||||
namespace cv |
||||
{ |
||||
namespace dnn |
||||
{ |
||||
|
||||
struct DictValue |
||||
{ |
||||
int type; |
||||
|
||||
union
|
||||
{ |
||||
int i; |
||||
unsigned u; |
||||
double d; |
||||
bool b; |
||||
String *s; |
||||
}; |
||||
|
||||
DictValue(const DictValue &r); |
||||
DictValue(int p = 0) : type(cv::Param::INT), i(p) {} |
||||
DictValue(unsigned p) : type(cv::Param::UNSIGNED_INT), u(p) {} |
||||
DictValue(double p) : type(cv::Param::REAL), d(p) {} |
||||
DictValue(bool p) : type(cv::Param::BOOLEAN), b(p) {} |
||||
DictValue(const String &p) : type(cv::Param::STRING), s(new String(p)) {} |
||||
|
||||
template<typename T> |
||||
T get() const; |
||||
|
||||
template<typename T> |
||||
const T &get() const; |
||||
|
||||
DictValue &operator=(const DictValue &r); |
||||
|
||||
~DictValue(); |
||||
|
||||
private: |
||||
void release(); |
||||
}; |
||||
|
||||
class Dict |
||||
{ |
||||
//TODO: maybe this mechanism was realized somewhere in OpenCV?
|
||||
typedef std::map<String, DictValue> _Dict; |
||||
_Dict dict; |
||||
|
||||
public: |
||||
|
||||
template <typename T> |
||||
const T &get(const String &name) const |
||||
{ |
||||
_Dict::const_iterator i = dict.find(name); |
||||
CV_Assert(i != dict.end()); |
||||
return i->second.get<T>(); |
||||
} |
||||
|
||||
template <typename T> |
||||
const T &get(const String &name, const T &default) const |
||||
{ |
||||
_Dict::const_iterator i = dict.find(name); |
||||
|
||||
if (i != dict.end()) |
||||
return i->second.get<T>(); |
||||
else |
||||
return default; |
||||
} |
||||
|
||||
template<typename T> |
||||
const T &set(const String &name, const T &value) |
||||
{ |
||||
_Dict::iterator i = dict.find(name); |
||||
|
||||
if (i != dict.end()) |
||||
i->second = DictValue(value); |
||||
else |
||||
dict.insert(std::make_pair(name, DictValue(value))); |
||||
|
||||
return value; |
||||
} |
||||
}; |
||||
|
||||
|
||||
template<> |
||||
inline int DictValue::get<int>() const |
||||
{ |
||||
CV_Assert(type == cv::ParamType<int>::type || type == cv::ParamType<unsigned>::type && (int)u >= 0); |
||||
return i; |
||||
} |
||||
|
||||
template<> |
||||
inline unsigned DictValue::get<unsigned>() const |
||||
{ |
||||
CV_Assert(type == cv::ParamType<unsigned>::type || type == cv::ParamType<int>::type && i >= 0); |
||||
return u; |
||||
} |
||||
|
||||
template<> |
||||
inline double DictValue::get<double>() const |
||||
{ |
||||
CV_Assert(type == cv::ParamType<double>::type); |
||||
return d; |
||||
} |
||||
|
||||
template<> |
||||
inline float DictValue::get<float>() const |
||||
{ |
||||
CV_Assert(type == cv::ParamType<double>::type); |
||||
return (float)d; |
||||
} |
||||
|
||||
template<> |
||||
inline bool DictValue::get<bool>() const |
||||
{ |
||||
if (type == cv::ParamType<bool>::type) |
||||
{ |
||||
return b; |
||||
} |
||||
else if (type == cv::ParamType<int>::type || type == cv::ParamType<unsigned>::type) |
||||
{ |
||||
return i; |
||||
} |
||||
else |
||||
{ |
||||
CV_Assert(type == cv::ParamType<bool>::type || type == cv::ParamType<int>::type || type == cv::ParamType<unsigned>::type); |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
template<> |
||||
inline const String &DictValue::get<String>() const |
||||
{ |
||||
CV_Assert(type == cv::ParamType<String>::type); |
||||
return *s; |
||||
} |
||||
|
||||
inline void DictValue::release() |
||||
{ |
||||
if (type == cv::Param::STRING && s != NULL) |
||||
{ |
||||
delete s; |
||||
s = NULL; |
||||
} |
||||
|
||||
} |
||||
|
||||
inline DictValue::~DictValue() |
||||
{ |
||||
release(); |
||||
} |
||||
|
||||
inline DictValue & DictValue::operator=(const DictValue &r) |
||||
{ |
||||
if (&r == this) |
||||
return *this; |
||||
|
||||
release(); |
||||
|
||||
//how to copy anonymous union without memcpy?
|
||||
for (size_t i = 0; i < sizeof(*this); i++) |
||||
((uchar*)this)[i] = ((uchar*)&r)[i]; |
||||
|
||||
if (r.type == cv::Param::STRING) |
||||
{ |
||||
s = new String(*r.s); |
||||
} |
||||
|
||||
return *this; |
||||
} |
||||
|
||||
inline DictValue::DictValue(const DictValue &r) |
||||
{ |
||||
*this = r; |
||||
} |
||||
|
||||
} |
||||
} |
@ -0,0 +1,177 @@ |
||||
#ifndef CAFFE_COMMON_HPP_ |
||||
#define CAFFE_COMMON_HPP_ |
||||
|
||||
#include <opencv2/core.hpp> |
||||
#include <iostream> |
||||
#define CHECK CV_Assert |
||||
#define LOG(WHERE) std::cerr |
||||
|
||||
//#include <boost/shared_ptr.hpp>
|
||||
//#include <gflags/gflags.h>
|
||||
//#include <glog/logging.h>
|
||||
|
||||
#include <climits> |
||||
#include <cmath> |
||||
#include <fstream> // NOLINT(readability/streams) |
||||
#include <iostream> // NOLINT(readability/streams) |
||||
#include <map> |
||||
#include <set> |
||||
#include <sstream> |
||||
#include <string> |
||||
#include <utility> // pair |
||||
#include <vector> |
||||
|
||||
//#include "caffe/util/device_alternate.hpp"
|
||||
//
|
||||
//// gflags 2.1 issue: namespace google was changed to gflags without warning.
|
||||
//// Luckily we will be able to use GFLAGS_GFLAGS_H_ to detect if it is version
|
||||
//// 2.1. If yes, we will add a temporary solution to redirect the namespace.
|
||||
//// TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's
|
||||
//// remove the following hack.
|
||||
//#ifndef GFLAGS_GFLAGS_H_
|
||||
//namespace gflags = google;
|
||||
//#endif // GFLAGS_GFLAGS_H_
|
||||
//
|
||||
//// Disable the copy and assignment operator for a class.
|
||||
//#define DISABLE_COPY_AND_ASSIGN(classname) \
|
||||
//private:\
|
||||
// classname(const classname&);\
|
||||
// classname& operator=(const classname&)
|
||||
//
|
||||
//// Instantiate a class with float and double specifications.
|
||||
//#define INSTANTIATE_CLASS(classname) \
|
||||
// char gInstantiationGuard##classname; \
|
||||
// template class classname<float>; \
|
||||
// template class classname<double>
|
||||
//
|
||||
//#define INSTANTIATE_LAYER_GPU_FORWARD(classname) \
|
||||
// template void classname<float>::Forward_gpu( \
|
||||
// const std::vector<Blob<float>*>& bottom, \
|
||||
// const std::vector<Blob<float>*>& top); \
|
||||
// template void classname<double>::Forward_gpu( \
|
||||
// const std::vector<Blob<double>*>& bottom, \
|
||||
// const std::vector<Blob<double>*>& top);
|
||||
//
|
||||
//#define INSTANTIATE_LAYER_GPU_BACKWARD(classname) \
|
||||
// template void classname<float>::Backward_gpu( \
|
||||
// const std::vector<Blob<float>*>& top, \
|
||||
// const std::vector<bool>& propagate_down, \
|
||||
// const std::vector<Blob<float>*>& bottom); \
|
||||
// template void classname<double>::Backward_gpu( \
|
||||
// const std::vector<Blob<double>*>& top, \
|
||||
// const std::vector<bool>& propagate_down, \
|
||||
// const std::vector<Blob<double>*>& bottom)
|
||||
//
|
||||
//#define INSTANTIATE_LAYER_GPU_FUNCS(classname) \
|
||||
// INSTANTIATE_LAYER_GPU_FORWARD(classname); \
|
||||
// INSTANTIATE_LAYER_GPU_BACKWARD(classname)
|
||||
//
|
||||
//// A simple macro to mark codes that are not implemented, so that when the code
|
||||
//// is executed we will see a fatal log.
|
||||
//#define NOT_IMPLEMENTED LOG(FATAL) << "Not Implemented Yet"
|
||||
//
|
||||
//// See PR #1236
|
||||
//namespace cv { class Mat; }
|
||||
//
|
||||
//namespace caffe {
|
||||
//
|
||||
//// We will use the boost shared_ptr instead of the new C++11 one mainly
|
||||
//// because cuda does not work (at least now) well with C++11 features.
|
||||
//using boost::shared_ptr;
|
||||
|
||||
// Common functions and classes from std that caffe often uses.
|
||||
using std::fstream; |
||||
using std::ios; |
||||
using std::isnan; |
||||
using std::isinf; |
||||
using std::iterator; |
||||
using std::make_pair; |
||||
using std::map; |
||||
using std::ostringstream; |
||||
using std::pair; |
||||
using std::set; |
||||
using std::string; |
||||
using std::stringstream; |
||||
using std::vector; |
||||
|
||||
//// A global initialization function that you should call in your main function.
|
||||
//// Currently it initializes google flags and google logging.
|
||||
//void GlobalInit(int* pargc, char*** pargv);
|
||||
//
|
||||
//// A singleton class to hold common caffe stuff, such as the handler that
|
||||
//// caffe is going to use for cublas, curand, etc.
|
||||
//class Caffe {
|
||||
// public:
|
||||
// ~Caffe();
|
||||
// inline static Caffe& Get() {
|
||||
// if (!singleton_.get()) {
|
||||
// singleton_.reset(new Caffe());
|
||||
// }
|
||||
// return *singleton_;
|
||||
// }
|
||||
// enum Brew { CPU, GPU };
|
||||
//
|
||||
// // This random number generator facade hides boost and CUDA rng
|
||||
// // implementation from one another (for cross-platform compatibility).
|
||||
// class RNG {
|
||||
// public:
|
||||
// RNG();
|
||||
// explicit RNG(unsigned int seed);
|
||||
// explicit RNG(const RNG&);
|
||||
// RNG& operator=(const RNG&);
|
||||
// void* generator();
|
||||
// private:
|
||||
// class Generator;
|
||||
// shared_ptr<Generator> generator_;
|
||||
// };
|
||||
//
|
||||
// // Getters for boost rng, curand, and cublas handles
|
||||
// inline static RNG& rng_stream() {
|
||||
// if (!Get().random_generator_) {
|
||||
// Get().random_generator_.reset(new RNG());
|
||||
// }
|
||||
// return *(Get().random_generator_);
|
||||
// }
|
||||
//#ifndef CPU_ONLY
|
||||
// inline static cublasHandle_t cublas_handle() { return Get().cublas_handle_; }
|
||||
// inline static curandGenerator_t curand_generator() {
|
||||
// return Get().curand_generator_;
|
||||
// }
|
||||
//#endif
|
||||
//
|
||||
// // Returns the mode: running on CPU or GPU.
|
||||
// inline static Brew mode() { return Get().mode_; }
|
||||
// // The setters for the variables
|
||||
// // Sets the mode. It is recommended that you don't change the mode halfway
|
||||
// // into the program since that may cause allocation of pinned memory being
|
||||
// // freed in a non-pinned way, which may cause problems - I haven't verified
|
||||
// // it personally but better to note it here in the header file.
|
||||
// inline static void set_mode(Brew mode) { Get().mode_ = mode; }
|
||||
// // Sets the random seed of both boost and curand
|
||||
// static void set_random_seed(const unsigned int seed);
|
||||
// // Sets the device. Since we have cublas and curand stuff, set device also
|
||||
// // requires us to reset those values.
|
||||
// static void SetDevice(const int device_id);
|
||||
// // Prints the current GPU status.
|
||||
// static void DeviceQuery();
|
||||
//
|
||||
// protected:
|
||||
//#ifndef CPU_ONLY
|
||||
// cublasHandle_t cublas_handle_;
|
||||
// curandGenerator_t curand_generator_;
|
||||
//#endif
|
||||
// shared_ptr<RNG> random_generator_;
|
||||
//
|
||||
// Brew mode_;
|
||||
// static shared_ptr<Caffe> singleton_;
|
||||
//
|
||||
// private:
|
||||
// // The private constructor to avoid duplicate instantiation.
|
||||
// Caffe();
|
||||
//
|
||||
// DISABLE_COPY_AND_ASSIGN(Caffe);
|
||||
//};
|
||||
//
|
||||
//} // namespace caffe
|
||||
//
|
||||
#endif // CAFFE_COMMON_HPP_
|
@ -0,0 +1,232 @@ |
||||
//#include <fcntl.h>
|
||||
#include <google/protobuf/io/coded_stream.h> |
||||
#include <google/protobuf/io/zero_copy_stream_impl.h> |
||||
#include <google/protobuf/text_format.h> |
||||
#include <opencv2/core.hpp> |
||||
//#include <opencv2/highgui/highgui.hpp>
|
||||
//#include <opencv2/highgui/highgui_c.h>
|
||||
//#include <opencv2/imgproc/imgproc.hpp>
|
||||
//#include <stdint.h>
|
||||
//
|
||||
//#include <algorithm>
|
||||
#include <fstream> // NOLINT(readability/streams) |
||||
//#include <string>
|
||||
//#include <vector>
|
||||
//
|
||||
//#include "caffe/common.hpp"
|
||||
//#include "caffe.pb.h"
|
||||
//#include "caffe/util/io.hpp"
|
||||
//
|
||||
const int kProtoReadBytesLimit = INT_MAX; // Max size of 2 GB minus 1 byte.
|
||||
|
||||
namespace caffe { |
||||
|
||||
using google::protobuf::io::FileInputStream; |
||||
using google::protobuf::io::FileOutputStream; |
||||
using google::protobuf::io::ZeroCopyInputStream; |
||||
using google::protobuf::io::CodedInputStream; |
||||
using google::protobuf::io::ZeroCopyOutputStream; |
||||
using google::protobuf::io::CodedOutputStream; |
||||
using google::protobuf::io::IstreamInputStream; |
||||
using google::protobuf::Message; |
||||
|
||||
bool ReadProtoFromTextFile(const char* filename, Message* proto) { |
||||
std::ifstream fs(filename, std::ifstream::in); |
||||
CV_Assert(fs.is_open()); |
||||
IstreamInputStream input(&fs); |
||||
bool success = google::protobuf::TextFormat::Parse(&input, proto); |
||||
fs.close(); |
||||
return success; |
||||
} |
||||
|
||||
//
|
||||
//void WriteProtoToTextFile(const Message& proto, const char* filename) {
|
||||
// int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
||||
// FileOutputStream* output = new FileOutputStream(fd);
|
||||
// CHECK(google::protobuf::TextFormat::Print(proto, output));
|
||||
// delete output;
|
||||
// close(fd);
|
||||
//}
|
||||
//
|
||||
bool ReadProtoFromBinaryFile(const char* filename, Message* proto) { |
||||
std::ifstream fs(filename, std::ifstream::in | std::ifstream::binary); |
||||
CV_Assert(fs.is_open()); |
||||
ZeroCopyInputStream* raw_input = new IstreamInputStream(&fs); |
||||
CodedInputStream* coded_input = new CodedInputStream(raw_input); |
||||
coded_input->SetTotalBytesLimit(kProtoReadBytesLimit, 536870912); |
||||
|
||||
bool success = proto->ParseFromCodedStream(coded_input); |
||||
|
||||
delete coded_input; |
||||
delete raw_input; |
||||
fs.close(); |
||||
return success; |
||||
} |
||||
//
|
||||
//void WriteProtoToBinaryFile(const Message& proto, const char* filename) {
|
||||
// fstream output(filename, ios::out | ios::trunc | ios::binary);
|
||||
// CHECK(proto.SerializeToOstream(&output));
|
||||
//}
|
||||
//
|
||||
//cv::Mat ReadImageToCVMat(const string& filename,
|
||||
// const int height, const int width, const bool is_color) {
|
||||
// cv::Mat cv_img;
|
||||
// int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
|
||||
// CV_LOAD_IMAGE_GRAYSCALE);
|
||||
// cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag);
|
||||
// if (!cv_img_origin.data) {
|
||||
// LOG(ERROR) << "Could not open or find file " << filename;
|
||||
// return cv_img_origin;
|
||||
// }
|
||||
// if (height > 0 && width > 0) {
|
||||
// cv::resize(cv_img_origin, cv_img, cv::Size(width, height));
|
||||
// } else {
|
||||
// cv_img = cv_img_origin;
|
||||
// }
|
||||
// return cv_img;
|
||||
//}
|
||||
//
|
||||
//cv::Mat ReadImageToCVMat(const string& filename,
|
||||
// const int height, const int width) {
|
||||
// return ReadImageToCVMat(filename, height, width, true);
|
||||
//}
|
||||
//
|
||||
//cv::Mat ReadImageToCVMat(const string& filename,
|
||||
// const bool is_color) {
|
||||
// return ReadImageToCVMat(filename, 0, 0, is_color);
|
||||
//}
|
||||
//
|
||||
//cv::Mat ReadImageToCVMat(const string& filename) {
|
||||
// return ReadImageToCVMat(filename, 0, 0, true);
|
||||
//}
|
||||
//// Do the file extension and encoding match?
|
||||
//static bool matchExt(const std::string & fn,
|
||||
// std::string en) {
|
||||
// size_t p = fn.rfind('.');
|
||||
// std::string ext = p != fn.npos ? fn.substr(p) : fn;
|
||||
// std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
|
||||
// std::transform(en.begin(), en.end(), en.begin(), ::tolower);
|
||||
// if ( ext == en )
|
||||
// return true;
|
||||
// if ( en == "jpg" && ext == "jpeg" )
|
||||
// return true;
|
||||
// return false;
|
||||
//}
|
||||
//bool ReadImageToDatum(const string& filename, const int label,
|
||||
// const int height, const int width, const bool is_color,
|
||||
// const std::string & encoding, Datum* datum) {
|
||||
// cv::Mat cv_img = ReadImageToCVMat(filename, height, width, is_color);
|
||||
// if (cv_img.data) {
|
||||
// if (encoding.size()) {
|
||||
// if ( (cv_img.channels() == 3) == is_color && !height && !width &&
|
||||
// matchExt(filename, encoding) )
|
||||
// return ReadFileToDatum(filename, label, datum);
|
||||
// std::vector<uchar> buf;
|
||||
// cv::imencode("."+encoding, cv_img, buf);
|
||||
// datum->set_data(std::string(reinterpret_cast<char*>(&buf[0]),
|
||||
// buf.size()));
|
||||
// datum->set_label(label);
|
||||
// datum->set_encoded(true);
|
||||
// return true;
|
||||
// }
|
||||
// CVMatToDatum(cv_img, datum);
|
||||
// datum->set_label(label);
|
||||
// return true;
|
||||
// } else {
|
||||
// return false;
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//bool ReadFileToDatum(const string& filename, const int label,
|
||||
// Datum* datum) {
|
||||
// std::streampos size;
|
||||
//
|
||||
// fstream file(filename.c_str(), ios::in|ios::binary|ios::ate);
|
||||
// if (file.is_open()) {
|
||||
// size = file.tellg();
|
||||
// std::string buffer(size, ' ');
|
||||
// file.seekg(0, ios::beg);
|
||||
// file.read(&buffer[0], size);
|
||||
// file.close();
|
||||
// datum->set_data(buffer);
|
||||
// datum->set_label(label);
|
||||
// datum->set_encoded(true);
|
||||
// return true;
|
||||
// } else {
|
||||
// return false;
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//cv::Mat DecodeDatumToCVMatNative(const Datum& datum) {
|
||||
// cv::Mat cv_img;
|
||||
// CHECK(datum.encoded()) << "Datum not encoded";
|
||||
// const string& data = datum.data();
|
||||
// std::vector<char> vec_data(data.c_str(), data.c_str() + data.size());
|
||||
// cv_img = cv::imdecode(vec_data, -1);
|
||||
// if (!cv_img.data) {
|
||||
// LOG(ERROR) << "Could not decode datum ";
|
||||
// }
|
||||
// return cv_img;
|
||||
//}
|
||||
//cv::Mat DecodeDatumToCVMat(const Datum& datum, bool is_color) {
|
||||
// cv::Mat cv_img;
|
||||
// CHECK(datum.encoded()) << "Datum not encoded";
|
||||
// const string& data = datum.data();
|
||||
// std::vector<char> vec_data(data.c_str(), data.c_str() + data.size());
|
||||
// int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
|
||||
// CV_LOAD_IMAGE_GRAYSCALE);
|
||||
// cv_img = cv::imdecode(vec_data, cv_read_flag);
|
||||
// if (!cv_img.data) {
|
||||
// LOG(ERROR) << "Could not decode datum ";
|
||||
// }
|
||||
// return cv_img;
|
||||
//}
|
||||
//
|
||||
//// If Datum is encoded will decoded using DecodeDatumToCVMat and CVMatToDatum
|
||||
//// If Datum is not encoded will do nothing
|
||||
//bool DecodeDatumNative(Datum* datum) {
|
||||
// if (datum->encoded()) {
|
||||
// cv::Mat cv_img = DecodeDatumToCVMatNative((*datum));
|
||||
// CVMatToDatum(cv_img, datum);
|
||||
// return true;
|
||||
// } else {
|
||||
// return false;
|
||||
// }
|
||||
//}
|
||||
//bool DecodeDatum(Datum* datum, bool is_color) {
|
||||
// if (datum->encoded()) {
|
||||
// cv::Mat cv_img = DecodeDatumToCVMat((*datum), is_color);
|
||||
// CVMatToDatum(cv_img, datum);
|
||||
// return true;
|
||||
// } else {
|
||||
// return false;
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) {
|
||||
// CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte";
|
||||
// datum->set_channels(cv_img.channels());
|
||||
// datum->set_height(cv_img.rows);
|
||||
// datum->set_width(cv_img.cols);
|
||||
// datum->clear_data();
|
||||
// datum->clear_float_data();
|
||||
// datum->set_encoded(false);
|
||||
// int datum_channels = datum->channels();
|
||||
// int datum_height = datum->height();
|
||||
// int datum_width = datum->width();
|
||||
// int datum_size = datum_channels * datum_height * datum_width;
|
||||
// std::string buffer(datum_size, ' ');
|
||||
// for (int h = 0; h < datum_height; ++h) {
|
||||
// const uchar* ptr = cv_img.ptr<uchar>(h);
|
||||
// int img_index = 0;
|
||||
// for (int w = 0; w < datum_width; ++w) {
|
||||
// for (int c = 0; c < datum_channels; ++c) {
|
||||
// int datum_index = (c * datum_height + h) * datum_width + w;
|
||||
// buffer[datum_index] = static_cast<char>(ptr[img_index++]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// datum->set_data(buffer);
|
||||
//}
|
||||
|
||||
} // namespace caffe
|
@ -0,0 +1,940 @@ |
||||
#include <google/protobuf/io/coded_stream.h> |
||||
#include <google/protobuf/io/zero_copy_stream_impl.h> |
||||
#include <google/protobuf/text_format.h> |
||||
|
||||
#include <map> |
||||
#include <string> |
||||
|
||||
#include "caffe/common.hpp" |
||||
#include "caffe.pb.h" |
||||
#include "caffe/util/io.hpp" |
||||
#include "caffe/util/upgrade_proto.hpp" |
||||
|
||||
namespace caffe { |
||||
|
||||
bool NetNeedsUpgrade(const NetParameter& net_param) { |
||||
return NetNeedsV0ToV1Upgrade(net_param) || NetNeedsV1ToV2Upgrade(net_param); |
||||
} |
||||
|
||||
bool NetNeedsV0ToV1Upgrade(const NetParameter& net_param) { |
||||
for (int i = 0; i < net_param.layers_size(); ++i) { |
||||
if (net_param.layers(i).has_layer()) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
bool NetNeedsV1ToV2Upgrade(const NetParameter& net_param) { |
||||
return net_param.layers_size() > 0; |
||||
} |
||||
|
||||
bool UpgradeV0Net(const NetParameter& v0_net_param_padding_layers, |
||||
NetParameter* net_param) { |
||||
// First upgrade padding layers to padded conv layers.
|
||||
NetParameter v0_net_param; |
||||
UpgradeV0PaddingLayers(v0_net_param_padding_layers, &v0_net_param); |
||||
// Now upgrade layer parameters.
|
||||
bool is_fully_compatible = true; |
||||
net_param->Clear(); |
||||
if (v0_net_param.has_name()) { |
||||
net_param->set_name(v0_net_param.name()); |
||||
} |
||||
for (int i = 0; i < v0_net_param.layers_size(); ++i) { |
||||
is_fully_compatible &= UpgradeV0LayerParameter(v0_net_param.layers(i), |
||||
net_param->add_layers()); |
||||
} |
||||
for (int i = 0; i < v0_net_param.input_size(); ++i) { |
||||
net_param->add_input(v0_net_param.input(i)); |
||||
} |
||||
for (int i = 0; i < v0_net_param.input_dim_size(); ++i) { |
||||
net_param->add_input_dim(v0_net_param.input_dim(i)); |
||||
} |
||||
if (v0_net_param.has_force_backward()) { |
||||
net_param->set_force_backward(v0_net_param.force_backward()); |
||||
} |
||||
return is_fully_compatible; |
||||
} |
||||
|
||||
void UpgradeV0PaddingLayers(const NetParameter& param, |
||||
NetParameter* param_upgraded_pad) { |
||||
// Copy everything other than the layers from the original param.
|
||||
param_upgraded_pad->Clear(); |
||||
param_upgraded_pad->CopyFrom(param); |
||||
param_upgraded_pad->clear_layers(); |
||||
// Figure out which layer each bottom blob comes from.
|
||||
map<string, int> blob_name_to_last_top_idx; |
||||
for (int i = 0; i < param.input_size(); ++i) { |
||||
const string& blob_name = param.input(i); |
||||
blob_name_to_last_top_idx[blob_name] = -1; |
||||
} |
||||
for (int i = 0; i < param.layers_size(); ++i) { |
||||
const V1LayerParameter& layer_connection = param.layers(i); |
||||
const V0LayerParameter& layer_param = layer_connection.layer(); |
||||
// Add the layer to the new net, unless it's a padding layer.
|
||||
if (layer_param.type() != "padding") { |
||||
param_upgraded_pad->add_layers()->CopyFrom(layer_connection); |
||||
} |
||||
for (int j = 0; j < layer_connection.bottom_size(); ++j) { |
||||
const string& blob_name = layer_connection.bottom(j); |
||||
if (blob_name_to_last_top_idx.find(blob_name) == |
||||
blob_name_to_last_top_idx.end()) { |
||||
LOG(FATAL) << "Unknown blob input " << blob_name << " to layer " << j; |
||||
} |
||||
const int top_idx = blob_name_to_last_top_idx[blob_name]; |
||||
if (top_idx == -1) { |
||||
continue; |
||||
} |
||||
const V1LayerParameter& source_layer = param.layers(top_idx); |
||||
if (source_layer.layer().type() == "padding") { |
||||
// This layer has a padding layer as input -- check that it is a conv
|
||||
// layer or a pooling layer and takes only one input. Also check that
|
||||
// the padding layer input has only one input and one output. Other
|
||||
// cases have undefined behavior in Caffe.
|
||||
CHECK((layer_param.type() == "conv") || (layer_param.type() == "pool")) |
||||
<< "Padding layer input to " |
||||
"non-convolutional / non-pooling layer type " |
||||
<< layer_param.type(); |
||||
CHECK_EQ(layer_connection.bottom_size(), 1) |
||||
<< "Conv Layer takes a single blob as input."; |
||||
CHECK_EQ(source_layer.bottom_size(), 1) |
||||
<< "Padding Layer takes a single blob as input."; |
||||
CHECK_EQ(source_layer.top_size(), 1) |
||||
<< "Padding Layer produces a single blob as output."; |
||||
int layer_index = param_upgraded_pad->layers_size() - 1; |
||||
param_upgraded_pad->mutable_layers(layer_index)->mutable_layer() |
||||
->set_pad(source_layer.layer().pad()); |
||||
param_upgraded_pad->mutable_layers(layer_index) |
||||
->set_bottom(j, source_layer.bottom(0)); |
||||
} |
||||
} |
||||
for (int j = 0; j < layer_connection.top_size(); ++j) { |
||||
const string& blob_name = layer_connection.top(j); |
||||
blob_name_to_last_top_idx[blob_name] = i; |
||||
} |
||||
} |
||||
} |
||||
|
||||
bool UpgradeV0LayerParameter(const V1LayerParameter& v0_layer_connection, |
||||
V1LayerParameter* layer_param) { |
||||
bool is_fully_compatible = true; |
||||
layer_param->Clear(); |
||||
for (int i = 0; i < v0_layer_connection.bottom_size(); ++i) { |
||||
layer_param->add_bottom(v0_layer_connection.bottom(i)); |
||||
} |
||||
for (int i = 0; i < v0_layer_connection.top_size(); ++i) { |
||||
layer_param->add_top(v0_layer_connection.top(i)); |
||||
} |
||||
if (v0_layer_connection.has_layer()) { |
||||
const V0LayerParameter& v0_layer_param = v0_layer_connection.layer(); |
||||
if (v0_layer_param.has_name()) { |
||||
layer_param->set_name(v0_layer_param.name()); |
||||
} |
||||
const string& type = v0_layer_param.type(); |
||||
if (v0_layer_param.has_type()) { |
||||
layer_param->set_type(UpgradeV0LayerType(type)); |
||||
} |
||||
for (int i = 0; i < v0_layer_param.blobs_size(); ++i) { |
||||
layer_param->add_blobs()->CopyFrom(v0_layer_param.blobs(i)); |
||||
} |
||||
for (int i = 0; i < v0_layer_param.blobs_lr_size(); ++i) { |
||||
layer_param->add_blobs_lr(v0_layer_param.blobs_lr(i)); |
||||
} |
||||
for (int i = 0; i < v0_layer_param.weight_decay_size(); ++i) { |
||||
layer_param->add_weight_decay(v0_layer_param.weight_decay(i)); |
||||
} |
||||
if (v0_layer_param.has_num_output()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()->set_num_output( |
||||
v0_layer_param.num_output()); |
||||
} else if (type == "innerproduct") { |
||||
layer_param->mutable_inner_product_param()->set_num_output( |
||||
v0_layer_param.num_output()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter num_output for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_biasterm()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()->set_bias_term( |
||||
v0_layer_param.biasterm()); |
||||
} else if (type == "innerproduct") { |
||||
layer_param->mutable_inner_product_param()->set_bias_term( |
||||
v0_layer_param.biasterm()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter biasterm for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_weight_filler()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()-> |
||||
mutable_weight_filler()->CopyFrom(v0_layer_param.weight_filler()); |
||||
} else if (type == "innerproduct") { |
||||
layer_param->mutable_inner_product_param()-> |
||||
mutable_weight_filler()->CopyFrom(v0_layer_param.weight_filler()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter weight_filler for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_bias_filler()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()-> |
||||
mutable_bias_filler()->CopyFrom(v0_layer_param.bias_filler()); |
||||
} else if (type == "innerproduct") { |
||||
layer_param->mutable_inner_product_param()-> |
||||
mutable_bias_filler()->CopyFrom(v0_layer_param.bias_filler()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter bias_filler for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_pad()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()->set_pad(v0_layer_param.pad()); |
||||
} else if (type == "pool") { |
||||
layer_param->mutable_pooling_param()->set_pad(v0_layer_param.pad()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter pad for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_kernelsize()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()->set_kernel_size( |
||||
v0_layer_param.kernelsize()); |
||||
} else if (type == "pool") { |
||||
layer_param->mutable_pooling_param()->set_kernel_size( |
||||
v0_layer_param.kernelsize()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter kernelsize for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_group()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()->set_group( |
||||
v0_layer_param.group()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter group for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_stride()) { |
||||
if (type == "conv") { |
||||
layer_param->mutable_convolution_param()->set_stride( |
||||
v0_layer_param.stride()); |
||||
} else if (type == "pool") { |
||||
layer_param->mutable_pooling_param()->set_stride( |
||||
v0_layer_param.stride()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter stride for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_pool()) { |
||||
if (type == "pool") { |
||||
V0LayerParameter_PoolMethod pool = v0_layer_param.pool(); |
||||
switch (pool) { |
||||
case V0LayerParameter_PoolMethod_MAX: |
||||
layer_param->mutable_pooling_param()->set_pool( |
||||
PoolingParameter_PoolMethod_MAX); |
||||
break; |
||||
case V0LayerParameter_PoolMethod_AVE: |
||||
layer_param->mutable_pooling_param()->set_pool( |
||||
PoolingParameter_PoolMethod_AVE); |
||||
break; |
||||
case V0LayerParameter_PoolMethod_STOCHASTIC: |
||||
layer_param->mutable_pooling_param()->set_pool( |
||||
PoolingParameter_PoolMethod_STOCHASTIC); |
||||
break; |
||||
default: |
||||
LOG(ERROR) << "Unknown pool method " << pool; |
||||
is_fully_compatible = false; |
||||
} |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter pool for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_dropout_ratio()) { |
||||
if (type == "dropout") { |
||||
layer_param->mutable_dropout_param()->set_dropout_ratio( |
||||
v0_layer_param.dropout_ratio()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter dropout_ratio for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_local_size()) { |
||||
if (type == "lrn") { |
||||
layer_param->mutable_lrn_param()->set_local_size( |
||||
v0_layer_param.local_size()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter local_size for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_alpha()) { |
||||
if (type == "lrn") { |
||||
layer_param->mutable_lrn_param()->set_alpha(v0_layer_param.alpha()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter alpha for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_beta()) { |
||||
if (type == "lrn") { |
||||
layer_param->mutable_lrn_param()->set_beta(v0_layer_param.beta()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter beta for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_k()) { |
||||
if (type == "lrn") { |
||||
layer_param->mutable_lrn_param()->set_k(v0_layer_param.k()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter k for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_source()) { |
||||
if (type == "data") { |
||||
layer_param->mutable_data_param()->set_source(v0_layer_param.source()); |
||||
} else if (type == "hdf5_data") { |
||||
layer_param->mutable_hdf5_data_param()->set_source( |
||||
v0_layer_param.source()); |
||||
} else if (type == "images") { |
||||
layer_param->mutable_image_data_param()->set_source( |
||||
v0_layer_param.source()); |
||||
} else if (type == "window_data") { |
||||
layer_param->mutable_window_data_param()->set_source( |
||||
v0_layer_param.source()); |
||||
} else if (type == "infogain_loss") { |
||||
layer_param->mutable_infogain_loss_param()->set_source( |
||||
v0_layer_param.source()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter source for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_scale()) { |
||||
layer_param->mutable_transform_param()-> |
||||
set_scale(v0_layer_param.scale()); |
||||
} |
||||
if (v0_layer_param.has_meanfile()) { |
||||
layer_param->mutable_transform_param()-> |
||||
set_mean_file(v0_layer_param.meanfile()); |
||||
} |
||||
if (v0_layer_param.has_batchsize()) { |
||||
if (type == "data") { |
||||
layer_param->mutable_data_param()->set_batch_size( |
||||
v0_layer_param.batchsize()); |
||||
} else if (type == "hdf5_data") { |
||||
layer_param->mutable_hdf5_data_param()->set_batch_size( |
||||
v0_layer_param.batchsize()); |
||||
} else if (type == "images") { |
||||
layer_param->mutable_image_data_param()->set_batch_size( |
||||
v0_layer_param.batchsize()); |
||||
} else if (type == "window_data") { |
||||
layer_param->mutable_window_data_param()->set_batch_size( |
||||
v0_layer_param.batchsize()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter batchsize for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_cropsize()) { |
||||
layer_param->mutable_transform_param()-> |
||||
set_crop_size(v0_layer_param.cropsize()); |
||||
} |
||||
if (v0_layer_param.has_mirror()) { |
||||
layer_param->mutable_transform_param()-> |
||||
set_mirror(v0_layer_param.mirror()); |
||||
} |
||||
if (v0_layer_param.has_rand_skip()) { |
||||
if (type == "data") { |
||||
layer_param->mutable_data_param()->set_rand_skip( |
||||
v0_layer_param.rand_skip()); |
||||
} else if (type == "images") { |
||||
layer_param->mutable_image_data_param()->set_rand_skip( |
||||
v0_layer_param.rand_skip()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter rand_skip for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_shuffle_images()) { |
||||
if (type == "images") { |
||||
layer_param->mutable_image_data_param()->set_shuffle( |
||||
v0_layer_param.shuffle_images()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter shuffle for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_new_height()) { |
||||
if (type == "images") { |
||||
layer_param->mutable_image_data_param()->set_new_height( |
||||
v0_layer_param.new_height()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter new_height for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_new_width()) { |
||||
if (type == "images") { |
||||
layer_param->mutable_image_data_param()->set_new_width( |
||||
v0_layer_param.new_width()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter new_width for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_concat_dim()) { |
||||
if (type == "concat") { |
||||
layer_param->mutable_concat_param()->set_concat_dim( |
||||
v0_layer_param.concat_dim()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter concat_dim for layer type " << type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_det_fg_threshold()) { |
||||
if (type == "window_data") { |
||||
layer_param->mutable_window_data_param()->set_fg_threshold( |
||||
v0_layer_param.det_fg_threshold()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter det_fg_threshold for layer type " |
||||
<< type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_det_bg_threshold()) { |
||||
if (type == "window_data") { |
||||
layer_param->mutable_window_data_param()->set_bg_threshold( |
||||
v0_layer_param.det_bg_threshold()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter det_bg_threshold for layer type " |
||||
<< type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_det_fg_fraction()) { |
||||
if (type == "window_data") { |
||||
layer_param->mutable_window_data_param()->set_fg_fraction( |
||||
v0_layer_param.det_fg_fraction()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter det_fg_fraction for layer type " |
||||
<< type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_det_context_pad()) { |
||||
if (type == "window_data") { |
||||
layer_param->mutable_window_data_param()->set_context_pad( |
||||
v0_layer_param.det_context_pad()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter det_context_pad for layer type " |
||||
<< type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_det_crop_mode()) { |
||||
if (type == "window_data") { |
||||
layer_param->mutable_window_data_param()->set_crop_mode( |
||||
v0_layer_param.det_crop_mode()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter det_crop_mode for layer type " |
||||
<< type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
if (v0_layer_param.has_hdf5_output_param()) { |
||||
if (type == "hdf5_output") { |
||||
layer_param->mutable_hdf5_output_param()->CopyFrom( |
||||
v0_layer_param.hdf5_output_param()); |
||||
} else { |
||||
LOG(ERROR) << "Unknown parameter hdf5_output_param for layer type " |
||||
<< type; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
} |
||||
return is_fully_compatible; |
||||
} |
||||
|
||||
V1LayerParameter_LayerType UpgradeV0LayerType(const string& type) { |
||||
if (type == "accuracy") { |
||||
return V1LayerParameter_LayerType_ACCURACY; |
||||
} else if (type == "bnll") { |
||||
return V1LayerParameter_LayerType_BNLL; |
||||
} else if (type == "concat") { |
||||
return V1LayerParameter_LayerType_CONCAT; |
||||
} else if (type == "conv") { |
||||
return V1LayerParameter_LayerType_CONVOLUTION; |
||||
} else if (type == "data") { |
||||
return V1LayerParameter_LayerType_DATA; |
||||
} else if (type == "dropout") { |
||||
return V1LayerParameter_LayerType_DROPOUT; |
||||
} else if (type == "euclidean_loss") { |
||||
return V1LayerParameter_LayerType_EUCLIDEAN_LOSS; |
||||
} else if (type == "flatten") { |
||||
return V1LayerParameter_LayerType_FLATTEN; |
||||
} else if (type == "hdf5_data") { |
||||
return V1LayerParameter_LayerType_HDF5_DATA; |
||||
} else if (type == "hdf5_output") { |
||||
return V1LayerParameter_LayerType_HDF5_OUTPUT; |
||||
} else if (type == "im2col") { |
||||
return V1LayerParameter_LayerType_IM2COL; |
||||
} else if (type == "images") { |
||||
return V1LayerParameter_LayerType_IMAGE_DATA; |
||||
} else if (type == "infogain_loss") { |
||||
return V1LayerParameter_LayerType_INFOGAIN_LOSS; |
||||
} else if (type == "innerproduct") { |
||||
return V1LayerParameter_LayerType_INNER_PRODUCT; |
||||
} else if (type == "lrn") { |
||||
return V1LayerParameter_LayerType_LRN; |
||||
} else if (type == "multinomial_logistic_loss") { |
||||
return V1LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; |
||||
} else if (type == "pool") { |
||||
return V1LayerParameter_LayerType_POOLING; |
||||
} else if (type == "relu") { |
||||
return V1LayerParameter_LayerType_RELU; |
||||
} else if (type == "sigmoid") { |
||||
return V1LayerParameter_LayerType_SIGMOID; |
||||
} else if (type == "softmax") { |
||||
return V1LayerParameter_LayerType_SOFTMAX; |
||||
} else if (type == "softmax_loss") { |
||||
return V1LayerParameter_LayerType_SOFTMAX_LOSS; |
||||
} else if (type == "split") { |
||||
return V1LayerParameter_LayerType_SPLIT; |
||||
} else if (type == "tanh") { |
||||
return V1LayerParameter_LayerType_TANH; |
||||
} else if (type == "window_data") { |
||||
return V1LayerParameter_LayerType_WINDOW_DATA; |
||||
} else { |
||||
LOG(FATAL) << "Unknown layer name: " << type; |
||||
return V1LayerParameter_LayerType_NONE; |
||||
} |
||||
} |
||||
|
||||
bool NetNeedsDataUpgrade(const NetParameter& net_param) { |
||||
for (int i = 0; i < net_param.layers_size(); ++i) { |
||||
if (net_param.layers(i).type() == V1LayerParameter_LayerType_DATA) { |
||||
DataParameter layer_param = net_param.layers(i).data_param(); |
||||
if (layer_param.has_scale()) { return true; } |
||||
if (layer_param.has_mean_file()) { return true; } |
||||
if (layer_param.has_crop_size()) { return true; } |
||||
if (layer_param.has_mirror()) { return true; } |
||||
} |
||||
if (net_param.layers(i).type() == V1LayerParameter_LayerType_IMAGE_DATA) { |
||||
ImageDataParameter layer_param = net_param.layers(i).image_data_param(); |
||||
if (layer_param.has_scale()) { return true; } |
||||
if (layer_param.has_mean_file()) { return true; } |
||||
if (layer_param.has_crop_size()) { return true; } |
||||
if (layer_param.has_mirror()) { return true; } |
||||
} |
||||
if (net_param.layers(i).type() == V1LayerParameter_LayerType_WINDOW_DATA) { |
||||
WindowDataParameter layer_param = net_param.layers(i).window_data_param(); |
||||
if (layer_param.has_scale()) { return true; } |
||||
if (layer_param.has_mean_file()) { return true; } |
||||
if (layer_param.has_crop_size()) { return true; } |
||||
if (layer_param.has_mirror()) { return true; } |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
#define CONVERT_LAYER_TRANSFORM_PARAM(TYPE, Name, param_name) \ |
||||
do { \
|
||||
if (net_param->layers(i).type() == V1LayerParameter_LayerType_##TYPE) { \
|
||||
Name##Parameter* layer_param = \
|
||||
net_param->mutable_layers(i)->mutable_##param_name##_param(); \
|
||||
TransformationParameter* transform_param = \
|
||||
net_param->mutable_layers(i)->mutable_transform_param(); \
|
||||
if (layer_param->has_scale()) { \
|
||||
transform_param->set_scale(layer_param->scale()); \
|
||||
layer_param->clear_scale(); \
|
||||
} \
|
||||
if (layer_param->has_mean_file()) { \
|
||||
transform_param->set_mean_file(layer_param->mean_file()); \
|
||||
layer_param->clear_mean_file(); \
|
||||
} \
|
||||
if (layer_param->has_crop_size()) { \
|
||||
transform_param->set_crop_size(layer_param->crop_size()); \
|
||||
layer_param->clear_crop_size(); \
|
||||
} \
|
||||
if (layer_param->has_mirror()) { \
|
||||
transform_param->set_mirror(layer_param->mirror()); \
|
||||
layer_param->clear_mirror(); \
|
||||
} \
|
||||
} \
|
||||
} while (0) |
||||
|
||||
void UpgradeNetDataTransformation(NetParameter* net_param) { |
||||
for (int i = 0; i < net_param->layers_size(); ++i) { |
||||
CONVERT_LAYER_TRANSFORM_PARAM(DATA, Data, data); |
||||
CONVERT_LAYER_TRANSFORM_PARAM(IMAGE_DATA, ImageData, image_data); |
||||
CONVERT_LAYER_TRANSFORM_PARAM(WINDOW_DATA, WindowData, window_data); |
||||
} |
||||
} |
||||
|
||||
bool UpgradeNetAsNeeded(const string& param_file, NetParameter* param) { |
||||
bool success = true; |
||||
if (NetNeedsV0ToV1Upgrade(*param)) { |
||||
// NetParameter was specified using the old style (V0LayerParameter); try to
|
||||
// upgrade it.
|
||||
LOG(ERROR) << "Attempting to upgrade input file specified using deprecated " |
||||
<< "V0LayerParameter: " << param_file; |
||||
NetParameter original_param(*param); |
||||
if (!UpgradeV0Net(original_param, param)) { |
||||
success = false; |
||||
LOG(ERROR) << "Warning: had one or more problems upgrading " |
||||
<< "V0NetParameter to NetParameter (see above); continuing anyway."; |
||||
} else { |
||||
LOG(INFO) << "Successfully upgraded file specified using deprecated " |
||||
<< "V0LayerParameter"; |
||||
} |
||||
LOG(ERROR) << "Note that future Caffe releases will not support " |
||||
<< "V0NetParameter; use ./build/tools/upgrade_net_proto_text for " |
||||
<< "prototxt and ./build/tools/upgrade_net_proto_binary for model " |
||||
<< "weights upgrade this and any other net protos to the new format."; |
||||
} |
||||
// NetParameter uses old style data transformation fields; try to upgrade it.
|
||||
if (NetNeedsDataUpgrade(*param)) { |
||||
LOG(ERROR) << "Attempting to upgrade input file specified using deprecated " |
||||
<< "transformation parameters: " << param_file; |
||||
UpgradeNetDataTransformation(param); |
||||
LOG(INFO) << "Successfully upgraded file specified using deprecated " |
||||
<< "data transformation parameters."; |
||||
LOG(ERROR) << "Note that future Caffe releases will only support " |
||||
<< "transform_param messages for transformation fields."; |
||||
} |
||||
if (NetNeedsV1ToV2Upgrade(*param)) { |
||||
LOG(ERROR) << "Attempting to upgrade input file specified using deprecated " |
||||
<< "V1LayerParameter: " << param_file; |
||||
NetParameter original_param(*param); |
||||
if (!UpgradeV1Net(original_param, param)) { |
||||
success = false; |
||||
LOG(ERROR) << "Warning: had one or more problems upgrading " |
||||
<< "V1LayerParameter (see above); continuing anyway."; |
||||
} else { |
||||
LOG(INFO) << "Successfully upgraded file specified using deprecated " |
||||
<< "V1LayerParameter"; |
||||
} |
||||
} |
||||
return success; |
||||
} |
||||
|
||||
bool UpgradeV1Net(const NetParameter& v1_net_param, NetParameter* net_param) { |
||||
bool is_fully_compatible = true; |
||||
if (v1_net_param.layer_size() > 0) { |
||||
LOG(ERROR) << "Input NetParameter to be upgraded already specifies 'layer' " |
||||
<< "fields; these will be ignored for the upgrade."; |
||||
is_fully_compatible = false; |
||||
} |
||||
net_param->CopyFrom(v1_net_param); |
||||
net_param->clear_layers(); |
||||
net_param->clear_layer(); |
||||
for (int i = 0; i < v1_net_param.layers_size(); ++i) { |
||||
if (!UpgradeV1LayerParameter(v1_net_param.layers(i), |
||||
net_param->add_layer())) { |
||||
LOG(ERROR) << "Upgrade of input layer " << i << " failed."; |
||||
is_fully_compatible = false; |
||||
} |
||||
} |
||||
return is_fully_compatible; |
||||
} |
||||
|
||||
bool UpgradeV1LayerParameter(const V1LayerParameter& v1_layer_param, |
||||
LayerParameter* layer_param) { |
||||
layer_param->Clear(); |
||||
bool is_fully_compatible = true; |
||||
for (int i = 0; i < v1_layer_param.bottom_size(); ++i) { |
||||
layer_param->add_bottom(v1_layer_param.bottom(i)); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.top_size(); ++i) { |
||||
layer_param->add_top(v1_layer_param.top(i)); |
||||
} |
||||
if (v1_layer_param.has_name()) { |
||||
layer_param->set_name(v1_layer_param.name()); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.include_size(); ++i) { |
||||
layer_param->add_include()->CopyFrom(v1_layer_param.include(i)); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.exclude_size(); ++i) { |
||||
layer_param->add_exclude()->CopyFrom(v1_layer_param.exclude(i)); |
||||
} |
||||
if (v1_layer_param.has_type()) { |
||||
layer_param->set_type(UpgradeV1LayerType(v1_layer_param.type())); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.blobs_size(); ++i) { |
||||
layer_param->add_blobs()->CopyFrom(v1_layer_param.blobs(i)); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.param_size(); ++i) { |
||||
while (layer_param->param_size() <= i) { layer_param->add_param(); } |
||||
layer_param->mutable_param(i)->set_name(v1_layer_param.param(i)); |
||||
} |
||||
ParamSpec_DimCheckMode mode; |
||||
for (int i = 0; i < v1_layer_param.blob_share_mode_size(); ++i) { |
||||
while (layer_param->param_size() <= i) { layer_param->add_param(); } |
||||
switch (v1_layer_param.blob_share_mode(i)) { |
||||
case V1LayerParameter_DimCheckMode_STRICT: |
||||
mode = ParamSpec_DimCheckMode_STRICT; |
||||
break; |
||||
case V1LayerParameter_DimCheckMode_PERMISSIVE: |
||||
mode = ParamSpec_DimCheckMode_PERMISSIVE; |
||||
break; |
||||
default: |
||||
LOG(FATAL) << "Unknown blob_share_mode: " |
||||
<< v1_layer_param.blob_share_mode(i); |
||||
break; |
||||
} |
||||
layer_param->mutable_param(i)->set_share_mode(mode); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.blobs_lr_size(); ++i) { |
||||
while (layer_param->param_size() <= i) { layer_param->add_param(); } |
||||
layer_param->mutable_param(i)->set_lr_mult(v1_layer_param.blobs_lr(i)); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.weight_decay_size(); ++i) { |
||||
while (layer_param->param_size() <= i) { layer_param->add_param(); } |
||||
layer_param->mutable_param(i)->set_decay_mult( |
||||
v1_layer_param.weight_decay(i)); |
||||
} |
||||
for (int i = 0; i < v1_layer_param.loss_weight_size(); ++i) { |
||||
layer_param->add_loss_weight(v1_layer_param.loss_weight(i)); |
||||
} |
||||
if (v1_layer_param.has_accuracy_param()) { |
||||
layer_param->mutable_accuracy_param()->CopyFrom( |
||||
v1_layer_param.accuracy_param()); |
||||
} |
||||
if (v1_layer_param.has_argmax_param()) { |
||||
layer_param->mutable_argmax_param()->CopyFrom( |
||||
v1_layer_param.argmax_param()); |
||||
} |
||||
if (v1_layer_param.has_concat_param()) { |
||||
layer_param->mutable_concat_param()->CopyFrom( |
||||
v1_layer_param.concat_param()); |
||||
} |
||||
if (v1_layer_param.has_contrastive_loss_param()) { |
||||
layer_param->mutable_contrastive_loss_param()->CopyFrom( |
||||
v1_layer_param.contrastive_loss_param()); |
||||
} |
||||
if (v1_layer_param.has_convolution_param()) { |
||||
layer_param->mutable_convolution_param()->CopyFrom( |
||||
v1_layer_param.convolution_param()); |
||||
} |
||||
if (v1_layer_param.has_data_param()) { |
||||
layer_param->mutable_data_param()->CopyFrom( |
||||
v1_layer_param.data_param()); |
||||
} |
||||
if (v1_layer_param.has_dropout_param()) { |
||||
layer_param->mutable_dropout_param()->CopyFrom( |
||||
v1_layer_param.dropout_param()); |
||||
} |
||||
if (v1_layer_param.has_dummy_data_param()) { |
||||
layer_param->mutable_dummy_data_param()->CopyFrom( |
||||
v1_layer_param.dummy_data_param()); |
||||
} |
||||
if (v1_layer_param.has_eltwise_param()) { |
||||
layer_param->mutable_eltwise_param()->CopyFrom( |
||||
v1_layer_param.eltwise_param()); |
||||
} |
||||
if (v1_layer_param.has_exp_param()) { |
||||
layer_param->mutable_exp_param()->CopyFrom( |
||||
v1_layer_param.exp_param()); |
||||
} |
||||
if (v1_layer_param.has_hdf5_data_param()) { |
||||
layer_param->mutable_hdf5_data_param()->CopyFrom( |
||||
v1_layer_param.hdf5_data_param()); |
||||
} |
||||
if (v1_layer_param.has_hdf5_output_param()) { |
||||
layer_param->mutable_hdf5_output_param()->CopyFrom( |
||||
v1_layer_param.hdf5_output_param()); |
||||
} |
||||
if (v1_layer_param.has_hinge_loss_param()) { |
||||
layer_param->mutable_hinge_loss_param()->CopyFrom( |
||||
v1_layer_param.hinge_loss_param()); |
||||
} |
||||
if (v1_layer_param.has_image_data_param()) { |
||||
layer_param->mutable_image_data_param()->CopyFrom( |
||||
v1_layer_param.image_data_param()); |
||||
} |
||||
if (v1_layer_param.has_infogain_loss_param()) { |
||||
layer_param->mutable_infogain_loss_param()->CopyFrom( |
||||
v1_layer_param.infogain_loss_param()); |
||||
} |
||||
if (v1_layer_param.has_inner_product_param()) { |
||||
layer_param->mutable_inner_product_param()->CopyFrom( |
||||
v1_layer_param.inner_product_param()); |
||||
} |
||||
if (v1_layer_param.has_lrn_param()) { |
||||
layer_param->mutable_lrn_param()->CopyFrom( |
||||
v1_layer_param.lrn_param()); |
||||
} |
||||
if (v1_layer_param.has_memory_data_param()) { |
||||
layer_param->mutable_memory_data_param()->CopyFrom( |
||||
v1_layer_param.memory_data_param()); |
||||
} |
||||
if (v1_layer_param.has_mvn_param()) { |
||||
layer_param->mutable_mvn_param()->CopyFrom( |
||||
v1_layer_param.mvn_param()); |
||||
} |
||||
if (v1_layer_param.has_pooling_param()) { |
||||
layer_param->mutable_pooling_param()->CopyFrom( |
||||
v1_layer_param.pooling_param()); |
||||
} |
||||
if (v1_layer_param.has_power_param()) { |
||||
layer_param->mutable_power_param()->CopyFrom( |
||||
v1_layer_param.power_param()); |
||||
} |
||||
if (v1_layer_param.has_relu_param()) { |
||||
layer_param->mutable_relu_param()->CopyFrom( |
||||
v1_layer_param.relu_param()); |
||||
} |
||||
if (v1_layer_param.has_sigmoid_param()) { |
||||
layer_param->mutable_sigmoid_param()->CopyFrom( |
||||
v1_layer_param.sigmoid_param()); |
||||
} |
||||
if (v1_layer_param.has_softmax_param()) { |
||||
layer_param->mutable_softmax_param()->CopyFrom( |
||||
v1_layer_param.softmax_param()); |
||||
} |
||||
if (v1_layer_param.has_slice_param()) { |
||||
layer_param->mutable_slice_param()->CopyFrom( |
||||
v1_layer_param.slice_param()); |
||||
} |
||||
if (v1_layer_param.has_tanh_param()) { |
||||
layer_param->mutable_tanh_param()->CopyFrom( |
||||
v1_layer_param.tanh_param()); |
||||
} |
||||
if (v1_layer_param.has_threshold_param()) { |
||||
layer_param->mutable_threshold_param()->CopyFrom( |
||||
v1_layer_param.threshold_param()); |
||||
} |
||||
if (v1_layer_param.has_window_data_param()) { |
||||
layer_param->mutable_window_data_param()->CopyFrom( |
||||
v1_layer_param.window_data_param()); |
||||
} |
||||
if (v1_layer_param.has_transform_param()) { |
||||
layer_param->mutable_transform_param()->CopyFrom( |
||||
v1_layer_param.transform_param()); |
||||
} |
||||
if (v1_layer_param.has_loss_param()) { |
||||
layer_param->mutable_loss_param()->CopyFrom( |
||||
v1_layer_param.loss_param()); |
||||
} |
||||
if (v1_layer_param.has_layer()) { |
||||
LOG(ERROR) << "Input NetParameter has V0 layer -- ignoring."; |
||||
is_fully_compatible = false; |
||||
} |
||||
return is_fully_compatible; |
||||
} |
||||
|
||||
const char* UpgradeV1LayerType(const V1LayerParameter_LayerType type) { |
||||
switch (type) { |
||||
case V1LayerParameter_LayerType_NONE: |
||||
return ""; |
||||
case V1LayerParameter_LayerType_ABSVAL: |
||||
return "AbsVal"; |
||||
case V1LayerParameter_LayerType_ACCURACY: |
||||
return "Accuracy"; |
||||
case V1LayerParameter_LayerType_ARGMAX: |
||||
return "ArgMax"; |
||||
case V1LayerParameter_LayerType_BNLL: |
||||
return "BNLL"; |
||||
case V1LayerParameter_LayerType_CONCAT: |
||||
return "Concat"; |
||||
case V1LayerParameter_LayerType_CONTRASTIVE_LOSS: |
||||
return "ContrastiveLoss"; |
||||
case V1LayerParameter_LayerType_CONVOLUTION: |
||||
return "Convolution"; |
||||
case V1LayerParameter_LayerType_DECONVOLUTION: |
||||
return "Deconvolution"; |
||||
case V1LayerParameter_LayerType_DATA: |
||||
return "Data"; |
||||
case V1LayerParameter_LayerType_DROPOUT: |
||||
return "Dropout"; |
||||
case V1LayerParameter_LayerType_DUMMY_DATA: |
||||
return "DummyData"; |
||||
case V1LayerParameter_LayerType_EUCLIDEAN_LOSS: |
||||
return "EuclideanLoss"; |
||||
case V1LayerParameter_LayerType_ELTWISE: |
||||
return "Eltwise"; |
||||
case V1LayerParameter_LayerType_EXP: |
||||
return "Exp"; |
||||
case V1LayerParameter_LayerType_FLATTEN: |
||||
return "Flatten"; |
||||
case V1LayerParameter_LayerType_HDF5_DATA: |
||||
return "HDF5Data"; |
||||
case V1LayerParameter_LayerType_HDF5_OUTPUT: |
||||
return "HDF5Output"; |
||||
case V1LayerParameter_LayerType_HINGE_LOSS: |
||||
return "HingeLoss"; |
||||
case V1LayerParameter_LayerType_IM2COL: |
||||
return "Im2col"; |
||||
case V1LayerParameter_LayerType_IMAGE_DATA: |
||||
return "ImageData"; |
||||
case V1LayerParameter_LayerType_INFOGAIN_LOSS: |
||||
return "InfogainLoss"; |
||||
case V1LayerParameter_LayerType_INNER_PRODUCT: |
||||
return "InnerProduct"; |
||||
case V1LayerParameter_LayerType_LRN: |
||||
return "LRN"; |
||||
case V1LayerParameter_LayerType_MEMORY_DATA: |
||||
return "MemoryData"; |
||||
case V1LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS: |
||||
return "MultinomialLogisticLoss"; |
||||
case V1LayerParameter_LayerType_MVN: |
||||
return "MVN"; |
||||
case V1LayerParameter_LayerType_POOLING: |
||||
return "Pooling"; |
||||
case V1LayerParameter_LayerType_POWER: |
||||
return "Power"; |
||||
case V1LayerParameter_LayerType_RELU: |
||||
return "ReLU"; |
||||
case V1LayerParameter_LayerType_SIGMOID: |
||||
return "Sigmoid"; |
||||
case V1LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS: |
||||
return "SigmoidCrossEntropyLoss"; |
||||
case V1LayerParameter_LayerType_SILENCE: |
||||
return "Silence"; |
||||
case V1LayerParameter_LayerType_SOFTMAX: |
||||
return "Softmax"; |
||||
case V1LayerParameter_LayerType_SOFTMAX_LOSS: |
||||
return "SoftmaxWithLoss"; |
||||
case V1LayerParameter_LayerType_SPLIT: |
||||
return "Split"; |
||||
case V1LayerParameter_LayerType_SLICE: |
||||
return "Slice"; |
||||
case V1LayerParameter_LayerType_TANH: |
||||
return "TanH"; |
||||
case V1LayerParameter_LayerType_WINDOW_DATA: |
||||
return "WindowData"; |
||||
case V1LayerParameter_LayerType_THRESHOLD: |
||||
return "Threshold"; |
||||
default: |
||||
LOG(FATAL) << "Unknown V1LayerParameter layer type: " << type; |
||||
return ""; |
||||
} |
||||
} |
||||
|
||||
void ReadNetParamsFromTextFileOrDie(const string& param_file, |
||||
NetParameter* param) { |
||||
CHECK(ReadProtoFromTextFile(param_file, param)) |
||||
<< "Failed to parse NetParameter file: " << param_file; |
||||
UpgradeNetAsNeeded(param_file, param); |
||||
} |
||||
|
||||
void ReadNetParamsFromBinaryFileOrDie(const string& param_file, |
||||
NetParameter* param) { |
||||
CHECK(ReadProtoFromBinaryFile(param_file, param)) |
||||
<< "Failed to parse NetParameter file: " << param_file; |
||||
UpgradeNetAsNeeded(param_file, param); |
||||
} |
||||
|
||||
} // namespace caffe
|
@ -0,0 +1,152 @@ |
||||
#ifndef CAFFE_UTIL_IO_H_ |
||||
#define CAFFE_UTIL_IO_H_ |
||||
|
||||
#include <opencv2/core.hpp> |
||||
#include <iostream> |
||||
#define CHECK(cond) if (!(cond)) std::cerr << #cond |
||||
#define CHECK_EQ(a, b) if (!((a) == (b))) std::cerr << #a << "!=" << #b |
||||
#define LOG(WHERE) std::cerr |
||||
|
||||
//#include <unistd.h>
|
||||
#include <string> |
||||
#include <stdio.h> |
||||
|
||||
#include <google/protobuf/message.h> |
||||
//#include "hdf5.h"
|
||||
//#include "hdf5_hl.h"
|
||||
|
||||
//#include "caffe/blob.hpp"
|
||||
#include "caffe/common.hpp" |
||||
#include "caffe.pb.h" |
||||
|
||||
#define HDF5_NUM_DIMS 4 |
||||
|
||||
namespace caffe { |
||||
|
||||
using ::google::protobuf::Message; |
||||
|
||||
//inline void MakeTempFilename(string* temp_filename) {
|
||||
// temp_filename->clear();
|
||||
// *temp_filename = "/tmp/caffe_test.XXXXXX";
|
||||
// char* temp_filename_cstr = new char[temp_filename->size() + 1];
|
||||
// // NOLINT_NEXT_LINE(runtime/printf)
|
||||
// strcpy(temp_filename_cstr, temp_filename->c_str());
|
||||
// int fd = mkstemp(temp_filename_cstr);
|
||||
// CHECK_GE(fd, 0) << "Failed to open a temporary file at: " << *temp_filename;
|
||||
// close(fd);
|
||||
// *temp_filename = temp_filename_cstr;
|
||||
// delete[] temp_filename_cstr;
|
||||
//}
|
||||
//
|
||||
//inline void MakeTempDir(string* temp_dirname) {
|
||||
// temp_dirname->clear();
|
||||
// *temp_dirname = "/tmp/caffe_test.XXXXXX";
|
||||
// char* temp_dirname_cstr = new char[temp_dirname->size() + 1];
|
||||
// // NOLINT_NEXT_LINE(runtime/printf)
|
||||
// strcpy(temp_dirname_cstr, temp_dirname->c_str());
|
||||
// char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
|
||||
// CHECK(mkdtemp_result != NULL)
|
||||
// << "Failed to create a temporary directory at: " << *temp_dirname;
|
||||
// *temp_dirname = temp_dirname_cstr;
|
||||
// delete[] temp_dirname_cstr;
|
||||
//}
|
||||
|
||||
bool ReadProtoFromTextFile(const char* filename, Message* proto); |
||||
|
||||
inline bool ReadProtoFromTextFile(const string& filename, Message* proto) { |
||||
return ReadProtoFromTextFile(filename.c_str(), proto); |
||||
} |
||||
|
||||
inline void ReadProtoFromTextFileOrDie(const char* filename, Message* proto) { |
||||
CHECK(ReadProtoFromTextFile(filename, proto)); |
||||
} |
||||
|
||||
inline void ReadProtoFromTextFileOrDie(const string& filename, Message* proto) { |
||||
ReadProtoFromTextFileOrDie(filename.c_str(), proto); |
||||
} |
||||
|
||||
void WriteProtoToTextFile(const Message& proto, const char* filename); |
||||
inline void WriteProtoToTextFile(const Message& proto, const string& filename) { |
||||
WriteProtoToTextFile(proto, filename.c_str()); |
||||
} |
||||
|
||||
bool ReadProtoFromBinaryFile(const char* filename, Message* proto); |
||||
|
||||
inline bool ReadProtoFromBinaryFile(const string& filename, Message* proto) { |
||||
return ReadProtoFromBinaryFile(filename.c_str(), proto); |
||||
} |
||||
|
||||
inline void ReadProtoFromBinaryFileOrDie(const char* filename, Message* proto) { |
||||
CHECK(ReadProtoFromBinaryFile(filename, proto)); |
||||
} |
||||
|
||||
inline void ReadProtoFromBinaryFileOrDie(const string& filename, |
||||
Message* proto) { |
||||
ReadProtoFromBinaryFileOrDie(filename.c_str(), proto); |
||||
} |
||||
|
||||
|
||||
void WriteProtoToBinaryFile(const Message& proto, const char* filename); |
||||
inline void WriteProtoToBinaryFile( |
||||
const Message& proto, const string& filename) { |
||||
WriteProtoToBinaryFile(proto, filename.c_str()); |
||||
} |
||||
|
||||
bool ReadFileToDatum(const string& filename, const int label, Datum* datum); |
||||
|
||||
inline bool ReadFileToDatum(const string& filename, Datum* datum) { |
||||
return ReadFileToDatum(filename, -1, datum); |
||||
} |
||||
|
||||
bool ReadImageToDatum(const string& filename, const int label, |
||||
const int height, const int width, const bool is_color, |
||||
const std::string & encoding, Datum* datum); |
||||
|
||||
inline bool ReadImageToDatum(const string& filename, const int label, |
||||
const int height, const int width, const bool is_color, Datum* datum) { |
||||
return ReadImageToDatum(filename, label, height, width, is_color, |
||||
"", datum); |
||||
} |
||||
|
||||
inline bool ReadImageToDatum(const string& filename, const int label, |
||||
const int height, const int width, Datum* datum) { |
||||
return ReadImageToDatum(filename, label, height, width, true, datum); |
||||
} |
||||
|
||||
inline bool ReadImageToDatum(const string& filename, const int label, |
||||
const bool is_color, Datum* datum) { |
||||
return ReadImageToDatum(filename, label, 0, 0, is_color, datum); |
||||
} |
||||
|
||||
inline bool ReadImageToDatum(const string& filename, const int label, |
||||
Datum* datum) { |
||||
return ReadImageToDatum(filename, label, 0, 0, true, datum); |
||||
} |
||||
|
||||
inline bool ReadImageToDatum(const string& filename, const int label, |
||||
const std::string & encoding, Datum* datum) { |
||||
return ReadImageToDatum(filename, label, 0, 0, true, encoding, datum); |
||||
} |
||||
|
||||
bool DecodeDatumNative(Datum* datum); |
||||
bool DecodeDatum(Datum* datum, bool is_color); |
||||
|
||||
cv::Mat ReadImageToCVMat(const string& filename, |
||||
const int height, const int width, const bool is_color); |
||||
|
||||
cv::Mat ReadImageToCVMat(const string& filename, |
||||
const int height, const int width); |
||||
|
||||
cv::Mat ReadImageToCVMat(const string& filename, |
||||
const bool is_color); |
||||
|
||||
cv::Mat ReadImageToCVMat(const string& filename); |
||||
|
||||
cv::Mat DecodeDatumToCVMatNative(const Datum& datum); |
||||
cv::Mat DecodeDatumToCVMat(const Datum& datum, bool is_color); |
||||
|
||||
void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); |
||||
|
||||
} // namespace caffe
|
||||
|
||||
#endif // CAFFE_UTIL_IO_H_
|
@ -0,0 +1,64 @@ |
||||
#ifndef CAFFE_UTIL_UPGRADE_PROTO_H_ |
||||
#define CAFFE_UTIL_UPGRADE_PROTO_H_ |
||||
|
||||
#include <string> |
||||
#include "caffe/common.hpp" |
||||
#include "caffe.pb.h" |
||||
|
||||
namespace caffe { |
||||
|
||||
// Return true iff the net is not the current version.
|
||||
bool NetNeedsUpgrade(const NetParameter& net_param); |
||||
|
||||
// Return true iff any layer contains parameters specified using
|
||||
// deprecated V0LayerParameter.
|
||||
bool NetNeedsV0ToV1Upgrade(const NetParameter& net_param); |
||||
|
||||
// Perform all necessary transformations to upgrade a V0NetParameter into a
|
||||
// NetParameter (including upgrading padding layers and LayerParameters).
|
||||
bool UpgradeV0Net(const NetParameter& v0_net_param, NetParameter* net_param); |
||||
|
||||
// Upgrade NetParameter with padding layers to pad-aware conv layers.
|
||||
// For any padding layer, remove it and put its pad parameter in any layers
|
||||
// taking its top blob as input.
|
||||
// Error if any of these above layers are not-conv layers.
|
||||
void UpgradeV0PaddingLayers(const NetParameter& param, |
||||
NetParameter* param_upgraded_pad); |
||||
|
||||
// Upgrade a single V0LayerConnection to the V1LayerParameter format.
|
||||
bool UpgradeV0LayerParameter(const V1LayerParameter& v0_layer_connection, |
||||
V1LayerParameter* layer_param); |
||||
|
||||
V1LayerParameter_LayerType UpgradeV0LayerType(const string& type); |
||||
|
||||
// Return true iff any layer contains deprecated data transformation parameters.
|
||||
bool NetNeedsDataUpgrade(const NetParameter& net_param); |
||||
|
||||
// Perform all necessary transformations to upgrade old transformation fields
|
||||
// into a TransformationParameter.
|
||||
void UpgradeNetDataTransformation(NetParameter* net_param); |
||||
|
||||
// Return true iff the Net contains any layers specified as V1LayerParameters.
|
||||
bool NetNeedsV1ToV2Upgrade(const NetParameter& net_param); |
||||
|
||||
// Perform all necessary transformations to upgrade a NetParameter with
|
||||
// deprecated V1LayerParameters.
|
||||
bool UpgradeV1Net(const NetParameter& v1_net_param, NetParameter* net_param); |
||||
|
||||
bool UpgradeV1LayerParameter(const V1LayerParameter& v1_layer_param, |
||||
LayerParameter* layer_param); |
||||
|
||||
const char* UpgradeV1LayerType(const V1LayerParameter_LayerType type); |
||||
|
||||
// Check for deprecations and upgrade the NetParameter as needed.
|
||||
bool UpgradeNetAsNeeded(const string& param_file, NetParameter* param); |
||||
|
||||
// Read parameters from a file into a NetParameter proto message.
|
||||
void ReadNetParamsFromTextFileOrDie(const string& param_file, |
||||
NetParameter* param); |
||||
void ReadNetParamsFromBinaryFileOrDie(const string& param_file, |
||||
NetParameter* param); |
||||
|
||||
} // namespace caffe
|
||||
|
||||
#endif // CAFFE_UTIL_UPGRADE_PROTO_H_
|
@ -0,0 +1,2 @@ |
||||
#include <opencv2/core.hpp> |
||||
#include <opencv2/dnn.hpp> |
@ -0,0 +1,31 @@ |
||||
#include "test_precomp.hpp" |
||||
|
||||
namespace cvtest |
||||
{ |
||||
|
||||
using namespace std; |
||||
using namespace std::tr1; |
||||
using namespace testing; |
||||
using namespace cv; |
||||
using namespace cv::dnn; |
||||
|
||||
static std::string getOpenCVExtraDir() |
||||
{ |
||||
return cvtest::TS::ptr()->get_data_path(); |
||||
} |
||||
|
||||
TEST(ReadCaffePrototxt_gtsrb, Accuracy) |
||||
{ |
||||
Ptr<Importer> importer = createCaffeImporter(getOpenCVExtraDir() + "/dnn/gtsrb.prototxt", ""); |
||||
Ptr<NetConfiguration> config = NetConfiguration::create(); |
||||
importer->populateNetConfiguration(config); |
||||
} |
||||
|
||||
TEST(ReadCaffePrototxt_GoogleNet, Accuracy) |
||||
{ |
||||
Ptr<Importer> importer = createCaffeImporter(getOpenCVExtraDir() + "/dnn/googlenet_deploy.prototxt", ""); |
||||
Ptr<NetConfiguration> config = NetConfiguration::create(); |
||||
importer->populateNetConfiguration(config); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,3 @@ |
||||
#include "test_precomp.hpp" |
||||
|
||||
CV_TEST_MAIN("") |
@ -0,0 +1,19 @@ |
||||
#ifdef __GNUC__ |
||||
# pragma GCC diagnostic ignored "-Wmissing-declarations" |
||||
# if defined __clang__ || defined __APPLE__ |
||||
# pragma GCC diagnostic ignored "-Wmissing-prototypes" |
||||
# pragma GCC diagnostic ignored "-Wextra" |
||||
# endif |
||||
#endif |
||||
|
||||
#ifndef __OPENCV_TEST_PRECOMP_HPP__ |
||||
#define __OPENCV_TEST_PRECOMP_HPP__ |
||||
|
||||
#include "opencv2/core.hpp" |
||||
#include "opencv2/dnn.hpp" |
||||
#include "opencv2/highgui.hpp" |
||||
#include "opencv2/ts.hpp" |
||||
#include <opencv2/ts/ts_perf.hpp> |
||||
#include <opencv2/core/utility.hpp> |
||||
|
||||
#endif |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,167 @@ |
||||
name: "gtsrb" |
||||
input: "data" |
||||
input_dim: 1 |
||||
input_dim: 3 |
||||
input_dim: 48 |
||||
input_dim: 48 |
||||
|
||||
|
||||
layers { |
||||
bottom: "data" |
||||
top: "layer1" |
||||
name: "layer1" |
||||
type: CONVOLUTION |
||||
blobs_lr: 1 |
||||
blobs_lr: 2 |
||||
convolution_param { |
||||
num_output: 100 |
||||
kernel_size: 7 |
||||
stride: 1 |
||||
weight_filler { |
||||
type: "xavier" |
||||
} |
||||
bias_filler { |
||||
type: "constant" |
||||
} |
||||
} |
||||
} |
||||
layers { |
||||
name: "tanh1" |
||||
bottom: "layer1" |
||||
top: "layer1" |
||||
type: TANH |
||||
} |
||||
layers { |
||||
bottom: "layer1" |
||||
top: "layer2" |
||||
name: "layer2" |
||||
type: POOLING |
||||
pooling_param { |
||||
pool: MAX |
||||
kernel_size: 2 |
||||
stride: 2 |
||||
} |
||||
} |
||||
|
||||
layers { |
||||
bottom: "layer2" |
||||
top: "layer3" |
||||
name: "layer3" |
||||
type: CONVOLUTION |
||||
blobs_lr: 1 |
||||
blobs_lr: 2 |
||||
convolution_param { |
||||
num_output: 150 |
||||
kernel_size: 4 |
||||
stride: 1 |
||||
weight_filler { |
||||
type: "xavier" |
||||
} |
||||
bias_filler { |
||||
type: "constant" |
||||
} |
||||
} |
||||
} |
||||
layers { |
||||
name: "tanh3" |
||||
bottom: "layer3" |
||||
top: "layer3" |
||||
type: TANH |
||||
} |
||||
layers { |
||||
bottom: "layer3" |
||||
top: "layer4" |
||||
name: "layer4" |
||||
type: POOLING |
||||
pooling_param { |
||||
pool: MAX |
||||
kernel_size: 2 |
||||
stride: 2 |
||||
} |
||||
} |
||||
|
||||
layers { |
||||
bottom: "layer4" |
||||
top: "layer5" |
||||
name: "layer5" |
||||
type: CONVOLUTION |
||||
blobs_lr: 1 |
||||
blobs_lr: 2 |
||||
convolution_param { |
||||
num_output: 250 |
||||
kernel_size: 4 |
||||
stride: 1 |
||||
weight_filler { |
||||
type: "xavier" |
||||
} |
||||
bias_filler { |
||||
type: "constant" |
||||
} |
||||
} |
||||
} |
||||
layers { |
||||
name: "tanh5" |
||||
bottom: "layer5" |
||||
top: "layer5" |
||||
type: TANH |
||||
} |
||||
layers { |
||||
bottom: "layer5" |
||||
top: "layer6" |
||||
name: "layer6" |
||||
type: POOLING |
||||
pooling_param { |
||||
pool: MAX |
||||
kernel_size: 2 |
||||
stride: 2 |
||||
} |
||||
} |
||||
|
||||
layers { |
||||
bottom: "layer6" |
||||
top: "layer7" |
||||
name: "layer7" |
||||
type: INNER_PRODUCT |
||||
blobs_lr: 1 |
||||
blobs_lr: 2 |
||||
inner_product_param { |
||||
num_output: 300 |
||||
weight_filler { |
||||
type: "xavier" |
||||
} |
||||
bias_filler { |
||||
type: "constant" |
||||
} |
||||
} |
||||
} |
||||
layers { |
||||
name: "tanh7" |
||||
bottom: "layer7" |
||||
top: "layer7" |
||||
type: TANH |
||||
} |
||||
|
||||
layers { |
||||
bottom: "layer7" |
||||
top: "layer8" |
||||
name: "layer8" |
||||
type: INNER_PRODUCT |
||||
blobs_lr: 1 |
||||
blobs_lr: 2 |
||||
inner_product_param { |
||||
num_output: 43 |
||||
weight_filler { |
||||
type: "xavier" |
||||
} |
||||
bias_filler { |
||||
type: "constant" |
||||
} |
||||
} |
||||
} |
||||
|
||||
layers { |
||||
name: "loss" |
||||
top: "loss" |
||||
bottom: "layer8" |
||||
type: SOFTMAX |
||||
} |
Loading…
Reference in new issue