Pythonを使用したテンプレートマッチングによるエンドツーエンドのオブジェクト検出

テンプレートマッチングによるカスタムオブジェクト検出を実装する方法。 注釈付きデータは必要ありません!

object-detection-template-matching
コンポーネントを検出するテンプレートマッチングによるオブジェクト検出

今日、最先端のオブジェクト検出アルゴリズム(画像内のオブジェク

オブジェクト検出出力
オブジェクト検出出力

テンプレートマッチングは、テンプレート画像に一致する画像の小さな部分を見つけるためのデジ これは、物体検出を行うためのニューラルネットワークよりもはるかに簡単な解決策です。 さらに、それは次の利点と来る:

  • データに注釈を付ける必要はありません(ニューラルネットワークを訓練するための時間がかかり、必須のタスク)
  • 境界ボックスがより正確です
  • GPUの必要はありません

私の経験では、Yolov4やオブジェクト検出のようなニューラルネットワークとテンプレートマッチングを組み合わせることは、ニューラルネットワークのパフォーマンスを大幅に向上させる良い方法です!

テンプレートマッチングとは何ですか?

OpenCVテンプレートマッチングを使用すると、テンプレートは画像上でピクセル単位でスライドします。 各位置について、テンプレートイメージと復元するイメージの部分との間の類似度メトリックが計算されます:

template-matching-example
テンプレートマッチングを使用してスキャンされた文書内のフランス語IDを検出する

類似度メトリックが一つのピクセルに対して十分

その結果、検出しようとするオブジェクトがクラス内で十分に類似している場合にのみ、テンプレートマッチングでオブジェクト検出を実現できます。 オブジェクトのバリエーション(サイズ、色、向き)に対処するために、より多くのテンプレートを含めることができます。 しかし、それは予測時間を増加させます。

一見すると、非常に制限的なようです。 しかし、多くのオブジェクト検出ユースケースには、テンプレートマッチングで取り組むことができます:

  • スキャンされた文書のID
  • 固定カメラからの空の駐車スペース
  • 組立ライン上のコンポーネント。..

実際の例

テンプレートマッチングを使用したオブジェクト検出の良いユースケースは、このようなプリント回路上の部品を検出することです:

printed-circuit-unsplash
プリント回路-写真:Umberto On Unsplash

そのような回路を生産する組立ラインを想像することができます。 製造されたいくつかの回路が部品が不足しているため、欠陥があると想像してみましょう。 私たちは、欠陥のある製品を除外するために、トレイルの終わりにカメラを設置し、各回路を撮影することを提案することができます。 私たちは、テンプレートマッチングとオブジェクト検出でこれを達成することができます!

簡単にするために、いくつかのコンポーネントの検出に焦点を当てます。

最初のコンポーネントが二度表示されます:

template-matching-component-1
コンポーネント1

これは四回登場します:

template-matching-component-2
コンポーネント2

そして、この第三のものは六回登場します:

template-matching-component-3
コンポーネント3

最後に、これらの3つの画像をテンプレートとして選択します。 少なくともテンプレートとして選択されたオブジェクトを簡単に検出します。

テンプレートマッチングによる基本的なオブジェクト検出

テンプレートの定義

まず、テンプレートを次のように定義します:

  • 画像パス、
  • ラベル、
  • 色(結果の視覚化の場合—境界ボックスとラベルの色)、
  • および一致するしきい値。

次に、このしきい値を超える類似度メトリックを持つすべてのピクセルは、このテンプレートの検出を示していると考えます。

テンプレートを定義するコードは次のとおりです:

テンプレートの定義

テンプレートマッチングによるオブジェクトの検出

次に、テンプレートをループして、各テンプレートのテンプレートマッチングによるオブジェク しきい値を使用しているため、テンプレートマッチングを適用するときに正規化された類似度メトリック(TM_CCOEFF_NORMED)を選択します。 したがって、0と1の間のしきい値を選択することができます:

テンプレートマッチングによるオブジェクト検出

テンプレートのしきい値を超える類似度スコアを持つ各ピクセルは、オブジェクトの左上隅(テンプ

検出されたオブジェクトの可視化

次に、このオブジェクト検出の予測された境界ボックスを、入力画像上のテンプレートマッチングでプロットします:

オブジェクト検出結果の表示

最後に、以下の結果が得られます:

template-matching-duplicated-detected-objects
Duplicated detected objects

ボックスの厚さ(緑、黄、赤)で示されるように、各オブジェクトは数回検出されました。

重複を削除

重複検出を取得したのはなぜですか? 上記で説明したように、OpenCVテンプレートマッチングは、入力画像の次元(入力画像ピクセルごとに1つのセル、したがって1つの類似度スコア)を持つ2次元

したがって、ある場所でオブジェクトが検出された場合、周囲のすべてのピクセルは同じ類似度スコアを持つ可能性が高く、他のオブジェクトの左上隅と見なされます。

この問題に対処するために、一致する値を小さくしてすべての検出をソートします。 次に、各検出を検証するかどうかを選択します。 すでに検証されている検出のいずれかと重複しすぎていない場合は、検出を検証します。 最後に,境界ボックスの和集合上の交点が与えられたしきい値を超えている場合,二つの検出が重複していることを決定した。 このプロセスは非最大抑制と呼ばれます。

ここでは、ユニオン上の交差点(IoU)が何であるかを視覚的に説明します:

ユニオン上の交差点

ここで私はそれを実装した方法です(より多くの説明と一緒にIoUメソッドを計算することができますhere):

非最大抑制

そして、私はちょうど検出ループの後にこれらの二つの行を追加しました:

NMS

を適用すると、次のようになります。:

重複排除された検出されたオブジェクト
重複排除された検出されたオブジェクト

はるかにクリーン! これで、すべての第1成分と第3成分が偽陽性なしで検出されることが明らかになりました(精度と1のリコール)。

ここで、コンポーネント2の偽陽性の数を減らしたいと思います。 最も簡単な方法は、このラベルに使用されるテンプレートの一致しきい値を増やすことです。

ハイパーパラメータの選択

ハイパーパラメータ(テンプレートマッチングしきい値と最大抑制しきい値以外)を選択するには、さまざまな画像上のオブジェクト検出メトリクスを計算することをお勧めします。 今のところ、我々は、単にコンポーネントのしきい値を増やすことができます2:

テンプレート一致したしきい値

を選択すると、次のようになります:

最後の出力
最終出力

数十(精度2/3、リコール1)ではなく、コンポーネント2の偽陽性が2つしかないようになりました! さらに、コンポーネント1と2はまだ完全に検出されます(精度と1のリコール)。

私たちの結果を改善するために、我々は可能性があります:

  • コンポーネント2のテンプレートを追加しました。
  • いくつかの類似性メトリックを試してみてください
  • 検出メトリックを計算するためにいくつかの画像に注釈を付け、これらのパラメータにグリ

概要

テンプレートマッチングによるオブジェクト検出を達成しました:

  • 各オブジェクトに対して少なくとも一つのテンプレートを定義する(一つのオブジェクトに対してテンプレートが多いほど、リコールが高くなり、精度が低い)
  • 各テンプレートの画像に対するOpenCVテンプレートマッチングメソッドを使用する
  • テンプレートしきい値を超える類似度スコアを持つ各ピクセルがオブジェクトの左上隅であることを考慮する(このテンプレートの高さ、幅、およびラベルを持つ)
  • 得られた検出の非最大抑制を適用する
  • 検出精度を向上させるためにテンプレートしきい値を選択!

それだ!

画像認識の専門家をお探しですか? 私達に連絡することを躊躇しないで下さい!

You might also like

コメントを残す

メールアドレスが公開されることはありません。