見出し画像

画像説明するアプリ「ViLT-GPT」でLLMと他のTransferモデルの組み合わせ方を学ぶ

面白そうなサンプルアプリをGitHubで見つけたので遊んでみました。


README.md の日本語訳

ViLT-GPTは、会話型AI ChatGPTに「見る」機能を与える革新的なアプリケーションです。OpenAIの言語モデル(LLM)とLangChainをVision-and-Languageモデルと統合することで、このアプリは画像の内容に基づいて質問に答えることができます。これで、画像と対話したり、質問をしたり、有益な回答を得たりすることができます。

とにかく試してみます

面白そう! とにかく動かしてみます。READMEに沿ってリポジトリをローカルにコピーしてライブラリをインストールしてから、.envにOPENAI_API_KEYを書き込んで、以下で一発起動します。

streamlit run app.py

どれどれ、試食してみます。

Describe this image

This image features a beautiful sunset. The sky is filled with vibrant hues of orange, pink, and purple as the sun begins to set below the horizon. The scene is serene and peaceful, with the sun casting a warm glow over the landscape. The image captures the tranquility and beauty of a sunset, creating a calming and picturesque view.

この画像は美しい夕焼けが特徴だ。太陽が水平線の下に沈み始め、空はオレンジ、ピンク、紫の鮮やかな色彩で満たされている。このシーンは穏やかで平和で、太陽が風景に暖かい光を投げかけている。この画像は、夕日の静けさと美しさをとらえ、落ち着きのある絵のような景色を作り出している。

なかなかいい感じですね。

ソースを覗いてみる

実装方法に興味が湧いたので、少しソースを眺めてみました。複雑なアルゴリズムなどを想像していたのですが、とても簡単なロジックで実現されていました。

  • アップロードした画像を、Hugging Faceで公開されている画像内容をテキストで返す、Vision-and-Language Transformer (ViLT)に入力する。https://huggingface.co/dandelin/vilt-b32-finetuned-vqa

  • ViLTから帰ってきたラベルをLangChainでChatOpenAIのgpt-3.5-tureboに投げる。以上おしまい。ザッツ、シンプル。

def process_query(image, query):
    model, processor = load_model()
    encoding = processor(image, query, return_tensors="pt")
    outputs = model(**encoding)
    logits = outputs.logits
    idx = logits.argmax(-1).item()
    chain = LLMChain(llm=llm, prompt=prompt)
    response = chain.run(question=query, elements=model.config.id2label[idx])
    return response
prompt = PromptTemplate(
    input_variables=["question", "elements"],
    template="""You are a helpful assistant that can answer question related to an image. You have the ability to see the image and answer questions about it. 
    I will give you a question and element about the image and you will answer the question.
        \n\n
        #Question: {question}
        #Elements: {elements}
        \n\n
        Your structured response:""",
    )

また、画像と同様に、実装方法がほぼ同じで、グラフの画像データをテキストに変換するモデル Deplot https://huggingface.co/google/deplot  を利用したグラフの内容をLLMで処理させる例も紹介されていました。グラフ画像のpngファイルを読み込むといい感じに数字を読み取ってグラフの性質を説明してくれました。

このグラフは、ある期間における乗客数を表している。X軸は1950年から1960年までの年数を表し、Y軸は乗客数を表す。グラフは、1950年から1958年まで乗客数が増加し、1960年にわずかに減少する傾向を示している。

まとめ・感想

  • 今まで自分はLLM単体での応用ばかりを考えていたのですが、テキストデータを入出力に使うことでLLMを中心にして、LLM以外のモデルも利用して様々な問題解決に利用できる大きな可能性を感じました。改めてLLMの汎用性に驚いています。

お読みいただき、ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?