はじめに
画像分類は、機械学習の分野で広く使用される技術の一つです。この記事では、TensorFlowを使用してオープンデータを基に簡単に画像分類を行う方法について説明します。
ステップ1: オープンデータの取得
最初のステップは、オープンデータを取得することです。多くのオープンデータセットがオンラインで利用可能で、例えばKaggle、ImageNet、CIFAR-10などがあります。今回は、CIFAR-10データセットを使用します。
import tensorflow as tf
# CIFAR-10データセットの読み込み
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
CIFAR-10データセットは車や鳥など10カテゴリのデータが含まれています。
実際に取り込んだ画像データから5枚の画像を確認してみます。
# クラス名の定義
class_names = ['Airplane', 'Car', 'Bird', 'Cat', 'Deer', 'Dog', 'Frog', 'Horse', 'Ship', 'Truck']
# 画像の表示
plt.figure(figsize=(10,10))
for i in range(5):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i], cmap=plt.cm.binary)
# CIFARのラベルは0から始まるので、そのままクラス名にインデックスとして使用
plt.xlabel(class_names[y_train[i][0]])
plt.show()
ステップ2: データの前処理
データをモデルに入力する前に、適切な前処理が必要です。一般的な前処理には、正規化やリサイズなどが含まれます。
# データの正規化
x_train, x_test = x_train / 255.0, x_test / 255.0
ステップ3: モデルの構築と訓練
モデルの構築には、TensorFlowのKeras APIを使用します。ここでは、シンプルなニューラルネットワーク()を構築し、活性化関数としてReLUを使用します。このモデルは入力層、隠れ層、そして出力層から構成され、各層は特定の目的を果たします。モデルのコンパイルでは、最適化アルゴリズム、損失関数、評価指標を定義します。訓練プロセスでは、モデルがデータからパターンを学習することが重要です。
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
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.Dense(10, activation='softmax')
])
#モデルをコンパイルし、訓練データを使ってモデルを訓練
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10)
ステップ4: モデルの評価と使用
最後に、テストデータを使ってモデルの性能を評価します。
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('\nTest accuracy:', test_acc)
Test accuracy: 0.797700023651123
ステップ5: テスト結果を可視化
モデルの予測を視覚的に確認するために、テスト画像とその予測ラベルを表示てみます。
# テストデータセットから予測を行う
predictions = model.predict(x_test)
# 画像と予測ラベルの表示
plt.figure(figsize=(10,10))
for i in range(10):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_test[i], interpolation='lanczos')
predicted_label = np.argmax(predictions[i])
true_label = y_test[i][0]
if predicted_label == true_label:
color = 'blue'
else:
color = 'red'
plt.xlabel("{} ({})".format(class_names[predicted_label],
class_names[true_label]),
color=color)
それぞれの画像の下に予測ラベルと実際のラベルが表示されます。予測が正しい場合は青色で、間違っている場合は赤色でラベルを表示されます。
今回は10問中、9問が正しくに分類されましたが、1問だけカエル(Frog)が鹿(Deer)と誤認されてしまったことが確認できます。
まとめ
この記事では、TensorFlowを使用してオープンデータを基に画像分類を行う方法を紹介しました。この基本的な流れを理解することで、個人の持つ画像データなど、さまざまな種類の画像分類タスクに取り組むことができます。