非最大値抑制(Non-Maximum Suppression,NMS)アルゴリズムの概要と実装例について

機械学習技術 自然言語技術 人工知能技術 デジタルトランスフォーメーション技術 画像処理技術 強化学習技術 確率的生成モデル 深層学習技術 Python 本ブログのナビ
非最大値抑制(Non-Maximum Suppression,NMS)アルゴリズムの概要

非最大値抑制(Non-Maximum Suppression、NMS)は、物体検出などのコンピュータビジョンのタスクに使用されるアルゴリズムで、主に、複数の重なり合ったバウンディングボックスや検出ウィンドウから最も信頼性の高いものを選択するために利用されるものとなる。以下に、NMSの概要を示す。

1. NMSの動作原理: NMSは、以下の手順で動作する。

1. 検出されたオブジェクトの信頼性スコアとバウンディングボックスの情報を取得する: 検出器(例えば、物体検出モデル)によって検出されたオブジェクトのバウンディングボックスと、それに対応する信頼性スコア(検出されたオブジェクトが本当に存在する確信度)を取得する。

2. 信頼性スコアが最大のバウンディングボックスを探す: バウンディングボックスを信頼性スコアの降順でソートし、ソートされたリストの先頭にあるバウンディングボックス(信頼性スコアが最大のもの)を取り出し、採用リストに追加する。このバウンディングボックスは、残りのバウンディングボックスと比較される基準となる。

3. 他のバウンディングボックスとの重なりを計算し、閾値より大きいものを削除する: 残りのバウンディングボックスについて、信頼性スコアが最大のバウンディングボックスとの重なり(Intersection over Union、IoU)を計算し、IoUが閾値(通常は0.5)よりも大きいバウンディングボックスは、重なり合うものとして見なされる。重なり合うバウンディングボックスの中から、信頼性スコアが最大のバウンディングボックス以外を取り除く。IoUの詳細は”IoU(Intersection over Union)の概要と関連アルゴリズム及び実装例について“を参照のこと。

4. 採用リストにバウンディングボックスを追加する: 重なり合わないバウンディングボックスは、採用リストに追加し、重なり合うバウンディングボックスの中で、信頼性スコアが最大のバウンディングボックスも、採用リストに追加される。

5. 繰り返し処理: 上記の手順を繰り返し、残りのバウンディングボックスがなくなるまで続ける。

2. NMSの利点: 

重なり合ったバウンディングボックスの削減:NMSは、複数の検出候補のうち、重なり合ったものを削減し、最も信頼性の高い検出結果を残す。
信頼性スコアの高い検出の選択:信頼性スコアが最大のバウンディングボックスを基準に、他の検出候補と比較し、適切なものを選択する。

NMSは、物体検出やセマンティックセグメンテーションなどのコンピュータビジョンのタスクにおいて、重要な役割を果たすアルゴリズムの一つであり、適切に設定された閾値と効率的な実装により、正確で効率的な検出結果を得ることができるものとなっている。

NMSアルゴリズムに関連するアルゴリズムについて

NMS自体が単独のアルゴリズムだが、関連するアルゴリズムや手法が存在している。以下に、それらNMSに関連するアルゴリズムについて述べる。

1. ソートとフィルタリング: NMSは、ソートとフィルタリングの概念に基づいている。この手法は、信頼性の高いものを選択するために、検出されたオブジェクトのリストを信頼性スコアでソートし、重なり合うものをフィルタリングする。

ソート:検出されたオブジェクトを信頼性スコアで降順にソートし、これにより、信頼性の高いものが先頭に位置することになる。

フィルタリング:ソートされたリストを順番に処理し、重なり合うバウンディングボックスを削除する。信頼性スコアが最大のバウンディングボックスを採用し、それと重なり合うものは削除する。

2. インターセクション・オーバー・ユニオン(Intersection over Union、IoU): IoUは、2つのバウンディングボックスの重なり具合を示す指標となる。NMSで使用される閾値に基づいて、重なり具合を判定します。以下の式で定義される。

\[ IoU = \frac{{\text{Area of Intersection}}}{{\text{Area of Union}}} \]

IoUが閾値より大きい場合、2つのバウンディングボックスは重なり合っているとみなされる。

3. Soft-NMS: Soft-NMSは、NMSの改良版であり、ソフトな重み付けを導入して、オブジェクトのスコアを更新する手法となる。通常のNMSでは、重なり合うバウンディングボックスを削除するが、Soft-NMSでは、重なり合うバウンディングボックスに対しても重みを与え、削除を緩和している。この手法により、一部の重なり合うバウンディングボックスが保持され、結果としてオブジェクトの検出精度が向上する。

4. Greedy NMS: Greedy NMSは、一般的なNMSのアルゴリズムとなる。信頼性スコアで降順にソートされた検出オブジェクトのリストを処理し、重なり合うバウンディングボックスを削除していき、重なり合うもののうち、信頼性スコアが低いものを削除する。

5. Soft-IoU: Soft-IoUは、IoUの計算において、ソフトマックス関数を使用してIoUを正規化する手法となる。これにより、ソフトなIoUスコアが得られる。

NMSアルゴリズムの適用事例について

NMSは、主に物体検出のタスクにおいて広く使用されている。以下にそれら適用事例について述べる。

1. オブジェクト検出: 物体検出では、一つの画像中に複数のオブジェクトが存在する場合、複数のバウンディングボックス(検出ウィンドウ)が得られる。このとき、NMSは以下のように適用されている。

  • 検出されたバウンディングボックスを信頼性スコアでソートする。
  • 最も信頼性の高いバウンディングボックスを選択し、他のバウンディングボックスとの重なりを計算する。
  • 重なりが一定の閾値を超えるバウンディングボックスは削除され、最終的なオブジェクト検出結果が得られる。

2. セマンティックセグメンテーション: セマンティックセグメンテーションでは、画像内の各ピクセルに対して、そのピクセルがどのクラスに属するかを予測している。この際、各ピクセルには複数の候補があるが、NMSを適用して重なりを除去することで、最終的なセグメンテーション結果を得ることができる。

3. 文字認識: 文字認識においても、複数の文字が重なり合って検出されることがある。NMSを使用して、重なりを解消し、正確な文字の検出結果を得ることができる。

4. 物体追跡: 動画データでの物体追跡において、連続するフレームで物体が重なることがある。NMSを用いて、各フレームの物体検出結果から、重複を除去し、連続した追跡結果を得ることができる。

5. 顔検出: 顔検出においても、複数の顔が検出される場合があります。NMSを適用して、重なりを解消し、正確な顔の検出結果を得ることができる。

6. 駐車場や交通シーンの車両検出: 駐車場や交通シーンなどでの車両検出にもNMSが使用される。複数の車両が重なることがあり、NMSを適用することで、正確な車両検出結果を得ることができる。

非最大値抑制(Non-Maximum Suppression,NMS)アルゴリズムの実装例について

NMSの基本的な実装例を示す。以下の例では、PythonとNumPyを使用して、簡単なNMSアルゴリズムを実装している。ここでは、入力としてバウンディングボックス(Bounding Boxes)のリストとその信頼性スコアを取る。

import numpy as np

def non_maximum_suppression(boxes, scores, threshold):
    """
    非最大値抑制(NMS)アルゴリズムの実装
    
    Args:
    - boxes: バウンディングボックスのリスト。各バウンディングボックスは [x1, y1, x2, y2] の形式で表される。
    - scores: バウンディングボックスの信頼性スコアのリスト。
    - threshold: IoU(重なり合い度)の閾値。重なり合うボックスのうち、IoUがこの値以上のものは除外される。
    
    Returns:
    - selected_indices: 選択されたバウンディングボックスのインデックスのリスト。
    """
    # バウンディングボックスの座標
    x1 = boxes[:, 0]
    y1 = boxes[:, 1]
    x2 = boxes[:, 2]
    y2 = boxes[:, 3]
    
    # バウンディングボックスの面積
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    
    # スコアが高い順にインデックスをソート
    indices = np.argsort(scores)[::-1]
    
    selected_indices = []
    
    while len(indices) > 0:
        # 最もスコアが高いバウンディングボックスのインデックスを取得
        i = indices[0]
        selected_indices.append(i)
        
        # 残りのバウンディングボックスとの IoU を計算
        xx1 = np.maximum(x1[i], x1[indices[1:]])
        yy1 = np.maximum(y1[i], y1[indices[1:]])
        xx2 = np.minimum(x2[i], x2[indices[1:]])
        yy2 = np.minimum(y2[i], y2[indices[1:]])
        
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        
        inter_area = w * h
        iou = inter_area / (areas[i] + areas[indices[1:]] - inter_area)
        
        # 重なりの度合いが閾値以下のバウンディングボックスを削除
        indices = indices[1:][iou <= threshold]
        
    return selected_indices

この例では、boxesはバウンディングボックスの座標([x1, y1, x2, y2]形式)を行ごとに持つ2次元のNumPy配列であり、scoresは各バウンディングボックスの信頼性スコアのリストになる。また、thresholdはIoUの閾値となる。

この関数は、与えられたバウンディングボックスと信頼性スコアに対して、NMSを適用し、重なりの大きいバウンディングボックスを除去し、選択されたバウンディングボックスのインデックスを返している。

NMSアルゴリズムの課題と対応策について

NMSは有用な手法だが、いくつかの課題も持っている。以下に、それらの課題と対応する対策について述べる。

課題:

1. IoUの閾値の選択:  NMSにおいて、重なり合うバウンディングボックスを削除するためのIoUの閾値を適切に設定する必要があり、閾値が低すぎると、重なり合うバウンディングボックスが残り、複数の検出が起こり、閾値が高すぎると、本来検出されるべきオブジェクトが適切に検出されない。

2. クラスごとの最適な閾値の設定:  異なるクラスのオブジェクトに対しては、最適なIoUの閾値が異なり、クラスごとに最適な閾値を設定することで、精度を向上させることができるが、手動での設定が難しい。

3. 低信頼性の検出結果の影響:  信頼性の低い検出結果(低い信頼性スコアを持つバウンディングボックス)がNMSの過程で重なり合うバウンディングボックスを残すことがあり、これにより、誤検出が増加し、精度が低下する。

4. 計算効率の問題:  NMSは、大量のバウンディングボックスに対して重なり合いの計算を行うため、計算コストが高くなり、特に、大規模なデータセットや高解像度の画像で問題が顕著になる。

対策:

1. IoUの動的な調整:  閾値の固定値ではなく、バウンディングボックス間の距離や信頼性スコアなどに基づいてIoUの閾値を動的に調整する手法があり、これにより、さまざまな条件下での最適な閾値を探索し、精度を向上させることができる。

2. クラスごとの最適化:  クラスごとに最適なIoUの閾値を設定するために、検出モデルのトレーニング中に学習させる方法があり、クラスごとの閾値を学習することで、異なるクラスのオブジェクトに対して適切な閾値を設定することができる。

3. ソフトなNMS:  ソフトなNMSでは、重なり合うバウンディングボックスに対しても重みを与え、削除を緩和し、これにより、信頼性の低い検出結果がNMSの過程でより適切に処理され、誤検出の影響を軽減することができる。

4. 高速化手法の利用:  NMSの計算を高速化するための手法があり、例えば、グラフィックスカード(GPU)を使用した並列処理、CythonやC++などの高速な言語での実装、特徴量を使用した近似計算などがある。これらの手法を使用することで、計算効率を向上させることができる。

参考情報と参考図書

画像情報処理の詳細に関しては”画像情報処理技術“を参照のこと。

参考図書としては”物体・画像認識と時系列データ処理入門

Pythonで学ぶ画像認識 機械学習実践シリーズ

今すぐ試したい! 機械学習・深層学習(ディープラーニング) 画像認識プログラミングレシピ

画像認識“等がある。

 

コメント

タイトルとURLをコピーしました