🔖

Segment Anythingと派生技術の紹介①

2023/06/05に公開

はじめに

この記事では、Segment Anything及びその派生技術を、複数回にわたって解説していく記事になります。

Segment Anythingとは



4/6にMeta社が発表したセグメンテーションモデル。
1100万枚のライセンス画像とプライバシーを尊重した画像と、110 万枚の高品質セグメンテーションマスクデータ、10億以上のマスクアノーテションという過去最大のデータセットで訓練されたモデル。
特に、zero-shot-segmentationが可能な部分が特徴。
タスクに特化した教師あり学習と比較しても、同じような精度もしくはより優れた精度を出す事もできる。
ライセンスはApach2.0(データセットは公開されているが研究目的の利用に限るので注意)

公式サイト: https://segment-anything.com/

ペーパー: https://scontent.fhnd2-3.fna.fbcdn.net/v/t39.2365-6/10000000_900554171201033_1602411987825904100_n.pdf?_nc_cat=100&ccb=1-7&_nc_sid=3c67a6&_nc_ohc=iMsE1fjDr4EAX__pmB2&_nc_ht=scontent.fhnd2-3.fna&oh=00_AfDUvhlaLmAdep94YXoayUUE9T_A1lAcXDNM8Si7T5M-jA&oe=648220A7

ソースコード: https://github.com/facebookresearch/segment-anything

データセット: https://segment-anything.com/dataset/index.html

Segment Anythingの派生技術

4/6にSegment Anythingが発表されてから、6/5現在までに複数の派生研究・プロジェクトが生まれています。
派生研究は以下のGitHubページでペーパー・論文ともに整理されており、この記事では主にリンク先のGitHubページで紹介されている技術を取り上げて紹介します。

GitHub: https://github.com/Hedlen/awesome-segment-anything

関連研究

Derivative Papers

Analysis and Expansion of SAM (SAMの分析及び機能拡張研究)

Title Paper page Project page Code base Affiliation Description
CLIP_Surgery arXiv Demo Code HKUST This work about SAM based on CLIP's explainability to achieve text to mask without manual points.
Segment Anything Is Not Always Perfect arXiv - - Samsung This paper analyze and discuss the benefits and limitations of SAM.
PerSAM arXiv Project Page Code - Segment Anything with specific concepts
Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching arXiv - Code - One shot semantic segmentation by integrating an all-purpose feature extraction model and a class-agnostic segmentation model

Medical Image Segmentation (医療画像のセグメンテーションタスク)

Title Paper page Project page Code base Affiliation Description
Segment Anything Model (SAM) for Digital Pathology arXiv - - - SAM + Tumor segmentation/Tissue segmentation/Cell nuclei segmentation.
Segment Anything in Medical Images arXiv - Code - A step-by-step tutorial with a small dataset to help you quickly utilize SAM.
SAM Fails to Segment Anything? arXiv - Code - SAM-adapter: Adapting SAM in Underperformed Scenes: Camouflage, Shadow, Medical Image Segmentation, and More.
Segment Anything Model for Medical Image Analysis: an Experimental Study arXiv - - - Thorough experiments evaluating how SAM performs on 19 medical image datasets

Inpainting (画像修復)

Title Paper page Project page Code base Affiliation Description
Inpaint Anything arXiv - Code USTC & EIT SAM + Inpainting, which is able to remove the object smoothly.

Camouflaged Object Detection(カモフラージュされたオブジェクトの検出)

Title Paper page Project page Code base Affiliation Description
SAMCOD arXiv - Code - SAM + Camouflaged object detection (COD) task.

Low Level (超解像)

Title Paper page Project page Code base Affiliation Description
Segment Anything in Video Super-resolution arXiv - - - The first step to use SAM for low-level vision.

Robotic (ロボティクス領域への応用研究)

Title Paper page Project page Code base Affiliation Description
Instruct2Act arXiv - Code OpenGVLab A SAM application in the Robotic field.

Bioinformatics (生物情報領域への応用)

Title Paper page Project page Code base Affiliation Description
IAMSAM bioRxiv - Code Portrai Inc. A SAM application for the analysis of Spatial Transcriptomics

Segment Anythingの技術解説

ここから本題。
初回はSegment Anythingについて詳しく解説していきます。

データセットの作り方

この研究で使われているSA-1Bというデータセットは、3つのステップを経て作成されている。

Assisted-manual stage

事前学習フェーズ。一般的なセグメンテーションタスクに使われるデータセットでモデルを学習。ブラウザベースの対話型セグメンテーションツールを使って、アノテータが前景と背景を分けてマスクを生成する。この時、ブラシツールと消しゴムツールを使ってピクセル単位のチューニングが可能らしい。
オブジェクトのラベル付け手には意味的な制約は持たせず、アノテータは自由にラベル付けを行う。ただし、優先順位として目立つものからラベル付けを行い、30秒たったら次の画像に行くというワークフローを組んでいた。
画像エンコーダをViT-BからViT-Hに拡大して、学習を繰り返し6回行ったとのこと。

Tips1: ViTとは?

Vision Transformerの略称。Transformerのタスクをほぼそのまま画像分類に用いることができ、2020時点のSoTAモデルと同等/もしくはそれ以上の精度を1/15程度の計算量で実現したことで話題になった。
ハイフン以降のアルファベットはモデルのサイズを表しており、B(Base),L(Large), H(Huge)の3つがある。

Semi-automatic stage

マスクの多様性を高めることを目的に実施。あまり目立たない対象物を集中してアノテーションするために、信頼値の高いマスクを生成し画像に対する塗りつぶしを実施している。あのーテータは塗りつぶしされた画像を見て、アノテーションされていない物体があれば追加でアノテーションを行うというタスクを実施している。

マスクを自動で検出するために、アノテータが生成したマスク画像を「オブジェクト」というカテゴリでラベル付けし、バウンディングボックス検出器を訓練した。

Fully automatic stage

最終段階は完全に自動化してアノテーションを実施。
以下の二つの点でモデルを改良した結果、アノテーションの完全自動化を達成できたとのこと。

  • Fully automatic stageの開始時点で,前ステージの多様なマスクを含め,モデルを大幅に改善するのに十分な量のマスクを収集した点
  • Fully automatic stageまでに曖昧性を意識したモデルを開発し,曖昧なケースでも有効なマスクを予測できるようにした点

プロンプトセグメンテーション

Segment Anythingはいくつかのプロンプトに基づいてセグメンテーションを行っている。
具体的には、

  • 前景/背景(後景)のポイントのセット
  • 大まかなボックスやマスク
  • 自由形式のテキスト

公開されている実装では、上二つのプロンプト入力のみ公開されており、自由形式のテキスト入力は利用できないので注意
このようなプロンプトセグメンテーションを行うことを目的として学習を行ったため、Zero-Shot Text-to-Mask(タスク転移)が可能になっている。

Tips2: Zero-Shot Text-to-Maskとは?

学習の対象としていないタスクについて、追加の学習なしにモデルを用いること。
Segment Anythingでは、以下の5つのタスクについて汎化性能を検証している

  • single point to mask
  • edge detection
  • object proposal generation
  • instance segmentation
  • text to mask(object segmentatino from free-form text)

モデルの構成

Segment Anything Model(以下SAM)は以下の要素から構成されています。

  • Image Encodedr
    • Masked AutoEncoders(MAE)で事前学習されたViTを使用している。画像エンコーダーは画像一枚につき一回実行される。
  • Prompt encoder
    • Sparse(ポイント、BBox、テキスト)とDense(マスク)の二種類のプロンプトに対してImageEncoderでエンコードされた画像に対応した埋め込みが行われている。
    • 前景と背景を分けるポイント、BBoxによるプロンプトは位置エンコーディング(ViTのstemで行われるPositional Encoding表現を指してるかも?との事)をプロンプトの出井ごとに学習した埋め込みエンコーダで実施
    • テキストプロンプトはCLIPの埋め込みエンコーダで表現
  • Mask Decoder
    • 画像埋め込み、プロンプト埋め込み、および出力トークンを効率的にマスクにマッピングする層。Trasformerのデコーダブロックを改良したものを採用している。具体的には、プロンプトSelfAttensionとbidirectional cross attention(プロンプトから画像埋め込み、画像埋め込みからクロスアテンションとその逆方向)を使用し、すべてのEmbedding更新している。その後、画像埋め込みをアップサンプリングして、MLPが出力トークンを線形分類器にマッピングし、分類器は各マスクのforeground probabilityを計算する。

Segment Anythingの使い方

サンプルコード(notebook)の実施

前準備

  • リポジトリのClone
git clone git@github.com:facebookresearch/segment-anything.git
cd segment-anything; pip install -e .
  • サンプルコードを動かすために必要なライブラリをインストール
pip install opencv-python pycocotools matplotlib onnxruntime onnx
  • 事前学習済みモデルのダウンロード
    • 以下のモデルを用途に応じてDL(基本的にはvit-hを選んでおけば大丈夫)
    • DLしたモデルは、リポジトリをクローンしたディレクトリ、もしくはnotebooksフォルダ配下に配置
  • Notebookの実行
    • notebooksフォルダに移動すると、以下の3つのNobteookがある。基本的には上から順にセルを実行すれば動くはず
      • automatic_mask_generator_example.ipynb
      • onnx_model_example.ipynb
      • predictor_example.ipynb

ライブラリとして利用する場合

  • ライブラリのダウンロード
    pip install git+https://github.com/facebookresearch/segment-anything.git

公式で紹介されているサンプルコード

  • 与えられたプロンプトからマスクを出力する簡単なサンプル
from segment_anything import SamPredictor, sam_model_registry
sam = sam_model_registry["<model_type>"](checkpoint="<path/to/checkpoint>")
predictor = SamPredictor(sam)
predictor.set_image(<your_image>)
masks, _, _ = predictor.predict(<input_prompts>)
  • 画像全体のマスクを生成する簡単なサンプル
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry
sam = sam_model_registry["<model_type>"](checkpoint="<path/to/checkpoint>")
mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(<your_image>)

おわりに

今回の記事ではSegment Anythingの概説とその周辺技術の簡易的な紹介を行いました。
長くなってしまったので一旦ここで区切りとさせていただき、次回以降はこのSegment Anythingの派生技術についてより詳細な解説をできればと思います。

Discussion