From 3929e23878c3b522eed4111ed08c48cd3ff03aff Mon Sep 17 00:00:00 2001 From: Dmitriy Anisimov Date: Sat, 15 Nov 2014 09:08:52 +0300 Subject: [PATCH] updated adience loader --- modules/datasets/samples/fr_adience.cpp | 4 +- modules/datasets/src/fr_adience.cpp | 64 +++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/modules/datasets/samples/fr_adience.cpp b/modules/datasets/samples/fr_adience.cpp index ece94f1c3..a92af28d7 100644 --- a/modules/datasets/samples/fr_adience.cpp +++ b/modules/datasets/samples/fr_adience.cpp @@ -97,8 +97,8 @@ int main(int argc, char *argv[]) printf("y: %u\n", example->y); printf("dx: %u\n", example->dx); printf("dy: %u\n", example->dy); - printf("tilt_ang: %u\n", example->tilt_ang); - printf("fiducial_yaw_angle: %u\n", example->fiducial_yaw_angle); + printf("tilt_ang: %d\n", example->tilt_ang); + printf("fiducial_yaw_angle: %d\n", example->fiducial_yaw_angle); printf("fiducial_score: %u\n", example->fiducial_score); return 0; diff --git a/modules/datasets/src/fr_adience.cpp b/modules/datasets/src/fr_adience.cpp index 9c077ca37..c828257a0 100644 --- a/modules/datasets/src/fr_adience.cpp +++ b/modules/datasets/src/fr_adience.cpp @@ -42,6 +42,9 @@ #include "opencv2/datasets/fr_adience.hpp" #include "opencv2/datasets/util.hpp" +#include +#include + namespace cv { namespace datasets @@ -63,6 +66,9 @@ private: void loadFile(const string &filename, vector< Ptr > &out); void cv5ToSplits(vector< Ptr > fileList[5]); + + map< string, vector > realNames; + set missing; }; /*FR_adienceImp::FR_adienceImp(const string &path) @@ -79,15 +85,38 @@ void FR_adienceImp::loadFile(const string &filename, vector< Ptr { string line; ifstream infile(filename.c_str()); + getline(infile, line); // skip header while (getline(infile, line)) { - Ptr curr(new FR_adienceObj); - vector elems; split(line, elems, ','); - curr->user_id = elems[0]; - curr->original_image = elems[1]; + string user_id = elems[0]; + string original_image = elems[1]; + + // convert original_image to real image name + bool isChanged = false; + vector &currImgs = realNames[user_id]; + for (vector::iterator it=currImgs.begin(); it!=currImgs.end(); ++it) + { + string &name = *it; + size_t origImgLen = original_image.length(); + if (name.length()>origImgLen && name.substr(name.length()-origImgLen) == original_image) + { + original_image = name; + isChanged = true; + break; + } + } + if (!isChanged) + { + missing.insert(user_id+"/"+original_image); + continue; + } + + Ptr curr(new FR_adienceObj); + curr->user_id = user_id; + curr->original_image = original_image; curr->face_id = atoi(elems[2].c_str()); curr->age = elems[3]; if (elems[4]=="m") @@ -142,6 +171,26 @@ void FR_adienceImp::cv5ToSplits(vector< Ptr > fileList[5]) void FR_adienceImp::loadDataset(const string &path) { + // collect real image names + unsigned int num = 0; + vector userNames; + getDirList(path+"faces/", userNames); + for (vector::iterator itU=userNames.begin(); itU!=userNames.end(); ++itU) + { + vector fileNames; + getDirList(path+"faces/"+*itU+"/", fileNames); + for (vector::iterator it=fileNames.begin(); it!=fileNames.end(); ++it) + { + string &name = *it; + if (name.length()>3 && name.substr(name.length()-4) == ".jpg") + { + realNames[*itU].push_back(name); + num++; + } + } + } + //printf("total images number: %u\n", num); + vector< Ptr > fileList[5]; for (unsigned int i=0; i<5; ++i) { @@ -163,6 +212,13 @@ void FR_adienceImp::loadDataset(const string &path) loadFile(filename, fileList[i]); } cv5ToSplits(fileList); + + /*for (set::iterator it=missing.begin(); it!=missing.end(); ++it) + { + printf("missing image: %s\n", (*it).c_str()); + }*/ + realNames.clear(); + missing.clear(); } Ptr FR_adience::create()