Added test for encoded Datum to test_io.cpp
authorSergio <sguada@gmail.com>
Tue, 7 Oct 2014 06:27:40 +0000 (23:27 -0700)
committerSergio <sguada@gmail.com>
Wed, 15 Oct 2014 22:56:13 +0000 (15:56 -0700)
include/caffe/util/io.hpp
src/caffe/test/test_io.cpp
src/caffe/util/io.cpp

index 63afe62..64df015 100644 (file)
@@ -113,17 +113,17 @@ inline bool ReadImageToDatum(const string& filename, const int label,
 }
 
 bool DecodeDatum(const int height, const int width, const bool is_color,
-  Datum& datum);
+  Datum* datum);
 
-inline bool DecodeDatum(const int height, const int width, Datum& datum) {
+inline bool DecodeDatum(const int height, const int width, Datum* datum) {
   return DecodeDatum(height, width, true, datum);
 }
 
-inline bool DecodeDatum(const bool is_color, Datum& datum) {
+inline bool DecodeDatum(const bool is_color, Datum* datum) {
   return DecodeDatum(0, 0, is_color, datum);
 }
 
-inline bool DecodeDatum(Datum& datum) {
+inline bool DecodeDatum(Datum* datum) {
   return DecodeDatum(0, 0, true, datum);
 }
 
index 6994afd..4d941fa 100644 (file)
@@ -276,4 +276,84 @@ TEST_F(IOTest, TestCVMatToDatumReference) {
   }
 }
 
+TEST_F(IOTest, TestReadFileToDatum) {
+  string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg";
+  Datum datum;
+  EXPECT_TRUE(ReadFileToDatum(filename, &datum));
+  EXPECT_TRUE(datum.encoded());
+  EXPECT_EQ(datum.label(), -1);
+  EXPECT_EQ(datum.data().size(), 140391);
+}
+
+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));
+  Datum datum_ref;
+  ReadImageToDatumReference(filename, 0, 0, 0, true, &datum_ref);
+  EXPECT_EQ(datum.channels(), datum_ref.channels());
+  EXPECT_EQ(datum.height(), datum_ref.height());
+  EXPECT_EQ(datum.width(), datum_ref.width());
+  EXPECT_EQ(datum.data().size(), datum_ref.data().size());
+
+  const string& data = datum.data();
+  const string& data_ref = datum_ref.data();
+  for (int i = 0; i < datum.data().size(); ++i) {
+    EXPECT_TRUE(data[i] == data_ref[i]);
+  }
+}
+
+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);
+  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);
+  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);
+  EXPECT_EQ(cv_img_ref.cols, cv_img.cols);
+
+  for (int c = 0; c < datum.channels(); ++c) {
+    for (int h = 0; h < datum.height(); ++h) {
+      for (int w = 0; w < datum.width(); ++w) {
+        EXPECT_TRUE(cv_img.at<cv::Vec3b>(h, w)[c]==
+          cv_img_ref.at<cv::Vec3b>(h, w)[c]);
+      }
+    }
+  }
+}
+
 }  // namespace caffe
index 6aa410a..06b9deb 100644 (file)
@@ -139,10 +139,10 @@ cv::Mat DecodeDatumToCVMat(const Datum& datum,
 // 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) {
-  if (datum.encoded()) {
-    cv::Mat cv_img = DecodeDatumToCVMat(datum, height, width, is_color);
-    CVMatToDatum(cv_img, &datum);
+                Datum* datum) {
+  if (datum->encoded()) {
+    cv::Mat cv_img = DecodeDatumToCVMat((*datum), height, width, is_color);
+    CVMatToDatum(cv_img, datum);
     return true;
   } else {
     return false;