その他

【深層学習】AppleのAIMv2を使って分類モデルを作ってみた

その他
この記事は約6分で読めます。

はじめに

こんにちは。

最近の業務として、GPTモデルを活用してさまざまなツールを開発してきましたが、その過程で自分でモデルを構築してみたいという興味が強くなってきました。

そこで前々回の記事では、その第一歩として JaQuAD という自然言語処理用データセットを用い、質問応答モデルを作成してみました。

まだご覧になっていない方は、ぜひ以下のリンクからチェックしてみてください。

今回の目的

これまでの取り組みで、一般的に「LLM(大規模言語モデル)」と呼ばれるモデルの構築を試すことができました。

今回からは、少しだけステップアップして、マルチモーダルモデルの構築に順を追って触れていきたいと思います

マルチモーダルモデルの代表例として GPT-4oGPT-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

モデル内部の処理は以下のリンクから確認することができるのでぜひみてみてください!

GigaFile(ギガファイル)便
無料大容量 ファイル転送サービス GigaFile(ギガファイル)便!「3日~100日」選べる7種類のファイルの保持期限に加え、1ファイル300Gまでアップロード、共有可能!もちろん容量無制限でアンチウイルス装備。会員登録も不要です。

テスト

学習済みモデルを用いてテスト用画像を分類した結果を、以下に示します。(商標画像のため、実際の画像は掲載できません)

期待していた出力は ロゴ(Class_0) でしたが、結果は 製品(Class_1) に分類されました。

今回の誤分類について、以下のような要因が考えられます。

収集した学習サンプルは特に前処理をせずに利用したため、背景やノイズといった余計な情報を含んでいた可能性がありました。

また、各クラスの画像数が十分でなかったため、モデルがクラス境界をうまく学習できなかった可能性も示唆される結果となりました。

TOP : 1Class_1prob=0.8410
TOP : 2Class_0prob=0.1448
TOP : 3Class_2prob=0.0141
テスト結果

おわりに

いかがでしたでしょうか。

今回はAppleが発表したAIMv2というマルチモーダルモデルを使って、分類モデルを構築してみました。

一方でAIMv2の特徴をいかせていないので次回以降でAIMv2のマルチモーダルな機能についても触れていこうと思います。

参考URL

AIMv2
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
AppleのAIMv2で画像特徴量抽出しcocodatasetの画像セットで類似画像検索に挑戦 - Qiita
Appleが今週公開したAIMv2を使って画像検索システム(類似画像検索)を構築してみた はじめに まず、知ってる方いると思うが、anacondaとnotebook形式が大嫌いです。なので、これはnotebook形式に対応していないやり方です。 こんにちは、しゅんで...
GitHub - apple/ml-aim: This repository provides the code and model checkpoints for AIMv1 and AIMv2 research projects.
This repository provides the code and model checkpoints for AIMv1 and AIMv2 research projects. - apple/ml-aim