Edited at

[Pytorch] QATM:Quality-Aware Template Matching For Deep Learningを実装し直してみた


論文の概要

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



image.png
image.png

image.png