Перейти к содержимому
Compvision.ru
nikrubab

Какой метод распознавания тут используется?

Recommended Posts

Всем доброго времени суток!

Как говорится ,чем дальше в лес,тем больше дров! :)

вот и в моем случае так же.

Изначально надо было лишь организовать подсчет распознанных лиц в кадре.но как только с этой задачей справился,стало интересно на основе какого метода все это дело у меня работает.Стал читать и еще больше запутался...

Кто может подсказать ,по какому методу идет распознавание лиц в этом

;) { // Capture the frame and load it in IplImage if( !cvGrabFrame( capture )) break; frame = cvRetrieveFrame( capture ); // If the frame does not exist, quit the loop if( !frame ) break; // Allocate framecopy as the same size of the frame if( !frame_copy ) frame_copy = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels ); // Check the origin of image. If top left, copy the image frame to frame_copy. if( frame->origin == IPL_ORIGIN_TL ) cvCopy( frame, frame_copy, 0 ); // Else flip and copy the image else cvFlip( frame, frame_copy, 0 ); // Call the function to detect and draw the face detect_and_draw( frame_copy ); // Wait for a while before proceeding to the next frame if( cvWaitKey( 10 ) >= 0 ) break; } // Release the images, and capture memory cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } // If the capture is not loaded succesfully, then: else { // Assume the image to be lena.jpg, or the input_name specified const char* filename = input_name ? input_name : (char*)"lena.jpg"; // Load the image from that filename IplImage* image = cvLoadImage( filename, 1 ); // If Image is loaded succesfully, then: if( image ) { // Detect and draw the face detect_and_draw( image ); // Wait for user input cvWaitKey(0); // Release the image memory cvReleaseImage( &image ); } else { /* assume it is a text file containing the list of the image filenames to be processed - one per line */ FILE* f = fopen( filename, "rt" ); if( f ) { char buf[1000+1]; // Get the line from the file while( fgets( buf, 1000, f ) ) { // Remove the spaces if any, and clean up the name int len = (int)strlen(buf); while( len > 0 && isspace(buf[len-1]) ) len--; buf[len] = '\0'; // Load the image from the filename present in the buffer image = cvLoadImage( buf, 1 ); // If the image was loaded succesfully, then: if( image ) { // Detect and draw the face from the image detect_and_draw( image ); // Wait for the user input, and release the memory cvWaitKey(0); cvReleaseImage( &image ); } } // Close the file fclose(f); } } } // Destroy the window previously created with filename: "result" cvDestroyWindow("result"); // return 0 to indicate successfull execution of the program return 0; } // Function to detect and draw any faces that is present in an image void detect_and_draw( IplImage* img ) { int scale = 1; // Create a new image based on the input image IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 ); // Create two points to represent the face locations CvPoint pt1, pt2; int i; // Clear the memory storage which was used before cvClearMemStorage( storage ); // Find whether the cascade is loaded, to find the faces. If yes, then: if( cascade ) { // There can be more than one face in an image. So create a growable sequence of faces. // Detect the objects and store them in the sequence CvSeq* faces = cvHaarDetectObjects( img, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(40, 40) ); // Loop the number of faces found. for( i = 0; i < (faces ? faces->total : 0); i++ ) { // Create a new rectangle for drawing the face CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); // Find the dimensions of the face,and scale it if necessary pt1.x = r->x*scale; pt2.x = (r->x+r->width)*scale; pt1.y = r->y*scale; pt2.y = (r->y+r->height)*scale; // Draw the rectangle in the input image cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 ); } } // Show the image in the window named "result" cvShowImage( "result", img ); // Release the temp image created. cvReleaseImage( &temp ); }
// OpenCV Sample Application: facedetect.c


// Include header files

#include "cv.h"

#include "highgui.h"


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

#include <math.h>

#include <float.h>

#include <limits.h>

#include <time.h>

#include <ctype.h>


// Create memory for calculations

static CvMemStorage* storage = 0;


// Create a new Haar classifier

static CvHaarClassifierCascade* cascade = 0;


// Function prototype for detecting and drawing an object from an image

void detect_and_draw( IplImage* image );


// Create a string that contains the cascade name

const char* cascade_name =

    "haarcascade_frontalface_alt.xml";

/*    "haarcascade_profileface.xml";*/


// Main function, defines the entry point for the program.

int main( int argc, char** argv )

{


    // Structure for getting video from camera or avi

    CvCapture* capture = 0;


    // Images to capture the frame from video or camera or from file

    IplImage *frame, *frame_copy = 0;


    // Used for calculations

    int optlen = strlen("--cascade=");


    // Input file name for avi or image file.

    const char* input_name;


    // Check for the correct usage of the command line

    if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 )

    {

        cascade_name = argv[1] + optlen;

        input_name = argc > 2 ? argv[2] : 0;

    }

    else

    {

        fprintf( stderr,

        "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );

        return -1;

        /*input_name = argc > 1 ? argv[1] : 0;*/

    }


    // Load the HaarClassifierCascade

    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );


    // Check whether the cascade has loaded successfully. Else report and error and quit

    if( !cascade )

    {

        fprintf( stderr, "ERROR: Could not load classifier cascade\n" );

        return -1;

    }


    // Allocate the memory storage

    storage = cvCreateMemStorage(0);


    // Find whether to detect the object from file or from camera.

    if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )

        capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );

    else

        capture = cvCaptureFromAVI( input_name ); 


    // Create a new named window with title: result

    cvNamedWindow( "result", 1 );


    // Find if the capture is loaded successfully or not.


    // If loaded succesfully, then:

    if( capture )

    {

        // Capture from the camera.

        for(;
и в этом
#include "opencv2/objdetect/objdetect.hpp"

 #include "opencv2/highgui/highgui.hpp"

 #include "opencv2/imgproc/imgproc.hpp"


 #include <iostream>

 #include <stdio.h>


 using namespace std;

 using namespace cv;


 /** Function Headers */

 void detectAndDisplay( Mat frame );


 /** Global variables */

 String face_cascade_name = "haarcascade_frontalface_alt.xml";

 String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";

 CascadeClassifier face_cascade;

 CascadeClassifier eyes_cascade;

 string window_name = "Capture - Face detection";

 RNG rng(12345);


 /** @function main */

 int main( int argc, const char** argv )

 {

   CvCapture* capture;

   Mat frame;


   //-- 1. Load the cascades

   if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };

   if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };


   //-- 2. Read the video stream

   capture = cvCaptureFromCAM( -1 );

   if( capture )

   {

     while( true )

     {

   frame = cvQueryFrame( capture );


   //-- 3. Apply the classifier to the frame

       if( !frame.empty() )

       { detectAndDisplay( frame ); }

       else

       { printf(" --(!) No captured frame -- Break!"); break; }


       int c = waitKey(10);

       if( (char)c == 'c' ) { break; }

      }

   }

   return 0;

 }


/** @function detectAndDisplay */

void detectAndDisplay( Mat frame )

{

  std::vector<Rect> faces;

  Mat frame_gray;


  cvtColor( frame, frame_gray, CV_BGR2GRAY );

  equalizeHist( frame_gray, frame_gray );


  //-- Detect faces

  face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );


  for( int i = 0; i < faces.size(); i++ )

  {

    Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );

    ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );


    Mat faceROI = frame_gray( faces[i] );

    std::vector<Rect> eyes;


    //-- In each face, detect eyes

    eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );


    for( int j = 0; j < eyes.size(); j++ )

     {

       Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );

       int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );

       circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );

     }

  }

  //-- Show what you got

  imshow( window_name, frame );

 }

примерах с сайта 1 и 2 соответственно .

Там что то про Виола-Джонс говорится,но насколько я понял,Виола-Джонс это набор нескольких методов ,то есть это скорей методика.

Проясните пожалуйста :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

спасибо за ответ!

то есть в этом коде реализован метод Виолы-Джонса и это полностью самостоятельный метод, такой как например "Скрытые Марковские модели" или "Метод главных компонент" ??

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в общем да, но вы сравниваете черное с круглым :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в общем да, но вы сравниваете черное с круглым :)

я просто делаю обзорную часть и мне надо описать метод который тут используется.

исходя из вашего последнего замечания и пришел к выводу что сослаться на Виола-Джонса будет не совсем корректно.

а как тогда пояснить это можно?ну что бы было не как "черное с круглым" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да нет, метод Виолы-Джонса - это метод детектирования объектов на изображениях.

PCA - метод главных компонент (погуглите). Это не детектор. Но метод мат. статистики применяемый и для распознавания лиц в том числе. Может применяться, в принципе, к чему угодно.

HMM - это вообще статистическая модель процесса. Тоже не детектор, но тоже иногда используется для детектирования (дополняется при этом признаками, например векторами коэффициентов дискретного косинусного преобразования фрагментов изображения).

Но в контексте распознавания объектов эти названия используются, так что большой ошибки нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да нет, метод Виолы-Джонса - это метод детектирования объектов на изображениях.

PCA - метод главных компонент (погуглите). Это не детектор. Но метод мат. статистики применяемый и для распознавания лиц в том числе. Может применяться, в принципе, к чему угодно.

HMM - это вообще статистическая модель процесса. Тоже не детектор, но тоже иногда используется для детектирования (дополняется при этом признаками, например векторами коэффициентов дискретного косинусного преобразования фрагментов изображения).

Но в контексте распознавания объектов эти названия используются, так что большой ошибки нет.

хорошо,допустим что так.

тогда не понятно следующее.мне надо обосновать выбор Виолы-Джонса и произвести сравнительный анализ аналогичных методов.так вот чем больше читал тем больше запутывался :)

Виола-Джонс это вообще никак не альтернатива PCA ,HMM ?это что то другое?

Вы пишите "РСА ....применяемый и для распознавания лиц в том числе" то есть по сути выступает как замена Виолы??

И да,самое главное,в приведенных мною выше примерах в основе что ?Как описать код можно?Что там реализован метод Виолы-Джонса и точка?или там смесь разных алгоритмов,в том числе РСА,НММ ?

сорри что походу туплю,но сроки жмут и откладывать некуда дальше..

спасибо за понимание!:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Метод Виолы-Джонса самый быстрый и точный ДЕТЕКТОР на сегодняшний день.

Методы PCA, и HMM применяются обычно к уже найденным детектором лицам и применяются для узнавания человека (или уточнения класса объекта).

В коде выше только метод Виолы-Джонса.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Метод Виолы-Джонса самый быстрый и точный ДЕТЕКТОР на сегодняшний день.

Методы PCA, и HMM применяются обычно к уже найденным детектором лицам и применяются для узнавания человека (или уточнения класса объекта).

В коде выше только метод Виолы-Джонса.

супер!очень доступно!спасибо Вам огромное!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Детектор и распознаватель в общем случае разные вещи.

т.к. детектор определяет принадлежность к общему классу лиц, а распознаватель относит к подкласу лиц, т.е. конкретному индивиду.

по сути это всё бинарные классификаторы лицо - не лицо, которые применяются для скользящей по изображению рамки заданного размера.

метод Виолы-Джонса

построен каскадной модели слабые фичи объединяются в каскад(вроде это называется boosting аля adaboost), что позволяет быстрее отсекать заведомо неверные варианты на ранних этапах каскада.

можно было бы построить детектор и на SVM и на нейросетях и т.д. (просто само детектирование занимало бы дольше, а вот насчёт точности и скорости\простоты обучения я думаю Виола-Джонс может и проиграть)

а простейший метод это просто смотреть разницу вектора фич по какой либо метрике(самый простой случай евклидова метрика и просто пиксели)

PCA это просто метод сокращения размерности вектора фич (вроде как это даже не добавляет точности(может только уменьшить, т.к. "сжатие как бы с потерей", а просто сокращает размерность для более быстрой работы сравнения)

хотя я так подумал может и добавить точности, если в исходных данных присутствовали шумы, но я не уверен.

хотя вот на википедии пишут

in some cases, data analysis such as regression or classification can be done in the reduced space more accurately than in the original space.

https://en.wikipedia.org/wiki/Dimensionality_reduction

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×