diff options
author | Evan Shelhamer <shelhamer@imaginarynumber.net> | 2015-02-19 17:54:49 -0800 |
---|---|---|
committer | Evan Shelhamer <shelhamer@imaginarynumber.net> | 2015-02-19 17:54:49 -0800 |
commit | ccd837433df0bfadcd198419ee554e39f7f0a7f9 (patch) | |
tree | 4a4adf378a09ede4ac62858047fa40f569f1003d /src | |
parent | 06ceaf452f65535a42b4f8a07f9cd861878d03e8 (diff) | |
download | caffeonacl-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.cpp | 4 | ||||
-rw-r--r-- | src/caffe/layers/window_data_layer.cpp | 2 | ||||
-rw-r--r-- | src/caffe/test/test_io.cpp | 31 | ||||
-rw-r--r-- | src/caffe/util/io.cpp | 60 |
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 { |