// Copyright (C) 2012 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_LOAD_IMAGE_DaTASET_H__
#define DLIB_LOAD_IMAGE_DaTASET_H__
#include "load_image_dataset_abstract.h"
#include "../misc_api.h"
#include "../dir_nav.h"
#include "../image_io.h"
#include "../array.h"
#include <vector>
#include "../geometry.h"
#include "image_dataset_metadata.h"
#include <string>
#include "../image_processing/full_object_detection.h"
namespace dlib
{
// ----------------------------------------------------------------------------------------
template <
typename image_type,
typename MM
>
void load_image_dataset (
array<image_type,MM>& images,
std::vector<std::vector<rectangle> >& object_locations,
const std::string& filename,
const std::string& label,
bool skip_empty_images = false
)
{
images.clear();
object_locations.clear();
const std::string old_working_dir = get_current_dir();
// 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.
const std::string parent_dir = get_parent_directory(file(filename)).full_name();
set_current_dir(parent_dir);
using namespace dlib::image_dataset_metadata;
dataset data;
load_image_dataset_metadata(data, filename);
image_type img;
std::vector<rectangle> rects;
for (unsigned long i = 0; i < data.images.size(); ++i)
{
rects.clear();
for (unsigned long j = 0; j < data.images[i].boxes.size(); ++j)
{
if (label.size() == 0 || data.images[i].boxes[j].label == label)
{
rects.push_back(data.images[i].boxes[j].rect);
}
}
if (!skip_empty_images || rects.size() != 0)
{
object_locations.push_back(rects);
load_image(img, data.images[i].filename);
images.push_back(img);
}
}
set_current_dir(old_working_dir);
}
// ----------------------------------------------------------------------------------------
template <
typename image_type,
typename MM
>
void load_image_dataset (
array<image_type,MM>& images,
std::vector<std::vector<rectangle> >& object_locations,
const std::string& filename
)
{
load_image_dataset(images, object_locations, filename, "");
}
// ----------------------------------------------------------------------------------------
template <
typename image_type,
typename MM
>
std::vector<std::string> load_image_dataset (
array<image_type,MM>& images,
std::vector<std::vector<full_object_detection> >& object_locations,
const std::string& filename,
const std::string& label,
bool skip_empty_images = false
)
{
images.clear();
object_locations.clear();
const std::string old_working_dir = get_current_dir();
// 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.
const std::string parent_dir = get_parent_directory(file(filename)).full_name();
set_current_dir(parent_dir);
using namespace dlib::image_dataset_metadata;
dataset data;
load_image_dataset_metadata(data, filename);
std::set<std::string> all_parts;
// find out what parts are being used in the dataset. Store results in all_parts.
for (unsigned long i = 0; i < data.images.size(); ++i)
{
for (unsigned long j = 0; j < data.images[i].boxes.size(); ++j)
{
if (label.size() == 0 || data.images[i].boxes[j].label == label)
{
const std::map<std::string,point>& parts = data.images[i].boxes[j].parts;
std::map<std::string,point>::const_iterator itr;
for (itr = parts.begin(); itr != parts.end(); ++itr)
{
all_parts.insert(itr->first);
}
}
}
}
// make a mapping between part names and the integers [0, all_parts.size())
std::map<std::string,int> parts_idx;
std::vector<std::string> ret_parts_list;
for (std::set<std::string>::iterator i = all_parts.begin(); i != all_parts.end(); ++i)
{
parts_idx[*i] = ret_parts_list.size();
ret_parts_list.push_back(*i);
}
image_type img;
std::vector<full_object_detection> object_dets;
for (unsigned long i = 0; i < data.images.size(); ++i)
{
object_dets.clear();
for (unsigned long j = 0; j < data.images[i].boxes.size(); ++j)
{
if (label.size() == 0 || data.images[i].boxes[j].label == label)
{
std::vector<point> partlist(parts_idx.size(), OBJECT_PART_NOT_PRESENT);
// populate partlist with all the parts present in this box.
const std::map<std::string,point>& parts = data.images[i].boxes[j].parts;
std::map<std::string,point>::const_iterator itr;
for (itr = parts.begin(); itr != parts.end(); ++itr)
{
partlist[parts_idx[itr->first]] = itr->second;
}
object_dets.push_back(full_object_detection(data.images[i].boxes[j].rect, partlist));
}
}
if (!skip_empty_images || object_dets.size() != 0)
{
object_locations.push_back(object_dets);
load_image(img, data.images[i].filename);
images.push_back(img);
}
}
set_current_dir(old_working_dir);
return ret_parts_list;
}
// ----------------------------------------------------------------------------------------
template <
typename image_type,
typename MM
>
std::vector<std::string> load_image_dataset (
array<image_type,MM>& images,
std::vector<std::vector<full_object_detection> >& object_locations,
const std::string& filename
)
{
return load_image_dataset(images, object_locations, filename, "");
}
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_LOAD_IMAGE_DaTASET_H__