pythonの機械学習ライブラリ(scikit-learn)を用いて、県旗を分類する

# 目的
pythonの機械学習ライブラリ(scikit-learn)を用いて、画像データを分類する事ができます。
今回は日本の県旗の分類を試みました。

本取り組みを行う上で、[こちらのサイト](https://webbibouroku.com/Blog/Article/sklearn-cluster-flag#outline__1)を参考にさせて頂きました。

# 準備
・python scikit-learnライブラリ
・[都道府県旗-wikipedia ](https://ja.wikipedia.org/wiki/都道府県旗)の画像データ
(47都道府県+東京都シンボル旗=48個の旗データを取得します）
<img width="128" alt="スクリーンショット 2019-04-29 19.06.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/7b0c477c-fba3-dfa7-5f13-675dc0274c79.png">
・フォルダ
例に習って下記３フォルダを事前に作成します。
　flag_origin ：元データ(48個)
　flag_convert：サイズ変換後データ(48個)
　flag_group  ：分類後データ(5クラス)
<img width="240" alt="スクリーンショット 2019-04-29 19.09.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/97a5b9a0-9e65-1507-6dbf-f6822e731a6a.png">


# コード

```
$ python resize.py
```

```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
```

```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 薄い青系
左から、福岡、兵庫、石川、滋賀、山形
<img width="555" alt="class0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/c7b43c07-7482-4706-3749-c5012d0c50bf.png">


▪️クラス1 背景白い系
左から、東京都シンボル旗、青森、岐阜、鹿児島、神奈川、長崎、奈良、大分
沖縄、埼玉、富山、和歌山
<img width="881" alt="class1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/c553c620-24bc-ebd0-17d6-4009eed75855.png">


▪️クラス2 赤系
左から、愛知、秋田、福島、広島、高知、熊本、長野、新潟
島根、山口
<img width="884" alt="class2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/8eee24d1-4152-8990-ce7a-458c22072564.png">


▪️クラス3 緑系
左から、愛媛、三重、宮崎、栃木
<img width="447" alt="class3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/2d05b945-70b9-9124-4956-ba55e6e34fca.png">


▪️クラス4 その他濃い色
左から、千葉、福井、群馬、北海道、茨城、岩手、香川、京都
岡山、大阪、佐賀、静岡、徳島、東京都、鳥取、山梨
宮城

<img width="881" alt="class4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/e17ae6fe-98dc-7cf1-2d85-4b522af32fb7.png">



人の目で見ても大体納得がいく位には分類する事ができました。
（個人的に、福岡の県旗が素敵に感じます）


# CodingError対策

```
ImportError: cannot import name '_validate_lengths' from 'numpy.lib.arraypad' (/anaconda3/lib/python3.7/site-packages/numpy/lib/arraypad.py)
```

[こちらのサイト](https://stackoverflow.com/questions/54241226/importerror-cannot-import-name-validate-lengths)を参照し、scikit-imageを最新にすれば良いとの事のため、下記の通りupgradeして解決。

```
$ pip install --upgrade scikit-image
```

# 参考
[都道府県旗](https://ja.wikipedia.org/wiki/都道府県旗)
[scikit-learnで国旗画像をクラスタリングして似ているものを探す](https://webbibouroku.com/Blog/Article/sklearn-cluster-flag#outline__1)