| |
|
| | #include "convert_idl.h" |
| | #include "dlib/data_io.h" |
| | #include <iostream> |
| | #include <string> |
| | #include <dlib/dir_nav.h> |
| | #include <dlib/time_this.h> |
| | #include <dlib/cmd_line_parser.h> |
| |
|
| | using namespace std; |
| | using namespace dlib; |
| |
|
| | namespace |
| | { |
| | using namespace dlib::image_dataset_metadata; |
| |
|
| | |
| |
|
| | inline bool next_is_number(std::istream& in) |
| | { |
| | return ('0' <= in.peek() && in.peek() <= '9') || in.peek() == '-' || in.peek() == '+'; |
| | } |
| |
|
| | int read_int(std::istream& in) |
| | { |
| | bool is_neg = false; |
| | if (in.peek() == '-') |
| | { |
| | is_neg = true; |
| | in.get(); |
| | } |
| | if (in.peek() == '+') |
| | in.get(); |
| |
|
| | int val = 0; |
| | while ('0' <= in.peek() && in.peek() <= '9') |
| | { |
| | val = 10*val + in.get()-'0'; |
| | } |
| |
|
| | if (is_neg) |
| | return -val; |
| | else |
| | return val; |
| | } |
| |
|
| | |
| |
|
| | void parse_annotation_file( |
| | const std::string& file, |
| | dlib::image_dataset_metadata::dataset& data |
| | ) |
| | { |
| | ifstream fin(file.c_str()); |
| | if (!fin) |
| | throw dlib::error("Unable to open file " + file); |
| |
|
| |
|
| | bool in_quote = false; |
| | int point_count = 0; |
| | bool in_point_list = false; |
| | bool saw_any_points = false; |
| |
|
| | image img; |
| | string label; |
| | point p1,p2; |
| | while (fin.peek() != EOF) |
| | { |
| | if (in_point_list && next_is_number(fin)) |
| | { |
| | const int val = read_int(fin); |
| | switch (point_count) |
| | { |
| | case 0: p1.x() = val; break; |
| | case 1: p1.y() = val; break; |
| | case 2: p2.x() = val; break; |
| | case 3: p2.y() = val; break; |
| | default: |
| | throw dlib::error("parse error in file " + file); |
| | } |
| |
|
| | ++point_count; |
| | } |
| |
|
| | char ch = fin.get(); |
| |
|
| | if (ch == ':') |
| | continue; |
| |
|
| | if (ch == '"') |
| | { |
| | in_quote = !in_quote; |
| | continue; |
| | } |
| |
|
| | if (in_quote) |
| | { |
| | img.filename += ch; |
| | continue; |
| | } |
| |
|
| |
|
| | if (ch == '(') |
| | { |
| | in_point_list = true; |
| | point_count = 0; |
| | label.clear(); |
| | saw_any_points = true; |
| | } |
| | if (ch == ')') |
| | { |
| | in_point_list = false; |
| |
|
| | label.clear(); |
| | while (fin.peek() != EOF && |
| | fin.peek() != ';' && |
| | fin.peek() != ',') |
| | { |
| | char ch = fin.get(); |
| | if (ch == ':') |
| | continue; |
| |
|
| | label += ch; |
| | } |
| | } |
| |
|
| | if (ch == ',' && !in_point_list) |
| | { |
| |
|
| | box b; |
| | b.rect = rectangle(p1,p2); |
| | b.label = label; |
| | img.boxes.push_back(b); |
| | } |
| |
|
| |
|
| | if (ch == ';') |
| | { |
| |
|
| | if (saw_any_points) |
| | { |
| | box b; |
| | b.rect = rectangle(p1,p2); |
| | b.label = label; |
| | img.boxes.push_back(b); |
| | saw_any_points = false; |
| | } |
| | data.images.push_back(img); |
| |
|
| |
|
| | img.filename.clear(); |
| | img.boxes.clear(); |
| | } |
| |
|
| |
|
| | } |
| |
|
| |
|
| |
|
| | } |
| |
|
| | |
| |
|
| | } |
| |
|
| | void convert_idl( |
| | const command_line_parser& parser |
| | ) |
| | { |
| | cout << "Convert from IDL annotation format..." << endl; |
| |
|
| | dlib::image_dataset_metadata::dataset dataset; |
| |
|
| | for (unsigned long i = 0; i < parser.number_of_arguments(); ++i) |
| | { |
| | parse_annotation_file(parser[i], dataset); |
| | } |
| |
|
| | const std::string filename = parser.option("c").argument(); |
| | save_image_dataset_metadata(dataset, filename); |
| | } |
| |
|
| |
|
| |
|
| |
|