画像認識の王道!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の基本構造である「畳み込み」と「プーリング」のイメージは掴めましたか?
計算式を詳しく見ると、内積の計算が行われています。
計算式:
この (重み)が、学習によって「猫を見分けるフィルター」や「車を見分けるフィルター」に進化していくのです。ワクワクしませんか?
次のステップとして、このコードを実際に動かしてみて、精度がどれくらい出るか確認してみてください。さらに興味が湧いたら、より深い層を持つ「ResNet」や、画像の中のどこに何があるかまで当てる「物体検出(YOLOなど)」の世界を覗いてみるのがおすすめです。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。