1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ポケモンUNITEの流行ポケモンが知りたい!

Posted at

#はじめに
どうも初めまして.今回が初投稿となります.大学院でNNを利用した研究をしています.
遊びながらNNを学ぶことで少しでも多くの方に機械学習等への興味を持っていただければと思います.

#背景
最近ポケモンユナイトというゲームにハマっているのですが,他の方がどういうポケモンを使っているのか,ということを数値化してデータ分析しようと思い,スクショ画像からそれらのデータ集めを行おうと考えました.
つまりは,自分が実際に対戦した人達,ランキング上位勢などそれぞれでの環境調査をして,少しでもかつ安くするためにはどうすれば良いかを考えよう!ということです笑

#対戦履歴で環境調査
今回は,まず簡単なところをやっていきます.ポケモンユナイトでは対戦後にリザルト画面で次のような画面が出てきます.
そのため,これをスクショし,ポケモンの画像部分をトリミングしてデータ収集していきます.IMG_5190.jpg
トリミングする位置さえ間違えなければ,ほぼ同じ画像を分類するだけなのでk-meansで正しく分類できるだろうと思い,k-meansを使うことにしました.

##k-means実行
トリミングした後の画像がこちら
スクリーンショット 2022-02-06 2.29.06.png

とりあえず,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) + '%' ) #タイトルに使用率を表示

##結果
結果はこんな感じでした.
オーロット
image.png
ピンプク
image.png
アブソル
image.png
アマージョ
image.png
カイリキー
image.png
ウッウ
image.png
ピカチュウ
image.png
エースバーン
image.png
ガブリアス
image.png
ニンフィア
image.png
フシギバナ
image.png
ヨクバリス
image.png
リザードン
image.png
ルカリオ(ちっさい笑)
image.png
ジュナイパー
image.png
カイリュー
image.png
ファイアロー
image.png
ゼラオラ
image.png
マンムー
image.png
サーナイト
image.png
バリヤード
image.png
ハピナス
image.png
カビゴン
image.png
ワタシラガ
image.png
ゲッコウガ
image.png
イワパレス
image.png
ゲンガー
image.png
ヤドラン
image.png
アローラロコン
image.png
カメックス
image.png

#最後に
ピカチュウや,ルカリオといった優遇ポケはやっぱり人気な様です.
ただ,流石に30体もいれば一回も使われないポケモンもいるかと思っていたので,最低1回は使われていたのは意外でした.
今回は初投稿ということもあり,簡単なタスクに関する記事を書かせていただきました.
今後はNNを用いた分類タスクの記事も書いていこうと思います(なるべくアニメやゲームに関連させます笑).
記事に関するご感想や,こうした方が良いという意見(プログラムに関する意見も),今後こんなこと記事にしてほしいということがありましたら教えていただけると喜びます.
最後まで目を通していただきありがとうございました.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?