HuggingFace モデル利用方法

# Hugging Faceモデル利用方法 #captionもでる
今回はキャプションモデル？である[blip-image-captioning-base](https://huggingface.co/Salesforce/blip-image-captioning-base)を利用するまでの手順について軽く記載します。

## ※先に雑談
Gemma3n が騒がれているためHuggingFaceを用いて利用できないか試していたのですが、[google/gemma-3n-E4B-it-litert-preview](https://huggingface.co/google/gemma-3n-E4B-it-litert-preview/tree/main)は 「**.task** 」で保存されているデータしか無く、うまくローカルのPython側で利用することができませんでした。
　from transformers import AutoTokenizer, AutoProcessorを利用してモデルを利用する場合は.binで記載された学習モデルの設定情報などがないとローカルにうまく持ってこれないみたい。。。

```codeowners
プログラムの実行結果抜粋・
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** 」ファイルを調べてみろと言ってました。もうちょっと調べてみます💦
```python
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](https://huggingface.co/Salesforce/blip-image-captioning-base)の利用
 一旦、別の画像データを利用するHuggingFace上のモデルを利用する際の手順を試しました。[blip-image-captioning-base](https://huggingface.co/Salesforce/blip-image-captioning-base)を試しました。

```python
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](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170)
・以下でPythonの動作環境構築
```bash 
## 多分これで足りているはず。インストール不足があたらごめんなさい。。🙇
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](https://huggingface.co/Salesforce/blip-image-captioning-base)はキャプション生成に優れていましたが、自由度のある入力プロンプトを入れてみるとあんまり期待通りのレスポンスは帰ってこなかったです。
 ```bash
 #例
 model_id = "Salesforce/blip-image-captioning-base"
image_path = "./img/20231106115000.png"
prompt = "この画像に写っているのは何ですか？"
```