OllamaでマルチモーダルLLMを使う方法|LLaVA・Moondreamで画像をローカル解析する手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)ローカルLLM > OllamaでマルチモーダルLLMを使う方法|LLaVA・Moondreamで画像をローカル解析する手順
「社内の帳票やスクリーンショットをAIで解析したいが、クラウドサービスには送れない情報だ」
「OllamaでテキストLLMは動かせたが、画像を入力として使う方法が分からない」

そんな悩みを抱えるインフラエンジニアや情シス担当者は少なくない。OllamaはテキストLLMだけでなく、画像とテキストを同時に処理できるビジョンモデル(マルチモーダルLLM)にも対応している。LLaVAやMoondreamといったモデルを使えば、ネットワーク外に一切データを出さず、社内サーバーだけで画像解析を実現できる。
この記事では、Ubuntu Serverを前提に、OllamaへのLLaVAインストールから、REST API・Pythonを使った画像送信の実装、帳票やシステム画面の業務応用例まで順を追って解説する。

この記事のポイント

・`ollama pull llava:7b-instruct-q4_0`でインストールし、REST APIの`images`フィールドにbase64画像を渡すだけで動作する
・LLaVA 7B(Q4量子化)はVRAM約6GB、Moondreamは約2GBでCPU環境でも実用的な速度が出る
・`base64 -w 0`の`-w 0`オプションを省略すると改行が入りAPIのJSONエラーになるため必ず付けること
・社内機密の帳票・監視画面など、クラウドAIに送れない画像の解析用途に特に適している


OllamaでマルチモーダルLLMを使う方法|LLaVA・Moondreamで画像をローカル解析する手順

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

テキストLLMとビジョンモデルの違い|マルチモーダルLLMとは何か

テキスト専用LLMは文字列しか入力として受け付けない。画像を渡しても無視されるか、エラーになる。
一方でビジョンモデル(マルチモーダルLLM)は、テキストと画像を同時に受け取って処理できる。「この図に何が書いてあるか」「このスクリーンショットのエラーは何を示しているか」という問いに答えられる。

Ollamaでは、テキストモデルとビジョンモデルを同じコマンド・同じAPIインターフェースで扱える。追加の設定ファイル変更も、別サービスの起動も不要だ。すでにOllamaが稼働しているサーバーがあれば、対応モデルを追加pullするだけで今日から使い始められる。

業務での活用場面は想像より幅広い。帳票やPDFのスクリーンショットから数値を読み取る、機械やサーバーのエラー画面を撮影して原因を推測させる、監視ダッシュボードの異常状態をテキストで要約させる、操作マニュアルの素材として画面キャプチャを説明文に変換するといった用途が現場では挙がりやすい。

外部のAIサービスに送れない社内機密の画像を扱う場面こそ、ローカルLLMのビジョンモデルが最も力を発揮する。クラウドAI利用を制限している情シス部門でも、ネットワーク内に完結するならビジョンモデルの活用を認めやすい。

Ollamaでサポートされているビジョンモデルの種類とVRAM要件

2026年7月時点でOllamaが対応している主なビジョンモデルを整理する。
LLaVA 7B(llava:7b-instruct-q4_0):最も実績の多い選択肢。日本語の入出力にも対応している。Q4量子化でVRAM約6GB。レスポンス速度と精度のバランスが良い。
LLaVA 13B(llava:13b-instruct-q4_0):解析精度が高い分、VRAM約12GB以上が必要。GPU1枚に収まらない場合は実用が難しい。
Moondream(moondream:latest):1.8Bパラメータの超軽量モデル。VRAM約2GB以下で動作し、CPUのみの環境でも実用的な速度が出る。英語主体で日本語精度は低め。
llava-phi3(llava-phi3:latest):Phi-3をベースにしたビジョンモデル。英語精度が高く、VRAM約4GBで動作する。

選択の基準はシンプルだ。GPUがある環境ではLLaVA 7Bを第一候補にしてほしい。日本語対応・精度・VRAM要件のバランスが最も取れている。GPUがない、またはVRAMが4GB未満の環境ではMoondreamが現実的な選択になる。

モデルごとの性能特性やテキストモデルとの比較については、「ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント」も参考になる。ビジョンモデルを選ぶ際の前提知識として役立つはずだ。

LLaVAをOllamaでインストールする手順

1. モデルのpull

モデルのインストールはpullコマンド1行だ。LLaVA 7Bのダウンロードサイズは約4.7GBなので、ディスク空き容量と通信環境を事前に確認しておく。

# LLaVA 7B(Q4量子化)をインストール $ ollama pull llava:7b-instruct-q4_0 # CPU環境向けの軽量モデルをインストール $ ollama pull moondream # インストール済みモデルを確認 $ ollama list NAME ID SIZE MODIFIED llava:7b-instruct-q4_0 aef5a9b56f35 4.7 GB 2 minutes ago moondream:latest c0dffd43cc81 1.7 GB 5 minutes ago

インストールが完了すると`ollama list`に追加される。IDとSIZEが表示されていれば成功だ。`ollama pull`はダウンロードの進捗をリアルタイムで表示するため、完了まで待つだけでよい。

2. インタラクティブモードで動作確認

インタラクティブシェルで画像ファイルのパスとプロンプトを渡し、動作を確認する。

# インタラクティブモードを起動 $ ollama run llava:7b-instruct-q4_0 # プロンプトに画像の絶対パスとテキストを入れる(スペースで区切る) >>> /tmp/test.png この画像を日本語で説明してください # 出力例 画像にはLinuxのターミナル画面が表示されています。 nginxのプロセス一覧を確認するコマンドが実行されており、 master processとworker processが複数稼働中であることが確認できます。 >>> /bye

画像パスは相対パスより絶対パスのほうが認識率が上がる。インタラクティブシェルでは`/bye`でセッションを終了する。

3. メモリ使用状況の確認

起動後に`ollama ps`でモデルのVRAM使用状況を確認できる。

$ ollama ps NAME ID SIZE PROCESSOR UNTIL llava:7b-instruct-q4_0 aef5a9b56f35 7.1 GB 100% GPU 4 minutes from now

`PROCESSOR`列に`GPU`が表示されていればGPU推論が有効だ。`CPU`表示の場合は推論速度が大幅に低下する。VRAMの空き容量とモデルサイズを照合して、GPUに収まるモデルを選ぶ必要がある。

OllamaのインストールやGPU設定の前提手順は、「Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド」で詳しく解説している。本記事ではOllamaインストール済みの状態を前提として進める。

REST APIで画像を送信してローカル解析する方法

OllamaのREST APIはテキストLLMと同じ`/api/generate`エンドポイントを使う。ビジョンモデル向けの追加フィールドは`images`だけだ。画像をbase64エンコードして配列で渡す。

1. curlで画像を送信する

# 画像をbase64エンコード(-w 0 は改行なし・必須) $ IMAGE_B64=$(base64 -w 0 /tmp/dashboard.png) # APIリクエストを送信 $ curl -s http://localhost:11434/api/generate \ -H "Content-Type: application/json" \ -d "{ \"model\": \"llava:7b-instruct-q4_0\", \"prompt\": \"この画像の内容を日本語で説明してください\", \"images\": [\"${IMAGE_B64}\"], \"stream\": false }" | jq -r .response # 出力例 画像にはサーバー監視ダッシュボードが表示されています。 CPU使用率は78%と高負荷状態で、メモリ使用量は12.4GB/16GBです。 ディスクI/Oのグラフに急激な上昇が見られ、注意が必要な状態です。

`-w 0`オプションでbase64の改行を除去する点が重要だ。Linuxのbase64コマンドはデフォルトで76文字ごとに改行を挿入する。この改行がJSON文字列内に残るとAPIがパースエラーを返すため、`-w 0`は必ず付けること。

2. 複数画像を同時に渡す方法

`images`配列には複数の画像を渡せる。変化前後のスクリーンショットを比較させる用途などで活用できる。

$ IMAGE1_B64=$(base64 -w 0 /tmp/before.png) $ IMAGE2_B64=$(base64 -w 0 /tmp/after.png) $ curl -s http://localhost:11434/api/generate \ -H "Content-Type: application/json" \ -d "{ \"model\": \"llava:7b-instruct-q4_0\", \"prompt\": \"2枚の画像の変化点を日本語で説明してください\", \"images\": [\"${IMAGE1_B64}\", \"${IMAGE2_B64}\"], \"stream\": false }" | jq -r .response # 出力例 1枚目と2枚目を比較すると、CPU使用率グラフに変化があります。 1枚目では安定した低負荷状態でしたが、2枚目では特定の時間帯に スパイクが発生しており、バッチ処理が実行された可能性があります。

Pythonスクリプトで画像解析を自動化する方法

1. ollama Pythonライブラリを使った基本実装

OllamaのPythonライブラリを使うと、base64エンコードを自前で書かずに済む。ファイルパスを直接渡せるためコードがシンプルになる。

# Pythonライブラリのインストール $ pip3 install ollama

# analyze_image.py import ollama response = ollama.generate( model="llava:7b-instruct-q4_0", prompt="この画像の内容を日本語で詳しく説明してください", images=["/tmp/test.png"] ) print(response["response"])

$ python3 analyze_image.py 画像にはnginxのアクセスログが表示されています。 IPアドレスはマスク処理されており、タイムスタンプ・HTTPメソッド・ レスポンスコードが確認できます。複数の500エラーが記録されています。

2. ディレクトリ内の画像を一括解析するスクリプト

複数の画像を連続して解析したい場合は、ディレクトリを指定して一括処理できる。監視スクリーンショットの定期解析や帳票の一括処理に使いやすい構造だ。

# batch_analyze.py import ollama from pathlib import Path def analyze_images(image_dir: str, prompt: str) -> None: target = Path(image_dir) supported_ext = {".png", ".jpg", ".jpeg", ".gif", ".webp"} for image_path in sorted(target.iterdir()): if image_path.suffix.lower() not in supported_ext: continue print(f"\n=== {image_path.name} ===") try: response = ollama.generate( model="llava:7b-instruct-q4_0", prompt=prompt, images=[str(image_path)] ) print(response["response"]) except Exception as e: print(f"エラー: {e}") if __name__ == "__main__": analyze_images( image_dir="/tmp/screenshots", prompt="この画像にエラーや異常な状態があれば報告してください" )

$ python3 batch_analyze.py === 2026-07-03_09-00-01.png === CPU使用率が95%を超えており、異常な高負荷状態です。 特定プロセスによるリソース占有が疑われます。 === 2026-07-03_09-05-01.png === 画像に異常な状態は見られません。CPU・メモリともに正常範囲内です。

社内業務への応用例|帳票・スクリーンショット・操作手順書の活用シーン

ビジョンモデルが業務でどう役立つか、現場のエンジニアから聞いた事例を紹介する。

監視ダッシュボードの自動レポート
Grafanaのダッシュボードを定期的にスクリーンショットし、LLaVAに「CPU使用率やメモリに異常があれば日本語でレポートしてください」と問い合わせるcronジョブを組んだ例がある。担当者がいない深夜帯の変化を、翌朝テキストで確認できる仕組みだ。スクリーンショットの撮影にはscrotやgnome-screenshotが使える。

帳票・注文書の数値抽出
スキャンされた帳票のJPG画像をLLaVAに渡し、「品目名・数量・単価をCSV形式で出力してください」と指示する使い方だ。OCRソフトと異なり、レイアウトが不規則な帳票や手書き伝票にも対応できる。精度が安定しないため出力の目視確認は必須だが、手入力の工数削減に貢献できる場面がある。

操作手順書の自動生成補助
Webアプリの操作画面を連番でキャプチャし、LLaVAに「これらの画面をステップ形式で日本語説明してください」と渡すと、操作手順書の下書きが生成される。設計変更のたびにマニュアルを手書き更新していたチームの工数削減に活用された事例がある。生成テキストを確認・修正して仕上げる形が現実的だ。

機密情報を含む画像を社外に出せない環境での活用が、ローカルLLMの真骨頂だ。情報セキュリティポリシー上の課題や、クラウドAI利用制限への対処については、「社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢」が参考になる。

ビジョンモデルを使う時のトラブルシュートと注意点

「model does not support images」エラーが出る

テキスト専用モデルに画像を渡した場合に発生する。`ollama list`でモデル名を確認し、llavaやmoondreamなどビジョン対応モデルを指定していることを確かめる。

$ ollama list NAME ID SIZE MODIFIED llama3.3:70b-instruct-q4_0 a6990ed6be71 38 GB 3 hours ago llava:7b-instruct-q4_0 aef5a9b56f35 4.7 GB 1 hour ago # llama3.3 に images フィールドを渡してもエラーになる # llava 系のモデル名を指定していることを確認すること

日本語プロンプトで英語回答が返る

LLaVA 7Bは日本語対応しているが、英語で回答が返ることがある。プロンプトに「必ず日本語で回答してください」を明示すると改善する。

$ curl -s http://localhost:11434/api/generate \ -H "Content-Type: application/json" \ -d "{ \"model\": \"llava:7b-instruct-q4_0\", \"prompt\": \"この画像を説明してください。回答は必ず日本語で書いてください\", \"images\": [\"${IMAGE_B64}\"], \"stream\": false }" | jq -r .response

文字や数値の読み取り精度が低い

ビジョンモデルのOCR相当機能は専門ツールほど精度が高くない。以下で改善できる場合がある。

・画像解像度を最低でも1280×720px以上に上げる
・JPEG圧縮の強い画像はPNG形式に変換してから渡す
・「文字を読んでください」ではなく「この表の数値列だけを正確に抽出してください」と対象を絞り込む
・数値の正確性が業務上必須な場面ではTesseract等の専用OCRエンジンとの組み合わせを検討する

base64コマンドの実行でAPIがエラーになる

Linuxのbase64コマンドはデフォルトで76文字ごとに改行を挿入する。この改行がJSON文字列内に残るとパースエラーになる。

# NG: 改行あり(APIエラーの原因になる) $ IMAGE_B64=$(base64 /tmp/test.png) # OK: -w 0 で改行を除去する $ IMAGE_B64=$(base64 -w 0 /tmp/test.png) # 確認: 改行が含まれていないことをチェック $ echo "${IMAGE_B64}" | grep -c "" 1 # 行数が1であれば改行なし(正常)

VRAMが足りずモデルの読み込みに失敗する

LLaVA 7BのQ4量子化版でも推論時には7GB前後のメモリを使用する(モデルサイズ+KVキャッシュ)。`nvidia-smi`でGPUのフリーメモリを確認し、余裕がない場合はMoondreamに切り替えるか、VRAM管理の設定を見直す。

# GPU空きメモリを確認 $ nvidia-smi --query-gpu=memory.free,memory.total --format=csv,noheader 7826 MiB, 11019 MiB # 空きが7GB未満の場合はMoondreamを検討する $ ollama pull moondream

まとめ

OllamaへのビジョンモデルLLaVA導入は、テキストLLMの追加とほぼ同じ手順で完了する。`ollama pull llava:7b-instruct-q4_0`でモデルを取得し、REST APIの`images`フィールドにbase64エンコードした画像を渡せば、社内サーバーで画像解析が即日稼働し始める。機密性の高い帳票や社内システムの画面を外部に出さずに処理できる点が最大の利点だ。
やりたいこと コマンド・方法
LLaVA 7B(Q4量子化)のインストール ollama pull llava:7b-instruct-q4_0
軽量モデル(CPU環境向け)のインストール ollama pull moondream
インタラクティブモードで画像を渡す ollama run llava:7b-instruct-q4_0 起動後、`/絶対パス/image.png プロンプト`
モデルのVRAM使用状況を確認 ollama ps
base64エンコード(改行なし) base64 -w 0 /path/to/image.png
REST APIで画像を解析する curl http://localhost:11434/api/generate に`images`フィールドを追加
Pythonライブラリで画像解析 ollama.generate(model=..., prompt=..., images=["/path"])

ローカルLLMの画像解析を2日間のハンズオンで体験する

ビジョンモデルの導入から業務への組み込みまで、実機GPU環境で手を動かしながら習得したい方向けに、「ローカルAIマスターセミナー」を開催しています。
少人数(最大8名)ZOOMハンズオン形式で実施しています。

>> ローカルAIマスターセミナーの詳細を確認する
ローカルLLMの構築・運用に関する関連記事もあわせて参考にしてください。

Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。