В этом примере показано, как использовать подход пакета функций для классификации категорий изображений. Этот метод также часто называют сумкой слов. Категоризация визуальных изображений - это процесс назначения метки категории тестируемому изображению. Категории могут содержать изображения, представляющие практически все, например, собак, кошек, поезда, лодки.
Распакуйте коллекцию изображений для использования в данном примере.
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))

Обратите внимание, что для того, чтобы мешок элементов был эффективным, большая часть объекта должна быть видна на изображении.
Разделите наборы на данные обучения и проверки. Выберите 60% изображений из каждого набора для данных обучения, а остальные 40% - для данных проверки. Рандомизируйте разделение, чтобы избежать смещения результатов.
[trainingSet, validationSet] = splitEachLabel(imds, 0.6, 'randomize');Приведенный выше вызов возвращает два объекта imageDatastore, готовых к выполнению задач обучения и проверки.
Сумка слов - техника, адаптированная к компьютерному зрению из мира обработки естественного языка. Поскольку изображения фактически не содержат дискретных слов, мы сначала построим «лексику» из extractFeatures особенности, характерные для каждой категории изображений.
Это достигается одним вызовом bagOfFeatures функция, которая:
извлекает элементы SURF из всех изображений во всех категориях изображений
строит визуальный словарь, уменьшая количество признаков посредством квантования пространства признаков с помощью кластеризации 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. * Using K-Means clustering to create a 500 word visual vocabulary. * Number of features : 112895 * Number of clusters (K) : 500 * Initializing cluster centers...100.00%. * Clustering...completed 17/100 iterations (~0.39 seconds/iteration)...converged in 17 iterations. * Finished creating Bag-Of-Features
Кроме того, объект bagOfFeatures предоставляет encode способ подсчета вхождений визуального слова в изображении. Он создал гистограмму, которая становится новым и уменьшенным представлением изображения.
img = readimage(imds, 1); featureVector = encode(bag, img); % Plot the histogram of visual word occurrences figure bar(featureVector) title('Visual word occurrences') xlabel('Visual word index') ylabel('Frequency of occurrence')

Эта гистограмма служит основой для обучения классификатора и для фактической классификации изображения. По существу, он кодирует изображение в вектор признаков.
Кодированные обучающие изображения из каждой категории подаются в процесс обучения классификатора, вызываемый trainImageCategoryClassifier функция. Обратите внимание, что эта функция основана на многоклассовом линейном классификаторе SVM из 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Давайте оценим это. В качестве проверки здравомыслия давайте сначала проверим его с помощью обучающего набора, который должен производить почти идеальную матрицу путаницы, т.е. матрицы на диагонали.
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.50 0.17 0.17 0.17
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.87.
% Compute average accuracy
mean(diag(confMatrix))ans = 0.8667
Можно настроить bagOfFeatures гиперпараметры и продолжить оценку обученного классификатора до тех пор, пока вы не будете удовлетворены результатами. Дополнительная статистика может быть получена с использованием остальных аргументов, возвращаемых функцией вычисления. См. справку для imageCategoryClassifier/evaluate.
Теперь можно применить только что обученный классификатор для классификации новых изображений.
img = imread(fullfile('MerchData','MathWorks Cap','Hat_0.jpg')); figure imshow(img)

[labelIdx, scores] = predict(categoryClassifier, img);
% Display the string label
categoryClassifier.Labels(labelIdx)ans = 1x1 cell array
{'MathWorks Cap'}