Технический форум по робототехнике.
Правила форума
В этом форуме новые темы не создаются, однако обсуждение допустимо.
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++; }
=DeaD= » 06 янв 2010, 11:44
Это понятно, вопрос то был - сколько сейчас пакетов урезанных данных хранится на 1 образ? Если к каждому пакету подцепить картинку - сколько памяти займёт?
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");
}
}
=DeaD= » 06 янв 2010, 13:15
Сколько изображений будет храниться в среднем на 1 запомненный образ? AVM же запоминает не 1 изображение или его признаки, а целую пачку вроде?
EDV » 06 янв 2010, 13:35
Сколько конкретно матриц будут соответствовать конкретному образу, сложно ответить, всё зависит насколько хорошо этот образ поддаётся декомпозиции, насколько он контрастный, какова частота его текстуры, какие образы были записаны в дерево ранее. В принципе это всё можно увидеть в виде диаграммы, если в приложении Recognition.exe вызвать из главного меню: Распознавание/Показать ассоциативное дерево.
=DeaD= » 06 янв 2010, 13:43
Ну примерно то можно сказать? Чтобы оценить порядок чисел
EDV » 06 янв 2010, 14:01
Ну вот, я сейчас взял, очистил дерево поиска AVM, и обучил его на объект «Лицо» и вот что получилось:
- Вложения
-
=DeaD= » 06 янв 2010, 14:09
Итого оно запомнило 177 снимков размером 80х80 пикселей под 1 образ, так?
EDV » 06 янв 2010, 14:39
Нет, не так, запомнило 144 матрицы в дереве поиска.
Total bases/clusters: bases – ассоциативные ядра, clusters – дополнительные «кластерные» матрицы, нужны для большего «ветвления» дерева поиска.
Общее количество (и кластерных и матриц ассоциативных ядер) 177.
Последний раз редактировалось
EDV 06 янв 2010, 14:44, всего редактировалось 1 раз.
=DeaD= » 06 янв 2010, 14:42
Если картинки мы бы еще запоминали - запомнили бы под 1 наш образ 144 картинки?
Кстати, а алгоритм выдаст номер картинки ведь, которую потом искать?
EDV » 06 янв 2010, 14:56
Метод Write может не только создавать новые матрицы в дереве поиска, но и использовать уже существующие. Так что пред записью лучше попробовать посмотреть с помощью метода Read, возможно нашей «области интереса» уже соответствует какое то ассоциативное ядро, и тогда или ничего не делаем или корректируем его содержимое.
>> Если картинки мы бы еще запоминали - запомнили бы под 1 наш образ 144 картинки?
Ну, это если каждому ассоциативному ядру ставить в соответствие уникальную картинку области интереса (а если картинки очень похожие?).
>> Кстати, а алгоритм выдаст номер картинки ведь, которую потом искать?
В том варианте, что я выше рассматривал, именно так, должен выдать индекс картинки в массиве указателей.
=DeaD= » 06 янв 2010, 14:59
Хм, ну при малых количествах картинок нормально должно быть (144 картинки по 80х80 пикселей, 24 бита цветов - это чуть меньше 3Мб на образ).
Кстати, алгоритм AVM работает в ч/б или в цвете?
И еще - а получается все 144 картинки если их тупо запоминать могут оказаться со смещениями? Или если их нормально запоминали - они будут 1 в 1 только с разными видео-помехами?
EDV » 06 янв 2010, 15:07
>> Кстати, алгоритм AVM работает в ч/б или в цвете?
Алгоритма AVM работает с черно-белыми изображениями (цвета не видит).
Что бы в приложении Recognition.exe посмотреть исходное изображение для алгоритма AVM, нужно из главного меню выбрать: Распознавание/Показать входное изображение.
>> И еще - а получается все 144 картинки если их тупо запоминать могут оказаться со смещениями?
Ну, думаю, если объект в кадре дергали туда-сюда, и поворачивали под разными углами, то мы именно это на картинках и увидим (смещение в кадре/поворот изображения).
Виталий » 06 янв 2010, 15:13
Считаю целесообразно использовать AVM не в качестве распознавателя, а в качестве фильтра. Т.е. быстро и неточно находить образы, а потом хоть корреляцией уточнять позицию "маяка".
=DeaD= » 06 янв 2010, 15:29
Так я это и предлагаю, просто выясняю сейчас, как оно работает, в какое место лучше подцепиться
Добавлено спустя 2 минуты 41 секунду:EDV писал(а):>> И еще - а получается все 144 картинки если их тупо запоминать могут оказаться со смещениями?
Ну, думаю, если объект в кадре дергали туда-сюда, и поворачивали под разными углами, то мы именно это на картинках и увидим (смещение в кадре/поворот изображения).
А вот это хуже
в этом случае не ясно, что считать правильными координатами образа, особенно если его поворачивали... Надо подумать. А если не крутить и не трясти - оно нормально распознаётся? То есть можно ли для начала считать, что образ во время обучения неподвижен? Не сильно хуже результаты будут?