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

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

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

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

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

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

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

Чтобы проиллюстрировать, этот пример показывает, как классифицировать числовые цифры с помощью ПОЖИРАТЕЛЯ РЕСУРСОВ (Гистограмма Ориентированного Градиента) функции [1] и мультикласс SVM (Машина Вектора Поддержки) классификатор. Этот тип классификации часто используется во многих приложениях Оптического распознавания символов (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-nearest.

Поддерживание функций

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.