本文へスキップ
ひもとくAI

縦線・横線を見つけるフィルター

レッスン 3/7

線とは、濃さが急に変わる場所

前のレッスンでは、「窓の中とフィルターの内積」を並べる畳み込みを学びました。このレッスンでは、フィルターの数を工夫すると、画像の中の縦線や横線を見つけられる ことを確かめます。どんな模様を探すかは、フィルターの数で決まります。

直感:線の「ふち」を探す

白い紙に、黒いペンで縦線を1本引いたところを想像してください。線を横切るように左から右へ見ていくと、「白 → 黒 → 白」と、濃さが急に変わる場所 があります。線を見つけることは、この「濃さが急に変わる場所」を見つけることだと言えます。

一方、真っ白な場所や、真っ黒に塗りつぶした場所では、左右で濃さが変わりません。

左と右の差をとるフィルター

次のフィルターを考えます。左の列が1、真ん中の列が0、右の列が −1-1 です。

(10−110−110−1)\begin{pmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{pmatrix}

かっこの中に、フィルターの3×3の数を、表の形のまま書いています(数学では、このように数を表の形に並べたものを 行列 と呼びます)。

このフィルターで畳み込みをすると、窓の中で「左の列の濃さの合計 − 右の列の濃さの合計」を計算することになります。−1-1 を掛けて足すのは、引き算と同じだからです。

  • 左右で濃さが同じ場所 → 差は0
  • 左が濃く、右が薄い場所 → 差は 正の数(プラス)
  • 左が薄く、右が濃い場所 → 差は 負の数(マイナス)

例えば、窓の中の各行が (3, 3, 8) なら、1行あたり 3−8=−53 - 8 = -5 で、3行分で −15-15 です。左から右へ濃くなっている「ふち」なので、負の数になります。

第4章の「傾き」と同じ考え方

第4章の一次関数では、「xx が増えたとき、yy がどれだけ変わるか」を傾き(変化の割合)と呼びました。このフィルターが計算しているのも、「横に動いたとき、濃さがどれだけ変わるか」です。差が大きいほど、濃さの変化が急な場所、つまり線のふちです。

このように、濃さが急に変わる場所を エッジ(ふち)と呼び、エッジを見つけることを エッジ検出 と呼びます。

縦線用と横線用のフィルターを比べる

縦線を探すフィルター(前のスライドの、左 − 右)と、それを横に倒した横線を探すフィルター(上 − 下)の2つを用意します。

縦線用=(10−110−110−1)横線用=(111000−1−1−1)\text{縦線用} = \begin{pmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{pmatrix} \qquad \text{横線用} = \begin{pmatrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ -1 & -1 & -1 \end{pmatrix}

縦線の画像で試す

6×6の画像の2列目に、濃さ9の縦線を1本引きました。

012345000900010090002009000300900040090005009000
6×6の画像。2列目だけが濃さ9で、ほかは0。縦線が1本ある
0行目009000
1行目009000
2行目009000
3行目009000
4行目009000
5行目009000
6×6の画像。2列目だけが濃さ9で、ほかは0。縦線が1本ある

この画像に、2つのフィルターで畳み込みをした結果が次の2つです(出力は 6−3+1=46 - 3 + 1 = 4 で4×4)。0から離れているほど濃く塗っています。

01230-2702701-2702702-2702703-270270
縦線用のフィルターの出力。0列目がすべて-27、2列目がすべて27、ほかは0。線の左のふちと右のふちで、大きく反応している
0行目-270270
1行目-270270
2行目-270270
3行目-270270
縦線用のフィルターの出力。0列目がすべて-27、2列目がすべて27、ほかは0。線の左のふちと右のふちで、大きく反応している
012300000100002000030000
横線用のフィルターの出力。すべて0で、まったく反応していない
0行目0000
1行目0000
2行目0000
3行目0000
横線用のフィルターの出力。すべて0で、まったく反応していない

縦線用のフィルターは、線の左のふち(−27-27:左が薄く右が濃い)と右のふち(2727:左が濃く右が薄い)で大きく反応しました。横線用のフィルターは、どこにも反応しません。縦線では、上下で濃さが変わらないからです。

反対に、横線を引いた画像では、横線用のフィルターだけが反応し、縦線用のフィルターの出力はすべて0になります。

本物の手書き数字で試す

手書き数字のデータの2枚目(数字の1)に、2つのフィルターを使ってみました。数字の1は、ほとんどが縦の線でできています。

フィルター出力の大きさの平均(符号を外した値の平均)
縦線用約30.0
横線用約6.3

縦線用のフィルターの方が、約5倍も強く反応しました。1つのフィルターの出力を見るだけで、「この画像には縦の線が多い」という手がかりが得られます。

CNNでは、フィルターを何枚も使う

数字を見分けるには、縦線だけでは足りません。数字の7なら横線と斜めの線、0なら丸いカーブが手がかりになります。

そこでCNNでは、フィルターを何枚も用意して、それぞれで畳み込みをします。フィルターが8枚なら、出力の表も8枚できます。1枚1枚の出力の表は、「その模様が、画像のどこにあるか」を表す地図のようなもので、特徴マップ と呼ばれます。

重なった何枚もの表の1枚1枚を、チャネル と呼びます。フィルター8枚の畳み込みの出力は「8チャネル」です。入力の画像も同じで、白黒の画像は1チャネル、カラーの画像は赤・緑・青の3チャネルです(レッスン1)。

このレッスンでは、縦線用・横線用のフィルターを人間が作りました。実際のCNNでは、フィルターの数は学習で決まります。それでも、学習が終わったCNNの最初の層のフィルターを調べると、縦線・横線・斜めの線のふちに反応する、このレッスンと似た形のものが多く見つかることが知られています。見分けるのに役立つ模様を、データから自分で見つけているのです。

よくある誤解

  • 「出力が負の数になるのは、計算の誤り」: 負の数にも意味があります。縦線用のフィルターなら、正の数は「左が濃く右が薄い」ふち、負の数は「左が薄く右が濃い」ふちです。符号は、濃さが変わる 向き を表しています
  • 「フィルターが反応しない(出力が0)なら、その場所には何もない」: 出力が0になるのは、フィルターが探している変化がない場所です。真っ黒に塗りつぶされた場所でも、左右の濃さが同じなら、縦線用のフィルターの出力は0になります
  • 「CNNは、人間が作った線のフィルターを使っている」: 人間が作ったフィルターは、仕組みを理解するための例です。CNNのフィルターは、学習で決まる重みです

振り返り

  • 線は、濃さが急に変わる場所(エッジ)。左右や上下の差をとるフィルターで見つけられる
  • 出力の符号は、濃さが変わる向きを表す。変化がない場所では0
  • CNNは、フィルターを何枚も使い、それぞれの出力(特徴マップ)で、いろいろな模様の位置を調べる

次のレッスンでは、特徴マップから大事な情報だけを残して小さくする、ReLUとプーリングを学びます。

演習

演習を読み込んでいます…