Pull to refresh

Comments 44

UFO just landed and posted this here
Чтобы не искать анекдот

Попал наркоман в ад. Идет он и видит конопляное поле. Решил он курнуть и начал
рвать коноплю. Подходит черт:


  • Зачем ты ее рвешь? Вон, уже скошенные поля есть! Идет мужик, и точно — конопля
    скошена, в стоги уложена. Взялся было ее сушить, подходит черт:
  • Зачем, дорогой, сушишь? Вон амбары с сушеной коноплей! Идет мужик дальше — амбары полны сушеной конопли! Решил он расфасовать ее по боксам. Подходит черт:
  • Зачем фасуешь? Вон амбары, полные готовых боксов! Идет — и точно, стоят
    амбары, конопля аккуратно расфасованна, боксы в штабеля сложены. Начал было
    забивать. Подходит черт:
  • Слушай, зачем забиваешь? Вон склады с косяками! Идет — склады полны, косяки
    аккуратно забиты, уложены. Взял мужик косяк, глядь — а спичек нет. Подходит
    черт, спрашивает мужик у него:
  • Черт, а черт, дай спички — прикурить!
  • Э, — отвечает черт, — если бы тут были спички, то это был бы РАЙ!

Отсюда: http://www.narcozona.ru/anek.html

В пределе, вот так, из числа Пи, математики восстановят какое нибудь изображение или целую вселенную.
13 секунд выгрузка картинки? При типичной скорости(GPU->CPU) более 8 гигабайт в секунду?
Что-то тут не так…

А почему это удивляет? Судя по всему, автор на каждой итерации загружает изображение в память видеокарты, считает там что-то простое, затем выгружает обратно.

[red] = fista_gpu(gpuArray(corrupted_red),obj1_gpu,obj2_gpu,0.000001,3,100);
red=gather(red);

Первая команда выдает матрицу размещенную в памяти GPU полностью отработав алгоритм и занимает по времени 0.5-1 сек.
Вторая команда переносит матрицу из памяти GPU в обычную и работает она 4-5 сек. Возможно дело в Matlab, возможно я что-то не так использую, однако утверждение что я загружаю в память GPU картинку на каждой итерации голословно.

Да, моя ошибка — я ни разу не пользовался ускорением GPU на матлабе, потому неверно понял код.


Поиск в интернете же говорит о том, что GPU код в матлабе выполняется асинхронно, и вызов функции gather не только переносит данные из GPU, но и ожидает завершения выполнения операций на GPU. Так что 15 секунд — это и есть честное время работы.

UFO just landed and posted this here
Такие артефакты любой алгоритм деконволюции даёт. Причина в том, что при свёртке (смазывании) теряется часть информации из-за недостатка точности (ну и из-за сжатия с потерями, если картинку в джпег пожать после этого). После восстановления изображения эти «обрубленные» значения дают рябь вокруг контрастных участков.

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

Простите за занудство, но не используют в русском оборот "размер проблемы". Точнее, используют, но с совсем другим смыслом.

UFO just landed and posted this here

По моему Лену всегда в бмп использовали?

UFO just landed and posted this here

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

Потому что "та самая" Лена — 512*512. Исторически.

Но можно же 512х512 и другой участок взять

Возьмите машину времени, скатайтесь в 1973 и предложите Савчуку взять другой участок.

UFO just landed and posted this here

Не-не, "та самая" версия — это не исходная страница Playboy, а тот самый скан 512*512 (вроде размер — это ограничение сканера, который у них в лабе был)

Всё это, конечно, хорошо на синтетике, но как будет с реальным смазом или расфокусом?
С реальным расфокусом вам надо будет как-то найти матрицу свертки. То есть когда вы к картинке применяете blur, эта матрица вам известна, а когда у вас фото не в фокусе — ну можно попытаться ее угадать, от правильности угадывания конечно будет зависеть результат.
Вы правы, однако это уже совсем другая проблема. Мне не хотелось уходить в экспериментальные моменты, так как в них очень часто результат зависит от конкретного изображения с конкретным алгоритмом.

На самом деле это одна из главных составляющих задачи: у вас ведь может быть не только шум на изображении, но и погрешность в ядре свёртки, и надо как минимум убедиться, что алгоритм устойчив (а то чуть неточно задали ядро — и получили мусор вместо изображения)

А погрешность в ядре свёртки будет всегда, потому что в каждом пикселей ядро будет своё: дефокус, аберрации, неравномерность движения и т.д.

Возможно пропустил, но soft thresholding подразумевает что у нас есть L1 слагаемое в функционале, а в формулах вроде только L2
> Добавляя на каждом шаге разницу между результатом двух предыдущих итераций, мы увеличиваем сходимость алгоритма до квадратичной
Было бы здорово объяснить почему
Есть еще несколько вопросов. Не сочтите за грубость, просто мне интересны численные оптимизации.
В оригинальной постановке задачи (|| y — Ax ||_2) если || x ||_2 = sum_i ((x_i)^2), то вся задача это просто МНК который выливается в решение очень сильно разреженной СЛАУ. Я не большой специалист, но мне кажется что что-нибудь из семейства сопряженных градиентов на GPU должно было показать себя очень хорошо по части производительности.
Хотелось бы увидеть обоснование второго «улучшенного» функционала. Если со слагаемым (||alpha * ( x — x_k) ||^2) все более менее ясно (просим чтобы текущее решение было поближе к предыдущему), то с термом -A^t*A все совсем не понятно (откуда он взялся, зачем нужен и т.д.)
И да,
>Задача значительно проще
Вот это вот совсем не очевидно. Было бы здорово рассказать чем проще

Посмотрел во вторую статью из списка источников, там вроде есть Total variation term (2*lambda*||x||_TV который говорит что градиент по картинке должен быть примерно одинаков, но допускаются разрывы), если его подставить в первую формулу, то все несколько проясняется. Но хотелось бы увидеть все это в данной статье

Такая СЛАУ влёт решается через преобразование Фурье, если А — просто свёртка.

Прикольно, не знал. Честно говоря, я так и не освоил преобразования Фурье и всякие DFT/FFT
Собственно еще одна причина думать что с оригинальным функционалом что-то не так
Если Вы имеете ввиду обратную фильтрацию то это не совсем так. Такое решение будет чувствительно к числу обусловленности матрицы свертки. Данный же алгоритм обладает стабильностью за счет дополнительного слагаемого.
Если Вы имеете ввиду обратную фильтрацию то это не совсем так. Такое решение будет чувствительно к числу обусловленности матрицы свертки. Данный же алгоритм обладает стабильностью за счет дополнительного слагаемого.

Ну так речь шла именно о СЛАУ. Кстати, дополнительное слагаемое в виде квадратичного стабилизатора вполне себе можно учесть (в приближённом виде), если обращать свёртку как:


IFFT(FFT(I) / (FFT(K) + C)),


где C — константа. Здесь, правда, есть требование, чтобы FFT(K) было вещественным и положительным — не любое ядро размытия подойдёт.


Но, понятное дело, с Total Variation такое уже не прокатит, и нужно применять полноценный итерационный метод минимизации.

Я знаю об этом методе, но с точки зрения одномерных задач ЦОС. Вся проблема — это искусство, а не ремесло. Для каждого конкретного ядра свертки и картинки с большой вероятностью пользователю придется самому выбирать C и оценивать качество результата. Здесь же можно программно оценить альфу по ядру свертки, а лямбда слабо влияет на сходимость.
а для размытия и смаза одинаковый алгоритм (я про вообще, а не только ISTA) подходит?
нене, неудачно сократил, в смысле:

а для восстановления после размытия и смаза одинаковый алгоритм (я про вообще, а не только ISTA) подходит?
Хороший вопрос =)
Если можно смаз описать сверткой, то можно попробовать ее подсунуть в этот алгоритм да. Иначе — не знаю, надо смотреть статьи.
В случае если операция повреждения была линейна, то да, подходит.

Я всё понимаю, интересный алгоритм, исследовательский проект и всё такое, но почему код так ужасно написан? Каждый раз, когда я вижу код на матлабе, то в 99% случаев он написан ужасно. Матлаб к этому располагает, но вы даже отступы не потрудились расставить. Почему?! Отступы в редакторе матлаба автоматические! Вы специально их убрали что-ли? Весь код на гитхабе такой.


Вы же оформили эту статью, почему нельзя оформить код?


Потом вы устроитесь на работу и начнёте писать вот такой вот код без пробелов, без отступов, без внятных имён переменных, а ваши коллеги должны будут его читать, понимать и поддерживать!

Тут Вы абсолютно правы. Буду исправляться.
Sign up to leave a comment.

Articles

Change theme settings