Текстурируйте классификацию с рассеиванием вейвлета изображений

В этом примере показано, как классифицировать структуры с помощью рассеивания вейвлета изображений. В дополнение к Wavelet Toolbox™ этот пример также требует Parallel Computing Toolbox™ и Image Processing Toolbox™.

В цифровом изображении структура предоставляет информацию о пространственном расположении интенсивности цвета или интенсивностей пикселей. Конкретные пространственные расположения интенсивности цвета или интенсивностей пикселей соответствуют различным внешним видам и непротиворечивости физического отображаемого материала. Текстурируйте классификацию, и сегментация изображений имеет много областей важного приложения. Особенно важным примером является биомедицинский анализ изображения, где нормальные и патологические состояния часто характеризуются морфологическими и гистологическими характеристиками, которые проявляют как различия в структуре [4].

Рассеивание вейвлета изображений

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

Рассеивание вейвлета работает путем расположения каскадом изображения через серию вейвлета, преобразовывает, нелинейность и усреднение [1] [3] [5]. Результат этого глубокого извлечения признаков состоит в том, что изображения в том же классе подвинулись поближе друг к другу в рассеивающемся, преобразовывают представление, в то время как изображения, принадлежащие различным классам, перемещены дальше независимо.

K-ой TIPS

Этот пример использует общедоступную базу данных структуры, KTH-TIPS (Структуры под различным Освещением, Положением и Шкалой) база данных изображений [6]. Набор данных KTH-TIPS, используемый в этом примере, является полутоновой версией. Существует 810 изображений всего с 10 структурами и 81 изображением на структуру. Большинство изображений находится 200 200 в размере. Этот пример принимает, что вы загрузили полутоновый набор данных KTH-TIPS и непросмоленный он так, чтобы 10 классов структуры содержались в отдельных подпапках общей папки. Каждая подпапка названа по имени класса структур, которые это содержит. Не смоля загруженный kth_tips_grey_200x200.tar файл достаточен, чтобы обеспечить папку KTH_TIPS верхнего уровня и необходимую подструктуру папок.

Используйте imageDatastore считывать данные. Установите location свойство imageDatastore к папке, содержащей базу данных KTH-TIPS, к которой у вас есть доступ.

location = fullfile(tempdir,'kth_tips_grey_200x200','KTH_TIPS');
Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames');

Случайным образом выберите и визуализируйте 20 изображений из набора данных.

numImages = 810;
perm = randperm(numImages,20);
for np = 1:20
    subplot(4,5,np)
    im = imread(Imds.Files{perm(np)});
    imagesc(im);    
    colormap gray; axis off;
end

Текстурируйте классификацию

Этот пример использует возможность параллельной обработки MATLAB™ через tall интерфейс массивов. Запустите параллельный пул, если вы в настоящее время не запускаетесь.

if isempty(gcp)
    parpool;
end
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

Для воспроизводимости установите генератор случайных чисел. Переставьте файлы набора данных KTH-TIPS и разделите 810 изображений в два случайным образом выбранных набора, один для обучения и один протянул набор для тестирования. Используйте приблизительно 80% изображений для того, чтобы создать прогнозную модель от рассеивающегося преобразования и используйте остаток для тестирования модели.

rng(100)
Imds = imageDatastore(location,'IncludeSubFolders',true,'FileExtensions','.png','LabelSource','foldernames');
Imds = shuffle(Imds);
[trainImds,testImds] = splitEachLabel(Imds,0.8);

У нас теперь есть два набора данных. Набор обучающих данных состоит из 650 изображений с 65 изображениями на структуру. Набор тестирования состоит из 160 изображений с 16 изображениями на структуру. Чтобы проверить, считайте метки в каждом наборе данных.

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

    aluminium_foil     65  
    brown_bread        65  
    corduroy           65  
    cotton             65  
    cracker            65  
    linen              65  
    orange_peel        65  
    sandpaper          65  
    sponge             65  
    styrofoam          65  

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

    aluminium_foil     16  
    brown_bread        16  
    corduroy           16  
    cotton             16  
    cracker            16  
    linen              16  
    orange_peel        16  
    sandpaper          16  
    sponge             16  
    styrofoam          16  

Создайте tall массивы для измененных изображений.

Ttrain = tall(trainImds);
Ttest = tall(testImds);

Создайте рассеивающуюся среду для входного размера изображений 200 200 с InvarianceScale из 150. Гиперпараметр шкалы инвариантности является единственным, который мы устанавливаем в этом примере. Для других гиперпараметров рассеивающегося преобразования используйте значения по умолчанию.

sn = waveletScattering2('ImageSize',[200 200],'InvarianceScale',150);

Чтобы извлечь функции классификации для каждого наборы обучающих данных и наборы тестов, используйте helperScatImages_mean функция. Код для helperScatImages_mean в конце этого примера. helperScatImages_mean изменяет размер изображений к общему 200 200 размер и использует рассеивающуюся среду, sn, получить матрицу функции. В этом случае каждая матрица функции 391 7 7. Существует 391 рассеивающийся путь, и каждое содействующее изображение рассеивания 7 7. Наконец, helperScatImages_mean получает среднее значение по 2-м и 3-м измерениям, чтобы получить 391 характеристический вектор элемента для каждого изображения. Это - значительное сокращение данных из 40 000 элементов вниз к 391.

trainfeatures = cellfun(@(x)helperScatImages_mean(sn,x),Ttrain,'Uni',0);
testfeatures = cellfun(@(x)helperScatImages_mean(sn,x),Ttest,'Uni',0);

Используя tallgather возможность, соберите все обучение и протестируйте характеристические векторы и конкатенируйте их в матрицы.

Trainf = gather(trainfeatures);
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 1 min 39 sec
Evaluation completed in 1 min 39 sec
trainfeatures = cat(2,Trainf{:});
Testf = gather(testfeatures);
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 23 sec
Evaluation completed in 23 sec
testfeatures = cat(2,Testf{:});

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

Модель PCA и предсказание

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

model = helperPCAModel(trainfeatures,30,trainImds.Labels);
predlabels = helperPCAClassifier(testfeatures,model);

После построения модели и классификации набора тестов, определите точность классификации наборов тестов.

accuracy = sum(testImds.Labels == predlabels)./numel(testImds.Labels)*100
accuracy = 99.3750

Мы достигли правильной классификации на 99,375% или коэффициента ошибок на 0,625% для 160 изображений в наборе тестов. График матрицы беспорядка показывает, что наша простая модель неправильно классифицировала одну структуру.

figure
confusionchart(testImds.Labels,predlabels)

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

В этом примере мы использовали изображение вейвлета, рассеивающееся, чтобы создать представления низкого отклонения структур для классификации. Используя рассеивающееся преобразование и простой классификатор основных компонентов, мы достигли правильной классификации на 99,375% на протянутом наборе тестов. Этот результат сопоставим с современной эффективностью на KTH-TIPS database.[2]

Ссылки

[1] Бруна, J. и С. Маллэт. "Инвариантные Сети Свертки Рассеивания". Транзакции IEEE согласно Анализу Шаблона и Искусственному интеллекту. Издание 35, Номер 8, 2013, стр 1872–1886.

[2] Хеймен, E., Б. Кэпуто, М. Фриц и Дж. О. Экландх. “На Значении Реальных Условий для Существенной Классификации”. В Компьютерном зрении - ECCV 2004, отредактированный Томасом Пахдлой и Jiří Матасом, 3024:253–66. Берлин, Гейдельберг: Спрингер Берлин Гейдельберг, 2004. https://doi.org/10.1007/978-3-540-24673-2_21.

[3] Mallat, S. "Рассеивание Инварианта группы". Коммуникации в Чистой и Прикладной математике. Издание 65, Номер 10, 2012, стр 1331–1398.

[4] Pujol, O. и П. Радева. “Контролируемая Классификация Структуры для Внутрисосудистой Характеристики Ткани”. В Руководстве Биомедицинского Анализа изображения, отредактированного Джесджитом С. Сури, Дэвидом Л. Вильсоном и Свами Лэксминэраяном, 57–109. Бостон, MA: Спрингер УС, 2005. https://doi.org/10.1007/0-306-48606-7_2.

[5] Sifre, L. и С. Маллэт. "Вращение, масштабирование и инвариант деформации, рассеивающийся для дискриминации структуры". 2 013 Конференций по IEEE по Компьютерному зрению и Распознаванию образов. 2013, стр 1233–1240. 10.1109/CVPR.2013.163.

[6] Домашняя страница баз данных KTH-TIPS изображений. https://www.csc.kth.se/cvap/databases/kth-tips/

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

helperScatImages_mean

function features = helperScatImages_mean(sf,x)
x = imresize(x,[200 200]);
smat = featureMatrix(sf,x);
features = mean(mean(smat,2),3);
end

helperPCAModel

function model = helperPCAModel(features,M,Labels)
% This function is only to support wavelet image scattering examples in 
% Wavelet Toolbox. It may change or be removed in a future release.
% model = helperPCAModel(features,M,Labels)

% Copyright 2018 MathWorks

% Initialize structure array to hold the affine model
model = struct('Dim',[],'mu',[],'U',[],'Labels',categorical([]),'s',[]);
model.Dim = M;
% Obtain the number of classes
LabelCategories = categories(Labels);
Nclasses = numel(categories(Labels));
for kk = 1:Nclasses
    Class = LabelCategories{kk};
    % Find indices corresponding to each class
    idxClass = Labels == Class;
    % Extract feature vectors for each class
    tmpFeatures = features(:,idxClass);
    % Determine the mean for each class
    model.mu{kk} = mean(tmpFeatures,2);
    [model.U{kk},model.S{kk}] = scatPCA(tmpFeatures);
    if size(model.U{kk},2) > M
        model.U{kk} = model.U{kk}(:,1:M);
        model.S{kk} = model.S{kk}(1:M);
        
    end
    model.Labels(kk) = Class;
end

function [u,s,v] = scatPCA(x,M)
	% Calculate the principal components of x along the second dimension.

	if nargin > 1 && M > 0
		% If M is non-zero, calculate the first M principal components.
	    [u,s,v] = svds(x-sig_mean(x),M);
	    s = abs(diag(s)/sqrt(size(x,2)-1)).^2;
	else
		% Otherwise, calculate all the principal components.
        % Each row is an observation, i.e. the number of scattering paths
        % Each column is a class observation
		[u,d] = eig(cov(x'));
		[s,ind] = sort(diag(d),'descend');
		u = u(:,ind);
	end
end
end

helperPCAClassifier

function labels = helperPCAClassifier(features,model)
% This function is only to support wavelet image scattering examples in 
% Wavelet Toolbox. It may change or be removed in a future release.
% model is a structure array with fields, M, mu, v, and Labels
% features is the matrix of test data which is Ns-by-L, Ns is the number of
% scattering paths and L is the number of test examples. Each column of
% features is a test example.

% Copyright 2018 MathWorks

labelIdx = determineClass(features,model); 
labels = model.Labels(labelIdx); 
% Returns as column vector to agree with imageDatastore Labels
labels = labels(:);


%--------------------------------------------------------------------------
function labelIdx = determineClass(features,model)
% Determine number of classes
Nclasses = numel(model.Labels);
% Initialize error matrix
errMatrix = Inf(Nclasses,size(features,2));
for nc = 1:Nclasses
    % class centroid
    mu = model.mu{nc};
    u = model.U{nc};
    % 1-by-L
    errMatrix(nc,:) = projectionError(features,mu,u);
end
% Determine minimum along class dimension
[~,labelIdx] = min(errMatrix,[],1);   


%--------------------------------------------------------------------------
function totalerr = projectionError(features,mu,u)
    %
    Npc = size(u,2);
    L = size(features,2);
    % Subtract class mean: Ns-by-L minus Ns-by-1
    s = features-mu;
    % 1-by-L
    normSqX = sum(abs(s).^2,1)';
    err = Inf(Npc+1,L);
	err(1,:) = normSqX;
    err(2:end,:) = -abs(u'*s).^2;
    % 1-by-L
    totalerr = sqrt(sum(err,1));
end
end
end


	
	

Смотрите также

Похожие темы