Sosogu LLC. Blog

Sosogu LLC. のブログ https://sosogu.net

Deep Learningを使用した物体検出の方法

こんにちは伊藤です。
近年、人工知能が急速に注目を集めるようになってきましたが、
もともとは、Deep Learningが画像分類の問題を解く際に驚異的な精度を上げたことから始まっています。
画像分類とは、猫や犬の画像を見せてそれをコンピューターが自動で判断する類のものです。
これは、すでにコンピューターが人間の精度を凌駕して驚異的な成果を上げています。

しかし、実際には画像に写っているものを分類するだけではあまり実用的ではなく
IoTやマシンビジョンシステムの現場では、物体認識(画像に写っている物体の種類と位置を検出)する場合が多く発生します。
なぜなら、画像には他種類の物体が複数写っている場合が多いからです。
これは、監視カメラによる人物の特定や、自動運転の際に標識や歩行者を検出することを想像していただくとイメージしやすいかと思います。

そこで、今回は物体認識における3つの方法を紹介したいと思います。

1.Faster R-CNN
もともとはFast R-CNNという手法が先に発表されましたが、すぐ後に更に高速となったFaster R-CNNが発表されました。
このFast R-CNNのボトルネックとなっていた箇所は、Selective Searchでした。
(Selective Searchはピクセルレベルで類似する領域をグルーピングしていくことで候補領域を選出するルゴリズムです。
要は似たような特徴を持つ領域を結合していき、1つのオブジェクトとして抽出する訳です)
そこで、Faster R-CNNではRPN(Region Proposal Network)と呼ばれる非常に小さい畳み込みネットワークで
候補領域を検出する手法を発明しました。



アスペクト比の変化やオブジェクトのスケールに対応するために、Faster R-CNNはアンカーボックスという概念を導入しています。
元の論文では、それぞれの場所でスケール128×128,256×256および512×512の3種類のアンカーボックスを使用します。
同様に、1:1,2:1と1:2の3つのアスペクト比を使用します。
したがって、合計でRPNがバックグラウンドまたはフォアグラウンドである確率を予測する9個のボックスを有することになります。
残りのネットワークはFast-RCNNに似ています。
VOC-2007のようなデータセットでの精度はほほ同様でありながら、Faster-RCNNはFast-RCNNよりも約10倍高速です。
そのため、Faster-RCNNは最も正確な物体検出アルゴリズムの1つです。

2.YOLO (You only look once)
YOLOは、クラス確率とバウンディングボックスの座標を学習する単純な回帰問題です。
YOLOは各画像をS×Sのグリッドに分割し、各グリッドはN個の境界ボックスと信頼を予測します。
信頼度は、バウンディングボックスの精度と、バウンディングボックスが実際にオブジェクトを含むかどうか(クラスに関係なく)を反映します。
また、トレーニング中の各クラスの各ボックスの分類スコアを予測します。
両方のクラスを組み合わせて、各クラスが予測されるボックスに存在する確率を計算することができます。
したがって、合計SxSxNの非常に多くのボックスが予測されますが、これらのボックスのほとんどは信頼スコアが低く、例えばしきい値を30%と設定すると、
下の例に示すようにほとんどのものが削除されます。


3.SSD(Single Shot Detector)
SSDは、入力画像上で畳み込みネットワークを1回だけ実行し、特徴マップを計算します。
この特徴マップ上に小さな3×3サイズの畳み込みカーネルを実行して、境界ボックスと分類確率を予測します。
SSDはまた、Faster-RCNNに類似した様々なアスペクト比でアンカーボックスを使用し、ボックスを学習するのではなくオフセットを学習します。
スケールを処理するために、SSDは複数の畳み込みレイヤの後のバウンディングボックスを予測します。
各畳み込みレイヤーは異なるスケールで動作するので、さまざまなスケールのオブジェクトを検出することができます。
YOLO(v1)との比較下に示します。YOLOは畳み込みを行ったあとにボックスの推定をしているのに対して、
SSDは中間層でバウンディングボックスの予測を行っています。


 

以上、3つの検出方法を紹介しましたが、それぞれの方法を使用する状況を考えたいと思います。
スピードがあまり要求されず、最高の検出精度が求められる場合はFaster R-CNNを使用するのがいいでしょう。
また、それほど演算能力のないデバイス上(Raspberry Piなど)で実行する場合はYOLOのTinyモデルを使うことがおすすめです。
SSDはその中間と言ったところでしょうか。

次回からは実際に3つの方法を実践して行きたいと思います。
それでは、今回はこの辺で。
Stay tuned.