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

Распознавание лиц HMM (Скрытые марковские модели)

Recommended Posts

скомпилил на с++ в студии, скорость сравнима с тем что на линуксе :) правда не сразу понял как файлы из папки грузить, но вот сделал так, вдруг кому интересно станет:


char a[] = "C://faces//s";

char b[] = "//";

char c[] = ".pgm";


char filenames[20];


for (int j=0;j<N_People;j++) // Цикл по разным людям

	{

		for (int i=0;i<N_Samples;i++) // Цикл по фотографиям

		{

			sprintf(filenames, "%s%d%s%d%s", a, j+1, b, i+1, c);

			img_load = cvLoadImage(filenames);

Я в итоге реализовал на С++, а на С# написал враппер на некоторые функции. На плюсах действительно все быстрее работает, главное избегать утечек памяти

А я с тем ковырялся добавил тока ему нейм спейс еще чтобы использовать совместно с враппером OpenCVSharp потому как у последнего все удобнее сделано но там нет марковских моделей почему то. а добавить их туда я че-то не осилил. Там есть PCA, он работает быстро. может если туда добавить Марковские модели будет быстрее :)

Вы писали с нуля враппер именно для марковских моделей чтобы использовать их в С#?

Кстати по поводу утечек памяти в студии есть такая штука gcnew, для борьбы с утечками

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


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

на плюсах реализовал свои классы для распознавания, вытащил во внешние функции и их заврапил. Т.е. врапил только свои функции, в которых использовались функции библиотеки OpenCv

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


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

Здравствуйте! Нужна ваша помощь. Дали в институте задание, сделать программу для нахождения лица человека на изображении, полученному с камеры в реальном времени и сравнение его с лицами в базе, с последующим определением тот это человек или нет. Ну вобщем вы меня поняли =) Можно ли использовать вашу программу для своей цели? (Имею ввиду, использовать программу с вашего разрешения) Если да, то скажите, что мне необходимо помимо камеры и компьютера, имею ввиду какая ОС нужна, и язык программирования (Delphi или C++?), какая версия OpenCV, и какой метод будет попроще: марковский или главных компонент? (Получится ли запустить вашу программу, которая в начале темы или из другой темы аналогичной, при условии что у меня будет стоять билдер и opencv, соответственно подключенная камера? Имею ввиду что, установив эти проги, и открыв вашу программу, я смогу сразу увидеть как она работает (выделяет лицо, фотографирует его, сохраняет в базу фото, а потом сравнивает, хм, что то я запутался, наверно нужно сперва создать эту базу с фото, а потом только полученное изображение будет сравниваться с эталонными)). Сам пытался сделать что то подобное в LabView, но в силу нелицензионности программы ничего не получилось. Есть вариант делать в линуксе с пакетом OpenCV на PHP, но линукс знаю плохо, как-то страшно в дебри лезть. Помогите пожалуйста.

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


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

1) можно.

2) win + C++ builder 6 + opencv (должен работать с любой версией, но там вроде 1.1pre1, есть в этой ветке и под 2.x )

3) главных компонент проще

4) получится, если все правильно установлено

5) эта программа с камерой не работает, придется Вам поработать:)

  • Like 1

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


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

Спасибо большое.

Тоесть, эта программа работает только с изображениями? Имею ввиду что, есть какая то выборка, например 5 фоток одного человека, мы делаем еще одну фотку, ставим её рядом с теми пятью и программа делает опознание?

Если я не правильно написал, то поправьте меня, может я что то недопонял =) Просто вы написали что "можно" на мой вопрос: "нахождения лица человека на изображении, полученному с камеры в реальном времени и сравнение его с лицами в базе, с последующим определением тот это человек или нет". Как в ноутбуках устанавливают программы, вместо того чтоб пароль вводить, пользователь смотрит в камеру, она захватывает изображение, фокусируется на лице (возможно делает снимок, я не знаю какой у неё алгоритм) и после этого, полученный снимок сравнивает. Мне нужно реализовать подобное.

И еще скажите, у меня opencv версии 2.3.1, как его прикрепить к билдеру? Так же как написано в этой статье? http://www.compvision.ru/forum/index.php?showtopic=2&st=0

Заранее спасибо еще раз.

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


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

Есть по N фоток M разных людей. Программа учится на них, после этого при предъявлении ей новой фотки одного из тех людей которых она знает, обученная программа должна определить кто это.

Вы скомпилируйте и погоняйте программу, сначала на фотках, а там глядишь и другие вопросы отпадут.

http://www.compvision.ru/forum/index.php?showtopic=763

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


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

Снова здравствуйте. У меня проблема, я не понимаю некоторых вещей. Вот у меня есть opencv 1.1, есть builder 6, с помощью поиска нашел все либы в папке opencv и открыл их с помощью coff2omf (применил ко всем просто). Далее нужно что то сделать с dll, я не понимаю что и главное как. Не могли бы вы для "чайника" написать как это сделать или ссылку дать, в нете ищу, ничего толкового пока =(

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


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

Не нужно ничего делать с dll, пропишите путь к ним в PATH, или перепишите в папку к программе.

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


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

Заработало вроде, я просто скопировал все длл из opencv в билдер (из bin в bin)

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


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

Можно вопрос по программе PCA_recognition, там есть папка faces, в ней 40 папок s1-s40, в каждой по 10 файлов. Я так понял это обучающие фотки для системы, выборки, что значит число 40 и 10? Формат фоток .pgm, это же картинка обычная? Тоесть я хочу открыть программу со своими фотками, мне просто нужно их заменить ?

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


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

Можно вопрос по программе PCA_recognition, там есть папка faces, в ней 40 папок s1-s40, в каждой по 10 файлов. Я так понял это обучающие фотки для системы, выборки, что значит число 40 и 10? Формат фоток .pgm, это же картинка обычная? Тоесть я хочу открыть программу со своими фотками, мне просто нужно их заменить ?

40 - количество людей

10 - количество фото каждого человека

Т.е. фото каждого человека обучается на массиве из 10 фото. Ясно, что можно обучаться на разных массивах, но чем больше фото, тем лучше.

.pgm - это формат изображения. Можно использовать и jpg. Как я понял, необходимо на фото найти область лицы (каскады Хаара), перевести фото в чб-режим, и уже по полученному изображению обучаться.

Фото можно и заменить, но лучше разобраться в программе (благо она не сложная) и модифицировать код под свои нужды.

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


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

Ну не просто, а с пониманием того что:

1) это имена файлов (которые должны соответствовать тому, что ожидает программа);

2) pgm - это формат файла, и если используете другой формат, то поменяйте расширение в программе.

3) фотки должны загружаться в однослойном режиме (градации серого).

4) проверить не вбиты ли жестко где-нибудь размеры картинок (я не помню).

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


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

спасибо, буду разбираться в программе, недавно только начал изучать си

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


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

Размеры не вбиты, но там должны быть все одного размера, иначе opencv ругается

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


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

Еще вопрос, пишу #include <highgui.h>, а он мне ошибку [C++ Error] Unit1.cpp(5): E2209 Unable to open include file 'highgui.h', как можно решить ?

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


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

Надо указать в билдере дополнительные директории исходных файлов. Где то тут на форуме была инструкция как на билдере настроить

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


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

Слушай, а ты не мог бы пожалуйста написать? Как нибудь покороче, но для чайника =)

Я видел как это делается в Вижуале, а тут не могу найти

Вроде как в Directories/Conditionals, только там не понятно, в какую строку что писать =)

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


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

Посмотри тут - ссылка

Я просто сам на визуале делаю, и на QT, билдер давно не использовал

И лучше используй 2.3.1 или 2.4, в 1.1 вроде глюки есть.

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


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

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

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


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

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

Либо кинь все заголовочные файлы *.h в директорию где у тебя экзешник будет уже скомпилированый, а в обьявлении заменяешь

#include <highgui.h> на #include "highgui.h"

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


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

ппц, вроде как нашел там все, ordered list of include paths называется, вбиваю туда путь C:\opencv\build\include\opencv2\highgui, и вообще по разному все вбиваю туда, различные пути, а он всё равно пишет что не то. А по поводу экзэшника я не совсем понял, что ты мне советовал. А еще тот путь что я пишу туда, он почему то исчезает оттуда постоянно.

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


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

C:\opencv\build\include\opencv

C:\opencv\build\include\

надо вот такие

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


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

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

И обязательно ли ставить одинаковые параметры для обучения и распознавания?


const int OBS_WIDTH = 12;

const int OBS_HEIGHT = 12;


const int NO_DCT_COEFF_X = 4;

const int NO_DCT_COEFF_Y = 4;


const int STEP_X = 4;

const int STEP_Y = 4;


const int MAX_ITER = 80;

const double STOP_STEP_ITER = 0.01;

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


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

Use source Luke ! :)

Из hmmobs.cpp (директория modules/legacy), там есть еще несколько hmm-овских файлов, они достаточно неплохо комментированы.

//*F///////////////////////////////////////////////////////////////////////////////////////
// Name: icvImgToObs_DCT_8u32f_C1R
// Purpose: The function takes as input an image and returns the sequnce of observations
// to be used with an embedded HMM; Each observation is top-left block of DCT
// coefficient matrix.
// Context:
// Parameters: img - pointer to the original image ROI
// imgStep - full row width of the image in bytes
// roi - width and height of ROI in pixels
// obs - pointer to resultant observation vectors
// dctSize - size of the block for which DCT is calculated
// obsSize - size of top-left block of DCT coeffs matrix, which is treated
// as observation. Each observation vector consists of
// obsSize.width * obsSize.height floats.
// The following conditions should be satisfied:
// 0 < objSize.width <= dctSize.width,
// 0 < objSize.height <= dctSize.height.
// delta - dctBlocks are overlapped and this parameter specifies horizontal
// and vertical shift.
// Returns:
// CV_NO_ERR or error code
// Notes:
// The algorithm is following:
// 1. First, number of observation vectors per row and per column are calculated:
//
// Nx = floor((roi.width - dctSize.width + delta.width)/delta.width);
// Ny = floor((roi.height - dctSize.height + delta.height)/delta.height);
//
// So, total number of observation vectors is Nx*Ny, and total size of
// array obs must be >= Nx*Ny*obsSize.width*obsSize.height*sizeof(float).
// 2. Observation vectors are calculated in the following loop
// ( actual implementation may be different ), where
// I[x1:x2,y1:y2] means block of pixels from source image with
// x1 <= x < x2, y1 <= y < y2,
// D[x1:x2,y1:y2] means sub matrix of DCT matrix D.
// O[x,y] means observation vector that corresponds to position
// (x*delta.width,y*delta.height) in the source image
// ( all indices are counted from 0 ).
//
// for( y = 0; y < Ny; y++ )
// {
// for( x = 0; x < Nx; x++ )
// {
// D = DCT(I[x*delta.width : x*delta.width + dctSize.width,
// y*delta.height : y*delta.height + dctSize.height]);
// O[x,y] = D[0:obsSize.width, 0:obsSize.height];
// }
// }
//F*/[/code]

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×