Object Detectionについて

Python, ML08 January 2021

What's?

  • 普通のCNNは、画像がなんなのか?(=なんの画像なのか)を調べるタスク
  • Object Detectionはどこに、何が?を推論するタスク

どうやるか?

  • 真っ先に考えられるのは、様々なウインドウサイズ(グリッドの大きさ)でそれを動かして画像全体を動かしまわる。
  • めっちゃ効率悪い

以下、改善策を列挙する

R-CNN

  • 画像の中から「物体らしさ」を判別して、その部分を取得してくる
  • Selective Searchを使用する
    • 似ている色ごとに分けて取得していく
    • 機械学習に限った技法ではない
  • それでも時間がかかる。。

Fast R-CNN

  • 検出したものが「何か?」と「どこにあるか?」を同時に判別してる
    • マルチタスク
  • ROI Poolingによる高速化
    • 先に画像を切り出してから畳み込みするのではなく、先に畳み込んでから切り出す
    • R-CNNより20倍早い

Faster R-CNN

  • Fast R-CNNの開発者の同僚が作った
  • Fast R-CNNのさらに10倍早い
  • Selective Searchを廃止し、全てCNNで行う
  • アンカーボックスという、予めサイズを複数用意したグリッドを置きまくる
    • 結果、この方が早い

YOLO(You only Look Once)

  • 現在めちゃくちゃ使われてる
  • 画像認識案件ではまずこれ
  • 前述のR-CNN系と違い、切り出すという作業がない
    • 若干精度は落ちる
    • めちゃくちゃ早い
  • N✖️Nのグリッドに画像を分割しグリッドごとにsoftmaxでクラス分類する
  • バウンディボックスという単位でアンカーボックスのように画像に当てる
  • 最終的に多数のバウンディボックスの中から有用な物だけを引っこ抜く
    • それぞれ、クラス分類に対する自信度を保持してるので、それに従って消す(non-maximum suppression)
    • x, y, w, h, 自信度の5つの情報を持ってる
  • non-maximum suppression
    • IoUというどれだけ重なってるか?の情報を元に、一定範囲以上重なってる物は削除する
    • 機械学習に限らずの概念である

出力のサイズ

YOLOの出力サイズは以下で表される

  • 分割グリッド数 ✖️ バウンディボックスの情報(x, y, w, h, 自信度なので=5) ✖️ 1グリッド当たりのバウンディボックスの数 + 分類クラス数

仮に、分割グリッド数=7*7, 1グリッド当たりのバウンディボックスの数=2, 分類クラス数=10とすると以下の通り

$$ 7 \times 7 \times (5 \times 2 + 10) = 7 \times 7 \times 20$$

損失関数

  • バウンティボックスにおいて、物体があると判断したらなら信頼度を上げる
  • バウンティボックスにおいて、物体がないと判断したら信頼度を下げる
  • 上記2つは一般に同じことを示すが、YOLOではあえて二つとも損失計算に入れている
    • 画像認識においては、背景である(=物体がない)可能性の方が遥かに高いため
    • 物体があると判断した場合はその影響度を高く設定している

特徴

  • 偽陽性が少ない
    • R-CNNと違い、画像を切り出さないので背景に映った余計な色などを誤って物質として判定してしまうことが少ない
  • 密集した物に弱い
    • バウンディボックス1つにつき、物体1つとしか認識しないので密集した物質や生き物などの判定ができない

SSD

  • YOLOの後発。YOLOと違い、デフォルトでバウンティボックスを多数配置し、その位置調整に徹する
  • 密集して配置しているので、YOLOの弱点を回避できる
  • 現在、YOLOとSSDがアップデートをお互いにしつつ競い合ってる
  • VGG16を転移学習させて使っている
  • Hard negative mining
    • 負例と正例が3:1になるように調整している
    • 負例は背景(=物体でない部分)
    • 正例は物体

tags: Python, ML