Object detection
CouseraのDeepLearningのコースの学習メモ. CNNの第3週目. https://www.coursera.org/learn/convolutional-neural-networks/home/week/3
Object Localization
これまでは画像認識のタスクにチャレンジしてきた. 今週はlocalizationとdetectionのタスクにチャレンジする.
localizationは単数の物体を認識した上でその位置を検出する. Detectionは複数の物体を見つけてその位置を検出するといったことをする.
図1にイメージを示す.
ここで,bx,byは検知したい物体の中心座標を示し,bhとbwは物体の縦幅と横幅を示す(図2).
このタスクにおいて,教師のラベルは図3のように表すのが一般的である.
pcは物体が存在するかしないかを示す確率をさす.また,cnはそれぞれnクラスのフラグである. c1=歩行者,c2=車,c3=バイクだとすると,車が存在するときは図4のaのような教師データに,何も存在しないときはbのようなデータになる.
ここで?はどんな数値であっても気にしないのでどうでもいいよということを示す. つまり,物体がないときは,bx,byやcnなどはどんな値を取っていても無視することを意味している.
Landmark Detection
これまでは画像の中から特定の物体の位置を見つけていた. 表情認識や姿勢認識をするために,画像の中からあらかじめ定められた特徴点を見つけたいというタスクがある. 例えば,顔画像の中から,目尻と目頭を見つけたいといったようなタスクがある.
このような画像の中から特定の特徴点を見つけるタスクをランドマーク検出とよぶ.
図5にランドマーク検出のイメージを示す.
Object Detection
画像の中から複数の物体の位置を検出するタスクを考える.
例えば画像の中から車を検出したい場合,一つの方法として図6に示すようなネットワークを考える.
トレーニングセットとして認識対象(ここでは車)を切り出した画像を正解の教師データとして用意し,これを正しく判定できるようにネットワークを学習する.
そのネットワークを用いてSlidingWindowDetectionをすることで画像の中から車の位置を検出することができる(図7).
だが,この方法は計算コストが大きく,時間がかかるという問題を抱えている.
次の章ではこれを畳み込みによる実装に変換することで,計算量を大きく削減する.
Convolutional Implementation of Sliding Windows
前述の通り,SlidingWindowDetectionを効率化する.
そのためにまず,FC層を畳み込み層で表現する方法を学ぶ必要がある.
FC層を畳み込み層で表現するには
図8のようなFC層を持つネットワークを考える.
このFC層を畳み込み層で表現するには,図9のようにしてあげれば良い.
つまり入力と同じ大きさのフィルタを用いることで,全結合が表現できるわけである.
Sliding Windowを効率化する
SlidignWindowのサイズが14×14×3だとすると,学習する対象のネットワークは図10(学習するネットワーク)のように表せる.
これを,検知したい画像(16×16×3とする)にそのまま適用すると図10(検知するネットワーク)のように表せる.
ここで,最終的に得られた出力が,実はそれぞれのSlidingWindowを計算した結果になる(図11).
Bounding Box Predictions
SlidingWindowより精度の高い方法としてYOLOアルゴリズムというものがある.
まず,YOLOアルゴリズムでは,学習対象のデータをいくつかの格子に切り分ける. 切り分けた格子にそれぞれ,ラベルをつける.
検知対象がc1=歩行者,c2=車,c3=バイクだとして,格子の数を3×3とすると図12のように表せる.
ここで,格子にまたがって物体が存在するケースがありえるが,その際は,物体の中心点はどの格子にあるか?でラベルづけをする.
YOLOアルゴリズムでは図13のように,画像を入力にとって,上記のラベル(今回の例では3×3×8)を推定するネットワークの学習を行うわけである.
この方法は格子に1つの物体のみが存在するときに動作する.
Intersection Over Union
検知がうまくいっているか評価する方法について述べる.
検知がうまくいっているかどうかについてはIoU(Intersection over Union)という尺度を用いて評価する.
図14のように検知領域と正解領域があったとする.
この場合に,検知された領域と正解領域を足し合わせた広さをUnionと呼び,検知された領域と正解領域が重なっている広さをIntersectionとよぶこととする. IoUは図15のように表せる.
つまり,正しく検知された領域が検知領域と正解領域を合わせた広さに対してどの程度あるのか?という尺度である.
一般的には,この尺度が0.5以上であれば検知が成功したとして評価することが多い.
Non-max Supperession
物体検知の際に,1つの物体に対して複数の領域が得られることがよくある. その中から十分に正しそうなものを残して他のを除外してあげる必要がある.
そのアルゴリズムがNon-max Supperessionである.
前章で述べたラベルの定義から,ラベルは検知領域についての情報と物体が存在する確率を持っている. まず,この物体が存在する確率が閾値より小さいものは,誤検知であるとみなして削除する. 次に,全ての領域の中から物体が存在する確率が最も高いものを見つける. その選ばれた領域と閾値以上の割合で重なっている領域はこれを除外する(IoRで0.5以上のものは削除するなど). その状態で再度物体が存在する確率が最も高い領域を見つけ,重なっている領域を削除するという動作を繰り返す.
その結果,重なっているものがなくなった時点で操作は完了し,不要な領域は削除された状態が得られる.
Anchor Boxes
1つのセグメントに複数の物体がある場合には,これまで議論してきたアルゴリズムは動作しない.これを動作させるためにAnchorBoxesというアイディアを見ていこう.
AnchorBoxesは,AnchorBoxというものを用意しておき,教師データ作成の際に用いる. AnchorBoxが図16に示す2つだとする.
この時,画像をラベリングすると図17のようなイメージになる.
つまり,画像の中のラベルづけ対象がAnchorBox1の形に近い場合はラベルの上半分に,AnchorBox2の形に近い場合はラベルの下半分としてラベルづけがされるわけである.
図17の例では歩行者はAnchorBox1の形に近しいため,ラベルの上半分に現れるし,車はAnchorBox2の形に近しいため,ラベルの下半分に現れる.
これはAnchorBoxが2つの時の例だが,一般化するとラベルは図18のような形になる
YOLO Algorithm
YOLOアルゴリズムについてまとめる.
Training
学習データは複数の格子に分けられ,それぞれの格子についてラベルが作成される. ラベルはアンカーボックスの数と分類したいクラス数に依存し,図19のようになる.
これを正解データとして教師データの画像が入力され,正解データを出力するようにネットワークが学習される.
Prediction
認識対象の画像が学習されたネットワークにinputされる. 得られた結果に対してnon-max supressionを行うことで誤検知されたデータを取り除き,所望の物体検出結果を得ることができる.
non-max supression
まず,物体が存在する確率が閾値を下回っているものについては除外する. 次に,物体が存在する確率が最大の領域を選択し,その領域と閾値以上のIoUがある領域を削除する. その状態で次に物体が存在する確率が大きい領域を選択し,同様に閾値以上のIoUがある領域を削除する. これを繰り返し,重なっている領域がなくなった時点で所望の結果を得ることができる.