はじめに
YOLO(You Only Look Once)は、コンピュータビジョンの分野で物体検出を行うために開発された深層学習モデルの一つである。YOLOは、物体検出の問題を回帰問題として定式化し、画像全体を一度に処理することで高速な物体検出を実現することができる。本稿では、YOLOの理論的な解説を行う。
1. 物体検出
物体検出は、画像中に含まれる物体の位置やクラスを特定することである。これは、コンピュータビジョンの分野で重要な課題の一つであり、自動運転やロボット、監視システムなどの応用分野において広く利用されている。
物体検出を行うには、画像中に含まれる物体の位置やクラスを同定する必要がある。これには以下の3つの手順が必要となる。
- 物体の位置の特定: 画像中に含まれる物体の位置を特定する。これには、物体の位置を表す矩形(バウンディングボックス)の座標を決定する必要がある。
- 物体のクラスの同定: 物体の位置が特定できたら、その物体が何であるかを判別する。つまり、物体のクラスを同定する必要がある。
- 物体のセグメンテーション: 物体の位置やクラスが特定されたら、その物体の領域を分割する。これは、物体の領域を正確に特定するために重要な作業である。
2. YOLOの概要
YOLOは、物体検出の問題を回帰問題として定式化し、画像全体を一度に処理することで高速な物体検出を実現することができる。また、YOLOはディープラーニングの一種であり、深層学習のアルゴリズムである畳み込みニューラルネットワーク(Convolutional Neural Network, CNN)を用いて物体検出を行う。画像を一度処理するだけでよいため、従来の物体検出手法に比べて高速な処理が可能であり、リアルタイムの物体検出に適している。
YOLOは画像全体を分割し、各領域に対して物体が存在する確率、バウンディングボックスの位置や大きさ、物体のクラスなどを同時に予測することによって物体検出を行う。これにより、高速な処理が可能になると同時に、物体の位置やクラスを高精度に検出することができる。
3. YOLOのアーキテクチャ
YOLOは、全体的にDarknetと呼ばれる深層学習フレームワークで実装されている。複数の畳み込み層とプーリング層からなるネットワークを持ち、最後の層には物体の位置やクラスを同定するための全結合層がある。
YOLOのアーキテクチャは、以下の通りである。
- 入力層: YOLOの入力は、画像をグリッド状に分割した領域である。画像は、任意のサイズで入力することができる。
- 畳み込み層: YOLOは、畳み込み層を複数重ねたネットワークである。畳み込み層は、画像の特徴を抽出するために用いられる。畳み込み層には、畳み込み演算を行うフィルターがあり、これにより、画像中のパターンや特徴を抽出することができる。
- プーリング層: YOLOは、プーリング層を用いて特徴マップのサイズを縮小する。プーリング層には、マックスプーリングなどの手法があり、これにより、画像中の特徴をローカルな領域にまとめることができる。
- 全結合層: YOLOの最後の層は、全結合層である。この層では、特徴マップから物体の位置やクラスを同定するための情報を抽出する。
4. YOLOの物体検出の仕組み
YOLOは、物体検出を行うために、画像全体をグリッド状に分割し、各領域に対して物体が存在する確率、バウンディングボックスの位置や大きさ、物体のクラスなどを同時に予測する。これにより、高速な処理が可能であり、従来の物体検出手法に比べて高い精度を実現できる。
YOLOの物体検出は、以下の手順で行われる。
-
グリッドの生成: 入力画像全体をグリッド状に分割する。グリッドの数は、YOLOのパラメータによって決定される。また、各セルには、物体が含まれているかどうかを予測するために必要な情報が含まれる。
-
物体の存在確率の予測: 各グリッドセルに対して、物体が存在する確率を予測する。物体が存在する場合は、確率が1に近づき、存在しない場合は0に近づく。物体の存在確率は、シグモイド関数を用いて予測される。
-
バウンディングボックスの予測: 各グリッドに対して、物体が存在する場合はその物体のバウンディングボックスの位置と大きさを予測する。また、バウンディングボックスの位置は、グリッドを基準とした相対座標で表される。バウンディングボックスの位置と大きさは、シグモイド関数を用いて予測される。
- 物体のクラスの予測: 各グリッドに対して、物体が存在する場合はその物体のクラスを予測する。事前に学習されたクラス分類器を用いて、物体のクラスを同定する。物体のクラスは、ソフトマックス関数を用いて予測される。
-
物体検出の閾値の適用: 物体検出の閾値を設定し、物体の存在確率が閾値以上のグリッドを物体が存在すると判定する。
-
バウンディングボックスの調整: 物体が存在するグリッドに対して、予測されたバウンディングボックスの位置と大きさを修正する。修正は、予測された相対座標をグリッドの絶対座標に変換することによって行われる。
-
重複するバウンディングボックスの削除: 物体の位置や大きさが重複するバウンディングボックスを削除する。このために、IoU(Intersection over Union)と呼ばれる指標を用いて、重複するバウンディングボックスを特定する。IoUは、2つのバウンディングボックスがどれだけ重なっているかを表す指標であり、以下の式で計算される。
IoU=(重複領域の面積)/(2つのバウンディングボックスの合計領域−重複領域の面積)
IoUが一定以上のバウンディングボックスは、重複するとみなされ、スコアが低い方のバウンディングボックスが削除される。IoUのしきい値は、YOLOのパラメータによって設定される。この処理によって、同じ物体が複数の境界ボックスで検出されることを防ぐ。
- 物体検出結果の出力: 残った物体の検出確率に基づいて、最終的な物体検出結果を出力する。
以上の手順により、YOLOは画像中の物体を検出する。
5. 損失関数
YOLOの学習は、損失関数の最小化によって行われる。そして、損失関数は以下の3つの項から構成される。
-
物体が存在しないグリッドに対する損失: 物体が存在しないグリッドについて、物体が存在する確率を予測することができるようになってしまう問題を防ぐために、物体が存在しないグリッドについて、物体が存在する確率の予測誤差を損失として計算する。
-
物体が存在するグリッドに対する損失: 物体が存在するグリッドについて、バウンディングボックスの位置と大きさ、物体のクラスの予測誤差を損失として計算する
-
クラス予測の損失: 物体が存在するグリッドについて、物体のクラスの予測誤差を損失として計算する。
これらの損失項を合計したものが、YOLOの損失関数となる。損失関数を最小化することで、YOLOは物体検出の精度を向上させることができる。
6. YOLOの進歩
YOLOは、その高速性や高い精度から、リアルタイム物体検出などのアプリケーションで広く使用されている。また、YOLOのアーキテクチャは、改良版のYOLOv2、YOLOv3、YOLOv4などが発表されており、より高い精度と高速性を実現している。YOLOv2では、バウンディングボックスの座標の予測精度が向上し、Batch NormalizationやResidual connectionsなどの技術が導入され、精度と学習速度が向上した。また、YOLOv3では、FPN(Feature Pyramid Network)やSPP(Spatial Pyramid Pooling)などのテクニックが導入され、より高い精度が実現された。
YOLOv4では、CSP(Cross-Stage Partial)ブロックやPAFP(Path Aggregation Pyramid Pooling)モジュールなどのテクニックが導入され、高い精度と高速性を実現している。CSPブロックは、高速で精度の高い物体検出を実現するために、通常の畳み込み層を置き換えるアーキテクチャであり、PAFPモジュールは、物体検出のための多様なスケールの特徴量を統合するアーキテクチャである。
YOLOの開発者であるJoseph Redmon氏は、YOLOの精度が他の最先端の物体検出手法よりも高いことを示し、CPU上での物体検出においても、他の手法よりも高速であることを示している。
最後に
YOLOのアーキテクチャは、物体検出の分野において画期的なものであり、その高速性と高い精度から、リアルタイム物体検出をはじめとする様々なアプリケーションに広く使用されている。今後も、YOLOのアーキテクチャが進化し、高速で高精度な物体検出を実現することが期待される。