最近の画像セグメンテーション技術 2023.4.11
最近は画像のSegmentation技術が進化している。
画像における認識のタスクでは、
画像認識
< 物体検出
< Semantic Segmentation(セマンティックセグメンテーション)
< Instance Segmentation(インスタンスセグメンテーション)
< Panoptic Segmentation(パノプティックセグメンテーション)
となるが、最近は、SemanticからPanopticまでぶっ通して認識可能になっている。
さらに、クラスというくくりがなくなり、なんでもセグメンテーションできてしまうレベルになっている。
最近は in-context learning がトレンドだ。
In-context learning
コンテキスト内の情報をもとに予測を行う手法。
Painter の論文を見た感じは、ほぼほぼ One-shot, Few-shot と見て良いだろう。
自然言語の分野では、GPT-3をはじめとしたLLM(Large Language Model) で、Few-shotが盛んである。
Few-shotの代表的なものとして、Chain of Thought や prompt engineeringなどは有名だ。
最近の画像分野でもFew-shot性はトレンドになっている。
つまり、画像と正解のペアをお手本としてモデルに入力することで、それに沿った出力(セグメンテーションではピクセルレベルでの認識)を行う。
特に気になった技術を読んでみたら、けっこうレベルがやばい感じだったので、まとめた。
最近の論文
- CLIPSeg
- Painter
- SegGPT
- SAM (Segment Anything Model)
CLIPSeg
- CLIPをベースにして、Zero-shot, One-shotでのセグメンテーションが可能になった。
- Zero-shot ... 検出したい物体のテキストをプロンプトにする
- One-shot ... 検出したい物体の画像とセグメンテーション例のペアをプロンプトにする
- 後述のSegGPTやSAMに近い使い方になる
- UNet構造でクエリー画像をCLIP、プロンプトもCLIPのエンコーダーで特徴量に変換してくっつけている。
HuggingFaceのコード ですぐに動かせた
Painter
Images Speak in Images: A Generalist Painter for In-Context Visual Learning
- Pix2Pixの超進化版に見える所感
- in-contextとして、かなり多様なタスクを扱える(セマンティックセグメンテーション、インスタンスセグメンテーション、デプス推定、キーポイント検出、ノイズ除去、明るさ調整など)
- 出力を3チャンネルで固定し、各タスクを3チャンネルで表現を調整している。
- ex. デプス推定では深度の1チャンネルのセグメンテーションだが、3チャンネル全てを同じ出力にする
- ex. セマンティックセグメンテーションでは、各クラスを表すb基底の3つの数値で表現している。(これはまだクラス数を事前に設定する必要があるらしい)
- 学習はシンプルにMIM(Masked Image Modeling ... 画像をパッチ化していくつかはマスキングしてsmoothL1 Lossで学習する たしかMaskedAutoEncoderと同じだった気がす)
SegGPT
SegGPT: Segmenting Everything In Context
-
Painterをベースに、コンテキストのどんな物体でもセグメンテーションする技術
-
事前に予測するクラスを決める必要がないので、どんな物体でもコンテキストがあればOKということらしい
-
GPTとはいっているが、言語のGPTではなく、「Generalist PainTer」から文字っているので、LLMは関係がない
-
学習では、コンテキストが同じ画像を2枚選び、一方から適当な色をランダムにサンプリングしてランダムな色に塗り替える → これでContext pairができる。
- Painterと同じMIMで学習しているぽい
-
githubはあるがコードは公開されていない https://github.com/baaivision/Painter/tree/main/SegGPT
-
HuggingFaceのデモがあった promptを適当にマウスで塗ることでマスクとなり、送信することで、マスクしたものを同じ対象が白塗りされた。
Segment Anything Model
Segment Anything
-
in-contextが必要なく、セグメントしたい対象のオブジェクトのx,y座標を1点 or BoundingBox or セグメント or テキストをプロンプトにすれば、対象をなんでもセグメントしてくれる
- ただし、テキストはまだコード実装はされていないっぽい?(Githubのデモにはない感じだった)
- プロンプトが曖昧なこともあるので、SAMは3段階の曖昧さによるセグメンテーションを行う(全体、部分、さらに部分 のような感じ)
-
まず、画像をViT(VisionTransformer)で特徴量にエンベッドし、プロンプトは別でエンコーダーモデルを使い(点やボックスはPositional Encoding、テキストはCLIPのエンコーダー、マスクはconv層らしい)、DecoderでCross Attentionなどをする(ここらへんは最近のLatendDiffusionModelのようなText-to-Imageと同じらしい) 最後にMLP層に通すことでマスクの予測をしているらしい
-
学習データは11億あるらしい。これはSA-1Bと呼んでいる。
- データ作成は3段階あり、1 Assisted-manual stage(ユーザーがSAMと相互的にマスク作成する)、2 Semi-automatic stage(マスクを自動生成してユーザーに追加でマスキングさせる)、3 Fully automatic stage(モデルによる自動生成)で作成している
のコードを動かしたが、良い感じな気もする(x=150, y=75をプロンプトに指定)
Discussion