前回試したOCR機能ではテキストの抽出は可能ですが、画像そのものを理解することはできません。
ChatGPTのようなクラウド型AIに画像を見せれば認識してくれますが、実は無料で動かせるローカルLLMでも画像認識(Vision Language:VL)は可能です。
本記事では、そのローカル環境での画像認識を自動化処理に組み込む方法を試します。
Ollamaで試すVL対応モデル
VLに対応したオープンなモデルは歴史のあるLLaVaが有名ですが、qwen系もパラメータ数や量子化のバリエーションが豊富で利用しやすいでしょう。
いつものOllamaでもVLが利用でき、対応しているモデルもかなり増えています。
OCRを謳うモデルもたくさん出ていますが、日本語は対応していないもの多いです。モデルの説明をよく読んで利用しましょう。
OllamaはUIへのドラッグ&ドロップに対応しています。以前はAPIやCLIのみの対応でしたが、ChatGPT等と同じ感覚で利用ができます。なお、VLに対応していないモデルの場合は警告が出ます。
下記はqwen3-vl:8bを利用した例です。当サイトのトップ画像について聞いてみました。推論の過程は中国語ですが、カタカナを認識し正しい日本語で応答が返ります。

回答例はこちら。ChatGPTなどと遜色ないレベルで、数秒で適切な回答が得られます。
日本語で質問すれば日本語で返ってきますが、モデルによっては英語や中国語の応答も混ざる場合があり、「日本語で答えて」と追記しても良いでしょう。
この画像は、日本語でタイトルが「パレイド」、副題が「虚空に紡がれた記憶の断片」と記された、ゲームやデジタルアート作品のプロモーション画像です。
詳細解説:
視覚的特徴
ブラックバックグラウンドに、**電子部品(チップ・回路・ボタンなど)で構成された「人間の頭部」**が描かれています。これは「記憶・意識」と「テクノロジー」の融合を象徴し、AIやデジタル空間のテーマを示唆しています。
タイトル「パレイド」はオレンジ色で目立つデザインで、副題「虚空に紡がれた記憶の断片」は「記憶がデータ化・破片化された虚空間で再構築される」というコンセプトを表現しています。
内容の推測
「パレイド」は、おそらくサイバーコンセプトゲームやデジタルアートプロジェクトのタイトルです(具体的な作品名は不明ですが、日本語で発表されたプロジェクトである可能性が高い)。
デザインから、記憶の復元・データの処理・AIとの関係性をテーマにしたストーリーが想定されます。
類似作品との関連
画像のテーマは、**《Remember 11》や《Pentiment》**など、記憶や虚空間を題材にしたゲームのアプローチと近いですが、本画像はより「デジタルデータ化された記憶」を強調したクリエイティブな表現をしています。
まとめ:
この画像は、「デジタル空間における記憶の断片」をテーマにしたゲームやデジタルアートプロジェクトのプロモーション用画像であり、技術と意識の境界を表現した、未来的で神秘的な雰囲気を持っています。
(※「パレイド」は特定の作品名であり、正確な情報は公式発表に依存しますが、この画像のコンセプトは上記の通りです。)
ちなみにVLに対応していないモデルが選ばれていると、OllamaのUIで警告が出ます。

APIでOllamaのVLを利用する
ここまでならChatGPT、Geminiなど一般的なクラウドベースのサービスでもできますが、Ollamaの場合はAPIで呼び出すことができ、自動化処理との相性が良いことが特徴です。
APIでOllamaに画像内容を質問するコードをChatGPTに生成してもらいました。
REST APIに画像を渡す際にbase64でエンコードする必要があります。
import base64
import json
from pathlib import Path
import requests
OLLAMA_HOST = "http://localhost:11434"
MODEL = "llama3.2-vision" # 例: "llava", "llama3.2-vision"
def image_to_b64(path: str | Path) -> str:
data = Path(path).read_bytes()
return base64.b64encode(data).decode("utf-8")
def describe_image(image_path: str | Path, prompt: str) -> str:
payload = {
"model": MODEL,
"prompt": prompt,
"images": [image_to_b64(image_path)],
"stream": False,
}
r = requests.post(f"{OLLAMA_HOST}/api/generate", json=payload, timeout=120)
r.raise_for_status()
return r.json()["response"]
def main():
# 適当な画像を使う例: 手元の画像ファイルを指定
# 例: IMG = "test.jpg"
IMG = "test.jpg"
prompt = "この画像に何が写っていますか?日本語で簡潔に説明して。"
text = describe_image(IMG, prompt)
print("=== result ===")
print(text)
if __name__ == "__main__":
main()
まとめ
今回はVision Language対応のLLMをローカルで実行する方法を試しました。
次回はVLやOCRを使った実践例を掘り上げたいと思います。





