カーネル
読み: かーねる
畳み込み演算で使用する小さな数値行列。フィルタの種類 (ぼかし、エッジ検出等) はカーネルの値によって決定される。
カーネル (Kernel / フィルタカーネル) は、画像の畳み込み演算で使用する小さな数値行列である。通常 3×3、5×5、7×7 などの奇数サイズで構成され、行列内の各数値が周囲ピクセルへの重み付けを定義する。カーネルの値を変えるだけで、ぼかし、シャープ化、エッジ検出など全く異なるフィルタ効果を実現できる。
カーネル設計の基本原則を以下に示す。
- 正規化: 全要素の合計が 1 になるカーネルは画像の明るさを保持する (ぼかし系)。合計が 0 のカーネルはエッジ検出に使われる
- 対称性: 中心対称なカーネルは方向に依存しない等方的なフィルタを生成する
- サイズ: 大きいカーネルほど広い範囲に影響するが、計算コストが増大する
実用的なカーネルの具体例を示す。
- 3×3 ガウシアンぼかし:
[[1,2,1],[2,4,2],[1,2,1]]を 1/16 で正規化。自然なぼかし - 3×3 シャープ化:
[[0,-1,0],[-1,5,-1],[0,-1,0]]。中心を強調してエッジを際立たせる - 3×3 Sobel (水平):
[[-1,0,1],[-2,0,2],[-1,0,1]]。垂直エッジを検出 - 3×3 エンボス:
[[-2,-1,0],[-1,1,1],[0,1,2]]。立体的な浮き彫り効果
プログラミングでの実装例として、OpenCV では cv2.filter2D(img, -1, kernel) で任意のカーネルを適用できる。NumPy 配列としてカーネルを定義し、畳み込み関数に渡すだけで独自フィルタを作成可能である。
深層学習では、カーネルの値を人間が設計するのではなく、学習データから自動的に最適な値を獲得する。CNN の各層には数十から数百のカーネルが存在し、低層ではエッジや色の検出、高層では物体のパーツや概念の認識を担う。