【Phi-3 Vision】OCRが速攻で作れる!軽量マルチモーダルSLMの使い方

【Phi-3 Vision】OCRが速攻で作れる!軽量マルチモーダルSLM

Phi-3 Visionは、Microsoftが開発した無料で使えるマルチモーダルSLM(小規模言語モデル)です。

画像からテキストを読み取ることができ、Phi-3 Visionを使えばOCRを簡単に作ることができます。

この記事では、Phi-3 Visionの使い方を分かりやすく解説します。

11/27開催のウェビナーをお知らせ!

目次

Phi-3 Visionとは

見出し画像

Phi-3 Visionは、Microsoftが開発したオープンソースのSLM(小規模言語モデル)です。

Phi-3 Visionを使えば、名刺情報や契約書類の画像データからテキストを抽出するようなOCRが簡単に作れます。

Phi-3 Visionの特徴
  • 同等以上のサイズのモデルと比較して性能が高い
  • 画像とテキストを入力して、テキストを生成することができる
  • モデルをダウンロードして、ローカル環境でも実行が可能

Phi-3の詳細は、以下の記事で解説しています。

Phi-3 Visionの使い方

見出し画像

Phi-3 Visionを使ったテキスト生成について解説していきます。

実行環境

この記事で用意した実行環境は以下のとおりです。

  • GPU:NVIDIA A100 80GB
  • GPUメモリ(VRAM):80GB
  • OS :Ubuntu 22.04
  • Docker

Dockerで環境構築

Dockerを使用してPhi-3 Visionの環境構築をします

Dockerの使い方は以下の記事をご覧ください。

STEP
Dockerfileの作成

コンテナにインストールするパッケージは以下のとおりです。

CUDA、PyTorch、Transformersはバージョン依存関係によるエラーが起きやすいので、動作検証済のバージョン指定してインストールしています。

パッケージ一覧
  • CUDA:12.1
  • Python:3.10
  • PyTorch:2.2.2
  • transformers:4.41.2
  • packaging
  • accelerate
  • Pillow
  • Requests
  • wheel
  • flash-attn

Ubuntuのコマンドラインで、Dockerfileを作成します。

mkdir phi3_vision
cd phi3_vision
nano Dockerfile

Dockerfileに以下の記述を貼り付けます。

# ベースイメージ(CUDA)の指定
FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y python3-pip python3-venv git nano

# 作業ディレクトリを設定
WORKDIR /app

# アプリケーションコードをコピー
COPY . /app

# Python仮想環境の作成
RUN python3 -m venv /app/.venv

# 仮想環境をアクティベートするコマンドを.bashrcに追加
RUN echo "source /app/.venv/bin/activate" >> /root/.bashrc

# JupyterLabのインストール
RUN /app/.venv/bin/pip install Jupyter jupyterlab

# PyTorchのインストール
RUN /app/.venv/bin/pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu121

# Transformer関連のインストール
RUN /app/.venv/bin/pip install transformers==4.41.2 \
    packaging \
    accelerate \
    Pillow \
    Requests \
    wheel 

# Flash attentionをインストール
RUN /app/.venv/bin/pip install flash-attn --no-build-isolation

# コンテナの起動時にbashを実行
CMD ["/bin/bash"]

[Ctrl + S]キーで変更内容を保存し、[Ctrl + X]キーで編集モードから抜けます。

STEP
docker-compose.ymlファイルの作成

docker-compose.ymlでDockerコンテナの設定をします。

docker-compose.ymlのYAMLファイルを作成して開きます。

nano docker-compose.yml

以下のコードをコピーして、YAMLファイルに貼り付けます。

services:
  phi3_vision:
    build:
      context: .
      dockerfile: Dockerfile
    image: phi3_vision
    runtime: nvidia
    container_name: phi3_vision
    ports:
      - "8888:8888"
    volumes:
      - .:/app/phi3_vision
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    command: >
      bash -c '/app/.venv/bin/jupyter lab --ip="*" --port=8888 --NotebookApp.token="" --NotebookApp.password="" --no-browser --allow-root'

[Ctrl + S]キーで変更内容を保存し、[Ctrl + X]キーで編集モードから抜けます。

STEP
Dockerコンテナを起動

Dockerfileからビルドしてコンテナを起動します。   

docker compose up

 

Dockerの起動後にブラウザの検索窓に”localhost:8888″を入力すると、Jupyter Labをブラウザで表示できます。

localhost:8888

Phi-3 Visionの実装

見出し画像

Dockerコンテナで起動したJupyter Lab上でPhi-3 Visionの実装をします。

STEP
ライブラリのインポート

Jupyter Labのコードセルに次のコマンドを実行して、ライブラリをインポートします。

from PIL import Image 
import requests 
from transformers import AutoModelForCausalLM 
from transformers import AutoProcessor
STEP
モデルとプロセッサーの設定

Phi-3 Visionのモデルとトークナイザーを読み込みます。

model_id = "microsoft/Phi-3-vision-128k-instruct" 
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="cuda",
    trust_remote_code=True,
    torch_dtype="auto",
    _attn_implementation='flash_attention_2'
)

processor = AutoProcessor.from_pretrained(
model_id,
trust_remote_code=True
)
コードの説明

microsoft/Phi-3-vision-128k-instruct : Phi-3 Visionのモデルタイプを指定します。

AutoModelForCausalLM.from_pretrained():モデルを読み込みます。

flash_attention_2:推論を高速化するFlash Attentionを指定しています。

pipeline() : テキスト生成タスクのためのTransformerのパイプラインを設定しています。

AutoProcessor.from_pretrained():画像処理のプロセッサーとトークナイザーを読み込みます。

モデルIDパラメータサイズコンテキスト長GPUメモリ使用量
microsoft/Phi-3-vision-128k-instruct42億パラメータ128kトークン8GB

モデルを読み込む際にGPUメモリを消費しますので、余裕を持ったGPUメモリをご用意ください。

STEP
画像からテキストを生成する関数を定義

画像とテキストを入力して、テキストを生成する関数を定義します。

def textvision(messages, path_image):
    
    image = Image.open(path_image)

    prompt = processor.tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )

    inputs = processor(prompt, [image], return_tensors="pt").to("cuda:0")

    generate_ids = model.generate(
        **inputs,
        eos_token_id=processor.tokenizer.eos_token_id,
        max_new_tokens=256,
        do_sample=False,
    )

    generate_ids = generate_ids[:, inputs["input_ids"].shape[1] :]

    response = processor.batch_decode(
        generate_ids,
        skip_special_tokens=True,
        clean_up_tokenization_spaces=False
    )[0]
    
    resized_image = image.resize((int(image.width * 0.5), int(image.height * 0.5)))
    resized_image.show()
    print(response)
コードの説明

Image.open()

指定されたパスをもとに画像を開きます。

processor.tokenizer.apply_chat_template()

メッセージにチャットテンプレートを適用します。

processor(prompt, [image], return_tensors=”pt”).to(“cuda:0”)

テキストと画像をテンソル変換してProcessorに渡し、GPUに転送しています。

model.generate()

入力データをもとにトークンIDを生成します。

processor.batch_decode()

モデルが生成したトークンIDをテキストに変換します。

Phi-3 Visionで画像からテキストを生成

見出し画像

Phi-3 Visionを使って、画像の入力からテキストを生成してみます。

英語で画像説明

指定した画像について説明してください。」というプロンプトを英語で実行してみます。

prompt_input = [
    {"role": "user", "content": "<|image_1|>\n Please describe this image."}
]

path_image = "testimage1.jpg"

textvision(prompt_input, path_image)
コードの説明

[{“role”: “user”, “content”: “<|image_1|>\n Please describe this image.”}]

「Please describe this image」というプロンプトを入力しています。

path_image = “testimage1.jpg”

画像を指定しています。

猫のぬいぐるみ

Please describe this image.
————————————–
(翻訳)
この画像について説明してください。

The image features a cozy indoor setting with a wooden table at the center. On the table, there is a white cup of coffee with a heart-shaped foam on top, accompanied by a small potted plant. To the right of the cup, there is a plush toy of a cat with orange fur and white paws. The background shows a window with a view of a street scene, including a building with a red roof and a car parked on the street. The room is softly lit with warm lighting, creating a welcoming atmosphere.
————————————————————————–
(翻訳)
画像には、中央に木製のテーブルがある居心地の良い室内の様子が写っています。テーブルの上には、ハート型の泡が乗った白いコーヒーカップと、小さな鉢植えの植物があります。カップの右側には、オレンジ色の毛並みと白い足を持つ猫のぬいぐるみが置かれています。背景には、赤い屋根の建物や通りに駐車された車などが見える窓があります。部屋は暖かい照明でやわらかく照らされ、歓迎の雰囲気を醸し出しています。

細部にわたって画像の説明ができています!

日本語で画像説明

「この画像について説明してください」というプロンプトを日本語で実行してみます。

prompt_input = [
    {"role": "user", "content": "<|image_1|>\n この画像について説明してください。"},
    {"role": "assistant", "content": "あなたは画像を日本語で回答するアシスタントです。"}
]

path_image = "testimage3.jpg"

textvision(prompt_input, path_image)
コードの説明

{“role”: “assistant”, “content”: “あなたは日本語で回答するアシスタントです”}

回答するモデルの役割(ロール)を指定しています。

猫シェフ

Please describe this image.
————————————–
(翻訳)
この画像について説明してください。

この画像では、キャッシュレスターに準備されたキャッシュレスターのシーンが描かれています。キャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスターのキャッシュレスターの中で、キャッシュレスタ

日本語での回答は、完全に破綻しています。

英語で同じ内容を生成してみます。

猫シェフ

Please describe this image.
————————————–
(翻訳)
この画像について説明してください。

The image features a cat dressed in a white chef’s hat and a white jacket with black buttons, sitting on a wooden cutting board in a kitchen setting. The cat has a playful expression and is looking directly at the camera. The kitchen is equipped with various cooking utensils such as pans, a rolling pin, and a pot, as well as a range hood and a stove. There are also shelves with jars and spices, and a tomato is visible on the counter.
————————————————————————–
(翻訳)
画像には、白いシェフ帽と黒いボタンの付いた白いジャケットを着た猫が、キッチンの木製のまな板の上に座っている様子が描かれています。猫は遊び心のある表情でカメラを見ています。キッチンには、フライパン、めん棒、鍋などのさまざまな調理器具や、レンジフードとストーブが備わっています。また、棚には瓶やスパイスが置かれており、カウンターにはトマトが見えます。

英語入力の場合は、高い精度の応答になりました!

画像からテキストの読み取り(OCR)

「画像のテキストをOCRで抽出してください」というプロンプトを投げてみます。

prompt_input = [
    {"role": "user", "content": "<|image_1|>\n OCR the text of the image. Extract the text of the following fields and put it in a JSON format: \
    'Company', 'Name','Title','Phone', 'E-mail','URL','Adress'"}]

path_image = "testocr.jpg"

textvision(prompt_input, path_image)
見出し画像

OCR the text of the image. Extract the text of the following fields and put it in a JSON format:
‘Company’, ‘Name’,’Title’,’Phone’, ‘E-mail’,’URL’,’Adress'”
———————————————————————
(翻訳)
画像のテキストをOCRで抽出し、以下のフィールドのテキストを抽出してJSON形式にしてください:
‘会社名’, ‘名前’, ‘役職’, ‘電話番号’, ‘Eメール’, ‘URL’, ‘住所’

{
“Company”: “Cat Innovation Inc.”,
“Name”: “Scottish Foldman”,
“Title”: “Manager”,
“Phone”: “03-313-2800”,
“E-mail”: “f-scottish@catinnovation.co.jp”,
“URL”: “https://catinnovation.co.jp”,
“Address”: “3-48-1 Nekogaya, Shinjuku-ku, Tokyo 562-2800, Japan”
}

プロンプトから精度の高いテキストの抽出ができています!

生成AI・LLMのコストでお困りなら

GPUのスペック不足で生成AIの開発が思うように進まないことはありませんか?

そんなときには、高性能なGPUをリーズナブルな価格で使えるGPUクラウドサービスがおすすめです!

GPUSOROBAN
GPUSOROBAN

GPUSOROBANは、生成AI・LLM向けの高速GPUを業界最安級の料金で使用することができます。

インターネット環境さえあれば、クラウド環境のGPUサーバーをすぐに利用可能です。

大規模な設備投資の必要がなく、煩雑なサーバー管理からも解放されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
EdgeHUBロゴ

メールマガジン登録

Stable Diffusion・LLM・RAGに関する最新情報をいち早くお届けします。

無料メルマガの配信をご希望の方は、下記フォームよりご登録ください。

    EdgeHUB編集部からのお知らせ

    無料ウェビナーのお知らせ

    11/27ウェビナー

    RAG×日本語LLMの無料オンラインウェビナー第2弾!

    開催日時:
    2024年11月27日(水) 14:00~15:00

    内容:

    • 「LlamaIndex」と「Llama-3.1-Swallow」でRAG環境を構築
    • 生成AI開発の強い味方「GPUSOROBAN」の活用方法

    このウェビナーでは、オープンソース「LlamaIndex」で構築したRAGの使い方や、デモを紹介します。

    生成AIに関心のある方、AI技術をビジネスに活かしたい方は、ぜひこの貴重な機会にご参加ください!

    こんな方におすすめ!

    • 日本語LLMの利用を検討している方
    • AI開発に携わっている方
    • 最新のAI技術やトレンドに興味がある方
    • GPUスペック不足に悩んでいる方

    \簡単1分で申し込み!/

    この記事を書いた人

    EdgeHUBは、NVIDIAクラウドパートナーである株式会社ハイレゾが運営しています。「AIと共にある未来へ繋ぐ」をテーマに、画像生成AI、文章生成AI、動画生成AI、機械学習・LLM、Stable Diffusionなど、最先端の生成AI技術の使い方をわかりやすく紹介します。

    目次