ランクマでAボタン連打して得たもの3つ

先月Aボタン連打してるだけでマスターボール級まで上りました。
そのときに得たものが3つありましたのでブログに残しておこうと思います。
データ配布もあるよ!

 

①ランクマ自動化の方針

画像認識を使ってひたすらAボタンを押して対戦を進めるプログラムを作成しました。
ただ、ネット繋げてランクマでやると規約違反になる可能性があるので実際には使用するときは注意が必要です。
※動作確認はローカル通信で行いました。
どうやれば自動でこなせるか?を軽くですが書いておきます。

「NintendoSwitch 自動化」などでググればAボタンを押すだけのプログラム自体は簡単に組めると思います。
しかし実際に対戦を進めると十字キーの入力が必要なケースが存在し、スムーズに進めるためには少し工夫が必要です。
そこで十字キーの入力が必要なケースを画像認識で判定し、適切なボタン入力を行って対戦を進めるようにしました。
たとえば、、、

場に出ていた自分のポケモンが倒された後、次に繰り出すポケモンを選択する場面です。
ここでAボタンをずっと押していても先に進めません。
※時間切れで強制選択はされます。

十字キー下を一度押してカーソルを2番目のポケモンに移動し、そのあとAボタンを押して選択を確定させる必要があります。
この画面を画像認識で判定して十字キーを入力するようにします。
判定方法はいくつかありますが、私の場合は上端真ん中「たたかえない」を目印としました。

上の画像が含まれるシーンが出てきた場合は、「十字キー下」⇒「Aボタン」⇒「Aボタン」の順に入力するようにプログラムを組みました。

というような感じで、Aボタン以外の入力が必要な場面を画像認識で判定し、適切なコマンドを決め打ちで入力するプログラムを作ることで自動化することができました。
規約違反になりそうなのでソフトの配布はしません・・・

②対戦データ

200戦分の対戦データをポチポチ入力してcsv形式でまとめました。
こちらは配布しておきますので、煮るなり焼くなり好きにしてください。

https://drive.google.com/drive/folders/1o17Q1O1heUHoeuMITTxtTqFB39rBCCP3?usp=sharing


データを集めただけだと味気ないのでちょっと解析してみようと思います。

  • 被選出率(遭遇回数10回以上に限定)

カイオーガにやられてた印象はあるので、なんとなくの感覚と合ってるのかな・・・?

今回選出だけでなく技の与ダメ、被ダメも記録している(アピールポイント!)のでそちらもなんか解析してみようと思います。

  • 与ダメ率


※倒した時の与ダメ率は抜いてます。

ダイマックスほう」はムゲンダイナ、「じゃれつく」はザシアンが使った技です。
ダイマックスほう」は、一撃で倒した数は多いのですが、フェアリータイプには無効化されるので、平均化すると伸びないですね。

「じゃれつく」は無効化タイプがないですが、技外しとダイマックス化した相手に対してはダメージ量が伸びないので同じような値に落ち着いたようですね。

今回は1体につき1つしか技を持っていなかったので、対面しているポケモンによって技を切り替えることはできませんでしたが、まじめにやったときに平均値がどれだけ上昇するのか調べてみるのは面白そうです。

 

こんな感じでとりあえずまとめましたが、解析に必要な情報がそろっているかどうかはわかりません。
最終的に野球のセイバーメトリクスみたいなものを作れるといいなーと漠然と思っています。
誰か考えてください。

 

③画像認識のための素材

①のランクマ自動化用の画像に加えて、②のデータ入力の自動化ができるかもしれない画像も集めました。
とりあえずで遊んでみた結果が先日のブログの内容です。

yaliyalice.hatenablog.com

まとめ

ランクマでAボタンを連打することによって、3つ得たものがありました。

①ランクマ自動化
 →だいたい自動化できたはず

②200戦分の対戦データ
 →セイバーメトリクスみたいなのを作りたい

③画像認識のための素材

 →対面画像で遊んでみました

ポケモンの画像認識で遊んでみた

先月ランクマのスクリーンショットがいっぱい手に入ったので画像認識で遊んでみました。

遊び道具

ポケモン剣盾

 →ランクマのスクリーンショットをたくさん撮りました。

Teachable Machine

Googleが提供している機械学習を行えるサービス。
 なんとノーコードで機械学習ができちゃいます。

機械学習してみる

ランクマで取ったスクリーンショットから相手が今何のポケモンを場に出しているのか?を推定したいと思います。

使用するデータ

↓こんな感じの相手と対面している画像を何枚か用意しました。


学習する

なんとなく対面画像が多そうなポケモンとして「ザシアン」「バドレックス」「カイオーガ」「ネクロズマ(日食)」、この4体を選びました。
それぞれの対面画像を「画像サンプル」として「Teachable Machine」読み込ませました。
適当にフォルダを漁って収集したので、サンプル数は適当です。

読み込ませるとこんな感じ↓


学習の結果

学習したモデルを使って画像を判定してみます。
学習時と同じように画像を読み込ませると・・・

イケてるやん!!

 

他のポケモンも試してみます。

いい感じに認識できていますね。
サンプル数少ないですし、右半分だけになるようにトリミングして認識させないと不要な情報が多いかなと懸念していましたが、大丈夫そうですね。
もう少し試してみましょう。

ん?

バドレックス?いかつい黒馬ですね。黒くもないし。

 

あっ!たまたまうまくいっただけみたいでした。
結構誤検出しますね。

学習結果で遊んでみる

とりあえず学習できたので(誤検出は置いといて)色々遊んでみましょう。

対面からずれた角度

対面からずれた角度から撮影したものを認識させてみました。
うまく認識してくれるでしょうか?

なかなか難しいようです。

 

ダイマックス

ちなみにダイマックスしたときの画像はどうでしょうか?

まだいけそうな気がしますがどうでしょう?

 

天候が雨ならカイオーガ

 

ここらへんはちゃんと検証が必要そうですね。

ソルガレオネクロズマ(日食)と認識してくれるか?

そんなことありませんでした。

通常ザシアンはザシアンと認識してくれるか?

これはいけるんやね。

 

まとめ

ポケモンの対面画像を使用して「Teachable Machine」の画像認識で遊んでみました。
ランクマやってる最中にいちいち相手のポケモン入力するの面倒だなと思っていたので、画像認識で解決できないか?のとりあえずの検証でした。
工夫次第では精度があげられると思うので、使えるかもしれないですね。

学習モデルはとりあえず共有しておきます!よかったら遊んでみてね!

https://teachablemachine.withgoogle.com/models/77t_nZnTX/

Arduino導入時のメモ

エラー対応

Switch Control Libraryに関するエラー

解決策:v1を使用する。v2とv1は互換性が無いため

error: 'nothrow_t' in namespace 'std' does not name a type~

解決策:"Arduino AVR Boards"のバージョンを1.8.2へダウングレードする
参考URL:https://teratail.com/questions/271735

  • コントローラとして反応しない

boards.txtが編集できていない。
編集する対象は、「C:\Users\[ユーザー名]\AppData\Local\Arduino15」とか
「C:\Users\[ユーザー名]\Documents\ArduinoData\」とかにある。
また、ちゃんと編集できたか確認する場合は
マイコンがつながっている状態で「Arduino IDE」の「ツール」>>「ボード情報を取得」を選択。
うまく書き込めていれば0x0f0d、0x0092と表示されるはず。

  • PC側でFTDIモジュールを認識しない

解決策:デバイスマネージャからドライバーを更新する。
参考URL:http://0918.jp/wp/post-1079/


以上。

C#でOBSを操作する

いろいろ自動化したかったので、OBSをC#から操作する方法を調べました。
その備忘録です。
だいたいみんなPythonなんですかね?
※OBS、obs-websocketはインストールしているものとする。

必要なもの・準備するもの

https://www.nuget.org/packages/obs-websocket-dotnet/

⇒2019のCommunity(Version 16.10.0)でやりました

obs-websocket-dotnetのインストール

パッケージマネージャコンソールで下記を入力して、実行

Install-Package obs-websocket-dotnet -Version 4.9.0

OBS側の設定

[ツール]タブから「Websocketサーバー設定」
サーバーポートとパスワードを設定
f:id:YaliYalice:20210606232712p:plain

C#で実装

要所要所だけ。。。

  • OBSへ接続
OBSWebsocket obs;
obs = new OBSWebsocket();
obs.Connect(”ws://127.0.0.1:4444”, "パスワード");

Connect関数の第1引数の末尾"4444"はOBS側で設定した「サーバーポート」を書くこと。
第2引数"パスワード" もOBS側で設定したものを入力すること

Connectした後に下記関数を呼ぶとスクリーンショットが撮れる。

obs.TakeSourceScreenshot("ソース", "画像の拡張子", "ファイルパス");

第1引数のソースはOBS側のソース名 ※下記画像参照
第2引数の画像の拡張子は"jpg"、"png"などなど ※第3引数でファイルパスを書けばnullでもOK
第3引数のファイルパスは"C:\test\ss\hoge.png"こんな感じでファイル名まで書くこと。
f:id:YaliYalice:20210606234131p:plain

あとは煮るなり焼くなり好きにしよう。

実況動画制作を自動化したい② ~Softalk編~

面倒くさいことをやりたくないため、省エネに全力を尽くすのです。
お世話になります。
前回に引き続き自動化の記事です。

先日ひさびさ(?)にSoftalkを使用した実況動画(いわゆるゆっくり実況)を作りました。
生声よりも手間がかかるんじゃねって思っていましたが、仕組みさえ作っていればゆっくり実況のほうが楽でした。

作業内容の比較

~生声実況の場合~

①録音した音声を編集
 →音量調整
 →ノイズ低減(ホワイトノイズ、リップノイズ、マイクボフボフなど)
 →いらんところのカット
②動画と合わせてタイミングを調整
→1試合あたり約40分

~ゆっくり実況の場合~

Softalkで音声ファイルを作成 ★
②動画と合わせてタイミングを調整
→1試合あたり約25分

★のところが今回自動化したところです。
自動化すれば生声実況に比べ15分も短縮できます!

Softalk自動化

皆さんはSoftalkって使ったことはありますか?
そう!こんな感じのGUIです。
f:id:YaliYalice:20210129220016p:plain
テキストスペースに文章を入力し、下の方にある再生ボタンを押すとおなじみのあの声で、入力された文章をしゃべってくれます。
赤い方のボタンを押すと音声ファイルとして書き出すこともできます。
さくっと使えてすごく便利ですが、実況動画を作成するときは台本の文章を1行ずつ、いちいち手動でコピペ&録音を繰り返さないといけません。
これがとても面倒くさい。
ということで自動化してみました。

自動化の指針

GUIの自動化は難しいなあと思っていましたが、Softalkはなんとコマンドラインから実行できるようです。
こんな感じで実行できます↓ (「自動化できそう」としゃべってくれます)

C:\SofTalk.exe /W:自動化できそう

ということで、以下の手順でプログラムを組んでやれば自動化できるわけですね。

  • 台本から文章を1行抽出する
  • "/W:"引数に文章を指定
  • 台本の最終行まで上記を繰り返す

台本をエクセルに書くことが多いので、今回はエクセルマクロでさくっと実装しました。
テキストファイルに書いて、バッチファイルかなんかで読ませるとかでもいいと思います。

Softalkの引数について

今回使用したものだけ挙げます。詳しくはSoftalk付属のヘルプファイルをご覧ください。

引数 説明
/NM: 声の種類の指定(女性01とかロボットとか)
/O: 音程パラメータ
/S: 速度パラメータ
/V: 音量パラメータ
/X: 画面表示の有無(0:表示 1:非表示)
/R: 録音した音声ファイルの保存先の指定
(C:\result\hoge.wav みたいなファイルパス)
/W: 読み上げる文章

つまずいたところ

  • "/W:"引数の指定は最後にしよう

/W:"以降の文字をすべて読み上げ対象とする仕様なので、最後に書かないと引数指定がそのまま読まれちゃいます

NG:C:\SofTalk.exe /W:自動化できそう /O:120

→"/O:120"も読み上げられちゃう!

  • 録音が終了したらcloseオプションを実行しよう

closeオプションを実行しないと、SoftalkGUI操作ができなくなってしまいます。

C:\SofTalk.exe /close

おまじないみたいなもんですね。

課題

  • 間違いの訂正が面倒

→個別でGUIから訂正した
 →読み登録である程度回避できる
  →誤字脱字は知らん

  • 出力した音声ファイルを動画編集ソフトに読み込ませるのが結局手動

→音声ファイルを結合させるフリーソフトで対応?
 →Aviutlにはファイル一括読み込み用のプラグインあり

最後に

似たようなのがすでにありましたわ。。。
www.nicovideo.jp

以上です。
次は何を自動化しようか。

実況動画制作を自動化したい① ~GIMP編~

面倒くさい。ホントに面倒くさいんですよ。
動画作るの。。。
いつもお世話になっております。

 

動画制作が面倒くさすぎてどれだけ時間がかかっているのかざっくりまとめてみました。

f:id:YaliYalice:20210103202832p:plain

最速で8時間ですね。。。
これを週2は結構きついです。

どっか自動化できそうなところはないかと探しました。

f:id:YaliYalice:20210103203035p:plain

今回はNo.3の「素材用意」について自動化してみようと思います。
素材というのは、選出画面で使用してるこんなやつ↓です。

f:id:YaliYalice:20210117223758p:plain

ポケモンの画像と角が丸い四角形を組み合わせて作ります。
この画像はGIMPという画像編集ソフトで作っているのですが、GIMPスクリプト(python)で処理の自動化ができるようです。

ということで今回はGIMPの作業を自動化してみようと思います。

どんな作業をしているのか?

素材を作るときの手順はこんな感じです。

  1. ポケモンの画像をGIMPに読み込ませる
  2. 1で読み込ませた画像の大きさ・位置を調整する
  3. 角丸四角形からはみ出た部分をトリミングする
  4. 青色の角丸四角形と合わせてエクスポートする
  5. 黄色の角丸四角形と合わせてエクスポートする
  6. 2のポケモンの画像をグレースケール化する
  7. 黒色の角丸四角形と合わせてエクスポートする

赤字で書いているところが自動化できそうな作業です。

GIMPPythonで操作する

こちら(※1)を参考にGIMPPythonで操作してみました。

まずは、画像のトリミングです。
トリミングのGUI手順としては、、、
①角丸四角のレイヤーの不透明範囲を選択する
②選択範囲を反転する
ポケモンの画像を読み込ませたレイヤーをアクティブにする
④選択範囲を削除する

# 選択範囲を一度クリア
pdb.gimp_selection_none(image)
# 不透明範囲の選択
pdb.gimp_image_select_item(image, 0, base_layer)
# 選択範囲の反転
pdb.gimp_selection_invert(image)
# 選択範囲を削除
pdb.gimp_edit_clear(target_layer)
# 選択範囲をクリア
pdb.gimp_selection_none(image)

 ※ base_layer::角丸四角が描画されているレイヤー
   target_layer:ポケモンの画像を読み込ませたレイヤー

 

次に角丸四角形(青色、黄色、黒色)と合わせてpngファイルとしてエクスポートします。

GUI手順としては、、、
①合わせてエクスポートする角丸四角形(青色、黄色、黒色)のみ可視化する
②「ファイルタブ>名前を付けてエクスポートボタン」を実行

これだけなのですが、pythonでエクスポートする場合レイヤー単位でしかエクスポートできないようで、一工夫必要です。

# エクスポートするレイヤーの可視化
pdb.gimp_layer_set_visible(layer, TRUE)

# レイヤーを合体するため画像を複製する
new_image = pdb.gimp_image_duplicate(image)
# レイヤーを合体する
mergelayer = pdb.gimp_image_merge_visible_layers(new_image, CLIP_TO_IMAGE)

# エクスポートする
pdb.file_png_save2(new_image, mergelayer, filename, filename, 0,9,0,0,0,1,1,1,0)
# 複製したした画像を破棄
pdb.gimp_image_delete(new_image)
# レイヤーの不可視化
pdb.gimp_layer_set_visible(layer, FALSE)

レイヤーを合体するというのがポイントです。
レイヤーをそのまま合体させてしまうとエクスポートするたび角丸四角形を読み込ませないといけないので、いったん画像ごと複製しています。
複製した画像上でレイヤーを合体、合体したレイヤーをエクスポートという流れです。

 

最後にグレースケール化です。

GUI手順では、、、
①「色タブ>色相-彩度」を実行
②「彩度」パラメータを-100にする

pdb.gimp_drawable_hue_saturation(layer, 0, 0.0, 0.0, -100, 0.0)

これは非常に簡単で関数を一個呼ぶだけです。
引数は頭から、"描画領域(レイヤー指定でOK)", "調整する基準色", "色相", "輝度", "彩度", "オーバーラップ" です。
GUIの画面と見比べるとわかりやすいですね。

f:id:YaliYalice:20210114000659p:plain


ちなみに使用するライブラリ関数の仕様を知りたい場合は、
「ヘルプタブ>プロシージャ-ブラウザ」から調べることができます。
上記「gimp_drawable_hue_saturation」関数の仕様を調べるとこんな感じで出てきます。

f:id:YaliYalice:20210114001032p:plain
私はめっちゃ使いましたw

 

できたもの

f:id:YaliYalice:20210117223758p:plainf:id:YaliYalice:20210117223940p:plainf:id:YaliYalice:20210117223930p:plain

 

余談 

作ったPythonスクリプトデバッグするときは下記オプションをつけてGIMPを起動すると幸せになれます。

gimp-2.10.exe --console-messages

 デバッグログの出し方はこちら

gimp.message("ここにデバッグ用の文字列")

以上。。。

 

参考

※1

maywork.net

 

 

 

新規アカウントでニコニコ動画とYouTubeに動画投稿してみた結果

明けましておめでとうございます。
新年一発目のブログが何でこれなんかわかりませんが、実験の結果がまとまりましたので報告いたします。

ここから本題。。。

よっしゃ動画投稿するぞ~、というときニコニコ動画(以下ニコ動)かYouTubeかどっちに投稿すべきか悩むことありますよね?

私はもともとニコ動出身なので動画を投稿するならニコ動一択でしたが、YouTubeの視察(?)もかねて色々実験してみました。

実験内容

ニコニコ動画YouTubeにそれぞれ新規アカウントにて動画を投稿してから、①24時間後、②1週間後、③1か月後、で再生数を比較してみました。

動画内容に変化をつける必要があると思い、ある程度のクオリティのものと適当なクオリティのものの2種類を投稿しました。
ある程度のクオリティの動画は1本のみ投稿。
適当なクオリティの動画は1週間に1本を3週間実施(つまりは、3本投稿)。

それでは結果をご覧ください。

結果:ある程度のクオリティ

f:id:YaliYalice:20210101001548p:plain

結果:適当なクオリティ

f:id:YaliYalice:20210103154921p:plain



感じたこと

ニコ動は初動、その後の伸びはまあまあ良さげ。
ただ動画を投稿していくごとに再生数減少の傾向がみられる。
継続して動画を投稿することが実になるか?というと微妙な手ごたえ

YouTubeは初動も伸びも絶望的。
ただし、動画投稿を重ねるたびに再生数は徐々に上がっていく。
継続して動画を投稿することによってある程度伸びていきそうな気がする

 結論:単発ならニコ動、更新頻度が高いならYouTubeのほうがいいんじゃない?知らんけど。。。

終わりに

最近ニコ動に導入されたアナリティクスという機能で動画の再生数の推移やどこから動画までたどり着いたのか見られるようになりました。
YouTubeにも同様の機能があります
これを眺めていると、動画サイト内の検索から来てくれる人が多いようです。
今回はSNSでの宣伝等無しの状態だったので当然といえば当然ですが。。。

再生数を増やすための大きな手法として、SNSでの宣伝が欠かせないと思ってはいます。
しかし、TLで流れてくるリンクを踏む(受動的な視聴)場合と検索から動画までたどり着く(積極的な視聴)場合では後者の方が、投稿者目線では嬉しかったりします。※私だけかな?

他人からおすすめされた動画(or投稿者)よりも、自分が見つけた動画(or投稿者)のほうが愛着もわきやすいと思います。

ポケモンの実況動画自体が下火になってるので、わざわざ検索して探しに来てもらわないといけないわけですが、そういう人を増やすにはどうしたらいいんでしょうね
私もわかりません。

 

それでは2021年もよろしくお願いいたします。