この記事は京都大学人工知能研究会KaiRA Advent Calendar 2023 16日目の記事です。
今回は「CLIP as RNN: Segment Countless Visual Concepts without Training Endeavor」という論文について取り上げます。
以下に掲載する図表は全て上記論文からの引用です。
イントロ
今回のタスクはテキストをクエリとした画像のセグメンテーションです。論文のFigure 1を引用します。与えられたテキスト(キャラクター名や固有名詞を含む)に該当する画像領域を推定するタスクになります。この論文ではCLIP(画像とテキストの類似度を計算するモデル)を用いて、fine-tuningを一切することなくこのタスクに取り組み、結果としてstate-of-the-artを更新しています。
こうしたタスクに取り組んでいる既存研究では、「CLIP等をセグメンテーションのデータでfine-tuningする」か「image-textのペアデータで弱教師ありでfine-tuningする」かのいずれかのアプローチが取られてきました。前者はセグメンテーションは上手く行く一方、大量のデータ収集が難しいために対応できるテキストの範囲が狭まるという問題がありました。後者は逆に、広大な範囲のテキストに対応できますが、セグメンテーションの品質が悪くなるという問題がありました。特に画像中に存在しない物のテキストがクエリとして与えられた時に品質が落ちるらしいです。
そこで本論文では、fine-tuningをしていないCLIPをRNN-likeに用いることで、両方の問題の解決を図っています。テキスト範囲の問題については、fine-tuningをしないのでCLIP本来の広大な種類のテキストに対応できます。セグメンテーション品質の問題については、画像中に存在しないクエリをRNN-likeなパイプラインで除去していくことで解決しています。
手法
本手法のパイプラインは図中(a)のようにRNN-likeに表すことができます。ただし入力$x_t$は入力画像($t$に関係なく同じ画像)、隠れ状態$h_{t-1}$はテキストのクエリ列、出力$y_t$はセグメンテーションマスクに対応します。
図中(b)がより具体的な説明になります。隠れ状態テキストのクエリ列$h_{t-1}$は閾値処理$\sigma$によって一部の要素(画像中に存在しないようなクエリ)が除去されていきます。これを$h_t$が更新されなくなるまで繰り返し、最後の出力$y_T$に色々処理を加えて最終的なマスク予測とします。
図中(c)はマスク処理とクエリ列の更新を行うSegmenterの概要図になっています。Segmenterは主に2つの要素、Proposal GeneratorとMask Classifierから構成されます。
Proposal Generatorは$h_{t-1}$中の各クエリに対応する画像領域$y_t$を予測します。クエリの個数を$N_{t-1}$とすれば、$y_t$も$N_{t-1}$個のマスクを含むことになります。そしてこの処理は画像と各クエリの類似度をCLIPで求めた後、可視化手法の1つであるCAMを実行することで行われます(実際にはGrad-CAMやCLIP-ESという手法が使われています)。また、類似度予測の時には「背景」を意味するようなテキストクエリを追加し、関係ない領域は背景クエリに割り当てられるようにしています。
Mask ClassifierはProposal Generatorで予測された各クエリに対応するマスクを用いて、各クエリが画像中にどれだけ存在するかを計算します。このためにまず入力画像からVisual Promptsを生成します。Visual Promptsの例をFigure 4から引用します。各クエリに対応するマスクを用いて、該当領域を丸で囲んだり、非該当領域をぼかしたりグレースケールにしたりということを行います。そうして作成したVisual Promptsと各クエリとの類似度をCLIPで計算します。そしてその類似度が閾値以下であれば、そのクエリは画像中に存在しないと見なして除去します。直観的には該当領域以外を消去(図中右端)して類似度を見てやれば確実な気もしますが、単純な消去よりもVisual Promptsの方が良いということが既存研究で分かっているため、この方法を採用しています。
$h_t$が更新されなくなった後、最後の出力$y_T$に対してConditional Random Fieldを用いたマスク整形処理(論文)を行い、最終的なマスク出力とします。また、セグメンテーション手法の1つであるSAMによって推定されたマスクで置き換えることでマスク品質をさらに向上させることができるようです。(SAMは当然テキストとの対応は取れないため、あくまでマスクのみを代用します)
実験
設定
使用したデータセットはPascal VOC、Pascal Context、COCO objectの3種類です。
評価は平均IoUで行います。
結果
まず下段、提案手法同様fine-tuningをしない手法であるReCo、MaskCLIPと比較すると、どのデータセットでも圧倒的に提案手法の方が高評価です。次に上段、fine-tuningありの手法と比較しても提案手法が高評価であることもわかります。なお、Pascal Contextだとかなりギリギリの差になっていますが、これはPascal Contextに含まれる「other」や「stuff」のクラスに対応するデータがCLIPの事前学習時にあまり存在していなかったことが原因だと考察されています。また、中段のSAMを含む手法同士での比較を見ても、提案手法+後処理にSAM使用の結果はSAMCLIP(別のCLIPとSAMを組み合わせた手法)に勝っています。後処理にSAMを用いた方が良い結果になることがわかります。
また、その他CAMの手法、CLIPのViTサイズ、Visual Promptsの種類、各閾値、背景クエリの種類等がAblation studyで調べられていますが、ここでは割愛します。
感想
冒頭の図にもあるように、キャラクター名でセグメンテーションが綺麗にできるのはかなり面白いと思いました。また、クエリを画像に置き換えることもできるように思うので、例えば新しいポケモンが出たとしても新種のポケモンの画像を集めれば同様にセグメンテーションができるという感じで応用が効きそうです。