mei_13のPython講座 ロゴ

【解説】画像認識の要、畳み込みニューラルネットワーク(CNN)の仕組みを学ぼう




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

画像認識の要、畳み込みニューラルネットワーク(CNN)の仕組みを学ぼう


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは。今日は画像認識について教えてほしいんです。最近、スマートフォンの写真アプリが自動で「猫」や「風景」を分類してくれるのに驚いていて……。あれは、畳み込みニューラルネットワーク(CNN)という技術が使われているんですよね?


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。そうですね、画像認識の分野で最も大きな成果を上げているのが、そのCNN(Convolutional Neural Network)です。冬の澄んだ空気のように、非常に明快で美しい構造を持ったアルゴリズムなんですよ。今日は、CNNがどのようにして画像の中から「特徴」を見つけ出しているのか、一緒に見ていきましょうか……。


Hirokiのアイコン
【Hiroki】 お願いします!普通のニューラルネットワーク(全結合層)との違いが、いまいちわかっていなくて。


Yukiのアイコン
【Yuki】 普通のニューラルネットワークは、画像のピクセルを一つの長い列にして処理してしまいます。でも、画像には「隣り合うピクセル同士の関係性」がとても重要なんです。CNNは、その空間的な情報を壊さずに学習できるのが大きな特徴だと思います……。

畳み込み層(Convolutional Layer)の役割


Hirokiのアイコン
【Hiroki】 「畳み込み」って、言葉だけ聞くと少し難しそうですね。


Yukiのアイコン
【Yuki】 そうかもしれませんね。でも、概念はシンプルです。画像の上に、カーネル(またはフィルタ)と呼ばれる小さな窓を置いて、それを少しずつずらしながら計算していく作業のことなんです。このカーネルが、画像の中から「エッジ(輪郭)」や「特定の模様」を抽出してくれるんですよ。


Hirokiのアイコン
【Hiroki】 窓をスライドさせていくんですね。それでどうやって特徴がわかるんですか?


Yukiのアイコン
【Yuki】 カーネルの中には数値が入っていて、重なり合った画像のピクセル値と掛け算をして、その合計を出します。これを積和演算と呼びます。例えば、縦の線を検出するカーネルを画像に通すと、縦の線がある場所だけ大きな反応(数値)が返ってくるんです。こうして出来上がった新しい画像を特徴マップと呼びます……。


Hirokiのアイコン
【Hiroki】 なるほど。画像全体を漫然と見るんじゃなくて、小さなフィルタを通して、細かいパーツを探していくようなイメージでしょうか。


Yukiのアイコン
【Yuki】 ええ、その通りだと思います。最初は単純な線や点を、層が深くなるにつれて「目」や「鼻」、さらには「顔全体」といった複雑な形を認識できるようになっていく……。まるでパズルを組み立てるような、繊細なプロセスですね。

ストライドとパディング


Hirokiのアイコン
【Hiroki】 フィルタを動かすときに、動かす幅とかは決まっているんですか?


Yukiのアイコン
【Yuki】 はい。フィルタをずらす間隔のことをストライド(Stride)と言います。ストライドを大きくすると、出力される特徴マップのサイズは小さくなります。また、フィルタを適用すると画像の端の部分の計算回数が少なくなって、サイズも小さくなってしまいますよね。それを防ぐために、画像の周りに0などの値を埋めることをパディング(Padding)と呼びます……。


Hirokiのアイコン
【Hiroki】 パディングをすることで、元の画像のサイズを維持したり、端っこの情報も大切に扱えるようになるんですね。


Yukiのアイコン
【Yuki】 そうですね。情報の欠落を防ぐための、ちょっとした工夫かもしれません。

プーリング層(Pooling Layer)で情報を圧縮する


Hirokiのアイコン
【Hiroki】 畳み込みの次には何をするんですか?


Yukiのアイコン
【Yuki】 畳み込み層のあとには、よくプーリング層が置かれます。これは、得られた特徴マップをさらに扱いやすくするために、情報を圧縮する工程です。最も一般的なのは、特定の領域の中で最大の数値だけを取り出すマックスプーリング(Max Pooling)ですね。


Hirokiのアイコン
【Hiroki】 せっかく見つけた情報を捨てちゃうんですか?


Yukiのアイコン
【Yuki】 一見もったいない気がしますが、これには大きな意味があるんです。画像の中で対象物が「少し右にずれている」とか「少し傾いている」といった小さな変化に影響されない、頑健な(ロバストな)認識ができるようになるんですよ。あと、計算量を減らして処理を速くする効果もあります。


Hirokiのアイコン
【Hiroki】 大事なエッセンスだけを抽出して、細かいズレは気にしないようにする……。効率的ですね。

活性化関数(ReLU)の働き


Yukiのアイコン
【Yuki】 それと、忘れてはいけないのが活性化関数です。CNNでは主にReLU(Rectified Linear Unit)という関数が使われます。これは、マイナスの値を0にして、プラスの値はそのまま通すという単純な関数なのですが、これがネットワークに「非線形性」を与えて、複雑な表現を可能にしているんです……。


Hirokiのアイコン
【Hiroki】 マイナスを切り捨てることで、重要な反応だけを次に伝える役割があるんですね。

全結合層(Fully Connected Layer)で分類する


Yukiのアイコン
【Yuki】 畳み込みとプーリングを何度か繰り返すと、画像はかなり抽象的な特徴の集まりになります。最後に、それらを一列に並べて(フラット化)、普通のニューラルネットワークである全結合層に渡します。ここで最終的に「これは90%の確率で猫です」といった判断を下すわけですね。


Hirokiのアイコン
【Hiroki】 職人たちがパーツ(特徴)を見つけてきて、最後にリーダー(全結合層)が「よし、これは猫だ!」と結論を出すようなチームワークですね。


Yukiのアイコン
【Yuki】 ふふ、分かりやすい例えですね。そのチームワークを最適化するために、大量の画像データを使って「重み(カーネルの数値など)」を調整していくのが学習なんです。

PythonとPyTorchによる実装例


Hirokiのアイコン
【Hiroki】 実際にコードで書くとどうなるんでしょうか?難しそうですが、見てみたいです。


Yukiのアイコン
【Yuki】 そうですね。最近はPyTorchというライブラリが人気です。少し長くなりますが、基本的なCNNの構造をPythonで書くと、このようになります……。

import torch
import torch.nn as nn
import torch.nn.functional as F

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        # 畳み込み層1: 入力1チャンネル(グレースケール), 出力32チャンネル, カーネルサイズ3x3
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        # 畳み込み層2: 入力32チャンネル, 出力64チャンネル, カーネルサイズ3x3
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        # プーリング層: 2x2の領域で最大値を取得
        self.pool = nn.MaxPool2d(2, 2)
        # 全結合層1: 画像サイズが28x28の場合、2回のプーリングで7x7になる
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        # 全結合層2: 最終的な10クラス(0〜9の数字など)に分類
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        # 畳み込み -> ReLU -> プーリング
        x = self.pool(F.relu(self.conv1(x)))
        # 畳み込み -> ReLU -> プーリング
        x = self.pool(F.relu(self.conv2(x)))
        # データを一列に並べる(フラット化)
        x = x.view(-1, 64 * 7 * 7)
        # 全結合層 -> ReLU
        x = F.relu(self.fc1(x))
        # 出力層
        x = self.fc2(x)
        return x

# モデルのインスタンス化
model = SimpleCNN()
print(model)


Hirokiのアイコン
【Hiroki】 意外とスッキリしていますね!nn.Conv2dが畳み込みで、nn.MaxPool2dがプーリング……。さっき教えてもらった用語がそのまま出てくるので、何をしているのか分かります。


Yukiのアイコン
【Yuki】 それは良かったです。forwardという関数の中で、データが各層を通り抜けていく流れが定義されています。この流れを順伝播と呼びます。


Hirokiのアイコン
【Hiroki】 これを実行すれば、すぐに学習が始まるんですか?


Yukiのアイコン
【Yuki】 実用的な精度を出すためには、ここから「損失関数」を定義して、「最適化アルゴリズム(Adamなど)」を選んで、データを何度も読み込ませる必要があります。でも、基本の形はこれなんです。静かな夜にじっくりコードを眺めていると、データが形を変えていく様子が目に浮かぶようで……少し楽しいですよ。

CNNを学ぶためのリソース


Hirokiのアイコン
【Hiroki】 もっと詳しく知りたいときは、どんなサイトを見るのがおすすめですか?


Yukiのアイコン
【Yuki】 そうですね、理論を深く学びたいなら、スタンフォード大学の講義資料がとても有名です。

CS231n: Convolutional Neural Networks for Visual Recognition

また、PyTorchの公式チュートリアルも、実際に手を動かしながら学べるのでおすすめです。

Deep Learning with PyTorch: A 60 Minute Blitz


Hirokiのアイコン
【Hiroki】 ありがとうございます!英語のサイトもありますが、翻訳ツールを使いながら頑張って読んでみます。


Yukiのアイコン
【Yuki】 Hirokiくんなら、きっと大丈夫だと思います。CNNの仕組みを理解すると、画像だけでなく音声やテキストの解析にも応用できる考え方が身につきます。一歩ずつ、進んでいきましょうね。


Hirokiのアイコン
【Hiroki】 はい!今日はCNNの全体像が掴めて、霧が晴れたような気分です。Yukiさん、ありがとうございました!


Yukiのアイコン
【Yuki】 ……どういたしまして。誰かの役に立てるのは、私にとっても……その、嬉しいことですから。また分からないことがあったら、いつでも聞いてくださいね。



< 多層パーセプトロン (MLP)
コラム一覧に戻る
ランダムフォレスト >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki