Классификация цифр, использующая функции ПОЖИРАТЕЛЯ РЕСУРСОВ

В этом примере показано, как классифицировать цифры, использующие функции ПОЖИРАТЕЛЯ РЕСУРСОВ и мультикласс классификатор SVM.

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

  • Получите набор маркированных данных с изображениями требуемого объекта.

  • Разделите набор данных в набор обучающих данных и набор тестов.

  • Обучите классификатор, используя признаки, извлеченные из обучающего набора.

  • Протестируйте функции использующего классификатора, извлеченные из набора тестов.

Для иллюстрации в этом примере показано, как классифицировать числовые цифры с помощью Hog (гистограммы ориентированного градиента) признаков [1] и мультиклассового SVM (Support Vector Machine) классификатора. Этот тип классификации часто используется во многих приложениях оптического распознавания символов (OCR).

Пример использует fitcecoc функция от Statistics and Machine Learning Toolbox™ и extractHOGFeatures функция от Computer Vision Toolbox™.

Цифровой Набор Данных

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

% Load training and test data using |imageDatastore|.
syntheticDir   = fullfile(toolboxdir('vision'), 'visiondata','digits','synthetic');
handwrittenDir = fullfile(toolboxdir('vision'), 'visiondata','digits','handwritten');

% |imageDatastore| recursively scans the directory tree containing the
% images. Folder names are automatically used as labels for each image.
trainingSet = imageDatastore(syntheticDir,   'IncludeSubfolders', true, 'LabelSource', 'foldernames');
testSet     = imageDatastore(handwrittenDir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');

Используйте countEachLabel свести в таблицу количество изображений, сопоставленных с каждой меткой. В этом примере набор обучающих данных состоит из 101 изображения для каждой из этих 10 цифр. Набор тестов состоит из 12 изображений на цифру.

countEachLabel(trainingSet)
ans=10×2 table
    Label    Count
    _____    _____

      0       101 
      1       101 
      2       101 
      3       101 
      4       101 
      5       101 
      6       101 
      7       101 
      8       101 
      9       101 

countEachLabel(testSet)
ans=10×2 table
    Label    Count
    _____    _____

      0       12  
      1       12  
      2       12  
      3       12  
      4       12  
      5       12  
      6       12  
      7       12  
      8       12  
      9       12  

Покажите несколько из обучения и протестируйте изображения

figure;

subplot(2,3,1);
imshow(trainingSet.Files{102});

subplot(2,3,2);
imshow(trainingSet.Files{304});

subplot(2,3,3);
imshow(trainingSet.Files{809});

subplot(2,3,4);
imshow(testSet.Files{13});

subplot(2,3,5);
imshow(testSet.Files{37});

subplot(2,3,6);
imshow(testSet.Files{97});

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

% Show pre-processing results
exTestImage = readimage(testSet,37);
processedImage = imbinarize(rgb2gray(exTestImage));

figure;

subplot(1,2,1)
imshow(exTestImage)

subplot(1,2,2)
imshow(processedImage)

Использование функций ПОЖИРАТЕЛЯ РЕСУРСОВ

Данные, используемые, чтобы обучить классификатор, являются характеристическими векторами ПОЖИРАТЕЛЯ РЕСУРСОВ, извлеченными из учебных изображений. Поэтому важно убедиться, что характеристический вектор ПОЖИРАТЕЛЯ РЕСУРСОВ кодирует правильный объем информации об объекте. extractHOGFeatures функция возвращает визуализацию выход, который может помочь сформировать некоторую интуицию о, что означает "правильный объем информации". Путем варьирования параметра размера ячейки ПОЖИРАТЕЛЯ РЕСУРСОВ и визуализации результата, вы видите влияние, которое параметр размера ячейки оказывает на сумму информации о форме, закодированной в характеристическом векторе:

img = readimage(trainingSet, 206);

% Extract HOG features and HOG visualization
[hog_2x2, vis2x2] = extractHOGFeatures(img,'CellSize',[2 2]);
[hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',[4 4]);
[hog_8x8, vis8x8] = extractHOGFeatures(img,'CellSize',[8 8]);

% Show the original image
figure; 
subplot(2,3,1:3); imshow(img);

% Visualize the HOG features
subplot(2,3,4);  
plot(vis2x2); 
title({'CellSize = [2 2]'; ['Length = ' num2str(length(hog_2x2))]});

subplot(2,3,5);
plot(vis4x4); 
title({'CellSize = [4 4]'; ['Length = ' num2str(length(hog_4x4))]});

subplot(2,3,6);
plot(vis8x8); 
title({'CellSize = [8 8]'; ['Length = ' num2str(length(hog_8x8))]});

Визуализация показывает, что размер ячейки [8 8] не кодирует много информации о форме, в то время как размер ячейки [2 2] кодирует большую информацию о форме, но увеличивает размерность характеристического вектора ПОЖИРАТЕЛЯ РЕСУРСОВ значительно. Хороший компромисс является размером ячейки 4 на 4. Эта установка размера кодирует достаточно пространственной информации, чтобы визуально идентифицировать форму цифры при ограничении количества размерностей в характеристическом векторе ПОЖИРАТЕЛЯ РЕСУРСОВ, который помогает ускорить обучение. На практике в зависимости от параметров ПОЖИРАТЕЛЯ РЕСУРСОВ нужно меняться в зависимости от повторного обучения классификатора и тестирующий, чтобы идентифицировать оптимальные установки параметров.

cellSize = [4 4];
hogFeatureSize = length(hog_4x4);

Обучите классификатор цифры

Классификация цифр - это многоклассовая задача классификации, в которой вы должны классифицировать изображение в один из десяти возможных классов цифр. В этом примере, fitcecoc функция от Statistics and Machine Learning Toolbox™ используется, чтобы создать классификатор мультикласса с помощью бинарного SVMs.

Запустите путем извлечения функций ПОЖИРАТЕЛЯ РЕСУРСОВ из набора обучающих данных. Эти функции будут использованы, чтобы обучить классификатор.

% Loop over the trainingSet and extract HOG features from each image. A
% similar procedure will be used to extract features from the testSet.

numImages = numel(trainingSet.Files);
trainingFeatures = zeros(numImages, hogFeatureSize, 'single');

for i = 1:numImages
    img = readimage(trainingSet, i);
    
    img = rgb2gray(img);
    
    % Apply pre-processing steps
    img = imbinarize(img);
    
    trainingFeatures(i, :) = extractHOGFeatures(img, 'CellSize', cellSize);  
end

% Get labels for each image.
trainingLabels = trainingSet.Labels;

Затем обучите классификатор, использующий извлеченные функции.

% fitcecoc uses SVM learners and a 'One-vs-One' encoding scheme.
classifier = fitcecoc(trainingFeatures, trainingLabels);

Оцените классификатор цифры

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

Как на учебном шаге, сначала извлеките функции ПОЖИРАТЕЛЯ РЕСУРСОВ из тестовых изображений. Эти функции будут использованы, чтобы сделать прогнозы с помощью обученного классификатора.

% Extract HOG features from the test set. The procedure is similar to what
% was shown earlier and is encapsulated as a helper function for brevity.
[testFeatures, testLabels] = helperExtractHOGFeaturesFromImageSet(testSet, hogFeatureSize, cellSize);

% Make class predictions using the test features.
predictedLabels = predict(classifier, testFeatures);

% Tabulate the results using a confusion matrix.
confMat = confusionmat(testLabels, predictedLabels);

helperDisplayConfusionMatrix(confMat)
digit  | 0        1        2        3        4        5        6        7        8        9        
---------------------------------------------------------------------------------------------------
0      | 0.25     0.00     0.08     0.00     0.00     0.00     0.58     0.00     0.08     0.00     
1      | 0.00     0.75     0.00     0.00     0.08     0.00     0.00     0.08     0.08     0.00     
2      | 0.00     0.00     0.67     0.17     0.00     0.00     0.08     0.00     0.00     0.08     
3      | 0.00     0.00     0.00     0.58     0.00     0.00     0.33     0.00     0.00     0.08     
4      | 0.00     0.08     0.00     0.17     0.75     0.00     0.00     0.00     0.00     0.00     
5      | 0.00     0.00     0.00     0.00     0.00     0.33     0.58     0.00     0.08     0.00     
6      | 0.00     0.00     0.00     0.00     0.25     0.00     0.67     0.00     0.08     0.00     
7      | 0.00     0.08     0.08     0.33     0.00     0.00     0.17     0.25     0.00     0.08     
8      | 0.00     0.00     0.00     0.08     0.00     0.00     0.00     0.08     0.67     0.17     
9      | 0.00     0.08     0.00     0.25     0.17     0.00     0.08     0.00     0.00     0.42     

Таблица показывает матрицу беспорядка в форме процента. Столбцы матрицы представляют предсказанные метки, в то время как строки представляют известные метки. Для этого набора тестов цифра 0 часто неправильно классифицируется как 6, скорее всего, из-за их подобных форм. Подобные ошибки замечены для 9 и 3. Обучение с более представительным набором данных как MNIST [2] или SVHN [3], которые содержат тысячи рукописных символов, вероятно, произведет лучший классификатор по сравнению с тем, созданным с помощью этого синтетического набора данных.

Сводные данные

Этот пример проиллюстрировал основную процедуру для создания классификатора мультиобъекта класса с помощью extractHOGfeatures функция от Computer Vision Toolbox и fitcecoc функция от Statistics and Machine Learning Toolbox™. Несмотря на то, что функции ПОЖИРАТЕЛЯ РЕСУРСОВ и классификатор ECOC использовались здесь, другие функции и алгоритмы машинного обучения могут использоваться таким же образом. Например, можно исследовать использующие различные типы функции для обучения классификатор; или вы видите эффект использования других алгоритмов машинного обучения, доступных в Statistics and Machine Learning Toolbox™, таких как k - ближайших соседей.

Вспомогательные Функции

function helperDisplayConfusionMatrix(confMat)
% Display the confusion matrix in a formatted table.

% Convert confusion matrix into percentage form
confMat = bsxfun(@rdivide,confMat,sum(confMat,2));

digits = '0':'9';
colHeadings = arrayfun(@(x)sprintf('%d',x),0:9,'UniformOutput',false);
format = repmat('%-9s',1,11);
header = sprintf(format,'digit  |',colHeadings{:});
fprintf('\n%s\n%s\n',header,repmat('-',size(header)));
for idx = 1:numel(digits)
    fprintf('%-9s',   [digits(idx) '      |']);
    fprintf('%-9.2f', confMat(idx,:));
    fprintf('\n')
end
end
function [features, setLabels] = helperExtractHOGFeaturesFromImageSet(imds, hogFeatureSize, cellSize)
% Extract HOG features from an imageDatastore.

setLabels = imds.Labels;
numImages = numel(imds.Files);
features  = zeros(numImages, hogFeatureSize, 'single');

% Process each image and extract features
for j = 1:numImages
    img = readimage(imds, j);
    img = rgb2gray(img);
    
    % Apply pre-processing steps
    img = imbinarize(img);
    
    features(j, :) = extractHOGFeatures(img,'CellSize',cellSize);
end
end

Ссылки

[1] Н. Дэлэл и Б. Триггс, "Гистограммы Ориентированных Градиентов для Человеческого Обнаружения", Proc. Компьютерное зрение Конференции IEEE и Распознавание образов, издание 1, стр 886-893, 2005.

[2] LeCun, Y., Bottou, L., Bengio, Y. и Haffner, P. (1998). Основанное на градиенте изучение применилось к распознаванию документа. Продолжения IEEE, 86, 2278-2324.

[3] И. Нецер, Т. Ван, А. Коутс, А. Биссэкко, Б. Ву, А.И. Ын, читая цифры в естественных изображениях с безнадзорной функцией, изучающей семинар NIPS по глубокому обучению и безнадзорной функции, учащейся 2011.