Merge pull request #259 from Jiaolong/dataset_inria

added INRIA pedestrian dataset
pull/268/head
Vadim Pisarevsky 10 years ago
commit 2a199bc94e
  1. 96
      modules/datasets/include/opencv2/datasets/pd_inria.hpp
  2. 94
      modules/datasets/samples/pd_inria.cpp
  3. 203
      modules/datasets/src/pd_inria.cpp

@ -0,0 +1,96 @@
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2015, Itseez Inc, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Itseez Inc or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef OPENCV_DATASETS_PD_INRIA_HPP
#define OPENCV_DATASETS_PD_INRIA_HPP
#include <string>
#include <vector>
#include "opencv2/datasets/dataset.hpp"
#include <opencv2/core.hpp>
namespace cv
{
namespace datasets
{
//! @addtogroup datasets_pd
//! @{
enum sampleType
{
POS = 0,
NEG = 1
};
struct PD_inriaObj : public Object
{
// image file name
std::string filename;
// positive or negative
sampleType sType;
// image size
int width;
int height;
int depth;
// bounding boxes
std::vector< Rect > bndboxes;
};
class CV_EXPORTS PD_inria : public Dataset
{
public:
virtual void load(const std::string &path) = 0;
static Ptr<PD_inria> create();
};
//! @}
}
}
#endif

@ -0,0 +1,94 @@
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2015, Itseez Inc, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Itseez Inc or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "opencv2/datasets/pd_inria.hpp"
#include <opencv2/core.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
using namespace cv::datasets;
int main(int argc, char *argv[])
{
const char *keys =
"{ help h usage ? | | show this message }"
"{ path p |true| path to dataset }";
CommandLineParser parser(argc, argv, keys);
string path(parser.get<string>("path"));
if (parser.has("help") || path=="true")
{
parser.printMessage();
return -1;
}
Ptr<PD_inria> dataset = PD_inria::create();
dataset->load(path);
cout << "train size: " << (unsigned int)dataset->getTrain().size() << endl;
PD_inriaObj *example = static_cast<PD_inriaObj *>(dataset->getTrain()[0].get());
cout << "first train object: " << endl;
cout << "name: " << example->filename << endl;
// image size
cout << "image size: " << endl;
cout << " - width: " << example->width << endl;
cout << " - height: " << example->height << endl;
cout << " - depth: " << example->depth << endl;
// bounding boxes
for (unsigned int i = 0; i < (example->bndboxes).size(); i++)
{
cout << "object " << i << endl;
int x = (example->bndboxes)[i].x;
int y = (example->bndboxes)[i].y;
cout << " - xmin = " << x << endl;
cout << " - ymin = " << y << endl;
cout << " - xmax = " << (example->bndboxes)[i].width + x << endl;
cout << " - ymax = " << (example->bndboxes)[i].height + y<< endl;
}
return 0;
}

@ -0,0 +1,203 @@
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2015, Itseez Inc, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Itseez Inc or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "opencv2/datasets/pd_inria.hpp"
#include "opencv2/datasets/util.hpp"
namespace cv
{
namespace datasets
{
using namespace std;
class PD_inriaImp : public PD_inria
{
public:
PD_inriaImp() {}
virtual ~PD_inriaImp() {}
virtual void load(const string &path);
private:
void loadDataset(const string &path, const string nameImageSet, vector< Ptr<Object> > &imageSet);
void readTextLines(const string filename, vector< string > &lines);
void parseAnnotation(const string filename, Ptr< PD_inriaObj > &object);
};
void PD_inriaImp::load(const string &path)
{
// Training set
train.push_back(vector< Ptr<Object> >());
loadDataset(path, "Train", train.back());
// Testing set
test.push_back(vector< Ptr<Object> >());
loadDataset(path, "Test", test.back());
// There is no validation set
validation.push_back(vector< Ptr<Object> >());
}
void PD_inriaImp::readTextLines(const string filename, vector< string > &lines)
{
ifstream in(filename.c_str());
string error_message = "";
if (!in.is_open())
{
error_message = format("Unable to open file: \n%s\n", filename.c_str());
CV_Error(Error::StsBadArg, error_message);
}
string currline = "";
while (getline(in, currline))
lines.push_back(currline);
}
void PD_inriaImp::parseAnnotation(const string filename, Ptr< PD_inriaObj > &object)
{
string error_message = "";
ifstream in(filename.c_str());
if (!in.is_open())
{
error_message = format("Unable to open file: \n%s\n", filename.c_str());
CV_Error(Error::StsBadArg, error_message);
}
string imageSizeHeader = "Image size (X x Y x C) : ";
string imageSizeFmt = imageSizeHeader + "%d x %d x %d";
string objWithGTHeader = "Objects with ground truth : ";
string objWithGTFmt = objWithGTHeader + "%d { \"PASperson\" }";
string boundBoxHeader = "Bounding box for object ";
string boundBoxFmt = boundBoxHeader + "%*d \"PASperson\" (Xmin, Ymin) - (Xmax, Ymax) : (%d, %d) - (%d, %d)";
string line = "";
int width = 0;
int height = 0;
int depth = 0;
int xmin, ymin, xmax, ymax;
int numObjects = 0;
while (getline(in, line))
{
if (line[0] == '#' || !line[0])
continue;
if (strstr(line.c_str(), imageSizeHeader.c_str()))
{
sscanf(line.c_str(), imageSizeFmt.c_str(), &width, &height, &depth);
object->width = width;
object->height = height;
object->depth = depth;
}
else if (strstr(line.c_str(), objWithGTHeader.c_str()))
{
sscanf(line.c_str(), objWithGTFmt.c_str(), &numObjects);
if (numObjects <= 0)
break;
}
else if (strstr(line.c_str(), boundBoxHeader.c_str()))
{
sscanf(line.c_str(), boundBoxFmt.c_str(), &xmin, &ymin, &xmax, &ymax);
Rect bndbox;
bndbox.x = xmin;
bndbox.y = ymin;
bndbox.width = xmax - xmin;
bndbox.height = ymax - ymin;
(object->bndboxes).push_back(bndbox);
}
}
CV_Assert((object->bndboxes).size() == (unsigned int)numObjects);
}
void PD_inriaImp::loadDataset(const string &path, const string nameImageSet, vector< Ptr<Object> > &imageSet)
{
string listAnn = path + nameImageSet + "/annotations.lst";
string listPos = path + nameImageSet + "/pos.lst";
string listNeg = path + nameImageSet + "/neg.lst";
vector< string > fsAnn;
vector< string > fsPos;
vector< string > fsNeg;
// read file names
readTextLines(listAnn, fsAnn);
readTextLines(listPos, fsPos);
readTextLines(listNeg, fsNeg);
CV_Assert(fsAnn.size() == fsPos.size());
for (unsigned int i = 0; i < fsPos.size(); i++)
{
Ptr<PD_inriaObj> curr(new PD_inriaObj);
parseAnnotation(path + fsAnn[i], curr);
curr->filename = path + fsPos[i];
curr->sType = POS;
imageSet.push_back(curr);
}
for (unsigned int i = 0; i < fsNeg.size(); i++)
{
Ptr<PD_inriaObj> curr(new PD_inriaObj);
curr->filename = path + fsNeg[i];
curr->sType = NEG;
imageSet.push_back(curr);
}
}
Ptr<PD_inria> PD_inria::create()
{
return Ptr<PD_inriaImp>(new PD_inriaImp);
}
}
}
Loading…
Cancel
Save