OpenCV Latent SVM Discriminatively Trained Part Based Models for Object Detection

來源:互聯網
上載者:User

OpenCV 2.4版本實現了C++版本的DPM程式,和之前C版本的主要區別就是可以同時檢測多種目標。使用時,可以把訓練好的模型放到一個檔案夾中,待檢測的映像放到另一個檔案夾中,即可檢測。

可惜沒有考慮加速的內容。

 

Latent SVM¶

Discriminatively Trained Part Based Models for Object Detection¶

The object detector described below has been initially proposed by P.F. Felzenszwalb in[Felzenszwalb2010].  It is based
on a Dalal-Triggs detector that uses a single filter on histogram of oriented gradients (HOG) features to represent an object category. This detector uses a sliding window approach, where a filter is applied at all positions and scales of an image. The first
innovation is enriching the Dalal-Triggs model using a star-structured part-based model defined by a “root” filter (analogous to the Dalal-Triggs filter) plus a set of parts filters and associated deformation models. The score of one of star models at a particular
position and scale within an image is the score of the root filter at the given location plus the sum over parts of the maximum, over placements of that part, of the part filter score on its location minus a deformation cost easuring the deviation of the part
from its ideal location relative to the root. Both root and part filter scores are defined by the dot product between a filter (a set of weights) and a subwindow of a feature pyramid computed from the input image. Another improvement is a representation of
the class of models by a mixture of star models. The score of a mixture model at a particular position and scale is the maximum over components, of the score of that component model at the given location.

In OpenCV there are C implementation of Latent SVM and C++ wrapper of it. C version is the structureCvObjectDetection
and a set of functions working with this structure (seecvLoadLatentSvmDetector(),cvReleaseLatentSvmDetector(),cvLatentSvmDetectObjects()).
C++ version is the classLatentSvmDetector
and has slightly different functionality in contrast with C version - it supports loading and detection of several models.

There are two examples of Latent SVM usage:
samples/c/latentsvmdetect.cppandsamples/cpp/latentsvm_multidetect.cpp.

 

代碼如下:

#include <iostream>#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/contrib/contrib.hpp"#ifdef WIN32#include <io.h>#else#include <dirent.h>#endif#ifdef HAVE_CVCONFIG_H#include <cvconfig.h>#endif#ifdef HAVE_TBB#include "tbb/task_scheduler_init.h"#endifusing namespace std;using namespace cv;static void help(){    cout << "This program demonstrated the use of the latentSVM detector." << endl <<            "It reads in a trained object models and then uses them to detect the objects in an images." << endl <<             endl <<            "Call:" << endl <<            "./latentsvm_multidetect <imagesFolder> <modelsFolder> [<overlapThreshold>][<threadsNumber>]" << endl <<            "<overlapThreshold> - threshold for the non-maximum suppression algorithm." << endl <<            "Example of <modelsFolder> is opencv_extra/testdata/cv/latentsvmdetector/models_VOC2007" << endl <<             endl <<            "Keys:" << endl <<            "'n' - to go to the next image;" << endl <<            "'esc' - to quit." << endl <<            endl;}static void detectAndDrawObjects( Mat& image, LatentSvmDetector& detector, const vector<Scalar>& colors, float overlapThreshold, int numThreads ){    vector<LatentSvmDetector::ObjectDetection> detections;    TickMeter tm;    tm.start();    detector.detect( image, detections, overlapThreshold, numThreads);    tm.stop();    cout << "Detection time = " << tm.getTimeSec() << " sec" << endl;    const vector<string> classNames = detector.getClassNames();    CV_Assert( colors.size() == classNames.size() );    for( size_t i = 0; i < detections.size(); i++ )    {        const LatentSvmDetector::ObjectDetection& od = detections[i];        rectangle( image, od.rect, colors[od.classID], 3 );    }    // put text over the all rectangles    for( size_t i = 0; i < detections.size(); i++ )    {        const LatentSvmDetector::ObjectDetection& od = detections[i];        putText( image, classNames[od.classID], Point(od.rect.x+4,od.rect.y+13), FONT_HERSHEY_SIMPLEX, 0.55, colors[od.classID], 2 );    }}static void readDirectory( const string& directoryName, vector<string>& filenames, bool addDirectoryName=true ){    filenames.clear();#ifdef WIN32    struct _finddata_t s_file;    string str = directoryName + "\\*.*";    intptr_t h_file = _findfirst( str.c_str(), &s_file );    if( h_file != static_cast<intptr_t>(-1.0) )    {        do        {            if( addDirectoryName )                filenames.push_back(directoryName + "\\" + s_file.name);            else                filenames.push_back((string)s_file.name);        }        while( _findnext( h_file, &s_file ) == 0 );    }    _findclose( h_file );#else    DIR* dir = opendir( directoryName.c_str() );    if( dir != NULL )    {        struct dirent* dent;        while( (dent = readdir(dir)) != NULL )        {            if( addDirectoryName )                filenames.push_back( directoryName + "/" + string(dent->d_name) );            else                filenames.push_back( string(dent->d_name) );        }    }#endif    sort( filenames.begin(), filenames.end() );}int main(int argc, char* argv[]){    help();    string images_folder, models_folder;    float overlapThreshold = 0.2f;    int numThreads = -1;    if( argc > 2 )    {        images_folder = argv[1];        models_folder = argv[2];        if( argc > 3 ) overlapThreshold = (float)atof(argv[3]);        if( overlapThreshold < 0 || overlapThreshold > 1)        {            cout << "overlapThreshold must be in interval (0,1)." << endl;            exit(-1);        }        if( argc > 4 ) numThreads = atoi(argv[4]);    }    vector<string> images_filenames, models_filenames;    readDirectory( images_folder, images_filenames );    readDirectory( models_folder, models_filenames );    LatentSvmDetector detector( models_filenames );    if( detector.empty() )    {        cout << "Models cann't be loaded" << endl;        exit(-1);    }    const vector<string>& classNames = detector.getClassNames();    cout << "Loaded " << classNames.size() << " models:" << endl;    for( size_t i = 0; i < classNames.size(); i++ )    {        cout << i << ") " << classNames[i] << "; ";    }    cout << endl;    cout << "overlapThreshold = " << overlapThreshold << endl;    vector<Scalar> colors;    generateColors( colors, detector.getClassNames().size() );    for( size_t i = 0; i < images_filenames.size(); i++ )    {        Mat image = imread( images_filenames[i] );        if( image.empty() )  continue;        cout << "Process image " << images_filenames[i] << endl;        detectAndDrawObjects( image, detector, colors, overlapThreshold, numThreads );        imshow( "result", image );        for(;;)        {            int c = waitKey();            if( (char)c == 'n')                break;            else if( (char)c == '\x1b' )                exit(0);        }    }    return 0;}

 上傳個結果吧,圖片有著作權,切勿轉載。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.