見出し画像

【ローカルLLM】部分スクリーンショットをVLMで解析【画像生成用にプロンプト化】

はじめに

前回の記事では、スクリーンショットをOCRする方法でしたが、

応用としてVLMで解析できるようにします。今回も環境はLinuxデスクトップです。Linuxの強みは、基本コマンドを組み合わせて無限にツールを作れる事ですね。

※ VLM(Vision Language Model)とはLLMに視覚機能をもたせたモデルです。

何が便利になるのか?

正攻法の利用として画像のデータや表を読み取ったりできますが、ChatGPTのような有料サービスとくらべると(ローカルで利用できるモデルは規模も小さく性能が悪いので)あまり利点はありません。実用性を考えるとOCRでやった方が効率が良いぐらいです。

それに致命的な問題もあります。現状日本語を扱えるモデルがありません。

※ Google Paligemma、Cyberagentのモデルは気になっていますが、ollamaでは利用できません。まあ、直接利用すれば使えますが。

しかし、AI画像生成用のプロンプト補助として利用すると絶大な利点があります。(※ Stable Diffusion内にも同じ用途としてCLIPやBLIPがありますが、メモリ利用量が大きい事と、独立して利用するには困難が伴います)

OSシステムワイドなスクリーンショット機能として「画像のプロンプト化」が気軽に扱えるのであれば、わざわざ解析対象の画像ファイルを保存する必要もなく、様々な生成AIアプリケーションで即座に利用できます。

特に、画像のプロンプト化は「インペイント」時に効果を発揮します。部分的な画像生成を行う時は、全体の元プロンプトから大きく異なる場合があるので、インペイント用の新たなプロンプトを考えなければなりません。スクリーンの任意の場所をショートカットキー一つで英語プロンプト化できるツールは非常に有用です。

さらに、スクリーンショット画像の処理は、著作物や個人情報を含んでしまう可能性もあるため、ローカルで完結する仕組みは安心できます。ローカルの大きな強みでもあります。

前提

  • 今回はPythonを直接利用しているので、少し難度が上がっていますが、理解したりPythonコードを直接編集する必要はありません。

  • Python3 がシステムへインストール済み

    • 通常のLinux mintインストールでは導入済みのはずです。

  • ollama コマンドがインストール済み

  • Visionモデルのダウンロード

    • ollama pull llava-phi3

    • ollama pull llava-llama3 等

  • Flameshot(Linuxスクリーンショット取得ソフトウェア)

    • sudo apt install flameshot

まずはコア・コマンドを作成

OCRの場合はtesseractコマンドが存在し、画像ファイルを読み込んで解析した結果をテキストに出力できましたが、そのような「コマンド」を作る必要があります。

つまり、「画像ファイルを入力すれば、VLMで解析して結果をテキスト出力する」コマンドが必要になります。

※ 実はollama run コマンドに指示プロンプトを渡すだけで実現できるのですが、時々失敗するので、安定のためにollama Python APIを利用する事にします。

それを実装したものが次になります。追加で ollama python モジュールを利用します。あらかじめ導入しておきます。

pip install ollama

■ llava-img-analyze.py

#!/usr/bin/env python3

import os
import argparse
import ollama
import logging

logging.basicConfig(level=logging.INFO)


def image_analysis_with_ollama(llm_model, prompt, image_file_path):
    """
    画像を指定のLLMモデルで解析し、結果を返します。

    :llm_model: LLMモデルの名前
    :prompt: 解析に使用するリクエスト
    :image_file_path: 解析対象の画像ファイルのパス
    """
    logging.info(f"Analyzing the image with prompt: {prompt}")

    if not os.path.isfile(image_file_path):
        raise ValueError("The provided 'image_file_path' does not exist.")

    try:
        response = ollama.chat(model=llm_model,
                               messages=[{'role': 'user',
                                          'content': prompt,
                                          'images': [image_file_path]}])

        return {'analysis': response['message']['content']}

    except Exception as e:
        logging.error(f"Error occurred during image analysis: {str(e)}")
        raise


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='画像をLLMモデルで解析する')
    parser.add_argument('-f', '--file', help='分析対象の画像ファイル', required=True)
    parser.add_argument('-m', '--llm_model',
                        help='使用するLLMモデル', default="llava-llama3")
    parser.add_argument('-p', '--prompt', help='解析に使用するリクエスト',
                        default="What is in picture?")
    args = parser.parse_args()

    result = image_analysis_with_ollama(args.llm_model, args.prompt, args.file)
    print(result['analysis'])

使用例

コマンドラインから実行します。shebangを1行目に書いているので、実行属性を与えれば直接コマンドとしても利用できます。

python llava-img-analyze.py -f image.jpg -m llava-phi3 -p "Describe the scene in the picture"
  • -f image.jpg:解析する画像ファイルを指定します。

  • -m <model>:使用するVLMモデルを指定します(オプション)。

  • -p "Describe the scene in the picture":VLM画像解析のプロンプトを指定します(オプション)。

スクリプトの作成

前回のスクリプトの「OCR+QRコマンド実行」箇所を、

# スクリーンショットの画像をファイル保存
flameshot gui --raw > $image_tmp

# ollama Visionモデルを利用する
llm_model="llava-phi3"
prompt="Guess the prompt to generate this picture using Stable Diffusion. Answer in one or two sentences only. Do not use bullet points or tables"
llava-img-analize3.py -f $image_tmp -p "$prompt" -m $llm_model > $txt_tmp

# 画面表示
text_edit=`zenity --editable --text-info --filename="$txt_tmp" --title "LLM visionモデル結果"`

で差し替えます。引数はないので、最初のオプション処理も必要ありません。VLMモデルはデフォルトをllava-llama3としていますが、llava-phi3の方が高速で利用メモリも少ないのでおすすめです。

基本的に前回とコードが同じなので、支援いただいた方のためにも、完全な一式のスクリプトは「Linuxでスクリーンショット画面のテキストOCRを実現する」の有料ダウンロード欄にアップしています。※ 有料欄のものは多少実用面を考えた修正をしています。紹介スクリプトだと、正常終了しない場合にゴミが残ってしまいますので。

筆者環境では、スクリプト名を「llava-image-fs.sh」として、キーボード・ショートカットを「<shift>+<win>+y」として割り当てています。

これで、画面に表示される「画像」はすべて即座にプロンプト化できます。

※ 即座といっても筆者環境(GTX 1660ti)では6秒程度必要です。

画面の部分スクリーンショットをプロンプト化(llava-phi3)


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