ProgRoman
-
Количество публикаций
190 -
Зарегистрирован
-
Посещение
-
Days Won
7
Сообщения, опубликованные пользователем ProgRoman
-
-
спасибо за ответ,
меня что смутило, так это низкие проценты в распознавании в 2007 да и для некоторых категорий в 2012 тоже очень низкие
INRIA_Genetic 0.775 т.е. 77.5% правильно распознанных это в 2007 на aeroplane
NUSPSL_CTX_GPM_SCM 97.3 уже значительно лучше в 2012 тоже на aeroplane
для cow 77.8 в 2012
сейчас думаю, что всё действительно так у самолётов приблизительно даже форма одна и наверно варьируется она не так сильно как к примеру у коровы или у бутылки у которой средняя точность распознавания 60.8
спасибо за ответ
-
У меня вопрос о правильном понимании оценок алгоритмов компьютерного зрения
Есть Precision(Это точность) считается как общее число положительных срабатываний алгоритма на выборке к общему числу элементов в выборке
я не очень понимаю чем от Precision отличается Accuracy
Average Precision (AP)(средняя точность) как я понимаю считается просто как среднее арифметическое всех Precision на выборке
Recall как я понял это отношение положительных срабатываний к сумме положительных срабатываний и неверно распознанных объектов.
И ещё такой вопрос не очень понятно почему две таблицы из конкурса PASCAL в 2007 и 2012 годах выглядят настолько различно вроде бы обе в Average Precision
меня интересуют первые таблицы с результатами на этих страницах или их как то по другому надо интерпретировать.
-
В примерах 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 отфильтрованное изображение меняется.. но как это всё применять не ясно может быть кто-то занимался этим
-
если берём оператор большего радиуса он не покрывает меньшие так как считаются только граничные точки т.е. если радиус равен 1 то имеем 8-мь соседей, при увеличении радиуса число соседей будет увеличиваться, но они так же будут браться только по границе окружности, для распознавания я думаю можно как то соорудить сложный LBP, но я видел, что сперва находят гистограмму от lbp изображения а потом только распознают..
-
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 поэтому вопрос снимается, всё разрешилось
-
да мне как-то казалось, что зачем их число задавать... странно же... тем более этих 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
-
Добрый день, разбираюсь с оператором LBP ссылки ниже
сама процедура получения из изображения LBP изображения понятна..
ниже приведу ссылки с исходниками для построения LBP и гистограммы
так вот мне не очень понятно в процедуре построения гистограммы что такое 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; } } }
-
как можно сделать трекинг автомобилей если применять только каскад код был выше, то удовлетворительных результатов я пока не добился, бывает что он просто даже на кадре где есть машины не может отметить их (пишет что интересующих объектов нету)... возможно лучше будет оптический потом или что-то другое?..
-
у меня ещё вопрос как сделать полный трекинг объекта у меня сейчас выделяются автомобили в кадрах, но они выделяются а потом хотя автомобиль и есть он не выделяется я бы хотел сделать, что бы можно было сопровождать этим выделением все автомобили пока он видим для камеры, а не только первые кадры когда есть автомобиль а потом выделение куда-то пропадает ниже код он практически не изменился
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; }
-
спасибо параметры подкрутил вроде бы заработало быстрее конечно..
возник вопрос есть ли базы данных с обученными каскадами к примеру автомобилей, каких-то животных к примеру кошки собаки и другие
нашёл ролик по детекции автомобилей с уже обученным каскадом ссылка
повторить удалось но единственно начал проверять на других видео и оказалось, что он довольно плохо работает с автомобилями которые проезжают мимо он их будто вообще не видит к примеру когда автомобиль обгоняет вас или наоборот вы обгоняете другой автомобиль как это можно исправить -
Добрый день, у меня вопрос я повторил программу 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]
-
да по количеству хороших пар точек, возможно можно как-то иначе.. смотрю ссылку
-
Добрый день, возник такой вопрос есть ли дескрипторы которые можно использовать к примеру для трекинга и распознавания простых геометрических фигур ну т.е. круг, треугольник, квадрат.. с простой текстурой.. пробовал SIFT и SURF но они с простыми формами не очень хорошо работают.. в качестве базы данных для тестирования использую дорожные знаки
- 1
-
спасибо, это в основном как я понял к лицам.. а к объектам другой формы.. я просто сам не встречал...
-
Сейчас смотрю курс Оптимизация энергии в задачах компьютерного зрения и алгоритмы на графах
и у меня возник вопрос есть ли алгоритмы или примеры применения алгоритмов на графах к распознаванию изображений(объектов) не сегментация изображений, а распознавание
-
Ещё вопрос по DistanceTransform как вычислить расстояние по нему от одного объекта до другого..в DistanceTransform хранятся расстояния до ближайшего края т.е. что бы получить ответ вроде бы надо строить к примеру пирамиду шаблона и её накладывать на нашу сцену потом ею двигать, пройтись скользящим окном по всей сцене и найти лучший отклик или отклики...
-
Спасибо ссылки читаю, у меня такие картинки, но вроде бы они там не как у вас на картинках.. ниже приведу код
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);
-
Не могу разобраться как по distanceTransform понимать форму объекта к примеру круг, треугольник или прямоугольник...
тут вроде бы написано что можно и что делали так, но как эту информация использовать для узнавания этих фигур пока идей нету
http://www.lektorium.tv/lecture/?id=13539
там видео лекция и презентация
-
и ещё вопрос в этой статье есть раздел
Уточнение особых точек
Как это ни странно, на предыдущем пункте поиск ключевых точек не окончен. Следующим шагом будет пара проверок пригодности точки экстремума на роль ключевой.
Первым делом определяются координаты особой точки с субпиксельной точностью. Это достигается с помощью аппроксимирования функции 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)
или я что-то не то понял?)
-
а радиус этой области как определить через матрицу Гессе так?
вот неплохая ссылка на описание сифта заодно он использует DoG детектор
-
ок спасибо по цвету сейчас смотрю..
ещё такой вопрос.. пусть у нас есть изображение с ключевыми точками можно ли как то выбрать область вокруг ключевой точки что бы она была инвариантна к масштабу?... что бы потом можно было эту область использовать для сравнения
-
а в opencv нет реализованного blob detector?,
-
Добрый день, как можно реализовать 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 и до какого-то значения...
-
Latent SVM
в OpenCV
Опубликовано · Report reply
Появился вопрос о алгоритме Latent SVM вроде бы он появился в opencv. Правильно ли я понимаю, что это просто так можно сказать иерархический классификатор. Создаётся каскад на основе svm сперва вычисляется самый слабый классификатор к примеру фигуры человека если у нас есть такой регион и мы его не отмели на начальной фазе то далее используем более сильные(уточняющие) классификаторы к примеру рук, ног, головы и наверно в конце принимается решение ещё исходя и из положения самих уточняющихся объектов