Meta開発のセグメンテーションモデル Segment Anything Model(SAM) の解説
こんにちは!Fusic 機械学習チームの鷲崎です。機械学習モデルの開発から運用までなんでもしています。もし、機械学習で困っていることがあれば、気軽にお問い合わせください。
新しい画像セグメンテーションのモデルである、Segment Anything Model(SAM)がMeta社から発表されました(23/4)。
使ってみたところ、分割しすぎな気がしますが、胴体やサンドバックなどうまく分離できています。サンドバックなどデータにほとんど含まれてなさそうですが、すごいです。後ほど解説しますが、プロンプトエンジニアリング次第では、より精度がよくなるかもしれません。
アブストより、SAMの特徴としては、
- 1100万枚の画像とそれに付随した10億以上のマスクからなる世界最大のデータセットを構築し、訓練した
- プロンプトを用いて新しい画像分布やタスクにZeroshotで対応できるようにした
- 多くのタスクでZero-Shot性能がよく、教師あり学習の結果と同等以上である場合もある
とのことです。
個人的には、プロンプトエンジニアリング部分がおもしろいと思いました。例えば、物体検出結果のBBoxをプロンプトとして用いることで、インスタンスセグメンテーションを実行していたり、CLIPのテキスト、画像エンコーダをうまく使って、テキストプロンプトからマスクの生成をしていました。
本記事では、このSAMの論文である、Segment Anythingの解説を行います。
解説しませんが、コード(facebookresearch/segment-anything)です。
※以下、解説記事の画像は、論文より引用しています。
もし、間違いがありましたら、ご指摘のほどお願い致します。
概要
論文の一番上の画像が、まさに、SAMの概念を表しています。下図の(b)を見ると、画像に加えて、プロンプトを入力しています。そして、それぞれを情報をエンコーダで良い感じに解釈し、デコーダで混ぜ合わせることで、有効なセグメンテーションマスクを出力しています。このような設計により、(a)のように、様々なプロンプトに対して、セグメンテーションのタスクを追加学習なしで実行可能にしています。
また、ZeroShot性能を向上させるため、大量のデータによる訓練が必要であるため、下図(c)のように、訓練とアノテーションの繰り返しにより、10億を超えるマスクを含むSA-1Bデータセットを構築しています。Segment Anythingからデータセットをダウンロードできるはずです。
SAMについて
任意のセグメンテーション用のプロンプトを入力したら、有効なセグメンテーションマスクを返すことが、モデルの目標です。プロンプトとは、画像内の何をセグメンテーションするかを指定するもので、例えば、セグメンテーション対象を特定する空間情報やテキスト情報などがそれにあたります。出力マスクの要件として、プロンプトが曖昧で複数の物体を対象としている可能性がある場合、出力はこれらの物体の少なくとも1つのマスクである必要があります。例えば、シャツを指した前景点(プロンプト)はシャツまたはそれを着ている人のいずれかを示すと考えられます。
この要件を盛り込んだモデル SAMは、以下のような構造です。Prompt Encoderが、点やボックス、テキストなどスパースな入力を受け付ける部分と、密なマスク情報を受け付ける部分に分かれている点が面白いです。また、上記のように曖昧性の課題があるため、3つのマスク出力を行うように工夫しています。(3つあれば、殆どのケースに対応可能とのこと)
23のセグメンテーションデータセットに対して、下図(Figure 3)のように、1つの前景点(プロンプトとして前景部分に点を打つ)から高品質のマスクを生成した場合、手動注釈のGTをわずかに下回る程度とのことです。
プロンプトエンジニアリングでいろんなタスクを行う
Edge Deteection、Instant Segmentatino、Text to Maskなど、様々な下流タスクにおいて、プロンプトエンジニアリングを行うことで、よい性能を獲得しています。
各タスクを簡単に説明します。
Edge Detectionは、下図(Figure 10の一部)のようにエッジを検出するタスクで、16x16の格子状に並べた前景点に対してSAMでマスクを予測し、出力された768(16x16x3)個のマスクに対して、NMSによるフィルタリングやソーベルフィルタによるエッジ強調などを行いエッジ画像を作成しています。
これからも分かる通り、プロンプトの拡張と生成されたマスクの後処理をうまくやることで、様々なタスクに適応させることが可能になっています。
インスタンスセグメンテーションは、ViTDetなど物体検出モデルの出力であるBBoxをプロンプトとして入力することで実行可能です。
また、下図(Figure 12の一部)のようなテキストを用いたマスクの生成は、CLIPのテキストエンコーダの出力をテキストプロンプトとして入力することで、マスクを生成できます。CLIPの画像埋め込みは、テキスト埋め込みと一致するように学習されているため、学習中は、画像の埋め込みを使用し、推論時はテキスト埋め込みを使用するといった手法を用いてるそうです。
まとめ
SAMの性能が思っていた以上に良いので、セグメンテーションタスクを試す際に、とりあえずやってみる手法の候補に入ると思います。プロンプトエンジニアリングを工夫すると、ドメインにすら特化したものにできる可能性があり、期待感があります。これを、FineTuningとかできると、かなり面白いと思うので試してみたいです。
最後に宣伝になりますが、機械学習でビジネスの成長を加速するために、Fusicの機械学習チームがお手伝いしています。機械学習のPoCから運用まで、すべての場面でサポートした実績があります。もし、困っている方がいましたら、ぜひFusicにご相談ください。お問い合わせから気軽にご連絡いただけますが、TwitterのDMからでも大歓迎です!
Discussion
モデルに入力するプロンプト(座標やバウンディングボックス)はどのように得るのでしょうか?別の検出器で事前に推定したものを与える必要がありますか?