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