#02 人工知能入門 CNN画像認識

畳み込み——局所的な特徴を探すフィルター

畳み込みの直感

「畳み込み(Convolution)」という言葉は難しそうですが、感覚はシンプルです。

小さな「フィルター(カーネル)」を画像の上をスライドさせながら、局所的な特徴を検出する——これが畳み込みです。

写真を現像するときのカラーフィルターをイメージしてください。フィルターを通すと特定の情報だけが強調される。ただしCNNのフィルターは光の色ではなく「特定のパターン(エッジ、テクスチャなど)」を強調します。


エッジ検出フィルターの例

水平エッジ(横方向の境界線)を検出するフィルターで考えましょう。

フィルター(カーネル)3×3:
 -1  -1  -1
  0   0   0
 +1  +1  +1

「上が明るくて下が暗い境界」に強く反応する

畳み込みの計算

入力画像(5×5)にフィルター(3×3)を適用してみます。

入力画像:              フィルター:
 1  2  3  4  5         -1 -1 -1
 1  2  3  4  5          0  0  0
 5  5  5  5  5         +1 +1 +1
 1  2  3  4  5
 1  2  3  4  5

フィルターを左上(1×1の位置)に置いて計算:

対応するピクセルとフィルターの値を掛け算して全部足す:

 1×(-1) + 2×(-1) + 3×(-1)   = -6  (上の行)
 1×(0)  + 2×(0)  + 3×(0)    =  0  (中の行)
 5×(+1) + 5×(+1) + 5×(+1)   = 15  (下の行)

合計 = -6 + 0 + 15 = 9

3行目(1→5に変わる水平エッジ)に反応して、大きな値が出ました。

このフィルターをスライドさせながら全位置で計算すると、水平エッジの強さを表す特徴マップ(Feature Map) が得られます。


ストライド(Stride)

ストライドは「フィルターを何ピクセルずつずらすか」です。

入力: 5×5、フィルター: 3×3

ストライド=1 の場合:
フィルターの左上が置ける位置: (1,1)(1,2)(1,3)(2,1)...
出力サイズ: 3×3

ストライド=2 の場合:
フィルターの左上が置ける位置: (1,1)(1,3)(3,1)(3,3)
出力サイズ: 2×2(飛ばし飛ばしなので小さくなる)

出力サイズの計算式:

出力サイズ = (入力サイズ - カーネルサイズ) / ストライド + 1

例: (5 - 3) / 1 + 1 = 3
例: (5 - 3) / 2 + 1 = 2

ストライドを大きくすると出力が小さくなり、計算量が減ります。


パディング(Padding)

畳み込みをすると出力が入力より小さくなります。これを防ぐためにパディング(画像の周囲に0を追加する)を使います。

パディング=1 を付けた場合(0で周囲を埋める):
 0  0  0  0  0  0  0
 0  1  2  3  4  5  0
 0  1  2  3  4  5  0
 0  5  5  5  5  5  0
 0  1  2  3  4  5  0
 0  1  2  3  4  5  0
 0  0  0  0  0  0  0

パディング=1, ストライド=1, カーネル3×3 のとき: 出力サイズ = (5 + 2×1 - 3) / 1 + 1 = 5×5 (入力と同じサイズを維持)


複数のフィルター

現実のCNNでは1つのフィルターだけでなく、複数のフィルターを同時に適用します。

入力: 224×224×3(カラー画像)

フィルターを64個使う場合:
  各フィルター: 3×3×3(幅×高さ×チャンネル数)
  出力: 224×224×64(64種類の特徴マップ)

64個のフィルターそれぞれが「異なるパターン」を検出します。「水平エッジを検出するフィルター」「垂直エッジを検出するフィルター」「特定のテクスチャを検出するフィルター」……といった具合です。


全結合との比較(パラメータ数)

畳み込み層のパラメータ数がいかに少ないかを確認しましょう。

入力: 224×224×3
フィルター64個(3×3×3 + バイアス1)

畳み込み層のパラメータ数:
  3×3×3×64 + 64 = 1,728 + 64 = 1,792個

全結合層(同じ入力→64ノード)のパラメータ数:
  224×224×3×64 = 9,634,304個(約960万個!)

畳み込みなら1,792個で済むのに、全結合では960万個必要——これが畳み込みの効率の良さです。同じフィルターを画像全体で共有するため、パラメータが劇的に少なくて済みます。


まとめ

  • 畳み込みは「小さなフィルターを画像上でスライドさせて特徴を検出」する処理
  • カーネルはフィルターのサイズ(例: 3×3)。エッジやテクスチャなどを検出する
  • ストライドはスライドのステップ数。大きいほど出力が小さくなる
  • パディングは周囲に0を追加して出力サイズを維持する
  • 同じフィルターを全体で共有するので、全結合より圧倒的にパラメータが少ない

次回は、特徴マップをさらに圧縮するプーリングについて学びます。