画像認識をPythonで実装する【CNNの基礎から実装まで】

画像認識をPythonで実装する【CNNの基礎から実装まで】 AI資格・学習

はじめに

「画像認識」と聞くと難しそうに感じるかもしれません。でも実は、PythonとTensorFlowを使えば、比較的シンプルなコードで実装できます。

僕がE資格の勉強でCNN(畳み込みニューラルネットワーク)を初めて実装したとき、「こんなに少ないコードで画像を分類できるのか」と驚きました。この記事では、CNNの仕組みを理解しながら、実際にMNIST(手書き数字データ)を分類するモデルを作ってみます。

CNNとは何か

CNN(Convolutional Neural Network:畳み込みニューラルネットワーク)は、画像認識に特化したディープラーニングのモデルです。通常のニューラルネットワークと違い、画像の「空間的な構造」を活かして学習します。

CNNは主に3種類の層で構成されています。

  • 畳み込み層:画像の特徴(エッジ・形状など)を抽出する
  • プーリング層:特徴マップのサイズを縮小し、計算量を減らす
  • 全結合層:抽出した特徴から最終的な分類を行う

MNISTデータセットで実装する

MNISTは手書き数字(0〜9)の画像データです。機械学習の入門として最もよく使われるデータセットです。

データの準備

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# MNISTデータの読み込み
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()

# 形状確認
print(f"訓練データ: {X_train.shape}")  # (60000, 28, 28)
print(f"テストデータ: {X_test.shape}")  # (10000, 28, 28)

# 正規化(0〜255 → 0〜1)
X_train = X_train / 255.0
X_test = X_test / 255.0

# CNNに入力するためにチャンネル次元を追加
X_train = X_train.reshape(-1, 28, 28, 1)
X_test = X_test.reshape(-1, 28, 28, 1)

CNNモデルの構築

model = tf.keras.Sequential([
    # 畳み込み層1(32フィルタ、3x3カーネル)
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    # プーリング層(2x2)
    tf.keras.layers.MaxPooling2D((2, 2)),

    # 畳み込み層2(64フィルタ)
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D((2, 2)),

    # 全結合層へ変換
    tf.keras.layers.Flatten(),

    # 全結合層
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dropout(0.5),  # 過学習防止

    # 出力層(10クラス)
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

model.summary()

学習と評価

history = model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=128,
    validation_split=0.1
)

# テストデータで評価
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"テスト精度: {test_acc:.4f}")

MNISTであれば99%前後の精度が出るはずです。

転移学習で効率よく精度を上げる

独自のデータで画像分類をする場合、ゼロから学習するよりも「転移学習」が効果的です。ImageNetで事前学習済みのモデル(VGG16・ResNet・EfficientNetなど)を使うことで、少ないデータと短い学習時間で高い精度を出せます。

from tensorflow.keras.applications import EfficientNetB0

# 事前学習済みモデルの読み込み(最終層を除く)
base_model = EfficientNetB0(
    include_top=False,
    weights='imagenet',
    input_shape=(224, 224, 3)
)

# ベースモデルの重みを固定(ファインチューニングしない)
base_model.trainable = False

# 独自の分類層を追加
model = tf.keras.Sequential([
    base_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(num_classes, activation='softmax')
])

画像認識の主な応用例

  • 製造業:外観検査(傷・汚れの自動検出)
  • 医療:X線・MRIの異常検出
  • 農業:作物の病気判定
  • 小売:商品認識・棚割り分析

まとめ

CNNと画像認識の実装で押さえるべきポイントをまとめます。

  • CNNは畳み込み層・プーリング層・全結合層の3つが基本構造
  • MNISTから始めると実装の流れを掴みやすい
  • 独自データには転移学習(EfficientNet・ResNetなど)が有効
  • DropoutやEarly Stoppingで過学習を防ぐ

画像認識は製造業の品質管理でも活用事例が増えています。まずはMNISTで実装の感覚を掴んで、徐々に応用範囲を広げてみてください。

📌 プログラミング・AI学習のおすすめスクール

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました