Object detection

CouseraのDeepLearningのコースの学習メモ. CNNの第3週目. https://www.coursera.org/learn/convolutional-neural-networks/home/week/3

Object Localization

これまでは画像認識のタスクにチャレンジしてきた. 今週はlocalizationとdetectionのタスクにチャレンジする.

localizationは単数の物体を認識した上でその位置を検出する. Detectionは複数の物体を見つけてその位置を検出するといったことをする.

図1にイメージを示す.

f:id:masamasah:20180917143557j:plain

ここで,bx,byは検知したい物体の中心座標を示し,bhとbwは物体の縦幅と横幅を示す(図2).

f:id:masamasah:20180917143608j:plain

このタスクにおいて,教師のラベルは図3のように表すのが一般的である.

f:id:masamasah:20180917143618j:plain

pcは物体が存在するかしないかを示す確率をさす.また,cnはそれぞれnクラスのフラグである. c1=歩行者,c2=車,c3=バイクだとすると,車が存在するときは図4のaのような教師データに,何も存在しないときはbのようなデータになる.

f:id:masamasah:20180917143629j:plain

ここで?はどんな数値であっても気にしないのでどうでもいいよということを示す. つまり,物体がないときは,bx,byやcnなどはどんな値を取っていても無視することを意味している.

Landmark Detection

これまでは画像の中から特定の物体の位置を見つけていた. 表情認識や姿勢認識をするために,画像の中からあらかじめ定められた特徴点を見つけたいというタスクがある. 例えば,顔画像の中から,目尻と目頭を見つけたいといったようなタスクがある.

このような画像の中から特定の特徴点を見つけるタスクをランドマーク検出とよぶ.

図5にランドマーク検出のイメージを示す.

f:id:masamasah:20180917143639j:plain

Object Detection

画像の中から複数の物体の位置を検出するタスクを考える.

例えば画像の中から車を検出したい場合,一つの方法として図6に示すようなネットワークを考える.

f:id:masamasah:20180917143650j:plain

レーニングセットとして認識対象(ここでは車)を切り出した画像を正解の教師データとして用意し,これを正しく判定できるようにネットワークを学習する.

そのネットワークを用いてSlidingWindowDetectionをすることで画像の中から車の位置を検出することができる(図7).

f:id:masamasah:20180917143701j:plain

だが,この方法は計算コストが大きく,時間がかかるという問題を抱えている.

次の章ではこれを畳み込みによる実装に変換することで,計算量を大きく削減する.

Convolutional Implementation of Sliding Windows

前述の通り,SlidingWindowDetectionを効率化する.

そのためにまず,FC層を畳み込み層で表現する方法を学ぶ必要がある.

FC層を畳み込み層で表現するには

図8のようなFC層を持つネットワークを考える.

f:id:masamasah:20180917143711j:plain

このFC層を畳み込み層で表現するには,図9のようにしてあげれば良い.

f:id:masamasah:20180917143723j:plain

つまり入力と同じ大きさのフィルタを用いることで,全結合が表現できるわけである.

Sliding Windowを効率化する

SlidignWindowのサイズが14×14×3だとすると,学習する対象のネットワークは図10(学習するネットワーク)のように表せる.

f:id:masamasah:20180917143731j:plain

これを,検知したい画像(16×16×3とする)にそのまま適用すると図10(検知するネットワーク)のように表せる.

ここで,最終的に得られた出力が,実はそれぞれのSlidingWindowを計算した結果になる(図11).

f:id:masamasah:20180917143743j:plain

Bounding Box Predictions

SlidingWindowより精度の高い方法としてYOLOアルゴリズムというものがある.

まず,YOLOアルゴリズムでは,学習対象のデータをいくつかの格子に切り分ける. 切り分けた格子にそれぞれ,ラベルをつける.

検知対象がc1=歩行者,c2=車,c3=バイクだとして,格子の数を3×3とすると図12のように表せる.

f:id:masamasah:20180917143859j:plain

ここで,格子にまたがって物体が存在するケースがありえるが,その際は,物体の中心点はどの格子にあるか?でラベルづけをする.

YOLOアルゴリズムでは図13のように,画像を入力にとって,上記のラベル(今回の例では3×3×8)を推定するネットワークの学習を行うわけである.

f:id:masamasah:20180917143909j:plain

この方法は格子に1つの物体のみが存在するときに動作する.

Intersection Over Union

検知がうまくいっているか評価する方法について述べる.

検知がうまくいっているかどうかについてはIoU(Intersection over Union)という尺度を用いて評価する.

図14のように検知領域と正解領域があったとする.

f:id:masamasah:20180917143918j:plain

この場合に,検知された領域と正解領域を足し合わせた広さをUnionと呼び,検知された領域と正解領域が重なっている広さをIntersectionとよぶこととする. IoUは図15のように表せる.

f:id:masamasah:20180917143928j:plain

つまり,正しく検知された領域が検知領域と正解領域を合わせた広さに対してどの程度あるのか?という尺度である.

一般的には,この尺度が0.5以上であれば検知が成功したとして評価することが多い.

Non-max Supperession

物体検知の際に,1つの物体に対して複数の領域が得られることがよくある. その中から十分に正しそうなものを残して他のを除外してあげる必要がある.

そのアルゴリズムがNon-max Supperessionである.

前章で述べたラベルの定義から,ラベルは検知領域についての情報と物体が存在する確率を持っている. まず,この物体が存在する確率が閾値より小さいものは,誤検知であるとみなして削除する. 次に,全ての領域の中から物体が存在する確率が最も高いものを見つける. その選ばれた領域と閾値以上の割合で重なっている領域はこれを除外する(IoRで0.5以上のものは削除するなど). その状態で再度物体が存在する確率が最も高い領域を見つけ,重なっている領域を削除するという動作を繰り返す.

その結果,重なっているものがなくなった時点で操作は完了し,不要な領域は削除された状態が得られる.

Anchor Boxes

1つのセグメントに複数の物体がある場合には,これまで議論してきたアルゴリズムは動作しない.これを動作させるためにAnchorBoxesというアイディアを見ていこう.

AnchorBoxesは,AnchorBoxというものを用意しておき,教師データ作成の際に用いる. AnchorBoxが図16に示す2つだとする.

f:id:masamasah:20180917143940j:plain

この時,画像をラベリングすると図17のようなイメージになる.

f:id:masamasah:20180917143950j:plain

つまり,画像の中のラベルづけ対象がAnchorBox1の形に近い場合はラベルの上半分に,AnchorBox2の形に近い場合はラベルの下半分としてラベルづけがされるわけである.

図17の例では歩行者はAnchorBox1の形に近しいため,ラベルの上半分に現れるし,車はAnchorBox2の形に近しいため,ラベルの下半分に現れる.

これはAnchorBoxが2つの時の例だが,一般化するとラベルは図18のような形になる

f:id:masamasah:20180917144002j:plain

YOLO Algorithm

YOLOアルゴリズムについてまとめる.

Training

学習データは複数の格子に分けられ,それぞれの格子についてラベルが作成される. ラベルはアンカーボックスの数と分類したいクラス数に依存し,図19のようになる.

f:id:masamasah:20180917144013j:plain

これを正解データとして教師データの画像が入力され,正解データを出力するようにネットワークが学習される.

Prediction

認識対象の画像が学習されたネットワークにinputされる. 得られた結果に対してnon-max supressionを行うことで誤検知されたデータを取り除き,所望の物体検出結果を得ることができる.

non-max supression

まず,物体が存在する確率が閾値を下回っているものについては除外する. 次に,物体が存在する確率が最大の領域を選択し,その領域と閾値以上のIoUがある領域を削除する. その状態で次に物体が存在する確率が大きい領域を選択し,同様に閾値以上のIoUがある領域を削除する. これを繰り返し,重なっている領域がなくなった時点で所望の結果を得ることができる.