Как минимизировать функцию стоимости с Matlab, когда входная переменная является большим изображением: увеличение скорости и предотвращение сбоя памяти - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь реализовать метод дифференциальной фазовой интеграции, описанный в этой статье: Thüring, Thomas, et al. «Нелинейный регуляризованный поиск фазы для однонаправленной рентгеновской дифференциальной фазово-контрастной рентгенографии». Оптика express 19,25 (2011): 25545-25558 .

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

$${||D_xA-\phi||_2}^2+\lambda{||D_yA||_2}^2$$

где ||. || это норма L2, Dx - производная по столбцам, Dy - производная по строкам, A - неизвестная интегрированная матрица, лямбда - определяемый пользователем параметр, а phi - дифференциальный профиль, который я измерил. Обратите внимание, что для оператора Dy также может использоваться норма L1.

Я записал код, используя fminun c в качестве решателя Matlab

pdiff=imresize(diff(padarray(p,[0,1],'replicate','post'),1,2),[128,128]);
noise = 0.02 * randn(size(pdiff)); 

pdiff_noise = pdiff + noise ;
% normal integration
integratedProfile=cumsum(pdiff_noise,2);

options=optimoptions(@fminunc,'Display','iter-detailed','UseParallel',true,'MaxIterations',35);
% regularized integration
startingPoint=zeros(size(pdiff_noise));
fun=@(x)costFunction(pdiff_noise,x);
integratedProfile_optmized=fminunc(fun,startingPoint,options);

function difference=costFunction(ep,op)
L=0.2;
dep_o=diff(padarray(op,[0,1],'replicate','post'),1,2);
dep_v=diff(padarray(op,[1,0],'replicate','post'),1,1);
difference=sum(sum((ep-dep_o).^2))+L*sum(sum(dep_v.^2));
end

Это работает используя разностное изображение 128x128. Проблема возникает, как только я пытаюсь работать с большим изображением. В частности, когда я использую матрицу 256x256, для каждой итерации требуется вечность, даже если используется параллельная опция, и занимает почти всю оперативную память. Когда я перехожу к матрице 512x512, я получаю эту ошибку

Requested 262144x262144 (512.0GB) array exceeds maximum
array size preference. 

Error in fminusub (line 165)
    H = eye(sizes.nVar);

Error in fminunc (line 446)
   [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] =
   fminusub(funfcn,x, ...

Error in Untitled (line 13)
integratedProfile_optmized=fminunc(fun,startingPoint,options); 

К сожалению, моя конечная цель - обработать приблизительно 3000 изображений размером 500x500.

Мне кажется, я понял, что cra sh проблема связана с размером матрицы и с тем, что каждый пиксель является переменной. Поэтому Matlab нужно вычислить огромный гессиан, который не помещается в память. Тем не менее, я не знаю, как решить эту проблему, а также ускорить обработку. Есть ли у вас какие-либо предложения по работе с большими изображениями? Есть ли другой решатель, который может работать быстрее? Есть математический подход к решению проблемы?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...