![見出し画像](https://assets.st-note.com/production/uploads/images/81470815/rectangle_large_type_2_14ed070a10bdef569c3df4fa17b44fcf.png?width=1200)
IIDXのプレイ動画を解析して、黒イカEX-HARDに役立つツールができるか試してみた
こんにちは、まさおです。
この記事では「IIDXのプレイ動画を解析し、打鍵タイミングを可視化する方法」についての一例を紹介します。実際に今回の方法で作成したツールはこちらのページで確認できます。
ざっくりと説明すると、以下の4つの情報を動画から抽出し、youtube上の動画と一緒に再生できるようになっています。
打鍵タイミング
実際に降ってきたノーツ
残ゲージの変化
BPMの変化
![](https://assets.st-note.com/img/1656146394685-JoKZNnxEc5.png?width=1200)
このページの公開にあたっては、元動画の投稿者であるみつばさんに許可を頂きました。ありがとうございます。
1.開発に至った経緯
5/31にみつばさんが黒イカEX-HARD狙いの配信をされており、その途中で自分のプレイ動画を見返して打鍵スピードを確認するシーンがありました。(1:50:50くらい)
ただ、実際に見返して「分からない」と発言されている通り、流れていく映像を見るだけでは「本来の譜面に対してどの程度遅れていたのか」といった細かい情報を知るのは難しいものです。
それと同時に、この光景を見て2つのことに気づきました。
任意の鍵盤を押したタイミングはレーン上のボムやビームの表示を元にプログラムで認識できるのではないか
みつばさんは最近、黒イカをプレイする際に判定文字を消しているため、ビームの表示と干渉せず読み取りやすいのではないか
思いつきではありましたが、実用化できたら世の中のクリア/フルコン狙いをしている人達の助けになるかも、と思ったので実際に作ってみることにしました。
2.開発に使ったもの
python
OpenCV
scikit-learn
動画に対して画像認識を行うためのOpenCVと、BPMやゲージといった数値の認識を行うためのscikit-learnを使用しました。
実装の詳細についてはこの記事では省きつつ、以下ではツールで表示している情報の取得方法の概要を説明します。
3.各情報の取得方法
①打鍵タイミング
今回はビームが表示されているかどうかを色で判別することにしました。
![](https://assets.st-note.com/img/1656166094169-fWE39dRfgw.png?width=1200)
この部分は「レーンの高さがどの程度あるか(=白数字の値)」や「どのビーム・ボムを使っているか」などによって変わるので注意が必要です。
解析しやすいプレイ動画を撮るための基本的な考え方はこんな感じです。自分の動画を解析したい方は参考にしてください。(需要…?)
ボムはできるだけ上下左右に広がらないものが良い
ビームで判定する場合は、できるだけ長いものを使った方がボムと被らず認識しやすい(今回は判定文字が無いため短めでもOK)
ノーツの色とボム・ビームの色が異なっていると、色相で判定できて楽(同系色の場合は明度などを使う)
白数字大きめ & 長いビームだと下記のノーツ画像の生成ができないため注意する
②実際に降ってきたノーツ(1枚の画像として取得)
レーンの上の方を対象に前フレームをテンプレートとして次フレームの画面でテンプレートマッチングすると、何px移動したか分かるので、この値を元に最終的な画像を生成しています。
![](https://assets.st-note.com/img/1656171460468-IkNxqw1mUB.png?width=1200)
ただ、単純にこれだけだと枠内にノーツが1つも無い場合は移動距離が0になるため、その場合は前フレームの移動距離を元に補正するなどの対応を行っています。
③残ゲージ、④BPM
これはscikit-learnでSVMを使って判定しています。SVMについての詳細は省きますが、正解となる画像と値の組(教師データ)をいくつか用意しておくことで、新しい画像がどの値であるかを判別してくれる仕組みです。
事前準備として、OpenCVを使って動画の中で数値が表示されている部分を切り取り、1文字ずつ保存した画像を何枚か用意して教師データとします。
![](https://assets.st-note.com/img/1656148032775-nF5wkpx5XN.png?width=1200)
![](https://assets.st-note.com/img/1656148094002-doknbBguOf.png?width=1200)
このあたりは4/30のエリナ杯の動画からスコアグラフを作ってみた時の実装を流用することができました。
4.表示の際に工夫した所
上記の情報が取得できたら、あとは画面に表示するだけです。今回はミスした箇所を認識しやすくするため、いくつかの点を工夫しました。
4-1.打鍵タイミングとノーツ画像の表示を揃える
降ってきたノーツの部分は1枚の縦長画像になっているため、打鍵タイミングを表示する際にそれとズレないように考慮する必要があります。
今回は上記の通り1フレームで動いた距離を取得しているため、フレームごとに同じ高さの余白を配置することにより、画像とほぼ同じ大きさで表示されるようにしました。
![](https://assets.st-note.com/img/1656170333207-viLZHqmPaO.png?width=1200)
4-2.残ゲージが減った時の数値を表示
打鍵タイミングの部分の背景色でゲージの残量を表しているのですが、それだけだと具体的に減った%が分からないため、数値を表示するようにしてみました。
![](https://assets.st-note.com/img/1656167993914-J2L6MhKsj9.png?width=1200)
EX-HARDの場合、見逃しPOORで19.2%、BADと空POORで10%減少するらしいので、これと譜面を照らし合わせることでゲージが減った理由を追うことができます。
参考: beatmaniaIIDXシリーズ基礎情報まとめ
4-3.判定ラインを過ぎた部分も見えるようにする
通常の動画だと通り過ぎたノーツを確認できず、BADや空POORが出た時に原因を把握するのが難しいため、このツールでは実際の画面では見えない部分も確認できるようにしています。
![](https://assets.st-note.com/img/1656168323733-IrVRKbYUph.png?width=1200)
5.所感
当初は打鍵タイミングだけを取得するつもりでしたが、作っているうちに実際のノーツも並べて表示したくなり、試してみると意外と綺麗に取得できたのでこの部分は他の目的にも応用できそうな感じがします。
また、今回は家庭用IIDXのトレーニングモードとは違い、打鍵タイミングと譜面を横に並べて表示するようにしてみました。これは重ねると動画が60fpsである事などから来る細かいズレが気になる(=そこまで精密に取得できない)という理由に加え、重ねる表示だと打鍵と実際のノーツが混ざるため、視覚的に見づらそうに感じたというのも理由です。
実際の動作を見て、FAST/SLOWのような各ノーツの詳細を知りたい場合は重ねて表示、ミスした場所のように全体の流れを追いたい場合は並べて表示、といった使い分けができるのではないかと感じました。
改めて作ったものを見返すと、タイトルの「IIDXのプレイ動画を解析して、黒イカEX-HARDに役立つツールができるか?」という問いに関しては、そこそこ使えそうなものができたと言えるのではと考えていますが、どうだったでしょうか。(実際に役に立つかは不明ですが)
おわり: 今後に向けた課題
今回紹介した方法には、思いつくだけでも以下のような課題があります。
他の動画を解析したい場合、画面の表示サイズや白数値、プレイサイドなどを元に認識範囲を手動で調整する必要がある
1レーンのノーツの密度が高い場合はビームの表示位置にノーツが干渉するため誤認識することがある
ボム・ビームなどの組み合わせによっては調整が難しそう
CN・BSSはビームで認識できない
プレイ中にギアチェンが絡む場合を考慮していない
これらを踏まえると、現在ゲーム内で動画を買えるのと同じ形で打鍵箇所のデータもダウンロードできるようになったら…とは思うのですが、少なくとも実際の譜面の方は配布が難しいと思うので、今回のような動画解析の方法は今後も出番があるのではと考えています。
一応、INFINITASであれば以前作ったIIDX Input Capturerで入力情報を直接取得できるので、今回のように実際のノーツと並べて見られるようにできたら面白そうだなと思っていたりしますが、果たして。
今後も何かしら作っていく予定なので、引き続きよろしくお願いします。
それでは👋
過去に開発したツール
この記事が気に入ったらサポートをしてみませんか?