Computer Vision

Python, Computer Vision, AI, Transhumanism 関連

見た事ないものを言い当てるAI(CLIPを使った画像認識)

ふと思う。人間は、いくつかの特徴が提示されると、それらの言葉だけから写真に映っている対象を類推することができる。
これは、一度も見たことがない物体についても同様。特徴にマッチする情報を知っていれば、いくつかの特徴(単語)から、対象を推定できる場合がある。


例えば、写真に写っている物体を直接みなくても、「赤い」「丸い」「果物」ぐらいの情報で、林檎と答える事ができる。
また、バナナを一度も見た事なかったとしても、「バナナは、黄色くで、細長いのが特徴の果物」という情報があれば、バナナの画像を初めて見て、それはバナナかも。と判断できるかもしれない。

AIにおいて、画像からリンゴを判別する学習済みモデルを作ろうとしたら、林檎の画像を多数読み込ませ、その特徴から林檎を識別させるというものが主流。それに対し、今回のものは、「丸くて、赤くて、果物」というような、テキスト情報を用いて、画像の対象を推測するという、おそらくまだ一般には広く認知されていないアプローチだと思う。

もちろんこの情報だけでは、実際には、さくらんぼかもしれないし、ザクロかもしれないので、正解率は低いかもしれないが、まあともかく、ものは試しである。

note.com

画像に対しいくつかの単語を与えると類似度を数字で出してくれる、CLIPというAIがある。今回はそれとGPTを組み合わせてみるというアイデア

要は
分類を行うテスト画像1枚→CLIPでいくつかの選択肢に置き換えて分類→GPT4で推測
という流れです。

まずは、上記サイトを参考にGoogleColabでCLIPの実行環境を用意。


続いて、このCLIPで分析する画像を1枚用意。
用意した画像は、ネットで拾ったなんの変哲もない普通の犬の写真。


その分析結果から、その物体がなんのか推測し回答してもらうAIとしてChatGPT4を使用した。

ChatGPT4には、CLIPの説明をして、いくつかの選択肢から回答を得る事でそこから類推するようにとゴニョゴニョ伝えてあるが、そこの過程については割愛する。

さらにヒントとして、今回は写っているものが、動物であることはあらかじめ伝えている。

では早速。

色:["Red", "Green", "Blue", "Yellow", "Purple", "Orange", "Pink", "Brown", "Gray", "Light Blue", "Cream", "Gold", "Silver", "Indigo", "Lime", "Magenta", "Navy", "Aqua", "Teal", "Olive", "Maroon", "Coral", "Crimson", "Cherry Blossom"]
Label probs: [0.129 0.04123 0.007748 0.05905 0.04254 0.3792 0.003492 0.02074 0.00318 0.003777 0.06094 0.007866 0.01425 0.04822 0.006836 0.07947 0.01517 0.003082 0.002363 0.03934 0.00567 0.00165 0.013596 0.01163 ]

Orange
犬の写真から、CLIPを使い、まずは色で物体を分類。値が1に近いのが確率の高いものである。


サイズ:["small", "medium", "large"]
text = clip.tokenize(["small", "medium", "large"]).to(device)
Label probs: [0.643   0.299   0.05798]

small


生息地:["forest", "desert", "ocean", "mountain", "grassland", "urban", "river"]
Label probs: [0.1919 0.1426 0.03336 0.2141 0.1044 0.2141 0.09955]
生息地なんかきいて、なんかやくにたつのか?と思ったが

GPT-4:結果から、「mountain」(山)と「urban」(都市)が高い確率で選ばれました。この動物は山地と都市環境の両方に適応している可能性があります。次に、この動物の表面の質感について聞いてみましょう。以下の選択肢から、動物の表面の質感を教えてください

という事で、今回の結果としては、悪くない設問だったと言える。


表面の質感:["furry", "smooth", "scaly", "feathered"]
Label probs: [9.780e-01 1.657e-02 8.378e-04 4.391e-03]


動作または行動:["flying", "swimming", "running", "climbing", "resting"]

Label probs: [0.02704 0.0015745 0.953 0.01666 0.001455 ]

てな感じで最終的な回答は以下となった。

 

GPT-4:結果によると、この動物は「running」(走っている)行動を示しています。これでオレンジ色の小さな毛皮を持つ動物で、山地や都市環境に適応しており、走る行動をとることが明らかになりました。

これらの特徴を持つ動物として考えられるのは、例えば狐の一種や小型の野生犬類などが挙げられます。特にオレンジ色の毛皮を持つことが特徴的な狐は、都市部にも適応する能力を持ち、活発に走り回ることが知られています。

 

ということで、まあまあ当たりの範疇(はんちゅう)かなという結果となりました。

CLIP自体ゼロショット画像分類であり、知らない画像を分類できるというものなので、汎用的な画像認識AIを作るのにも、役だつであろうAIだという事がわかる。

既存の画像によるクラス分類は、多数の類似画像を学習させることで、類似度を算出する。例えばうなぎの画像と、犬の画像を学習させても、ウナギイヌ をクラス分類できるAIを作るには、ウナギイヌの該当写真を多数学習させなければいけないというのがDeep Learningベースの画像分類だと思う。

しかし、それがもっと抽象化された特徴の組み合わせて示す事ができれば、画像なしでテキストの情報だけで、答えを導く事が、できるかもしれない。

検出系のAIをやろうとして、とにかくめんどくさいのが、該当する画像を見つけたり、アノテーションしたり、調整したりという作業。

ある程度ツールを用意していやれば、半自動化できるのだろうが、言語という抽象的なものに置き換えてやる事で、一気に汎用性が高まるのは間違いないだろう。

この実験でもうひとつ重要なポイントは、runningというように、物体の形状やテクスチャだけでなく「走っている」という状態が登場した点だと思う。

今回のテストでは、すでに「動物」前提で試したので、歩いたり走ったりするのは、普通だったかもしれないが、色や形にとどまらない要素にアプローチしたのは、今後の物体の推測手法として、興味深い。