Jump to content
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, для борьбы с утечками

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

1) можно.

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

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

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

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

  • Like 1

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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


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;

Share this post


Link to post
Share on other sites

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]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×