Commit 1cf74015 authored by Davis King's avatar Davis King

Added --flip to imglab

parent 40f30aad
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "convert_pascal_v1.h" #include "convert_pascal_v1.h"
#include "convert_idl.h" #include "convert_idl.h"
#include <dlib/cmd_line_parser.h> #include <dlib/cmd_line_parser.h>
#include <dlib/image_transforms.h>
#include <dlib/svm.h> #include <dlib/svm.h>
#include <iostream> #include <iostream>
...@@ -35,7 +36,7 @@ void create_new_dataset ( ...@@ -35,7 +36,7 @@ void create_new_dataset (
// make sure the file exists so we can use the get_parent_directory() command to // make sure the file exists so we can use the get_parent_directory() command to
// figure out it's parent directory. // figure out it's parent directory.
make_empty_file(filename); make_empty_file(filename);
const std::string parent_dir = get_parent_directory(file(filename)).full_name(); const std::string parent_dir = get_parent_directory(file(filename));
unsigned long depth = 0; unsigned long depth = 0;
if (parser.option("r")) if (parser.option("r"))
...@@ -48,7 +49,7 @@ void create_new_dataset ( ...@@ -48,7 +49,7 @@ void create_new_dataset (
{ {
try try
{ {
const string temp = strip_path(file(parser[i]).full_name(), parent_dir); const string temp = strip_path(file(parser[i]), parent_dir);
meta.images.push_back(image(temp)); meta.images.push_back(image(temp));
} }
catch (dlib::file::file_not_found&) catch (dlib::file::file_not_found&)
...@@ -62,7 +63,7 @@ void create_new_dataset ( ...@@ -62,7 +63,7 @@ void create_new_dataset (
for (unsigned long j = 0; j < files.size(); ++j) for (unsigned long j = 0; j < files.size(); ++j)
{ {
meta.images.push_back(image(strip_path(files[j].full_name(), parent_dir))); meta.images.push_back(image(strip_path(files[j], parent_dir)));
} }
} }
} }
...@@ -256,6 +257,65 @@ void merge_metadata_files ( ...@@ -256,6 +257,65 @@ void merge_metadata_files (
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
string to_png_name (const string& filename)
{
string::size_type pos = filename.find_last_of(".");
if (pos == string::npos)
throw dlib::error("invalid filename: " + filename);
return filename.substr(0,pos) + ".png";
}
// ----------------------------------------------------------------------------------------
void flip_dataset(const command_line_parser& parser)
{
#ifdef DLIB_PNG_SUPPORT
image_dataset_metadata::dataset metadata;
const string datasource = parser.option("flip").argument();
load_image_dataset_metadata(metadata,datasource);
// Set the current directory to be the one that contains the
// metadata file. We do this because the file might contain
// file paths which are relative to this folder.
set_current_dir(get_parent_directory(file(datasource)));
const string metadata_filename = get_parent_directory(file(datasource)).full_name() +
directory::get_separator() + "flipped_" + file(datasource).name();
array2d<rgb_pixel> img, temp;
for (unsigned long i = 0; i < metadata.images.size(); ++i)
{
file f(metadata.images[i].filename);
const string filename = get_parent_directory(f).full_name() + directory::get_separator() + "flipped_" + to_png_name(f.name());
load_image(img, metadata.images[i].filename);
flip_image_left_right(img, temp);
save_png(temp, filename);
for (unsigned long j = 0; j < metadata.images[i].boxes.size(); ++j)
{
metadata.images[i].boxes[j].rect = impl::flip_rect_left_right(metadata.images[i].boxes[j].rect, get_rect(img));
// flip all the object parts
std::map<std::string,point>::iterator k;
for (k = metadata.images[i].boxes[j].parts.begin(); k != metadata.images[i].boxes[j].parts.end(); ++k)
{
k->second = impl::flip_rect_left_right(rectangle(k->second,k->second), get_rect(img)).tl_corner();
}
}
metadata.images[i].filename = filename;
}
save_image_dataset_metadata(metadata, metadata_filename);
#else
throw dlib::error("imglab must be compiled with libpng if you want to use the --flip option.");
#endif
}
// ----------------------------------------------------------------------------------------
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
try try
...@@ -289,10 +349,12 @@ int main(int argc, char** argv) ...@@ -289,10 +349,12 @@ int main(int argc, char** argv)
"tags are in both files then the ones in <arg2> are deleted and replaced with the " "tags are in both files then the ones in <arg2> are deleted and replaced with the "
"image tags from <arg1>. The results are saved into merged.xml and neither <arg1> or " "image tags from <arg1>. The results are saved into merged.xml and neither <arg1> or "
"<arg2> files are modified.",2); "<arg2> files are modified.",2);
parser.add_option("flip", "Read an XML image dataset from the <arg> XML file and output a left-right flipped "
"version of the dataset and an accompanying flipped XML file named flipped_<arg>.",1);
parser.parse(argc, argv); parser.parse(argc, argv);
const char* singles[] = {"h","c","r","l","convert","parts","rmdiff","seed", "shuffle", "split", "add"}; const char* singles[] = {"h","c","r","l","convert","parts","rmdiff","seed", "shuffle", "split", "add", "flip"};
parser.check_one_time_options(singles); parser.check_one_time_options(singles);
const char* c_sub_ops[] = {"r", "convert"}; const char* c_sub_ops[] = {"r", "convert"};
parser.check_sub_options("c", c_sub_ops); parser.check_sub_options("c", c_sub_ops);
...@@ -300,11 +362,14 @@ int main(int argc, char** argv) ...@@ -300,11 +362,14 @@ int main(int argc, char** argv)
parser.check_incompatible_options("c", "l"); parser.check_incompatible_options("c", "l");
parser.check_incompatible_options("c", "rmdiff"); parser.check_incompatible_options("c", "rmdiff");
parser.check_incompatible_options("c", "add"); parser.check_incompatible_options("c", "add");
parser.check_incompatible_options("c", "flip");
parser.check_incompatible_options("c", "rename"); parser.check_incompatible_options("c", "rename");
parser.check_incompatible_options("c", "parts"); parser.check_incompatible_options("c", "parts");
parser.check_incompatible_options("l", "rename"); parser.check_incompatible_options("l", "rename");
parser.check_incompatible_options("l", "add"); parser.check_incompatible_options("l", "add");
parser.check_incompatible_options("l", "parts"); parser.check_incompatible_options("l", "parts");
parser.check_incompatible_options("l", "flip");
parser.check_incompatible_options("add", "flip");
parser.check_incompatible_options("convert", "l"); parser.check_incompatible_options("convert", "l");
parser.check_incompatible_options("convert", "rename"); parser.check_incompatible_options("convert", "rename");
parser.check_incompatible_options("convert", "parts"); parser.check_incompatible_options("convert", "parts");
...@@ -326,6 +391,12 @@ int main(int argc, char** argv) ...@@ -326,6 +391,12 @@ int main(int argc, char** argv)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
if (parser.option("flip"))
{
flip_dataset(parser);
return EXIT_SUCCESS;
}
if (parser.option("v")) if (parser.option("v"))
{ {
cout << "imglab v" << VERSION cout << "imglab v" << VERSION
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment