数独を画像認識で解いてみた

はじめに

これは2020年の春ぐらいに主専攻実験という授業で,授業の内容から発展的なものを作ってプレゼンしろと言われたので,数独を解いたというものです.

しかし,数独MATLABに用意されていた数独ソルバーを用いているので,数独を解くということはしていません.

したことは,数独の問題を読み取るということです.また,数独の問題は紙からではなく,Webページ上からもってきたものを使っています.

f:id:OShun:20200914211333p:plain
問題
f:id:OShun:20200914211348p:plain
解いた結果

概要

以下,

  1. 教師データの作成
  2. 数独の認識
  3. 文字認識
  4. どのようにして文字を切り取ったのか

という流れで進めていきます.

教師データの作成

まず,教師データの作成をしました. といっても,使用したサイトのフォントの数字,1から9までと空白のを用意し,それぞれを左右上下に3pxずつずらしたものです.各49枚,全部で490枚となりますが,実際には442種類しかないです.なぜなら,空白のものはどんなにずらしても空白だからです.

ここで,最初に用いたサイトでは認識精度があまりよくなく,6,8,9がよく間違われました.

当たり前の話ですが,問題が正しくなければ,答えが正しく出力されなかったり,解けなかったりするので,認識率は100%でなければなりません.

そこで,フォントが悪いのだということに気付き,Webページなのでデベロッパーツールからフォントを変えてやろうかと思いました.しかし面倒くさいので,サイトそのものを変えました.

すると認識率100%となったので万々歳のうちに次のステップへと進みます.

f:id:OShun:20200914211426p:plain
教師データの作成(2の場合)

数独の認識

数独を解くためには,数独の問題全体を認識する必要があります.

これは外の枠線を認識すればよいのでハフ変換を用いました. 横の線も見ればよいかなと思いましたが,縦の線だけで十分だったので,見ませんでした.

文字認識

上記に書いた通り,文字認識率が100%とならなかったときに,この授業内では主成分分析による認識を行っていたのですが,別の画像認識工学という講義で習った様々な認識手法を試した結果,最も認識率が高い部分空間法による認識に切り替えました.

部分空間法による認識を行ったのですが,100%とならなかったため,フォントを変えました.

どのようにして文字を切り取ったのか

縁の大きな枠線を切り取るようにしながら,それぞれ81個の小さな枠に分解した.

f:id:OShun:20200914211540p:plain
ハフ変換により切り取られた画像

f:id:OShun:20200914211614p:plain
文字認識の結果

f:id:OShun:20200914211642p:plain
MATLAB数独ソルバーを使った結果

さいごに

もし,数独の問題を画像認識によって解かれたくなければ,数字同士が人間の目からみると明らかに違うが,計算機で画像認識を行うと判別が付きにくいフォントを使用すればよいです.

懸賞問題などを作る機会があればお忘れなきよう.

f:id:OShun:20200914211806p:plain
6,8,9が似てるサイト

numberplace.net