期間限定で無料公開してくれている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))
一言で機械学習といっても、どう機械学習させるかで精度がかなり違ってくるもんですね。。。
コメント