VGG16というConvolutional Neural Networkがあります。VGG16は224x224x3画素の画像を入力して、1000クラスの推定確率を出力するネットワークです。3x3のカーネルの畳み込みと2x2のプーリングを繰り返すことで、4096次元のベクトルを計算し、最後の全結合層で1000クラスの推定確率を計算します。


vgg16
(出典:VGG in TensorFlow


VGG16は深いネットワークなため、全体を再学習するには十分なデータが必要です。そのため、1000クラスに含まれていないオリジナルな画像を学習させようとした場合、画像の量が不足してうまく認識できません。

そこで、最後の全結合層だけを再学習するのが転移学習、最後の全結合層とその直前の畳み込み層を再学習するのがファインチューニングです。(VGG16のFine-tuningによる犬猫認識 (2)

なぜこれがうまくいくのかといえば、VGG16の前半が膨大な画像で学習しているため、画像に特化した特徴検出器になっているためです。最後の全結合層だけを見ると、やっていることは、VGG16が計算した4096次元のベクトルと、クラスごとの4096次元のベクトルの内積です。つまり、特徴空間でコサイン類似度を計算していることになります。

これより、新しいクラスを認識させたい場合、全体を再学習する必要はなく、クラスに固有の4096次元のベクトルを用意すれば十分ということになります。これを応用すると、データベース内の全ての画像に対してVGG16で計算した4096次元のベクトルをデータベースに格納し、ユーザから入力された画像に対してVGG16で計算した4096次元のベクトルとの内積を取るだけで、画像検索エンジンを作ることができます。(1時間で画像検索エンジンを作る

結局のところ、CNNはKL変換のような基底系を計算しているわけで、KL変換との違いは非直交であることと、非線形関数が入っていることであるといえます。

もちろん、新しいクラスの画像が加われば、最適な基底系は変化するため、全結合層だけでなく、もう一段上の畳み込み層まで含めて再学習すれば、より精度は向上します。

しかし、一見、再学習が必要そうな個人認証のような分野に対しても、再学習せずに特徴量の内積だけで実装可能というのは、可能性が広がって面白いのではないかと思います。

VGG16を使用した検索エンジンのデモとしては、KawaiiSearchがあります。リポジトリはblan4/KawaiiSearchです。ファッションECなどでも使用できそうです。

68747470733a2f2f692e696d6775722e636f6d2f653962707757592e706e67


68747470733a2f2f692e696d6775722e636f6d2f6444414a4375592e706e67

また、VGG16を使用した顔検索をabars/FaceSearchVGG16で実験中です。