VISION / LESSON 09

画像を小さな窓で見る

フィルタを動かして、ぼかしや輪郭が生まれる様子を見よう。

図から学ぶ
画像を小さな窓で見るを表すキャラクターと学習内容のイラスト
TODAY'S GOAL

この回でつかむこと

カーネルをずらす計算と出力画像の意味を説明できる。

ことばの窓
01 / SEE THE IDEA

画像を小さな窓で見るって何だろう?

画像は画素値の表です。カーネルは小さな重みの表で、窓の範囲の値と掛けて足します。平滑化なら周囲の平均、エッジ検出なら明暗の変化に反応します。

あおい

写真の輪郭って、どうやって見つけているの?

AI先生

小さな窓を少しずつずらし、近くの画素をまとめて計算するんだよ。

はる

窓の中の値とフィルタの値を掛けて足すのですね。

小さな窓で平均を取る。中心の9と周囲の0を見る。3×3の9マスを平均。中央の出力は1。
図9 小さな窓で平均を取る。中心の9と周囲の0を見る。3×3の9マスを平均。中央の出力は1。

AI先生 中央の9を周りの0と一緒に平均すると1になるんだよ。

図を読むと

同じカーネルを画像全体へずらして適用する。 画像は画素値の表です。カーネルは小さな重みの表で、窓の範囲の値と掛けて足します。平滑化なら周囲の平均、エッジ検出なら明暗の変化に反応します。

小さなコードで確かめるまず結果を予想しよう
import torch
import torch.nn.functional as F
x = torch.zeros(1,1,5,5)
x[0,0,2,2] = 9
kernel = torch.ones(1,1,3,3)/9
print(F.conv2d(x,kernel).squeeze())
実行結果中央付近に1が並ぶ3×3の結果

なぜそうなる? 1か所の9が、周囲の3×3窓で平均されて広がります。

02 / GO ONE STEP FURTHER

端の画素はどうなる?

パディングなしの3×3カーネルを5×5画像に使うと、出力は3×3に小さくなります。端に値を足してサイズを保つ方法もあります。

print(F.conv2d(x,kernel,padding=1).shape)
実行結果torch.Size([1, 1, 5, 5])

ここに注目 周囲へ1画素分の0を補うことで、縦横のサイズが保たれます。

03 / YOUR TURN

予想して、理由を話そう

答えを選んで、説明を確かめよう。外れても発見が一つ増えるよ。

5×5画像へ3×3の窓を、パディングなし・1画素ずつ動かすと?

答えを選ぶと理由が表示されます。

04 / TRY ON COLAB

Colabで試してみよう

コードの実行はColaboratoryの実行環境で行います。まずノートブックを保存し、Colabで「ファイル → ノートブックをアップロード」から開いてください。上から順に実行し、最後に値を変えてみましょう。

保存ボタンを押しても画面は切り替わりません。通常はブラウザの「ダウンロード」フォルダに .ipynb が保存されます。見つからない場合はダウンロード履歴を確認してください。Colabの実習は小さな例から始められます。

COFFEE BREAK

身近な技術とつなげてみよう

AI先生

AI先生:スマホの写真アプリの『ぼかし』も近くの画素を見る処理の仲間だよ。

KEY TERMS

この回の重要な用語

本文で出会った言葉を、ここで意味と一緒に振り返ろう。上の「ことばの窓」からも説明を開けるよ。

画素
画像を構成する一つひとつの点の値です。
カーネル
画像の近くの値へ掛ける小さな重みの表です。
畳み込み
窓をずらしながら重み付きの和を計算する操作です。
パディング
画像の端の外側へ値を補い、出力サイズなどを調整する方法です。