IoT碁盤
東京大学機械工学科3年 田中暉久
[はじめに]
本をタブレットではなく紙で読みたいと感じるのと同様、(主に年配の方で)囲碁をPCで打つことに抵抗を感じる人も多い。本演習では、普通の(リアルの)碁石と碁盤を用いて、leela zeroという囲碁AIと対戦できるデバイスを制作した。
制作物を決定するのにそれほど時間はかからなかった。というのも、大学入学時からこのようなデバイスを作ってみたいという野望があったためである。高校生時代、勉強よりも圧倒的に優先度が高かった囲碁を大学生になっても趣味として続けている。受験生時代に登場し東大入試の英語のリスニング素材にもなった囲碁AIと自ら対戦して得た感動を、より多くの人に体験してもらい、囲碁AIを身近に感じるきっかけとなれば幸いだ。
[装置の概要]
装置の説明を簡単に行う。
囲碁AIはオープンソース(https://github.com/leela-zero/leela-zero)で世界のトップを争う強さのleela zeroを使用した。
- ① IoT碁盤にはカメラを取り付け
- ② Raspberry Piの中で画像処理を行い
- ③ 現在の盤面を把握したうえで
- ④ 次の1手をインターネットを介して、CPUの性能優れた別のPCに送信する。
ここでleela zeroはニューラルネットワークを用いており、ハイスペックなPCでないと(GPU搭載が好ましい)動作しない(つまりRaspberry Piの中でleela zeroを動かすことはできない)。
- ⑤ leela zeroが白の最善手を示し
- ⑥ それをRaspberry Piに送信して
- ⑦ 現在の盤面を把握したうえで、
- ⑧ 白の手をスピーカーにより音声出力する。
以上①~⑧を毎ターン行って、対局終了すれば
- ⑨ Google Driveに棋譜(対局データ)をアップロードする。
[ソフトウェアの実装]
上述した①~⑨それぞれについて、実装の様子を説明する。(あまり詳しく書く必要もないが備忘録として)
1,2 盤面のキャプチャおよび認識
ここは本演習で最も力を入れた部分である。Pythonで実装し、OpenCVを用いた。適切な閾値を設定して、二値化処理を行うことが基本となる。まずは碁盤を置いた状態で(碁石を置かずに)キャプチャをとる。輪郭抽出を行い、キャプチャの中で最も大きな四角形を碁盤として認識する。この4頂点を保存しておき、今後毎ターン用いる。4頂点を引数にとり、透視変換により斜め上からみた碁盤を真上から見た正方形に変える。後の画像処理を軽減すべくピクセルを266×266にした。
はじめはハンディキャップの設定である。できる限り実際の対局に近づくよう、入力は単に盤上に石を置くだけにした。何も置いてない画像との差分から置石の数を判断する。なおキャプチャは処理の時間も合わせておよそ1秒に1回とっている。以下の画像はハンディキャップ3子でスタートして8手進んだ場面である。
その後、毎ターン、キャプチャ→透視変換→背景差分→二値化→新しい手の抽出を行う。背景差分で背景として用いる画像は、直前に黒の新しい手を認識することに用いたキャプチャである。キャプチャは毎秒行い、黒(対局者)が新しい手を打ったことは、差分ありかつその部分が黒(白の手も当然差分で出てくるが、それは後述する理論碁盤で管理しているので画像から抽出はしない)として判断している。
ここまでそれほど高度なことはしていないようだが、認識ミスが1手でもあればそれはIoT碁盤にとって致命傷となる。なぜなら後で修正することが極めて難しいからだ。そのため様々な方法を駆使し認識精度の向上に努めた。影や光の加減の変化、打つときに移りこんでしまう対局者の手といった外乱にも柔軟に対応するプログラミングが要求される。
3,7 盤面の管理
認識精度を上げるために理論碁盤をRaspberry Pi上で管理することにした。理論碁盤とは自身で命名したもので、プログラム上で管理している盤面(19×19の2次元配列)を指す。すでに石が置かれている座標に新たに石を置くことはできず、画像認識で問題が生じた(例えば光の加減の急な変化に対応できず画像が白飛びするなど)場合に再度認識し直すことができる。
また新たに打たれた座標が着手禁止点だった場合も再度認識を行い、実際に着手禁止点に対局者が打ったと判断した場合は「ルール違反」の旨をスピーカー出力するようにした。
理論碁盤の利用はこれだけにとどまらない。囲碁は「囲む」ゲームであり、上の画像のように相手の石を囲むとその石を取り上げることができる。このことは盤面認識を行う大きな障壁となっている。石を取ったor取られた場合に差分が数箇所にわたるが、差分ありかつその部分が黒という論理で解決できる。最も扱いが難しいのは、石を取られたところに黒を置いたときその座標には差分が出ないという状況が発生することである(下図で黒13は背景として用いる画像の黒1と被ってしまって差分として出ない)。
そもそも、この解決策として理論碁盤を導入したのである。白12に打った時点で、背景画像の取られた黒1と黒3の2座標に該当する部分にオリジナル画像(石を置いていないときの盤面の画像)の該当ピクセルのグレースケール値をはめこんでおくことで
のような画像ができ、これを背景画像として用いれば、黒13が差分として浮き出てくることになる。どの石が理論上取られるかを把握することが必要条件となっている。
4,5,6 通信およびleela zeroの動作
全てWindowsで行った。バッチファイル(拡張子はcmd)をメインで動かし、通信やleela zero(C++で書かれている)の動作命令はVBScriptで書いた。なお通信はWinSCP経由で行った。
詳細の説明は割愛するが、Raspberry Pi側のシェルスクリプト(拡張子はsh)から命令(新しい白の手の座標など)の書かれたテキストファイルを読みにいくのとWinSCPで送信するタイミングが合わず誤作動しないように工夫した。
8 スピーカーによる音声出力
対局開始、終了、新たな白の手の座標および対局中のトラブル対応を全てスピーカーに委ねた。新たな白の手の座標の通知がメインの役割であって、ユーザーの利便性を考え、座標に加え場所(右上隅など)も通知するようにした。
9 棋譜データの管理
Google Driveを利用した。テキストファイルにしたので、他の囲碁GUIとの互換性が高い。
[IoT碁盤のターゲットおよび商品価値]
ターゲットは、主に年配のPCを使うのが苦手or嫌いな方々だが、囲碁を嗜みリアルの盤石で、AIと対局したい方々全般である。
碁盤や碁石を専用のものとして創作すれば画像認識や音声出力せずとも要求機能が実現できるのではないかという質問が、IoT演習の最終発表時にもあった。これは本演習において適切な手段だと思う。しかしあえて採用しなかった理由が2つある。
まずは、囲碁プレーヤーにとって、これまで使用してきた盤石に対する愛着は深く、それゆえそのままの盤石でプレーできるメリットは大きい。
また原価は全て込みで10,000円程度で、定価は20,000円くらいの見込みである。これほどの低価格ですむことが2つ目の理由である。
[課題と発展性]
ネット対局(対人戦)への応用が期待できる。ただ現状としては、盤面認識に多少時間がかかっており、短い制限時間の課されたネット対局には向かない。精度を保持したまま時間短縮をする方法を考える必要がある。
現在ネット対局が普及して「囲碁のグローバル化」が進んでいるが、国や地域で好まれる形や戦法は異なる。集積した棋譜データを用いて、形や戦法を機械学習で分析することもまた興味深い。
[感想]
IoT演習は約3ヶ月間の限られた時間内で制作物を決め、完成させなければならない本当に大変な演習でした。先輩の多くは時間が足りなかったとレポートに記載しており、それゆえに初めの1ヶ月間できることから進めていきました。要求機能を列挙し達成すべき順番を整理して、できるだけ並列で作業を進め、あることに行き詰まればとりあえず別の作業に取り組むようにしました。時間を見つけてはIoTメディアラボへ向かい、現在の問題点を相談して解決のヒントを提示していただけたこと、大変感謝しています。駒場祭のあたりで気が緩んでしまい1ヶ月近くほぼ何も進めずにいたところ、再び時間的に追い込まれ、最後の1ヶ月間かなり大変でした。演習が始まった当初は、石を打つためのアームを付ける予定でしたが、様々トライしてみたものの上手くいきませんでした。音声出力で解決することに決めたのは、最終発表の約1週間前でした。ただ逆に当初予定していなかったものも実装できました。理論碁盤については全く考えていなかったのですが、実用上導入する以外の方法が思いつかず実装しました。
学科の友人とともにC#を用いたトランプゲーム作りを行ったり、C言語やC++を用いた学科の演習に取り組んだりと何度かプログラミング経験はありました。本演習ではPythonの経験が少ないことと、実現したいことと似たソースコードがPythonだと最も見つけやすいだろうということで、Pythonメインで書きました。プログラミング力の向上が実感できたこと、さらに他人の書いたコードを読み解き利用できる部分を自らのコードにフィットするように書き換える力が身についたこと、本当によかったと思います。他にもバッチファイルやシェルスクリプトは初めて耳にするというレベルでしたが、その辺りは石山先生に丁寧に教えていただき、それほど苦労せず実装できました。
IoT碁盤は、①~⑧のサイクルのすべての作業が完成しないことには使い物になりません。そのため何があってもループを完成させようと考えていて、本当に直前だったのですが、サイクルのすべてがエラーなく動くようになったときの達成感は非常に大きいものでした。春休みは時間があるので、Raspberry Pi内のコードだけを用いた、人と人の対局の棋譜付けのプログラムを作成中です。光が反射している部分に白石を置いたとき差分が出づらいのが課題です。完成したら囲碁サロンに設置してもらう予定です。
本演習全体を通して言えることは、とても楽しかったということです。素晴らしい環境を整えてくださった先生方に感謝しております。作りたいものに取り組める貴重な機会をいただき本当にありがとうございました。