summaryrefslogtreecommitdiffstats
path: root/ml/dlib/tools/imglab/src/convert_pascal_v1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/tools/imglab/src/convert_pascal_v1.cpp')
-rw-r--r--ml/dlib/tools/imglab/src/convert_pascal_v1.cpp177
1 files changed, 177 insertions, 0 deletions
diff --git a/ml/dlib/tools/imglab/src/convert_pascal_v1.cpp b/ml/dlib/tools/imglab/src/convert_pascal_v1.cpp
new file mode 100644
index 000000000..8eaf5e2bb
--- /dev/null
+++ b/ml/dlib/tools/imglab/src/convert_pascal_v1.cpp
@@ -0,0 +1,177 @@
+
+#include "convert_pascal_v1.h"
+#include "dlib/data_io.h"
+#include <iostream>
+#include <string>
+#include <dlib/dir_nav.h>
+#include <dlib/time_this.h>
+
+using namespace std;
+using namespace dlib;
+
+namespace
+{
+ using namespace dlib::image_dataset_metadata;
+
+// ----------------------------------------------------------------------------------------
+
+ std::string pick_out_quoted_string (
+ const std::string& str
+ )
+ {
+ std::string temp;
+ bool in_quotes = false;
+ for (unsigned long i = 0; i < str.size(); ++i)
+ {
+ if (str[i] == '"')
+ {
+ in_quotes = !in_quotes;
+ }
+ else if (in_quotes)
+ {
+ temp += str[i];
+ }
+ }
+
+ return temp;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ void parse_annotation_file(
+ const std::string& file,
+ dlib::image_dataset_metadata::image& img,
+ std::string& dataset_name
+ )
+ {
+ ifstream fin(file.c_str());
+ if (!fin)
+ throw dlib::error("Unable to open file " + file);
+
+ img = dlib::image_dataset_metadata::image();
+
+ string str, line;
+ std::vector<string> words;
+ while (fin.peek() != EOF)
+ {
+ getline(fin, line);
+ words = split(line, " \r\n\t:(,-)\"");
+ if (words.size() > 2)
+ {
+ if (words[0] == "#")
+ continue;
+
+ if (words[0] == "Image" && words[1] == "filename")
+ {
+ img.filename = pick_out_quoted_string(line);
+ }
+ else if (words[0] == "Database")
+ {
+ dataset_name = pick_out_quoted_string(line);
+ }
+ else if (words[0] == "Objects" && words[1] == "with" && words.size() >= 5)
+ {
+ const int num = sa = words[4];
+ img.boxes.resize(num);
+ }
+ else if (words.size() > 4 && (words[2] == "for" || words[2] == "on") && words[3] == "object")
+ {
+ long idx = sa = words[4];
+ --idx;
+ if (idx >= (long)img.boxes.size())
+ throw dlib::error("Invalid object id number of " + words[4]);
+
+ if (words[0] == "Center" && words[1] == "point" && words.size() > 9)
+ {
+ const long x = sa = words[8];
+ const long y = sa = words[9];
+ img.boxes[idx].parts["head"] = point(x,y);
+ }
+ else if (words[0] == "Bounding" && words[1] == "box" && words.size() > 13)
+ {
+ rectangle rect;
+ img.boxes[idx].rect.left() = sa = words[10];
+ img.boxes[idx].rect.top() = sa = words[11];
+ img.boxes[idx].rect.right() = sa = words[12];
+ img.boxes[idx].rect.bottom() = sa = words[13];
+ }
+ else if (words[0] == "Original" && words[1] == "label" && words.size() > 6)
+ {
+ img.boxes[idx].label = words[6];
+ }
+ }
+ }
+
+ }
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ std::string figure_out_full_path_to_image (
+ const std::string& annotation_file,
+ const std::string& image_name
+ )
+ {
+ directory parent = get_parent_directory(file(annotation_file));
+
+
+ string temp;
+ while (true)
+ {
+ if (parent.is_root())
+ temp = parent.full_name() + image_name;
+ else
+ temp = parent.full_name() + directory::get_separator() + image_name;
+
+ if (file_exists(temp))
+ return temp;
+
+ if (parent.is_root())
+ throw dlib::error("Can't figure out where the file " + image_name + " is located.");
+ parent = get_parent_directory(parent);
+ }
+ }
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+void convert_pascal_v1(
+ const command_line_parser& parser
+)
+{
+ cout << "Convert from PASCAL v1.00 annotation format..." << endl;
+
+ dlib::image_dataset_metadata::dataset dataset;
+
+ std::string name;
+ dlib::image_dataset_metadata::image img;
+
+ const std::string filename = parser.option("c").argument();
+ // make sure the file exists so we can use the get_parent_directory() command to
+ // figure out it's parent directory.
+ make_empty_file(filename);
+ const std::string parent_dir = get_parent_directory(file(filename)).full_name();
+
+ for (unsigned long i = 0; i < parser.number_of_arguments(); ++i)
+ {
+ try
+ {
+ parse_annotation_file(parser[i], img, name);
+
+ dataset.name = name;
+ img.filename = strip_path(figure_out_full_path_to_image(parser[i], img.filename), parent_dir);
+ dataset.images.push_back(img);
+
+ }
+ catch (exception& )
+ {
+ cout << "Error while processing file " << parser[i] << endl << endl;
+ throw;
+ }
+ }
+
+ save_image_dataset_metadata(dataset, filename);
+}
+
+