1. 説明
与えられたクエリ画像に最もよく一致する画像を見つけるタスクがあります。まず、SIFT 記述子と OpenCV の Flann ベースのマッチャーを使用して、古典的な画像マッチングを試みました。それは全くの間違いであることが判明した。そして、言葉の袋...最後に、AffNet と HardNet が見つかりました。
2. AffNetとHardNetについて
この記事では具体的に応用実験の方法を紹介するものであり、AffNetやHardNetの原理については詳しく説明しておりません。
AffNet は、ハードネガティブ定数損失を伴う局所アフィン共変領域を学習するための新しい方法であり、最先端のバッグオブワード画像検索やワイドベースラインステレオよりも優れた性能を発揮します。
AffNet トレーニング (元の論文より)
新しいコンパクトな学習済み特徴記述子である HardNet は、標準的なマッチングおよび検索ベンチマークで手作りおよび学習された記述子と比較して最先端の優れたパフォーマンスを示し、GPU での計算が高速です (著者の論文)。これはgithubで公開されています。
これは、AffNet を使用して、極端なアフィン変換でキャプチャされた画像を照合する良い例です。
ここでは、著者がこのアプローチを論文で詳しく説明しています。ハードネットへの良い入門書です。
3. コードの取得
github からリポジトリのクローンを作成します。
git clone https://github.com/ducha-aiki/affnet.git
次に、そのフォルダーに移動します。
Jupyter を起動します。
jupyter notebook
そして、サンプルフォルダー内のノートブック SIFT-AffNet-HardNet-kornia-matching.ipynb を開きます。まず、必要なライブラリをすべてインストールします。ノートブックの上部にセルを作成して実行します
!pip install kornia pydegensac extract_patches
OpenCV バージョン 4 を使用している場合、関数 SIFT_create で「関数/機能が実装されていません。このアルゴリズムは特許取得されており、この構成では除外されています。」というエラーが発生する可能性があります。SIRF と SURF は opencv > 3.4.2.16 では使用できなくなりました。OpenCV の古いバージョンをインストールします。
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
次の 3 つのパイプラインがあります。
- DoG-AffNet-OriNet-HardNet (AffNetJIT、OriNetJIT を使用、SIFT キーポイント、HardNet 記述子などを抽出)
- DoG-Affine-OriNet-HardNet
- DoG-OriNet-HardNet
著者が提供した画像に対する AffNet マッチングに DoG-AffNet-OriNet-HardNet パイプラインを使用すると、次の結果が得られます。
30.0 inliers found
このようなイメージには非常に適しています。
パイプラインの場合 DoG-AffNet-OriNet-HardNet
18.0 inliers found
パイプライン用 DoG-OriNet-HardNet
25.0 inliers found
屋内シーンのコンテストの画像で AffNet をテストしたところ、調整パラメータなしでもエキサイティングでした。ここで AffNet を再トレーニングする必要はありません。
AffNetを統合するには、必要なライブラリをインストールし、事前トレーニングされたモデルの重みをダウンロードするだけです。
wget https://github.com/ducha-aiki/affnet/raw/master/convertJIT/AffNetJIT.pt
wget https://github.com/ducha-aiki/affnet/raw/master/convertJIT/OriNetJIT.pt
wget https://github.com/ducha-aiki/affnet/raw/master/test-graf/img1.png
wget https://github.com/ducha-aiki/affnet/raw/master/test-graf/img6.png
wget https://github.com/ducha-aiki/affnet/raw/master/test-graf/H1to6p
Jupyter ノートブックを Python スクリプトに変換する
jupyter nbconvert SIFT-AffNet-HardNet-kornia-matching.ipynb --to python
CPU はデフォルトで PyTorch によって使用されます
dev = torch.device('cpu')
上の GPU のコメント行に切り替えて、次の行のコメントを解除できます。
#dev = torch.device('cuda')
それでおしまい。画像の一致の問題が解決できれば幸いです。
4. 結論
AffNet と HardNet を使用して Python 環境で画像マッチングを実現する方法を上で説明しました。この機能を実現しようとしている読者は、ルーチンに従ってそれを適用できます。その他の原則については、他の記事で詳しく説明します 。これらのスライドから、 AffNet と HardNet の組み合わせについて学びました。