実盤の囲碁を棋譜に残したい。「碁つづり」を作り始めました
目次
自宅の碁盤で打った対局を、スマホで撮って棋譜に残せないか。そんなことを考えて、Androidアプリ「碁つづり(Gotsuzuri)」を作り始めました。
目標は対局を撮影してSGF形式の棋譜を作ることです。今はまだ、撮った写真に碁盤の交点を重ね、石の配置を試しに判定するところまで。動画や棋譜の出力には、これから取り組みます。
ここまでの試作
KotlinとJetpack Composeで画面を作り、撮影にはCameraXを使っています。

開発中に使った、真上に近い位置からの写真。
最初は写真の四隅を手動で指定することにしました。木枠の角ではなく、最外周の交点を4つ選ぶと、19×19の交点が画像に重なります。斜めに写った盤面にも合わせられ、実際の操作は体感で2分もかかりませんでした。
石認識の難しさ

試験判定を重ねた開発中の画面。緑は空、黒白の丸は石候補、橙は不明です。正解を表示しているわけではありません。
影と反射
交点が合えば石も読めそうですが、そう簡単にはいきませんでした。影で盤面が暗くなり、照明を足すと今度は反射が増えます。低い位置から撮ると、奥の石も重なって見えます。

同じ配置を低い角度から撮影した写真。
石の高さと位置ずれ
石には厚みがあるので、斜めから見ると上面が交点からずれて見えます。盤面の交点を合わせる処理だけでは、このずれまでは直せません。
石の高さによるずれの模式図。実写のずれ量を測定した図ではありません。

黄色い輪の4交点は実際にはすべて空です。PCでの判定では、ここを黒2点・白2点と誤判定しました。輪は説明のために追加しています。
現在は色と明るさで石候補を探しています。まだAIモデルは使っていません。交点の周囲を探すようにしても、隣の石を拾っている疑いが残りました。
正解データでの比較
GTの作成
画面を見て「だいたい合っていそう」と確認するだけでは、改善したのか分かりません。そこでPCにラベル作成画面を用意し、私が各交点を空・黒・白に分類しました。この正解データをGT(Ground Truth)として、現在の判定結果と照合しました。
3枚の比較
同じ配置の写真3枚を比べた結果がこちらです。1枚につき361交点を数え、「不明」は判定を保留した点として分けています。
| 撮影位置 | 正しい判定 | 誤判定 | 不明 |
|---|---|---|---|
| 上方 | 347 | 0 | 14 |
| 低い角度 | 335 | 4 | 22 |
| 高い位置 | 337 | 0 | 24 |
低い角度で間違えた4点は、高い位置の写真ではすべて不明でした。誤検出はなくなっても、空だと分かるところまでは進んでいません。不明には本物の石も含まれるため、全部を空として扱うこともできません。
これはPCでの比較で、Android上の結果と完全に一致するものではありません。3枚とも同じ配置で、影などの条件も違うので、まだ一般的な認識性能は判断できません。
盤面認識AIの学習に向けて
ここまで試してみて、盤面認識AIの学習に取り組んでみたくなりました。色や明るさで判定する今の処理と、石の見た目を学習したモデルで、どんな違いが出るのか比べてみたいです。
まずは問題が出た場所の石について、画像上で見える中心を少数記録する予定です。石の色を読み違えたのか、正しい色を読んでも隣の交点に割り当てたのかを切り分けます。そのうえで別の配置の正解データも用意し、小さなモデルをPCで学習・評価してみたいと考えています。
今はまだ、AIの学習を始める前の段階です。自宅で石を並べながら、認識を改善していく過程も記録していく予定です。