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