#はじめに
どうも初めまして.今回が初投稿となります.大学院でNNを利用した研究をしています.
遊びながらNNを学ぶことで少しでも多くの方に機械学習等への興味を持っていただければと思います.
#背景
最近ポケモンユナイトというゲームにハマっているのですが,他の方がどういうポケモンを使っているのか,ということを数値化してデータ分析しようと思い,スクショ画像からそれらのデータ集めを行おうと考えました.
つまりは,自分が実際に対戦した人達,ランキング上位勢などそれぞれでの環境調査をして,少しでもかつ安くするためにはどうすれば良いかを考えよう!ということです笑
#対戦履歴で環境調査
今回は,まず簡単なところをやっていきます.ポケモンユナイトでは対戦後にリザルト画面で次のような画面が出てきます.
そのため,これをスクショし,ポケモンの画像部分をトリミングしてデータ収集していきます.
トリミングする位置さえ間違えなければ,ほぼ同じ画像を分類するだけなのでk-meansで正しく分類できるだろうと思い,k-meansを使うことにしました.
とりあえず,50戦分の履歴が残っているのでひたすらスクショしまくり,250枚のデータを用意しました.
これらを用いてk-meansを実行.プログラムは以下
import matplotlib.pyplot as plt
import os
import shutil
import numpy as np
from PIL import Image
import skimage
from skimage import io
from sklearn.cluster import KMeans
import cv2
import imageio
convert_path = '/content/drive/MyDrive/trim/' #トリミング後の分類したい画像データを格納しているフォルダ
feature = np.array([io.imread(convert_path + f)for f in os.listdir(convert_path)])#画像読み込み
feature = feature.reshape(len(feature), -1).astype(np.float64)
n_cluster = 30
model = KMeans(n_clusters=n_cluster).fit(feature)
labels = model.labels_
今回はクラスタ数を30としていますが,これは2022年2月現在で実装済みのポケモンが30体いるためです.
k-meansを実行した後,ラベルに基づいて各フォルダにまとめグループ分けをします.
k-meansからグループ分けについては環境構築からk平均法を用いた画像分類までをやってみた話を参考にしています.(google colaboratoryに搭載されていない? モジュールもあったので一部改変して利用しています)
group_path = '/content/drive/MyDrive/group/'
for label, path in zip(labels, os.listdir(convert_path)):
if os.path.exists(group_path) == False:
os.mkdir(group_path)
copy_path = group_path+str(label)
if os.path.exists(copy_path) == False:
os.mkdir(copy_path)
shutil.copyfile(convert_path+path, copy_path+"/"+path)
最後に今回分類した結果から各ポケモンの使用率をまとめました.(ここからはポケモンユナイトユーザー以外は見る必要ありません笑)
total = sum(os.path.isfile(os.path.join(convert_path,name)) for name in os.listdir(convert_path))
for i in os.listdir(group_path):
list_img = []
use_count = 0
for j in os.listdir(group_path + i):
plt.figure()
#im = Image.open(group_path + i +'/'+ j)
im = cv2.imread(group_path + i +'/'+ j)
list_img.append(im)
im_join = cv2.hconcat(list_img)
use_count += 1
im_join = cv2.cvtColor(im_join, cv2.COLOR_BGR2RGB)
#print('使用率:'+str(100 * use_count/total) + '%')
plt.imshow(im_join)
plt.title( str(100 * use_count/total) + '%' ) #タイトルに使用率を表示
##結果
結果はこんな感じでした.
オーロット
ピンプク
アブソル
アマージョ
カイリキー
ウッウ
ピカチュウ
エースバーン
ガブリアス
ニンフィア
フシギバナ
ヨクバリス
リザードン
ルカリオ(ちっさい笑)
ジュナイパー
カイリュー
ファイアロー
ゼラオラ
マンムー
サーナイト
バリヤード
ハピナス
カビゴン
ワタシラガ
ゲッコウガ
イワパレス
ゲンガー
ヤドラン
アローラロコン
カメックス
#最後に
ピカチュウや,ルカリオといった優遇ポケはやっぱり人気な様です.
ただ,流石に30体もいれば一回も使われないポケモンもいるかと思っていたので,最低1回は使われていたのは意外でした.
今回は初投稿ということもあり,簡単なタスクに関する記事を書かせていただきました.
今後はNNを用いた分類タスクの記事も書いていこうと思います(なるべくアニメやゲームに関連させます笑).
記事に関するご感想や,こうした方が良いという意見(プログラムに関する意見も),今後こんなこと記事にしてほしいということがありましたら教えていただけると喜びます.
最後まで目を通していただきありがとうございました.