「麻雀.AI 得点君 Version3」の解説

Android

先日、Google Play Storeにて、 「麻雀.AI 得点君v3~リアルタイムにアガリを計算~」を公開しました。今回はこのアプリについての技術的な説明を行います。

まずこのアプリは、「麻雀の得点計算が難しい」、という課題に対して、スマホのカメラを麻雀のアガリ牌にかざすだけでアガリ判定・得点計算をするというアプリです。

このアプリの公開前「麻雀.AI 得点君~カメラをかざしてアガリを自動識別~」というアプリを公開していました(現在も公開中)が、こちらのアプリは、麻雀のアガリ牌を写真にとってサーバーに送信し、サーバがそのアガリ牌を認識し、その得点(正確には得点の元となる翻と符)をアプリに返すということをしていました。

しかし、サーバーに写真を送信してからサーバーの応答(=得点)が得られるまで約6秒程度かかり、エラー(例えばアガリの牌が少ない、多い等)もサーバーの応答が得られるまでわからないという問題がありました。

これらの問題を解決するため、今回リリースした「麻雀.AI 得点君v3~リアルタイムにアガリを計算~」ではサーバーに写真を送るのをやめ、すべて端末内でビデオストリームに対してアガリ判定を行うようにしました。またエラーも即時に判定できるようになりユーザの利便性が向上しました。

麻雀アガリ判定はサーバーで処理していたときは、Python ライブラリ mahjong を使用していました。私もいくつかPRをマージしてもらったことがあります。ですが今回すべて端末内で処理する必要があるため Python ライブラリを使用することは難しく、高速で軽量なアガリ判定ライブラリを自作することにしました。

自作のアガリ判定ライブラリ mahjong-c はC言語で書かれています。このライブラリは依存するライブラリがなくmallocすら使用していません。比較はしていませんが高速・軽量です。C言語で書かれているため、AndroidやiOSのアプリから呼び出すことが可能です。可読性も高くテストもよくされています。

麻雀アガリ判定の実装はとても面白い課題で、アガリ判定方法の実装はもちろんですが、麻雀競技団体による細かなアガリ計算の違いがあり、そこを調べるのも楽しかった部分の一つです。別の記事で紹介したいと思います。

ビデオストリームから麻雀の牌を認識させるにはこちらこちらで解説した機能を使用します。またncnnモデルをコンバートする方法はこちらの記事を参照して下さい。

アプリの主要なコンポーネントの流れは以下の通りです。

component flow

ソースコードは「麻雀.AI 得点君v3~リアルタイムにアガリを計算~」「麻雀.AI 得点君~カメラをかざしてアガリを自動識別~」を含め、こちらで(YOLOv5の重みファイルをの除き)公開していますので何かの参考にして下さい!

記事を書いていただきました!

【すぐわかる!】『麻雀.AI 得点君v3』 - Appliv
符の計算は大変だけど正確な得点が知りたい カメラで写すだけで勝手に計算| (1)カメラでかざすだけとスピーディー。対局への影響も少ない (2)手牌だけではなく、場の状況まで認識して得点の計算をしてくれる (3)麻雀プロリーグの公式試合に準じたルール。計算を覚えたい人にも便利

以上です。

参照

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 420 million projects.
麻雀.AI 得点君v3~リアルタイムにアガリを計算~ - Google Play のアプリ
麻雀の上がり牌をカメラで読み込み、AIを使用して牌の識別を行い得点を計算します。
麻雀.AI 得点君~カメラをかざしてアガリを自動識別~ - Google Play のアプリ
1万ダウンロード!麻雀の上がり牌を写真で取り込み、AIを使用して牌の識別を行い得点を計算します。
GitHub - MahjongRepository/mahjong: Implementation of riichi mahjong related stuff (hand cost, shanten, agari end, etc.)
Implementation of riichi mahjong related stuff (hand cost, shanten, agari end, etc.) - MahjongRepository/mahjong
GitHub - otamajakusi/mahjong-c
Contribute to otamajakusi/mahjong-c development by creating an account on GitHub.