投稿

ディスクアップの青7を自動認識

イメージ
今回はディスクの青7を自動認識させてみたいと思います。 というのも、スマホ等でカメラを構えると、勝手に人間の顔を認識して追いかけてくれるのを見たときに、 「これってスロットの目押しもできるんじゃない?」 と思ったのがきっかけです。 残念ながら、私にはスマホアプリを作成するスキルはないので、 この記事を元に、 どなたかビタ押しのタイミングを教えてくれるスマホアプリを作成していただけたら感謝感激です。 ということで、早速ディスクの青7を認識させる方法を考えていきます。 本日のアジェンダはこちら。 1. どうやって図柄を認識させるか? 2. カラートラッキングとは 3. 動画とは 4. Pythonでのコーディング 5. 今回作成したコード 6. 結果の確認 1. どうやって図柄を認識させるか? まずは、私たちが普段目押しを行う時に、どの部分に注目しているかを考えてみます。 ディスクアップのリール配列はこちら。 サミーさんのHP から引用 人によって違いはあると思いますが、個人的に一番目につくのは 「色」 ですね。 (リプレイ図柄が水色で色が近いのが気になりますが、 「大きさ」 でフィルタすればなんとかなりそうです。) 今回のように、 「色」 によって物体を追跡することを 「カラートラッキング」 といいます。 2. カラートラッキングとは 「カラートラッキング」は、直訳すると 「色追跡」 となるように、色で物体を追跡する手法です。 コンピュータでは、色を 赤・青・緑 それぞれの数値で定義しています。(光の三原色というやつですね。) 例えば、WindowsのPaintで「色の編集画面」を開くと、R(Red:赤)・G(Green:緑)・B(Blue:青)の値を直接指定して好きな色を作ることができます。 下図のように、R=0・G=0・B=255とすると、「青」の色が作成できます。 実際のカメラの画像では、ホールの明るさやカメラのスペック、撮影方法によって色が変わってくるので、ある程度の幅以内に含まれる色を判定するコードを記載します。 Pythonでは、↓のコードを用いることで、指定した色部分だけを抽出することができます。 色の指定は、RGBの順番でなくBGRの順番であることに注意が必要です。 cv2.inRang...

6号機ジャグラーのぶどう確率予測

イメージ
導入日が延期されていた6号機ジャグラーですが、導入日は12月14日になったというニュースが流れていますね。 最も気になるのはスペックだと思いますが、こちらは ㈱北電子さんのホームページ 上で公開されており、以下のような数値になっています。 ㈱北電子さんのホームページ( https://www.kitadenshi.co.jp/slot/ )から引用 次に気になるのは設定差の部分かと思いますが、ジャグラーシリーズといえばメイン小役のぶどう確率に設定差が設けられていることが有名です。 残念ながら、小役確率はまだ公表されていませんが、ユーザーとしてはぜひとも知りたい情報ですよね。 ということで、今回は 6号機ジャグラーのぶどう確率を推測 してみたいと思います。 スペックから逆算する方法が王道かと思いますが、シミュレーションを使って泥臭く求めてみます。 作成するプログラムは↓のようなイメージです。 ぶどう確率を6.00~7.00まで変化させたときの出玉率を計算した後、近似式を利用して出玉率が設計値になるぶどう確率を算出します。 ※公表されている出玉率の算出方法が不明であったり、ぶどう以外の小役確率は適当な推測値を入力していますので、今回の結果が正しいものとは限りません。 近似式とは 近似式は、ばらつきをもったデータの傾向を知るのに有効な手法です。 ご存じのようにスロットの出玉率は膨大な試行を行わないと設計値に収束しません。 そのため、今回取得したデータも下図のようにばらつきを持った結果となります。 ぶどう確率の推測精度をあげるためには、ばらつきを持ったデータをそのまま信用するのではなく、ぶどう確率と出玉率の傾向をつかむ必要があるため、近似式を利用します。 今回はぶどう確率を振る範囲が狭く、データの傾向もほぼ線形で近似できると思うので、一次近似式を利用したいと思います。 本日のアジェンダはこちら。 1. ぶどう確率を変化させた時の出玉率をシミュレーション 2. 一次近似式を求める 3. 出玉率が設計値になるぶどう確率を算出 4. 今回作成したコード 5. 結果の確認 1. ぶどう確率を変化させた時の出玉率をシミュレーション では早速、ぶどう確率を変化させた時の出玉率をシミュレーションを行います。 とは言っても、以前作成した...

スランプグラフから設定判別してくれるなんちゃってAI

イメージ
突然ですが、ジャグラーで↓のスランプグラフの時、設定はいくつだと思いますか? きっと大多数の方が「設定6」と答えるのではないでしょうか? では、こちらはどうでしょう? はい、「設定1」ですよね。 これってたぶん、我々スロッターの頭の中では過去に見てきたたくさんのスランプグラフが脳にインプットされていて、そこから今見たスランプグラフがどの記憶に似ているかで判断していると思います。 今回はこれをコンピュータにやらせてみたい! ということで、スランプグラフから設定判別してくれるなんちゃってAIを作成したいと思います。 (あくまでも素人が思いつきで作ったようなレベルなので、緩い目でご覧ください。) 今回はマイジャグラーⅢを例に、スランプグラフの傾向から設定判別してみます。 はじめに 今回は以下の流れで実験を行います。 1. 判別したいスランプグラフを作成 2. 設定ごとのビッグデータ(スロッターの脳にあるたくさんのスランプグラフの記憶)を作成 3. 判別したいスランプグラフに似た傾向がビッグデータ内にどれくらいあるかを確認 4. 各設定のビッグデータ内で、近いデータがいっぱい見つかった設定が今回の設定!(のはず。) 当然「3. 判別したいスランプグラフに似た傾向がビッグデータ内にどれくらいあるかを確認」が最も大事になってきますが、今回は「相互相関」という手法を使って検証していきます。 どうやってスランプグラフの傾向を評価するか?(相互相関) 「相互相関」とは、ある2つのデータの類似度を評価する手法です。 例によってpythonでは↓の1行で計算してくれるわけですが、せっかくなので中身の計算のイメージだけでもつかんでおきたいと思います。 np.corrcoef(ビッグデータから1日分抜き出したデータ, 1日分のスランプグラフ)[0,1] 「相互相関」の中身の計算は、「内積」とほぼ同じなので、「内積」の計算について説明します。 「内積」は線形代数で勉強したあの「内積」で、以下の計算式で求められます。 ↑の式をcosθの式に直すと、↓のようになります。 この式が「相互相関」でやっていることとほぼ同じです。 ちょっと式を見てもわからないので、下図に例を計算してみました。 ベクトルだと考えると理解しにくいですが、スランプグラ...

スランプグラフから差枚数を自動算出するツール作成(後編)

イメージ
前編に引き続きスランプグラフから差枚数を自動算出するツールをPythonで作っていきます。 前編で求めたグラフの位置 からスランプグラフの差枚数を算出していきます。 2. スランプグラフから差枚数を求める はじめに 以下の画像から差枚数を算出していきますが、スランプグラフ内には差枚数算出に不必要なグラデーションが入っています。 人間の場合は、どれがグラフで、どれが不必要なグラデーションかを感覚的に判断できますが、コンピュータではどちらが必要なデータなのかはわかりません。 そこで、不必要なグラデーションを除去する処理を行います。 エッジ保存フィルタ(エッジ抽出フィルタ)と呼ばれる方法を採用しますが、これはその名の通り画像のエッジ(輪郭)だけを抽出する方法です。 言葉ではイメージしづらいと思うので、処理前後の画像を↓に貼っておきます。 画像全体からグラデーションが消えて、エッジ部分の線のみ残っています。 エッジ保存フィルタの中身の基本的な処理としては、画像の微分があげられます。 下図に示すように、微分の値は変化が急峻なところほど大きくなります。 これを画像にあてはめると、「変化が急峻なところ=画像のエッジ」、「変化が緩やかなところ=グラデーション部分」となるので、画像のエッジ部分だけを抽出することができます。 求めたエッジ部分を画像の端から探していけば、最初に見つかった点がグラフの最後の点がわかります。 最後に比例計算でピクセル数を差枚数に変換すれば差枚数算出完了です。 グラフの範囲は今回の場合±2000枚なので、全体として4000枚の範囲(2000×2枚)を計算しています。 画像のエッジ抽出 ここからは、Pythonでのコーディングに入ります。 まずは、画像のエッジ抽出を行います。 これまたテンプレートマッチングの時と同じく、1行だけです。 Canny法と呼ばれる方法を採用されているようですが、詳しいことは理解不足で説明できません。。 差枚数を求めたい画像は、「img_gray」に保存されているので、「img_gray」に対してエッジ抽出を行います。 # 差枚数を求めたい画像のエッジ抽出 img_bin = cv2.Canny(img_gray,128,200) 走査範囲の設定 続いて、グラフの最後の点を探してい...

スランプグラフから差枚数を自動算出するツール作成(前編)

イメージ
今回はスランプグラフから差枚数を自動算出するツールをPythonで作りたいと思います。 スランプグラフから差枚数を算出するには以下の2ステップが必要となるので、前編・ 後編 の2部構成で説明します。 1. グラフの位置を求める 2. スランプグラフから差枚数を求める 今回は、下図のような画像から差枚数を読み取ってみます。 1. グラフの位置を求める はじめに 先ほどの画像では、1枚の画像の中に3枚のスランプグラフが含まれています。 この場合、まずは画像の中にある3枚分のスランプグラフの場所を求める必要があります。 方法は様々なものがあると思いますが、今回は「テンプレートマッチング」を用いて、スランプグラフの場所を見つけていきます。 テンプレートマッチングは下図のような技術で、あらかじめ作成したテンプレート画像が、調べたい画像(対象画像)の中のどこにあるのかを探してくれます。 テンプレートマッチングのアルゴリズムも様々なものがありますが、簡単な例としては引き算で探す方法があげられます。 例えば●、▲、■から、■を引き算すると以下のような結果になります。 つまり、引き算をしたときに、何もなくなるところが今回探したい場所になります。 これを対象画像からテンプレート画像をちょっとずつずらしながら引き算していくことで、テンプレート画像と同じ画像がある位置を知ることができます。 Pythonでのコーディング では、実際にPythonでグラフの位置を探してみましょう。 まずは、テンプレート画像とグラフを探したい画像を準備します。 今回は、以下のような画像を準備しました。 ※今回の方法の注意点として、テンプレート画像のグラフの大きさと、グラフを探したい画像のグラフの大きさを揃える必要があります。 ※グラフの大きさが違うと、引き算した時に差が出るので、正しい位置が求められません。 テンプレートマッチングについて長々と説明しましたが、Pythonでのコードは↓の二行だけです。 このコードを実行することで、先ほどの例でいうところの「ちょっとずつずらしながら引き算した結果」を出力してくれます。 ※しかも実際にはもっと賢いことをやってくれてます。ありがとうPython!! import cv2 res = cv2.matchTempla...

バーサスの設定判別ツール作成

イメージ
今回はバーサスの設定判別ツールをPythonで作成します。 過去に作成した ハナビの設定判別ツール とほぼ同じ要領で作成できます。 今回は、ハナビの設定判別ツール作成で説明できていなかった、BB中の判別要素の計算方法について記載します。 バーサスのBB中の判別要素といえば、「Vを狙え演出」ですね。 設定ごとにVを狙った時の停止形の出現確率が異なっているため、BBのG数を算出して計算に用いる必要があります。 BBのG数は24Gですが、せっかくなのでこの24Gを導出してみましょう。 バーサスのBBは344枚を超える払い出しで終了とあります。 BB中は、14枚役を1回取ったあと、15枚を取っていくので、下表のようになります。 24Gのところで、払い出し枚数が344枚を超えるので、24GでBB終了です。 G数 取得役 払出枚数 1 14 14 2 15 29 3 15 44 4 15 59 ・ ・ ・ ・ ・ ・ ・ ・ ・ 22 15 329 23 15 344 24 15 359 方程式で算出するとしたら、以下の式となります。 15 * G数 - 1 > 344 → G数 > 23 式を解くと、23Gを超えるG数が答えとなるので、24GでBBが終了することになります。 BBのG数がわかったので、「Vを狙え演出」での判別要素の二項分布確率を算出できます。 コードは以下のようになります。 三連Vテンパイの二項分布確率 = binom.pmf(三連Vテンパイ回数, BB * 24, 三連Vテンパイの設計上の確率) こちらが実際に作成したバーサスの設定判別ツールのコードです。 ※VS-CHANCE中のはずれ確率にも設定差があるようですが、設定差が小さいので項目から除外しています。 # coding: UTF-8 from scipy.stats import binom def S_EST(回転数, BB, RB, チェリー, スイカ, ベル, 三連Vテン, 三連V上下段, 三連V斜め, VSゲームはずれ, VSゲームマイナス): # 設定値データを定義 header = ['Machine', 'Setting', 'BB', 'RB', ...

ハナビの設定判別ツール作成

イメージ
今回はハナビの設定判別ツールをPythonで作成します。 過去に作成した マイジャグラーⅢ や ディスクアップ の設定判別ツールとほぼ同じ要領で作成できます。 そのため、今回は新しい情報というよりは作り方の趣味や思想の話になってしまいます旨、ご了承ください。 ハナビの設定判別ツールを作るにあたって気になるところといえば、花火チャレンジと花火GAME(以下まとめてRTと記載することがあります。)の回転数のカウント方法だと思います。 できるだけ実戦時のカウント値をそのまま入力できるプログラムを作りたいわけですが、例えば実戦中のカウント方法として以下の方法が考えられます。 1. 消化したRTのG数をカウント メリット:G数の把握が楽 特に毎回回数が変動する花火チャレンジでデータカウンタの数字をそのまま入れるだけでOK。 デメリット:カウンターの数字が大きくなるので、カウンターをポチポチするのが大変 2. 消化できなかったRTのG数をカウント メリット:カウンターの数字が小さいので、カウンターをポチポチするのが楽 デメリット:RTの残G数の確認が面倒 残G数を見ておくか、データカウンタの数字から毎回引き算しないとダメ。 どのようなツールにするかは使用者の好み次第ですが、今回は自分用のツールなので、私個人の好みで「2. 消化できなかったRTのG数をカウント」する方法で作成していきます。 計算方法としては、花火チャレンジと花火GAMEそれぞれ、BB1回あたり20Gついてくるので、「BB回数 * 20 - RTの残G数」で計算できます。 二項分布確率の算出のコードにあてはめると以下のようになります。 花火チャンレンジ中のはずれの二項分布確率 = binom.pmf(花火チャレンジ中のはずれ回数, BB * 20 - 花火チャレンジの残G数, 花火チャレンジ中のはずれの設計上の確率) 花火GAMEの場合も同様の計算方法でOKです。 こちらが実際に作成したハナビの設定判別ツールのコードです。 ※花火GAME中のRTリプレイにも設定差があるようですが、目押し精度に自信がないので項目から除外しています。 # coding: UTF-8 from scipy.stats import binom def S_EST(回転数, BB, RB, チェ...