画像認識の王道!CNN(畳み込みニューラルネットワーク)の構造と実装コード

こんにちは。ゆうせいです。

前回のRNN(再帰型ニューラルネットワーク)シリーズ、楽しんでいただけましたか?時系列データの次は、いよいよ「画像」の世界に足を踏み入れましょう!

画像認識の主役といえば、CNN(Convolutional Neural Network)です。

人間が写真を見て「これは猫だ!」と判断するように、AIが画像の特徴を捉えるための魔法のような仕組みを、実際のコードと一緒に解説しますね。

CNNを支える2つの主役

コードを見る前に、CNNに欠かせない2つの専門用語をマスターしましょう。

1. 畳み込み層(Convolution Layer)

これは、画像から「エッジ(輪郭)」や「模様」などの特徴を抽出するフィルターの役割を果たします。

例えば、虫眼鏡を持って写真の隅々までスキャンし、「ここに縦の線があるぞ」「ここに丸いカーブがあるぞ」とメモしていく作業に似ています。

2. プーリング層(Pooling Layer)

抽出した特徴の「位置」のズレを許容し、データをギュッと圧縮する工程です。

「少し右にズレていても、耳は耳だよね」という大まかな把握をすることで、計算量を減らしつつ、AIが細かいノイズに惑わされないようにします。

PyTorchによるシンプルなCNNの実装

では、実際に数字の画像(MNIST)を分類するような、標準的なCNNの構成を見てみましょう。PythonとPyTorchというライブラリを使っています。

Python

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

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        # 畳み込み層1:入力1チャンネル(白黒)、出力16チャンネル
        self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1)
        # 畳み込み層2:出力32チャンネル
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
        # プーリング層:サイズを半分にする
        self.pool = nn.MaxPool2d(2, 2)
        # 全結合層:最終的に10クラス(数字の0-9)に分類
        self.fc1 = nn.Linear(32 * 7 * 7, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        # 畳み込み -> 活性化(ReLU) -> プーリング
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        # 1次元に展開(平坦化)
        x = x.view(-1, 32 * 7 * 7)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

メリットとデメリットを確認!

CNNのメリット

  • 位置不変性:対象物が画像内のどこに写っていても、正しく認識できます。
  • 特徴の自動抽出:人間が「ここが耳だよ」と教えなくても、AIが勝手に重要な特徴を見つけ出します。

CNNのデメリット

  • データの回転に弱い:上下逆さまの画像を認識させるには、別途「データ拡張」という工夫が必要です。
  • 計算コスト:高解像度の画像を大量に扱う場合、GPUという強力な計算資源が必要になります。

学習の指針:次はどうする?

CNNの基本構造である「畳み込み」と「プーリング」のイメージは掴めましたか?

計算式を詳しく見ると、内積の計算が行われています。

計算式: y = \sum ( x \times w ) + b

この w (重み)が、学習によって「猫を見分けるフィルター」や「車を見分けるフィルター」に進化していくのです。ワクワクしませんか?

次のステップとして、このコードを実際に動かしてみて、精度がどれくらい出るか確認してみてください。さらに興味が湧いたら、より深い層を持つ「ResNet」や、画像の中のどこに何があるかまで当てる「物体検出(YOLOなど)」の世界を覗いてみるのがおすすめです。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。