ドローン×AI×物体検出~MosaicとMixupでできることとは?~

はじめに

こんにちは。Customer Analysis Divisionに所属している4年目データサイエンティストの山嵜です。4年目ともなり様々なプロジェクトを経験してきましたが、現在はドローン×AI×物体検出をテーマとしたプロジェクトを担当しております。こちらのチームでは、ドローンの空撮画像を対象として、特定物体を検出するシステムの実証実験・開発をおこなっております。

今回ご紹介させていただくのは、学習画像の水増し手法(Data Augmentation)として、いまやデファクトスタンダードになりつつある、MosaicとMixupという手法についてです。一方で、理論や実装方法については、世の中に有り余るほど記事化されているので、今回は物体検出AIとして超有名なYOLOXのOSSのコードを用いて、各パラメタを変化させたときにどのような画像が出力されるのかをご紹介させていただきます。

Mosaicとは?

Mosaicは、元々YOLOv4独自の学習画像の水増し手法として最初に使用されました。その仕組みは4枚の画像を合成して学習画像を生成するものです(*注1)。

(Mosaicの例。*注1より引用)

Mixupとは?

Mixupは、もともとH. Zhang らが2017年に発表した、2枚の画像を透過合成して学習画像を生成する学習画像の水増し手法のひとつです。このときラベルも混ぜ合わせる(例:ラベルが「0」の画像とラベルが「1」の画像を透過合成した学習画像に対して、ラベルを「0.5」とする)ことで、画像の中間を識別できるようになり、精度向上が見込まれます(*注2)。

(Mixupのイメージ。*注2より引用)

YOLOXの概要

YOLOXはYOLOv3を元にした、直接物体を検出するOne-Stageの物体検出モデルです。2021年にGe, Zhengらにより発表されました。YOLOXのアーキテクチャの主な特徴は4つ挙げられます(*注3)。

  1. Anchor-Free
    物体検出のアルゴリズムの一つ。物体検出では、事前に設定されたアンカーボックス(Anchor Box)を利用して、画像内の物体の位置とサイズを予測するアルゴリズムが存在します。一方で、アンカーフリーでは、アンカーボックスを必要せず、物体の境界ボックスの座標とクラスを直接予測します。利点としては、アンカーに関するパラメタ調整が不要かつ高速な処理が可能になります。
  2. Decoupled Head
    ネットワークの出力部分をボックス出力用・クラス分類用・IoU予測用の複数に分割するネットワークアーキテクチャの一つ。利点としては、学習と推論の効率が良くなります。
  3. SimOTA
    予測ボックス割り当てアルゴリズムの一つ。画像全体の情報をふまえ、どの予測ボックスをどの正解ボックスに割り当てるかを最適輸送問題に変換して解くアルゴリズムで、OTA(Optimal Transport Assignment)をシンプルにしたもの。利点としては精度を維持しながら高速な処理が可能になります(*注4)。
  4. MosaicとMixup
    前述した学習画像の水増し手法。YOLOXのアーキテクチャには両方とも標準で搭載されており、利点としてはモデルの汎化性能が向上します。

    またYOLOXはOSSとしてこちらで公開されており、商用利用も可能なので現在でも幅広く利用されております。より詳しい説明については世の中の数ある記事におまかせします。

    各パラメタと出力画像

    それでは、本題に入っていきます。上記のYOLOXのOSSの詳細な使い方については本家のTutorialをご覧いただき、今回はモデルのパラメタ設定を決めているファイルに着目します。具体的には、こちらのファイルです。実際にはこちらのファイルと同じ形式の設定ファイルを別途作成の上、そちらに上書きしたいパラメタの設定値を記載しモデルの学習時に読み込むことで、パラメタが決まる仕組みになっております。

    下記に設定ファイルのMosaicとMixupに関わる部分を抜粋いたします。

    <省略>
    class Exp(BaseExp):
        def __init__(self):
            <省略>
            # --------------- transform config ----------------- #
            # prob of applying mosaic aug
            self.mosaic_prob = 1.0
            # prob of applying mixup aug
            self.mixup_prob = 1.0
            # prob of applying hsv aug
            self.hsv_prob = 1.0
            # prob of applying flip aug
            self.flip_prob = 0.5
            # rotation angle range, for example, if set to 2, the true range is (-2, 2)
            self.degrees = 10.0
            # translate range, for example, if set to 0.1, the true range is (-0.1, 0.1)
            self.translate = 0.1
            self.mosaic_scale = (0.1, 2)
            # apply mixup aug or not
            self.enable_mixup = True
            self.mixup_scale = (0.5, 1.5)
            # shear angle range, for example, if set to 2, the true range is (-2, 2)
            self.shear = 2.0
            <省略>
    

    上記のパラメタのうち、Mosaicに関わる部分は下記5つになります。

    1. self.mosaic_prob
      Mosaicを適用する確率(0.0~1.0で指定、デフォルトは1.0)
    2. self.degrees
      Mosaic済み画像の最大回転角度(0.0~360.0で指定、デフォルトは10.0)
    3. self.translate
      Mosaic済み画像の最大平行移動割合(0.0~1.0で指定、デフォルトは0.1)
    4. self.mosaic_scale
      Mosaic済み画像の拡大・縮小(タプルで指定しその範囲内でスケール、デフォルトは(0.1, 2))
    5. self.shear
      Mosaic済み画像の最大シアー強度(せん断角)(0.0~360.0で指定、デフォルトは2.0)

    例えば上記のパラメタをそれぞれ、self.mosaic_prob=1.0self.degrees=10self.translate=0.1self.mosaic_scale=(0.4, 0.4)self.shear=5とすると下記のような画像が学習画像として生成されます(実際の適用値はパラメタの範囲内でランダムに決定、本来は中心座標もランダムに決定される(参考))。

    さらに、mixupに関わるパラメタは下記3つになります。

    1. self.mixup_prob
      Mixupを適用する確率(0.0~1.0で指定、デフォルトは1.0)
    2. self.enable_mixup
      Mixupを使うかどうかのフラグ(True/Falseで指定、デフォルトはTrue)
    3. self.mixup_scale
      入力画像(元画像側)の拡大・縮小(タプルで指定しその範囲内でスケール、デフォルトは(0.5, 1.5))

    また、YOLOXのOSSでは、2枚の画像の一方を元の画像、もう一方の画像をMosaicによって生成された画像として重ね合わせます。

    例えば上記パラメタをそれぞれself.mixup_prob=1.0self.enable_mixup=Trueself.mixup_scale=(0.4, 0.4)とすると、元画像とMosaic画像を合成した画像が学習画像として利用されます(実際の適用値はパラメタの範囲内でランダムに決定、また元の画像については50%の確率で左右反転される(参考))。

    MosaicとMixupの効果

    YOLOXの論文中には、MosaicとMixupを適用した際にどれほど精度が向上されたのかもまとめられており、Decoupled Headのみの場合(下記画像中 decoupled head)と比較して、COCOデータセットについてAPが2.4%向上した(下記画像中 strong augmentation)という報告があります。

    (精度向上の軌跡。*注3より引用)

    まとめ

    今回はYOLOXの特にMosaicやMixupのパラメタについて出力例を交えてご説明させていただきました。当初私がこのライブラリを使ってみたときには、パラメタの説明は記載されているものの、実際に学習画像として生成される画像のイメージがつかず、各値をどのように調整してよいのかわかりませんでした。

    今回出力例を交えて紹介させていただいたので、少しでもイメージがつき、こちらの記事がパラメタチューニングの参考になると嬉しいですね。

    最後まで読んでくださりありがとうございました

    参考文献

    *注1:参考: arXiv「YOLOv4: 物体検出の最適な速度と精度」

    *注2:参考:arXiv「混同: 経験的なリスク最小化を超えて」

    *注3:参考:arXiv「YOLOX: 2021 年に YOLO シリーズを超える」

    *注4:参考:arXiv「OTA: 物体検出のための最適なトランスポート割り当て」