|
|
|
#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); |
|
} |
|
|
|
|
|
|
|
|