![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
Levenberg-Marquadt ソルバ。詳細...
#include <opencv2/geometry/3d.hpp>
クラス | |
| struct | Report |
| 最適化のレポート。詳細... | |
| struct | Settings |
| LevMarq の設定を保持する構造体。詳細... | |
公開型 | |
| typedef std::function< bool(InputOutputArray, OutputArray, OutputArray)> | LongCallback |
| typedef std::function< bool(InputOutputArray, OutputArray, OutputArray, double &)> | NormalCallback |
Levenberg-Marquadt ソルバ。
Levenberg-Marquadt アルゴリズムは、現在のパラメータベクトルを起点として、目的関数の値(エネルギー、コスト、誤差とも呼ばれる)を局所的に最小化する。これを行うため、各反復ではプローブ点におけるエネルギーが減少するまで繰り返し計算する。プローブ点を計算するには、次の線形方程式を解く: (J^T*J + lambda*D)*dx = -J^T*b ここで J は関数のヤコビアン、b は残差(誤差またはエネルギー項とも呼ばれる)のベクトル、D は J^T*J の対角成分から生成される対角行列であり、lambda はプローブ点ごとに変化する。得られた dx を現在の変数に「加算」してプローブ値を形成する。「加算」を括弧書きにしたのは、一部の群(たとえば SO(3) 群)ではこの増分が自明でない操作になり得るためである。
詳細については Wikipedia のページ (https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm) を参照のこと。
このソルバは固定変数と2種類のコールバック関数をサポートする:
現在のところ、ソルバは密なヤコビアン行列と線形なパラメータ増分をサポートする。
| std::function<bool(InputOutputArray, OutputArray, OutputArray)> cv::LevMarq::LongCallback |
「Long」コールバック: f(param, &err, &J) -> bool 指定されたパラメータベクトルに対する誤差とヤコビアンを計算し、成功時に true を返す。
param: 現在のパラメータベクトル err: 誤差の出力ベクトル: err_i = actual_f_i - ideal_f_i J: ヤコビアンの出力: J_ij = d(ideal_f_i)/d(param_j)
パラメータベクトルの値は、固定されている場合に限りコールバックで変更してよい。固定されていない変数を変更すると、誤った結果につながる可能性がある。J=noArray() のとき、それは計算する必要がないことを意味する。誤差ベクトルとパラメータベクトルの次元は異なっていてよい。コールバックは各出力配列を(noArray() でない限り)「create」メソッドで明示的に確保する必要がある。
| std::function<bool(InputOutputArray, OutputArray, OutputArray, double&)> cv::LevMarq::NormalCallback |
Normal コールバック: f(param, &JtErr, &JtJ, &errnorm) -> bool
二乗 L2 誤差ノルム、正規方程式行列 J^T*J、および J^T*err ベクトルを計算する。ここで J は MxN のヤコビアン: J_ij = d(err_i)/d(param_j)、err は Mx1 の誤差ベクトル: err_i = actual_f_i - ideal_f_i、M は誤差項の数、N は最適化する変数の数である。誤差項の数が変数の数を大きく上回る場合、通常の Callback の代わりにこのクラスを使うとよい。
param: 現在の Nx1 パラメータベクトル JtErr: 出力 Nx1 ベクトル J^T*err JtJ: 出力 NxN 行列 J^T*J errnorm: 出力総誤差: dot(err, err)
パラメータベクトルの値は、固定されている場合に限りコールバックで変更してよい。固定されていない変数を変更すると、誤った結果につながる可能性がある。JtErr または JtJ が空の場合、それらを計算する必要はない。コールバックは各出力配列を(noArray() でない限り)「create」メソッドで明示的に確保する必要がある。
| cv::LevMarq::LevMarq | ( | int | nvars, |
| LongCallback | callback, | ||
| const Settings & | settings = Settings(), | ||
| InputArray | mask = noArray(), | ||
| MatrixType | matrixType = MatrixType::AUTO, | ||
| VariableType | paramType = VariableType::LINEAR, | ||
| int | nerrs = 0, | ||
| int | solveMethod = DECOMP_SVD ) |
ソルバを生成する
| nvars | パラメータベクトル中の変数の数 |
| callback | 「Long」コールバック。各エネルギー項についてヤコビアンと残差を生成し、成功時にtrueを返す |
| settings | LevMarq の設定構造体。詳細はLevMarqBaseクラスを参照 |
| mask | 最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す |
| matrixType | ソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている |
| paramType | 最適化されるパラメータの型。現在はLINEARのみがサポートされている |
| nerrs | エネルギー項の数。ゼロの場合は、コールバックが生成するヤコビアンのサイズが代わりに使われる |
| solveMethod | 線形システムを解くために使用する手法 |
| cv::LevMarq::LevMarq | ( | int | nvars, |
| NormalCallback | callback, | ||
| const Settings & | settings = Settings(), | ||
| InputArray | mask = noArray(), | ||
| MatrixType | matrixType = MatrixType::AUTO, | ||
| VariableType | paramType = VariableType::LINEAR, | ||
| bool | LtoR = false, | ||
| int | solveMethod = DECOMP_SVD ) |
ソルバを生成する
| nvars | パラメータベクトル中の変数の数 |
| callback | 通常のコールバック。JとbではなくJ^T*JとJ^T*bを直接生成し、成功時にtrueを返す |
| settings | LevMarq の設定構造体。詳細はLevMarqBaseクラスを参照 |
| mask | 最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す |
| matrixType | ソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている |
| paramType | 最適化されるパラメータの型。現在はLINEARのみがサポートされている |
| LtoR | 対称行列のどの部分を別の部分にコピーするか(下三角または上三角)を指定する。alt. callback でのみ使用する |
| solveMethod | 線形システムを解くために使用する手法 |
| cv::LevMarq::LevMarq | ( | InputOutputArray | param, |
| LongCallback | callback, | ||
| const Settings & | settings = Settings(), | ||
| InputArray | mask = noArray(), | ||
| MatrixType | matrixType = MatrixType::AUTO, | ||
| VariableType | paramType = VariableType::LINEAR, | ||
| int | nerrs = 0, | ||
| int | solveMethod = DECOMP_SVD ) |
ソルバを生成する
| param | 開始パラメータベクトルと、最適化結果のパラメータを格納する入出力ベクトル |
| callback | 「Long」コールバック。各エネルギー項についてヤコビアンと残差を生成し、成功時にtrueを返す |
| settings | LevMarq の設定構造体。詳細はLevMarqBaseクラスを参照 |
| mask | 最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す |
| matrixType | ソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている |
| paramType | 最適化されるパラメータの型。現在はLINEARのみがサポートされている |
| nerrs | エネルギー項の数。ゼロの場合は、コールバックが生成するヤコビアンのサイズが代わりに使われる |
| solveMethod | 線形システムを解くために使用する手法 |
| cv::LevMarq::LevMarq | ( | InputOutputArray | param, |
| NormalCallback | callback, | ||
| const Settings & | settings = Settings(), | ||
| InputArray | mask = noArray(), | ||
| MatrixType | matrixType = MatrixType::AUTO, | ||
| VariableType | paramType = VariableType::LINEAR, | ||
| bool | LtoR = false, | ||
| int | solveMethod = DECOMP_SVD ) |
ソルバを生成する
| param | 開始パラメータベクトルと、最適化結果のパラメータを格納する入出力ベクトル |
| callback | 通常のコールバック。JとbではなくJ^T*JとJ^T*bを直接生成し、成功時にtrueを返す |
| settings | LevMarq の設定構造体。詳細はLevMarqBaseクラスを参照 |
| mask | 最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す |
| matrixType | ソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている |
| paramType | 最適化されるパラメータの型。現在はLINEARのみがサポートされている |
| LtoR | 対称行列のどの部分を別の部分にコピーするか(下三角または上三角)を指定する。alt. callback でのみ使用する |
| solveMethod | 線形システムを解くために使用する手法 |
| Report cv::LevMarq::optimize | ( | ) |
現在の設定と与えられたパラメータベクトルを用いて Levenberg-Marquadt アルゴリズムを実行する。このメソッドは最適化のレポートを返す。
| Report cv::LevMarq::run | ( | InputOutputArray | param | ) |
渡されたパラメータベクトルを開始点として最適化を実行する。
(アルゴリズムが収束したかどうかにかかわらず)最終的なパラメータベクトルは同じベクトルに格納される。異なる開始点で再実行する必要がある場合、このメソッドを optimize() メソッドの代わりに使用できる。このメソッドは最適化のレポートを返す。
| param | パラメータの初期/最終ベクトル。 |
パラメータ空間の次元はparamベクトルのサイズによって定義され、最適化される基準の次元はコールバックによって計算されるerrベクトルのサイズによって定義されることに注意する。