Chapter 02

画像認識の基礎理論

2lu3
2lu3
2022.02.18に更新

CNN(Convolutional Neural Network)と他の深層学習の違い

CNN=画像認識用の深層学習というイメージでOKです。

CNNには以下の特殊な層があります。

  • Convolution 層
  • Pooling 層

この層が中間層にいくつもあることで、画像の特徴をつかみやすくなります。

それに加えて、通常の深層学習と同じ

  • Fully Connected層

があります。

人間はどのようにして見ているのか

まず、人間の目が、どういう仕組みで物体を認識しているのかを説明していきます。なぜなら、CNNと目の仕組みには共通している部分があるからです。ちなみに、ここで書いている情報は、簡略化のために生命科学としては正確な表現でない部分が多く存在しているので、ご注意ください。

網膜と視細胞

人間の眼球の底には、網膜があります。外から入ってきた光は水晶体を通り、網膜に当たります。そして、網膜の中では最終的に視細胞(図の青色の四角や三角)が光の信号を電気信号に変換しています。つまり、視細胞1つ1つが光を受け取るセンサーとなっています。

目が光として受け取る情報を画像に例えるなら、視細胞はピクセル1つ1つに対応しています。ピクセルとは、上の画像のように、画像を細かいエリアに分割したものです。

さて、目はピクセル1つ1つの情報をそのまま脳に送っているわけではありません。視細胞には、明るさを感知する桿体細胞が1億2000万個、色を認識する錯体細胞が650万個ありますが、網膜の情報を脳に伝える神経は120万個程度しかありません[1]。そのため、目は情報の削減を行っています。

脳に送るための情報の削減

まず、受容野というピクセルに対応する視細胞が複数集まったエリアが存在します(下の図の左側)。光が視細胞を刺激すると、その受容野に特有のパターンに従って受容野を刺激します。このパターンについては後述します。視細胞→受容野→脳という順番に電気信号が伝わり、視細胞が刺激を受けても、受容野のパターンによっては受容野は刺激されず脳に「光を受け取った」という状況が伝わらないこともあります。逆に言えば、受容野はある特定のパターンの光刺激のみ受け付けるセンサーと言っても良いです。

結論から言うと、受容野は特定の方向の線にのみ反応するようなパターンを持っています。上の図の右側のように、受容野の中で細長い真ん中のエリアの視細胞に光が来ると受容野全体が+(興奮状態)になります。そして、両側の小さなエリアにある視細胞に光が来ると受容野全体が-(抑制状態)になります。

右の3x2の図は、空白の部分に光が来ていて斜線の部分には光が来ていない状態を表しています。赤い四角で囲った光の当たり具合では、+の視細胞のみ刺激を受けているので、受容野全体では+になります。そして、一番右のすべての視細胞に光があたっているとき+と-が打ち消し合って0になります。そして、それ以外のパターンでは-になります。

ここから推測できることは、人間の目は、少なくとも低レイヤーでは画像をエッジ(縁)の情報として分解しているということです。

興味深いことに、自然の写真を大量に撮影しその写真をできるだけ少ないパターンで表現できるような基底を統計的に求めたところ、下の画像のように受容野のそれと一致していました。つまり、受容野は普段から見ている自然風景の特徴を最も効率的に把握できるようなパターンに特異的に反応するということです。

ちなみに、このパターンは後天的に得たものであることが示唆される研究があります。

Convolutional層

さて、人間の目が画像をエッジ(縁)の情報として分解していることがわかりました。画像認識でも基本は同じです。画像からエッジを取り出します。このエッジを取り出す層が、**畳み込み層(Convolution Layer)**です。

ここから、Convolutional Neural Networkとは何なのかと一緒に読むと読むとわかりやすいと思います。特に、図がわかりやすいです。

画像が与えられたときに、CNNではピクセル1つ1つの値(視細胞)を受け取るのではなく、ピクセルがある程度集まった集合体(受容野)として情報を受け取ります。その方法は、フィルタを書けているのですが、詳しいことは上のサイトの画像を見ると納得できると思います。

そして、画像認識では(CNN層に関しては)重みはないので、重みの代わりにフィルタの値を学習しています。つまり、分類したい画像群の特徴を把握しやすいようなフィルタ(パターン)を学習しているということになります。実際、画像に近い畳み込み層では、受容野と同じパターンのフィルタが見つかることも有ります。

また、Convolution Layerは中間層の一部なので、活性化関数も存在します。1つのフィルタから1つの出力が出てくるので、その出力に活性化関数を使います。主に使われる活性化関数はReluですが、これは負の入力は0に、正の入力はそのまま出力するという関数で、0~255で表現される画像に対しては有効な方法です。なぜなら、いらない特徴量はフィルタの合計がマイナスになるようにし、いる特徴量のみをそのまま次の層に渡すことができるからです。

まとめると、人間も機械も、画像を認識するときにはエッジ(縁)を検出していて、そのエッジの組み合わせとして物体を認識しているということです。

Pooling層

この層は、画像の解像度を下げる層です。例えば、2x2のピクセルをを1つのピクセルに合成する層です。この場合、例えば128x128のサイズの画像は、半分の64x64の画像になります。もちろん、3x3を1つのピクセルにすることもあり、その大きさはお任せです。(2が多いと聞きます)。

解像度を下げることによって、似ているけれども少しだけ違う特徴を1つの特徴として同一視できるようになります。誤解を恐れずに言えば、トヨタの丸いクルマも、テスラのメカメカしいクルマも、解像度を下げてしまうと同じクルマとして認識できるということです。

合成の方法はいくつかあり、有名なものはMax PoolingとAverage Poolingです。poolingを2x2に対して行う例で説明します。最大プーリングは、2x2の4ピクセルのうち一番値が大きいピクセルの値を採用します。平均プーリングは、4ピクセルの平均の値を採用します。ただし、どちらが良い等はあまりわかっていません。ただだ、Max Poolingのほうがよく使われているイメージが有ります。

Fully Connected層

通常の深層学習の中間層と全く同じです。Convolutional層とPooling層で画像の特徴を抽出し、その特徴からFully Connected層で画像を分類するという流れになっています。

ただし、下で説明するDropout層を混ぜることも有ります。

Dropout層

Dropout層は、過学習を防ぐ目的で、Fully Connected層の中に混ぜて使うことがあります。

具体的には、確率的にニューロンの出力を無効化します。確率は、25%~50%ぐらいが用いられることが多いです。これにより、特定のデータセットのみに過学習し、データセット以外のデータに対して正しい答えが返せないことを防ぐことが出来ます。

【Deep Learning】過学習とDropoutについてで詳しく解説されています。

よくある層の重ね方

Convolutional:C

Pooling:P

Fully Connected:F

とすると、

(C\times N + P) \times M + F \times K

N:1~5

M:2〜

K:1~3

というふうに重ねることが多いです。

仮に、N=2,M=3,K=2のよくある重ね方をすると、

CCP\space CCP\space CCP\space FF

という層の重ね方になります。

ただし、分類したい画像によっては微調整をすることもよく有ります。

参考文献

Convolutional Neural Networkとは何なのか
畳み込みニューラルネットワーク(CNN)におけるフィルターの決め方
定番のConvolutional Neural Networkをゼロから理解する
CNN(Convolutional Neural Network)を理解する
深層学習入門 ~ドロップアウト編~
リモートセンシング

脚注
  1. リモートセンシングより ↩︎