Отобразите классификацию категорий Используя набор признаков

В этом примере показано, как использовать подход набора признаков для классификации категорий изображений. Этот метод также часто упоминается как мешок слов. Классификация визуального изображения является процессом присвоения подписи категории к изображению под тестом. Категории могут содержать изображения, представляющие примерно, что-либо, например, собаки, кошки, обучается, лодки.

Загрузите набор данных изображений

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

unzip('MerchData.zip');

Загрузите коллекцию изображений с помощью imageDatastore помочь вам управлять данными. Поскольку imageDatastore работает с местоположениями файла изображения, и поэтому не загружает все изображения в память, безопасно использовать на больших коллекциях изображений.

imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');

Можно легко смотреть количество изображений на категорию, а также подписи категорий как показано ниже:

tbl = countEachLabel(imds)
tbl=5×2 table
             Label             Count
    _______________________    _____

    MathWorks Cap               15  
    MathWorks Cube              15  
    MathWorks Playing Cards     15  
    MathWorks Screwdriver       15  
    MathWorks Torch             15  

Обратите внимание на то, что метки были выведены из имен каталогов, раньше создавал ImageDatastore, но может быть настроен путем ручной установки свойства Labels объекта ImageDatastore. Затем отобразите несколько изображений, чтобы получить смысл типа используемых изображений.

figure
montage(imds.Files(1:16:end))

Figure contains an axes object. The axes object contains an object of type image.

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

Подготовьте наборы обучения и валидации изображений

Разделите наборы на данные об обучении и валидации. Выберите 60% изображений от каждого набора для обучающих данных и остатка, 40%, для данных о валидации. Рандомизируйте разделение, чтобы не смещать результаты.

[trainingSet, validationSet] = splitEachLabel(imds, 0.6, 'randomize');

Вышеупомянутый вызов возвращает два объекта imageDatastore, готовые к задачам обучения и валидации.

Создайте визуальный словарь и обучите классификатор категории изображений

Мешок слов является методом, адаптированным к компьютерному зрению от мира обработки естественного языка. Поскольку изображения на самом деле не содержат дискретные слова, мы сначала создаем "словарь" extractFeatures представитель функций каждой категории изображений.

Это выполняется с одним вызовом bagOfFeatures функция, который:

  1. SURF извлечений показывает от всех изображений во всех категориях изображений

  2. создает визуальный словарь путем сокращения количества функций посредством квантования пространства признаков с помощью кластеризации K-средних значений

bag = bagOfFeatures(trainingSet);
Creating Bag-Of-Features.
-------------------------
* Image category 1: MathWorks Cap
* Image category 2: MathWorks Cube
* Image category 3: MathWorks Playing Cards
* Image category 4: MathWorks Screwdriver
* Image category 5: MathWorks Torch
* Selecting feature point locations using the Grid method.
* Extracting SURF features from the selected feature point locations.
** The GridStep is [8 8] and the BlockWidth is [32 64 96 128].

* Extracting features from 45 images...done. Extracted 141120 features.

* Keeping 80 percent of the strongest features from each category.

* Creating a 500 word visual vocabulary.
* Number of levels: 1
* Branching factor: 500
* Number of clustering steps: 1

* [Step 1/1] Clustering vocabulary level 1.
* Number of features          : 112895
* Number of clusters          : 500
* Initializing cluster centers...100.00%.
* Clustering...completed 27/100 iterations (~0.21 seconds/iteration)...converged in 27 iterations.

* Finished creating Bag-Of-Features

Кроме того, объект bagOfFeatures обеспечивает encode метод для подсчета визуальных случаев слова в изображении. Это произвело гистограмму, которая становится новым и уменьшаемым представлением изображения.

img = readimage(imds, 1);
featureVector = encode(bag, img);
Encoding images using Bag-Of-Features.
--------------------------------------
* Encoding an image...done.
% Plot the histogram of visual word occurrences
figure
bar(featureVector)
title('Visual word occurrences')
xlabel('Visual word index')
ylabel('Frequency of occurrence')

Figure contains an axes object. The axes object with title Visual word occurrences contains an object of type bar.

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

Закодированные учебные изображения от каждой категории поданы в процесс обучения классификатора, вызванный trainImageCategoryClassifier функция. Обратите внимание на то, что эта функция использует мультикласс линейный классификатор SVM от Statistics and Machine Learning Toolbox™.

categoryClassifier = trainImageCategoryClassifier(trainingSet, bag);
Training an image category classifier for 5 categories.
--------------------------------------------------------
* Category 1: MathWorks Cap
* Category 2: MathWorks Cube
* Category 3: MathWorks Playing Cards
* Category 4: MathWorks Screwdriver
* Category 5: MathWorks Torch

* Encoding features for 45 images...done.

* Finished training the category classifier. Use evaluate to test the classifier on a test set.

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

Оцените эффективность классификатора

Теперь, когда у нас есть обученный классификатор, categoryClassifier, давайте оценим его. Как проверка работоспособности, давайте сначала протестируем его с набором обучающих данных, который должен произвести близкую совершенную матрицу беспорядка, i.e. единицы на диагонали.

confMatrix = evaluate(categoryClassifier, trainingSet);
Evaluating image category classifier for 5 categories.
-------------------------------------------------------

* Category 1: MathWorks Cap
* Category 2: MathWorks Cube
* Category 3: MathWorks Playing Cards
* Category 4: MathWorks Screwdriver
* Category 5: MathWorks Torch

* Evaluating 45 images...done.

* Finished evaluating all the test sets.

* The confusion matrix for this test set is:


                                                                          PREDICTED
KNOWN                      | MathWorks Cap   MathWorks Cube   MathWorks Playing Cards   MathWorks Screwdriver   MathWorks Torch   
----------------------------------------------------------------------------------------------------------------------------------
MathWorks Cap              | 1.00            0.00             0.00                      0.00                    0.00              
MathWorks Cube             | 0.00            0.89             0.00                      0.00                    0.11              
MathWorks Playing Cards    | 0.00            0.00             1.00                      0.00                    0.00              
MathWorks Screwdriver      | 0.00            0.00             0.00                      1.00                    0.00              
MathWorks Torch            | 0.00            0.00             0.00                      0.00                    1.00              

* Average Accuracy is 0.98.

Затем давайте оценим классификатор на validationSet, который не использовался во время обучения. По умолчанию, evaluate функция возвращает матрицу беспорядка, которая является хорошим начальным индикатором того, как хорошо классификатор выполняет.

confMatrix = evaluate(categoryClassifier, validationSet);
Evaluating image category classifier for 5 categories.
-------------------------------------------------------

* Category 1: MathWorks Cap
* Category 2: MathWorks Cube
* Category 3: MathWorks Playing Cards
* Category 4: MathWorks Screwdriver
* Category 5: MathWorks Torch

* Evaluating 30 images...done.

* Finished evaluating all the test sets.

* The confusion matrix for this test set is:


                                                                          PREDICTED
KNOWN                      | MathWorks Cap   MathWorks Cube   MathWorks Playing Cards   MathWorks Screwdriver   MathWorks Torch   
----------------------------------------------------------------------------------------------------------------------------------
MathWorks Cap              | 1.00            0.00             0.00                      0.00                    0.00              
MathWorks Cube             | 0.00            0.67             0.17                      0.17                    0.00              
MathWorks Playing Cards    | 0.00            0.00             1.00                      0.00                    0.00              
MathWorks Screwdriver      | 0.00            0.00             0.00                      1.00                    0.00              
MathWorks Torch            | 0.17            0.00             0.00                      0.00                    0.83              

* Average Accuracy is 0.90.
% Compute average accuracy
mean(diag(confMatrix))
ans = 0.9000

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

Попробуйте недавно обученный классификатор на тестовых изображениях

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

img = imread(fullfile('MerchData','MathWorks Cap','Hat_0.jpg'));
figure
imshow(img)

Figure contains an axes object. The axes object contains an object of type image.

[labelIdx, scores] = predict(categoryClassifier, img);
Encoding images using Bag-Of-Features.
--------------------------------------
* Encoding an image...done.
% Display the string label
categoryClassifier.Labels(labelIdx)
ans = 1x1 cell array
    {'MathWorks Cap'}

Для просмотра документации необходимо авторизоваться на сайте