見出し画像

Intel iGPU で Florence-2 を動かしてみた (第1回 : Windows環境構築とIntel最適化編)

0. はじめに

2024年7月に、MicrosoftがFlorence-2を公開しました。
ざっくりの解説は、こちらをご覧ください。

その存在を知った時は、いろんな意味で衝撃だったのですが、画像アノテーション案件において、セグメンテーションの作業効率を上げるために、こんな使い方をしたいと思いました。

  1. Florence-2 に text prompt を与えて特定の物体を検出させ、矩形の座標を得る。(バッチ処理)

  2. Segment Anything Model 2 (SAM2) に box prompt を与えて物体領域を検出させ、mask情報を得る。(バッチ処理)

  3. 対象画像とmask情報をFastLabelに読み込み、自動アノテーションされた状態を用意する。(バッチ処理)

  4. FastLabelで、セグメンテーションの修正作業を行なう。(アノテーターによる逐次作業)

2.の部分が、これまで4回に分けて紹介したお話です。(バッチ処理のところは、未着手だけど。)

というわけで、これから3回に分けて、1.のお話をしたいと思います。



1. 前提条件

SAM2用に構築した環境に、Florence-2に必要なものを追加しました。
ここでいうSAM2用とは、これのこと。

なので、SAM2には必要だけど、Florence-2には不要なものも含まれているはずですが、ご容赦を。

そして、こんな環境です。

  • Windows 10 もしくは Windows 11 (注: WSL2は意義も含め未検証です)

  • Intel CPU (注: AMDでは稼働しません!)

  • Intel GPU (注: AMDやNVIDIAでは稼働しません!)

  • MinicondaのPython (注: pipは使いません!)

  • OpenVINO

  • VS Code

  • SAM2に必要だった各種ライブラリ

  • Florence-2に必要な各種ライブラリ (これから説明します!)


2. 各種ライブラリのインストール

SAM2用の環境で、しこたまインストール済みなので、追加分はこれだけでした。
ちなみに、py312_ovはMinicondaで作った仮想環境名なので、ご自身の仮想環境名と置き換えて解釈してください。

(py312_ov) > conda install conda-forge::transformers
(py312_ov) > conda install conda-forge::timm
(py312_ov) > conda install conda-forge::einops

3. サンプルコードの説明

3.1) 概要

SAM2と同じ流れなんですが、ざっと、こんな感じです。

  1. Florence-2の学習済みモデルをダウンロードする。

  2. OpenVINO IR形式に変換する。

3.2) OpenVINO提供のユーティリティ

要になる処理をユーティリティとして提供してくれているので、それをダウンロードします。

import requests
from pathlib import Path

if not Path("ov_florence2_helper.py").exists():
    r = requests.get(
        url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/florence2/ov_florence2_helper.py"
    )
    open("ov_florence2_helper.py", "w").write(r.text)

if not Path("notebook_utils.py").exists():
    r = requests.get(
        url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py"
    )
    open("notebook_utils.py", "w").write(r.text)

もしかしたら、ov_florence2_helper.pyのダウンロードに失敗するかもしれません。
画面出力用の絵文字が多用されていて、私の環境では「あんたの文字コードに適合してない」みたいなエラーが出ました。
同じ症状に遭遇したら、URLをクリックしてブラウザで開き、そこから保存してください。

3.3) OpenVINO IRの保存場所とモデルの選択

こんな階層にしました。

  • 現フォルダ

    • model

      • Florence-2

        • Florence-2-base

        • Florence-2-large

        • Florence-2-base-ft

        • Florence-2-large-ft

Florence-2はパラメータ数に応じて2種類の学習済みモデルがあり、かつ、それぞれにFLD-5Bという巨大なデータセットで事前学習したモデルと、それを下流タスク用にファインチューニングしたモデルがあるため、全部で4種類あります。
通常用途であれば、ファインチューニング版の方が良いのではないでしょうか。
ちなみに、私のPCでは、baseとbase-ftしか動きませんでした。

# model_name = "Florence-2-base"        # Pretrained model with FLD-5B
# model_name = "Florence-2-large"       # Pretrained model with FLD-5B
model_name = "Florence-2-base-ft"       # Finetuned model on a collection of downstream tasks
# model_name = "Florence-2-large-ft"    # Finetuned model on a collection of downstream tasks

model_id = "microsoft/" + model_name    # ov_florence2_helper.pyが想定している値なので変えない

model_path = Path("model")              # modelの保存場所
model_path.mkdir(exist_ok=True)

model_path = model_path / "Florence-2"  # Florence-2の各modelの保存場所
model_path.mkdir(exist_ok=True)

model_path = model_path / model_name    # 選択したmodelの保存場所
model_path.mkdir(exist_ok=True)

3.4) モデルのダウンロードと OpenVINO IR への変換

SAM2用と異なり、ユーティリティが優れているというか、たった2行で終わってしまいます。

from ov_florence2_helper import convert_florence2
convert_florence2(model_id, model_path)

で、私のPCでは、largeとlarge-ftは変換時にエラーが出て、途中で放棄されてしまいました。原因不明です。


4. 成果物

無事に変換が終わると、前述したmodelフォルダの下に、主に以下の10ファイルができています。(SAM2用と違って、他にもごちゃごちゃ出来てました。)

  • decoder.xml

  • decoder.bin

  • decoder_with_past.xml

  • decoder_with_past.bin

  • encoder.xml

  • encoder.bin

  • image_embedding.xml

  • image_embedding.bin

  • text_embedding.xml

  • text_embedding.bin

XMLファイルには、モデルの構成のようなものが記述されています。
BINファイルには、パラメータをバイナリ形式にしたものが保存されています。
ちなみに、デフォルトだとパラメータはFP32(32bit浮動小数点)からFP16(16bit浮動小数点)に精度が落とされています。
この辺りの話は、SAM2用の環境構築で書いた話と同じです。


5. 次回は

今回の説明で変換したOpenVINO IR形式のモデルを使って、実際に物体検出をしてみましょう。

いいなと思ったら応援しよう!