宮塩のお勉強部屋

某大学でARまわりの研究をしている学生です。

【Coursera】Deep Learning Specialization - Course 4: Week3 Object Detection

今回はWeek3です。前回の記事はこちら。 smygw.hatenablog.com

Detection algorithm

Object Localization

  • Image classificationではラベルを出力するだけでよかったが、Object Localizationの問題ではさらに物体のBounding boxの位置( b_x, b_y, b_w, b_h)を出力する
  • 出力のデータ構造は y= (p_c; b_x; b_y; b_h; b_w; c_1; c_2; …)となる.ここで p_cは画像内に物体があるかどうかを、 c_i i番目のクラスのラベルを表す.
  • ロス関数は例えば次のように定まる.
    •  p_c = 1 の場合は (y_1-\hat{y_1})^2+ (y_2-\hat{y_2})^2+ (y_3-\hat{y_3})^2 + ... のように各要素の二乗和で表す.
    •  p_c = 0 の場合は2項目以降はdon't careな要素なので (y_1-\hat{y_1})^2で表す.
    • Softmaxを出力するためにラベルに関しては logをとってもよい.

Landmark Detection

  • Bounding boxをより一般化して複数の座標を出力したものをLandmarkと呼ぶ(たとえば顔のLandmarkを64点とすれば、ネットワークの出力のベクトルの要素数は129となる.)
  • 顔のLandmarkは目じりの座標や口のまわりの座標などが挙げられ、姿勢では肩や足の座標が挙げられる.ただし、データセット間でLandmarkの順序は統一する必要がある.
  • 例えば顔のLandmarkを使うと、笑っているかどうかを判定したりSnapshopみたいなARアプリに応用することが出来る.

Object Detection

  • Sliding windows detectionとは、一定の大きさにcroppingされたwindowを少しずつずらしながら物体認識を行い、windowの大きさを変えて繰り返す手法である.
  • ずらす間隔が小さい場合は計算コストが高くなり、逆に間隔が大きい場合はパフォーマンスが下がるデメリットがある.従来の物体認識は計算コストの少ないシンプルな分類器を使っていたため問題なかったが、ConvNetを使う上では実行速度が非常に遅くなってしまう.

Convolutional Implementation of Sliding Windows

  • ただ各要素を並べるのではなくConvolutionによる方法でFC層に変換することを考える.例えば、 5×5×25の入力層を 1×1×400のFC層に変換する場合は 5×5×25のフィルターを400個適用すればよい.そうなると当然、入力層のサイズが大きくなると最終的な出力層のサイズも大きくなる(これまでは 1×1×(クラス数)で固定されていた.)このときの出力層の各ピクセルが、Slidingしたときの各windowに対する出力結果に対応する.
  • ちなみに、こういった全てをConvolution層に置き換えたネットワークをFully Convolutional Networks (FCN)と呼ぶ.
  • 1回のCNNだけで全てのwindowについて効率的に計算できるようになったが、Bounding boxの位置や大きさが正確ではないという問題が残っている.

Bounding Box Predictions

  • Bounding boxの位置の問題を解決する方法としてYOLO (You Only Look Once)という手法がある.
  • 画像を複数のグリッド上のセルに分割し、各セルについてClassificationとLocalizationを同時に行う.そのため、トレーニングデータもセルごとにラベルやBounding boxを用意する必要がある.
    • このときBounding boxの中心位置に基づいてどのセルに所属するかを決定される.
    • 各セルは信頼度・Bounding boxの位置と大きさ・各クラスの確率を保持する.つまり、グリッドの大きさを3×3とすると出力サイズの大きさは3×3×8となる(ただし、1つのセルに対してBounding boxが最大1つであることを仮定している.)
    • 各セルに複数のBounding boxが割り当てられるケースは後で述べるが、実際にはグリッドは3×3ではなく19×19くらい細かいものなので同じセルに割り当てられる可能性は低くなる.
  • Bounding boxの座標や大きさは所属するセルの座標系で定義される.
    • セルの左上の座標を (0, 0)とし、右下の座標を (1, 1)で定義する.
    • 他のパラメタライズでもよいが、とりあえずこれでうまくいく.

Intersection Over Union

  • Intersection over Union (IoU)を計算することでBounding boxのLocalizationを評価することができる.
    •  IoU = (Bounding boxの共通面積) ÷ (Bounding boxの全体面積)で定義される
    •  IoU\geq 0.5の場合にOKとすることが多いが、閾値は特にこだわりはないので 0.6, 0.7でもよい(ただし 0.5より小さくするのは稀.)
  • IoUは一般的に二つの矩形領域の重なり具合を評価するための指標として使われる.

Non-max Suppression

  • 異なるセル間で同一の物体を検出するおそれがあるため、Non-max suppresionというアルゴリズムを用いてBounding boxの候補を絞る必要がある.
  • まず信頼度 p_cが一定値以下のBounding boxを取り除く.そして p_cが最も大きいBounding boxを選び、IoUの大きいものを取り除く.これを全てのBounding boxを調べるまで繰り返し、各クラスについて同様の処理を行う.

Anchor Boxes

  • 1つのセルで複数のオブジェクトを検出するために、事前に様々な大きさのAnchor boxを用意しておく.
    • 出力のデータ構造も (grid size) × (grid size) × (Anchor box1, Anchor box2, …)となる.
    • トレーニングデータを作る際も、オブジェクトのBounding boxに対して最も大きいIoUを持つAnchor boxを採用してベクトルに格納する.
  • 以下のケースではアルゴリズムは上手く機能しないが、稀である.
    • Anchor boxの数よりオブジェクトの数が多い場合
    • 似た形状のBounidng boxをもつオブジェクトが多く存在する場合
  • Anchor boxの形状は手動で選ぶ方法もあるが、k-means法を使って自動で選ぶ方法もある.

YOLO Algorithm

  • トレーニング時とテスト時に何をするかを整理しよう。
  • トレーニング時にやること
    • グリッドの大きさやAnchor boxの数や大きさを決めて出力形式を定める.
    • 各セルごとに以下の2点を考慮したうえで信頼度・Bounding boxの位置や大きさ・各クラスの確率のデータを作る.
      • オブジェクトの中心位置がどのセルに含まれているか?
      • オブジェクトの形状はどのAnchor boxに似ているか?
    • 学習する
  • テスト時にやること
    • 信頼度の低いBounding boxを取り除く.
    • Non-max suppressionによりIoUの高いBounding boxを取り除く.

(Optional) Region Proposals

  • Sliding windowsでは明らかに物体のない領域に対しても処理を行うのに対し、R-CNNではSemantic segmentationなどにより物体がありそうな候補領域(約2000個)を選び、物体検出を行う手法である.
  • R-CNNではラベルとより正確なBounding boxを出力するが、毎回CNNをかけるため計算コストが高いという欠点がある.
  • 高速化させるためにFast R-CNNFaster R-CNNが現れたが、YOLOに比べると遅い.
    • Fast R-CNNではConvolutional Implementation of Sliding Windowsでやったような実装を行って高速化を行った.
    • Faster R-CNNでは候補領域を抽出するステップをCNNで行った.
  • YOLOのように物体の分類と領域の特定を同時に学習することができるようになったのであまり使わないかもしれないが、他のアルゴリズムを理解するときの助けになるかもしれない.