Jump to content
Compvision.ru
Sign in to follow this  
Frimen

Распознавание лиц

Recommended Posts

Например FANN.

Сделана под кучу языков: http://leenissen.dk/fann/wp/language-bindings/

Спасибо.

Подскажите пожалуйста, на счет топологии НС, может подойдет многослойный перцептрон, хотя на форуме вроде писали что сверточные лучше. Не нашел, можно ли попробовать несколько топологий в FANN? не подскажите какая топология используется конкретно в этом примере? в том же примере как и в большинстве других в файле Xor.data, используются целые числа, как быть в отношении дробных?

Share this post


Link to post
Share on other sites

Сверточные наверное лучше, но я не пробовал.

По поводу возможных топологий (из документации):

fann_create_standard

Creates a standard fully connected backpropagation neural network.

fann_create_standard_array

Just like fann_create_standard, but with an array of layer sizes instead of individual parameters.

fann_create_sparse

Creates a standard backpropagation neural network, which is not fully connected.

fann_create_sparse_array

Just like fann_create_sparse, but with an array of layer sizes instead of individual parameters.

fann_create_shortcut

Creates a standard backpropagation neural network, which is not fully connected and which also has shortcut connections.

fann_create_shortcut_array

Just like fann_create_shortcut, but with an array of layer sizes instead of individual parameters.

Можно и дробные использовать.

  • Like 1

Share this post


Link to post
Share on other sites

Сверточные наверное лучше, но я не пробовал.

По поводу возможных топологий (из документации):

Можно и дробные использовать.

Здесь вроде говорится о возможных конфигурация сети? Какая из них сверточная?

Share this post


Link to post
Share on other sites

Привет ребят,

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

"Подводные камни" при идентификации лиц: /* присутствует весь джентельменский набор */

- лица произвольно повернуты; /* диапазон от фронтального вида до профильного включительно */

- имеется небольшой наклон головы;

- различный масштаб; /* лицо может занимать ~15% от изображения */

- неравномерное освещение;

- размытость;

- изображение темное или слабоконтрастное;

- неправильные цвета;

- шум; /* соль-перец, импульсный, гауссов, артефакты блочности*/

- ...

Использую opencv. Подготовка: обработка медианным фильтром - medianBlur(). /* маска резкости и выравнивание освещения ухудшили результаты */

Для обнаружения признаков применила SURF. /* из примеров библиотеки opencv/samples/c/find_obj.cpp */

Результат отвратительный: правильность распознавания 62%. /* поворот головы испортил всю карту */

Думаю найти антропометрические (характерные) точки лица и от этого плясать дальше. Но на этом зависла. Насколько понимаю, нужно лица привести к единому масштабу. /* как? я новичок - теорию сложно реализовать в код */

А что насчет поворота головы - модель ведь не совпадет. /* источники на AAM, ASM читала */

Подтолкните в нужном направлении. Критика приветствуется

Share this post


Link to post
Share on other sites
Для обнаружения признаков применила SURF

как использовали? применяли ли dense версию?

тут просто находятся характерные точки.

на форуме есть пара тем.

по идее с поворотом можно справиться если искать отдельно левую и правую половины лица, а так же есть какие то multiview модели и 3d модели, но я с этим не разбирался.

про нормирование масштаба и наложение лиц была тут какая то тема типа automatic face alignment даже вроде с кодом на матлабе.

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

Share this post


Link to post
Share on other sites

На сколько правильно я поняла, под "dense" вы подразумеваете DenseFeatureDetector. В таком случае - нет, не использовала. Рассмотрю этот вариант подробнее.

За ключевые слова для поиска - отдельное спасибо: в терминах и алгоритмах я, действительно, плаваю. Поставленную выше задачу необходимо решить в ограниченные сроки, вследствие чего изучение новой для меня области происходит столь сумбурно.

Share this post


Link to post
Share on other sites

Добрый день! Хотелось бы узнать на каких базах данных, какого объема, стоит тестировать систему распознавания, чтобы добиться довольно объективной оценки? Может быть у кого-нибудь есть базы данных лиц с большим количеством фотографий каждого человека?

Share this post


Link to post
Share on other sites

Приветствую!

начал изучать каскад Хаара и тут же напоролся на "грабли"

вот немного переделанный код с этого форума(среда Qt), за инклюды не пинайте

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include<opencv/cv.h>

#include<opencv/highgui.h>

#include<QEvent>

#include<QtCore>

#include<QFileDialog>

#include<QtGui>

#include<QMessageBox>

#include<QImage>

#include<QTimer>

#include<QWidget>

#include<qwidget.h>

#include<QString>

#include<QSlider>

#include<qslider.h>

#include<QHeaderView>

#include<qstyleoption.h>

#include<qabstractitemview.h>

#include<QSpinBox>

#include<qspinbox.h>

#include<QTime>

#include<QTimeEdit>

#include<QSettings>

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/objdetect/objdetect.hpp"


using namespace std;

using namespace cv;




MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);


    timerStartStop = new QTimer(this);

    connect(timerStartStop, SIGNAL(timeout()), this, SLOT(StartStopVideoFromWebcam()));

    timerStartStop->stop();


    // Указатель на каскад Хаара

    this->cascade = 0;


    camWebcam.open(0);


    if(camWebcam.isOpened() == false)

    {

        ui->statusBar->showMessage("Невозможно определить камеру, проверьте подключение.");

        QMessageBox::information(this, "Внимание", "Камера не обнаружена, проверьте подключение");

    }

    else

    {

        ui->statusBar->showMessage("Подключение прошло успешно, камера готова к работе.");

    }


    camWebcam.release();


    // Создаем строку, содержащую точное имя каскад

    const char* cascade_name ="C://haarcascade_frontalface_alt.xml";

    // Загружаем HaarClassifierCascade

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

}


MainWindow::~MainWindow()

{

    delete ui;

}


void MainWindow::ShawImage(cv::Mat img) //собственно и сама функция поиска лица

{

    CvMemStorage* storage = 0;

    int scale = 1;

    // Создаем две точки, представляющие местоположение лица

    CvPoint pt1, pt2;

    int i;


    // Выделим память для хранения

    storage = cvCreateMemStorage(0);


    // Очистим хранилище памяти, который использовался до

    cvClearMemStorage( storage );


    // Найдем загрузился каскад, чтобы найти лица. Если да, то:

    if( cascade )

    {

        CvSize min = cvSize(40,40);

        CvSeq* faces = cvHaarDetectObjects(&img, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, min); //в отладчике на этой строке валится программа img = cv::Mat


        for( i = 0; i < (faces ? faces->total : 0); i++ )

        {

            // Создаем новый прямоугольник для рисования лица

            CvRect* r = (CvRect*)cvGetSeqElem( faces, i );


            // Найдем размеры лица, и масштабы его, если необходимо,

            pt1.x = r->x*scale;

            pt2.x = (r->x+r->width)*scale;

            pt1.y = r->y*scale;

            pt2.y = (r->y+r->height)*scale;


            // Нарисуем прямоугольник, в входное изображение


            cv::rectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );

        }

    }

    cv::cvtColor(img, img, CV_BGR2RGB);

    QImage imgshow((uchar*)img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);

    ui->lblImage->setPixmap(QPixmap::fromImage(imgshow));

}


void MainWindow::StartStopVideoFromWebcam() //таймер обработки кадров с вэб камеры

{

    camWebcam.open(0);

    camWebcam.read(frame);


    if (frame.empty() == true)

    {

        ui->statusBar->showMessage("Ошибка при захвате видео!");

        return;

    }


    ShawImage(frame);

}

void MainWindow::on_pushButton_3_clicked() //кнопка выхода

{

    close();

}


void MainWindow::on_pushButton_clicked() //кнопка запуска трэкинга

{

    timerStartStop->start(33);

}


void MainWindow::on_pushButton_2_clicked() //кнопка остановки таймера

{

    timerStartStop->stop();

}
программа валится на этой строке
CvSeq* faces = cvHaarDetectObjects(&img, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, min);

ошибка следующая: OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file C:\opencv\modules\core\src\array.cpp, line 2482

что я делаю не так?

Share this post


Link to post
Share on other sites

Недавно опубликовали (статья+код) неплохие детекторы лицевых точек:

1. http://www.humansensing.cs.cmu.edu/intraface/download.html

2. http://www.ics.uci.edu/~xzhu/face/

Так вот вопрос: как можно улучшить точность распознавния за счет особых точек?

У меня есть следующие соображения:

1. Сравнение геометрии лиц

2. Сравнение признаков в районе точек

2.1. Составление общего вектора признаков

2.2. Классификация каждой точки (области: глаз или выравненная линия с 2мя глазами и т.д.)

3. Выравнивание в том числе в 3D

4. Сравнение с нужным ракурсом

5. По видеоряду с разными ракурсами построить 3D лицо

Но есть следующие опасения:

1. Точность геометрии не очень высока... можно использовать только в совокупности с основным методом даст ли это приемущество не знаю...

2.1. Вектор получится большой, нужно сокращать PCA и рандомные проекции... мне кажется это ограничение на скорость накладывает

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

3. Посмотрел пару статей по 3D выравниванию, но результаты не впечатляют

4. Думаю неплохо, но нужна большая база на каждого человека

5. Сложно

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

Share this post


Link to post
Share on other sites

Недавно опубликовали (статья+код) неплохие детекторы лицевых точек:

1. http://www.humansensing.cs.cmu.edu/intraface/download.html

2. http://www.ics.uci.edu/~xzhu/face/

Так вот вопрос: как можно улучшить точность распознавния за счет особых точек?

У меня есть следующие соображения:

1. Сравнение геометрии лиц

2. Сравнение признаков в районе точек

2.1. Составление общего вектора признаков

2.2. Классификация каждой точки (области: глаз или выравненная линия с 2мя глазами и т.д.)

3. Выравнивание в том числе в 3D

4. Сравнение с нужным ракурсом

5. По видеоряду с разными ракурсами построить 3D лицо

Но есть следующие опасения:

1. Точность геометрии не очень высока... можно использовать только в совокупности с основным методом даст ли это приемущество не знаю...

2.1. Вектор получится большой, нужно сокращать PCA и рандомные проекции... мне кажется это ограничение на скорость накладывает

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

3. Посмотрел пару статей по 3D выравниванию, но результаты не впечатляют

4. Думаю неплохо, но нужна большая база на каждого человека

5. Сложно

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

1. Сравнение геометрии лиц - в реальных условиях не работает

2.Сравнение признаков в районе точек- Пробовал ничего не вышло

3. выравнивание даже 2д дает ощутимый прирост

4. думаю имитация 3д реконструкции (в реальную по одной фото со случайного ракурса я не верю) с последующим lbp или еще что-то даст хороший результат.

  • Like 1

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

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×