2024-02-22 機械学習勉強会

 

Mastering All YOLO Models from YOLOv1 to YOLO-NAS: Papers Explained (2024) Part2

概要

  • 2015年に登場したYOLOv1から最新のYOLO-NASまでの包括的なまとめ記事
  • 細かいところは別記事などを参考にしつつまとめています
  • 今回はYOLOv5から。前回の記事は以下に。
 

YOLOの歴史

簡単な年表

  • CVPR 2016で当時最先端のSingle-stage DetectorであるYOLOが発表された
  • CVPR 2017では、YOLOv1を更に高速かつ正確にしたYOLOv2が発表。
  • 2018年には、同じ著者がYOLOv2にネック構造を追加し、大きなbackboneを使うことでアーキテクチャを改善したYOLOv3をarXiVで公開した。
  • 2020年には、他の著者が多くの重要な変更を加えたYOLOv4を発表し、その2ヶ月後にはUltralyticsがオープンソースでYOLOv5を公開した (YOLOv5の論文は発表されなかった)。同年に、YOLOv4の作者は更なる改良を加えたScaled-YOLOv4を発表した。
  • 2021年にはYOLOR、YOLOXが発表された。
  • 2022年にはYOLOv4の作成者はv6を飛ばしてYOLOv7 公開しました。これは速度と精度の点で当時の最先端だった。しかし同年、Meituan Visionの研究者によってv7 よりも優れた YOLOv6が公開された。
  • 2023年1月には、UltralyticsがSemantic Segmentation機能も備えたYOLOv8をオープンソース化した。2023年5月にはDeci AIが、これまでの YOLO をすべて超えるアルゴリズム生成アーキテクチャである YOLO-NAS を考案した。

YOLOv5

論文公開はなし
  • DarkNetの代わりにPytorchで開発されている
  • どちらかというとライブラリ公開したよ的な側面が強い
 
  • YOLOv5では以下のようなアーキテクチャに変更
    • Backbone: CSPDarkNet53を微修正
    • Neck: Spatial Pyramid Pooling Fast(SPPF), PANet
    • Head: YOLOv3
  • 参考までにYOLOv4は次のようなアーキテクチャ (ほぼ同じ)
    • Backbone: CSPDarkNet53
    • Neck: Spatial Pyramid Pooling(SPP), Path Aggregation Network(PANet)
    • Head: YOLOv3
  • Spatial Pyramid Pooling Fast
    • 以下のように同じMaxPoolingを使うことでSPPを高速化する仕組み
  • CSPDarkNet53を微修正
    • コストを下げるためにCNNのstrideのwindow_sizeを大きくした。
  • AutoAnchor
    • BBoxが画像サイズなどの学習設定に不適合なものかを自動で調整する機能
    • K-MeansでBBoxの初期状態を作成するところまでは同じ
    • その後遺伝的アルゴリズムを用いて1000世代進化させる。
    • 基本的にはCIoU Lossを用いてアンカーの適合度を測り、進化させていく
    • 実装はこちら
  • Augmentation
    • Mosaic (YOLOv4で使われていたやつ)
    • Copy Paste
    • Random Affine
    • MixUp
    • HSV Augmentation
    • Random Horizontal Flip
    • その他にもAlbumentationからいくつか
  • YOLOv5でPytorchに移行されたので、訓練プロセスが大幅に簡素化された
    • このライブラリを使って大きい画像で訓練してみたところ1536サイズ + Test Time Augmentation (TTA)を使うことで55.8%のAP (MS COCO)を達成することができた。
      • YOLOv4だとAP 43.5%
    • Kagglerにも大人気だった
 

YOLO-R

  • YOLOv4派閥が出した2021年の論文
  • マルチタスク学習の重要性について探索し始めた
  • Detectionモデルの特徴をSegmentationモデルで直接使用できなかったりと、思ったより一般化された特徴を学習できていないことに気づいた。
  • YOLO-Rでは以下のような概念に基づいている。
    • 知識には形式知 (Explicit Knowledge)と暗黙知 (Implicit Knowledge)の二種類がある
      • 人間は実際に見る、聞く、触るなどの形式知からも学ぶが、過去の経験などの暗黙知も学ぶ
    • 論文では、観察に直接対応する知識を「形式知」と呼び、観察とは直接関係のない知識については、「暗黙知」と呼んでいる
    • 一般的にニューラルネットワークでは、浅い層で取得される特徴量は「形式知」で、深い層で取得される特徴量は「暗黙知」とされる
  • 上記のような概念をモデル化する
    • 暗黙知のモデル化
      • 暗黙知の事前知識:
      • 暗黙知ベクトル
        • Neural Network:
          • 事前知識に対して重みをかけることで、暗黙知とする
          • この時、各次元は別の次元にも依存していると想定する
        • Matrix Factorization:
          • 暗黙知の事前知識ベクトルを複数準備して行列分解を行う
  • YOLO-Rの場合は、 で初期化した上でYOLOのベクトルに対して加算やconcat、乗算などを行って実験を行った。(乗算の場合は)。このは同時に誤差逆伝播で学習される。
    • 以下の赤矢印の部分にを加えるイメージ
  • それ以外のパラメータをScaled YOLOv4に揃えた上で実験し、上記のFeature Alignment (FPNとか)やprediction refinement (Head)に暗黙表現を加算することがある程度有効であることを示した。
  • また、マルチタスク学習においても各タスクのbranchにを加えることで精度向上することを確かめた。
  • また、加算かconcat、乗算のどの手法が一番良いかを調べた結果、Feature Alignmentでは加算、prediction refinementでは乗算が良いことを示した。
  • また、暗黙知モデリングはMatrix Factorizationが一番良いらしい。
  • (と色々実験をしているが、全て±AP0.01%くらいの話なので、割と眉唾な気がしました完)

YOLOX

  • CVPR 2023のWADワークショップのコンペで優勝
  • マルチタスク方面ではなく、その時期に流行っていたアンカーフリー検出器 のアプローチをYOLOに組み込む方面での研究
  • YOLOv4やYOLOv5はアンカーベースの手法に過剰に適応しているとし、YOLOv3から徐々に工夫を追加していき、YOLOv5越えを達成
    • 一番でかいサイズだとAP 51.2%達成
    • YOLOv5にも画像サイズなど同じ条件でやったら勝ったらしい (元論文はAP 55.8%)
  • アーキテクチャ
    • Backbone: DarkNet53
    • Neck: Spatial Pyramid Pooling (SPP)
    • Head: Decoupled Head
  • Decoupled Head
    • 下の図のように求めたいものに応じてHeadを分けた方が収束速度も精度も大幅に向上する。
  • Strong Augmentation
    • MosaicとMixupを使うことでImageNetから事前学習せずとも高い性能を達成できるようになったらしい。
  • Anchor-Free
    • 上のDecoupled Headの図を見ればわかるが、アンカー数の次元が削除されている。
    • 要するに、各グリッドは一つのBBoxを出力することに注力しましょう、ということ。
  • Multi Positives
    • YOLOv3では正解ラベルの割り当ては、正解の中心位置に対応する1点のみをPositiveとみなしていた
    • ただそれだと著しく不均衡が発生してしまうので、3x3の部分をPositiveとみなすようにしている
  • SimOTA (結構重要)
    • 複数の正解ラベルの中心が同じグリッドに割り当てられる時、どの正解ラベルをどの出力に割り当てるか混乱が生じる。特にMulti Positiveをしていると複数の物体が割り当てられるBBoxが多い。
    • ここでは最適輸送 (Optimal Transport)問題として定式化し、それを簡略化したSimOTAを行っている。
    • 次のようなコストを考える。(: 正解ラベルのインデックス、: 予測BBoxのインデックス)
    • このをMulti positivesで定めた割り当てに含まれるコストが小さいtop kを選んでPositive、それ以外をNegativeとする。
    • このkも正解BBoxのサイズやオクルージョンの度合いによって調整される動的なものを用いている
  • NMS Free
    • NMSを取り除く手法が流行っていたのでやってみたが精度が下がったらしい

YOLOv7

  • YOLOv4の作者の続編。なので、基本的にはYOLOv4からのアーキテクチャ修正になっている。アンカーフリーではない。
  • タイトルからも分かるようにまたもや最新の手法たちを取り入れてみたら精度が上がったよという話
  • 基本アーキテクチャはE-ELAN
    • DenseNetやCSPDarknetなどのconcatベースの手法を進化させたもの
    • 図の中の 1x1, c, cはと読む
    • めちゃくちゃ複雑な構造だが、ELANを二つ並列に行い、最終的にAddするという構造らしい
    • 分岐させることで、一つ一つのチャンネルの畳み込み数を少なくして高速な処理を可能としている。
  • Model Scaling
    • 今回のようなconcatベースでYOLOX-S → YOLOX-M → YOLOX-Lのようなスケーリングを可能にする法則を提案
    • depthを変えるとwidthも変わるというような性質があるため、depthとwidthを複合的に上げていく手法。具体的にはdepthを1.5倍するのに対してwidthを1.25倍にするという倍率でスケールさせている模様
  • Re-Parameterization
    • 学習時と推論時で違うモデル構造を用いること
    • 下の図で言うと一番上の構造を単純化した一番下のような構造にする。
    • 具体的には
      • BatchNormlizationは、convのbiasとconv1x1の重みに置き換えが可能
      • conv1x1の重みは、paddingを行えば、conv3x3の重みにおきかえることが可能
      • よって、全てconv3x3の重みに置き換えることができるので、演算処理を大幅に減らすことができる
  • Auxiliary Loss
    • これ自体は新しくないが、層の途中の特徴マップにも最終的な出力と同じ形状を得るためのHeadを追加することで、Lossを発生させる
    • 補助的な使い方なので、0.25程係数をかけて学習させる
    • ラベルのAssignmentはOTAを用いている
 

YOLOv6

  • 今までのYOLOシリーズを作っていたチームとはまた別のMeituan Technical Teamが発表 (YOLOv7の後に)
  • アンカーフリーな手法
  • ややこしいけど、YOLOV6(v3)みたいな展開のされ方がされていて、YOLOv8に勝っていたりするらしい。
  • 一応当時のSoTA性能 (論文によって縦軸の性能違う。。?)
  • アーキテクチャとしてEfficientRepという新しいバックボーンを提案
    • Backbone: EfficientRep
    • Neck: Rep-PAN (ほぼYOLOv4やv5で使われたPANetで再パラメータする工夫をいくつか入れた)
    • Head: Efficient decoupled Head
  • EfficientRep
    • RepVGGblockで訓練 → Re-ParameterizationでRepConvに変換
      • RepVGGは他の論文で提案された手法
        • Re-ParameterizationができるからRepらしい
      • RepConvは名前ついてるけどただの3x3 CNNでRepVGGを再構成したもの
    • ただ、RepVGGblockだと計算コストが指数関数的に増加するらしく、計算負荷と精度のトレードオフを改善するために、一番右のCSPStack RepBlockを採用した。
  • Efficient Decoupled Head
    • YOLOv5で使われていたDecoupled Headに対して中間のCNNを1層に減らすことで計算効率をあげた
    • BBoxの回帰ではBBoxの4辺までの距離を予測している
  • Label Assignment
    • お馴染みのSimOTA。学習が遅くなるので、やめたいと言っている。
    • Task alignment learning
      • TOODという論文で提案された手法
      • 分類のLossとBBoxのLossを統一的に扱うための手法
      • 細かくは説明しないが、単純に分類を0,1で学習するのではなく、ズレたBBoxには分類損失を小さく、一致しているBBoxでは分類損失を大きくするようなを導入し、binary labelと置き換えたりしている。(本当はもうちょっと複雑)
  • 損失関数
    • 分類損失
      • Focal Lossが流行り
      • 最終的には色々試してVariFocal Lossを採用した
        • Focal Lossと違う点としては、正と負のサンプルを非対称に扱う部分
    • BBox損失
      • SIoU LossとGIoU Loss
        • GIoU Loss:2つの矩形を囲む最小の矩形を使用して、全く重なっていない時も離れれば離れるほどLossが大きくなるように設計
        • SIoU Loss:角度とBBox間の距離、形、IoUの4つを考慮したLoss
    • Probability損失
      • Distribution Focal Loss (DFL)
      • BBoxの回帰を連続なものではなく、離散化した確率分布として単純化したLoss
      • 普通のBBox回帰より17倍の出力を作るためオーバーヘッドを生じるが、YOLOv6-M/Lでは採用された
  • その他にも自己蒸留など工夫が多く、一通りコードを読むと勉強になりそう

YOLOv8

論文はなし
コード:
  • YOLOv5と同じチームによって開発された
  • 基本的にはYOLOv5と同じだが、CSPNetの代わりにC2fモジュールを使ったり若干調整
  • YOLOv5をベースにアンカーフリーのYOLOv8を設計した
  • Decoupled Headも導入
  • 損失関数はCIoU-LossとDFL
  • 元のモデルに最小限の変更を入れることで、Semantic Segmentation用のYOLOv8-segも公開。

YOLO-NAS

  • イスラエルの企業である Deci AIが投入した新たなYOLO
  • YOLOv8やYOLOv6(v3)を上回る精度
  • AutoNACという自社のNeural Architecture Searchを用いて作成した。
  • YOLO-NAS モデルは、最初に、365 カテゴリにわたる 200 万枚の画像を含む Object365 ベンチマークデータセットで事前訓練を行った。
  • さらに、COCO データセットからの 123,000 枚のラベルなし画像に対して擬似ラベルを使って事前訓練を行った。
  • QSP-BlockとQCIBlockというものが使われている。中ではRepVGGが使われていたりする。

まとめ

YOLO シリーズ全体はエンジニアリングの革新と画期的な進歩に満ちており、特定のシナリオで使用できる多数の最先端の手法を提供している。YOLO は主にエッジ デバイス向けに設計されているため、すべての YOLO モデルを確認することで、さまざまな CNNの最適化テクニックを学ぶことができる。
  • YOLOv1 が最初に導入されたとき、それは1-stage detectorモデルの先駆けで、革新的だった。これは、Region Proposal構造を組み込んでいないことで際立っており、画像全体を一度に分析し、グローバルとローカルの両方のコンテキストを効率的にキャプチャすることができる。
  • その後、YOLOv2 および YOLOv3 モデルには、Feature Pyramid Network(FPN)jの概念、マルチスケール トレーニング、アンカー ボックスなど、当時登場した技術が統合された。
  • YOLOv4 は、作者が YOLO にいくつかの画期的な変更をもたらした。CSPDarknet53-PANet-SPPとなった Darknet53 のアーキテクチャの変更が行われた。
  • YOLOv5 では、に最小限の変更が加えられ、YOLOv4 のテクニックのほとんどが含まれている。YOLOv5 の貢献は、その Pytorch 実装と、Ultralytics を使用してモデルをトレーニングする方法を提供したことである。
  • YOLO-R では、著者らは新しいアプローチを実験し、マルチタスク学習をサポートするモデルの進化に取り組んだ。
  • YOLO-X では、一転してアンカーフリー、Decoupled Head、Label Assignment、Strong Augmentationなど 、古い YOLOv3 モデルへの新たな進歩の統合に再び戻りました。
  • YOLOv7 と YOLOv6 では、作成者が様々なモデル アーキテクチャを実験しました。YOLOv7 は最初に YOLO にRe-parameterizationとModel Scalingの概念をもたらした。
  • YOLOv8は、YOLOv5に対してCSPLayer を C2f モジュールに置き換えたり、優れた損失関数を追加したりするなど、最小限の変更だけしか行っていない。そのパフォーマンスは当時最先端だったので、YOLOv7やv6のモデルは過剰設計かもしれない。
  • YOLO-NAS は、モデルをより高速かつ正確にする量子化ブロックを備えたNeutal Architecture Searchで構築されたモデルだった。

参考文献