はじめに
こんにちは。
最近の業務として、GPTモデルを活用してさまざまなツールを開発してきましたが、その過程で自分でモデルを構築してみたいという興味が強くなってきました。
そこで前々回の記事では、その第一歩として JaQuAD という自然言語処理用データセットを用い、質問応答モデルを作成してみました。
まだご覧になっていない方は、ぜひ以下のリンクからチェックしてみてください。
今回の目的
これまでの取り組みで、一般的に「LLM(大規模言語モデル)」と呼ばれるモデルの構築を試すことができました。
今回からは、少しだけステップアップして、マルチモーダルモデルの構築に順を追って触れていきたいと思います
マルチモーダルモデルの代表例として GPT-4o や GPT-5 がありますが、調べてみると AIMv2 という選択肢もあることが分かりました。
今回はAIMv2そのものを触れてみることを目的に、分類モデルの構築をしてみます。
AIMv2とは?
AIMv2 とは、Apple 社が 2024 年に発表した大規模マルチモーダルモデルです。
ただし、このモデルは GPT-4o とは異なり、基盤に 画像エンコーダー を採用しているため、入力データはテキストなどの自然言語ではなく、画像データ が中心となります。
さらに AIMv2 では、Transformer を画像認識に応用した Vision Transformer (ViT) が利用されており、画像を構成する局所的なオブジェクトのまとまりに依存せず、画像全体の特徴を柔軟に学習できる という特徴があります。
データセット
今回の入力データとして、以下の 3 種類の画像を収集し、下記のような3 クラス分類用のデータセットを作成しました。
・class_0:ロゴ
・class_1:製品
・class_2:キャラクター

また、各画像は内部処理の段階で 224×224 ピクセルの正方形にリサイズされるように設定しています。これにより、入力サイズを統一し、モデルが安定して学習できるようにしました。
モデル定義
今回の分類モデルは、AIMv2 の Vision モデルをベースとして構築しました。
AIMv2 を利用する際に欠かせないのが AutoProcessor
です。これを使うことで入力した画像を モデルが期待する形式(リサイズ・正規化・テンソル化)に自動的に変換する役割を持っています。
そして変換された画像はエンコーダに入力され、1024 次元の特徴ベクトルとして出力されます。
この特徴をそのまま分類に用いるのではなく、正則化や変換を加えたうえで最終的にクラス分類を行うように設計しています。
from transformers import AutoProcessor, Aimv2VisionModel
import numpy as np
import torch
import torch.nn as nn
classesSize = 3
class build_model(nn.Module):
def __init__(self, classesSize):
super().__init__()
self.processor = AutoProcessor.from_pretrained("apple/aimv2-large-patch14-224")
self.model = Aimv2VisionModel.from_pretrained("apple/aimv2-large-patch14-224") # 出力埋め込み次元は 1024
self.feat_dim = self.model.config.hidden_size
self.bn = nn.BatchNorm1d(self.feat_dim)
self.dropout = nn.Dropout(0.5)
self.classifier = nn.Linear(self.feat_dim, classesSize)
def encode(self, images):
inputs = self.processor(images=images, return_tensors="pt")
pixel_values = inputs["pixel_values"].to(self.model.device, dtype=self.model.dtype)
out = self.model(pixel_values=pixel_values, return_dict=True)
feats = out.pooler_output if out.pooler_output is not None else out.last_hidden_state[:, 0, :]
return feats # [B, 1024]
def forward(self, images):
feats = self.encode(images)
x = self.bn(feats)
x = self.dropout(x)
logits = self.classifier(x)
return logits
モデル内部の処理は以下のリンクから確認することができるのでぜひみてみてください!

テスト
学習済みモデルを用いてテスト用画像を分類した結果を、以下に示します。(商標画像のため、実際の画像は掲載できません)
期待していた出力は ロゴ(Class_0) でしたが、結果は 製品(Class_1) に分類されました。
今回の誤分類について、以下のような要因が考えられます。
収集した学習サンプルは特に前処理をせずに利用したため、背景やノイズといった余計な情報を含んでいた可能性がありました。
また、各クラスの画像数が十分でなかったため、モデルがクラス境界をうまく学習できなかった可能性も示唆される結果となりました。
TOP : 1 | Class_1 | prob=0.8410 |
TOP : 2 | Class_0 | prob=0.1448 |
TOP : 3 | Class_2 | prob=0.0141 |
おわりに
いかがでしたでしょうか。
今回はAppleが発表したAIMv2というマルチモーダルモデルを使って、分類モデルを構築してみました。
一方でAIMv2の特徴をいかせていないので次回以降でAIMv2のマルチモーダルな機能についても触れていこうと思います。
参考URL

