Пиксельный наименьший квадрат в PythonPython

Программы на Python
Anonymous
Пиксельный наименьший квадрат в Python

Сообщение Anonymous »

У меня есть нелинейная прямая модель, которая вычисляет изображение в оттенках серого для попиксельного параметра w. Я также могу инвертировать модель, используя функции оптимизации scipys. Единственная проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что размер изображения делает это решение очень медленным... Примерно 7% пикселей были рассчитаны за 40 минут медленно. Я просматриваю все пиксели с помощью цикла for и применяю модель попиксельно. Я пробовал функции наименьшего_квадрата, наименьшего квадрата и root, но все они работают довольно медленно. Я также реализовал производные значения, так как слышал, что это может быть быстрее, если предоставить матрицу Якобиана, но безрезультатно.
Я думал, что наименьший квадрат может быть решением, поскольку он имеет следующее утверждение в описании:

Код: Выделить всё

x = arg min(sum(func(y)**2,axis=0))
y
Если я изменю форму изображения на 1xn, оно должно свернуться по оси=0. Но каким-то образом я получаю массив размером 2 в качестве входного аргумента y, и мне не удалось его отладить.
Я особенно ищу хотя бы квадратичную оптимизацию. , поскольку в будущем я хотел бы предоставить несколько изображений, которые должны генерироваться одним и тем же параметром w (с другими аргументами).
Есть ли какие-нибудь библиотеки, кроме scipy, которые могли бы обеспечить более элегантный подход к этой проблеме?
Я также планировал попробовать numba-реализацию корневой функции, но у нее есть свои проблемы. Или использовать реализацию LM на основе JAX от Google, но у меня пока нет реального опыта работы с JAX...
EDIT 1
Вот небольшой пример моей проблемы:
Допустим, у меня есть модель, определенная как f(n) = a*n**2 + b*n + c, где f(n) — это значение изображения на пиксель n. Для разных троек (a,b,c) я могу генерировать изображения I=f(n). Теперь у меня есть набор изображений I1, I2,... с разными параметрами (a1, b1, c1), (a2, b2, c2),..., но n< /code> не различается по пикселям в каждом пикселе.
Самый простой случай — одно изображение I1 и параметры (a1, b1, c1), а необходимое n можно вычислить с помощью метода корней или минимизатора:

Код: Выделить всё

def my_model(n, a, b, c, img=0):
return a * n**2 + b * n + c - img

# load img1, a1, b1, c1 from a file
n = np.zeros_like(img1)
for i in range img1.shape[0]:
for j in range img1.shape[1]:
x0 = 1/3
args = {
"a": a1,
"b": b1,
"c": c1,
"img": img1[i,j],
}

res = least_squares(my_model, x0, kwargs=args)
n[i, j] = res.x[0]
Цикл по каждому пикселю занимает довольно много времени, и я уже пытался сократить двойной цикл for, используя всего одно, а также модульное и целочисленное деление для вычисления индексов i,j
code>.
Если бы я мог сделать это быстрее, реализовать несколько изображений тоже было бы не так сложно, поскольку мне нужно только предоставить массив параметров.РЕДАКТИРОВАТЬ 2
Я снова проверил свою функцию деривации и, кажется, у меня была ошибка, но сейчас она исправлена ​​(я тестировал ее на данных из Matlab). Я реализовал дополнительный флаг в исходной функции и обертке:

Код: Выделить всё

def my_model(n, a, b, c, img=0, derivative=False):
if derivative:
return 2 * a * n + b
return a * n**2 + b * n + c - img

def my_model_derivative(n, a, b, c):
return my_model(n, a, b, c, derivative=True)

# load img1, a1, b1, c1 from a file
n = np.zeros_like(img1)
for i in range img1.shape[0]:
for j in range img1.shape[1]:
x0 = 1/3
args = {
"a": a1,
"b": b1,
"c": c1,
"img": img1[i,j],
}

res = least_squares(my_model, x0, my_model_derivative, kwargs=args)
n[i, j] = res.x[0]
Я знаю, что оболочка в этом случае не нужна, но моя фактическая функция довольно сложна, и мне нужно будет поддерживать дублированный код.
После устранения проблемы производительность снизилась. не сильно улучшилось, если вообще улучшилось. Я думаю, что самым узким местом является цикл над изображением.


Подробнее здесь: https://stackoverflow.com/questions/787 ... -in-python

Вернуться в «Python»