2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Преобразование Карунена-Лоэва применительно к распознованию
Сообщение26.11.2014, 00:52 


26/11/14
12
Добрый День!

Хочу применить преобразование Карунена-Лоэва к распознованию жестов.
Читаю вот эту : http://arxiv.org/ftp/arxiv/papers/1306/1306.2599.pdf статью.
Изображение
Идея довольно проста:
Там авторы строят два собственных вектора для изображения руки.
Далее по углу между собственным вектором и одной из осей они распознают, что это за жест.

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

Данную вещь реализовали в чудесной библиотеке http://math.nist.gov/javanumerics/jama/ на основе SVD
Пример использования:
Код:
    // rank of approximation
    int r = 2;

    // read in the original picture and display it
    Picture pic1 = new Picture("_bmp.bmp");
    int M = pic1.height();
    int N = pic1.width();
    pic1.show();
    System.err.println("Done reading " + M + "-by-" + N + " image");

    // create matrix of grayscale intensities
    Matrix A = new Matrix(M, N);
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
        Color color = pic1.get(i, j);
        double lum = Luminance.lum(color);
        A.set(i, j, lum);
        }
    }
    // compute best approximation of given rank
    Matrix Ar = KarhunenLoeve.KL(A, r);
    System.err.println("Done computing best rank " + r + " approximation");           

    // create new picture
    Picture pic2 = new Picture(M, N);
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
        int y = (int) (Math.round(KarhunenLoeve.truncate(Ar.get(i, j))));
        Color gray = new Color(y, y, y);
        pic2.set(i, j, gray);
        }
    }
    pic2.show();
    System.err.println("Done");

Получаю вот такие результаты
Изображение

Т.е., это что вроде сжатого изображения. Ладно, хорошо.
Но мне от этого какой прок?
Как мне получить эти два злосчастных вектора?

Сама реализация KLT:
Код:
public class KarhunenLoeve {
    // return the integer between 0 and 255 closest to c
    public static int truncate(double c) {
        if (c <= 0) return 0;
        if (c >= 255) return 255;
            return (int) (c + 0.5);
    }

    public static Matrix KL(Matrix A, int r) {
        int M = A.getRowDimension();
        int N = A.getColumnDimension();
        SingularValueDecomposition svd = A.svd();
        Matrix Ur = svd.getU().getMatrix(0, M - 1, 0, r - 1); // first r columns of U
        Matrix Vr = svd.getV().getMatrix(0, N - 1, 0, r - 1); // first r columns of V
        Matrix Sr = svd.getS().getMatrix(0, r - 1, 0, r - 1); // first r rows  and columns  of S                                                         
        return Ur.times(Sr).times(Vr.transpose());
    }
}


А вот что пишут здесь(http://chemometrics.ru/materials/textbooks/pca.htm) о связи SVD и PCA:
Цитата:
Метод главных компонент тесно связан с другим разложением - по сингулярным значениям, SVD. В последнем случае исходная матрица X разлагается в произведение трех матриц
$$X=USV^t$$

Здесь U - матрица, образованная ортонормированными собственными векторами $u_r$ матрицы $XX_t$, соответствующим значениям $l_r$;

$$XX^tU_r = l_ru_r$$

V- матрица, образованная ортонормированными собственными векторами $v_r$ матрицы $X^tX$;

$$X^tX_{v_r} = l_rv_r $$

S - положительно определенная диагональная матрица, элементами которой являются $\sigma_1 \geqslant ... $\sigma_R  \geqslant 0$ равные квадратным корням из собственных значений $l_r$

$$\sigma_R = \sqrt \lambda_r$$

Связь между PCA и SVD определяется следующими простыми соотношениями

$$T = US$$ $$P = V$$


Помогите пожалуйста разобраться.

Который день бьюсь - толку 0

Заранее благодарю!

 Профиль  
                  
 
 Posted automatically
Сообщение26.11.2014, 01:02 


20/03/14
12041
 i  Тема перемещена из форума «Помогите решить / разобраться (М)» в форум «Карантин»
Тема перемещена в Карантин по следующим причинам:

1. Последнюю картинку в нотации $\TeX$ наберите, пожалуйста. Краткие инструкции можно найти здесь: topic8355.html и topic183.html.
Кроме этого, в теме Видео-пособия для начинающих форумчан можно посмотреть видео-ролик "Как записывать формулы".

2. Также просьба четко обозначить предмет обсуждения и указать затруднения. Верно ли, что они только в этом:
simplex1 в сообщении #936177 писал(а):
Каким образом они получают именно 2 вектора. Ведь собственных векторов получается столько, сколько собственных чисел, а их количество равно размерности матрицы.


Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение26.11.2014, 10:54 
Супермодератор
Аватара пользователя


20/11/12
5728
 i  Тема перемещена из форума «Карантин» в форум «Математика (общие вопросы)»
Возвращено.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение26.11.2014, 22:24 
Аватара пользователя


31/10/08
1244
simplex1
Они не описывают. Но достаточно очевидно, что в качестве переменной величины они берут вектор для каждой точки изображения, которая больше порога. У вас в коде ещё пропущен ряд шагов, который описан в статье.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение27.11.2014, 00:17 


26/11/14
12
Цитата:
У вас в коде ещё пропущен ряд шагов

Если не затруднит, скажите, каких именно?

Цитата:
Вектор для каждой точки изображения

Не совсем понял, что имеется ввиду. Поясните пожалуйста.

З.Ы. Какие образом они получают 2 вектора. Вот это я никак в толк взять немогу.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение27.11.2014, 06:31 
Аватара пользователя


31/10/08
1244
simplex1 в сообщении #936645 писал(а):
Если не затруднит, скажите, каких именно?

Цитата:
The system consists of five steps: skin filtering, palm cropping, edge detection, feature extraction, and classification.

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

Вот всё это в вашем коде пропущено.
simplex1 в сообщении #936645 писал(а):
Цитата:

Вектор для каждой точки изображения
Не совсем понял, что имеется ввиду. Поясните пожалуйста.

Берём изображение после детектора границ Кэнни.
Перебираешь все пиксели изображения по строкам (i) и столбцам(j). Если пиксель равен 255, то заносим в список вектор (i,j), иначе пропускаем.
Так вот далее они все вектора (i,j) пропускают через преобразование Карунена-Лоэва.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение27.11.2014, 12:22 


26/11/14
12
Вот всё это в вашем коде пропущено.
Цитата:
Да. Просто я пока хочу разобраться как KLT использовать правильно. А сам детектор реализован и работает

После работы детектора Кенни, я получаю примерно такое изображение:
Изображение
Если применить к нему KLT, получаю такое:
Изображение
Цитата:
Перебираешь все пиксели изображения по строкам (i) и столбцам(j). Если пиксель равен 255, то заносим в список вектор (i,j), иначе пропускаем.

Если изображение NxM, то я получа N векторов с белыми бикселями для каждой строки и соответсвенно M - для стролбцов
Цитата:
Так вот далее они все вектора (i,j) пропускают через преобразование Карунена-Лоэва.

Но как вычленить именно 2, что бы работать с ними так же как в статье. Ведь там видно, что на плоте только 2 вектора, причем они не ортогональны. Угол между каким-то из векторов и есть признак. Вот что мне нужно. Имеено это я не могу понять как сделать.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение27.11.2014, 14:47 
Аватара пользователя


31/10/08
1244
Ещё раз другими словами.
Переводишь растровое изображение в векторное.
$Image \to X$, где $X$ - массив координат белых точек. $X$ будет иметь размерность $k \times 2$.
Находишь среднюю составляющую от $X$;
$M=X-E\{X\}$
Затем находишь ковариационную матрицу от результата $X-M$. Ковариационная матрицу будет иметь размерности $2 \times 2$
Затем находишь для неё неё собственные вектора.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение27.11.2014, 20:12 


26/11/14
12
Ура! Хоть какие-то сдвиги.

Спасибо большое за помощь. Без вас бы долго еще топтался на одном месте.

Вот такие результаты получаю:
Изображение

Примерный порядок работы:

1. Канни
2. Строится ковариационная матрица
3. Поиск собственных векторов(выполняет метод ниже)

Код:
   public EigenvalueDecomposition (Matrix Arg) {
      double[][] A = Arg.getArray();
      n = Arg.getColumnDimension();
      V = new double[n][n];
      d = new double[n];
      e = new double[n];

      issymmetric = true;
      for (int j = 0; (j < n) & issymmetric; j++) {
         for (int i = 0; (i < n) & issymmetric; i++) {
            issymmetric = (A[i][j] == A[j][i]);
         }
      }

      if (issymmetric) {
         for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
               V[i][j] = A[i][j];
            }
         }   
         
           //Tridiagonalize(насколько я понял, строится 3-х диагональная матрица -
              //                            Symmetric Householder reduction to tridiagonal form.).   
                  // как это работает пока не понял
         tred2();   
        // Diagonalize.
          // здесь снова выполняется сжатие до диагональной матрицы - Symmetric tridiagonal QL algorithm.
         // как работает пока не понял
           tql2();

      } else {/*если матрица не симметрична*/
         H = new double[n][n];
         ort = new double[n];
         
         for (int j = 0; j < n; j++) {
            for (int i = 0; i < n; i++) {
               H[i][j] = A[i][j];
            }
         }   
         // Reduce to Hessenberg form.
         orthes();   
         // Reduce Hessenberg to real Schur form.
         hqr2();
      }
   }


Есть еще парочка вопрос:
1. Каким образом размер исходной матрицы(изображения) влияет на результат?
2. Почему вектора получаются всегда ортогональными? Насколько я понял, выполняется какая-то процеда ортогонализации. Я знаю только Гамма-Шмидта, но тут вроде бы не используется.
*В той статье, вектора получались неоргонональными. Мне кажется это очень важно.
3. По какому принципу выбирается начало новой системы координат. Насколько я понял - это центр масс белых пикселей(которые после Канни остались), так?


З.Ы, Сейчас попробую все сделать в режиме realtime. Посмотрим, что получется. Меня настораживает что углы меняются незначительно.
Это делаю алгоритм чувствительным, что плохо в данной ситации. Ладно. Посмотрим.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение27.11.2014, 21:21 
Аватара пользователя


31/10/08
1244
simplex1 в сообщении #936980 писал(а):
1. Каким образом размер исходной матрицы(изображения) влияет на результат?

А сами как думаете?
simplex1 в сообщении #936980 писал(а):
2. Почему вектора получаются всегда ортогональными? Насколько я понял, выполняется какая-то процеда ортогонализации. Я знаю только Гамма-Шмидта, но тут вроде бы не используется.

К какому классу матриц принадлежит матрица коввариации?
simplex1 в сообщении #936980 писал(а):
*В той статье, вектора получались неоргонональными. Мне кажется это очень важно.

Ошибаетесь. Читайте внимательнее статью.
simplex1 в сообщении #936980 писал(а):
3. По какому принципу выбирается начало новой системы координат. Насколько я понял - это центр масс белых пикселей(которые после Канни остались), так?

Для распознавания это и не требуется. Но да в KLT так.

У данного метода распознавания жестов есть недостатки. Какие-то можно устранить какие-то нет. Как говорится найдите 1 отличие в ваших жестах от тех, что в статье.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение28.11.2014, 22:33 


26/11/14
12
Цитата:
А сами как думаете?

Точно сказать не могу, но как прочитал на форуме:"...преобразование делает распознавание инвариантным к размеру картинки и ладони на ней (контур любой длины описывается через два вектора в двумерном пространстве)". Т.е. никак не влияет, да?

Цитата:
К какому классу матриц принадлежит матрица коввариации?

Цитата:
Ошибаетесь. Читайте внимательнее статью.

"В базисе из собственных векторов ковариационной матрицы она, естественно, диагональна, и в этом базисе коэффициент ковариации между различными координатами равен нулю." Т.е. все строки этой матрицы - ортогональные вектора?
А как же изображение:
Изображение
Тут явно видно что вектора не ортогональны. И это, нужно отметить, намного лучше. Т.е. можно ввести 2 признака. Угол одного вектора и угол второго. А если они получаются ортогональными, то только 1 признак, так как 2 получается прибавление pi/2.

Цитата:
У данного метода распознавания жестов есть недостатки. Какие-то можно устранить какие-то нет. Как говорится найдите 1 отличие в ваших жестах от тех, что в статье.

Можете пояснить. Буду очень признателен. Особенно про жесты. Что такго особенно в их жестах. Фон что ли другой?

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение28.11.2014, 23:41 
Аватара пользователя


31/10/08
1244
simplex1 в сообщении #937594 писал(а):
Тут явно видно что вектора не ортогональны.

1) Лично я вижу что они ортогональны. Хотя у меня плохой глазомер поэтому я привык больше доверять числам.
2) Явно видно что вектора нарисованы не в масштабе. 1:1.2 и 0.8:0.8 - по шкале да и ещё в прямоугольнике! Так что о углах судить нельзя - это всё обман зрения. У меня преподаватель была строгая. Если не в масштабе, то не принимала работу.


Цитата:
We have used two types of classifier, one based on the angle
made by the Eigen vector with reference axis and another
based on Euclidean distance and made a comparative study
between them and it was found that both of them gave the
same results. The angle can be obtained considering either x
or y-axis as reference axis but must be constant for all
symbols. We have considered angles with respect to the xaxis.
Table I shows the classification based on the angle
between the Eigen vector and the x-axis. After rigorous
experimentation it was found that for different images of a
particular gesture the angle lie within certain limit. Based on
that knowledge thresholds are set to classify the gesture.
Here, we have considered only the angle made by the first
Eigen vector, as the angle made by the second Eigen vector
just differs by an angle of 90° with the first one.
Considering only a single angle made by any one of the
Eigen vector is sufficient for the purpose.

Видимо авторов это тоже ввело в заблуждение. И они провели численный эксперимент и отличий не нашли. И в конце пишут что собственные вектора отличаются на 90°. А так я не вижу смысла в таком эксперименте, ведь заранее было ясно из свойств матрицы что они ортогональны.

simplex1 в сообщении #937594 писал(а):
Можете пояснить. Буду очень признателен. Особенно про жесты. Что такго особенно в их жестах. Фон что ли другой?

Чаще всего они только один палец оттопыривают.

simplex1 в сообщении #937594 писал(а):
Точно сказать не могу, но как прочитал на форуме:"...преобразование делает распознавание инвариантным к размеру картинки и ладони на ней (контур любой длины описывается через два вектора в двумерном пространстве)". Т.е. никак не влияет, да?

В идеальном случае не влияет. Но тут есть шумы помимо кисти есть предплечье. И пальцы тоже влияют. А вот как они влияют это пожалуй уже исследовательская задача.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение29.11.2014, 01:25 


26/11/14
12
Цитата:
1) Лично я вижу что они ортогональны. Хотя у меня плохой глазомер поэтому я привык больше доверять числам.
2) Явно видно что вектора нарисованы не в масштабе. 1:1.2 и 0.8:0.8 - по шкале да и ещё в прямоугольнике! Так что о углах судить нельзя - это всё обман зрения. У меня преподаватель была строгая. Если не в масштабе, то не принимала работу.

Хех, и вправду. Так, значит с этим разобрались. Спасибо.

Цитата:
and another
based on Euclidean distance and made a comparative study
between them and it was found that both of them gave the
same results.

Между чем они расстояние вычисляют? Не между векторами же. Или это корень из суммы разностей собственных чисел?

Нашел пример http://progcoders.wordpress.com/2013/03/02/face-recognition-using-kl-transforms/, где какой-то индус реализовал именно классификацию, используя эвклюдово расстоние. Сижу пока код изучаю.

З.Ы. Собственные вектораих угол может быть в любой из интервала [0;2pi] или нет? Просто у меня получается что углы находятся II,III червертях. Это нормально или нет?

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение29.11.2014, 23:08 


26/11/14
12
Фуууууух. Это нереально.

Вот так углы у меня играют:
Изображение

Рисую вектора так:
Код:
   Matrix m = CovarianceMatrix.getCovarianceMatrix(data);
   EigenvalueDecomposition e = m.eig();
   Matrix eigenVectors = e.getV();

   final double C = 180.0 / Math.PI;
   int angle1 = (int) (C * Math.atan2(eigenVectors.get(0, 1),
           eigenVectors.get(0, 0)));
   int angle2 = (int) (C * Math.atan2(eigenVectors.get(1, 1),
           eigenVectors.get(1, 0)));
   notifyRecognizeListeners(String.format("\n%1$5d : %2$5d", angle1,
           angle2));

   g = mHandCanny.getGraphics();
   
       final int LENGTH = 100;

   g.setColor(Color.RED);   
   int dx = (int) (LENGTH * eigenVectors.get(0, 0));
   int dy = (int) (LENGTH * eigenVectors.get(0, 1));
   g.drawLine(center.x, center.y, center.x + dx, center.y + dy);
   
   g.setColor(Color.YELLOW);
   dx = (int) (LENGTH * eigenVectors.get(1, 0));
   dy = (int) (LENGTH * eigenVectors.get(1, 1));
   g.drawLine(center.x, center.y, center.x + dx, center.y + dy);

У них в статье углы задаются с точьность 10-15 градусов. Это же просто атас. По углам вообще нереально, имхо.

Нужно пробовать по расстоянию.

 Профиль  
                  
 
 Re: Преобразование Карунена-Лоэва применительно к распознованию
Сообщение30.11.2014, 10:10 
Аватара пользователя


31/10/08
1244
simplex1
1) Что бросилось в глаза неправильные углы. По идеи они должны быть на 45 градусов повернуты.
2) Вроде как вектора должны располагаться в столбцах, а вы читаете по строкам.
3) Задайте длину векторов как собственные числа матрицы. И сверху ещё эллипс лучше построить для наглядности.
4) Перескок углов это неустойчивость. Нормально это или нет надо разбираться. Надо смотреть что у вас с ковариационной матрицей и что с собственными числами. Вектора обычно сортируют по собственным числам. А числа по величине.
5) Как я уже писал от жеста зависит результат. В одних случаях собственные числа будут близкими в других нет. Если числа близкие то чехорда с векторами может наблюдаться из-за случайных помех.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group