Multimodal Large Language Modelを画像認識タスクへの適用

はじめまして、CADDiの図面解析チームで機械学習エンジニアをしている藤田です。

CADDiでは、CADDi Drawerという図面データ活用クラウドサービスを提供しています。私の所属するチームでは、Drawer上にある図面画像から様々な情報を抽出する、機械学習モデルを作ることに取り組んでいます。その取り組みの1つとして、Multimodal Large Language Model (MLLM)というモデルを図面画像に適用し図面解析をするということを、PoCとして実施しています。今回、MLLMの取り組みについて紹介します。

Multimodal Large Language Modelとは?

昨今、Large Language Model (LLM) の研究・開発が急激に進んでいます。例えば、OpenAI社のGPT-4oが2024年3月、Google社のGemini 1.5 Proが2024年5月、Meta社のLLaMA 3.1が2024年7月にリリースされており、各社日進月歩で開発を進めています。

そのようなLLMですが、最近のモデルは、入力・出力にテキスト以外のものを指定することができるようになっています。上記であげた、GPT-4oをはじめ、Gemini 1.5などがそれにあたります。このように、入出力を複数モーダル(text、画像、音声、動画など)にすることができるLLMのことを、Multimodal Large Language Model (MLLM)と言います。

MLLMに、画像とテキストを入力すると、画像内容をテキストで出力してくれます。例えば、キャディのロゴ画像と「この画像は何を表していますか?」のテキストを入力します。

そうすると、

この画像は、CADDi(キャディ)のロゴです。CADDiは、日本の製造業向けにデジタル化や自動化を支援する企業で、製造業の調達プロセスを効率化するためのサービスを提供しています。ロゴには、3Dのキューブが描かれており、技術とデジタル化を象徴しています。

が出力されます。このようにMLLMでは、テキストだけでなく、画像、音声、動画を解析してくれるLLMです。

openなMLLMとclosedなMLLM

MLLMには、openなものとclosedなものがあります。それぞれの定義・特徴は以下の通りです。

openなMLLM closedなMLLM
ソースコードが公開されているか 公開(open) 非公開(closed)
利用方法 ユーザは計算リソースを準備しMLLMのソースコードを実行し利用 ユーザはWEB APIを呼び出しMLLMを利用
LLaVA GPT-4o、Gemini

2024年8月現在では、openなMLLMより、closedなMLLMの方が精度高い印象で、それもあって様々な企業・サービスで使われています。ただ、近い将来、openなMLLMも精度が上がってきて、今よりも使われてくると私は予想しています。そこで本ブログでは、openなMLLMを紹介します。


closedなMLLMに対する、openなMLLMのメリット

モデルのカスタム

closedなMLLMでは、対象データを簡易的に学習(例:fine-tuning等)することで、対象データでの精度を向上させることは可能です。しかしながら、簡易的な学習をしても適用対象のデータで思うような結果が出ないことはあります。そのような状況でも、ソースコードが公開されていないため、コード変更をする、学習をし直すなどをして精度改良することができないです。一方で、openなMLLMではソースコード・モデルファイルが公開されているため、精度改善することが可能です。

データをサービスプロバイダに渡す必要がない

企業によっては、機密情報をMLLMに入力して活用したい場合があると思います。しかしながら、GPT-4oなどのサービスプロバイダが提供するAPI(closedなMLLM)を利用するためには、サービスプロバイダが管理しているシステムに機密情報を送信する必要があります。サービスによっては、一時的にデータを保存するようなものもあります。

一方で、openなMLLMは、自社管理のサーバ上でMLLMの推論を実行できるため、機密情報を外部管理システムにに送る必要がないです。機密情報を取り扱うような会社ではopenなMLLMの利用が進むかもしれません。

openなMLLMを画像に適用

実際にopenなMLLMを画像に適用しましょう。transformersというライブラリを使うことで簡単にMLLMを使えます。以下がサンプルコードです。以下では、LLaVA1.5というモデルを使用しています。

from PIL import Image
import torch
from transformers import AutoProcessor, LlavaForConditionalGeneration

model_id = "llava-hf/llava-1.5-7b-hf"
model = LlavaForConditionalGeneration.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True,
).to(0)

processor = AutoProcessor.from_pretrained(model_id)

conversation = [
    {

      "role": "user",
      "content": [
          {"type": "text", "text": "ここにプロンプトを書く"},
          {"type": "image"},
        ],
    },
]
prompt = processor.apply_chat_template(conversation, add_generation_prompt=True)

raw_image = Image.open("image.png")
inputs = processor(images=raw_image, text=prompt, return_tensors='pt').to(0, torch.float16)

output = model.generate(**inputs, max_new_tokens=200, do_sample=False)
print(processor.decode(output[0][2:], skip_special_tokens=True))

利用手順は以下の通りです。

  • "ここにプロンプトを書く"という部分を任意のプロンプトに変更
  • 入力画像を準備して、"image.png"部分を準備した画像ファイルパスに変更

簡単にMLLMが使えることがわかると思います。

例として、以下のプロンプトと図面画像を使って、上記コードを実行してみました。

  • プロンプト:Is this a technical drawing?
  • 入力画像

出力結果は以下になります。

Yes, this is a technical drawing, which is a detailed representation of a piece of furniture, such as a cabinet or a chair.

画像が、図面かどうかの推論を正しくできていることがわかると思います。

画像認識AIの開発への影響

前節では、MLLMを使い、画像が図面かどうかの推論する例を示しました。例のようにMLLMが正しく推論できる、画像認識系のタスクは存在します。このようなタスクに、従来のモデルではなく、MLLMを適用するメリット・デメリットがどのような点なのかを整理しました。

メリット

  • MLLMは汎用性が高いため、追加での学習なしで正確に推論できるタスクがある。それにより、モデルの開発工程をスキップすることが可能。
  • 従来モデルと異なり、1つのMLLMで複数のタスクを対応することができる。それにより、コストメリットが得られる場合がある。

デメリット

  • openなMLLMを使う場合、計算リソースを使用するコストがそれなりにかかる。closedなMLLM場合でも利用料がそれなりに発生する。
  • 従来モデルよりもMLLMは、モデルサイズが大きいため、学習するのにたくさんの計算リソースが必要。さらには学習に時間がかかる。

上記にメリット・デメリットを記載しましたが、私が特に重要だと思うメリットは、MLLMで対応できるタスクにおいては、モデル開発の工程をスキップでき、それにより専門性がなくともモデル開発をすることができることです。下図にモデル開発の流れを示しました。従来のモデル開発だと、データ収集、アノテーション、学習の工程が必要なのですが、MLLMの場合、データ収集〜学習までの工数をスキップできます。

このように、専門性が必要な工程をスキップできるので、専門性がなくともモデル開発が可能となります。これにより、機械学習エンジニアでなくともモデル開発ができますし、さらには、エンドユーザがモデル開発をするということもあり得ると考えています。そうなれば、画像認識AIの開発方法は今と大きく変わることになるでしょう。

まとめ

ここまでMLLMの紹介や、MLLMを使ったモデル開発について説明してきました。もし「このタスクもMLLMで対応できるのか?」と思ったら、ぜひ上記のサンプルコードを使い試してみてください。その結果MLLMで対応できる場合、効率的にAIのモデル開発をできる可能性がありますので、積極的にMLLMを検討するのはいかがでしょうか。