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

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

2.4. Вычисление признаковых описаний изображений

Большинство известных алгоритмов обучения с учителем требует описания каждого объекта в виде векторов одинаковой длины. В связи с этим напрямую использовать вычисленные значения дескрипторов, объединенные в один вектор, для решения задачи классификации не представляется возможным, т.к. в общем случае число ключевых точек на изображениях различно. К тому же, такое представление в любом случае не обладало бы инвариантностью относительно многих преобразований изображения, т.к. при этом обычно изменяется расположение данных точек и, следовательно, расположение дескрипторов внутри объединенного вектора. Данная проблема решается при использовании bag-of-words подхода [13], в котором изображение описывается не самими дескрипторами, а частотами встречаемости их различных типов на изображении. Типы дескрипторов описываются словарем, который содержит центроиды кластеров дескрипторов особых точек. Таким образом, в случае, когда словарь уже вычислен, признаковое описание изображения вычисляется по следующей схеме:

  • детектирование ключевых точек на изображении и вычисление их дескрипторов;
  • нахождение для каждого вычисленного дескриптора ближайшего к нему центроида кластера;
  • вычисление признакового описания изображения в виде нормированной гистограммы (i-ый бин гистограммы соответствует числу вхождений i-го слова из словаря в описание изображения, что соотвествует числу дескрипторов, отнесенных к i-му кластеру).

Библиотека OpenCV содержит класс BOWImgDescriptorExtractor, реализующий данную схему. Рассмотрим подробнее методы данного класса.

BOWImgDescriptorExtractor::BOWImgDescriptorExtractor( 
const Ptr<DescriptorExtractor>& dextractor,  
const Ptr<DescriptorMatcher>& dmatcher) 

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

  • dextractor – алгоритм, вычисляющий дескрипторы в ключевых точках
  • dmatcher – алгоритм, используемый для нахождения ближайшего центроида к текущему дескриптору ключевой точки (обычно используется L2 метрика)

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

 
void  BOWImgDescriptorExtractor::setVocabulary(const  Mat& 
vocabulary) 

В качестве параметра данному методу передается матрица, содержащая центроиды кластеров (обычно это матрица возвращается методом cluster класса BOWTrainer).

Вычисление признакового описания изображения осуществляется при помощи метода compute.

 
void BOWImgDescriptorExtractor::compute(const Mat& image, 
vector<KeyPoint>& keypoints,  Mat& imgDescriptor, 
vector<vector<int>>* pointIdxsOfClusters=0, 
Mat* descriptors=0 ) 

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

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

Два последних параметра являются необязательными.

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

 
// img – исходное изображение 
// voc – словарь дескрипторов ключевых точек; 
// imgDesc – вычисленное признаковое описание изображения 
void ComputeImgDescriptor(Mat& img, Mat& voc, Mat& imgDesc) 
{ 
  // создаем SIFT детектор ключевых точек 
  Ptr<FeatureDetector> featureDetector = 
                         FeatureDetector::create("SIFT"); 
  // создаем объект класса вычисления 
  // SIFT дескрипторов ключевых точек 
Ptr<DescriptorExtractor> dExtractor = 
               DescriptorExtractor::create("SIFT"); 
// создаем объект класса, находящего ближайший 
// к дескриптору центроид (по L2 метрике) 
Ptr<DescriptorMatcher> descriptorsMatcher =  
                DescriptorMatcher::create("BruteForce"); 
  // создаем объект класса, вычисляющего 
  // признаковое описание изображений 
Ptr<BOWImgDescriptorExtractor> bowExtractor = new  
                              BOWImgDescriptorExtractor( 
                                    dExtractor,  
                                    descriptorsMatcher); 
  // устанавливаем используемый словарь 
  // дескрипторов ключевых точек 
bowExtractor->setVocabulary(voc); 
// находим ключевые точки на изображении vector<KeyPoint> keypoints; 
featureDetector->detect(img, keypoints); 
// вычисляем признаковое описание изображения 
bowExtractor->compute(img, keypoints, imgDesc); 
} 
Андрей Терёхин
Андрей Терёхин

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

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

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

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