Pythonで画像認識モデルを作る方法!CNN(畳み込みニューラルネット)超入門
生徒
「最近よく聞く『AIによる画像認識』を自分でもやってみたいんですけど、プログラミング未経験の私でも作れますか?」
先生
「もちろんです!Python(パイソン)という言葉をコンピュータに伝える道具を使えば、初心者の方でも画像を見分けるAIを作ることができますよ。」
生徒
「『CNN』っていう難しい言葉も聞いたことがあるんですが、それも必要なんですか?」
先生
「CNNは画像認識の得意分野なんです。人間の目の仕組みをヒントに作られた仕組みなんですよ。まずは基本から一緒に学んでいきましょう!」
1. 画像認識とPython、そしてCNNとは何か?
画像認識とは、コンピュータが写真や動画の中に「何が写っているか」を自動で判断する技術のことです。例えば、スマホの顔認証や、自動運転車が歩行者を見つける技術に使われています。
この画像認識を開発するのに最も適しているのがPython(パイソン)というプログラミング言語です。Pythonは文法がシンプルで、初心者でも読み書きしやすいのが特徴です。さらに、AIを作るための「道具箱(ライブラリ)」が非常に充実しています。
そして、画像認識の主役となるのがCNN(畳み込みニューラルネットワーク)です。これは、コンピュータが画像の特徴(縦の線、横の線、丸みなど)を段階的に学習していく仕組みです。まるで人間が「これは耳があるから猫かな?」と判断するプロセスをコンピュータに再現させたようなものだと考えてください。
[Image of Convolutional Neural Network architecture]未経験の方にとっては「ニューラルネットワーク」という言葉だけで難しそうに感じるかもしれませんが、要するに「人間の脳の神経回路を真似した計算モデル」のことです。これを使うことで、コンピュータは大量の画像データから勝手にルールを見つけ出してくれるのです。
2. 開発環境を整えよう!ライブラリのインストール
PythonでAIを作るためには、専門の道具を揃える必要があります。これを「ライブラリのインストール」と呼びます。主に使うのは、計算を得意とする「NumPy」、グラフを描く「Matplotlib」、そしてAIの本体を作る「TensorFlow(テンソルフロー)」や「Keras(ケラス)」です。
初心者の方は、自分のパソコンに環境を作るよりも、Googleが提供している「Google Colaboratory」というサービスを使うのがおすすめです。これなら、ブラウザさえあれば設定不要ですぐにプログラミングを始められます。
まずは、必要な道具が揃っているか確認するための簡単なコードを書いてみましょう。以下のコードは、使用するライブラリのバージョンを表示するだけのものです。
import tensorflow as tf
import numpy as np
print("TensorFlowのバージョン:", tf.__version__)
print("NumPyのバージョン:", np.__version__)
実行すると、数字が表示されます。これが表示されれば、準備はバッチリです。
TensorFlowのバージョン: 2.x.x
NumPyのバージョン: 1.x.x
3. 画像認識の仕組み「畳み込み」を身近な例で解説
CNNの「畳み込み(たたみこみ)」という言葉は、日常ではあまり使いませんよね。簡単に言うと、これは「画像の一部を虫眼鏡でじっくり見て、特徴を探す作業」のことです。
コンピュータにとって、画像はただの数字の羅列(色の濃さを数字にしたもの)に過ぎません。CNNはこの数字の塊に「フィルタ」という網を被せて、少しずつずらしながらスキャンしていきます。これによって「ここは斜めの線があるな」「ここは丸い形をしているな」という特徴を抽出します。
例えば、手書きの「8」という数字を認識する場合を考えてみましょう。CNNはまず、小さな円が2つ重なっているという特徴を見つけます。その後、それらが上下に並んでいることを認識し、最終的に「これは8だ!」と結論づけます。この「部分から全体へ」という流れがCNNの凄さなのです。
4. データを準備する!AIの「教科書」を作ろう
AIに何かを覚えさせるには、大量の画像が必要です。これを「学習データ」と呼びます。初心者が練習によく使うのが、手書き数字の画像セットである「MNIST(エムニスト)」です。0から9までの数字が書かれた、数万枚の小さな画像が入っています。
プログラムの中で、このデータをダウンロードしてみましょう。Pythonなら数行で終わります。
from tensorflow.keras.datasets import mnist
# データの読み込み
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# データの数を確認
print("学習用画像の数:", len(x_train))
print("テスト用画像の数:", len(x_test))
このコードでは、AIを鍛えるための「学習用データ」と、AIが本当に覚えたか試すための「テスト用データ」に分けています。学校の勉強で言うなら、練習問題と本番の試験のような関係ですね。
学習用画像の数: 60000
テスト用画像の数: 10000
5. モデルを作成する!CNNの組み立て方
いよいよAIの心臓部を作ります。CNNのモデルは、複数の「層(レイヤー)」を積み重ねて作ります。パンケーキを重ねるようなイメージですね。一番下の層から画像が入り、各層で処理されて、一番上の層から「これは5です」という答えが出てきます。
代表的な層には、特徴を探す「Conv2D(畳み込み層)」、データを小さくまとめて要点を絞る「MaxPooling2D(プーリング層)」、そして最終的な判断を下す「Dense(全結合層)」があります。これらを順番に並べていくのがプログラミングの作業です。
from tensorflow.keras import layers, models
# 空のモデル(入れ物)を作る
model = models.Sequential()
# 畳み込み層を追加(特徴を見つける)
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
# プーリング層を追加(情報を凝縮する)
model.add(layers.MaxPooling2D((2, 2)))
# データを1列に並べ替える
model.add(layers.Flatten())
# 最後の判断をする層(0~9の10種類に分類)
model.add(layers.Dense(10, activation='softmax'))
print("モデルの組み立てが完了しました!")
ここで出てくる `relu` や `softmax` といった言葉は「活性化関数」と呼ばれます。これは、次の層にどのくらいの強さで情報を伝えるかを決めるスイッチのような役割を果たしています。最初は呪文のように感じても大丈夫です。
6. 学習の実行!AIに知識を叩き込む
モデルができたら、いよいよ学習(トレーニング)の開始です。AIに画像を見せ、「この画像は3だよ」「この画像は7だよ」と正解を教えていきます。これを何度も繰り返すことで、AIの中の計算パラメータが調整され、少しずつ賢くなっていきます。
学習の回数を「エポック(Epoch)」と呼びます。10エポックなら、データ全体を10回繰り返し学習するという意味です。あまりに回数が多すぎると「過学習(かがくしゅう)」と言って、練習問題の答えだけを丸暗記して応用が利かない状態になってしまうので注意が必要です。
# 学習の設定(どうやって間違いを修正するか決める)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 学習の開始(5回繰り返す)
model.fit(x_train.reshape(-1, 28, 28, 1), y_train, epochs=5)
このコードを実行すると、画面に学習が進んでいる様子が表示されます。「loss」という値がどんどん小さくなり、「accuracy(正解率)」が1.0に近づいていけば、学習が順調に進んでいる証拠です。
7. 性能をテストしよう!未知の画像への挑戦
学習が終わったら、最後に「テストデータ」を使ってAIの実力を判定します。AIが一度も見校したことがない画像に対して、どれだけ正しく答えられるかをチェックします。これが本当の意味での「画像認識ができるようになったか」の判断基準になります。
優秀なAIであれば、95%から99%以上の精度で数字を当てることができます。もし精度が低い場合は、層の数を増やしたり、学習の回数を変えたりして調整(チューニング)を行います。この試行錯誤こそが、AI開発の醍醐味です。
# テストデータで性能を確認
test_loss, test_acc = model.evaluate(x_test.reshape(-1, 28, 28, 1), y_test)
print("テストの正解率:", test_acc)
実行結果として正解率が表示されます。0.98と出れば、98%の確率で正解しているということになります。未経験の方が書いたコードでも、これほど高い精度が出せるのがPythonとCNNの素晴らしいところです。
313/313 [==============================] - 1s 2ms/step - loss: 0.0512 - accuracy: 0.9845
テストの正解率: 0.984500002861023
8. CNNの応用範囲とこれからのステップ
今回は手書き数字というシンプルな例を扱いましたが、CNNの可能性は無限大です。同じ仕組みを使って、犬と猫を見分けたり、レントゲン写真から病気を見つけたり、工場の製品から不良品を検知したりすることができます。
画像のサイズが大きくなったり、カラー画像になったりすると、計算量は増えますが、基本的な考え方はすべて同じ「畳み込み」と「プーリング」の組み合わせです。まずはこの基本をしっかりと理解することが、AIエンジニアへの第一歩となります。
プログラミング未経験の方は、まず「コードをコピーして動かしてみる」ことから始めてみてください。画面の中でAIが賢くなっていく様子を見るのは、とても感動的な体験ですよ。Pythonという強力な相棒と一緒に、画像認識の不思議な世界をさらに深く探求していきましょう。