Новосибирский Государственный Университет
Опубликован: 20.08.2013 | Доступ: свободный | Студентов: 865 / 38 | Длительность: 14:11:00
Самостоятельная работа 4:

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

4. Контрольные вопросы

  1. Какие основные этапы включают в себя bag-of-words алгоритмы классификации изображений?
  2. Какие требования предъявляются к детекторам и дескрипторам ключевых точек?
  3. Опишите идеи, лежащие в основе детектора и дескриптора SIFT.
  4. Почему в качестве признакового описания изображения обычно не используются вычисленные дескрипторы ключевых точек?
  5. Перечислите алгоритмы, которые возможно использовать при построении словаря дескрипторов ключевых точек.
  6. Что представляет собой итоговое признаковое описание изображения в методах класса bag-of-words, и каким образом оно вычисляется?
  7. Перечислите алгоритмы, которые можно использовать для классификации изображений с использованием вычисленного признакового описания.

5. Дополнительные задания

  1. Добавьте в разработанное приложение вывод информации об изображениях из тестовой выборки, которые были неправильно классифицированы.
  2. Добавьте в разработанное приложение возможность использования в качестве используемого классификатора машины опорных векторов с ядром типа Radial Basis Function. Сравните результаты с ранее реализованным подходом.
  3. Выполните исследование зависимости ошибки классификации от используемых параметров (типа используемых детекторов и дескрипторов ключевых точек, числа слов в словаре, параметров алгоритма обучения с учителем "случайный лес": числа деревьев в ансамбле, максимальной глубины деревьев, входящих в ансамбль).
  4. Реализуйте построение словаря на основе Gaussian Mixture Model и сравните полученные результаты с ранее реализованным подходом.

6. Приложения

6.1. Приложение А. Исходный код основной функции консольного редактора изображений

#include "auxiliary.h" 
#include "bow.h" 
#include <opencv2/nonfree/nonfree.hpp> 
#include <iostream> 
 
using namespace cv; 
using namespace std; 
 
int main(int argc, char* argv[]) 
{ 
  /* 
  TODO: реализовать функциональность, 
  описаннную в разделе 3.1.2 
  */ 
} 
    

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

#include <string> 
#include <vector> 
 
void GetFilesInFolder(const std::string& dirPath, 
      std::vector<std::string> &filesList); 
void InitRandomBoolVector(std::vector<bool>& mask, 
        double prob); 
    

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

#include "auxiliary.h" 
#include <windows.h> 
#include <opencv2/core/core.hpp> 
 
using namespace std; 
using namespace cv; 
 
void GetFilesInFolder(const string& dirPath, 
std::vector<string> &filesList) 
{ 
  HANDLE handle; 
  WIN32_FIND_DATAA fileData; 
 
  if ((handle = FindFirstFileA((dirPath + 
"/*.jpg").c_str(), &fileData)) == INVALID_HANDLE_VALUE) 
  { 
    return; 
  } 
  do 
  { 
    const string file_name = fileData.cFileName; 
    const string full_file_name = dirPath + "/" + 
file_name; 
    filesList.push_back(full_file_name); 
  } 
  while (FindNextFileA(handle, &fileData)); 
  FindClose(handle); 
} 
 
void InitRandomBoolVector(vector<bool>& mask, double prob) 
{ 
  RNG rng = theRNG(); 
  for (size_t i = 0; i < mask.size(); i++) 
  { 
    mask[i] = (rng.uniform(0.0, 1.0) < prob) ? true 
: false; 
  } 
} 
    
Александра Максимова
Александра Максимова

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

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

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?