# プロセッサ

マルチモーダルモデルには、複数のモダリティを組み合わせた入力を処理できるプリプロセッサが必要です。入力モダリティに応じて、プロセッサはテキストをテンソルの配列に変換し、画像をピクセル値に変換し、オーディオを適切なサンプリングレートを持つテンソルの配列に変換する必要があります。

例えば、[PaliGemma](./model_doc/paligemma) は、[SigLIP](./model_doc/siglip) 画像プロセッサと [Llama](./model_doc/llama) トークナイザを使用するビジョン言語モデルです。[ProcessorMixin](/docs/transformers/main/ja/main_classes/processors#transformers.ProcessorMixin) クラスはこれら 2 つのプリプロセッサタイプをラップし、マルチモーダルモデルに対して単一かつ統合されたプロセッサクラスを提供します。

[from_pretrained()](/docs/transformers/main/ja/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained)を呼び出してプロセッサを読み込みます。プロセッサに入力タイプを渡すことで、期待されるモデルの入力、入力ID、ピクセル値を生成します。

```py
from transformers import AutoProcessor, PaliGemmaForConditionalGeneration
from PIL import Image
import requests

processor = AutoProcessor.from_pretrained("google/paligemma-3b-pt-224")

prompt = "answer en Where is the cat standing?"
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(text=prompt, images=image, return_tensors="pt")
inputs
```

このガイドでは、プロセッサクラスとマルチモーダル入力の前処理方法について説明します。

## プロセッサクラス

All processors inherit from the [ProcessorMixin](/docs/transformers/main/ja/main_classes/processors#transformers.ProcessorMixin) class which provides methods like [from_pretrained()](/docs/transformers/main/ja/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained), [save_pretrained()](/docs/transformers/main/ja/model_doc/wav2vec2#transformers.Wav2Vec2Processor.save_pretrained), and [push_to_hub()](/docs/transformers/main/ja/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub) for loading, saving, and sharing processors to the Hub.

プロセッサを読み込む方法には2つあります。[AutoProcessor](/docs/transformers/main/ja/model_doc/auto#transformers.AutoProcessor)を使用する方法と、モデル固有のプロセッサクラスを使用する方法です。

[AutoClass](./model_doc/auto) API は、特定のモデルクラスを直接指定せずにプロセッサを読み込むためのシンプルなインターフェースを提供します。

[from_pretrained()](/docs/transformers/main/ja/model_doc/auto#transformers.AutoProcessor.from_pretrained)を使用してプロセッサを読み込みます。

```py
from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("google/paligemma-3b-pt-224")
```

プロセッサーは、特定の事前学習済みマルチモーダルモデルクラスに関連付けられています。[from_pretrained()](/docs/transformers/main/ja/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained) を使用して、モデルクラスからプロセッサーを直接読み込むことができます。

```py
from transformers import WhisperProcessor

processor = WhisperProcessor.from_pretrained("openai/whisper-tiny")
```

2つのプリプロセッサタイプ、[WhisperTokenizerFast](/docs/transformers/main/ja/model_doc/whisper#transformers.WhisperTokenizer)と[WhisperFeatureExtractor](/docs/transformers/main/ja/model_doc/whisper#transformers.WhisperFeatureExtractor)をそれぞれ個別にロードすることもできます。

```py
from transformers import WhisperTokenizerFast, WhisperFeatureExtractor, WhisperProcessor

tokenizer = WhisperTokenizerFast.from_pretrained("openai/whisper-tiny")
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-tiny")
processor = WhisperProcessor(feature_extractor=feature_extractor, tokenizer=tokenizer)
```

## プロセッサの保存と読み込み

[save_pretrained()](/docs/transformers/main/ja/model_doc/wav2vec2#transformers.Wav2Vec2Processor.save_pretrained) は、プロセッサの設定を単一の `processor_config.json` ファイルに書き出します。トークナイザーとチャットテンプレートは、それぞれ別のファイルに保存されます。

```py
from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("llava-hf/llava-onevision-qwen2-0.5b-ov-hf")
processor.save_pretrained("./llava-onevision")
```

```text
llava-onevision/
├── chat_template.jinja
├── processor_config.json
├── tokenizer.json
└── tokenizer_config.json
```

トークナイザ以外のすべてのサブプロセッサは、`image_processor`、`video_processor`、`feature_extractor` などの属性名をキーとして、`processor_config.json` の中にネストされています。プロセッサ自体に属する設定（`image_token` など）は、トップレベルに配置されます。以下の例は短縮版です。

```json
{
  "image_processor": {
    "image_processor_type": "LlavaOnevisionImageProcessor",
    "do_resize": true,
    "size": {"height": 384, "width": 384},
    "image_mean": [0.5, 0.5, 0.5]
  },
  "image_token": "<image>",
  "processor_class": "LlavaOnevisionProcessor",
  "video_processor": {
    "video_processor_type": "LlavaOnevisionVideoProcessor",
    "do_resize": true,
    "size": {"height": 384, "width": 384},
    "image_mean": [0.5, 0.5, 0.5]
  },
  "video_token": "<video>"
}
```

その他のファイルは、それぞれ個別に保存されます。

- トークナイザーは、`tokenizer.json` や `tokenizer_config.json` などの通常ファイルを書き出します。プロセッサーに2番目のトークナイザーがある場合、その属性名に由来するサブフォルダー（例: `decoder_tokenizer/`）に保存されます。
- チャットテンプレートは`chat_template.jinja`に保存されます。プロセッサに複数のチャットテンプレートがある場合、`default`テンプレートは`chat_template.jinja`に、それ以外は`chat_templates/`フォルダに配置されます。

[from_pretrained()](/docs/transformers/main/ja/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained)でプロセッサを読み込むと、各サブプロセッサはまず`processor_config.json`内のネストされたキーを探します。キーが見つからない場合は、単独のファイルにフォールバックします。画像プロセッサとフィーチャーエクストラクターは`preprocessor_config.json`を読み取り、動画プロセッサは`video_preprocessor_config.json`を読み取った後に`preprocessor_config.json`を読み取ります。各サブプロセッサを個別のファイルに保存する古いチェックポイントも、この方法で読み込むことができます。

> [!NOTE]
> ネストされた設定は、単独のファイルよりも優先されます。チェックポイントに両方が存在する場合、`preprocessor_config.json`または`video_preprocessor_config.json`を編集しても効果はありません。代わりに、`processor_config.json`内のネストされたエントリを編集してください。

## 前処理

Processorsは、マルチモーダルな入力をTransformersが期待する形式に前処理します。テキストとオーディオ、テキストと画像など、プロセッサが処理できる入力モダリティの組み合わせはいくつかあります。

自動音声認識（ASR）タスクには、テキストとオーディオの両方の入力を処理できるプロセッサが必要です。データセットを読み込み、`audio` と `text` の列を確認してください（不要な他の列は削除できます）。

```py
from datasets import load_dataset

dataset = load_dataset("keithito/lj_speech", split="train")
dataset = dataset.map(remove_columns=["file", "id", "normalized_text"])
dataset[0]["audio"]
{'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
         7.3242188e-04,  2.1362305e-04,  6.1035156e-05], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
 'sampling_rate': 22050}

dataset[0]["text"]
'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'
```

事前学習済みモデルが要求するサンプリングレートに合わせて、サンプリングレートを再サンプリングすることを忘れないでください。

```py
from datasets import Audio

dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
```

プロセッサを読み込み、`array` と `text` の列を渡します。

```py
from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("openai/whisper-tiny")

def prepare_dataset(example):
    audio = example["audio"]
    example.update(processor(audio=audio["array"], text=example["text"], sampling_rate=16000))
    return example
```

`prepare_dataset` 関数を適用して、データセットの前処理を行います。プロセッサは、`audio` 列に対して `input_features` を、テキスト列に対して `labels` を返します。

```py
prepare_dataset(dataset[0])
```

