
写真フリー素材サイトFlickrより犬の写真を200枚、猫の写真を200枚用意して、その中の80%を教師データ、残りの20%をテストデータとして、機械学習プログラムにて犬と猫を判別するプログラムを書いてみました。
犬と猫を判別するプログラム
import imageio
import numpy as np
# 写真は全て 75ピクセル × 75ピクセル のRGBカラー画像
PHOTO_SIZE = 75 * 75 * 3
# 空の配列(計測データ X と教師データ y)を用意する
X = np.empty((0, PHOTO_SIZE), np.uint8)
y = np.empty(0, np.uint8)
# 犬と猫の画像を配列形式で読み込んでXに格納(axis = 0で二次元配列の縦(行)に要素を追加する)
# y には 犬 なら 0, 猫 なら 1 で整数値のデータを追加
for i in range(1, 201):
p1 = imageio.imread(f"dc_photos/dogs/dog-{i:03d}.jpg").reshape(1, PHOTO_SIZE)
X = np.append(X, p1, axis = 0)
y = np.append(y, np.array([0], dtype = np.uint8))
p2 = imageio.imread(f"dc_photos/cats/cat-{i:03d}.jpg").reshape(1, PHOTO_SIZE)
X = np.append(X, p2, axis = 0)
y = np.append(y, np.array([1], dtype = np.uint8))
# Xおよびyの要素数を確認する
print("--------------配列の要素数----------------")
print("計測データ Xの要素数 =",X.shape)
print("教師データ yの要素数 =",y.shape)
# 300件目までを訓練データ、301件目以降をテストデータに分割する
X_train = X[:301]
X_test = X[301:]
y_train = y[:301]
y_test = y[301:]
# 線形分類器を作成して訓練データを設定する
from sklearn.svm import SVC
classifier = SVC(kernel = "linear")
classifier.fit(X_train,y_train)
## テストデータを分類器にかける
y_pred = classifier.predict(X_test)
# 分類器の出力結果を表示する
print(y_pred)
# 正解を表示する
print(y_test)
# 混合行列を表示する
from sklearn import metrics
print(metrics.confusion_matrix(y_test, y_pred))
# 正答率を確認する
print(metrics.classification_report(y_test,y_pred))
実行結果
precision recall f1-score support
0 0.79 0.94 0.86 49
1 0.93 0.76 0.84 50
avg / total 0.86 0.85 0.85 99正解率は平均で85%程度なのでまずまず判別に使える分類器になりまた。
正解率を100%に近づけるためには、画像データを数万枚程度用意する必要があるそうです。






