人はひと目でネコとヒトを見分けるが、コンピュータが受け取るのは0〜255の数がぎっしり詰まった表だ。写真が行列になる過程をピクセル1つまでたどり、ピクセル距離がなぜ「似ていること」を測れないのかを確かめた後、3 × 3のフィルタでエッジを探す畳み込みを手で計算する。最後に、人が決めた特徴(顔の枠・特徴点・エッジ強度)の長所と限界を見る。
とがった耳と毛、なめらかな肌。人はひと目で見分ける。コンピュータはこの写真を何として受け取り、どんな手がかりから見つけられるのだろうか?
左のネコの上の赤い線は額・目・鼻を結ぶ顔の骨格、右の人の上の緑の枠は「ここに顔がある」という検出結果、赤い点はあごの線・眉・唇の周りの特徴点、ピンクの点は両目・鼻・口の主要な位置です。どれも、人が「何を見るか」をあらかじめ決めておいた手がかりです。
この回では2つのことを見ます。1つ目は、コンピュータが受け取るのはこうした線や点ではなく数の行列だということ(セクション2〜3)。2つ目は、その数からエッジのような手がかりを見つけるフィルタと、人が決めた手がかりの限界です(セクション4〜6)。
数の例は、シリーズを通して同じチワワの写真1枚(4-4の主役)でたどります。ピクセルとフィルタはどんな写真にも同じように働くからです。実習では、ネコ・ヒト・イヌ・チワワ・マフィンの5枚すべてを選べます。
人にとって簡単な問題が、コンピュータにとっても簡単とは限りません。人は写真を見た瞬間に「毛がある」「耳がとがっている」と気づきますが、コンピュータはその手がかりを数から一つずつ計算して導き出さなければなりません。ネコ vs ヒトはその手がかりがはっきりしているほうなので、画像分類の最初の練習にぴったりです。
写真は数の格子であり、カラー写真はその格子が3枚重なったものだ。モデルが入力として受け取る最小の単位は、チャネルの値1つ(0〜255)である。
デジタル写真は、縦・横に細かく分けられた小さなマスの集まりです。このマス1つをピクセル(pixel, picture element)といいます。ピクセル1つには色が1つだけ入っていて、その色は赤(R)・緑(G)・青(B)の光の強さ3つで記録されます。強さは0(光なし)から255(最も明るい)までの整数です。そのため、カラー写真は縦 × 横 × 3個の数が並んだ表、つまり行列(正確には3層のテンソル)になります。
かんたんに言うと方眼紙の色塗り遊びです。方眼の1マスに絵の具3色(赤・緑・青)をそれぞれ何滴入れたかを0〜255で書き留めておけば、そのメモだけで誰でも同じ絵を塗り直せます。コンピュータが持っているのは絵ではなく、このメモです。
写真を分解し続けると、ピクセル1マス、その中のR・G・Bの数、数1つを構成する8つのビットにまで下りていきます。ビットはコンピュータが保存する最小の単位ですが、ビット1つは色でも明るさでもなく、オン/オフにすぎません。
そのため、画像のディープラーニングで意味を持つ最小の情報はチャネルの値1つ、つまり「このマスの赤の強さは39」という数です。モデルの最初の層は、まさにこの数(X[y, x, c])を入力として受け取ります。
しかし、この数1つには「チワワ」という意味はまったくありません。目のピクセル (39, 37, 43) とブルーベリーのピクセル (37, 31, 37) は、数で見るとほぼ同じです。意味は複数のピクセルがどう集まっているかから生まれ、その集まりを見つけるのがセクション4の特徴抽出です。
チワワの写真を縦横14マスに区切り、目のマスを1つ選んで数に変える過程です。右側の数は、写真の実際のピクセルから計算した値です。
写真と解像度を選び、絵のマスをクリックするか、マウスを重ねてみましょう。横(モバイルでは下)の表は、選んだマスとその周囲7 × 7マスの実際の数です。絵をクリックした後は、矢印キーでマスを移動できます。
Q1. 横10マス、縦10マスのカラー写真には、数がいくつ入っていますか?
Q2. ピクセル値 (R, G, B) = (0, 0, 0) は何色ですか?
Q3. 同じ写真を右に2マスずらすと、同じ位置の数は?
Q4. 画像のディープラーニングモデルが入力として受け取る最小の情報は?
ピクセルは写真を構成する小さなマスで、マスごとに赤・緑・青の光の強さが0〜255の数で記録されています。4-1の表にたとえると、写真1枚は「縦 × 横 × 3」マスからなる1行です。ピクセル虫めがねでマスをクリックして実際の数を確かめ、解像度を変えて数の個数がどう変わるかを見てみましょう。
2枚の写真の同じ位置の数を引いて距離を測れば、「似ていること」を測れるだろうか? 同じチワワをずらしたり暗くしたりして、5枚の距離をすべて測ってみる。
2枚の写真のピクセル距離は、同じ位置のグレースケールの数どうしを引いた値を2乗して平均し、平方根をとった値です(0なら完全に同じ)。チワワを横にずらしたり、暗くしたりしてみましょう。人の目にはまだ同じチワワなのに、数の上ではマフィンよりも遠い写真になることさえあります。
このページの5枚の写真どうしのピクセル距離をすべて測りました。数が小さいほど「似ている」と計算されたことになります。最も小さい値には色を付けました。
この表の値は、このページの5枚(顔の部分だけを切り取って56 × 56に縮めたもの)で測ったものです。別の写真を使うと背景・照明・構図によって値は大きく変わりますが、「ピクセル距離は意味の距離とは違う」という結論は、実際の写真でも広く知られた性質です。
コード1は、scikit-imageに入っているネコの写真(chelsea)と人の写真(astronaut)の顔の部分を56 × 56に縮めて、同じ実験をします。同じネコを1マスずらすと距離は16.9、2マスで27.1、8マスで40.5と大きくなり、ネコとヒトの距離は85.3でした。数マスずらすだけで、別の動物との距離の半分近くになります。
ピクセル距離が測るのは「同じ位置の数が似ているか」だけです。そのため、位置・明るさ・構図に敏感で、何が写っているかはわかりません。この限界こそ、セクション4のフィルタと4-3のCNNが必要な理由です。
4-1のk-NNは「近くの隣人」に尋ねました。写真で同じことをするには、写真どうしの距離が意味を反映していなければなりません。ところがピクセル距離では、チワワは同じイヌ(ゴールデンレトリバー)よりマフィンに近く、同じチワワでも4マスずらすだけでマフィンより遠くなります。写真では、ピクセルそのままの距離で隣人を探してはいけないということです。
3 × 3の数の表(フィルタ)を写真の上で滑らせながら、掛けて足す。模様に似たところで大きな数が出て、その結果を集めたものが特徴マップである。
特徴とは、「ここで明るかったのが急に暗くなる(エッジ)」「周囲より丸く暗い(点)」「細い線が密に並ぶ(毛並み)」のように、複数のピクセルが一緒に作るパターンです。CNNは、3 × 3のような小さな数の表であるフィルタ(カーネル)を写真の上に置き、1マスずつ滑らせながら重なった数どうしを掛けてすべて足します。フィルタの模様に似たところでは大きな数が、そうでないところでは小さな数が出て、この結果を集めた新しい行列が特徴マップです。この計算を畳み込みと呼びます。
かんたんに言うと模様のハンコ探し遊びです。「左は暗く右は明るい」模様が彫られたハンコを写真のあらゆる位置に当ててみて、模様がよく重なる位置ごとに高い点数を書き込みます。点数表を埋め終えると、写真のどこに縦エッジがあるかがひと目でわかります。ハンコを変えれば、探す模様も変わります。
フィルタは「探したい模様」を数で書き留めたものです。左の列が−1、右の列が+1のフィルタは、右が左より明るいほど大きな数を出します。そのため、チワワの目(暗い)と毛(明るい)の間の縦エッジでは302のような大きな値が出て、毛だけの平らなところでは0に近い値が出ます。
重要なのは、同じフィルタを写真のすべての位置で使い回すということです。フィルタ1つの数は9個しかないのに、写真のどこにあるエッジでも見つけ出します。セクション3で見た「1マスずらすだけですべての数が変わる」問題も小さくなります。写真がずれても特徴マップが一緒にずれるだけで、エッジがあるという事実は変わらないからです。
実際のCNNの最初の層は、こうしたフィルタを数十個使います。フィルタごとに特徴マップが1枚ずつ出るので、出力は「写真の大きさ × フィルタの数」の厚い行列になります。
チワワの目のあたりのグレースケール8 × 8の切れ端(28 × 28に縮めた写真から切り出したもの)に、縦エッジのフィルタを1マスずつ置いてみます。青い数は「右のほうが明るい」、オレンジの数は「左のほうが明るい」という意味です。
写真とフィルタを選んでみましょう。フィルタのマスの数を直接書き換えてもかまいません。右の特徴マップで明るいところが「模様を見つけたところ」です。特徴マップのマスをクリックすると、その位置の計算が下に表示されます。出力の大きさを56 × 56に保つため、端の外側は最も近い端のピクセルを複製して埋めました。図解3の0パディングとは方式が違うので、縁のマスの値は0パディングのときと異なる場合があります。
Q1. 畳み込みで、フィルタの1つの位置の値はどうやって作りますか?
Q2. すべてのマスが10の平らな切れ端に、縦エッジのフィルタ [−1 0 1]×3 を押し当てると?
Q3. 56 × 56の特徴マップに2 × 2の最大プーリングをすると、大きさは?
Q4. CNNのフィルタの数字は誰が決めるのでしょうか?
畳み込みは、4-1のパーセプトロンの重み付き和(w·x + b)を、写真の小さなかけらごとに繰り返す計算です。フィルタの9個の数字が重みで、同じフィルタを写真のあらゆる位置で使い回すため、目がどこにあっても同じやり方で見つけられます。コード2では、手計算がscipyの結果と一致するかを確かめ、手書き数字を2マスずらしたとき、ピクセルをそのまま使うニューラルネットワークは14.2%まで崩れる一方、小さなCNNは90.4%を保つことを見ます。
ディープラーニング以前は、人が「何を測るか」を決めていた。その方法の長所と、写真が変わると判断がひっくり返る限界を見る。
ディープラーニング以前の顔認識は、人が決めた特徴で行われていました。2001年、ViolaとJonesは「目の部分は頬より暗い」といった明るさの差を測る単純な長方形の特徴(Haar特徴)を数千個すばやく計算し、写真の中の顔の枠を見つけました [R4]。2005年のHOGは、小さなマスごとにエッジの向きを数えて人の輪郭を見つけました [R5]。セクション1の画像の赤い点のように、目尻・鼻先・あごのラインの位置を探す顔の特徴点は、こうして見つけた顔の枠の中であらためて計算します [R6]。
これらの方法は速くて説明しやすい反面、何を測るかを人が先に知っていなければならず、照明・角度・遮蔽に弱いものでした。CNNは同じ種類のフィルタをデータから学ぶことで、この限界を乗り越えました [R7]。
セクション1の画像。緑の枠は「ここに顔がある」という検出結果、赤い点はあごのライン・眉・唇の周りの顔の特徴点、ピンクの点は両目・鼻・口の主要な位置です。ネコの赤い線は、額・目・鼻を結ぶ顔の骨格です。
「目と目の距離」「耳の先の角度」のように、何を測るかを人が先に決めます。
フィルタの数字Kを最初はランダムにしておき、正解を当てる方向へ学習が直していきます。
表示を「エッジ強度」に切り替えてみましょう。興味深いことに、写真全体のエッジ強度の平均は両者でほとんど同じです。人の写真にも、長い髪の毛による細い線がたくさんあるからです。違いはエッジがどこにあるかです。ネコは毛並みと縞模様が顔の真ん中までびっしりあるのに対し、人は頬と額がなめらかで、エッジが目・鼻・口と髪の毛に集中します。下の「中央領域」の値がこの違いを示しています。平均という数字1つではなく、位置ごとの地図、つまり特徴マップが必要な理由です。
3層目あたりの部分的な特徴でも、はっきり分かれます。頭の上のとがった三角の耳、額の縞模様、小さなピンクの鼻と長いひげは、人の顔にはありません。セクション1の画像の赤い線と点は、人がこうした手がかりを直接決めておく方式で、CNNは同じ手がかりをフィルタで自ら見つけます。
セクション3の表では、ネコとヒトのグレースケールのピクセル距離は、ネコとイヌの距離と同じくらいです。人にとってはいちばんやさしい対決なのに、ピクセル距離ではその違いが表れません。ピクセル距離は意味を知らないというもう1つの証拠です。
上のペア比較では、このページの写真でネコのほうが中央のエッジが大きくなりました。ところが、コード1でscikit-imageのネコ・ヒトの写真を使って測ると逆になります(顔部分のエッジ強度:ネコ 101.5、ヒト 123.6)。人の写真の髪の毛と、笑った口の歯が強いエッジを作るからです。
「エッジが多ければネコ」のような人が決めた単一の特徴は、写真が変わると簡単にひっくり返ります。だからこそ、1つの特徴ではなく複数の特徴の組み合わせを、しかもデータから学ぶ方法が必要です。これが4-3のテーマです。
人が決めた特徴は「なぜそう判断したのか」を説明しやすく、データが少なくても動きます。その代わり人があらかじめ知っておく必要があり、写真の条件が変わると崩れやすくなります。ペア比較で表示を「エッジ強度」に切り替え、ネコとヒトのエッジがどこに集まるのか比べてみましょう。
最初の層のフィルタは線とエッジを見つける。層を重ねると、線が集まって角に、角が集まって目や耳に、目や耳が集まって顔になる。
プーリングで写真を縮めながら層を重ねると、後ろの層の1マスは、元の写真のより広い領域を見ることになります。そのため前の層は小さな線を、後ろの層は線の組み合わせである目や耳を、さらに後ろの層は顔全体を見つけるようになります。この図は、ZeilerとFergus(2014)が学習済みCNNの層ごとの反応を可視化して示した傾向を、単純化して描いたものです。
プーリングで写真を縮めながら層を重ねると、後ろの層の1マスは、元の写真のより広い領域を見ることになります。そのため前の層は小さな線を、後ろの層はその線の組み合わせを見つけます [R8]。4-3では、これらの層を重ねたCNNが確率を出す過程と、層を重ねるとなぜ平面1枚では分けられなかったものが分けられるようになるのかを見ます。
どちらのコードも、Colabに標準でインストールされているライブラリと組み込みデータだけを使う。「ノートブック(.ipynb)をダウンロード」したあとColabでファイル → ノートブックをアップロードで開くか、コピーして新しいノートブックのセルに貼り付ける。
scikit-imageに含まれるネコ・ヒトの写真の形とピクセル値を見て、グレースケール輝度・ピクセル距離・エッジ強度を計算する。自分のデータに替えるには、io.imreadで自分の写真を読み込み、small()の(上, 左, 一辺)を顔の位置に変える。
3 × 3の縦エッジフィルタの畳み込みを手で計算してscipyと照らし合わせ、手書き数字を1〜2マスずらしたテスト画像でMLPと小さなCNNを比較する。
ChatGPT、Qwen、ClaudeのようなAIアシスタントに貼り付けるプロンプトである。「コピー」を押すと、プロンプトの後ろに選んだコードが一緒につく。〔 〕の中を自分の状況に書き換えて使えばよい。
AIの答えは出発点にすぎない。提案された論文・数値・ライブラリ関数は、必ず原文と公式ドキュメントで確認する。コンテストや論文でAIの助けを借りた場合は、主催者や学術誌の規定に従って、使用した事実と範囲を明記する。
本文の黄色い点線の下線と同じ辞書である。シリーズ全体で同じ表記を使う。セクション名を押すと、最初に登場した箇所へ移動する。
たとえは理解の第一歩だが、誤解の種にもなる。人の目・脳のたとえには強さを示した。直接 実際に同じことをしているという根拠がある · 部分 一部の性質だけが似ている · なし 対応するものが知られていない
| 概念 | 日常のたとえ | 人の目・脳のたとえ | たとえが当てはまらない点 |
|---|---|---|---|
| ピクセル | モザイクタイル1枚 | 部分的 目の網膜にも、光を受け取る細胞がびっしり並んでいる | 網膜の細胞は格子状に均等に並んでいるわけではなく、中央(中心窩)に集まっており、色を感じる細胞の種類と比率も異なる |
| 畳み込みフィルタ | 模様が彫られたハンコ | 部分的 視覚野の単純型細胞は、特定の向きのエッジに強く反応する | 脳の細胞は学習の仕方も結合もはるかに複雑だ。CNNのフィルタは同じ数字をあらゆる位置で使い回すが、脳はそうではない |
| 特徴マップ | 宝の地図の×印 | なし | 地図は1枚だが、実際の層にはフィルタの数だけ特徴マップが何枚も重なっている |
| プーリング | クラスの代表選び | なし | クラスの代表は人が選ぶが、最大プーリングは数字がいちばん大きいマスを機械的に選ぶ |
| 顔の特徴点 | 地図の道しるべ | なし | 道しるべは人が立てるが、特徴点の位置は学習済みモデルが写真ごとに計算する。隠れていると間違った場所に打たれる |
E-1 著者紹介 · E-2 学術参考文献 · E-3 図・データの参考資料
講師、実務OJT担当者、チューターのための運営ガイドである。時間は目安なので、実際の授業に合わせて調整する。
| 対象 | 4-1を終えた大学生・社会人。画像AIが「写真をどう受け取るのか」を知りたい実務者 |
|---|---|
| 前提知識 | 4-1の特徴・ターゲットと重み付き和、掛け算と足し算 |
| 学習目標 | ① カラー写真の形(H × W × 3)と数の個数を計算する ② 3 × 3の畳み込み1マス分を手で計算する ③ ピクセル距離と人が決めた特徴の限界を例を挙げて説明する |
| 所要時間の目安 | 読む 40〜50分 · 実習デモ 25分 · Colab実習 25分(コード1 10分、コード2 実行1分 + 解釈14分) |
導入5分(セクション1)→ セクション2 ピクセル虫めがね15分 → セクション3 ずらし実験10分 → セクション4 畳み込みの手計算15分 → 確認問題5分。
セクション2で自社の業務写真(不良品、書類スキャンなど)の解像度と数の個数を計算 20分 → セクション4のフィルタ実験室で自社の写真に合うフィルタを探す 25分 → セクション5 人が決めた特徴の限界について討論 15分 → コード2の実行・解釈 30分。
入門者はセクション1・2・4のみ。中級者には、セクション4の出力サイズの式をパディング・ストライドを変えて計算させ、コード2のCNNでGlobalMaxPoolingをFlattenに替えると、ずれへの強さがどう変わるかを予想させる。
| セクション | 立ち止まって尋ねる質問 | 操作のコツ |
|---|---|---|
| 1 問題 | 「人は何を見てネコだとわかるのだろう?」 | 線と点は人が決めた手がかりであることを押さえる |
| 2 ピクセル | 「目のマスにある3つの数は何だろう?」 | ピクセル虫めがねで解像度を7 → 56に変える |
| 3 ピクセル距離 | 「同じチワワなのに、なぜマフィンより遠いのだろう?」 | ずらしスライダーを4マス以上に動かす |
| 4 畳み込み | 「平らな毛のかけらに縦エッジフィルタを押したら?」 | アニメーションを「すべて足す」で止め、手で計算して答え合わせする |
| 5 人が決めた特徴 | 「エッジが多ければネコ」はいつも正しいだろうか? | ペア比較のエッジ強度表示とコード1の結果を一緒に見る |
| 6 後ろの層 | 「目を見つけるフィルタは何番目の層にあるだろう?」 | 層ごとの図を左から順に指し示す |
| 誤解 | 正しい説明 | 見せる場面 |
|---|---|---|
| 写真は画像ファイルなので数とは違う | コンピュータにとって写真はH × W × 3個の0〜255の数だ | セクション2 ピクセル虫めがね |
| ピクセルが似ていれば同じものが写っている | 1マスずらすだけで距離が大きく変わる。ピクセル距離は意味を知らない | セクション3 ずらし実験 |
| 畳み込みは難しい数学だ | 重なった9組を掛けて足すだけだ。パーセプトロンの重み付き和と同じである | セクション4の数値例 |
| フィルタは人が設計する | 実習のフィルタは例だ。CNNはフィルタの数字をデータから学ぶ | セクション4 確認問題Q4 |
| 人が決めた特徴は役に立たない | 説明しやすく、データが少なくても済む。ただし条件が変わると弱い | セクション5とコード1のひっくり返った結果 |
カラーは56 × 56 × 3 = 9,408個、グレースケールは56 × 56 = 3,136個。
0.299×39 + 0.587×37 + 0.114×43 = 11.661 + 21.719 + 4.902 ≈ 38.3.
(174−92) + (137−38) + (176−55) = 82 + 99 + 121 = 302。右側が明るい強いエッジだ。
56 − 3 + 1 = 54、つまり54 × 54。パディング1を加えれば56 × 56を保つ。
同じフィルタをあらゆる位置で使い回す畳み込み(位置が変わっても同じ模様を見つける)と、位置を捨てて最大の反応だけを残すグローバル最大プーリングである。
コード1で自分の顔写真(またはペットの写真)を読み込んで形・数の個数を出力し、1・2・4マスずらしたときのピクセル距離を表にまとめる。
コード2のCNNでGlobalMaxPooling2DをFlattenに替えて学習し直し、1・2マスずらした写真での正解率の変化をシード3つで報告する。セクション4の解釈と結びつけて理由を書く。
| 入門者 | セクション3の距離の表とセクション6は飛ばしてもよい。セクション2・4の実習だけは確実にやってみる |
|---|---|
| 発展 | Haar特徴とHOGを調べ、セクション4のフィルタ実験室で似たフィルタを作らせる。調べた論文は原文で確認する |
| さらに学ぶ | 3-3 画像とCNN · 4-3 ネコ vs イヌ(CNNの全体構造) |
| 講師用資料 | 確認問題の採点基準と課題の解答例は教育者向け解答ページ(4-2)で見られる |
「4-2 ネコ vs ヒト」編を最後まで読みました。研究室のみんなが一言ずつまとめてくれます。