繁体   English   中英

scipy.optimize - 超过函数调用的最大数量?

[英]scipy.optimize - max number of function calls exceeded?

我有下面的图像img_roi (有关数据,请参见帖子结尾)。 “不太亮”的像素值分为两类:红色和蓝色通道,即

red = img_roi[1::2, ::2]
blue = img_roi[::2, 1::2]

我发布了一个一维切片图以更好地可视化数据。

在此处输入图像描述

红色和蓝色像素分别与亮像素(绿色通道)相差一个恒定的比例因子。 我想找到红色和蓝色通道的比例因子,并为此使用优化程序。 我希望如果我找到正确的缩放比例,我的信号是平滑的而不是锯齿状的。 例如,当我通过反复试验设置它时(即我设置img[::2, 1::2] = img[::2, 1:.2] * 5 )我得到了这张照片

在此处输入图像描述

为了精确找到比例因子,我定义了一个get_smoothness函数来估计我的信号有多平滑,然后应用优化器。

我的代码是:

def get_smoothness(params, signal):
    """Computes the smoothness by calculating the difference between each entry."""
    
    # Initialize smoothing factors
    sr, sb = params
    print(sb, sr)
    
    # Scale the sub-channels 
    signal[1::2, ::2] = signal[1::2, ::2] * sr  # red
    signal[::2, 1::2] = signal[by::2, bx::2] * sb  # blue
    
    return np.sum(np.abs(np.diff(signal, axis=0))) + np.sum(np.abs(np.diff(signal, axis=1)))

# Initialize the scale factor
sb, sr = 7., 6.  # these values I found by trying out different scale factors

# Minimize the smoothness function
res = optimize.minimize(get_smoothness, [sr, sb], method='Nelder-Mead', args=(img,))

# I get an error message
error = res.message
print(error)

执行此脚本时,我收到错误消息“已超出最大迭代次数”。 在每一步打印参数时,我也看到它们没有收敛。

我的问题是:

  1. 什么可能导致此错误?
  2. 有没有更好的方法来估计信号的平滑度?

数据:

[[-5.00000000e-01  3.30000000e+00 -1.00000000e+00  3.30000000e+00
  -3.00000000e-01  3.00000000e+00  7.00000000e-01  2.40000000e+00
  -4.00000000e-01  3.00000000e-01  3.80000000e+00  1.50000000e+00
  -1.00000000e-01  1.00000000e-01  8.00000000e-01 -1.20000000e+00
   2.70000000e+00  1.50000000e+00  2.30000000e+00  1.60000000e+00
   1.40000000e+00 -6.00000000e-01  6.10000000e+00  5.00000000e-01
   8.80000000e+00  7.10542736e-15  1.50000000e+01  3.40000000e+00
   2.09000000e+01  2.00000000e+00]
 [ 6.00000000e-01  2.40000000e+00  2.00000000e+00 -5.00000000e-01
   2.90000000e+00  9.00000000e-01  1.40000000e+00 -7.00000000e-01
   3.60000000e+00  3.60000000e+00 -3.00000000e-01  1.10000000e+00
   1.90000000e+00  5.00000000e-01  3.20000000e+00  2.00000000e-01
   1.10000000e+00  1.10000000e+00  1.00000000e-01  3.80000000e+00
  -1.90000000e+00  2.00000000e+00  7.00000000e-01  6.90000000e+00
   2.00000000e+00  1.13000000e+01  1.40000000e+00  2.19000000e+01
  -1.00000000e-01  2.57000000e+01]
 [ 4.20000000e+00  2.00000000e+00  1.20000000e+00  1.50000000e+00
   4.60000000e+00  3.00000000e+00  4.90000000e+00  4.00000000e-01
   5.70000000e+00  1.90000000e+00  1.00000000e-01  1.00000000e+00
  -1.00000000e-01  1.00000000e-01  5.00000000e+00  5.00000000e-01
   1.00000000e+01  1.50000000e+00  1.04000000e+01  6.00000000e-01
   7.90000000e+00 -2.00000000e-01  5.00000000e+00  1.90000000e+00
   1.46000000e+01  4.20000000e+00  2.15000000e+01  6.40000000e+00
   2.54000000e+01  7.70000000e+00]
 [ 6.00000000e-01 -6.00000000e-01  1.00000000e+00  1.80000000e+00
   2.50000000e+00  3.70000000e+00  1.70000000e+00  5.90000000e+00
   2.30000000e+00  3.50000000e+00  0.00000000e+00  1.50000000e+00
  -4.00000000e-01  8.30000000e+00  1.40000000e+00  2.02000000e+01
   4.60000000e+00  2.73000000e+01  4.40000000e+00  2.70000000e+01
   1.70000000e+00  2.07000000e+01  8.00000000e-01  2.28000000e+01
  -2.00000000e-01  2.61000000e+01  1.10000000e+00  2.70000000e+01
   6.20000000e+00  3.91000000e+01]
 [-5.00000000e-01  1.50000000e+00  5.20000000e+00  1.80000000e+00
   3.30000000e+00  1.00000000e-01  5.40000000e+00  2.80000000e+00
   4.40000000e+00  5.00000000e-01  6.00000000e-01  2.40000000e+00
   1.02000000e+01  5.30000000e+00  3.92000000e+01  1.09000000e+01
   6.72000000e+01  1.47000000e+01  6.33000000e+01  9.10000000e+00
   5.05000000e+01  4.10000000e+00  4.24000000e+01  5.10000000e+00
   3.71000000e+01  4.80000000e+00  3.40000000e+01  6.60000000e+00
   4.12000000e+01  7.60000000e+00]
 [ 3.50000000e+00  2.80000000e+00  3.40000000e+00  4.50000000e+00
   2.50000000e+00  2.70000000e+00  1.60000000e+00  4.70000000e+00
   4.00000000e-01  3.00000000e-01  3.20000000e+00  1.26000000e+01
   6.90000000e+00  4.41000000e+01  1.38000000e+01  9.64000000e+01
   1.64000000e+01  1.24500000e+02  1.75000000e+01  1.17100000e+02
   1.53000000e+01  8.29000000e+01  1.10000000e+01  6.71000000e+01
   8.60000000e+00  5.41000000e+01  8.80000000e+00  5.20000000e+01
   1.16000000e+01  4.07000000e+01]
 [ 1.40000000e+00  2.50000000e+00  4.40000000e+00  2.30000000e+00
   4.60000000e+00  7.00000000e-01  1.60000000e+00  1.00000000e+00
   5.20000000e+00  2.00000000e+00  7.90000000e+00  5.50000000e+00
   5.92000000e+01  2.25000000e+01  1.38600000e+02  3.41000000e+01
   2.13700000e+02  3.07000000e+01  2.13900000e+02  3.44000000e+01
   1.82800000e+02  2.57000000e+01  1.37600000e+02  1.65000000e+01
   1.04800000e+02  1.23000000e+01  8.13000000e+01  1.49000000e+01
   5.54000000e+01  9.60000000e+00]
 [ 1.90000000e+00  1.10000000e+00  1.00000000e-01  5.00000000e+00
   1.10000000e+00  4.00000000e+00 -5.00000000e-01  7.00000000e-01
   2.30000000e+00  1.40000000e+01  6.40000000e+00  5.48000000e+01
   1.54000000e+01  1.39800000e+02  3.85000000e+01  2.71800000e+02
   4.12000000e+01  3.42400000e+02  4.16000000e+01  2.99400000e+02
   3.68000000e+01  2.34900000e+02  3.08000000e+01  1.77500000e+02
   1.47000000e+01  1.20500000e+02  1.40000000e+01  7.27000000e+01
   1.11000000e+01  5.23000000e+01]
 [ 1.00000000e-01  9.00000000e-01  3.60000000e+00  2.90000000e+00
  -4.00000000e-01 -1.80000000e+00  1.70000000e+00 -5.00000000e-01
   8.50000000e+00  8.30000000e+00  4.18000000e+01  1.73000000e+01
   1.53800000e+02  5.03000000e+01  3.03900000e+02  6.67000000e+01
   4.23400000e+02  8.58000000e+01  4.43600000e+02  6.97000000e+01
   3.97000000e+02  5.33000000e+01  2.88500000e+02  3.21000000e+01
   2.02200000e+02  2.37000000e+01  1.19400000e+02  1.63000000e+01
   7.27000000e+01  1.17000000e+01]
 [ 1.10000000e+00  2.40000000e+00  2.10000000e+00  3.00000000e-01
   1.50000000e+00 -1.00000000e+00  4.00000000e-01  5.30000000e+00
  -5.00000000e-01  3.18000000e+01  7.90000000e+00  1.24100000e+02
   3.59000000e+01  3.06700000e+02  5.68000000e+01  4.68700000e+02
   8.91000000e+01  5.78000000e+02  8.69000000e+01  5.24900000e+02
   6.29000000e+01  4.28600000e+02  4.85000000e+01  3.05200000e+02
   2.89000000e+01  1.85700000e+02  2.29000000e+01  1.09200000e+02
   1.01000000e+01  5.19000000e+01]
 [-5.00000000e-01  5.00000000e-01  5.00000000e-01  2.20000000e+00
   1.10000000e+00  1.60000000e+00  1.80000000e+00  2.50000000e+00
   1.87000000e+01  1.26000000e+01  9.53000000e+01  4.23000000e+01
   2.68600000e+02  7.85000000e+01  4.74300000e+02  1.09000000e+02
   6.64200000e+02  1.01700000e+02  6.52500000e+02  1.04900000e+02
   5.58000000e+02  7.56000000e+01  3.99400000e+02  5.02000000e+01
   2.77700000e+02  3.97000000e+01  1.47100000e+02  1.46000000e+01
   7.35000000e+01  7.10000000e+00]
 [-8.00000000e-01  2.60000000e+00  1.70000000e+00  6.00000000e-01
   8.00000000e-01  1.00000000e+00  7.00000000e-01  1.23000000e+01
   9.50000000e+00  6.22000000e+01  2.40000000e+01  2.01700000e+02
   4.99000000e+01  4.31000000e+02  7.55000000e+01  6.35500000e+02
   1.04200000e+02  7.29300000e+02  1.01500000e+02  6.98000000e+02
   7.20000000e+01  5.08600000e+02  5.74000000e+01  3.35300000e+02
   3.17000000e+01  2.20800000e+02  1.65000000e+01  1.06700000e+02
   1.02000000e+01  4.62000000e+01]
 [ 1.00000000e-01 -4.90000000e+00 -9.00000000e-01  0.00000000e+00
  -2.00000000e-01  1.60000000e+00  5.60000000e+00  6.40000000e+00
   2.85000000e+01  1.33000000e+01  1.25000000e+02  4.76000000e+01
   3.08400000e+02  8.61000000e+01  5.79400000e+02  1.13200000e+02
   6.81500000e+02  1.18700000e+02  7.32000000e+02  1.17300000e+02
   6.09500000e+02  8.63000000e+01  4.16200000e+02  6.04000000e+01
   2.69800000e+02  3.46000000e+01  1.41500000e+02  1.52000000e+01
   5.70000000e+01  4.80000000e+00]
 [-3.80000000e+00  2.30000000e+00  2.70000000e+00 -3.70000000e+00
   2.50000000e+00 -6.00000000e-01 -1.00000000e-01  1.88000000e+01
   4.40000000e+00  7.77000000e+01  1.97000000e+01  2.10200000e+02
   5.43000000e+01  4.37400000e+02  8.75000000e+01  6.33400000e+02
   9.63000000e+01  6.92000000e+02  9.69000000e+01  6.28000000e+02
   8.00000000e+01  4.70500000e+02  5.16000000e+01  3.16400000e+02
   3.31000000e+01  1.80600000e+02  1.72000000e+01  7.85000000e+01
   3.80000000e+00  2.70000000e+01]
 [ 1.60000000e+00  1.00000000e-01 -4.00000000e-01  2.90000000e+00
  -4.30000000e+00  5.00000000e-01  5.60000000e+00  5.50000000e+00
   3.28000000e+01  1.67000000e+01  1.08100000e+02  3.63000000e+01
   2.68600000e+02  8.25000000e+01  4.68400000e+02  1.07000000e+02
   5.85000000e+02  1.11700000e+02  5.92900000e+02  9.43000000e+01
   4.88700000e+02  6.41000000e+01  3.26300000e+02  4.69000000e+01
   1.94800000e+02  2.97000000e+01  9.11000000e+01  1.26000000e+01
   3.93000000e+01  1.20000000e+00]
 [-3.00000000e-01  2.20000000e+00  3.60000000e+00  6.00000000e-01
  -3.00000000e-01 -8.00000000e-01  2.50000000e+00  1.49000000e+01
   5.70000000e+00  5.15000000e+01  1.77000000e+01  1.58300000e+02
   3.32000000e+01  3.16500000e+02  6.38000000e+01  4.53900000e+02
   6.89000000e+01  4.96100000e+02  6.76000000e+01  4.45400000e+02
   5.66000000e+01  3.22900000e+02  4.32000000e+01  2.04700000e+02
   2.22000000e+01  1.07700000e+02  1.09000000e+01  3.38000000e+01
   3.30000000e+00  8.60000000e+00]
 [-9.00000000e-01  3.00000000e-01  2.30000000e+00  1.40000000e+00
   6.00000000e-01  6.00000000e-01  1.60000000e+00  3.10000000e+00
   1.69000000e+01  9.90000000e+00  7.41000000e+01  2.13000000e+01
   1.63200000e+02  4.27000000e+01  2.98400000e+02  6.41000000e+01
   3.71100000e+02  6.25000000e+01  3.60100000e+02  6.13000000e+01
   2.97700000e+02  4.47000000e+01  1.80000000e+02  2.68000000e+01
   9.75000000e+01  1.40000000e+01  3.58000000e+01  6.10000000e+00
   7.70000000e+00  2.90000000e+00]
 [-7.00000000e-01  2.00000000e-01  2.40000000e+00  2.00000000e-01
   3.00000000e+00  1.00000000e+00 -1.00000000e-01  6.80000000e+00
   3.40000000e+00  2.39000000e+01  8.00000000e+00  7.16000000e+01
   1.63000000e+01  1.59200000e+02  3.44000000e+01  2.44100000e+02
   4.01000000e+01  2.68600000e+02  3.68000000e+01  2.42400000e+02
   2.87000000e+01  1.60500000e+02  1.52000000e+01  9.23000000e+01
   8.20000000e+00  4.19000000e+01  2.80000000e+00  9.40000000e+00
   4.20000000e+00  2.30000000e+00]
 [ 8.00000000e-01  4.00000000e-01  3.00000000e-01  7.00000000e-01
   4.20000000e+00  2.50000000e+00  2.90000000e+00  2.50000000e+00
   5.40000000e+00  5.50000000e+00  2.79000000e+01  7.70000000e+00
   6.74000000e+01  2.01000000e+01  1.16700000e+02  3.11000000e+01
   1.50900000e+02  3.15000000e+01  1.58200000e+02  2.56000000e+01
   1.14200000e+02  1.36000000e+01  6.17000000e+01  1.01000000e+01
   2.79000000e+01  1.50000000e+00  8.40000000e+00  2.00000000e+00
  -1.10000000e+00  2.30000000e+00]
 [ 3.80000000e+00  3.50000000e+00 -1.20000000e+00  6.00000000e+00
   2.10000000e+00  9.30000000e+00 -2.00000000e-01  7.40000000e+00
   2.20000000e+00  8.40000000e+00  2.90000000e+00  2.07000000e+01
   8.30000000e+00  4.59000000e+01  1.05000000e+01  7.22000000e+01
   1.91000000e+01  8.59000000e+01  9.90000000e+00  7.10000000e+01
   5.20000000e+00  4.86000000e+01  6.10000000e+00  1.59000000e+01
   7.10000000e+00  5.90000000e+00  1.60000000e+00  2.00000000e-01
   2.70000000e+00  1.20000000e+00]
 [ 2.10000000e+00  9.00000000e-01  4.70000000e+00  5.00000000e-01
   9.00000000e+00  1.30000000e+00  5.40000000e+00  3.10000000e+00
   4.90000000e+00  2.60000000e+00  8.50000000e+00  3.10000000e+00
   7.80000000e+00  3.70000000e+00  2.48000000e+01  7.40000000e+00
   3.46000000e+01  6.30000000e+00  3.20000000e+01  6.00000000e+00
   1.91000000e+01  6.00000000e+00  1.29000000e+01  1.70000000e+00
   2.00000000e+00  2.00000000e-01  5.00000000e-01 -3.00000000e-01
   2.10000000e+00 -8.00000000e-01]
 [ 7.00000000e-01  3.80000000e+00  3.50000000e+00  5.30000000e+00
   1.80000000e+00  4.20000000e+00  1.90000000e+00  6.80000000e+00
   4.30000000e+00  1.09000000e+01  2.50000000e+00 -3.00000000e-01
   3.30000000e+00  5.80000000e+00  3.10000000e+00  8.00000000e+00
   2.50000000e+00  1.01000000e+01  1.40000000e+00  7.30000000e+00
   2.60000000e+00  5.70000000e+00  8.00000000e-01  3.00000000e-01
   5.00000000e-01  1.10000000e+00  2.50000000e+00  7.10542736e-15
  -1.00000000e-01 -1.00000000e-01]
 [-4.00000000e-01  9.00000000e-01  5.70000000e+00  2.00000000e+00
   5.90000000e+00  3.00000000e-01  1.04000000e+01  2.20000000e+00
   1.40000000e+01  1.60000000e+00  1.25000000e+01  1.00000000e-01
   4.20000000e+00 -2.00000000e-01  9.00000000e-01 -3.00000000e-01
   7.00000000e-01  1.70000000e+00  2.80000000e+00  1.10000000e+00
   1.80000000e+00 -1.40000000e+00  4.00000000e-01  4.00000000e-01
   1.70000000e+00  3.00000000e-01  2.00000000e-01  2.40000000e+00
   1.80000000e+00  3.00000000e+00]
 [ 4.00000000e-01 -1.20000000e+00  1.80000000e+00  6.40000000e+00
  -1.50000000e+00  8.00000000e+00  2.70000000e+00  1.29000000e+01
   1.80000000e+00  1.54000000e+01  2.50000000e+00  8.60000000e+00
   2.30000000e+00  5.50000000e+00  4.00000000e-01  4.30000000e+00
   8.00000000e-01 -4.00000000e-01  1.90000000e+00  5.00000000e-01
  -3.00000000e-01  8.00000000e-01  1.00000000e+00  3.00000000e-01
   2.50000000e+00  1.10000000e+00  1.60000000e+00  4.20000000e+00
   5.00000000e-01  4.90000000e+00]
 [-2.00000000e-01  4.00000000e-01  1.60000000e+00  2.70000000e+00
   4.80000000e+00  1.80000000e+00  9.20000000e+00  3.70000000e+00
   1.26000000e+01  5.00000000e-01  1.51000000e+01  1.70000000e+00
   9.20000000e+00  1.10000000e+00  9.20000000e+00  8.00000000e-01
   5.30000000e+00  5.00000000e-01  5.30000000e+00 -4.00000000e-01
   5.20000000e+00  1.30000000e+00  4.10000000e+00  2.70000000e+00
   1.30000000e+00  0.00000000e+00  1.90000000e+00  2.30000000e+00
   5.50000000e+00  2.00000000e+00]
 [-1.00000000e+00  1.30000000e+00  2.00000000e+00  2.80000000e+00
  -1.60000000e+00  5.00000000e+00  7.00000000e-01  7.30000000e+00
   1.90000000e+00  1.54000000e+01  1.60000000e+00  1.21000000e+01
   2.20000000e+00  9.40000000e+00  1.10000000e+00  9.20000000e+00
   3.00000000e-01  1.01000000e+01  1.90000000e+00  8.20000000e+00
   1.20000000e+00  3.20000000e+00  3.30000000e+00  9.70000000e+00
   7.00000000e-01  5.50000000e+00  2.40000000e+00  3.90000000e+00
   3.30000000e+00  4.80000000e+00]
 [-1.60000000e+00  3.80000000e+00  5.00000000e-01  3.40000000e+00
  -7.00000000e-01  1.20000000e+00  4.60000000e+00  3.30000000e+00
   4.60000000e+00  4.50000000e+00  1.26000000e+01  0.00000000e+00
   9.90000000e+00  8.00000000e-01  7.80000000e+00  4.40000000e+00
   7.80000000e+00  2.60000000e+00  1.05000000e+01  8.00000000e-01
   8.50000000e+00  2.60000000e+00  4.80000000e+00  1.70000000e+00
   5.30000000e+00  5.00000000e-01  4.90000000e+00  1.20000000e+00
   7.40000000e+00  3.30000000e+00]
 [-9.00000000e-01  9.00000000e-01  4.00000000e-01 -1.10000000e+00
   1.10000000e+00  4.00000000e-01  7.10542736e-15 -5.00000000e-01
   3.30000000e+00  7.70000000e+00  1.50000000e+00  8.00000000e+00
   1.10000000e+00  1.01000000e+01  0.00000000e+00  8.90000000e+00
   1.50000000e+00  8.10000000e+00  2.40000000e+00  9.40000000e+00
   0.00000000e+00  5.50000000e+00  8.00000000e-01  4.40000000e+00
   2.20000000e+00  9.40000000e+00  3.00000000e-01  6.00000000e+00
   5.00000000e-01  1.50000000e+00]
 [-3.00000000e-01  2.90000000e+00  3.10000000e+00  1.60000000e+00
   9.00000000e-01 -3.10000000e+00  0.00000000e+00  1.60000000e+00
   1.00000000e-01  1.90000000e+00  5.40000000e+00  1.70000000e+00
   6.20000000e+00  1.80000000e+00  6.10000000e+00  3.50000000e+00
   6.00000000e+00  2.90000000e+00  9.10000000e+00  1.10000000e+00
   4.30000000e+00  3.00000000e-01  4.70000000e+00  1.90000000e+00
   5.30000000e+00  3.50000000e+00  6.10000000e+00  1.90000000e+00
   3.50000000e+00  2.00000000e+00]
 [ 1.90000000e+00 -1.00000000e+00  1.00000000e-01 -1.00000000e+00
   2.10000000e+00  2.10000000e+00 -3.10000000e+00  4.00000000e-01
   2.00000000e-01  3.50000000e+00  3.20000000e+00 -3.00000000e-01
   2.20000000e+00 -8.00000000e-01 -9.00000000e-01  4.00000000e+00
   1.00000000e+00  5.70000000e+00  2.30000000e+00  5.20000000e+00
   2.00000000e-01  4.80000000e+00  2.80000000e+00  5.40000000e+00
   1.90000000e+00  1.00000000e+00 -3.10000000e+00  4.00000000e-01
   3.80000000e+00  4.10000000e+00]]

# Do Bayer captures

rpi.capture_bayer_sequence(num_shots=5, extract_rgb_channels=extrac

我发现了错误。 问题是我在每次调用时都修改了数组,这导致了溢出错误。

解决办法是

img_to_optimize = np.copy(img)

def get_smoothness(params, signal, rx, ry, bx, by, signal_orig):
    """Computes the smoothness by calculating the difference between each entry."""
    sr, sb = params
    # print(sr, sb)
    
    # Scale the arrays by the initial guess
    signal[ry::2, rx::2] = signal_orig[ry::2, rx::2] * sr
    signal[by::2, bx::2] = signal_orig[by::2, bx::2] * sb
    
    res = np.sum(np.abs(np.diff(signal, axis=0))) + np.sum(np.abs(np.diff(signal, axis=1)))
    
    return res

# Initialize the scale factor
sb, sr = 7., 6.

# Minimize the smoothness function
res = optimize.minimize(get_smoothness, [sr, sb], method='Nelder-Mead', args=(img_to_optimize, rx, ry, bx, by, img))

# The optimal scale factor is stored in the x field of the result
if res.success:
    print(res.x)
else:
    print(res.message)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM