今回はKerasをつかって、画像認識のコードを書いていきます。
KerasにはCIFAR-10という画像データのデータセットがあります。
それで学習させて、なんの画像かを当てるコードです。
〇CNNとは
CNN(Convolutional
Neural Network)は、主に画像認識やパターン認識などのタスクに適したディープラーニングの一種です。CNNは、畳み込み層(Convolutional Layer)、プーリング層(Pooling Layer)、全結合層(Fully Connected Layer)から構成されるニューラルネットワークです。
畳み込み層は、入力データに対して畳み込み演算を行い、特徴マップを生成します。この操作は、画像内の局所的な特徴を検出するために役立ちます。畳み込み層には、畳み込みカーネルと呼ばれる学習可能なフィルタが使用されます。
プーリング層は、特徴マップの次元を削減し、計算量を減らすために使われます。一般的には最大プーリング(Max Pooling)や平均プーリング(Average Pooling)が用いられます。
全結合層は、畳み込みとプーリングの結果を受け取り、最終的な出力を生成します。これは通常、クラス分類や回帰などのタスクに対応しています。
CNNは、画像の階層的な特徴を学習するのに優れており、畳み込み層が局所的な特徴を抽出し、プーリング層がその特徴を集約して全結合層に渡すというアーキテクチャが特徴的です。これにより、位置に対する頑健性や、データの階層的な構造を捉える能力が向上します。
〇コードの実装
まず、Kerasと必要なライブラリをインストールします。
pip install tensorflow
そして、以下はCIFAR-10に対する簡単なCNNの実装例です。
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import
cifar10
from tensorflow.keras.utils import
to_categorical
import numpy as np
from tensorflow.keras.preprocessing import
image
import matplotlib.pyplot as plt
# CIFAR-10データセットの読み込み
(x_train, y_train), (x_test, y_test) =
cifar10.load_data()
# データの正規化
x_train, x_test = x_train / 255.0, x_test /
255.0
# ラベルをone-hotエンコーディング
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# モデルの構築
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3),
activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3),
activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3),
activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64,
activation='relu'))
model.add(layers.Dense(10,
activation='softmax'))
# モデルのコンパイル
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# モデルの概要表示
model.summary()
# モデルの訓練
model.fit(x_train, y_train, epochs=10,
validation_data=(x_test, y_test))
この例では、3つの畳み込み層とプーリング層、それに続く2つの全結合層からなるシンプルなCNNを構築しています。最後の層は10クラスの分類問題のためにsoftmax活性化関数を使用しています。
〇画像の予測
# テスト用の画像読み込み(CIFAR-10データセットの最初の画像を使用)
test_image = x_test[0]
test_image = np.expand_dims(test_image,
axis=0) # バッチ次元を追加
# モデルの予測
predictions = model.predict(test_image)
# 予測結果の表示
class_names = ["airplane",
"automobile", "bird", "cat", "deer",
"dog", "frog", "horse", "ship",
"truck"]
predicted_class = np.argmax(predictions)
predicted_class_name =
class_names[predicted_class]
# 元の画像を表示
plt.imshow(x_test[0])
plt.title(f"Predicted class:
{predicted_class_name}")
plt.show()
このコードは、テスト画像をモデルに渡して予測を行い、その結果を表示します。テスト画像がCIFAR-10データセットの最初の画像であることに注意してください。実際には、自分の画像を利用する場合には、適切に前処理する必要があります。
〇CNNの使用例
CNNは画像認識や画像分類の分野で特に優れた性能を発揮し、多くの実際の応用例が存在します。以下はいくつかの代表的な例です。
・顔認識:
CNNは顔認識の分野で広く使用されています。Facebookの顔認識機能やスマートフォンの顔認識ロックなどがその例です。
・自動運転技術:
自動運転車のセンサーデータからの物体検出や、道路上の標識認識においてCNNが活用されています。
・医療画像解析:
医療分野では、X線、MRI、CTなどの画像データを解析する際にCNNが利用され、病変の検出や疾患の診断に寄与しています。
・動画分析:
動画分析においても、CNNはフレームごとの特徴を学習して物体検出や行動認識などに利用されます。セキュリティカメラや交通監視システムなどで使用されています。
・自然言語処理:
画像以外の分野でも応用されており、テキストの特徴を抽出するためにCNNが使用されています。例えば、テキストの感情分析や機械翻訳などがあります。
アート生成:
CNNは画像生成の分野でも使用され、DeepDreamなどのアート生成アプリケーションで遊ぶためにも利用されています。
これらは一部の例であり、CNNはその優れた特徴抽出能力と階層的な学習により、多岐にわたる分野で広く利用されています。
〇まとめ
Kerasをつかって画像認識させると、やっとこさAIをつくっているんだなーと実感できます。scikit-learnでは統計的アルゴリズムを用いた機械学習がメインですが、Kerasは深層学習をメインとしたライブラリとなっています。
画像認識だけではなく、線形回帰とかもできるのでどんどんつかっていきましょう。
0 件のコメント:
コメントを投稿