ほろ酔い開発日誌

AI企業のエンジニアのブログです。機械学習、Web開発の技術的お話、ビジネスチックなお話、日常のお役立ち情報など雑多な内容でお送りします。

物体認識モデルYOLOv3を軽く凌駕するYOLOv4の紹介

f:id:seishin55:20200516183526j:plain

はじめに

先月、YOLOv4が公開されました。位置づけとしては、物体認識のポピュラーなモデルの1つであるYOLO系統の最新版となります。結果がすごいのはぱっと見分かりましたし、内容も既存の手法をサーベイ・実験頑張って、精度上げていったんだなあくらいのさら読みはしていましたが、もう少しちゃんと読んでおこうと思い、読んでみたので紹介します。

私自身は物体認識の研究者というわけではないですが、なんだかんだ物体認識周りの記事をいくつか書いているので興味のある方は以下もご参照下さい。

note.com

note.com

www.slideshare.net

さて、このYOLOv4ですが、元々のYOLOの作者であるJoseph Redmon氏は著者ではありません。Jeseph Redmon氏は研究の軍事利用やプライバシーへの懸念から研究を辞めてしまっています。YOLOv4の作者は元々YOLOv3の著者実装のあるdarknetをフォークして開発を進めていたAlexey Bochkovskiy氏がfirst authorになっています。

以下のレポジトリが著者実装です。YOLOv4の実装前からあるレポジトリでissue上でYOLOv4の提起が行われていたり、YOLOv4の実装レベルの議論が行われていたりと実用的なモデルである印象を受けます。

github.com

著者は元々darkenetのレポジトリを運用していることからエンジニアリング側の属性が強めの人かなという印象を持っていますが、論文もサーベイと実験がメインでややサーベイ論文的な雰囲気があります。内容としてはコンパクトにまとまっていて非常に参考になります。やや主観的な書き方があるのも好きです (YOLOv3ほどではないですが笑)。

パフォーマンス

結果をみると、YOLOv3を圧倒していることが分かります。筆者は結果を説明するときに、Pareto optimalityという言葉を使っていますが、速度重視で物体認識モデルを考えるのであれば、選択の筆頭候補ということになります。FPSが70~130程度あるので、十分な感じはしますが、マシンはV100の強めのマシンであることには注意が必要です。(もちろん、既存のモデルに対するパフォーマンスがよいことには変わりません。)

f:id:seishin55:20200516154948p:plain

以下、GitHubのレポジトリ上で議論されていることですが、実際にはマシンを変えるとリアルタイムではなくなる場合があります。特に、エッジ領域である、Jetson AGX XavierはFPSが割と小さく、TensorRTに変換及び量子化等の対応が必要で、issueでは議論されています。

f:id:seishin55:20200516130744p:plain

Best way to use YOLO on Jetson Xavier with max FPS · Issue #5386 · AlexeyAB/darknet · GitHub

以下コメントのように、頑張ってJetson AGX Xavier上で32FPS程度のようです。(もしかすると、もっと高速化された実装もあるかもしれません)

@Kmarconi @marcoslucianops You can use Yolov4 on tensorRT using tkDNN with 32 FPS(FP16) / 17 FPS(FP32) with batch=1 on AGX Xavier: #5354 (comment) With batch=4 FPS will be higher.

(from https://github.com/AlexeyAB/darknet/issues/5386#issuecomment-621169646)

先日には、Jetson Xavier NXも発表され、ハードの面から速度的に大幅に改善されると思われますが、アルゴリズムの面からも速度の改善は重要だと思います。

アルゴリズム

全体像

論文中には様々な選択肢が紹介された後に、実際にYOLOv4に採用した手法を説明しています。結果的に、YOLOv4が採用した手法は以下になります。(多い!) 大きく、モデルアーキテクチャ、学習上の工夫を表すBag of freebies、精度改善上の工夫を表すBag of specialsの3つに分かれます。(ただし、説明ではBag of freebiesとBag of specialsはまとめます。)Bag of specialsはもう少し正確に書くと、少ないコスト(推論時時間や計算リソースだと思われる)で大きな精度向上ができるもの、と説明されています。

  • ネットワークアーキテクチャ
    • Backbone: CSPDarknet53
    • Neck: SPP、PAN
    • Head: YOLOv3
  • 学習上の工夫 (Bag of freebies)と精度改善上の工夫 (Bag of specials)
    • 活性化関数
      • Mish acrivation
    • bboxのregression loss
      • CIoU-loss
      • DIoU-NMS
    • データオーグメンテーション
      • CutMix
      • Mosaic data augmentation
      • Self-Adversarial Training
    • 正則化
      • DropBlock regularization
    • 正規化
      • CmBN
    • その他
      • Optimal hyper parameters
      • Cosine annealing scheduler
      • Class label smoothing

ネットワークアーキテクチャ

物体認識のアーキテクチャは大きく2つに分かれます。それは、画像の特徴抽出の役割を持つbackboneとクラス分類やbbox(物体を囲む四角形)の位置を予測するheadです。

backboneは例えばResNetのような画像のクラス分類でよく使われるようなモデルが採用されることが一般的に思います。headの部分はいわいる大きく1-stageか2-stageかに分かれます。これは物体認識のモデルの世界では馴染み深い話ですが、物体認識では直接的に予測を行う1-stage系列 (有名なものだと、YOLOv3等のYOLO系列やSSD)と候補領域を出してから予測を行う2-stage系列(有名なものだと、R-CNN系列)があります。基本的に1-stageは速度重視、2-stageは精度重視の側面があります。最近では、1-stage系列の発展をよく見る気がします。

さらに、最近ではこのheadとbackboneの中に、neckと呼ばれるレイヤーが入ることがあります。これはbackboneから受けた特徴マップをよしなに操作して、よりよい特徴量を生み出します。以前記事を書いたM2Detもこのneckのアーキテクチャを提案した手法でしたし、精度的にSoTAといえるEfficientDetもこのneckをアップデートした手法だと思います。物体認識は小さい物体や大きい物体、単純な物体や複雑な物体など様々な物体を認識する必要があり、複数サイズの受容野を扱うことが有効に機能すると考えられます。

さて、YOLOv4を見ていきましょう。YOLOv4ではbackboneにCSPDarkenet53を採用しています。これはCSPNetで提案される機構をDarknet53 (YOLOv3で使われているbackbone)に導入したものだと思います。広くサーベイの説明があった割には特別な理由なかったので、気になったのですが、CSPNetのfirst authorがYOLOv4のsecond authorだったので、なるほど、という感じがしました。

CSPNetは精度をあまり落とさずに、計算コストを省略するための手法です。以下の図は、DenseNetにCSPNetの機構を導入したものですが、Dense Blockで処理する特徴マップを一部分だけにして処理しないものを後で結合するというResBlockっぽい機構を導入するようです。

f:id:seishin55:20200516163341p:plain

そして、neckとして、まずSPP (Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)というブロックを追加しています。SPPは以下のように複数サイズのwindowでプーリングして特徴量を作ります。このようにすることで、受容野を広げることができます。

f:id:seishin55:20200516163955p:plain

また、nectとしてもうひとつ、PAN(Path Aggregation Network for Instance Segmentation)という機構を導入しています。この辺りの選択理由は説明がないので、どのように決めたかは気になります。この部分をリッチにするだけで精度は上がりそうにも関わらず、割と軽めの機構を導入しているので、モデル全体として速度側でエッジを立たせたかったのかなという印象があります。

f:id:seishin55:20200516164450p:plain

ただし、採用にあたって以下のように層の合わせ方を変更したようです。

f:id:seishin55:20200516182155p:plain

最後に、HeadとしてはYOLOv3と同等のものを使っています。確かに、Headの部分は物体認識で重要なものではありますが、Head以外の要素が大きすぎて、YOLOとは??という気持ちにさえなってきます。見方によってはYOLOv3からほとんど変わったともいえそうだし、別の見方をすると何も変わっていないともいえそうです。とはいえ、YOLOv4はYOLOv3の延長線上にあることは確かで、そういう意味でYOLOv4であることは間違いないですね。

以上で、ネットワークの全体像の説明は終わりです。

学習上の工夫 (Bag of freebies)と精度改善上の工夫 (Bag of specials)

非常に多く使用されています。一つずつ見ていきましょう。

活性化関数

  • Mish activation

Mish(Mish: A Self Regularized Non-Monotonic Neural Activation Function)は比較的新しいReLU系列の活性化関数です。負の値を持つところでReLUとは異なります。

f:id:seishin55:20200516171559p:plain

PReLUやSELUは学習が難しいことから選択肢から外し、ReLU6も量子化ネットワーク用なので選択肢から外したと説明がありました。

これは他の採用手法でもいえることですが、基本的な採用スタンスは良さそうな既存手法をとりあえず使って、実験的に精度が上がったから採用したというスタンスになっていました。そのため、Mishを選択したのはよさそうだったからで、Mishよりもいい選択肢はありえると思います。論文中の実験も選択肢を絞った正当性を主張するというよりも、導入した手法がプラスに働いているということを主張するにとどまっています。

bboxのregression loss

  • CIoU-loss
  • DIoU-NMS

物体認識のモデルの損失関数は、bboxの位置を正解ラベルとのMSE誤差を取るのが一般的でした。しかし、そうするとbboxの各点を独立に最適化してしまうのでイマイチでした。そこで、IoUベースのロスが提案されているようです。UnitBox: An advanced object detection networkという論文でIoU lossが提案されているようで、2016年にarXivに上がっていますが、IoU lossが活躍しているのはあまり見ることはありませんでした。確かに、これまでのregression lossはなんか納得できないなあというロスだったので、IoU lossという考え方はしっくりきます。

今回採用しているCIoUは Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression [Zheng AAAI'20] で提案されているものです。また、同論文内で提案されているDIoU-NMSも採用しています。

データオーグメンテーション

  • CutMix
  • Mosaic data augmentation
  • Self-Adversarial Training

クラス分類のタスクを主として、複数のラベルの画像を混ぜ合わせるというオーグメンテーションが精度向上に寄与することが知られています。(不思議な気もするが、精度が上がると言われたらそんな気もするやつ)

ここでは、CutMix CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features [Yun ICCV'19]が使われています。

f:id:seishin55:20200516174936p:plain

また、YOLOv4独自にもオーグメンテーション手法を作っていて、CutMixのように2枚を組み合わせるのではなく、以下の画像のように4枚を組み合わせるということを行っています。このようにすることで、ミニバッチのサイズを大きくしなくても大丈夫になったということです。(Mosaic data augmentation)

f:id:seishin55:20200516175326p:plain

もう一つ独自のオーグメンテーション手法として、Self-Adversarial Trainingも提案されています。ただし、説明が以下の部分しかなくて、どのようにこのような着想に至ったかイマイチ分からないところはあります。

Self-Adversarial Training (SAT) also represents a new data augmentation technique that operates in 2 forward backward stages. In the 1st stage the neural network alters the original image instead of the network weights. In this way the neural network executes an adversarial attack on itself, altering the original image to create the deception that there is no desired object on the image. In the 2nd stage, the neural network is trained to detect an object on this modified image in the normal way.

やっていることとしては、物体がないという仮定でbackpropして、重みではなく画像の値を更新して、物体がない方向に更新された画像を作成。その画像で学習を行うということをやっているのだと思います。実際に作成された画像を見てみたいところではあります。

正則化

  • DropBlock regularization

正則化として、DropBlock: A regularization method for convolutional networks [Chiasi NeurIPS'18]が使われています。 詳細は以下のスライドに譲ります。

www.slideshare.net

正規化

  • CmBN

f:id:seishin55:20200516181129p:plain

Cross-Iteration Batch Normalization (CBN) (2020/02/13 on arXiv)をベースにして、改良を加えたCmBNを採用しています。修正に関する説明はほぼなかったので、CBNの論文を後ほど読んでみようと思います。

その他

  • Optimal hyper parameters: Genetic algorithmを使ってハイパーパラメータのチューニングをしたということです。
  • Cosine annealing scheduler: SGDR: Stochastic Gradient Descent with Warm Restarts [Loshchilov ICLR'17]を使ったということです。
  • Class label smoothing: robustさを高めるため、soft labelを使って学習を行ったということです。

以上で、学習上の工夫 (Bag of freebies)と精度改善上の工夫 (Bag of specials)の説明を終わります。厳密にいうと、細かいテクニックはここで説明したもの以外にも少しありますが、概ね網羅できたと思います。細かいablation studyの結果も論文に載っているので、気になる方は見てみて下さい。

おわりに

以上でYOLOv4の紹介を終わります。物体認識の分野はある程度成熟しきったようにも見えるのですが、実用面ではまだまだ改善の余地はありそうな気がしています。近年の、物体認識の単なる精度改善や単なる速度改善は、学術的には興味を持たれにくくなってきているような気もしますが、その中でも YOLOv4のように実用的で興味を引く研究も出ているので、こういう状況の中で、興味をそそる研究がまた出てくるのを楽しみに待ちたいと思います。また、関連研究をもう少し追って良さそうであればまた記事にしたいと思います。

参考

先日の輪読会でYOLOv4の発表があったので、こちらの資料もご参照下さい。

www.slideshare.net