Hugging Faceモデル利用方法 #captionもでる
今回はキャプションモデル?であるblip-image-captioning-baseを利用するまでの手順について軽く記載します。
※先に雑談
Gemma3n が騒がれているためHuggingFaceを用いて利用できないか試していたのですが、google/gemma-3n-E4B-it-litert-previewは 「.task 」で保存されているデータしか無く、うまくローカルのPython側で利用することができませんでした。
from transformers import AutoTokenizer, AutoProcessorを利用してモデルを利用する場合は.binで記載された学習モデルの設定情報などがないとローカルにうまく持ってこれないみたい。。。
プログラムの実行結果抜粋・
site-packages\transformers\models\auto\auto_factory.py", line 574, in from_pretrained
raise ValueError(
ValueError: Unrecognized configuration class <class 'transformers.models.blip.configuration_blip.BlipConfig'> for this kind of AutoModel: AutoModelForCausalLM.
Model type should be one of AriaTextConfig, BambaConfig, BartConfig, BertConfig, BertGenerationConfig, BigBirdConfig, BigBirdPegasusConfig, BioGptConfig, BitNetConfig, BlenderbotConfig, BlenderbotSmallConfig, BloomConfig, CamembertConfig, LlamaConfig, CodeGenConfig, CohereConfig, Cohere2Config, CpmAntConfig, CTRLConfig, Data2VecTextConfig, DbrxConfig, DeepseekV3Config, DiffLlamaConfig, ElectraConfig, Emu3Config, ErnieConfig, FalconConfig, FalconMambaConfig, FuyuConfig, GemmaConfig, Gemma2Config, Gemma3Config, Gemma3TextConfig, GitConfig, GlmConfig, Glm4Config, GotOcr2Config, GPT2Config, GPT2Config, GPTBigCodeConfig, GPTNeoConfig, GPTNeoXConfig, GPTNeoXJapaneseConfig, GPTJConfig, GraniteConfig, GraniteMoeConfig, GraniteMoeHybridConfig, GraniteMoeSharedConfig, HeliumConfig, JambaConfig, JetMoeConfig, LlamaConfig, Llama4Config, Llama4TextConfig, MambaConfig, Mamba2Config, MarianConfig, MBartConfig, MegaConfig, MegatronBertConfig, MistralConfig, MixtralConfig, MllamaConfig, MoshiConfig, MptConfig, MusicgenConfig, MusicgenMelodyConfig, MvpConfig, NemotronConfig, OlmoConfig, Olmo2Config, OlmoeConfig, OpenLlamaConfig, OpenAIGPTConfig, OPTConfig, PegasusConfig, PersimmonConfig, PhiConfig, Phi3Config, Phi4MultimodalConfig, PhimoeConfig, PLBartConfig, ProphetNetConfig, QDQBertConfig, Qwen2Config, Qwen2MoeConfig, Qwen3Config, Qwen3MoeConfig, RecurrentGemmaConfig, ReformerConfig, RemBertConfig, RobertaConfig, RobertaPreLayerNormConfig, RoCBertConfig, RoFormerConfig, RwkvConfig, Speech2Text2Config, StableLmConfig, Starcoder2Config, TransfoXLConfig, TrOCRConfig, WhisperConfig, XGLMConfig, XLMConfig, XLMProphetNetConfig, XLMRobertaConfig, XLMRobertaXLConfig, XLNetConfig, XmodConfig, ZambaConfig, Zamba2Config.
コードの記載内容も載せておきます。博識の方簿!
⇒ ChatGPTに聞くと「.task 」ファイルを調べてみろと言ってました。もうちょっと調べてみます💦
import os
import jax
import flax
import optax
import numpy as np
from PIL import Image
from flax import linen as nn
from transformers import AutoTokenizer, AutoProcessor, AutoModelForCausalLM # ここで追加
from flax.training import checkpoints
from flax.core import freeze, unfreeze
# --- 設定 ---
model_id = "Salesforce/blip-image-captioning-base"
local_dir = "./gemma3n_local"
image_path = "./img/20231106115000.png"
prompt = "<start_of_image> この画像に写っているのは何ですか?"
def load_model_pipeline(local_dir, model_id, image_path, prompt):
# モデルとトークナイザーの読み込み元を決定
if os.path.isdir(local_dir):
print("✅ ローカルモデルを使用します。")
model_path = local_dir
else:
print("⬇️ モデルがローカルに存在しないため、ダウンロードを開始します。")
model_path = model_id
# モデル、トークナイザー、プロセッサーの読み込み
tokenizer = AutoTokenizer.from_pretrained(model_path)
processor = AutoProcessor.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path)
# 入力画像とプロンプトの準備
image = Image.open(image_path)
prompt_with_tag = f"<start_of_image> {prompt}"
# processor を使って画像+テキストの入力を準備
inputs = processor(text=prompt_with_tag, images=image, return_tensors="jax")
# 推論
outputs = model.generate(
**inputs,
max_new_tokens=100,
do_sample=True,
temperature=0.7,
top_p=0.95
)
# 出力のデコード
output_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return output_text
# --- 実行 ---
output_text = load_model_pipeline(local_dir, model_id, image_path, prompt)
# --- 結果表示 ---
print("\n--- 出力 ---")
print(output_text)
blip-image-captioning-baseの利用
一旦、別の画像データを利用するHuggingFace上のモデルを利用する際の手順を試しました。blip-image-captioning-baseを試しました。
from transformers import BlipProcessor, BlipForConditionalGeneration
from PIL import Image
def generate_caption(image_path):
model_id = "Salesforce/blip-image-captioning-base"
# モデルとプロセッサをロード
processor = BlipProcessor.from_pretrained(model_id)
model = BlipForConditionalGeneration.from_pretrained(model_id)
# 画像を読み込み(RGBに変換)
image = Image.open(image_path).convert("RGB")
# 画像のみで入力を作成
inputs = processor(image, return_tensors="pt")
# キャプション生成
outputs = model.generate(**inputs, max_new_tokens=50)
# 出力をデコードして文字列に変換
caption = processor.decode(outputs[0], skip_special_tokens=True)
return caption
if __name__ == "__main__":
image_path = "./img/building-6011756_1280.jpg" # お好きな画像パスに変更してください
caption = generate_caption(image_path)
print("=== 画像キャプション ===")
print(caption)
事前準備
・C++の最新のパッケージを入れておく。The latest version is v14.44.35208.0
・以下でPythonの動作環境構築
## 多分これで足りているはず。インストール不足があたらごめんなさい。。🙇
conda create -n jax_env python=3.10
conda activate jax_env
pip install jax jaxlib
pip install torch torchvision torchaudio
pip install flax
pip install Pillow
pip install transformers
pip install tiktoken
モデルを使ってみての感想
blip-image-captioning-baseはキャプション生成に優れていましたが、自由度のある入力プロンプトを入れてみるとあんまり期待通りのレスポンスは帰ってこなかったです。
#例
model_id = "Salesforce/blip-image-captioning-base"
image_path = "./img/20231106115000.png"
prompt = "この画像に写っているのは何ですか?"