Special applications: Face recognition & Neural style transfer
CouseraのDeepLearningのコース受講メモ. CNNのコースの最後
Face Recognition
What is face recognition?
face recognitionとして扱う問題は大きく分けて2つあり,顔認証と顔認識である.
顔認証はカメラで撮った顔画像とIDを元に,提示されたIDの所有者がその顔の人かどうかを判定する. IDを元にシステムから顔画像を持ってきて,撮影された顔がシステムから持ってきた画像と同一人物かそうでないかを判定する. 撮影された画像1に対して,システムが持っている画像1が正しいかを判定するタスクであり,後述の顔認識と比べると比較的簡単.
顔認識は,カメラで撮った画像が,システムに格納されているどの人物かを当てる.顔認証とは異なり,IDは存在しない. 撮影された画像1に対して,システムが保持するK人の顔画像と比較し,K+1(いずれでもないを含める)にクラスわけする. 顔認識は顔認証に比べて難しい.
One Shot Learning
従業員の入退ゲートの制御にシステムを用いたいが,そのシステムに組み込むモデルの学習に使えるデータは多くないはず.とある従業員の顔画像なんて1つしか得られないこともある.そのため,通常のCNNだと教師データが足りずにうまく動作しない.
これをうまくいかせるために,考え方を変える. d(image1, image2)=画像がどの程度異なるかを出力する関数を学習させることで,これを実現する. d(A,B)は大きな値を,d(A,A')は小さな値を出力するような関数を学習させておくことで,システムが保持する従業員の写真と,撮影した写真を比較してその二つが同一人物であるかどうかの評価値が得られる.
関数dの学習は必ずしも識別したい従業員の写真がなくても可能で,学習済みのモデルを新たな従業員に適用してもうまく動作する.
具体的な方法を次の章で説明する.
Siamese Network
CNNで得られる層の途中の表現を取り出して,それを特徴量としてエンコーディングされたベクトルと呼ぶ(図1).
このエンコーディングされた特徴量を比較したい画像についてそれぞれ計算し,その距離(L2ノルム)を計算することでどの程度似ているかを明らかにする(図2).
同じ人の画像であればL2ノルムは小さく,異なる人の画像であればL2ノルムは大きくなる.
Triplet Loss
特徴量を適切にエンコーディングできるCNNはどのように学習するべきか?を説明する.
学習のための損失関数としてTriplet損失を使う. Tripletとは「3つ」のという意味で,認識対象の画像(Anchor)と認識対象と同一人物の画像(Positive)と異なる人物の画像(Negative)の3つのセットを用いて定義される損失である.
Triplet損失を図3に示す.
左辺のノルムは「同一人物の画像をエンコーディングした際のL2ノルム」であり,右辺が「異なる人物の画像をエンコーディングした際のL2ノルム」である. このノルムについて「同一人物の画像をエンコーディングした際のL2ノルム」が「異なる人物の画像をエンコーディングした際のL2ノルム」よりα以上小さくなるようにするという制約である.なおαはhyper-parameterである.
これを規範としてCNNのモデルを学習し,エンコーディングのためのネットワークを学習する.
最終的にはこのモデルを用いて入力と比較対象をエンコーディングし,そのL2ノルムが閾値を越えなければ同一人物であると判定したりする.
Face Verification and Binary Classification
手動で閾値を決める代わりに,エンコーディングされた特徴量ベクトルを用いてロジスティック回帰で判定するような方法もある.
Neural Style Transfer
What is neural style transfer?
とある画像を,別の画像のスタイルに変換して描写するタスクのことをneural style transferという.
撮影した画像を,例えばゴッホの絵画っぽくすることができたりする.
What are deep ConvNets learning?
neural style transferはCNNのモデルのとある特徴を活用して実現されている. ここではまず,その特徴を説明する.
CNNのネットワークについて,浅い層と深い層では学習する内容にどんな違いがあるのか?という特徴だ.
浅い層では,画像のプリミティブな特徴(例えばエッジや平面など)を学習する.
深い層ではそれらを組み合わせてより複雑な特徴(例えば人の顔や車の形など)を学習する.
簡単なイメージを図4に示す.
これらの特徴を用いて.neural style transferが実現される.
Cost Function
neural style transferは以下の手順で行われる.
まず,入力画像C(変換したい画像)とスタイル画像S(こういうスタイルにしたいと思った画像)の2つをえる.次に,出力画像G(入力画像をスタイル画像のスタイルに変換した画像)の候補としてランダムに生成された画像を作る.
次に,ランダムに生成された画像と入力画像,スタイル画像を比較し,後述するコスト関数を計算する.
さらに,勾配法を用いて,コストを下げるようにランダム画像を更新する.
定められた学習回数だけランダム画像を更新し続けて,最終的に出力画像をえる. この時,出力画像はランダムに生成されてから,コストを下げる方向に更新され続け,結果として入力画像に近く,スタイル画像のスタイルに近い画像となる.
この時のコスト関数を図5に示す.
JContentとJStyleについては次の章とその次の章で説明する.
αとβはhyper-parameterである.
ランダム画像は勾配法を用いて図6のように更新される.
Content Cost Function
JContentについて.
JContentはすでに学習されているCNNに入力画像Cと出力画像Gを入力し浅すぎず深すぎないレイヤーのアクティベーションを用いて計算する(図7).
比較的浅いレイヤーのアクティベーションを選んでいるため,プリミティブな特徴(エッジが立っているとか平面であるとか)が選択的に使われている.そのためこの値が小さければ,CとGは「同じようなものが写っている」ということができる.
Style Cost Function
次に,出力画像Gのスタイルをスタイル画像Sに近づけるためのコスト関数について説明する.
これには,スタイル関数Gkkを用いる. スタイル関数はCNNの畳み込み層について,チャネル方向に相関を計算したものである(図8).
これは,異なる特徴(エッジが立っていたり平面だったりなど)がいかに同時に現れたり同時には現れなかったりするかといった情報であり,大まかにいうと画像のスタイルを代表する値になる.
このスタイル関数を用いて,レイヤーlでのJStyleを図9と表す.
さらに,JStyleは各レイヤーで得られたJStyleを任意に加重して足し合わせて使うことができる(図10).
λは任意の加重の値でありhyper-parameterである.
これがJStyleの定義である.
このJStyleと図7のJContentを用いて図5のコスト関数を計算することで,主力画像Gに対する勾配法を実行することができ,これによって画像Cをスタイル画像Sに似せた出力画像Gが得られるわけである.
1D and 3D Generalizations
これまで2次元の画像についてCNNを見てきたが,1Dや3Dなどのデータに対してもCNNを適用することは可能.詳細は割愛.
おわり.