VGG16における畳み込み層の特徴量の可視化
こんにちは、$@(ダラ~っと)です(๑Ò﹃ Ó๑)ゝ
今更感満載ですが、PC整理してたら過去にまとめた資料があったので、こっちに置いておこうと思います。
数年前のですが、当時は、DeepLearningの物体検出をやっていて、「畳み込みの計算は分かるけど、イメージ出来ん」って状況だったので試していたものになります。
(懐かしい・・・w)
VGG16における畳み込み層の特徴量の可視化
畳み込みニューラルネットワーク(CNN)が画像からどのようにして特徴を抽出しているのか。
はじめに
近年、人工知能(AI)が急速に発展してきています。
それを支える技術として、人間のタスクをコンピュータに学習させる機械学習の手法のひとつである、ディープラーニング(深層学習) が挙げられます。
ディープラーニングの技術は、人間の神経細胞(ニューロン) の仕組みを模したシステムであるニューラルネットワークがベースになっています。
ニューラルネットワークを多層にして用いることで、データに含まれる特徴を段階的に、より深く学習することが可能 になります。
多層構造を定義したニューラルネットワーク(モデル)に大量の画像やテキスト、音声データ等を学習データとして入力することで、モデルは学習データに含まれる特徴を各層で自動的に学習 していきます。
学習済みのモデルに入力データを与えると、学習した内容から結果を教えてくれます。
しかし、各層の働きはブラックボックスであり、各層でどのような特徴量として判断されているか分からない ことが多いです。
例えば、下の画像を見ると、ひと目でダチョウだとわかると思います。
人間は瞬時にどのような特徴があるかを特定し、過去の情報と照らし合わせてダチョウだと判断しています。
では、機械学習したモデルではどうでしょう?
正しく学習が出来ていると、この画像にはダチョウが写っていると判断することが可能となります。
今回は、学習済みモデル(VGG16)が、この画像からどのような特徴を抽出してダチョウだと判断しているのかを可視化してみます。
VGG16を選択した理由は、単純な構造ながら精度が良く、CNNの入門として良いモデルだと判断したためです。
検証は、下記を利用しました。
# | 項目 | 値 | バージョン |
---|---|---|---|
1 | 実行環境 | Google Colaboratory | - |
2 | 言語 | Python | 3.7.15 |
3 | ライブラリ | Tensorflow | 2.9.2 |
4 | ライブラリ | Keras | 2.9.0 |
5 | ライブラリ | seaborn | 0.11.2 |
6 | ライブラリ | Pillow | 7.1.2 |
VGG16とは
- ImageNetと呼ばれる大規模画像データセットで学習された16層(畳み込み13層、フル結合3層)からなる畳み込みニューラルネットワーク(CNN)です。
- CNNは、畳み込み層(Convolution)、プーリング層(Pooling)、全結合層(Full nected) の3種類で構成されるのが一般的です。
- 2014年のILSVRC(ImageNet Large Scale Visual Recognition Challenge)という画像分類のコンペティションで提案され、単純な構造ながら2位を獲得しました。
- VGG16では、入力画像(224px × 224px、RGB)を1,000のクラスに分類できます。
畳み込み層
畳み込み層では、複数のフィルタ(検出器)を用いて画像の特徴量を抽出します。
畳み込み演算では、「元画像の行列データ」と「フィルタの行列データ」に対して、下記のそれぞれ同じ位置にある数字を掛け算して全て足し合わせた数を計算します。
①:フィルタと同じサイズで区切った元画像の一部の行列
②:フィルタの行列
上記①を1pxずつズラしながら計算していきます。
このズラし幅を「ストライド」と呼びます。
(特徴を荒く捉えたい場合は、2px以上ズラす場合もあります)
入力画像のままで畳み込み演算を行うと、サイズが小さくなるため、畳み込み演算前に「パディング」(入力画像の周囲に「0」のデータを置く)を行います。
では、どのような計算を行っているかを解説します。
畳み込み演算の全体像(block1_conv1
の場合)パディング処理された画像に対して、複数のフィルタを適用し畳み込み(特徴抽出)されていきます。
ReLu関数は活性化関数と呼ばれるもので、負の値は0に、0以上の値はそのまま処理されます。
勾配消失問題の解消のため使用されることが多いですが、ここでは詳細については割愛します。
畳み込み演算例として、block1_conv1
での1個のフィルタを適用した場合について記述します。
下図のピンクの領域がフィルタを適用する領域になります。
1領域の計算が終わると、ピンクの領域をズラして計算し、最終的に畳み込み後出力が全て埋まります。
VGG16の畳み込み層は、下記の13層あります。下表の#1は、3px × 3pxのフィルタが64種類あることを示しています。
次のスライドに、VGG16の畳み込み層の全フィルタを記載します。様々な形状のフィルタがあり、フィルタ1個が1つの特徴を抽出します。
# | 畳み込み層 | 幅[px] | 高さ[px] | フィルタ数[種類] |
---|---|---|---|---|
1 | block1_conv1 | 3 | 3 | 64 |
2 | block1_conv2 | 3 | 3 | 64 |
3 | block2_conv1 | 3 | 3 | 128 |
4 | block2_conv2 | 3 | 3 | 128 |
5 | block3_conv1 | 3 | 3 | 256 |
6 | block3_conv2 | 3 | 3 | 256 |
7 | block3_conv3 | 3 | 3 | 256 |
8 | block4_conv1 | 3 | 3 | 512 |
9 | block4_conv2 | 3 | 3 | 512 |
10 | block4_conv3 | 3 | 3 | 512 |
11 | block5_conv1 | 3 | 3 | 512 |
12 | block5_conv2 | 3 | 3 | 512 |
13 | block5_conv3 | 3 | 3 | 512 |
VGG16のフィルタ可視化
3px × 3pxのフィルタですが、色や形が異なり多様な特徴を捉えられるようになっています。
例えば、block1_conv1
では64個のフィルタがあります。
畳み込み演算の一例を下記に示します。
説明のため、フィルタを大きく表示しています。(実際は3px × 3px)畳み込み後出力は、ヒートマップで表示しており、特徴が強くなる程、黒→赤→白に変化します。
-
サンプル1
このフィルタでは、白と黒のエッジの特徴を捉えられるため、ダチョウの輪郭を特徴として捉えられています。- フィルタ
- 畳み込み演算
- 畳み込み後出力(ヒートマップ)
- フィルタ
-
サンプル2
このフィルタでは、青色のエッジの特徴を捉えられるため、空が特徴として捉えられています。- フィルタ
- 畳み込み演算
- 畳み込み後出力(ヒートマップ)
- フィルタ
VGG16の特徴量可視化
いよいよ、冒頭で示したダチョウの画像から、VGG16がどのような特徴を抽出しているのかを画像を交えて見ていきます。
層が深くなるのに従って、画像は小さくなり、特徴も大まかになっていきます。フィルタの数も多いため、抽出した特徴の値(特徴強度)の中から平均強度が高い5枚を抽出して見ていきます。
特徴強度はヒートマップで表示しており、特徴が強くなる程、黒→赤→白に変化します。
では、畳み込み層の各層で抽出された特徴を見ていきましょう。
ダチョウ
ダチョウ block1_conv1~2
block1では、画像のエッジを特徴として捉えていて、個別の部分よりかは全体的な特徴を抽出しているようです。この段階では、まだ何が写っているか判断は難しそうです。
元画像:
ダチョウ block2_conv1~2
block2では、block1と同様に画像のエッジを特徴として捉えています。block1と比較すると個別の部分のエッジが強く抽出されているようです。ダチョウの輪郭が浮き彫りになっているのがわかるかと思います。人間であればこれくらいあれば判断できそうです。
元画像:
ダチョウ block3_conv1~3
block3では、block1〜2とは異なり、一部の特徴を捉え始めてきました。全体的な画像のエッジを捉えているようにも見えますが、画像の中でも一部の特徴をより抽出しています。
元画像:
ダチョウ block4_conv1~3
block4では、block3とほとんど同じような特徴となっています。しかし、抽出した特徴がより強くなっている部分が表れ始めています。
元画像:
ダチョウ block5_conv1~3
block5では、一気に特徴が変わり、固有の特徴が強く抽出されています。ダチョウの足の付け根や胴体、首の特徴が強く抽出されています。これらの特徴を元にダチョウと判断しているようです。ダチョウは他の動物より、足の付け根や首の長さに特徴があるので人間の感覚とも一致します。
元画像:
以上が、VGG16がどのような特徴を抽出してダチョウと判断しているかがわかりました。
続いて、鶴、ペンギン、ライオンも可視化してみます。
「ダチョウと鶴は似ているので同じような特徴が出るのでは?」と思いましたが、鶴の場合は、お尻や胴体、頭の部分に強く特徴が出ていました。
おそらく、ダチョウと鶴では色が違うため、色の違いにより捉えられる特徴が変わっているものと考えられます。
ペンギンとライオンもそれぞれに特徴が抽出されています。ライオンの画像は草木があり検出は難しそうに見えますが、ライオンの特徴を上手く捉えられています。
鶴
鶴 block1_conv1~2
全体的な特徴を抽出しています。色の変化が少ない画像のため、広い範囲で特徴が捉えられています。
元画像:
鶴 block2_conv1~2
個別の部分のエッジが強く抽出されています。
鶴の輪郭が上手く捉えられています。
元画像:
鶴 block3_conv1~3
一部の部分の特徴をより抽出しています。
元画像:
鶴 block4_conv1~3
抽出した特徴がより強くなっている部分が表れ始めています。
元画像:
鶴 block5_conv1~3
固有の特徴が強く抽出されています。ダチョウとは異なり、お尻や胴体、頭の部分に強く特徴が抽出されています。色の違いによる影響が出ていると考えられます。
元画像:
ペンギン
ペンギン block1_conv1~2
全体的な特徴を抽出しています。色の変化が少ない画像のため、広い範囲で特徴が捉えられています。
元画像:
ペンギン block2_conv1~2
個別の部分のエッジが強く抽出されています。2匹いても輪郭がしっかりと捉えられています。
元画像:
ペンギン block3_conv1~3
一部の部分の特徴をより抽出しています。
元画像:
ペンギン block4_conv1~3
抽出した特徴がより強くなっている部分が表れ始めています。
元画像:
ペンギン block5_conv1~3
固有の特徴が強く抽出されています。お腹や足、頭に特徴があるようです。2匹いても同じような特徴が抽出されているのがわかります。
元画像:
ライオン
ライオン block1_conv1~2
全体的な特徴を抽出しています。同系色の色が多いため、広い範囲で特徴が捉えられています。
元画像:
ライオン block2_conv1~2
個別の部分のエッジが強く抽出されています。草木があるため、エッジは様々な箇所で検出されています。
元画像:
ライオン block3_conv1~3
一部の部分の特徴をより抽出しています。
元画像:
ライオン block4_conv1~3
抽出した特徴がより強くなっている部分が表れ始めています。まだ、ライオン固有の特徴の捉え方が甘いように見えます。
元画像:
ライオン block5_conv1~3
固有の特徴が強く抽出されています。この層でライオン固有の特徴が捉えられました。胴体や顔(毛)に特徴があるようです。
元画像:
おわりに
畳み込み層の、最初の層では全体的な特徴を捉え、層が段々と深くなるにつれて個別の特徴を捉えていくことがわかりました。
今回は、画像分類を行うCNNであるVGG16を使用しました。業務に適用するという観点では、画像分類より物体検出や物体追跡の技術の方が夢が広がります。
- 画像分類:画像内の特定物から画像を分類する技術 ・・・画像を1つに分類
- 物体検出:画像内の物体の位置と種類を特定する技術・・・画像内の複数の物体を検出
- 物体追跡:動画内の複数の特定の物体を追跡する技術・・・時間経過しても同一物体として追跡
しかし、物体検出や物体追跡といった別の技術であっても畳み込み層を使用する場合が多くあります。
今回行った特徴量を可視化する過程での知識や気付きは、他の技術を用いる場合であっても、どのような画像があれば特徴を捉えやすいか(=モデルの精度を上げる)を考える上で、重要な知見となることでしょう。
Discussion