はじめに
「画像認識」と聞くと難しそうに感じるかもしれません。でも実は、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学習のおすすめスクール
- 資格と仕事に強い個人レッスン → 【Winスクール】プログラミング・AI講座

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


コメント