OllamaでローカルVLを試す|無料LLMで画像認識とAPI自動化の可能性

AI画像

前回試したOCR機能ではテキストの抽出は可能ですが、画像そのものを理解することはできません。

ChatGPTのようなクラウド型AIに画像を見せれば認識してくれますが、実は無料で動かせるローカルLLMでも画像認識(Vision Language:VL)は可能です。

本記事では、そのローカル環境での画像認識を自動化処理に組み込む方法を試します。

Ollamaで試すVL対応モデル

VLに対応したオープンなモデルは歴史のあるLLaVaが有名ですが、qwen系もパラメータ数や量子化のバリエーションが豊富で利用しやすいでしょう。

いつものOllamaでもVLが利用でき、対応しているモデルもかなり増えています。

OCRを謳うモデルもたくさん出ていますが、日本語は対応していないもの多いです。モデルの説明をよく読んで利用しましょう。

OllamaはUIへのドラッグ&ドロップに対応しています。以前はAPIやCLIのみの対応でしたが、ChatGPT等と同じ感覚で利用ができます。なお、VLに対応していないモデルの場合は警告が出ます。

下記はqwen3-vl:8bを利用した例です。当サイトのトップ画像について聞いてみました。推論の過程は中国語ですが、カタカナを認識し正しい日本語で応答が返ります。

Ollamaからqwen3-vl:8bでVLを試す例

回答例はこちら。ChatGPTなどと遜色ないレベルで、数秒で適切な回答が得られます。
日本語で質問すれば日本語で返ってきますが、モデルによっては英語や中国語の応答も混ざる場合があり、「日本語で答えて」と追記しても良いでしょう。

この画像は、日本語でタイトルが「パレイド」、副題が「虚空に紡がれた記憶の断片」と記された、ゲームやデジタルアート作品のプロモーション画像です。

詳細解説:
視覚的特徴

ブラックバックグラウンドに、**電子部品(チップ・回路・ボタンなど)で構成された「人間の頭部」**が描かれています。これは「記憶・意識」と「テクノロジー」の融合を象徴し、AIやデジタル空間のテーマを示唆しています。
タイトル「パレイド」はオレンジ色で目立つデザインで、副題「虚空に紡がれた記憶の断片」は「記憶がデータ化・破片化された虚空間で再構築される」というコンセプトを表現しています。
内容の推測

「パレイド」は、おそらくサイバーコンセプトゲームやデジタルアートプロジェクトのタイトルです(具体的な作品名は不明ですが、日本語で発表されたプロジェクトである可能性が高い)。
デザインから、記憶の復元・データの処理・AIとの関係性をテーマにしたストーリーが想定されます。
類似作品との関連

画像のテーマは、**《Remember 11》や《Pentiment》**など、記憶や虚空間を題材にしたゲームのアプローチと近いですが、本画像はより「デジタルデータ化された記憶」を強調したクリエイティブな表現をしています。
まとめ:
この画像は、「デジタル空間における記憶の断片」をテーマにしたゲームやデジタルアートプロジェクトのプロモーション用画像であり、技術と意識の境界を表現した、未来的で神秘的な雰囲気を持っています。
(※「パレイド」は特定の作品名であり、正確な情報は公式発表に依存しますが、この画像のコンセプトは上記の通りです。)

ちなみにVLに対応していないモデルが選ばれていると、OllamaのUIで警告が出ます。

VL非対応のモデルだと警告が出る

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を使った実践例を掘り上げたいと思います。

タイトルとURLをコピーしました