目的
pythonの機械学習ライブラリ(scikit-learn)を用いて、画像データを分類する事ができます。
今回は日本の県旗の分類を試みました。
本取り組みを行う上で、こちらのサイトを参考にさせて頂きました。
準備
・python scikit-learnライブラリ
・都道府県旗-wikipedia の画像データ
(47都道府県+東京都シンボル旗=48個の旗データを取得します)
・フォルダ
例に習って下記3フォルダを事前に作成します。
flag_origin :元データ(48個)
flag_convert:サイズ変換後データ(48個)
flag_group :分類後データ(5クラス)
コード
$ python resize.py
import os
from PIL import Image
for path in os.listdir('./flag_origin'):
img = Image.open(f'./flag_origin/{path}')
img = img.convert('RGB')
img_resize = img.resize((240, 160))
img_resize.save(f'./flag_convert/{path}.jpg')
$ python classify.py
import os
import shutil
import numpy as np
from skimage import data
from sklearn.cluster import KMeans
feature = np.array([data.imread(f'./flag_convert/{path}') for path in os.listdir('./flag_convert')])
feature = feature.reshape(len(feature), -1).astype(np.float64)
model = KMeans(n_clusters=5).fit(feature)
labels = model.labels_
for label, path in zip(labels, os.listdir('./flag_convert')):
os.makedirs(f"./flag_group/{label}", exist_ok=True)
shutil.copyfile(f"./flag_origin/{path.replace('.jpg', '')}", f"./flag_group/{label}/{path.replace('.jpg', '')}")
print(label, path)
テスト
5クラスに分けた結果、下記のようになりました。
▪️クラス0 薄い青系
左から、福岡、兵庫、石川、滋賀、山形
▪️クラス1 背景白い系
左から、東京都シンボル旗、青森、岐阜、鹿児島、神奈川、長崎、奈良、大分
沖縄、埼玉、富山、和歌山
▪️クラス2 赤系
左から、愛知、秋田、福島、広島、高知、熊本、長野、新潟
島根、山口
▪️クラス4 その他濃い色
左から、千葉、福井、群馬、北海道、茨城、岩手、香川、京都
岡山、大阪、佐賀、静岡、徳島、東京都、鳥取、山梨
宮城
人の目で見ても大体納得がいく位には分類する事ができました。
(個人的に、福岡の県旗が素敵に感じます)
CodingError対策
ImportError: cannot import name '_validate_lengths' from 'numpy.lib.arraypad' (/anaconda3/lib/python3.7/site-packages/numpy/lib/arraypad.py)
こちらのサイトを参照し、scikit-imageを最新にすれば良いとの事のため、下記の通りupgradeして解決。
$ pip install --upgrade scikit-image