アダコテック技術ブログ

アダコテックのエンジニアが発信する技術ブログです

高速な位置補正をどう実現するか

テンプレートマッチングと特徴点マッチングを比較してみた

こんにちは。アダコテックでプロダクト開発を担当している伊部です。

今回は、テンプレートマッチングと特徴点マッチングを比較してみました。

画像処理を使った外観検査や認識では、推論モデルそのものに注目が集まりがちです。

一方で、実際の現場で安定して動かすためには、その前段にある「位置補正」も非常に重要です。

撮影時には、対象物の位置ズレや回転がどうしても発生します。

このズレを吸収できないまま推論に入ると、精度が下がったり、検出結果が不安定になったりします。

弊社製品のポカヨケAIシステム POKAMIRU 向けに高速な位置補正が必要になったことをきっかけに、複数の手法を比較しながら、実運用に耐えうる速度と精度のバランスを探ってみました。

今回位置補正を試した画像のサンプル

 

目標とした要件は次のとおりです。

  • 画像サイズは 5M(2248x2048)
  • 位置補正+推論で 300msec 以内
  • 設定項目はできるだけ少なくする

今回は次の2つの手法を比較しました。

  • テンプレートマッチングによる位置補正
  • 特徴点マッチングによる位置補正

背景

画像処理パイプラインでは、入力画像の位置や向きが少し違うだけで、後段の判定結果に影響が出ることがあります。

特に、高速処理が求められるシステムでは、位置補正の精度だけでなく処理時間も重要です。

精度を重視して重い処理を入れれば、全体のスループットが落ちます。

逆に、速度だけを重視すると、補正が不安定になって実運用で困ることがあります。

そこで今回は、実際のワーク画像を使って、位置補正のやり方ごとに成功率と処理速度を比較してみました。


1. テンプレートマッチングによる位置補正

まず試したのが、テンプレートマッチングによる位置補正です。

基本的な考え方はシンプルで、画像の中からテンプレートに一致する位置を探し、マスター画像側のテンプレート位置との差分から、平行移動と回転を求めて位置を合わせます。

今回の設定は以下のとおりです。

  • 類似度計算方法:ZNCC
  • テンプレート:2箇所
  • 変換方法:ユークリッド変換(平行移動+回転)
  • 2段階で位置補正
    • 1段階目:1/4 に縮小した画像で全体をスキャン
    • 2段階目:1段階目で求めた変換結果を使い、テンプレート周辺だけを探索

テンプレートマッチングは回転に弱いため、1回の補正だけでは精度が出にくいケースがあります。

そこで今回は、粗く位置を合わせたあとに探索範囲を絞って再補正する、2段階構成にしました。

結果

補正期待画像に対しては、3ケースすべてで 100% の補正成功率になりました。

テンプレートマッチングによる位置補正(成功例)

一方で、難条件を含む「いじわる問題」では結果にばらつきがありました。

  • ケース1:38%
  • ケース2:86%
  • ケース3:29%

処理時間は、CPU が Core Ultra 7 258V の環境でおよそ 45msec でした。

この結果から、テンプレートマッチングは条件が素直な画像では非常に安定する一方で、難しい条件ではテンプレートの置き方や対象の見え方に影響を受けやすいことが分かります。

速度改善の試行錯誤

テンプレートマッチングでは、処理速度を改善するためにいくつかの条件を試しました。

元画像をそのまま全体スキャンすると、約125msec。

画像を 1/4 に縮小して全体スキャンすると、約37msecまで短縮できました。

ただし、2段階補正にしても、2回目を全体探索すると約170msecと逆に重くなってしまいます。

最終的には、1段階目を 1/4 縮小で全体探索、2段階目を 200x200 の限定範囲探索とすることで、約45msecに収めることができました。

ここで効いたのは、単純な多段化ではなく「2段階目の探索範囲をどれだけ絞れるか」でした。

テンプレートマッチングの課題

テンプレートマッチングには、実運用上いくつかの課題もあります。

まず、テンプレートの位置を事前に設定しなければならないことです。

どこをテンプレートにするかで結果が変わるため、良いテンプレートを選ぶにはそれなりにノウハウが必要です。

また、回転に弱いという課題もあります。

回転済みテンプレートを複数用意するなどの改善策はありますが、そのぶん計算量や設定の複雑さが増えてしまいます。

テンプレートマッチングによる位置補正(失敗例)


2. 特徴点マッチングによる位置補正

次に試したのが、特徴点マッチングによる位置補正です。

こちらは、画像全体から特徴点を抽出し、マスター画像との対応関係から位置を合わせる方法です。

テンプレートを手で指定する必要がなく、回転にも比較的強いという利点があります。

今回の設定は以下のとおりです。

  • 特徴点抽出:AKAZE
  • マッチング:ハミング距離
  • 変換方法:ユークリッド変換(平行移動+回転)
  • 特徴点抽出時の画像サイズ:1/64(縦横1/8)に縮小

なお、ORB も試しましたが、特徴点が少なすぎてうまく位置補正できませんでした。

そのため、今回は AKAZE を採用しています。

特徴点抽出を縮小画像で行ったのは、単に高速化のためだけではありません。

高解像度のままだと細かい特徴まで拾いすぎてしまい、同一部品の別個体に対してかえって不安定になるためです。

結果

特徴点マッチングでは、ケース1とケース3で非常に良い結果が出ました。

補正期待画像だけでなく、いじわる問題も含めて 100% 補正できています。

特徴量マッチングによる位置補正

一方で、ケース2はほとんどうまくいきませんでした。

  • ケース1:補正期待画像 100%、いじわる問題 100%
  • ケース2:補正期待画像 30%、いじわる問題 0%
  • ケース3:補正期待画像 100%、いじわる問題 100%

処理時間は 10〜12msec 程度で、テンプレートマッチングよりもかなり高速です。

ケース2で失敗した理由としては、丸いエッジ特徴が多く、抽出される特徴点がどれも似たような見え方になってしまうため、正しくマッチングできなかったと考えられます。

つまり、特徴点マッチングは「識別しやすい特徴がある対象」には非常に強い一方で、「どの特徴点も似て見える対象」には弱い、という性質が見えてきました。


縮小率を変えると速度と精度はどう変わるか

特徴点マッチングで特に興味深かったのが、入力画像の縮小率による変化です。

元解像度のままでは、処理時間は 800〜1500msec とかなり重くなりました。

しかも、マスター画像の細かい特徴を拾いすぎてしまい、同じ部品の別個体にはマッチしにくくなります。

1/4 まで縮小すると 140〜200msec まで改善し、別個体にもマッチしやすくなりました。

ただし、この段階では背景の特徴まで拾いやすいという問題がありました。

1/16 まで縮小すると 30〜35msec になり、背景特徴の影響も減ってきます。

そして最もバランスがよかったのが 1/64 で、処理時間は 10〜12msec 程度、補正結果も安定していました。

さらに 1/256 まで縮小すると、5〜7msec とさらに速くなります。

ただし、今度は補正ズレが目立つようになり、さすがに情報を落としすぎていることが分かりました。

この結果から、高解像度のまま処理することが必ずしも正解ではないことが分かります。

むしろ、適度に縮小することで不要な細かい特徴や個体差の影響を抑えつつ、速度も大きく改善できるケースがあります。


今回の比較から分かったこと

今回の検討では、どちらの手法にも明確な強みと弱みがありました。

テンプレートマッチングは、テンプレートが適切に置ける対象では安定しやすく、補正期待画像では高い成功率を出せます。

一方で、テンプレート設定が必要であり、回転や難条件への耐性には限界があります。

特徴点マッチングは、テンプレート設定が不要で、回転にも強く、条件が合えば 10〜12msec 程度で非常に高速に動作します。

ただし、対象物の形状によっては特徴点の識別が難しく、ケース2のように一気に性能が落ちることがあります。

つまり、「常にこちらの手法が優れている」という単純な話ではなく、対象物の見た目やばらつき方に応じて向き不向きがある、というのが今回の結論です。


まとめ

位置補正は、推論モデルほど目立つテーマではありません。

それでも、現場で安定して動く画像処理システムを作るうえでは、非常に重要な技術要素です。

実際に使える仕組みにするためには、手法の選択だけでなく、縮小率、探索範囲、対象物の特徴といった実装上の細かな調整が効いてきます。

今回の比較は、そのことを改めて確認するよい機会になりました。

今後は、今回うまくいかなかったケースに対して、別の特徴量や前処理、あるいは手法の組み合わせで改善できるかも検討していきたいと思います。