Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27: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 и сравните полученные результаты с ранее реализованным подходом.

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

7.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 
  */ 
} 

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

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

7.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; 
  } 
} 

7.4. Приложение Г. Исходный код заголовочного файла модуля, содержащего реализацию основных стадий bag-of- words подхода

#include <opencv2/features2d/features2d.hpp> 
#include <opencv2/ml/ml.hpp> 
#include <vector> 
#include <string> 
 
cv::Mat  TrainVocabulary(const  std::vector<std::string>& 
filesList,  const  std::vector<bool>&  is_voc,  const 
cv::Ptr<cv::FeatureDetector>&  keypointsDetector,  const 
cv::Ptr<cv::DescriptorExtractor>&  descriptorsExtractor,  int 
vocSize); 
 
cv::Mat  ExtractFeaturesFromImage(  
cv::Ptr<cv::FeatureDetector>  keypointsDetector, 
cv::Ptr<cv::BOWImgDescriptorExtractor>  bowExtractor,  const 
std::string& fileName); 
 
void  ExtractTrainData(const  std::vector<std::string>& 
filesList, const std::vector<bool>& isTrain, const cv::Mat& 
responses,    const  cv::Ptr<cv::FeatureDetector>& 
keypointsDetector,  const 
cv::Ptr<cv::BOWImgDescriptorExtractor>&  bowExtractor, 
cv::Mat& trainData, cv::Mat& trainResponses); 
 
cv::Ptr<CvRTrees> TrainClassifier(const cv::Mat& trainData, 
const cv::Mat& trainResponses); 
int  Predict(const  cv::Ptr<cv::FeatureDetector> 
keypointsDetector,  const 
cv::Ptr<cv::BOWImgDescriptorExtractor> bowExtractor,  
  const  cv::Ptr<CvRTrees>  classifier,  const 
std::string& fileName); 
 
cv::Mat  PredictOnTestData(const  std::vector<std::string>& 
filesList, const std::vector<bool>& isTrain,  
  const  cv::Ptr<cv::FeatureDetector>  keypointsDetector, 
const  cv::Ptr<cv::BOWImgDescriptorExtractor>  bowExtractor, 
const cv::Ptr<CvRTrees> classifier); 
 
cv::Mat  GetTestResponses(const  cv::Mat&  responses,  const 
std::vector<bool>& isTrain); 
 
float  CalculateMisclassificationError(cv::Mat&  responses, 
cv::Mat& predictions); 

7.5. Приложение Д. Исходный код модуля, содержащего реализацию основных стадий bag-of-words подхода

#include "bow.h" 
#include <opencv2/highgui/highgui.hpp> 
 
using namespace cv; 
using namespace std; 
 
Mat  TrainVocabulary(const  vector<string>&  filesList,  const 
vector<bool>& is_voc,  
  const  Ptr<FeatureDetector>&  keypointsDetector,  const 
Ptr<DescriptorExtractor>&  descriptorsExtractor,  int 
vocSize) 
{ 
  /* 
  TODO: реализовать функциональность, 
   описаннную в разделе 3.1.2 
  */ 
 
} 
 
Mat ExtractFeaturesFromImage( 
     Ptr<FeatureDetector> keypointsDetector, 
     Ptr<BOWImgDescriptorExtractor> bowExtractor,      const string& fileName) 
{ 
  /* 
  TODO: реализовать функциональность, 
   описаннную в разделе 3.1.2 
  */ 
} 
 
void ExtractTrainData(const vector<string>& filesList,  
const vector<bool>& isTrain,  
const Mat& responses,  
  const Ptr<FeatureDetector>& keypointsDetector, 
const Ptr<BOWImgDescriptorExtractor>& bowExtractor, 
Mat& trainData,  
Mat& trainResponses) 
{ 
  /* 
  TODO: реализовать функциональность, 
   описаннную в разделе 3.1.2 
  */ 
} 
 
Ptr<CvRTrees> TrainClassifier(const Mat& trainData,  
const Mat& trainResponses) 
{ 
  /* 
  TODO: реализовать функциональность, 
   описаннную в разделе 3.1.2 
  */ 
} 
 
int Predict(const Ptr<FeatureDetector> keypointsDetector,  
const Ptr<BOWImgDescriptorExtractor> bowExtractor,  
  const Ptr<CvRTrees> classifier,  
const string& fileName) 
{ 
  /* 
  TODO: реализовать функциональность, 
   описаннную в разделе 3.1.2 
  */ 
} 
 
Mat PredictOnTestData(const vector<string>& filesList,  
const vector<bool>& isTrain,  
  const Ptr<FeatureDetector> keypointsDetector,  
const Ptr<BOWImgDescriptorExtractor> bowExtractor, 
const Ptr<CvRTrees> classifier) 
{ 
    /* 
  TODO: реализовать функциональность,    описаннную в разделе 3.1.2 
  */ 
} 
 
Mat GetTestResponses(const Mat& responses,  
const vector<bool>& isTrain) 
{ 
  /* 
  TODO: реализовать функциональность, 
   описаннную в разделе 3.1.2 
  */ 
} 
 
float CalculateMisclassificationError(Mat& responses,  
            Mat& predictions) 
{ 
  /* 
  TODO: реализовать функциональность, 
   описаннную в разделе 3.1.2 
  */ 
}

Андрей Терёхин
Андрей Терёхин

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

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

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

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