※今回の内容は水野先生がやっとることのごく一部分を二番煎じしただけのものです。
誰向けなのかわかんない
できるしできたが配布しんどいので、やりたい人はこう作ったらいいかもという記事。
水野先生と話したときも配布きつい形態だよねという指摘はもらっていて、OBSのプラグインとかで作れたらいいねと伺っておるので、志の高い人はぜひその方向で作って配布してほしい。
わたしは欲しい物がだいたい作れた上、練習が先だ。
戦績の分析ができると素敵だ(韻)
頻繁に見に行ってるサイトがいくつかあって、そのうちのひとつがいつもおもしろい取り組みや調査をしている。水野先生のとこなわけだが、葬儀屋さんという方の戦績を500戦集めて分析するやらなにやら。
たぶん500というのが追える履歴の最大なんだろう。CFNの履歴は50個ずつのページングになっているから、全10ページ見られるのかも。
「えーそれってCFNの戦歴を順繰りに見てメモ取るんじゃないよね・・・?」って思ったらやってて、姿勢に驚かされた。
この作業はしんどすぎるため、ちょっと普通のひとはやらない。
調査した結果、敗北しやすいキャラ、負け方に至るまでを詳らかにしていた。
私もやりたい
スト5の対戦結果を解析したい。データでなにやらわかったりしたい。
ポイズンに変え、滑落したばっかで傾向もクソもないから今使いたいわけじゃないが、「あんた下位リーグにいるリュウに負けてLP失いすぎっすよ」的なやつは後でほしくなる。
LPが上下動をしているのは誰かに負けるからだ。なので、誰に負けているかを理解して対応につとめれば、勝率が良くなっていく。
んでその結果として、水位であるところのLPが上がっていく。
ただ、相当手際よくやってた彼が500戦を追うのに12時間かけていたわけで、自分でやったらどんだけ悲惨なことになるかは容易に想像がつく。というかしんどすぎてやめると思う。
わたしの仕事中の口癖ランキング第二位は「こんなの人間がやる仕事じゃねえ」なので、ここでも人間がやらずに済む方法を考えたい。
ちなみに第一位は「もう帰りたい」です。
仕事は家でしてます。
仕掛けを考えよう
自動化。
使える道具は限られているし、気の利いたこともあんま思いつかない。
とにかく持ってる武器、具体的にはPythonで何とかする必要がある。
こんなコトできるかな、こんなライブラリあったよなを検索していく。
スクリプト実行後に、スト5の画面をアクティブにさせるのはPyAutoGUI、スクリーンショットも取れる。
こやつでキー入力も送る。Bが決定でNがキャンセル、あと矢印の下できたらOK。
PillowとOpencvで画像処理をやる。
一覧表示とリプレイ情報の画面表示を切り替えながらスクリーンショットを取っていくのは、毎度画面撮って判定をすればなんとかなるだろう。
画像の判定やる時はグレースケールにしてから保存する。
画像から特定箇所を探すとかは前にやってみたことがあって、仕掛けは理解していないが使い方だけ分かる。
ここまではいい。
未知のところ
画像の集め方はわかったが、読み取り方がわからない。OCR使うんだとな、は分かる。
OCRのセットアップがしんどそう。環境構築で手間取るとモチベが失われる。
GoogleColabを使うと楽だよとかを見つけたので早速やっていく。つまりローカルで動かす子と、GoogleColabで動かす子の二段構えにする。この時点でもう配布するとか他人が使うとかは考慮から外して、未来の自分が何も覚えてなくても使える、くらいまでをラインに作っていく。
まずはリプレイ画像を集める
できた。
リプレイは一覧とリプレイ情報の2つを行き来するから、いまどっち表示中かな?ボタン押したけど状態変わったかな?とかをを判定しながら実行する。
それに加えて、さっきも撮ったリプレイIDかな?とか、下押したけどカーソル動いたかな?とかを加えていくと、一覧→リプレイ情報の画面撮影→一覧→次のリプレイを選択→……の一連の動作ができる。
未だにうまく行ってない箇所はあって、リプレイ50件たどったあとのページングでとくに困っている。
一番下まで行って「下」を押すと次のページに移動するんだが、ページ遷移を諦めることが頻繁にある。ふざけんなちゃんとやれよ。
これはスト5のクライアントの作りに問題があるため、こっちでカバーするにも限度がある。
結局「終わったよ~」って判定して半端なとこで取得を終えちゃう事が多い上、他人が使うものでもないので「一度終わったように見えても何回も起動する」と力技で対応している。
こうすると一部のリプレイは何度も撮影してしまいファイルが増えるが、どれだけ重複してもリプレイIDで重複排除をするので問題ない。
画像を「読む」
OCRらへんはあんまり経験がない。「画像の判定する時はグレースケールに変換してからやる」とかだけ知ってたから、前段階でそのようにしている。そこまでは分かる。
OCRらへんのセットアップはGoogleColabでさっとやり、PandasとかOpencvとかいつもの道具をぼこぼこ入れる。
読み取りの処理は2個に分けて、画像そのもので判定する部分と、文字として読み取る部分で別にする。
画像そのものの判定
VS・VT判定用のこんなのとか、
キャラ選択を判定するこんなのとかを用意。
画像まるまるを判定に渡すと重いので、判定部分を極力小さく切り取ってから処理に回す。
画像のどこがどれなんよとかはFireworks(未だに現役)で長方形置いて、座標取ってた。
画像は判定したい部分を比較用画像と同じサイズに切り取ってから処理にわたしている。
判定自体はそこらへんでよくやってるようなことと同じなので割愛。
文字として読み取る部分
グレースケールのまま読み取ってもそれなりの精度が出たが、それなりだ。
リプレイID、日時、LVとLP、FIDをとりたいんだがしばしば誤読をする。
なので白黒の2値に変換。流石にそうすべきだった。
んであちこちを取っていく。誤読を防ぐためのあれこれ調整で時間はかかった。2値にするときのしきい値と、OCRに読ませる設定と。
最後にどうしてもそれすら突破するんで、とくにリプレイID間違ってるかどうかだけは判定を入れる。
オーをゼロにする、Zを7にする、程度の修正しかできないので、正規の文字列かどうかを判定して、結果のシートに書き込んでいる。
んでこうなる
ワーワーまとめたやつをPandasでDataFrameにして、いじって、CSVとかSpreadSheetに出力。
SpreadSheetに出すの簡単なんだなあ。これも今回はじめてやった。
コストかけたら色々できるね?
試合の動画を撮る、アタックデータと入力も出す、HPが減ったタイミングで値を拾っていくと、タイムラインのどこでいくらダメージ稼いでる・いくら被弾している、とかをシートに起こせる。
キャラの位置とかは読めないから取れるデータに限度がある。
たぶん位置・間合いの数値まで取るなら動画じゃなくてHit Box Viewer みたいなアプローチがいるけど、メーカーが「やるなよ」と言うラインを越えとるから、やりとうない。
そんなとこまで自分が興味あるわけじゃないから、なんかやること思いついたら調べてみよう。
立川さんがやろうとしてるようなコーチングをはじめ、プレイヤー周辺の経済圏ができてきたら分析周りのアプリやビジネスも整備されていくのかもね。
格ゲーの腕前はついていかないがデータドリブンの方は何かと面白そうな分野なので、そっちの仕事もやれたら楽しいなーとは思っている。
そっち方面やるぞとかの会社さんいたらご連絡ください。