YOLOとは
YOLOとは物体検出(画像内の物体の位置と種類を検出)の機械学習モデルで、2015年にJoseph Redmon氏が論文を発表しました。Joseph Redmon氏がv3で制作を引きましたが、現在でも積極的に開発が進められており、2021年10月現在v5まで出ております。ただしYOLOv4はYOLOv3にSPP(Spatial pyramid pooling)やPAN(Path Aggregation Network)といった技術が追加されたもので、YOLOv5に関しては論文が出ていないため、今さら感も否めませんが今回はYOLOv3を実装を解説していきたいと思います。
YOLOv3の構成
YOLOv3のモデル構造について説明していきます。ちなみに元の論文の条件から入力画像は416×416pxのRGB画像、検出対象のクラス数(b種類)は80として説明を進めていきます。
YOLOv3のめちゃくちゃざっくりとした構成は以下のような図になります。
畳み込み層や残差ブロックなどで画像の特徴を抽出していき、途中で分岐して最終的に3つの出力を得ます。今回の例でいうと416×416pxのRGB(3channel)画像をモデルにインプットすると[13×13×255]、[26×26×255]、[52×52×255]の3つのテンソル(3次元配列)が出力されます。この出力についてもう少し詳しく見ていきましょう。
図にあるように画像をgrid(格子状)に分割します。図では説明のために4×4のgridとしていますが、実際は先ほどの出力の13×13、26×26、52×52に対応していると考えてください。1つのcellには検出対象の物体が存在する確率、物体の中心座標(x, y)、物体の範囲を示すバウンディングボックスの幅と高さ、そしてその物体がそれぞれのクラスである確率を含んでいます。つまり今回の例でいうと85個の情報を持っていると考えられます。さらに各cellで3つ分の物体を検出するため合計で255個分の情報をが1つのセルに与えられていることになります。
ここまでの説明だと1枚の入力画像から(13×13×3 + 26×26×3 + 52×52×3) = 10647個の物体の検出結果が出てくることになります。そこで実際には閾値を設定して検出結果をふるいにかけます。具体的にはcellに含まれる情報の1つ「検出対象の物体が存在する確率」が閾値を超えている場合に検出結果を返してくるようになっています。
また実際出力で得られる情報がそのまま画像の検出結果として使えるかと言うとそうでもなく、変換が必要なのですがそれは実装時に説明します。
まとめ
ここまで読んでいただきありがとうございます。かなり簡単にですがYOLOv3のモデル構造、入力画像に対する出力の内容を確認しました。次回からは実際にコードを書いて理解を深めていきたいと思います。第二回はまだYOLOv3部分には入らず、モデルに入力する画像データの準備について解説しようと思います。使用するデータは論文でも用いられていたCOCO datasetでpytorchでdataset、dataloaderを作成していこうと思います。