From ccc5d38ced19cd4596a669607d8f544dd74a1f4b Mon Sep 17 00:00:00 2001 From: Scott Klum Date: Wed, 20 May 2015 12:24:58 -0400 Subject: [PATCH] Using .vec and .txt galleries for training --- openbr/plugins/gallery/vec.cpp | 10 +++++++++- openbr/plugins/imgproc/slidingwindow.cpp | 86 ++------------------------------------------------------------------------------------ openbr/plugins/io/read.cpp | 12 ++++++++---- 3 files changed, 19 insertions(+), 89 deletions(-) diff --git a/openbr/plugins/gallery/vec.cpp b/openbr/plugins/gallery/vec.cpp index 545359e..2b96aa5 100644 --- a/openbr/plugins/gallery/vec.cpp +++ b/openbr/plugins/gallery/vec.cpp @@ -3,6 +3,12 @@ namespace br { +/*! + * \ingroup galleries + * \brief Reads/writes OpenCV's .vec format. + * \author Scott Klum \cite sklum + */ + class vecGallery : public Gallery { Q_OBJECT @@ -56,7 +62,9 @@ class vecGallery : public Gallery for (int r = 0; r < height; r++) for (int c = 0; c < width; c++) m.ptr(r)[c] = (uchar)vec[r*width+c]; - templates.append(Template(m)); + Template t(m); + t.file.set("Label",1); + templates.append(t); } return templates; diff --git a/openbr/plugins/imgproc/slidingwindow.cpp b/openbr/plugins/imgproc/slidingwindow.cpp index 030a824..49df253 100644 --- a/openbr/plugins/imgproc/slidingwindow.cpp +++ b/openbr/plugins/imgproc/slidingwindow.cpp @@ -30,7 +30,6 @@ namespace br /*! * \ingroup transforms * \brief Applies a classifier to a sliding window. - * Discards negative detections. * \author Jordan Cheney \cite JordanCheney */ @@ -40,93 +39,12 @@ class SlidingWindowTransform : public Transform Q_PROPERTY(br::Classifier *classifier READ get_classifier WRITE set_classifier RESET reset_classifier STORED false) Q_PROPERTY(QString cascadeDir READ get_cascadeDir WRITE set_cascadeDir RESET reset_cascadeDir STORED false) - Q_PROPERTY(QString vecFile READ get_vecFile WRITE set_vecFile RESET reset_vecFile STORED false) - Q_PROPERTY(QString negFile READ get_negFile WRITE set_negFile RESET reset_negFile STORED false) - BR_PROPERTY(br::Classifier *, classifier, NULL) BR_PROPERTY(QString, cascadeDir, "") - BR_PROPERTY(QString, vecFile, "vec.vec") - BR_PROPERTY(QString, negFile, "neg.txt") - - QList getPos() - { - FILE *file = fopen(vecFile.toStdString().c_str(), "rb"); - if ( !file ) - qFatal("Couldn't open the file"); - - short* vec = 0; - int count, vecSize, last, base; - - short tmp = 0; - if( fread( &count, sizeof( count ), 1, file ) != 1 || - fread( &vecSize, sizeof( vecSize ), 1, file ) != 1 || - fread( &tmp, sizeof( tmp ), 1, file ) != 1 || - fread( &tmp, sizeof( tmp ), 1, file ) != 1 ) - CV_Error_( CV_StsParseError, ("wrong file format for %s\n", qPrintable(vecFile)) ); - base = sizeof( count ) + sizeof( vecSize ) + 2*sizeof( tmp ); - - last = 0; - vec = (short*) cvAlloc( sizeof( *vec ) * vecSize ); - CV_Assert( vec ); - - QList posImages; - for (int i = 0; i < 35770; i++) { - Mat pos(24, 24, CV_8UC1); - - CV_Assert( pos.rows * pos.cols == vecSize ); - uchar tmp = 0; - size_t elements_read = fread( &tmp, sizeof( tmp ), 1, file ); - if( elements_read != 1 ) - CV_Error( CV_StsBadArg, "Can not get new positive sample. The most possible reason is " - "insufficient count of samples in given vec-file.\n"); - elements_read = fread( vec, sizeof( vec[0] ), vecSize, file ); - if( elements_read != (size_t)(vecSize) ) - CV_Error( CV_StsBadArg, "Can not get new positive sample. Seems that vec-file has incorrect structure.\n"); - - if( feof( file ) || last++ >= count ) - CV_Error( CV_StsBadArg, "Can not get new positive sample. vec-file is over.\n"); - - for( int r = 0; r < pos.rows; r++ ) - for( int c = 0; c < pos.cols; c++ ) - pos.ptr(r)[c] = (uchar)vec[r * pos.cols + c]; - posImages.append(pos); - } - return posImages; - } - - QList getNeg() - { - QList negs; - - QStringList lines; - QtUtils::readFile(negFile,lines); - foreach(const QString &line, lines) { - if (line[0] == QChar('#')) continue; - else negs.append(imread(qPrintable(line), CV_LOAD_IMAGE_GRAYSCALE)); - } - return negs; - } - - void train(const TemplateList &_data) + void train(const TemplateList &data) { - (void)_data; - - QList posImages = getPos(); - QList negImages = getNeg(); - - QList images; QList labels; - foreach (const Mat &pos, posImages) { - images.append(pos); - labels.append(1.); - } - - foreach (const Mat &neg, negImages) { - images.append(neg); - labels.append(0.); - } - - classifier->train(images, labels); + classifier->train(data.data(), File::get(data, "Label", -1)); } void project(const Template &src, Template &dst) const diff --git a/openbr/plugins/io/read.cpp b/openbr/plugins/io/read.cpp index 1450c55..422de4a 100644 --- a/openbr/plugins/io/read.cpp +++ b/openbr/plugins/io/read.cpp @@ -15,7 +15,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include - +#include #include using namespace cv; @@ -59,9 +59,13 @@ private: else dst.file.fte = true; } else { foreach (const Mat &m, src) { - const Mat img = imdecode(m, mode); - if (img.data) dst.append(img); - else dst.file.fte = true; + if (((m.rows > 1) && (m.cols > 1)) || (m.type() != CV_8UC1)) + dst += m; + else { + const Mat img = imdecode(m, mode); + if (img.data) dst.append(img); + else dst.file.fte = true; + } } } if (dst.file.fte) -- libgit2 0.21.4