exponenta event banner

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

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

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

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

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

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

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

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

В примере используется fitcecoc из Toolbox™ статистики и машинного обучения и extractHOGFeatures функции из 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 кодирует правильный объем информации об объекте. extractHOGFeatures функция возвращает выходные данные визуализации, которые могут помочь сформировать некоторую интуицию о том, что означает «правильный объем информации». Изменяя параметр размера ячейки HOG и визуализируя результат, можно увидеть влияние параметра размера ячейки на объем информации о форме, закодированной в векторе признаков:

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

Ссылки

[1] Н. Далал и Б. Триггеры, «Гистограммы ориентированных градиентов для обнаружения человека», Proc. IEEE Conf. Computer Vision and Pattern Recognition, vol. 1, pp. 886-893, 2005.

[2] ЛеКун, Ю., Боттоу, Л., Бенгио, Я., и Хаффнер, П. (1998). Градиентное обучение, применяемое к распознаванию документов. Материалы IEEE, 86, 2278-2324.

[3] Y. Netzer, T. Wang, A. Coates, A. Bissacco, B. Wu, A.Y. Ng, чтение цифр в естественных изображениях с помощью неуправляемого учебного семинара NIPS по глубокому обучению и незарегистрированному учебному обучению в 2011 году.