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

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

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

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

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

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

KTH-TIPS

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

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

location = 'C:\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

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

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 изменяет размер изображений к общему 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);

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

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

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

Модель PCA и прогноз

Этот пример создает простой классификатор на основе основных компонентов рассеивающихся характеристических векторов для каждого класса. Классификатор реализован в функциях helperPCAModel и helperPCAClassifier. Функциональный helperPCAModel определяет основные компоненты для каждого класса цифры на основе рассеивающихся функций. Функциональный 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. [2]

Ссылки

[1] Бруна, J. & Mallat, S. (2013) "Инвариантные рассеивающиеся сверточные сети", Транзакции IEEE согласно Анализу Шаблона и Искусственному интеллекту, 35 (8), стр 1872-1886.

[2] Хеймен, E., Caputo, B., Неисправность, M., & Eklundh, J.O. (2004) "На значении реальных условий для существенной классификации". Компьютерное зрение - ECCV 2004, стр 253-266.

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

[4] Pujol, O. & Радева, P. (2005) "Контролируемая классификация структуры для внутрисосудистой характеристики ткани". В Сури, J., Wilson, D.L, & Laxminaryan, S. (редакторы). Руководство Биомедицинского Анализа изображения: Модели Сегментации. Академический Kluwer.

[5] Sifre, L. & Mallat, S. (2013). "Вращение, масштабирование и инвариант деформации, рассеивающийся для дискриминации структуры", Продолжения / CVPR, Конференция Общества эпохи компьютеризации IEEE по Компьютерному зрению и Распознаванию образов. Конференция Общества эпохи компьютеризации IEEE по Компьютерному зрению и Распознаванию образов. 1233-1240. 10.1109/CVPR.2013.163.

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

Похожие темы