Как объединить разделенные серии спектральной кластеризации для огромной аффинной матрицы - PullRequest
0 голосов
/ 21 мая 2018

Вывод на вопрос

У меня есть двумерное комплексное изображение с коротким рядом значений.Я хочу сгруппировать похожие пиксели / сегментировать изображение.Существует одно более или менее статичное изображение с наложенным изображением, в котором есть несколько пятен, которые имеют изменяющиеся значения (в основном угол комплексного числа) в коротких сериях.Они также слегка различимы в норме изображения.

Моя первая попытка была k-means, но она действительно сгруппирована по средним (есть различия в средних значениях, особенно по сравнению с окружающими пикселями, новременная и угловая информация больше).Моя вторая попытка была ICA, и затем я посмотрел на k компонентов с наибольшей величиной, и это успешно идентифицировало определенные области в моем изображении как отличающиеся, но не идентифицировало группу пикселей, которые меня интересовали (визуально это не сложноузнаю их, но они маленькие).

Текущая ситуация

Так как мои первые две попытки не сработали, я огляделся сGoogle, и казалось, что спектральная кластеризация может быть уместным.Но у меня есть некоторые серьезные проблемы при использовании метода, в основном из-за ограниченной доступной памяти.Затем я подумал, что, поскольку у меня так много пикселей, я могу просто применить спектральную кластеризацию для отдельных блоков данных.

Кто-то здесь предлагает сначала кластеризовать плиты, а затем объединить их, затем он говорит«в конце у вас будет проблема их рекомбинации, и эту проблему легко решить».Биты, обозначенные как «легкие» в объяснениях, вряд ли когда-либо будут легкими, конечно.Он ссылается на эту статью, но этот метод не обрабатывает все данные в плитах.Это скорее исключает векторы, которые не близки к главному компоненту.

Вопрос

Мой вопрос состоит из 2 частей:

1 .Как мне объединить результаты для отдельных сегментов?Собственные векторы разные, а номера кластеров разные.Результат выглядит так, как будто он работал в отдельных плитах.

2 .Не учитывается расстояние / сходство между пикселями в отдельных плитах.Могу ли я сделать «плиты между плитами»?Для этих плит L и A не являются симметричными, не знаю, как выполнить метод тогда.Возможно, я смогу каким-то образом сравнить / объединить все собственные векторы в конце?

(3. Есть ли подобный или лучший метод, который не требует так много памяти. Время вычислений также гранично приемлемо, легко взрывается)

Пример кода Matlab

%% generate data
% get some outer region without data
tempdisk = strel('disk',922/2); tempdisk = double(repmat((1+sqrt(-1)).*tempdisk.Neighborhood,[1 1 15]));
% make some noise
tempnoise = (rand(921,921,15)+sqrt(-1).*rand(921,921,15))./10;
% 'background signal'
tempim1 = double(imresize(mean(imread('cameraman.tif'),3),[921,921])); tempim1 = repmat(tempim1./max(tempim1(:)),[1 1 15]);
% 'target signal'
tempim2 = double(rgb2hsv(imread('fabric.png'))); tempim2 = imresize(tempim2(:,:,2),[921,921]); tempim2 = repmat(tempim2./max(tempim2(:)),[1 1 15]);
sin1 = repmat(permute(sin(2.*pi.*(0:14)./15),[1 3 2]),[921 921 1]);
% combine into data
complexdata = (sin1.*(1.0.*tempim1+0.5.*tempim2.^2).*exp(-sqrt(-1).*2.*pi.*sin1.*(tempim2.^2)).*tempdisk+tempnoise)./1.5;

%this is what the mean data looks like
meannorm = mean(abs(complexdata),3);
meanangle = mean(angle(complexdata),3);
figure; subplot(1,2,1); imshow(meannorm,[]); title('mean norm'); subplot(1,2,2); imshow(meanangle,[]); title('mean angle')

Вот как выглядят сгенерированные данные:

mean data

Яркие пятна на правом изображении - это то, что я ищу.У них также самые сильные изменения во времени (и они коррелируются во времени).

Затем для настройки кластеризации:

%% perform spectral clustering in seperate slabs 
% method from http://ai.stanford.edu/~ang/papers/nips01-spectral.pdf
%get all pixel vectors in a single matrix
complexrows = reshape(permute(complexdata, [3,1,2]), [15, 921*921]);
%k means and eigs dont accept complex, so convert to real here?
complexrowsTranspose = [real(complexrows);imag(complexrows)]'; 

%lets say 10000 by 10000 matrices are still ok
npix = 10000;
nslabpix = floor(length(complexrowsTranspose)/npix);
nrestpix = rem(length(complexrowsTranspose), npix);

Выполнение спектральной кластеризации в слябах, которые помещаются в память:

% spectral clustering 
keig = 50;%how many eigenvectors needed? more is better
affinity_sigma = 1;% i dont understand how to calculate this from the paper
tic
% start with last slab (dynamically preallocate)
for islabpix = (nslabpix+1):-1:1;
    %print progress
    islabpix/nslabpix
    toc
    if islabpix>nslabpix
        pixrange = (1:nrestpix) + ((islabpix-1)*npix);;
    else
        pixrange = (1:npix) + ((islabpix-1)*npix);
    end
    %calculate affinity between all voxels in slab
    Aff = exp( -squareform(pdist(complexrowsTranspose(pixrange,:))).^2/(2*affinity_sigma^2) ); % affinity matrix
    %calculate degree matrix for normalization
    Dsq = sparse(size(Aff,1),size(Aff,2)); %degree matrix
    for idiag=1:size(Aff,1)
        Dsq(idiag,idiag) = sum(Aff(idiag,:))^(1/2);
    end
    %normalize affinity matrix
    Lap = Dsq * Aff * Dsq; %normalize affinity matrix
    %calculate eigenvectors of affinity matrix
    [eigVectors(pixrange,1:keig), eigValues] = eigs(Lap, keig); %eigenvectors of normalized aff mat
    normEigVectors(pixrange,1:keig) = eigVectors(pixrange,1:keig)./repmat(sqrt(sum(abs(eigVectors(pixrange,1:keig)).^2,2)), [1 keig]); %normalize rows of eigen vectors, normr only works on real numbers
    % perform k means clustering on weights for eigenvectors
    [idx,C,sumd,D] = kmeans([real(normEigVectors(pixrange,1:keig)),imag(normEigVectors(pixrange,1:keig))], 5); %k means on normalized eigenvecotrs

    idxval(pixrange) = idx;
end
%reshape into image
idxim = reshape(idxval, [921, 921]);
figure; imshow(idxim,[])
toc

Получившаяся кластеризация:

k means clusters on spectral slabs

Результат выглядит так, как будто метод работает до некоторой степени в каждой плите;цель состояла в том, чтобы объединить все капли с немного более высокой нормой и более сильным изменением угла (капли с высокой насыщенностью от tempim2), которые кажутся узнаваемыми в результате.В настоящее время проблема состоит в основном в отдельных плитах, и в них нет кластеров перекрестных плит.Это заняло у моего компьютера около 15 минут.Я уменьшил количество собственных значений и размер изображения для этого примера, чтобы он работал за приемлемое количество времени.Я думаю, что это иллюстрирует часть моей проблемы.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

После Ответ Шая Я переключился только на вычисление сродства между смежными пикселями (в радиусе 4 пикселей) и использованием разреженных матриц.Затем я получаю равную кластеризацию для всего изображения.Чтобы создать разреженную матрицу смежности, я использую функцию Шая sparse_adj_matrix, в противном случае память заполняется только одной матрицей смежности.

tic
complexrowsTranspose = [real(complexrows);imag(complexrows)]';
indexnonzero = find(mean(tempdisk,3) > 0);
idxval = zeros(size(complexrowsTranspose, 1),1);

[irow jcol] = sparse_adj_matrix([size(meannorm,1), size(meannorm,2)], 4, 2);
keep = ismember(irow, indexnonzero);
irow(~keep) = [];
jcol(~keep) = [];
clear keep

sigma = 1;
Avect = exp(-sum((complexrowsTranspose(irow,:)-complexrowsTranspose(jcol,:)).^2,2)/(2*sigma^2));
iAval = find([Avect>0].*[Avect<Inf]);
Aff = sparse(irow(iAval),jcol(iAval),Avect(iAval),length(complexrowsTranspose),length(complexrowsTranspose));
Dvector = sum(Aff,2).^(1/2);
Dindex = find(Dvector);
D = sparse(Dindex, Dindex, Dvector(Dindex),size(Aff,1),size(Aff,2));
L = D * Aff * D;

keig = 25;
[Vect, Val] = eigs(L, keig);
normVect = Vect./repmat(sqrt(sum(abs(Vect).^2,2)), [1 keig]);
[kidx,kC,ksumd,kD] = kmeans(normVect, 5);

kmeansim = reshape(kidx, [921, 921]);
figure; imshow(kmeansim,[])
toc

Вот так выглядят результирующие кластеры:

k means after only local affinity

Выглядит намного лучше.Однако группы, в которых я заинтересован, не отображаются (пятна с высокими значениями в «угловом» изображении внутри темного слоя фотографа).Особенно пиксели с одинаковыми средними значениями норм кластеризованы, но не с одинаковыми изменениями в коротких рядах или с одинаковыми углами (комплексных значений).

Я попытаюсь настроить входные значения и радиус смежности длярассчитать сродства для.


Обновление


Я попытался вставить только углы, все комплексные значения (и адаптировать код для работы с комплексными значениями), изменяя радиус, в пределах которого вычислялись сродства, добавляя 1-корреляцию вместо расстояния, но я не получил маленьких ярких угловых пятен в пальто фотографа для группировки в группу.

Затем я загрузил этот код и попробовал его, как показано ниже:

complexrowsTranspose = complexrows';
[icol irow] = sparse_adj_matrix([921, 921], 1, Inf);

complexrowsTminmean = complexrowsTranspose -repmat(mean(complexrowsTranspose , 2), [1, 15]);
complexrowsTstd = sqrt( std(real(complexrowsTranspose), [], 2).^2+std(imag(complexrowsT), [], 2).^2 );
complexrowsTcorr = sum(real(complexrowsTminmean(icol).*complexrowsTminmean(irow)), 2)./complexrowsTstd(irow)./complexrowsTstd(icol)./(15-1);

Asparse = sparse(irow, icol, 1-complexrowsTcorr, 921*921, 921*921);
Asparse(isnan(Asparse)) = 0;

K = AL_ICM(Asparse);

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

0 голосов
/ 22 мая 2018

У меня нет для вас ответа, но я думаю, что эти указатели должны помочь вам найти ответ:

  1. Вы утверждаете, что у вас проблемы с памятью.Вы уверены, что ваша матрица сродства редка?Кажется, что в вашем коде только матрица диагональных степеней.Обычно при выполнении спектральной кластеризации на пикселях / вокселях проектируемая матрица сродства очень разрежена (8 соединений или 26 соединений).

  2. Вы описываете свои кластеры как «они маленькие».Спектральная кластеризация имеет известных проблем с кластерами в очень разных масштабах.Вы уверены, что получаете удовлетворительные результаты?

  3. Как рассчитать сходство (сходство) между соседними вокселями?Можете ли вы также измерить различие ?То есть, можете ли вы сказать для некоторых вокселей, что они не должны принадлежать к одному кластеру?Если да, рассматривали ли вы вопрос об использовании корреляционной кластеризации ?Этот метод более устойчив к различным масштабам кластеров и может автоматически определять количество кластеров.

  4. Рассматривали ли вы использование методов мультимасштаба / multigrid грубые данные вместо того, чтобы жестоко нарезать их на "куски"?

  5. Вы смотрели на spectralNet ?Если я не ошибаюсь, этот метод должен позволить вам «изучить» спектральную кластеризацию на части точек, а затем использовать сеть для «экстраполяции» кластеризации на новые точки.


Обновление:
В свете Комментарий Лео , я бы сказал, что когда речь идет о спектральной кластеризации очень больших данных, жестоко нарезая данные на "куски" итогда попытка «сшить» результаты вместе не может быть лучшим грубым действием (не то, чтобы я думаю, что это невозможно).Лучшим способом решения этой проблемы является значительная разбивка аффинной матрицы: вычисление парных аффинностей для каждой точки только для ее соседей, в результате чего аффинная матрица является в основном разреженной.Таким образом, можно обрабатывать все точки одновременно без необходимости «разрезать» и «сшивать».

Что касается разницы между спектральной кластеризацией и корреляционной кластеризацией:
Почему спектральная кластеризация способна кластеризовать все точек, даже если матрица входного сродства настолько разрежена? как он может сказать, что точка a и удаленная точка c должны принадлежать одному и тому же кластеру, даже если между ними не было вычислено сродство?
Простой ответ - транзитивность сродств:если a похоже на b и b похоже на c, тогда a и c должны быть сгруппированы вместе.
Где подвох? В спектральной кластеризации всезаписи в матрице сродства неотрицательны, что означает, что, если нет абсолютно никакого пути, соединяющего a и c (маловероятно), существует некоторая «транзитивная аффинность», предполагающая, что a и c должны принадлежатьтот же кластер.Поэтому, если взглянуть на математику спектральной кластеризации, вы заметите, что «тривиальное решение», то есть размещение всех точек в одном кластере, обеспечивает глобальный оптимум для задачи.Нужно искусственно заставить решение иметь k кластеров, чтобы избежать тривиального решения.
Что можно сделать? Если вы рассматриваете только положительное сродство, значение 0 является неоднозначным: это означает либо "Я не сделалне пытайтесь вычислить сродство между этими точками », но это также может означать« я думаю, что эти две точки должны не находиться в одном кластере ».Чтобы преодолеть эту неоднозначность, мы можем ввести отрицательных сродств таким образом, если A(i, j) > 0 означает точку i, а точка j должна находиться в одном кластере с уверенностью A(i, j), тогда как если A(i, j) < 0 означает i и j должны не находиться в одном кластере (с уверенностью |A(i, j)|).Введение отрицательного сродства разрывает «цепочки транзитивности», которые могут связывать удаленные точки, нет больше нет тривиальных положений для размещения всех точек в одном кластере.
Как воспользоваться преимуществами отрицательного сродства? Когда ваша матрица сродства имеет как положительные (притяжение), так и отрицательные (отталкивание) значения, вы можете кластеризовать точки, используя корреляционную кластеризацию, которая в основном пытается максимизировать сродство / притяжение между точкамивнутри каждого кластера и одновременно максимизировать отталкивание между точками в разных кластерах.Хорошим свойством корреляционной кластеризации является то, что она «автоматически» обнаруживает базовое количество кластеров, см. С.2 из этой бумаги .

...