先日、Google Play Storeにて、 「麻雀.AI 得点君v3~リアルタイムにアガリを計算~」を公開しました。今回はこのアプリについての技術的な説明を行います。
まずこのアプリは、「麻雀の得点計算が難しい」、という課題に対して、スマホのカメラを麻雀のアガリ牌にかざすだけでアガリ判定・得点計算をするというアプリです。
このアプリの公開前「麻雀.AI 得点君~カメラをかざしてアガリを自動識別~」というアプリを公開していました(現在も公開中)が、こちらのアプリは、麻雀のアガリ牌を写真にとってサーバーに送信し、サーバがそのアガリ牌を認識し、その得点(正確には得点の元となる翻と符)をアプリに返すということをしていました。
しかし、サーバーに写真を送信してからサーバーの応答(=得点)が得られるまで約6秒程度かかり、エラー(例えばアガリの牌が少ない、多い等)もサーバーの応答が得られるまでわからないという問題がありました。
これらの問題を解決するため、今回リリースした「麻雀.AI 得点君v3~リアルタイムにアガリを計算~」ではサーバーに写真を送るのをやめ、すべて端末内でビデオストリームに対してアガリ判定を行うようにしました。またエラーも即時に判定できるようになりユーザの利便性が向上しました。
麻雀アガリ判定はサーバーで処理していたときは、Python ライブラリ mahjong を使用していました。私もいくつかPRをマージしてもらったことがあります。ですが今回すべて端末内で処理する必要があるため Python ライブラリを使用することは難しく、高速で軽量なアガリ判定ライブラリを自作することにしました。
自作のアガリ判定ライブラリ mahjong-c はC言語で書かれています。このライブラリは依存するライブラリがなくmallocすら使用していません。比較はしていませんが高速・軽量です。C言語で書かれているため、AndroidやiOSのアプリから呼び出すことが可能です。可読性も高くテストもよくされています。
麻雀アガリ判定の実装はとても面白い課題で、アガリ判定方法の実装はもちろんですが、麻雀競技団体による細かなアガリ計算の違いがあり、そこを調べるのも楽しかった部分の一つです。別の記事で紹介したいと思います。
ビデオストリームから麻雀の牌を認識させるにはこちらとこちらで解説した機能を使用します。またncnnモデルをコンバートする方法はこちらの記事を参照して下さい。
アプリの主要なコンポーネントの流れは以下の通りです。
ソースコードは「麻雀.AI 得点君v3~リアルタイムにアガリを計算~」「麻雀.AI 得点君~カメラをかざしてアガリを自動識別~」を含め、こちらで(YOLOv5の重みファイルをの除き)公開していますので何かの参考にして下さい!
記事を書いていただきました!
以上です。