首页 > 编程问答 >Python 中的像素最小二乘法

Python 中的像素最小二乘法

时间:2024-07-24 06:53:37浏览次数:12  
标签:python scipy numba scipy-optimize jax

我有一个非线性前向模型,它计算每个像素参数 w 的灰度图像。我还可以使用 scipys 优化函数 来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如 7% 的像素在 40 分钟内计算得很慢。我使用 for 循环遍历所有像素并按像素应用模型。我尝试过 least_squares leastsq root 函数,但它们都很慢。我还实现了导数值,因为我听说通过提供雅可比矩阵可以更快,但无济于事。

我认为 leastsq 可能是解决方案,因为它有以下声明描述:

x = arg min(sum(func(y)**2,axis=0))
         y

如果我将图像重塑为 1xn ,它应该沿着 axis=0 最小化。但不知何故,我最终得到了一个大小为 2 的数组作为我的输入参数 y ,并且我无法调试它。

我特别关注最小二乘优化,因为在将来,我想提供多个图像,这些图像应该由相同的参数生成 w (其他参数不同)。

除了 scipy 之外还有什么库可以提供更优雅的方法这个问题?

我也打算尝试 root 函数的numba 实现 ,但它有它自己的问题。或者使用 Googles JAX LM 实现 ,但到目前为止我还没有使用 JAX 的真正经验...

编辑 这是我的问题的一个小例子: 假设我有一个模型定义为 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 最简单的情况是有一个图像

并且我有参数 I1 ,所需的 (a1, b1, c1) 可以使用根方法或最小化器来计算: n 循环每个像素需要相当长的时间,并且我已经尝试过仅使用一个来减少双for循环以及模块和整数除法来计算索引

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]

i,j 如果我能让这个更快,多个图像也不会那么难实现,因为我只需要为参数提供一个数组。

If I could make this faster, multiple images wouldn't be that hard to implement too, since I only have to provide an array to the parameters.


你可以通过向量化最小化问题来加速代码,而不是为每个像素单独解决它。这使得可以同时为所有像素执行计算,这在像 NumPy 这样的库中可以高效完成。

以下是如何执行此操作:

  1. 向量化模型: 将模型修改为对 n 的数组(在本例中为所有像素的数组)进行操作,而不是单个值。模型应返回一个与输入 n 大小相同的残差数组。

  2. 准备输入数据: 为所有像素创建一个 n 值的 2D 数组。

  3. 使用 least_squares 进行优化: n 的 2D 数组传递给 least_squares 函数。该函数将找到使所有像素的残差之和最小化的 a b c 的值。

以下是如何使用示例代码实现此操作:

import numpy as np
from scipy.optimize import least_squares

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

# 加载 img1、a1、b1、c1
# ...

# 创建所有像素的 n 值的 2D 数组
rows, cols = img1.shape
n_vals = np.arange(rows * cols).reshape(rows, cols)

# 向量化优化
def vectorized_model(x, n, img):
    a, b, c = x
    return my_model(n, a, b, c, img).ravel()

x0 = [1/3, 1/3, 1/3]  # 初始猜测值 a、b、c
res = least_squares(vectorized_model, x0, args=(n_vals, img1))

# 获取优化的参数
a_opt, b_opt, c_opt = res.x

# 使用优化的参数计算 n 的值
n_opt = my_model(n_vals, a_opt, b_opt, c_opt, img1)

# 将 n_opt 重塑为 img1 的形状
n_opt = n_opt.reshape(rows, cols)

此代码片段首先定义了一个向量化版本的模型 vectorized_model ,该模型采用参数 x (包含 a b c )、 n 值的数组和图像作为输入。它返回一个包含所有像素的残差的扁平数组。然后,代码创建一个 2D 数组 n_vals ,其中包含所有像素的 n 值。 least_squares 函数用于找到使所有像素的残差之和最小化的最优参数 a_opt b_opt c_opt

这种向量化方法应比为每个像素单独执行优化快得多。

对于多幅图像,可以将 img 和相应的 n 值堆叠在一起,并相应地调整 vectorized_model 以处理附加维度。然后, least_squares 优化将找到使所有图像和所有像素的总体残差最小的参数。

标签:python,scipy,numba,scipy-optimize,jax
From: 78781200

相关文章

  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......
  • 在Python中调整pdf页面大小
    我正在使用python裁剪pdf页面。一切正常,但如何更改页面大小(宽度)?这是我的裁剪代码:input=PdfFileReader(file('my.pdf','rb'))p=input.getPage(1)(w,h)=p.mediaBox.upperRightp.mediaBox.upperRight=(w/4,h)output.addPage(p)当我裁剪页面时,我也需要......
  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......