Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27:00

Самостоятельная работа 4: Классификация изображений с использованием bag-of-words методов

2.2. Вычисление детекторов ключевых точек на изображении

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

Одним из наиболее известных дескрипторов ключевых точек является SIFT (Scale Invariant Feature Transform) [8], в основе которого лежит идея вычисления гистограммы ориентированных градиентов в окрестности особой точки. Модификацией данного дескриптора является PCA-SIFT [6], который строится по той же схеме, используя окрестность большего размера. Для результирующего набора дескрипторов осуществляется снижение размерности векторов посредством анализа главных компонент (Principal Component Analysis, PCA) [5].

Дескриптор SURF (Speeded up Robust Features) [2] также относится к числу тех дескрипторов, которые одновременно выполняют поиск особых точек и строят их описание, инвариантное к изменению масштаба и повороту изображения. Фактически данный дескриптор представляет собой взвешенные значения градиентов и их абсолютных значений в 16 квадрантах, на которые разбита окрестность особой точки.

Цель создания дескриптора BRIEF (Binary Robust Independent Elementary Features) [4] состояла в том, чтобы обеспечить распознавание одинаковых участков изображения, которые были получены с разных углов обзора. При этом ставилась задача уменьшить количество выполняемых вычислений. В окрестности точки выбирается некоторым образом множество пар пикселей, и на данном множестве строится набор бинарных тестов, представляющих собой сравнение интенсивности в соответствующих пикселях. Результаты тестов объединяются в битовую строку, которая и является итоговым дескриптором ключевой точки. Более эффективной альтернативой дескриптору BRIEF является бинарный дескриптор ORB [12].

Подробное описание дескрипторов ключевых точек можно найти в лекционной части курса.

В библиотеке OpenCV реализовано вычисление следующих дескрипторов ключевых точек: SIFT, SURF, BRIEF, ORB, для использования которых необходимо в исходном коде приложения подключить заголовочный файл opencv2/features2d/features2d.hpp, а в настройках проекта библиотеку features2d243(d).lib

Классы, содержащие реализацию алгоритмов вычисления данных дескрипторов, унаследованы от базового абстрактного класса DescriptorExtractor. Рассмотрим подробнее методы данного класса.

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

Ptr<DescriptorExtractor> DescriptorExtractor::create( 
                     const string& descriptorExtractorType) 
                     

В качестве параметра данной функции передается строка, содержащая идентификатор типа дескриптора ("SIFT", "SURF", "BRIEF", "ORB").

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

void  DescriptorExtractor::compute(const  Mat&  image,          
          vector<KeyPoint>& keypoints,  
Mat& descriptors) const 

Рассмотрим параметры данного метода:

  • image – входное изображение.
  • keypoints – массив ключевых точек на изображении.
  • descriptors – вычисленные значения дескрипторов ключевых точек.

Необходимо учесть, что при использовании дескрипторов SIFT и SURF требуется дополнительно подключить заголовочный файл opencv2/nonfree/nonfree.hpp и библиотеку opencv_nonfree243(d).lib, а также вызвать функцию инициализации данного модуля: initModule_nonfree().

Рассмотрим пример функции, которая принимает на вход изображение и заранее найденные на нем ключевые точки и возвращает вычисленные значения SIFT дескрипторов в данных точках.

// img – исходное изображение 
// keypoints – ключевые точки на изображении 
// descriptors – вычисленные значения дескрипторов 
//          ключевых точек     
void ComputeKeypointDescriptorsOnImage( 
                  const string& fileName, 
                  vector<KeyPoint>& keypoints,  
                  Mat& descriptors) 
{ 
  // инициализируем модуль nonfree для использования 
// дескрипторов SIFT 
// (если данная функция ранее не вызывалась) 
initModule_nonfree();  
// создаем объект класса вычисления SIFT дескрипторов 
Ptr<DescriptorExtractor> descExtractor = 
              DescriptorExtractor::create("SIFT"); 
// вычисляем дескрипторы ключевых точек  
// на загруженном изображении 
descExtractor->compute(img, keypoints, descriptors);  
} 

2.3. Обучение словаря с использованием алгоритма кластеризации K-means

Одним из основных подходов к обучению словаря дескрипторов является использование алгоритмов кластеризации, в частности, K-means [5], который разбивает множество объектов на заранее известное число кластеров. В основе данного алгоритма лежит итерационная процедура, в рамках которой вычисляются центроиды кластеров (как математическое ожидание относящихся к данным кластерам объектов), а потом обновляется информация о принадлежности каждого объекта к кластерам путем выбора ближайшего центроида.

Для обучения словаря с использованием алгоритма K-means в библиотеке OpenCV реализован класс BOWKMeansTrainer, унаследованный от базового абстрактного класса BOWKMeansTrainer. Рассмотрим методы данного класса.

BOWKMeansTrainer(int clusterCount,  
const TermCriteria&   termcrit = TermCriteria(), 
   int attempts=3, int flags=KMEANS_PP_CENTERS)
   

Параметры конструктора данного класса соответствуют параметрам функции kmeans библиотеки OpenCV.

  • сlusterCount – число слов в словаре (соответствует числу кластеров в алгоритме K-means).
  • termcrit – критерий остановки алгоритма кластеризации (максимальное число итераций или(и) достижение заданной точности). Точность задается в соответствующем поле criteria.epsilon. Если в результате очередной итерации алгоритма центроиды изменились на величину, меньше данного параметра, то алгоритм останавливает работу.
  • attempts – число запусков алгоритма кластеризации со случайно выбранными центроидами на начальной итерации алгоритма.
  • flags – параметр, определяющий способ инициализации центроидов на начальной итерации алгоритма. Возможные значения:
  • KMEANS_RANDOM_CENTERS – использовать случайно выбранные центроиды.
  • KMEANS_PP_CENTERS – использовать эвристику Arthur and Vassilvitskii [5]. Данный параметр показал лучшую эффективность на практике и используется по умолчанию.

Для формирования выборки объектов, на которой будет проходить обучение словаря, должен быть использован метод add:

void BOWTrainer::add(const Mat& descriptors)  

В качестве параметра данной функции передается набор (матрица) дескрипторов особых точек, вычисленных ранее.

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

Mat BOWTrainer::cluster() 

Данный метод возвращает набор центроидов построенных кластеров, который в дальнейшем используется в качестве словаря дескрипторов особых точек.

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

// descriptors – предвычисленный набор дескрипторов 
// изображений, используемый при построении словаря; 
// vocSize – размер словаря; 
Mat  BuildVocabulary(const  std::vector<Mat>&  descriptors,   
int vocSize) 
{ 
  // создаем объект класса BOWTrainer с числом 
// кластеров, равным vocSize, и остальными 
// параметрами, используемыми по умолчанию 
BOWKMeansTrainer bowTrainer(vocSize); 
// добавляем дескрипторы особых точек с изображений, 
// используемых при обучении словаря  
for (size_t i = 0; i < descriptors.size(); i++) 
{ 
     bowTrainer.add(descriptors[i]); 
} 
// вызываем метод обучения словаря 
Mat voc = bowTrainer.cluster(); 
return voc; 
} 
Андрей Терёхин
Андрей Терёхин

Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции?

Демянчик Иван
Демянчик Иван

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

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "