roboforum.ru

Технический форум по робототехнике.

Автономная навигация робота

Правила форума
В этом форуме новые темы не создаются, однако обсуждение допустимо.

Re: Автономная навигация робота

EDV » 06 янв 2010, 02:33

=DeaD= писал(а):А насколько тяжело будет для памяти хранить еще и исходные изображения?


Сейчас реализация алгоритма AVM v0.5 (библиотеки rcg.lib, rcg_vc9.lib) поддерживает три вида данных
(под данными имеется виду пара [образ]->[ассоциированные данные]):

- 32 битовое знаковое целое [long] (.\include\AssociativeMemory32s.h);
- 160 битный массив [CvType160U] (.\include\AssociativeMemory160u.h);
- 192 битный массив [CvType192U] (.\include\AssociativeMemory192u.h).

Так что можно взять, к примеру, тип CvType160U и использовать 16 бит из 160 (тип short) для индекса в массиве указателей на исходные изображения (остальные биты использовать для других нужд).

К примеру, вот так:

Код: Выделить всёРазвернуть
#include "AssociativeMemory160u.h"

#define cAreaImgTotal 1000
IplImage* iAreaImg[cAreaImgTotal]; // Массив указателей на исходное изображение области интереса

IplImage* InputImg; // Входное изображение

CvAssociativeMemory160U* am; // Указатель на ассоциативную память

int iAreaImgIdx = 0; // Текущий индекс изображения
CvRect InterestArea; // Область интереса

// ...
// Загружаем входное изображение в InputImg и устанавливаем координаты области интереса InterestArea

iAreaImg[iAreaImgIdx] = cvCreateImage(cvSize(InterestArea.width,
                                       InterestArea.height), IPL_DEPTH_8U, 1);
// Копируем изображение из области интереса
cvSetImageROI(InputImg, InterestArea);
cvCopy(InputImg, iAreaImg[iAreaImgIdx]);
cvResetImageROI(InputImg);

// Подготавливаем данные
CvType160U Data;
Data.s[0] = iAreaImgIdx;
//...

// Записываем данные в ассоциативную память
am->Write(InterestArea, &Data);

if(iAreaImgIdx < cAreaImgTotal) { iAreaImgIdx++; }

Re: Автономная навигация робота

=DeaD= » 06 янв 2010, 11:44

Это понятно, вопрос то был - сколько сейчас пакетов урезанных данных хранится на 1 образ? Если к каждому пакету подцепить картинку - сколько памяти займёт?

Re: Автономная навигация робота

EDV » 06 янв 2010, 13:03

Насчёт «пакетов данных» не понял. В поисковом дереве AVM хранятся матрицы распознавания. Для ключа 80x80 используется три уровня декомпозиции (см. FAQ), на верхних уровнях матрицы c меньшей размерностью на нижних уровнях более детальные. Выше я предложил не изображение в дерево запихивать, а только указатели на исходное изображение. Там же (в FAQ) приведена упрощенная процедура поиска объекта с помощью метода Read:

Код: Выделить всёРазвернуть
void SimplyRecognition(CvAssociativeMemory32S* pAM, CvSize aInputImgSize, CvRcgAMFunc32S RcgAMFunc) { 

   if(pAM && RcgAMFunc) {
      CvRect sRect;int i;
      printf("<***> Simply recognition -> begin\n");
      for(i=0;;i++) { // Цикл поиск, начинаем от 75% от размера ключа и пока не станет больше чем входное изображение
         float Rate = 0.75f + 0.25f*float(i);
         int SearchStep = int(15.0f*Rate);
         CvSize KeyImgSize = pAM->GetKeyImageSize();
         sRect.width = int(KeyImgSize.width*Rate);// Устанавливаем новый размер окна поиска
         sRect.height = int(KeyImgSize.height*Rate);
         // Окно больше входного изображение? (если да, то конец поиска)
         if((aInputImgSize.width < sRect.width) || (aInputImgSize.height < sRect.height)) break;
         int eX = aInputImgSize.width - sRect.width;
         int eY = aInputImgSize.height - sRect.height;
         for(int y=0; y < eY; y += SearchStep) {// Сканируем всё входное изображение выбранным окном
            for(int x=0; x < eX; x += SearchStep) {
               sRect.x = x;
               sRect.y = y;
               long* pData;
               CvAM_Parameters Param;
               Param.ppUserTrackingInfo = NULL;
               Param.TotalABases = pAM->GetTotalABases();
               if(pAM->Read(sRect, &Param.ObjRect, &pData, NULL, NULL, &Param.Similarity)) {
                  RcgAMFunc(cRecognizedObject, pData, &Param, NULL); // Объект найден
               }
            }
         }
      }
      printf("<***> Simply recognition -> finish\n\n");
   }
}

Re: Автономная навигация робота

=DeaD= » 06 янв 2010, 13:15

Сколько изображений будет храниться в среднем на 1 запомненный образ? AVM же запоминает не 1 изображение или его признаки, а целую пачку вроде?

Re: Автономная навигация робота

EDV » 06 янв 2010, 13:35

Сколько конкретно матриц будут соответствовать конкретному образу, сложно ответить, всё зависит насколько хорошо этот образ поддаётся декомпозиции, насколько он контрастный, какова частота его текстуры, какие образы были записаны в дерево ранее. В принципе это всё можно увидеть в виде диаграммы, если в приложении Recognition.exe вызвать из главного меню: Распознавание/Показать ассоциативное дерево.

Re: Автономная навигация робота

=DeaD= » 06 янв 2010, 13:43

Ну примерно то можно сказать? Чтобы оценить порядок чисел :)

Re: Автономная навигация робота

EDV » 06 янв 2010, 14:01

Ну вот, я сейчас взял, очистил дерево поиска AVM, и обучил его на объект «Лицо» и вот что получилось:
Вложения
face_tree.png

Re: Автономная навигация робота

=DeaD= » 06 янв 2010, 14:09

Итого оно запомнило 177 снимков размером 80х80 пикселей под 1 образ, так?

Re: Автономная навигация робота

EDV » 06 янв 2010, 14:39

Нет, не так, запомнило 144 матрицы в дереве поиска.

Total bases/clusters: bases – ассоциативные ядра, clusters – дополнительные «кластерные» матрицы, нужны для большего «ветвления» дерева поиска.

Общее количество (и кластерных и матриц ассоциативных ядер) 177.
Последний раз редактировалось EDV 06 янв 2010, 14:44, всего редактировалось 1 раз.

Re: Автономная навигация робота

=DeaD= » 06 янв 2010, 14:42

Если картинки мы бы еще запоминали - запомнили бы под 1 наш образ 144 картинки?
Кстати, а алгоритм выдаст номер картинки ведь, которую потом искать?

Re: Автономная навигация робота

EDV » 06 янв 2010, 14:56

Метод Write может не только создавать новые матрицы в дереве поиска, но и использовать уже существующие. Так что пред записью лучше попробовать посмотреть с помощью метода Read, возможно нашей «области интереса» уже соответствует какое то ассоциативное ядро, и тогда или ничего не делаем или корректируем его содержимое.

>> Если картинки мы бы еще запоминали - запомнили бы под 1 наш образ 144 картинки?
Ну, это если каждому ассоциативному ядру ставить в соответствие уникальную картинку области интереса (а если картинки очень похожие?).

>> Кстати, а алгоритм выдаст номер картинки ведь, которую потом искать?
В том варианте, что я выше рассматривал, именно так, должен выдать индекс картинки в массиве указателей.

Re: Автономная навигация робота

=DeaD= » 06 янв 2010, 14:59

Хм, ну при малых количествах картинок нормально должно быть (144 картинки по 80х80 пикселей, 24 бита цветов - это чуть меньше 3Мб на образ).

Кстати, алгоритм AVM работает в ч/б или в цвете?

И еще - а получается все 144 картинки если их тупо запоминать могут оказаться со смещениями? Или если их нормально запоминали - они будут 1 в 1 только с разными видео-помехами?

Re: Автономная навигация робота

EDV » 06 янв 2010, 15:07

>> Кстати, алгоритм AVM работает в ч/б или в цвете?
Алгоритма AVM работает с черно-белыми изображениями (цвета не видит).

Что бы в приложении Recognition.exe посмотреть исходное изображение для алгоритма AVM, нужно из главного меню выбрать: Распознавание/Показать входное изображение.

>> И еще - а получается все 144 картинки если их тупо запоминать могут оказаться со смещениями?
Ну, думаю, если объект в кадре дергали туда-сюда, и поворачивали под разными углами, то мы именно это на картинках и увидим (смещение в кадре/поворот изображения).

Re: Автономная навигация робота

Виталий » 06 янв 2010, 15:13

Считаю целесообразно использовать AVM не в качестве распознавателя, а в качестве фильтра. Т.е. быстро и неточно находить образы, а потом хоть корреляцией уточнять позицию "маяка".

Re: Автономная навигация робота

=DeaD= » 06 янв 2010, 15:29

Так я это и предлагаю, просто выясняю сейчас, как оно работает, в какое место лучше подцепиться :)

Добавлено спустя 2 минуты 41 секунду:
EDV писал(а):>> И еще - а получается все 144 картинки если их тупо запоминать могут оказаться со смещениями?
Ну, думаю, если объект в кадре дергали туда-сюда, и поворачивали под разными углами, то мы именно это на картинках и увидим (смещение в кадре/поворот изображения).

А вот это хуже :) в этом случае не ясно, что считать правильными координатами образа, особенно если его поворачивали... Надо подумать. А если не крутить и не трясти - оно нормально распознаётся? То есть можно ли для начала считать, что образ во время обучения неподвижен? Не сильно хуже результаты будут?


Rambler\'s Top100 Mail.ru counter