Классификация цифр с использованием функций HOG

В этом примере показано, как классифицировать цифры с помощью функций HOG и многоклассового классификатора SVM.

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

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

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

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

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

Для иллюстрации в этом примере показано, как классифицировать числовые цифры с помощью HOG (гистограммы ориентированного градиента) функций [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(im2gray(exTestImage));

figure;

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

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

Использование функций HOG

Данные, используемые для обучения классификатора, являются векторами функций HOG, извлеченными из обучающих изображений. Поэтому важно убедиться, что вектор функции HOG кодирует правильный объем информации об объекте. The extractHOGFeatures функция возвращает выход визуализации, который может помочь сформировать некоторую интуицию о том, что означает «правильный объем информации». Варьируя параметр HOG камеры size и визуализируя результат, можно увидеть, эффект параметр камеры size имеет на количестве информации о форме, закодированной в векторе функции:

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] кодирует много информации о форме, но значительно увеличивает размерность вектора функции HOG. Хорошим компромиссом является размер камеры 4 на 4. Этот параметр размера кодирует достаточно пространственной информации, чтобы визуально идентифицировать форму цифры с ограничением количества размерностей в векторе функции HOG, что помогает ускорить обучение. На практике параметры HOG должны варьироваться при повторном обучении и тестировании классификатора, чтобы идентифицировать оптимальные настройки параметра.

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

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

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

Начните с извлечения HOG-элементов из набора обучающих данных. Эти функции будут использоваться для обучения классификатора.

% 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 = im2gray(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);

Вычислите классификатор цифр

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

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

% 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™. Несмотря на то, что здесь использовались функции HOG и классификатор ECOC, аналогичным образом могут использоваться и другие функции и алгоритмы машинного обучения. Например, можно исследовать использование различных типов функций для настройки классификатора; или можно увидеть эффект от использования других алгоритмов машинного обучения, доступных в Toolbox™ Statistics and Machine Learning, таких как 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 = im2gray(img);
    
    % Apply pre-processing steps
    img = imbinarize(img);
    
    features(j, :) = extractHOGFeatures(img,'CellSize',cellSize);
end
end

Ссылки

[1] N. Dalal and B. Triggs, «Гистограммы ориентированных градиентов для обнаружения человека», Proc. IEEE Conf. Компьютерное зрение and Pattern Recognition, vol. 1, pp. 886-893, 2005.

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

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