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

ProgRoman

Пользователи
  • Количество публикаций

    190
  • Зарегистрирован

  • Посещение

  • Days Won

    7

Сообщения, опубликованные пользователем ProgRoman


  1. Появился вопрос о алгоритме Latent SVM вроде бы он появился в opencv. Правильно ли я понимаю, что это просто так можно сказать иерархический классификатор. Создаётся каскад на основе svm сперва вычисляется самый слабый классификатор к примеру фигуры человека если у нас есть такой регион и мы его не отмели на начальной фазе то далее используем более сильные(уточняющие) классификаторы к примеру рук, ног, головы и наверно в конце принимается решение ещё исходя и из положения самих уточняющихся объектов


  2. спасибо за ответ,

    меня что смутило, так это низкие проценты в распознавании в 2007 да и для некоторых категорий в 2012 тоже очень низкие

    INRIA_Genetic 0.775 т.е. 77.5% правильно распознанных это в 2007 на aeroplane

    NUSPSL_CTX_GPM_SCM 97.3 уже значительно лучше в 2012 тоже на aeroplane

    для cow 77.8 в 2012

    сейчас думаю, что всё действительно так у самолётов приблизительно даже форма одна и наверно варьируется она не так сильно как к примеру у коровы или у бутылки у которой средняя точность распознавания 60.8

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


  3. У меня вопрос о правильном понимании оценок алгоритмов компьютерного зрения

    Есть Precision(Это точность) считается как общее число положительных срабатываний алгоритма на выборке к общему числу элементов в выборке

    я не очень понимаю чем от Precision отличается Accuracy

    Average Precision (AP)(средняя точность) как я понимаю считается просто как среднее арифметическое всех Precision на выборке

    Recall как я понял это отношение положительных срабатываний к сумме положительных срабатываний и неверно распознанных объектов.

    И ещё такой вопрос не очень понятно почему две таблицы из конкурса PASCAL в 2007 и 2012 годах выглядят настолько различно вроде бы обе в Average Precision

    PASCSL 2007

    PASCAL 2012

    меня интересуют первые таблицы с результатами на этих страницах или их как то по другому надо интерпретировать.


  4. В примерах opencv есть реализация фильтра Габора, ниже привел код

    
    Mat getGaborKernel( Size ksize, double sigma, double theta,
    
                                double lambd, double gamma, double psi, int ktype )
    
    {
    
        double sigma_x = sigma;
    
        double sigma_y = sigma/gamma;
    
        int nstds = 3;
    
        int xmin, xmax, ymin, ymax;
    
        double c = cos(theta), s = sin(theta);
    
    
        if( ksize.width > 0 )
    
            xmax = ksize.width/2;
    
        else
    
            xmax = cvRound(std::max(fabs(nstds*sigma_x*c), fabs(nstds*sigma_y*s)));
    
    
        if( ksize.height > 0 )
    
            ymax = ksize.height/2;
    
        else
    
            ymax = cvRound(std::max(fabs(nstds*sigma_x*s), fabs(nstds*sigma_y*c)));
    
    
        xmin = -xmax;
    
        ymin = -ymax;
    
    
        CV_Assert( ktype == CV_32F || ktype == CV_64F );
    
    
        Mat kernel(ymax - ymin + 1, xmax - xmin + 1, ktype);
    
        double scale = 1/(2*CV_PI*sigma_x*sigma_y);
    
        double ex = -0.5/(sigma_x*sigma_x);
    
        double ey = -0.5/(sigma_y*sigma_y);
    
        double cscale = CV_PI*2/lambd;
    
    
        for( int y = ymin; y <= ymax; y++ )
    
            for( int x = xmin; x <= xmax; x++ )
    
            {
    
                double xr = x*c + y*s;
    
                double yr = -x*s + y*c;
    
    
                double v = scale*exp(ex*xr*xr + ey*yr*yr)*cos(cscale*xr + psi);
    
                if( ktype == CV_32F )
    
                    kernel.at<float>(ymax - y, xmax - x) = (float)v;
    
                else
    
                    kernel.at<double>(ymax - y, xmax - x) = v;
    
            }
    
    
        return kernel;
    
    }
    
    
    у меня почему то результат работы фильтра очень бледный порой вообще практически не заметное изображение, вызываю фильтр таким образом
    
        cv::Mat image = cv::imread("E:/Projects/ComputerVision/Data bases/faces/test/image_0450.jpg",1);
    
        cv::imshow("Src", image);
    
        cv::Mat src;
    
        cv::cvtColor(image, src, CV_BGR2GRAY);
    
        src.convertTo(src_f, CV_64F, 1.0/255, 0);
    
    
        Mat res_f = getGaborKernel(Size(25,25),15,100,30,50,5);
    
        Mat dst;
    
        filter2D(src_f,dst,CV_32F,res_f);
    
        imshow("res",dst);
    
    

    пытался менять параметры пока ничего нормального не нашёл результат фильтра практически не виден dst порой совсем чёрная. Пока пытаюсь всё ещё менять параметры смотрю как меняется изображение. Может кто знает сталкивался с такой проблемой... возможно я какой-то параметр не совсем корректно задаю... ниже прикреплены два изображения одно оригинальное другое после обработки фильтром

    И мне не совсем ясно каким образом фильтр габора можно использовать в распознавании... Имеем оригинальное изображение, затем после обработки фильтром получаем новое обработанное.. и что дальше каким образом использовать это обработанное отфильтрованное изображение... вообще по идее как я понимаю.. мы должны бы к изображению применить фильтры под разным углом(с различным theta) при различном theta отфильтрованное изображение меняется.. но как это всё применять не ясно может быть кто-то занимался этим

    post-2515-0-31051000-1352197790_thumb.pn

    post-2515-0-78006800-1352197799_thumb.pn


  5. если берём оператор большего радиуса он не покрывает меньшие так как считаются только граничные точки т.е. если радиус равен 1 то имеем 8-мь соседей, при увеличении радиуса число соседей будет увеличиваться, но они так же будут браться только по границе окружности, для распознавания я думаю можно как то соорудить сложный LBP, но я видел, что сперва находят гистограмму от lbp изображения а потом только распознают..


  6. numPatterns - это количество шаблонов(всех) оно зависит от соседей.. если их 8 то соответственно имеем 256 различных шаблонов

    
     // get spatial histogram from this lbp image
    
            Mat p = spatial_histogram(
    
                    lbp_image, /* lbp_image */
    
                    static_cast<int>(std::pow(2.0, static_cast<double>(_neighbors))), /* number of possible patterns */
    
                    _grid_x, /* grid size x */
    
                    _grid_y, /* grid size y */
    
                    true);
    
    

    нашёл в исходниках opencv поэтому вопрос снимается, всё разрешилось :)


  7. да мне как-то казалось, что зачем их число задавать... странно же... тем более этих uniform patterns не так уж много

    тем более они создают гистограмму

    hist = Mat::zeros(1, numPatterns, CV_32SC1);
    а потом записывают туда значения
     int bin = src.at<_Tp>(i,j);
    
     hist.at<int>(0,bin) += 1;

    где bin может быть от 0.. 255 ну из LBP преобразования.. поэтому я думаю всё же вряд ли это uniform patterns


  8. Добрый день, разбираюсь с оператором LBP ссылки ниже

    wiki_Local_binary_patterns

    habrahabr

    сама процедура получения из изображения LBP изображения понятна..

    ниже приведу ссылки с исходниками для построения LBP и гистограммы

    LBP

    histogram

    так вот мне не очень понятно в процедуре построения гистограммы что такое numPatterns

    
    template <typename _Tp>
    
    void lbp::histogram_(const Mat& src, Mat& hist, int numPatterns) {
    
    	hist = Mat::zeros(1, numPatterns, CV_32SC1);
    
    	for(int i = 0; i < src.rows; i++) {
    
    		for(int j = 0; j < src.cols; j++) {
    
    			int bin = src.at<_Tp>(i,j);
    
    			hist.at<int>(0,bin) += 1;
    
    		}
    
    	}
    
    }
    
    


  9. как можно сделать трекинг автомобилей если применять только каскад код был выше, то удовлетворительных результатов я пока не добился, бывает что он просто даже на кадре где есть машины не может отметить их (пишет что интересующих объектов нету)... возможно лучше будет оптический потом или что-то другое?..


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

    
    String cascade_name1 = "haarcascade_car_1.xml";
    
    String cascade_name2 = "cars3.xml";
    
    String window_name = "tracing objects";
    
    CascadeClassifier cascade1;
    
    CascadeClassifier cascade2;
    
    
    void detectAndDisplay(Mat frame)
    
    {
    
      vector<Rect> objects1;
    
      vector<Rect> objects2;
    
      Mat frame_gray;
    
    
      cvtColor(frame, frame_gray, CV_BGR2GRAY);
    
      equalizeHist(frame_gray, frame_gray);
    
    
      //-- Detect 
    
      cascade1.detectMultiScale(frame_gray, objects1, 1.2, 2, 0|CV_HAAR_SCALE_IMAGE, Size(60, 60));
    
      cascade2.detectMultiScale(frame_gray, objects2, 1.2, 2, 0|CV_HAAR_SCALE_IMAGE, Size(60, 60));
    
    
      for( int i = 0; i < objects1.size(); i++ )
    
      {
    
        Point center( objects1[i].x + objects1[i].width*0.5, objects1[i].y + objects1[i].height*0.5 );
    
        ellipse( frame, center, Size( objects1[i].width*0.5, objects1[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
    
    
        Mat objROI = frame_gray( objects1[i] );        
    
      }
    
    
      for( int i = 0; i < objects2.size(); i++ )
    
      {
    
        Point center( objects2[i].x + objects2[i].width*0.5, objects2[i].y + objects2[i].height*0.5 );
    
        ellipse( frame, center, Size( objects2[i].width*0.5, objects2[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
    
    
        Mat objROI = frame_gray( objects2[i] );        
    
      }
    
    
      //-- Show what you got
    
      imshow( window_name, frame );
    
     }
    
    
    int _tmain(int argc, char** argv)
    
    {
    
    	VideoCapture cap;
    
    	cap.open("racing.mp4");
    
    
    	if( !cascade1.load( cascade_name1 ) ){ printf("--(!)Error loading cascad!\n"); return -1; };
    
    	if( !cascade2.load( cascade_name2 ) ){ printf("--(!)Error loading cascad!\n"); return -1; };
    
    
    	if(!cap.isOpened()) return -1;
    
    
    	while(true)
    
    	{
    
    		Mat frame;
    
                    cap >> frame;
    
    		if(frame.empty()) break;		
    
    		detectAndDisplay(frame);
    
    		//imshow("video",frame);
    
    		char c = waitKey(1);
    
    		if(c==27) break;
    
    	}
    
    
    	return 0;
    
    }
    
    
    


  11. спасибо параметры подкрутил вроде бы заработало быстрее конечно..

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

    нашёл ролик по детекции автомобилей с уже обученным каскадом ссылка

    повторить удалось но единственно начал проверять на других видео и оказалось, что он довольно плохо работает с автомобилями которые проезжают мимо он их будто вообще не видит к примеру когда автомобиль обгоняет вас или наоборот вы обгоняете другой автомобиль как это можно исправить

  12. Добрый день, у меня вопрос я повторил программу cascade-classifier

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

    
    // testdetect.cpp: определяет точку входа для консольного приложения.
    
    //
    
    #include "stdafx.h"
    
    
    #include <opencv2\core\core.hpp>
    
    #include <opencv2\highgui\highgui.hpp>
    
    #include <opencv2\imgproc\imgproc.hpp>
    
    #include <opencv2\ml\ml.hpp>
    
    #include <opencv2\features2d\features2d.hpp>
    
    #include <opencv2\objdetect\objdetect.hpp>
    
    #include <opencv2\video\tracking.hpp>
    
    
    #include <Windows.h>
    
    #include <string.h>
    
    #include <iostream>
    
    #include <stdio.h>
    
    #include <math.h>
    
    
    using namespace cv;
    
    using namespace std;
    
    
    #define MAX(a, ((a< ? b : a);
    
    #define MIN(a, ((a< ? a : ;
    
    
    String face_cascade_name = "haarcascade_frontalface_alt.xml";
    
    String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
    
    String window_name = "tracing face";
    
    CascadeClassifier face_cascade;
    
    CascadeClassifier eyes_cascade;
    
    
    void detectAndDisplay( Mat frame )
    
    {
    
      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 );
    
     }
    
    
    int _tmain(int argc, char** argv)
    
    {
    
    	VideoCapture cap;
    
    	cap.open("video.mp4");
    
    
    	face_cascade.load(face_cascade_name);
    
    	eyes_cascade.load(eyes_cascade_name);
    
    
    	if(!cap.isOpened()) return -1;
    
    
    	while(true)
    
    	{
    
    		Mat frame;
    
                    cap >> frame;
    
    		if(frame.empty()) break;		
    
    		detectAndDisplay( frame );
    
    		//imshow("video",frame);
    
    		char c = waitKey(10);
    
    		if(c==27) break;
    
    	}
    
    
    	return 0;
    
    }
    
    [/code]


  13. Добрый день, возник такой вопрос есть ли дескрипторы которые можно использовать к примеру для трекинга и распознавания простых геометрических фигур ну т.е. круг, треугольник, квадрат.. с простой текстурой.. пробовал SIFT и SURF но они с простыми формами не очень хорошо работают.. в качестве базы данных для тестирования использую дорожные знаки

    • Like 1

  14. Сейчас смотрю курс Оптимизация энергии в задачах компьютерного зрения и алгоритмы на графах

    и у меня возник вопрос есть ли алгоритмы или примеры применения алгоритмов на графах к распознаванию изображений(объектов) не сегментация изображений, а распознавание


  15. Ещё вопрос по DistanceTransform как вычислить расстояние по нему от одного объекта до другого..в DistanceTransform хранятся расстояния до ближайшего края т.е. что бы получить ответ вроде бы надо строить к примеру пирамиду шаблона и её накладывать на нашу сцену потом ею двигать, пройтись скользящим окном по всей сцене и найти лучший отклик или отклики...


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

    
            Mat img1 = imread(path1, CV_LOAD_IMAGE_GRAYSCALE);
    
    
            Mat gim1,gim2,gim3;
    
            Canny(img1,gim1,50,250,3);
    
    	gim2 = 1-gim1/255;
    
    	distanceTransform(gim2,gim3,CV_DIST_L2,3);
    
    
            normalize(gim3,gim3,0.0,1.0,NORM_MINMAX);
    
    	imshow("original",img1);
    
    	imshow("Canny",gim2*255);
    
    	imshow("distanceTransform",gim3);
    
    

    post-2515-0-60273100-1335269796_thumb.jp

    post-2515-0-67671700-1335269807_thumb.jp


  17. Не могу разобраться как по distanceTransform понимать форму объекта к примеру круг, треугольник или прямоугольник...

    тут вроде бы написано что можно и что делали так, но как эту информация использовать для узнавания этих фигур пока идей нету

    http://www.lektorium.tv/lecture/?id=13539

    там видео лекция и презентация


  18. и ещё вопрос в этой статье есть раздел

    Уточнение особых точек

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

    Первым делом определяются координаты особой точки с субпиксельной точностью. Это достигается с помощью аппроксимирования функции DoG многочленом Тейлора второго порядка, взятого в точке вычисленного экстремума.

    и приводится формула...

    я думал что особые точки проверяются не разложением а вот такой формулой из http://courses.graphicon.ru/files/courses/vision/2011/lectures/cv2011_05_features.pdf

    R=det(M)-k(trace(M))^2, где k=0.04-0.06 или просто отношение R=det(M)/trace(M)

    или я что-то не то понял?)


  19. ок спасибо по цвету сейчас смотрю..

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


  20. Добрый день, как можно реализовать Blob detector почитал в интернете и как я понял он строится на основе разности гаусиан

    
            int sz,rd,k;
    
            GaussianBlur(img1,gim1,Size(sz,sz),rd);
    
    	GaussianBlur(img1,gim2,Size(sz,sz),k*rd);
    
    	Mat nimg = gim2-gim1;
    
    

    как я понимаю rd это радиус блоба sz размер гауссова ядра, не совсем понятно как задаётя sz он один для всех rd или нет... как задаётся сам радиус блоба rd и значение k как задаётся просто последовательно от 1 и до какого-то значения...


  21. Да мне тоже кажется что в HSV всё таки лучше.. единственно что картинки темнее получаются...первое изображение оригинал второе в HSV третье в YCrCb

    post-2515-0-39569200-1334135458_thumb.jp

    post-2515-0-84676800-1334135468_thumb.jp

    post-2515-0-32733800-1334135477_thumb.jp

×