Image Captioning Model
モデル概要
モデル特徴
モデル能力
使用事例
🚀 イラスト付きのトランスフォーマーモデルを用いた画像キャプション生成
このプロジェクトは、Vision Transformersを利用して画像の理解とキャプション生成を行います。コンピュータビジョンとTransformersの組み合わせは、自然言語処理タスクで有望な結果を示しており、本プロジェクトではそれを画像キャプション生成に応用しています。
📚 目次
1. はじめに
このリポジトリでは、画像に人間らしい説明を生成する画像キャプション生成という難しい問題に取り組んでいます。Vision Transformersを利用することで、画像の理解とキャプション生成の向上を目指しています。コンピュータビジョンとTransformersの組み合わせは、様々な自然言語処理タスクで有望な結果を示しており、本プロジェクトではそれを画像キャプション生成に応用しています。
2. 使用したデータセット
MS COCOデータセットについて
Microsoft Common Objects in COntext (MS COCO) データセットは、シーン理解のための大規模なデータセットです。このデータセットは、物体検出、セグメンテーション、キャプション生成アルゴリズムのトレーニングとベンチマークに一般的に使用されます。
データセットについての詳細は、ウェブサイト、研究論文、またはこのページの末尾の付録セクションで読むことができます。
3. インストール
COCO APIのインストール
- このリポジトリをクローンします: https://github.com/cocodataset/cocoapi
git clone https://github.com/cocodataset/cocoapi.git
- coco APIをセットアップします (こちらのREADMEにも記載されています)
cd cocoapi/PythonAPI
make
cd ..
- 特定のデータをこちらからダウンロードします: http://cocodataset.org/#download (以下に説明)
-
アノテーションの下で、以下をダウンロードします:
- 2017 Train/Valアノテーション [241MB] (captions_train2017.jsonとcaptions_val2017.jsonを抽出し、それぞれcocoapi/annotations/captions_train2017.jsonとcocoapi/annotations/captions_val2017.jsonの場所に配置します)
- 2017 テスト画像情報 [1MB] (image_info_test2017.jsonを抽出し、cocoapi/annotations/image_info_test2017.jsonの場所に配置します)
-
画像の下で、以下をダウンロードします:
- 2017 トレーニング画像 [83K/13GB] (train2017フォルダを抽出し、cocoapi/images/train2017/の場所に配置します)
- 2017 検証画像 [41K/6GB] (val2017フォルダを抽出し、cocoapi/images/val2017/の場所に配置します)
- 2017 テスト画像 [41K/6GB] (test2017フォルダを抽出し、cocoapi/images/test2017/の場所に配置します)
環境の準備
注意: このプロジェクトはMacで開発されました。WindowsとLinuxでも少しの変更で実行できます。
- リポジトリをクローンし、ダウンロードしたフォルダに移動します。
git clone https://github.com/CapstoneProjectimagecaptioning/image_captioning_transformer.git
cd image_captioning_transformer
- 新しい環境
captioning_env
をPython 3.7で作成してアクティブ化します。インストールを進めるように促された場合 ((Proceed [y]/n)
)、y と入力します。
conda create -n captioning_env python=3.7
source activate captioning_env
この時点で、コマンドラインは (captioning_env) <User>:image_captioning <user>$
のように表示されるはずです。(captioning_env)
は環境がアクティブ化されたことを示しており、さらなるパッケージのインストールを続けることができます。
- コードを実験する前に、このプロジェクトをサポートするために必要なすべてのライブラリと依存関係がインストールされていることを確認する必要があります。主にPython3.7+、PyTorchとそのtorchvision、OpenCV、Matplotlibが必要です。依存関係は以下のコマンドでインストールできます。
pip install -r requirements.txt
- リポジトリに戻ります。(また、この時点でソース環境はまだアクティブ化されている必要があります。)
cd image_captioning
- 以下のコマンドを使用してノートブックのディレクトリを開きます。すべてのプロジェクトファイルがローカル環境に表示されます。最初のノートブックを開き、指示に従ってください。
jupyter notebook
- プロジェクトのノートブックを開いたら、
Kernel > Change Kernel > captioning_env
をクリックして、正しいcaptioning_env
環境にいることを確認してください。
4. 使用したモデルと技術
このプロジェクトで使用されている方法と技術は以下の通りです:
- Vision Transformers (ViTs)
- アテンションメカニズム
- 言語モデリング
- 転移学習
- 画像キャプション生成の評価指標 (例: BLEU、METEOR、CIDEr)
このプロジェクトはPythonで実装されており、以下のライブラリを使用しています:
- PyTorch
- Transformers
- TorchVision
- NumPy
- NLTK
- Matplotlib
概要
このプロジェクトでは、トランスフォーマー [3] ベースのモデルを使用して、画像の説明を生成します。このタスクは画像キャプション生成タスクとして知られています。研究者は、この問題にアプローチするために多くの方法論を使用しています。その中の1つがエンコーダ - デコーダニューラルネットワーク [4] です。エンコーダは、ソース画像を表現空間に変換し、次にデコーダはエンコードされた空間からの情報を自然言語に変換します。エンコーダ - デコーダの目標は、画像から説明を生成する際の損失を最小化することです。
MD Zakir Hossainらによる調査 [4] で示されているように、エンコーダ - デコーダアーキテクチャを使用するモデルは、主にLSTM [5] に基づく言語モデルで構成されており、CNNから受け取ったエンコードされた画像をデコードします (図1を参照)。LSTMの長いシーケンスに対する制限と、トランスフォーマーが機械翻訳やその他のNLPタスクで成功したことが、機械ビジョンでの利用に注目を集めています。Alexey Dosovitskiyらは、古典的なトランスフォーマーエンコーダに基づく画像分類モデル (ViT) を導入し、良好なパフォーマンスを示しています [6]。Wei Liuらは、ViTに基づいて、エンコーダ - デコーダトランスフォーマーを使用した画像キャプション生成モデル (CPTR) を提案しています [1]。ソース画像は、シーケンスパッチとしてトランスフォーマーエンコーダに入力されます。したがって、画像キャプション生成問題を機械翻訳タスクとして扱うことができます。
図1: エンコーダ - デコーダアーキテクチャ
フレームワーク
CPTR [1] は、画像を
からパッチのシーケンス
に変換する画像パッチャーで構成されています。ここで、N はパッチの数、H、W、C はそれぞれ画像の高さ、幅、チャネル数 (C = 3)、P はパッチの解像度、E は画像埋め込みのサイズです。次に、位置埋め込みが画像パッチに追加され、これが12層の同一のトランスフォーマーエンコーダの入力となります。最後のエンコーダ層の出力は、4層の同一のトランスフォーマーデコーダに入力されます。デコーダは、正弦波位置埋め込みを持つ単語も受け取ります。
CPTRエンコーダは、事前学習されたViTの重みで初期化されます [1]。私は初期化と画像位置埋め込みを省略し、Resnet101ネットワークから抽出された特徴マップを使用して、画像パッチャーに画像埋め込みモジュールを追加しました [7]。エンコーダ層の数は2に減らされました。Resenet101については、最後の2層と画像分類に使用される最後のソフトマックス層を削除しました。
もう1つの変更は、エンコーダ側で行われます。フィードフォワードネットワークは、2つの畳み込み層とその間のRELU活性化関数で構成されています。エンコーダ側は、画像部分のみを扱い、持っている特徴の相対位置を利用するのに有益です。モデルアーキテクチャについては、図2を参照してください。
図2: モデルアーキテクチャ
トレーニング
トランスフォーマーデコーダの出力は、1つの全結合層に入力され、これにより、前のトークンが与えられた場合に、シーケンス内の各トークンに対する確率分布
(、k は語彙サイズ)
が提供されます。
私は、目標の真値
()
を与えられたクロスエントロピー損失を使用してモデルをトレーニングしました。ここで、T はシーケンスの長さです。また、エンコーダ - デコーダアテンションの高い重みを罰するために、二重確率的アテンション正則化 [8] をクロスエントロピー損失に追加しました。この項は、シーケンス全体のアテンション重みの合計がおおよそ1に等しくなるように促します。これにより、モデルはキャプションを生成する際に画像の特定の部分に集中するのではなく、画像全体を見るようになり、より豊かで説明的なテキストが生成されます [8]。
損失関数は以下のように定義されます:
ここで、D はヘッドの数、L は層の数です。
私はAdamオプティマイザを使用し、バッチサイズは32に設定しました。モデルのサイズは、設定ファイル code/config.json
で確認できます。使用される評価指標は、Bleu [9]、METEOR [10]、およびGleu [11] です。
私はモデルを100エポックトレーニングし、追跡される評価指標 (bleu - 4) が20連続エポックで改善しない場合には停止基準を設定しました。また、追跡される評価指標 (bleu - 4) が10連続エポックで改善しない場合には、学習率を0.25%減少させます。モデルの検証分割に対する評価は、2エポックごとに行われます。
単語埋め込みの重みは、事前学習されたGlove埋め込み [12] で初期化されます。単語埋め込みは10エポック間凍結されます。Resnet101ネットワークは、最初から調整されます。
推論
テスト分割の画像のキャプションを生成するために、サイズ5のビームサーチが使用されます。生成は、画像と "文の始まり" の特殊トークンを入力することで開始されます。次に、各反復で、スコアが最も高い5つのトークンが選択されます。生成反復は、"文の終わり" が生成されるか、最大長制限に達するまで続きます。
5. コード説明の手順
1. データの読み込みと前処理
- アノテーションの読み込み: コードは最初に、COCO 2017データセットから画像 - キャプションのペアを読み込みます。画像と対応するキャプションを含むJSONファイル (captions_train2017.json) を使用します。
- 画像とキャプションのペアリング: 次に、コードは画像ファイル名とそれぞれのキャプションをペアにするリスト (img_cap_pairs) を作成します。
- キャプションのデータフレーム: データをpandas DataFrameに整理して、操作を容易にします。各画像ファイルへのパスも作成します。
- データのサンプリング: 70,000の画像 - キャプションペアがランダムにサンプリングされ、すべてのデータを必要とせずにデータセットを管理可能なサイズにします。
2. テキストの前処理
- コードは、キャプションをモデル用に前処理します。テキストを小文字に変換し、句読点を削除し、複数の空白を単一の空白に置き換え、[start] と [end] トークンを追加して、各キャプションの始まりと終わりをマークします。
3. トークン化
- 語彙の設定: 語彙サイズ15,000語と最大トークン長40のトークナイザ (TextVectorization) が作成されます。キャプションをトークン化し、整数のシーケンスに変換します。
- 語彙の保存: 語彙はファイルに保存され、再トレーニングせずに後で再利用できます。
- 単語とインデックスのマッピング: word2idxとidx2wordは、単語をインデックスに、インデックスを単語に変換するマッピングです。
4. データセットの準備
- 画像 - キャプションのマッピング: 辞書を使用して、各画像がそのキャプションのリストにマッピングされます。次に、画像がシャッフルされ、トレーニング - 検証分割が行われます (トレーニングに80%、検証に20%)。
- TensorFlowデータセットの作成: load_data関数を使用して、画像がリサイズされ、前処理され、トークン化されたキャプションがテンソルとして作成されます。これらのテンソルは、トレーニングと検証のためにバッチ化され、メモリ効率を向上させ、並列処理を可能にします。
5. データ拡張
- 基本的な画像拡張 (RandomFlip、RandomRotation、RandomContrast) がトレーニング画像に適用され、モデルが各画像のわずかに変更されたバージョンから学習することで、より良く汎化できるようにします。
6. モデルアーキテクチャ
CNNエンコーダ:
- ImageNetで事前学習されたInceptionV3モデルが、画像を処理して特徴を抽出するために使用され、これがトランスフォーマーの入力となります。
トランスフォーマーエンコーダ層:
- マルチヘッド自己アテンションと正規化層を持つTransformerEncoderLayerが、画像特徴間の関係を学習します。
埋め込み層:
- この層は位置埋め込みを追加し、モデルがキャプション内の単語の順序を捉えることを可能にします。
トランスフォーマーデコーダ層:
- TransformerDecoderLayerがキャプションを生成します。マルチヘッドアテンション、フィードフォワードニューラルネットワーク、およびドロップアウトが含まれ、過学習を防止します。マスキングにより、トークンが次の単語を予測する際に「未来のトークン」を「見る」ことができなくなります。
7. 画像キャプション生成モデルクラス
- ImageCaptioningModelクラスは、エンコーダ、デコーダ、およびCNNエンコーダを統一されたモデルにまとめ、トレーニングと推論を行います。
- 損失と精度の計算: カスタム関数が、トークン化されたキャプションと生成された予測を使用して、モデルのパフォーマンスを追跡します。
8. トレーニング
- 損失関数: スパースカテゴリカルクロスエントロピーが、予測されたトークンと実際のトークンの差を計算するために使用され、パディングトークンは除外されます。
- 早期停止: 検証損失を監視し、検証セットでのパフォーマンスが改善しなくなった場合にトレーニングを停止します。
- モデルのコンパイルとトレーニング: モデルはコンパイルされ、最適化され、早期停止を伴って複数のエポックにわたってトレーニングされます。
9. 評価とキャプションの生成
- generate_caption関数は、新しい画像のキャプションを生成します。画像をモデルに入力し、トークンを反復的に予測し、各トークンを生成されたシーケンスに追加します。
📄 ライセンス
このプロジェクトは、Apache 2.0ライセンスの下で公開されています。








