Open4

Pythonで麻雀の画像認識(活動停止中)

ShimbeiShimbei

0. 必要な技術

・Python
・Open CV
・画像分類するAIの活用(Tensor Flow?)

あくまでAIの活用と分類タスクの達成がメイン

雑談・余談

roboflowが化け物。アノテーションをある程度やったら大体でアノテーションしてくれるシステムがあるから、それを使えば間違っているところを修正するだけで済む。しかも物体検出の精度もWeb上で確認できる(とはいえデモなので実装するときと精度は変わる)。なのでここでいい感じにアノテーションすればYOLOのライブラリを使うだけでよさそう。
roboflow tutorial:https://youtu.be/a3SBRtILjPI

とか思ってたけど、相当な枚数のアノテーションを手作業でやらないとAuto Annotationは出来ない
☞結局手作業で全部アノテーションしないといけなかった。

アノテーションの正解ってどれなんだろ。表面だけだと2sと6sみたいに誤認識する?

develop log

2025/01
・roboflowでの精度がよろしくないので、先にYOLOv5でTrainする
・roboflowがそれほどでもないかもしれない
2024/12
・roboflowが化け物だと気付く
・本格的に制作を始める

参考文献一覧

データセットの作成:https://qiita.com/85yago/items/d276a65f2c8ad8bba5c8
YOLOv5公式:https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
YOLOv5 colav_ver:https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb

ShimbeiShimbei

1. はじめに

1.1 なぜPythonで麻雀?

全自動雀卓を作りたいなーと思っていた時に、「それなら点数計算も自動で出来ないとな!」となったから。以前からAIに興味があってかじり続けていたので、そろそろ真剣に挑戦したくなった。

1.2 設計の目標と必要な機能

本デバイスの設計目標とその優先順位をまとめる。
【麻雀で上がったときの状態をカメラで認識することで間違うことなく「役・翻数・符計算」を行う。】

以下に必要な機能をまとめる
・写真を画像処理
・麻雀牌を1牌ずつ区分けし、それぞれAIで分類
・順番通りに並べなおす
・牌が間違っていないかユーザーに確認
・API(既存ライブラリ?)を用いて計算
・点数の詳細を表示

1.3 開発のフロー

開発は以下の手順で進める。注意事項として、複数の構成要素(プログラム、回路設計、3DCAD)を扱う場合は、より複雑な要素から取り組むべきだという点。そうしないと後から変更がいっぱい出てきてやり直しになるので。

◉環境構築
 ⚫︎roboflowのセットアップ
 ⚫︎Google ColablatoryにYOLOを準備
◉プログラムの制作
 ⚫︎YOLOv5のサンプルを用いて適当な物体検出
 ⚫︎YOLOv5で自作データセットを読み込む
 ⚫︎データセットの作成
 ⚫︎trainする
 ⚫︎テストとパラメータ調整
 ●クオリティに応じてv9に以降
◉SSDに挑戦
 ⚫︎Google ColablatoryにSSDを準備
⚫︎SSDのサンプルを用いて適当な物体検出
⚫︎データセットをSSD用に作り直す

これにもとづいて制作を進める。

ShimbeiShimbei

2. 環境構築

roboflowはログインしてアノテーションするだけ。詳細はtutorialから。

google colabはyoloのGithubを見て言われたとおりに実装する。以上。

ShimbeiShimbei

3. プログラムの制作

3.1 YOLOv5を用いて画像認識

環境構築およびGoogle Colabが問題ないか確認するために、適当なデータセットを用いて物体認識をする。出来れば次に進む。
 これはdetect.pyというソースコードがYOLOv5の公式ライブラリにあるため、それを活用すればいい。2つ注意するべき点が有る。1つは検出するソース(画像や動画など)を適切に設定すること。下図のようなPythonのサンプルコードをGoogle Colabで動かすのだが、例えばYOLOv5/data/images/zidane.jpgの画像検出をする際は以下のようにプログラムを変更する必要がある。もう1つはコードの頭に「!」をつける必要があること。Google ColabはJupyter Notebook ベースの環境であるため、シェルスクリプトを実行するには「!」をつける必要があるのだ。

変更前
python detect.py --source 0  # webcam
                          img.jpg  # image
                          vid.mp4  # video
                          screen  # screenshot
                          path/  # directory
                         'path/*.jpg'  # glob
                         'https://youtu.be/LNwODJXcvt4'  # YouTube
                         'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream
変更後
!python detect.py --source data/images/zidane.jpg  # image

3.2 YOLOv5を用いて自作データセットを読み込む

テストとして作成したデータセットを用いて学習を行う。ここでデータの仕様を理解できれば以下のことが出来る。
・roboflowのアノテーションを萬子・ピンズ・ソウズ・字牌に分割して行う
・アノテーションした後に色々設定を変更する(roboflowの標準機能?)

と思っていたが、色々調べたところ大体理解できたので一度まとめる。まずアノテーションは別々でデータセットを準備しても問題がなさそうである。結局機械学習の際にデータセットをまとめてyamlファイルを書き換えることで対応が可能そうである。

3.3 メインのデータセットを作成する

3.4 trainする

どうやら転移学習も有効である可能性がある。何かというと、一般的な物体検出を事前に学習しておくことで麻雀牌のエッジのような低レベルの情報を効率的に取得することが出来るらしい。ただパラメータ調整などの課題はあるので精度に応じて採用する。