paizaラーニングでAI・機械学習入門にチャレンジ

Python
スポンサーリンク

期間限定で無料公開してくれているpaizaラーニングの「PythonxAI・機械学習入門編」に挑戦しました。

Python×AI・機械学習入門編
Python×AI・機械学習入門編のレッスン一覧です。各レッスンは、それぞれ数本の3分程度の動画(チャプター)とそれに対応した演習問題で構成されています。

AI Academyさんにもある「教師あり学習(*)」を使った機械学習がメインでした。

(*)教師あり学習:正しい分類が何かの具体例を示すデータのこと。入力データに対して期待する答えが紐づけたもの。

この学習データを1つ1つ作るのが大変ですね。(今回はあらかじめ用意されていたCSVを使用しました)

今回のコースは全体を通して100個の画像から特徴量を抽出して、k近傍法というアルゴリズムで学習し、特定のキャラクターが画像に存在するかどうかを分類する、というものでした。

最初に正解となるCSVデータを読み込みます。

import pandas as pd
targets_data = pd.read_csv(CSVファイルのパス)

次に画像をグレースケールに変換して、ピクセルデータを抽出します。

import cv2
import numpy as np
from matplotlib import pyplot as plt

images = []
for i in range(100):
  file = ('images/%03d.png' %(i))
  img = cv2.imread(file, cv2.IMREAD_GRAYSCALE) // グレースケールに変換
  images_data.append(img)

images_data = np.empty((100,len(images[0].ravel())),int)
for i in range(100):
  images_data[i] = np.array([images[i].ravel()]) // グレースケール画像のピクセル値を1次元配列として取得

続けて、CSVファイルから取得したデータを教師データとテストデータに分離します。

import sklearn
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

X_train, X_test, y_train, y_test = train_test_split(images_data, targets_data['Kirishima'], random_state=0)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

k近傍法で学習します。

knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)

学習した結果をもとにテストデータで分類してみます。これだと的中率が6割くらいでした。

y_pred = knn.predict(X_test)
print(np.mean(y_pred == y_test))

再チャレンジ。今度は画像データのピクセル値を単純に配列化したものではなく、ヒストグラムを利用してやってみます。

images = []
for i in range(100):
  file = ('images/%03d.png' %(i))
  img = cv2.imread(file, cv2.IMREAD_GRAYSCALE) // グレースケールに変換
  hist = np.histogram(img.ravel(), 256, [0,256]) // ヒストグラムを抽出
images_data = np.append(images_data, np.array([hist[0]]), axis=0)

images_data = np.empty((100,len(images[0].ravel())),int)
for i in range(100):
  images_data[i] = np.array([images[i].ravel()]) // グレースケール画像のピクセル値を1次元配列として取得

再度、教師データとテストデータの分割、k近傍法での学習を実施し、分類してしみます。今回の結果は的中率85%くらいでした。ヒストグラムを使った方が精度が高いことが分かります。

y_pred = knn.predict(X_test)
print(np.mean(y_pred == y_test))

一言で機械学習といっても、どう機械学習させるかで精度がかなり違ってくるもんですね。。。

コメント