0

Open-Source Chinese and Japanese Handwriting Recognition

Tegaki is an Open-Source Chinese and Japanese Handwriting Recognition

Advertisements
0

ICP algorithm

a list of material explaining ICP algorithm:

  1. simple and easy-to-understand explanation on both ICP and its variants
  2. blog post explaining each step of the ICP algorithm (in Japanese) (1の内容を簡潔にまとめたブログ記事)
  3. Robust Registration of 2D and 3D Point Sets: FitzgibbonがBMVC 2001で発表した論文.読みやすい
  4. MatLab and Python code

SVDを使って剛体変換(R, t)を求める方法は,この資料が分かりやすい

0

Basis Pursuit and Matching Pursuit

Suppose we observe a signal x. With a dictionary D, the signal x is represented by a linear equation as x = D\alpha. Given the observed signal, our goal is to find the coefficients \alpha.

Assuming \alpha sparse vector is one direction. Thus, the solution is formulated as
\hat{\alpha} = \textrm{argmin}_{\alpha} ||\alpha||_{0}
\textrm{s.t. }x = D\alpha.
However, this L0 norm minimization is known as NP-hard. Instead of L1 minimization, both Basis Pursuit (BP) and Matching Pursuit (MP) are applicable for this problem.

MP is categorized as a greedy algorithm that greedy minimizes ||x-D\alpha||.
Basis pursuit is an L1 minimization that solves
\hat{\alpha} = \textrm{argmin}_{\alpha} ||\alpha||_{1}
\textrm{s.t. }x = D\alpha.

0

基底追跡 Basis pursuit

色々勉強中.基底追跡について,まだまだ理解が足りない気もするがまとめてみる.

DCTやウェーブレットを使った次元圧縮問題を考える.
Ax=b
x,bはそれぞれn次元ベクトル,Aはn×n行列であるとする.
Aを仮にDCTを表す直交基底行列とすると,上の式は原信号xをDCTした信号bを得る事を意味している.bの値が大きい時,それは原信号xがその周波数成分を大きく持つ事になる.そのため,最も単純な次元圧縮方法は,bの絶対値abs(b)が大きいものを上位k個選び,その他の値を0としたb_hatを逆変換すれば良い.
b_hat = b if abs(b) > b_thresh or 0 otherwise
x_hat = A^{-1}b
ここで,b_threshはk番目にabs(b)が大きいbの値,A^{-1}はAの逆行列を表す.

DCTのような直交基底を用いた次元圧縮は,原信号のエネルギーが低周波に集まる(信号が滑らか)事を仮定しているため,インパルスノイズに弱い.
ちょっと違う視点で考えてみると,DCTを表す直交行列は周期関数に適した信号のための基底行列であるため,インパルスノイズを含む信号には対応出来ないというわけ.

過完備基底を用いた基底追跡の根本的な考えは,変換行列に色々な信号に適した行列を含めてしまおうというもの.
ここで,
Bx=y
という問題を考える.原信号xはn次元ベクトルであるが,yはm次元ベクトル(m>n),Bはm×n行列となる.このような過剰な基底(過完備基底)を使うと,yをユニークに求められなくなるので,yは出来るだけスパースな信号で表せるという仮定を置く事で以下の最小化問題に帰着できる.
minimize |Bx-y|_2
subject to |y|_1
では,どのようなBを選べば良いかというと,例えばB=A|Iというように,DCTを表す直交行列と単位行列を組み合わせると,Aの部分が滑らかな信号を,Iの部分がインパルスノイズをそれぞれ表す事となる.

このように,過完備基底を使う事でインパルスノイズを持つ信号の圧縮も行える.

0

アイディア

RANSACベースのfittingというかoptimizationの解き方。

理論上、n点のデータがあれば解ける。
今、m(m>n)点のデータを持っている。
m点のデータの信頼性にはばらつきがあるが、外れ値などはない。

  1. m点の中からランダムにn点を選び最適化。
    • 一方で、n点のデータが信頼できるものであれば、安定した解が求まる。
    • 選択したn点のデータの中に信頼性が低いデータがあると、不安定な解が求まる。
  2. この処理をi回繰り返すと、大半は安定した解に近い解が見つかり、一部の結果のみが外れ値となる。
  3. 外れ値を生む点のデータを削除する等の処理をして、再度解を求める

いつ使えるかわかんないけど、今度使ってみる。

0

Camera Calibration Toolbox for MatLab pt.2

続き.今度はステレオカメラのキャリブレーション.

前提:

  • ステレオカメラで同じシーンを撮影している.
  • 2台のカメラともcalib_guiで内部・外部パラメータ共にキャリブレーション済み.
  1. mainの実行
    >> stereo_gui
  2. 各カメラの内部・外部パラメータのロード
    >> Load left and right calibration files
  3. ステレオのキャリブレーション
    >> Run stereo calibration
  4. 結果の保存
    >> Save stereo calib results

こっからが大事.
stereo_triangulation.mを使うと,点の3次元座標を計算できる.
各画像の格子点情報は以下の変数として格納されている(n = 画像の数).
x_left_1, x_left_2, x_left_3, …, x_left_n
x_right_1, x_right_2, x_right_3, …, x_right_n
サイズが2×格子点の数のdouble型の行列で,以下のようにデータが格納されている.
|x1 x2 x3 … xm|
| | (m = 格子点の数)
|y1 y2 y3 … ym|

stereo_triangulationを実行するためには,各カメラの対応点群(e.g., x_left_1, x_right_1)とカメラ間の外部パラメータ(om and T)及び各カメラの内部パラメータが必要.
各カメラ画像中の点の3次元座標をXc_1_left,Xc_1_rightに格納するとすると,以下のようにして求める.
[Xc_1_left,Xc_1_right] = stereo_triangulation(x_left_1, x_right_1, om, T, fc_left, cc_left, kc_left, alpha_c_left, fc_right, cc_right, kc_right, alpha_c_right);
返戻値として返ってくるXc_1_left,Xc_1_rightは以下のようなデータ.
|x1 x2 x3 … xl|
|y1 y2 y3 … yl| (l = 対応点の数)
|z1 z2 z3 … zl|
ちゃんと読みきれてないが,データを見る限りでは,この3次元座標は各カメラ座標系における3次元座標に見える.