YOLOv2(YOLO9000)

概要

  • YOLOに対して以下の改良を加えています。

    • batch normalizationの導入

    • 高解像化(224x224)

    • anchor boxの導入

    • パススルー層の追加(高解像特徴量の使用)

高解像度学習

  • v1では、224x224で事前学習していました。

  • v2では、448x448のImageNetのフル解像度で学習しています。

anchor box導入

  • YOLOでは、bounding boxの座標を直接求めていた。

  • YOLOv2ではその代わりにanchor boxを用い、anchor boxと正解のずれを学習する。

    • Faster R-CNNなどのRPNと同様に。

高解像向けの調整

  • backboneのネットワークからpoolingを一つ削除し、最終が奇数となるように416x416の入力に変更。

  • これにより、特徴量マップは13x13となる。

anchor boxの導入

  • anchor box毎にクラスとobjectnessを予測する。

    • objectnessはYOLOv1でいうところのconfidenceか?

  • objectness予測は、ground truthとanchor boxのIoUを予測する。

  • クラス予測は、objectがあると仮定した場合の条件付き確率となる。

  • anchor boxをk個とすると、最終出力を以下のチャンネル数となるように構成

anchor boxの決定方法

  • v1では手動で個数を選択していたが、今回はk-meansクラスタリングで個数を検討した。

  • またクラスタリングには距離指標として以下を用いた。

  • centroidは図心のことであるが、この式における意味は論文中に説明がない。

    • centroidはクラスタのことみたいだ。

    • 普通はユークリッド距離をk-meansの距離として使うが、1-IoUを使うところがポイントらしい。

    • クラスタ取るときのIoUとはなんぞや?

      • 中心をあわせてIoU計算するのかな。

      • chainer実装例によればその認識で合っていそう。

  • 結果として、モデルの複雑さと再現率のトレードオフとしてk=5を選択。

bounding boxの位置予測

  • Faster R-CNNのRPNでは、bounding boxの回帰式に制約がない。

  • そのため、どの特徴量マップの点におけるanchor boxでも入力画像の任意の場所に回帰させることができる。

  • これをYOLOv2で行うと学習が安定しないなどの問題があったため、制約をつけ、以下のtx, ty, tw, th, toを予測する式とした。

  • cx, cyはセルの左上座標で、そこからの相対位置としてbounding boxの中心座標bx,byを計算する。

  • sigmoidへの入力tx,tyを予測することで、0~1に限定し、セル内に収まるようにする。

  • また、pw,phはanchor boxの幅、高さであり、exp(tw), exp(th)とすることで、スケールを0から無限大にしてtw,thを推定する。

  • またobjectness推定のためにはsigmoidにtoを入力した値を使用する。

  • その際の正解は、Pr(objectness)とIoU(truth,pred)の掛け算を使用する。

    • PrとIoUの掛け算なので、合計の信頼度かな。

パススルー層の追加

  • また、最後から2番目の層をパススルー層として使い、細かい粒度の特徴を使用できるようにする。

  • より細かい物体検知のために高解像度特徴量を使う。

  • 最終層は13x13だが、この一つ前の26x26x512の特徴量マップを使う。

  • 4倍の位置情報をチャネル方向に変形することで、13x13x2048の特徴量に変換し、元の13x13の特徴量に連結する。

マルチスケール学習

  • YOLOv2は、convとpoolのみで構成されるため、様々なサイズの入力画像に対応できる。

  • モデルは32倍のダウンサンプルのため、32の倍数の{320, 352, ..., 608}からサイズを選択する。

評価

  • VOC2012とCOCOを使って評価。

アーキテクチャ

backbone

  • Darknet-19と呼ぶ独自実装。

  • 出力サイズは、imagenetをベースに記載されている。

  • トレーニングの際は224x224で最初トレーニングをし、448x448でパラメータを微調整する。

for Detection

  • object detection向けには以下の変更を実施する。

    • 最後のconvolution以降を削除。

    • conv3x3 1024-dを2層重ねる。

    • パススルー層とconcatする。

    • もう一度conv3x3を実施。

    • その後、必要なチャンネル数のconv1x1を実施。

  • VOCの場合、5つのanchor box分の5つの座標情報予測をし、5つのbox分の20クラスあるので、出力チャンネルは以下の通り。

    • 5x5 + 5x20 = 125-d

実装例

  • なつかしのchainer実装だと結構詳細にわかる。

    • https://github.com/leetenki/YOLOv2

    • dimension clusterはここ。

      • https://github.com/leetenki/YOLOv2/blob/master/dimension_cluster.py

YOLO9000

  • 大規模分類のために、階層的なオブジェクト判定を実施。

  • WordNet(有向グラフ)からWordTreeに変換してそれを使う。

参考

  • v2の解説。分かりやすい。特に座標軸については一番わかりやすいかも。

    • https://kikaben.com/yolov2/

  • v1~v3の分かりやすい解説

    • https://deepsquare.jp/2020/09/yolo/

  • v2のみについて。機械翻訳っぽい?

    • https://qiita.com/miyamotok0105/items/1aa653512dd4657401db

  • 実装例

    • https://github.com/AlexeyAB/darknet

  • 公式

    • https://pjreddie.com/darknet/yolov2/

  • v3の話

    • https://pystyle.info/pytorch-yolov3/

  • v2の解説としては結構詳しい。

    • https://qiita.com/exp/items/b485e90fc9a86131078c

Last updated