論文の概要
QATMは、2019年3月18日発表の、新しいDeep learningを用いたtemplate matchingの手法です。
従来の方法では難しかった、サンプル画像N枚とテンプレート画像M枚でのマッチングを可能にし、さらに微分可能な操作のみで記述することで学習することも可能になっています。
もともとtensorflow+kerasのコードは実装されていたのですが、それが若干中途半端なこともあって、使い慣れたPytorchで実装し直してみました。
ただし、今回の実装では空間計算量の点からサンプル画像1枚とテンプレート画像M枚での実装のみにとどめています。
論文紹介
論文arxiv: https://arxiv.org/abs/1903.07254
元のコード (tensorflow+keras): https://github.com/cplusx/QATM
今回実装したコード(pytorch): https://github.com/kamata1729/QATM_pytorch
問題設定
ざっくりとした動作原理としては、まずサンプル画像のある領域$s$とテンプレート画像$t$の間に、「どれだけマッチしてるか」の指標$Quality(s,t)$が定義されているとして、
\begin{equation}
R^* = argmax_R \left\{ \sum_{r\in R}max\left\{Quality(r,t)\mid t \in \bf{T}\right\} \right\}
\end{equation}
となる$R^*$を求めていく。ここで$\bf{T}$は複数のテンプレート画像である。
Quality関数の決定
$s$をサンプル画像中の、テンプレート$t$と同じ大きさのパッチとする。
$f_s$, $f_t$を、$s$, $t$を学習済みモデルに入れて取り出した特徴量マップとし、$\rho(\cdot)$をこの二つの間の距離を測る関数とする(ここではコサイン類似度を使う)
あるパッチ$s$に対して、テンプレート$t$がマッチする確率の尤度関数を以下のように定義する。
\begin{equation}
L(t\mid s) = \frac{\exp\{\alpha\cdot\rho(f_t, f_s)\}}{\sum_{t'\in \bf{T}} \exp\{\alpha\cdot\rho(f_{t'}, f_s)\}}
\end{equation}
$\alpha$は正の定数である。
これは$\alpha$を学習するパラメータとした、softmax層として考えることもできる。
これを用いて、
\begin{equation}
QATM(s,t) = L(t\mid s)\cdot L(s\mid t)
\end{equation}
として、この$QATM(s,t)$を$Quality(s,t)$として用いる。
実装
動作原理としては実際これくらいなので、あとは論文中で実装してあったコード(https://github.com/cplusx/QATM )をみながら何をやっているか追っていけばよいです。
これをPytorchで実装し直す際に、もともとコード自体はサンプル画像1枚に対しテンプレート画像1枚の場合しか対応していなかったものを、サンプル画像1枚に対しテンプレート画像複数枚でのマッチングを可能にしました。
また、元々の実装では、テンプレート画像がサンプル画像内にない場合が考慮(できると論文に書いてあるのに)されていなかったため、これも考慮に入れて、確率値が低いものをはじくようにしました。
今回実装したコード(pytorch): https://github.com/kamata1729/QATM_pytorch
実行結果
用意しておいたデモ画像で実行してみます
template1_1.png
からtemplate1_4.png
はサンプル画像に存在しているものの、template1_dummy.png
は存在していません。
この状況でも、正しく検出できていることがわかります
python qatm.py -s sample/sample1.jpg -t template --cuda
template1_1.png | template1_2.png | template1_3.png | template1_4.png | template1_dummy.png |
---|---|---|---|---|