はじめに
三人麻雀の打牌を推論するAIモデルを作成し、Webサービスとして公開しました。Webサービスの開発もモデル開発もド素人の私がお金をかけずに無料で公開できたので、どんな構成で実現したのかを紹介したいと思います。
※私は三人麻雀しかプレイしないので本サービスは三人麻雀専用です。四人麻雀には対応していません。
開発したサービス
こちらになります。
開発経緯
- 前々から麻雀の上がり牌計算に興味があった
- 試しに Copilot へ聞いたらロジックを即答してくれた(バグはありましたが)
- その精度に驚き「モデル開発すらやってくれるのでは?」と試してみた
- 時間はかかったものの、モデル開発に成功した
- 手ごたえを感じ Web サービス化にも挑み、試行錯誤の末に成功
- AIすごい
サービス概要
本サービスは以下の3つの機能で構成されています。
- 打牌推論機能: 手牌及び副露からベストな打牌を推論します
- 上がり牌計算機能: 手牌及び副露から上がり牌を計算します
- 牌認識機能: 画像から麻雀牌を検出します(検出するだけでそれ以上の機能はありません)
技術スタック
本サービスは、以下の技術を組み合わせて開発・公開を行いました。
- フロントエンド: HTML / JavaScript
- バックエンド: Python(FastAPI)を用いたAPIサーバー
- AIモデル: PyTorchを用いた打牌推論モデル開発、YOLOv5 を用いた牌検出モデル開発
- インフラ: Cloudflare による無償ホスティング、OCI(Oracle Cloud Infrastructure)によるAPI運用
- 開発環境: Docker による環境構築とデプロイ管理
- アノテーションツール: labelme
- スーパーバイザー: Gemini Code Assist
構成図
モデル開発について
手牌+副露から打牌推論モデルと画像から牌検出モデルを2つ作成しました。
それぞれどのような学習データやコンセプトで作成したのか説明します。
モデル学習環境
一昔前のRTX2070 Superを積んだパソコンを使用しました。
NVIDIA提供のDocker CUDA Image(例: nvcr.io/nvidia/pytorch:25.03-py3)を使用すると簡単に環境構築出来るのでお勧めです。
※ただし、イメージサイズが24GBと大きいので注意してください
打牌推論モデル
天鳳の高段位の牌譜を学習データとして利用しました。更に以下の条件でデータを抽出しました。
- 約2万試合分の牌譜
- 5巡目以内かつリーチがかかっていない盤面
- 守備的な打ち方は取り扱いが難しいため除外
- 手牌、副露、実際の打牌をセットで抽出
入力は当初37種類の牌の所持数を表す37次元ベクトルを検討しましたが、面子の構造理解が難しかったため、最終的には牌IDの14次元ベクトルを用いました。
最終精度: Accuracy 60%、Loss 1.08(学習データに対する結果)
牌検出モデル
自分で撮影した雀卓+牌の画像を約30枚ほど用意し、labelmeを使ってアノテーションを行いました。
Yolov5s.ptをベースに転移学習を行いました。
最終精度: Precision: 93.64%、Recall: 85.83%、mAP@0.5: 93.73%、mAP@0.5-0.95: 80.87
無料でのWebサービス構築
OCI がとても優秀だと思います。ARM CPU という制約はありますが、メモリ24GB・ストレージ200GBと、個人開発には十分すぎるスペックが無料で提供されます。
当初はフロント・バックエンドをOCI上で構築していましたが、HTTPS対応のため Cloudflare Pages・Workers・Cloudflare Tunnel を導入しました。
Tunnel は通信の秘匿性だけでなく、IPアドレス指定が禁止されている Cloudflare で無料ドメインを割り当てる役割も果たしています(※)。
※無料ドメインは永続ではないため、URL変更時にはフロント側の設定変更が必要です。
無料のAI活用
VS CodeユーザーにはGemini Code Assistがお勧めです。無料枠が潤沢で、以下の以下の利点があります。
- 実質無制限で無料で利用可能
- ファイルを横断して補完や提案を行う
ただし、レスポンスが少し遅い点とMarkdownを含む回答のレイアウトが崩れる点は気になりました。
また、コード補完以外の技術的相談は ChatGPT の方が精度が高い印象でした。両者を適宜使い分け、時には協力させて効率よく開発できました。
ブラザー、いい質問だ!俺たちが今やってるこのイカしたやり取りが何なのか、気になっちまうよな。
「ブラザー、日本語で回答頼む」と頼んで以降、こんな口調になる Gemini 君好き。
課題
- 打牌推論モデルは精度が今一つ
- ただ手牌、副露のみから推論するのでこの程度が頭打ちな気もする
- 特に赤牌は認識精度が低い
- 雀荘でプレイしながら撮影していたので、赤牌の出現率が低い…
- 牌検出モデルの精度は悪くない
- 順当に学習データを増やせば精度伸びそう
- 学習データの水増しもバリエーション増やせば精度伸びそう
- 盤面から手牌+副露を検出できるモデルも作成したい
- スマホカメラで盤面を撮影し、打牌と上がり牌を表示するアプリケーションが最終目標
さいごに
私のようなWebサービス、ネットワーク、AI、数学の知識が全くないなんちゃってエンジニアでも、AIを頼ることでここまでのWebサービスの公開ができました。
昨今のAIの向上を身をもって実感できました。
流石に商用利用に耐えうる精度ではありませんが、もう数年で到達する可能性を感じます。
今後のAIの発展は楽しみであると同時にエンジニア的には怖くもありますね。
