В этом примере показано, как классифицировать структуры с помощью рассеивания вейвлета изображений. В дополнение к Wavelet Toolbox™ этот пример также требует Parallel Computing Toolbox™ и Image Processing Toolbox™.
В цифровом изображении структура предоставляет информацию о пространственном расположении интенсивности цвета или интенсивностей пикселей. Конкретные пространственные расположения интенсивности цвета или интенсивностей пикселей соответствуют различным внешним видам и непротиворечивости физического отображаемого материала. Текстурируйте классификацию, и сегментация изображений имеет много областей важного приложения. Особенно важным примером является биомедицинский анализ изображения, где нормальные и патологические состояния часто характеризуются морфологическими и гистологическими характеристиками, которые проявляют как различия в структуре. [4]
Для проблем классификации часто полезно сопоставить данные в некоторое альтернативное представление, которое отбрасывает несоответствующую информацию при сохранении отличительных свойств каждого класса. Изображение вейвлета, рассеивающее представления низкого отклонения построений изображений, которые нечувствительны к переводам и маленьким деформациям. Поскольку переводы и маленькие деформации в изображении не влияют на членство в классе, рассеивающийся преобразовывают коэффициенты, обеспечивают функции, от которых можно создать устойчивые модели классификации.
Рассеивание вейвлета работает путем расположения каскадом изображения через серию вейвлета, преобразовывает, нелинейность и усреднение [1] [3] [5]. Результат этого глубокого извлечения признаков состоит в том, что изображения в том же классе подвинулись поближе друг к другу в рассеивающемся, преобразовывают представление, в то время как изображения, принадлежащие различным классам, перемещены дальше независимо.
Этот пример использует общедоступную базу данных структуры, 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);
Используя tall
gather
возможность, соберите все обучение и протестируйте характеристические векторы и конкатенируйте их в матрицы.
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 и размерностью столбца, равной количеству изображений в наборах обучающих данных и наборах тестов соответственно. Соответственно, каждый столбец является характеристическим вектором.
Этот пример создает простой классификатор на основе основных компонентов рассеивающихся характеристических векторов для каждого класса. Классификатор реализован в функциях 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.