summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvan Shelhamer <shelhamer@imaginarynumber.net>2015-02-19 17:54:49 -0800
committerEvan Shelhamer <shelhamer@imaginarynumber.net>2015-02-19 17:54:49 -0800
commitccd837433df0bfadcd198419ee554e39f7f0a7f9 (patch)
tree4a4adf378a09ede4ac62858047fa40f569f1003d /src
parent06ceaf452f65535a42b4f8a07f9cd861878d03e8 (diff)
downloadcaffeonacl-ccd837433df0bfadcd198419ee554e39f7f0a7f9.tar.gz
caffeonacl-ccd837433df0bfadcd198419ee554e39f7f0a7f9.tar.bz2
caffeonacl-ccd837433df0bfadcd198419ee554e39f7f0a7f9.zip
Repeal revert of #1878
Diffstat (limited to 'src')
-rw-r--r--src/caffe/layers/data_layer.cpp4
-rw-r--r--src/caffe/layers/window_data_layer.cpp2
-rw-r--r--src/caffe/test/test_io.cpp31
-rw-r--r--src/caffe/util/io.cpp60
4 files changed, 39 insertions, 58 deletions
diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp
index 0f959a9d..9a2dfac9 100644
--- a/src/caffe/layers/data_layer.cpp
+++ b/src/caffe/layers/data_layer.cpp
@@ -42,7 +42,7 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom,
Datum datum;
datum.ParseFromString(cursor_->value());
- if (DecodeDatum(&datum)) {
+ if (DecodeDatumNative(&datum)) {
LOG(INFO) << "Decoding Datum";
}
// image
@@ -110,7 +110,7 @@ void DataLayer<Dtype>::InternalThreadEntry() {
cv::Mat cv_img;
if (datum.encoded()) {
- cv_img = DecodeDatumToCVMat(datum);
+ cv_img = DecodeDatumToCVMatNative(datum);
}
read_time += timer.MicroSeconds();
timer.Start();
diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp
index 3e9e9765..1a6ffe20 100644
--- a/src/caffe/layers/window_data_layer.cpp
+++ b/src/caffe/layers/window_data_layer.cpp
@@ -278,7 +278,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() {
if (this->cache_images_) {
pair<std::string, Datum> image_cached =
image_database_cache_[window[WindowDataLayer<Dtype>::IMAGE_INDEX]];
- cv_img = DecodeDatumToCVMat(image_cached.second);
+ cv_img = DecodeDatumToCVMatNative(image_cached.second);
} else {
cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR);
if (!cv_img.data) {
diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp
index 4d941fa8..6b135efc 100644
--- a/src/caffe/test/test_io.cpp
+++ b/src/caffe/test/test_io.cpp
@@ -289,8 +289,8 @@ TEST_F(IOTest, TestDecodeDatum) {
string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg";
Datum datum;
EXPECT_TRUE(ReadFileToDatum(filename, &datum));
- EXPECT_TRUE(DecodeDatum(&datum));
- EXPECT_FALSE(DecodeDatum(&datum));
+ EXPECT_TRUE(DecodeDatumNative(&datum));
+ EXPECT_FALSE(DecodeDatumNative(&datum));
Datum datum_ref;
ReadImageToDatumReference(filename, 0, 0, 0, true, &datum_ref);
EXPECT_EQ(datum.channels(), datum_ref.channels());
@@ -309,38 +309,17 @@ TEST_F(IOTest, TestDecodeDatumToCVMat) {
string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg";
Datum datum;
EXPECT_TRUE(ReadFileToDatum(filename, &datum));
- cv::Mat cv_img = DecodeDatumToCVMat(datum);
+ cv::Mat cv_img = DecodeDatumToCVMatNative(datum);
EXPECT_EQ(cv_img.channels(), 3);
EXPECT_EQ(cv_img.rows, 360);
EXPECT_EQ(cv_img.cols, 480);
}
-TEST_F(IOTest, TestDecodeDatumToCVMatResized) {
- string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg";
- Datum datum;
- EXPECT_TRUE(ReadFileToDatum(filename, &datum));
- cv::Mat cv_img = DecodeDatumToCVMat(datum, 100, 200);
- EXPECT_EQ(cv_img.channels(), 3);
- EXPECT_EQ(cv_img.rows, 100);
- EXPECT_EQ(cv_img.cols, 200);
-}
-
-TEST_F(IOTest, TestDecodeDatumToCVMatResizedGray) {
- string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg";
- Datum datum;
- EXPECT_TRUE(ReadFileToDatum(filename, &datum));
- const bool is_color = false;
- cv::Mat cv_img = DecodeDatumToCVMat(datum, 200, 100, is_color);
- EXPECT_EQ(cv_img.channels(), 1);
- EXPECT_EQ(cv_img.rows, 200);
- EXPECT_EQ(cv_img.cols, 100);
-}
-
TEST_F(IOTest, TestDecodeDatumToCVMatContent) {
string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg";
Datum datum;
- EXPECT_TRUE(ReadFileToDatum(filename, &datum));
- cv::Mat cv_img = DecodeDatumToCVMat(datum);
+ EXPECT_TRUE(ReadImageToDatum(filename, 0, std::string("jpg"), &datum));
+ cv::Mat cv_img = DecodeDatumToCVMatNative(datum);
cv::Mat cv_img_ref = ReadImageToCVMat(filename);
EXPECT_EQ(cv_img_ref.channels(), cv_img.channels());
EXPECT_EQ(cv_img_ref.rows, cv_img.rows);
diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp
index f738e053..65531687 100644
--- a/src/caffe/util/io.cpp
+++ b/src/caffe/util/io.cpp
@@ -98,11 +98,36 @@ cv::Mat ReadImageToCVMat(const string& filename,
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, Datum* datum) {
+ 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;
@@ -131,47 +156,24 @@ bool ReadFileToDatum(const string& filename, const int label,
}
}
-cv::Mat DecodeDatumToCVMat(const Datum& datum,
- const int height, const int width, const bool is_color) {
+cv::Mat DecodeDatumToCVMatNative(const Datum& datum) {
cv::Mat cv_img;
CHECK(datum.encoded()) << "Datum not encoded";
- int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
- CV_LOAD_IMAGE_GRAYSCALE);
const string& data = datum.data();
std::vector<char> vec_data(data.c_str(), data.c_str() + data.size());
- if (height > 0 && width > 0) {
- cv::Mat cv_img_origin = cv::imdecode(cv::Mat(vec_data), cv_read_flag);
- cv::resize(cv_img_origin, cv_img, cv::Size(width, height));
- } else {
- cv_img = cv::imdecode(vec_data, cv_read_flag);
- }
+ 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,
- const int height, const int width) {
- return DecodeDatumToCVMat(datum, height, width, true);
-}
-
-cv::Mat DecodeDatumToCVMat(const Datum& datum,
- const bool is_color) {
- return DecodeDatumToCVMat(datum, 0, 0, is_color);
-}
-
-cv::Mat DecodeDatumToCVMat(const Datum& datum) {
- return DecodeDatumToCVMat(datum, 0, 0, true);
-}
-
// If Datum is encoded will decoded using DecodeDatumToCVMat and CVMatToDatum
// if height and width are set it will resize it
// If Datum is not encoded will do nothing
-bool DecodeDatum(const int height, const int width, const bool is_color,
- Datum* datum) {
+bool DecodeDatumNative(Datum* datum) {
if (datum->encoded()) {
- cv::Mat cv_img = DecodeDatumToCVMat((*datum), height, width, is_color);
+ cv::Mat cv_img = DecodeDatumToCVMatNative((*datum));
CVMatToDatum(cv_img, datum);
return true;
} else {