meideru blog

meideruが書いているブログです。主に電子工作・プログラミング・ガジェット類などを中心に記事を書いています。

物体検出におけるNon-Maximum Suppressionのアルゴリズム

   

最近は機械学習にのめり込んでいます。特にディープラーニングを用いた画像認識の勉強しています。

これまでに手書き文字(MNIST)の認識や、一般物体認識(CIFAR-10)に挑戦しました。

TensorFlowでMNISTをやってみた
前回の記事でChainerからTensorFlowに乗り換えたという話をしました。 今回は、TensorFlowを用いてMNISTをやってみました。MNISTはプログラミングの世界で言うところの「Hello World !」のようなものでありますので、探せばサンプルコードはいくらでも落ちてる...

(CIFAR-10の記事は準備中です。。。)

 

そして、今挑戦しているのは物体検出です。

@イメージ図
物体検出

R-CNNベースでの実装を試みています。

この手法は実行速度が遅いですが、物体検出における基本的なやり方なので、まずはやってみようと思います。

 

本題に入ります。

R-CNNの論文の中に「Non-Maximum Suppression」というアルゴリズムが登場します。

なんとか理解できましたが、調べるのに時間がかってしまいました( ;∀;)

他にも困っている人がいると思うので、これが何なのかを記事に書きます。

R-CNNについて

R-CNNについては公式の論文を読むことをオススメします。

この場では説明しません(~_~;)

Non-Maximum Suppressionについて

論文に登場

Non-Maximum Suprressionは、R-CNNの公式の論文にはこう記されています。

Given all scored regions in an image, we apply a greedy non-maximum suppression (for each class independently) that rejects a region if it has an intersection-over-union (IoU) overlap with a higher scoring selected region larger than a learned threshold.

画像の全ての候補領域に得点が付けられている場合、ある領域に、より高い得点で選択され、学習された閾値より大きな値を持つ領域とのIoU値が重複した場合、その領域を排除するnon-maximum suppressionを(各々クラスに対して独立して)適用する。

 

私自身は、この英文の意味は理解しているのですが、上手に訳せませんでした(~_~;)

英語と日本語の違いってやつでしょうか?w

Non-Maximum Suppressionとは何なのか

Non-Maximum Suppressionとは、一言で説明すると、同じクラスとして認識された重なっている状態の領域を抑制するためのアルゴリズムです。

以下で画像を交えながら説明します。

 

例えば、スティーブ・ジョブズの顔をR-CNNで検出しようと考えます。(余談ですが彼は私が最も尊敬する人物です。)

@何もしてない状態
Non-Maximum Suppression

良い笑顔です(笑

 

R-CNNでは以下の手順で検出を行います。

まず、Selective Searchを用いて候補領域を切り出します。

次に、ニューラルネットワークから特徴ベクトルを抽出します。

更に、サポートベクトルマシン(通称:SVM)でそれが何なのかを判別させます。

そして、結果的に検出された顔の領域が以下の場所だとします。

@検出結果
Non-Maximum Suppression

同じ顔なのに、3つも検出されてしまいましたね。これではダメですよね!上手くやって1つとして検出したいところです。

これを上手くできるのが、Non-Maximum Suppressionなのです!

(同じ顔がたくさん検出される理由は、Selective Searchに由来します。)

 

@Non-Maximum Suppressionを実行後
Non-Maximum Suppression

1つとして検出されましたね!

望んでいた結果が得られました!

アルゴリズムについて

Non-Maximum Suppressionを説明する前に、まずはIoU値について説明しようと思います。

IoUとは、Intersection over Unionの略です。

百聞は一見にしかず、という諺がある通り、画像を観ていただければ一発で理解してもらえるのかと思います。

@IoU値
IoU値

IoU値とは、画像の重なりの割合を表す値です。

この値が大きいほど画像が重なっている状態ということになります。

逆に、小さいほど重なっていない状態ということになります。例えば、IoU=0のときは全く重なっていない状態ということになります。

 

さて、本テーマであるNon-Maximum Suppressionの話に戻ります。。。

@R-CNNで検出された複数の領域
Non-Maximum Suppression

例えば、IoU値の閾値を0.3とします。

そして、右下の領域を基準とします。

この領域と、他の2枚の領域のそれぞれのIoU値は閾値よりも大きいのは明らかですよね?それは重なりが大きいことを意味します。

なので、他の2枚の領域は抑制(suppression)します。

すると、以下のようになるというわけです。

 

@Non-Maximum Suppressionを実行後
Non-Maximum Suppressionこれだけです!

逆にIoU値が閾値よりも低い領域は抑制せずに残しておくというわけです。

このアルゴリズムを使うと何が良いのか?

最後に、このアルゴリズムの何が良いのかを考えてみましょう。

Non-Maximum Suppressionを使わないとすると、どのようにして領域を絞れば良いでしょうか?

 

パッと考えて思いつくのは、以下の画像の青枠のように、重なっている全ての領域を取ってしまうことです。

@全ての領域を取る
Non-Maximum Suppression

(とりあえず、赤枠も残していますが、本番では消します。)

これならNon-Maximum Suprressionを使わなくても済むだろうと思ったあなた、甘いです!!w

これでは解決できない問題があるのです。

 

解決できない問題とは、以下のような場合です。

例えば、丁度よく2台の自動車が検出されたとします。

@自動車2台
Non-Maximum Suppression

上の自動車2台に上のやり方を適用するとどうなるでしょうか?

 

@失敗
Non-Maximum Suppression

あら!?2台が1台として検出されてしまいましたね。

そうです、これではダメなんです。上のやり方は2つ以上の同じ物体が近くにあると1つとして検出されてしまうのです。

やはり、Non-Maximum Suppressionが必要ということになります。

 

Non-Maximum Suppressionならどうなるのでしょうか?

@Non-Maximum Suppression
Non-Maximum SuppressionNon-Maximum Suppressionであれば、赤枠がそのまま決定領域となります。

何故なら、IoU値が閾値(例えば0.3)よりも明らかに小さいからです。そういう場合は、抑制されないのでしたね。

 

以上がNon-Maximum Suppressionです。

サンプルのソースコード

Non-Maximum SuppressionのサンプルコードはこちらのブログにPythonで書かれたものが紹介されていました。

ぜひ、参考にしてみてください!

 - 機械学習