ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

イメージキャプショニング入門

研究開発部の浅野です。深層学習で熱い分野の一つに、自動で画像の説明文を作成するイメージキャプショニングがあります。画像を解釈するコンピュータビジョンと適切な言語表現を生成する自然言語処理、どちらも手掛けたい!という欲張りなあなたにぴったりです。保育園では日誌や連絡帳などたくさんの書類作業がありますが、写真を一枚撮っておけば簡単な情景描写までは機械で済ませてくれるようになると、そうした書類作成の負荷が軽減できるかもしれません。

基本的なアプローチ

f:id:unifa_tech:20190823120903j:plain:w450
イメージキャプショニングを行うネットワークの基本構造

対象の画像をConvolutional Neural Network(CNN)に入力して特徴空間でのベクトルに変換し、作成途中の説明文(単語列)をRecurrent Neural Network (RNN)に入力して同様に特徴ベクトルにする。それらを全結合ネットワーク(Fully Connected Network, FC)に入力して次の単語を推定する、というのが基本的な流れです。

学習の実際

f:id:unifa_tech:20190823122511j:plain:w250:left

例えばこの画像(Source: PhotoAC)に対して「サングラスをかけた赤ちゃんが水辺でくつろいでいる」という説明文を生成するように学習を行う場合、まず画像をCNNに、文の開始を意味する単語をRNNに入力し、出力される単語が「サングラス」になるように各ネットワークの重みを再計算します。

次のステップでは、CNNへの入力は変わらず、RNNへの入力は「サングラス」にします。その出力が「を」になるようにネットワークの重みを修正します(下図)。このようにしていろいろな画像に対して正しい文を生成するようなモデルを作成すべく、たくさんの画像と説明文の正解データをもとに学習を行っていきます。

f:id:unifa_tech:20190823125144j:plain:w550
ネットワークの学習における入出力の例

実装

基本の構造はかなりシンプルなのでKerasによるモデル部分の記述も下記のように簡単です。今回は学習時間を短縮するため、CNN部分にはImageNetで学習済みのInceptionV3を使って事前に各画像の特徴ベクトルを作成しました。RNN部分にはLSTM(Long Short-Term Memory)を使用しています。学習用のデータにはFlickr8kを使いました。

from keras.layers import Input, Dense, LSTM, Embedding, Dropout
from keras.layers.merge import concatenate

def define_model(vocab_size, max_length):
    #photo feature extractor
    inputs1 = Input(shape=(2048, ))
    fe1 = Dropout(0.5)(inputs1)
    fe2 = Dense(256, activation='relu')(fe1)

    #sequence model
    inputs2 = Input(shape=(max_length, ))
    se1 = Embedding(vocab_size, 256, mask_zero=True)(inputs2)
    se2 = Dropout(0.5)(se1)
    se3 = LSTM(256)(se2)
    
    #decoder model
    decoder1 = concatenate([fe2, se3])
    decoder2 = Dense(256, activation='relu')(decoder1)
    outputs = Dense(vocab_size, activation='softmax')(decoder2)
    
    model = Model(inputs=[inputs1, inputs2], outputs=outputs)
    model.compile(loss='categorical_crossentropy', optimizer='adam')
        
    return model

結果

f:id:unifa_tech:20190823134658j:plain:w250:left

学習の様子(左)を見ると、学習時の損失(青線)は順調に下がっていますが、評価時の損失(橙線)はEpochが進むとすぐに下げ止まっています。今回は非常に単純な構成かつCNN部分も学習済みのものを使って重みの更新をしていないため、それほど汎化性能がよくないのはやむを得ないところです。

f:id:unifa_tech:20190823122323j:plain:w350:right

学習に使用していない画像(Source: COCO)で実際にどのような説明文が生成されるかみてみましょう(右図)。画像の上部にある"man in red shirt is riding bike on the street"がモデル自動でつけた説明です。当たらずとも遠からず、という感じですね。

まとめ

イメージキャプショニングの大まかな構成と流れについて見てきました。画像(や動画)と言語が交わる分野には、イメージキャプショニングの他にもビデオキャプショニング、動画のアクション理解、ビジュアル質問応答、映像要約など、保育の世界でも役に立つ可能性がある技術がたくさんあります。引き続き注目していきたいと思います。