勉強し始めなので間違っている可能性が大いにあるのでそのつもりで
みてください。
麻雀の待ち当てアプリをつくりたい
麻雀で相手の河(捨て牌)をみて待ちを当てるアプリ作ってみたいなと思い
見切り発車で始めました。
理想は自分の視点(自分の手牌と相手の捨て牌が見える)から写真を撮ると
相手の待ち牌候補を表示するアプリ。
かなり大変そうですが、まずは牌の画像認識の勉強から始めます。
Swiftでの画像認識
Swiftで物体検出をするにはmlmodelが必要らしく(やり方は他にもあると思う)、
XcodeのCreate MLでmlmodelを作れるらしい。
が、そこまでには色々準備が必要なようで
- 物体検出のために画像を学習したmlmodelが必要
- mlmodelを作るためには画像とannotation(注釈ファイル)が必要
- annotationファイルを作るためにlabelImgを使いたい
- labelImgを使うためにPythonをインストール
ということで、Pythonを始めることになってしまった。
labelImgについては下記記事を参考にしました。
https://zenn.dev/pikkipikki/articles/c390502dfec8dc
苦行のannotation作業
まずはやってみようと、雀魂の観戦モードで50枚ほどのスクショを撮り
分類する牌は、
萬子・索子・筒子それぞれ9種と字牌7種と赤ドラ3種と裏(牌の背面)の計38種
これをそれぞれの画像で矩形で囲み、ラベルをつける
1枚のスクショを処理するのに大体5分…なんだけど、
非常に苦痛、全く作業が進まない。
何とか30枚終わったところで、テストしてみることに
ちなみに、labelImgではannotationファイルが画像ごとに生成される。
しかしCreateMLで使うには一つにまとめる必要がある。
この記事を参考にGoogle colaboでファイルを作成した。
https://note.com/npaka/n/nf74e32b47712
ファイルの取得がうまくいかなかったので以下のように変えたらうまくいった。
filenames = glob.glob('*.json')
XcodeのCreateMLでtraining
画像とannotationファイルを設定しtrainingボタンを押す。
13000回トーレニングするらしい(6時間かかった)
処理が終わったのでテストしてみたのがコレ

牌の検出も不完全で、識別もダメ。
理想には程遠い結果。
用意したスクショは50枚でまだ30枚しか処理してないとはいえ、
1つの画像に複数牌あるから、
1種類につき50枚以上はアノテーションがあるはず。
すくなくとも100枚は必要と書いてあった気もするし、
残り20枚やるのもいいんだけど、精神的にきついので
別の方法を考える。
Pythonで画像とannotationをつくる
どうせ牌の画像は(動物の識別と違って)一緒なんだから
画像ごとプログラムで作ってしまって
同時にannotationも出力すれば、
大量の画像とannotationが一気に作れるのでは?
てことでPythonで画像を作成する方法を勉強します。
つづく。