ココロミにきみ

本と体とプログラミング

数字・文字の存在場所判別>AI前処理

AIで答案の自動採点にトライする過程で、それが人間の「認識」のあり方を考え直すことになり面白いので、思考過程とともに残しておく。

 * * *

以前、まだ赤ちゃんレベルの”AI”が食べやすいように、画像データ(食べ物)をちょうどいいサイズに切り取ってAIのお口に持っていく作業をしている、という話をした。

(手書き数字認識の機械学習を通じて学んだこと)

今度は、そのさらに一つ手前の処理が問題になり、解決策が1つできて、課題が1つできたのでそのロジックを記す。

【自動採点プロセス】

  1. テストの解答済用紙を多量にスキャン(スキャナーが活躍!)
  2. 解答画像から答えが書かれてる場所を探し出して正方形に切り取る(今回の話)
  3. 正方形画像内の無駄な余白を切り取って、読みやすくする(前回のお話)
  4. AIが正方形画像を見て「この解答は99%の確率で”3”っ!」と当ててもらう
  5. AIによる解答の認識結果と、正解を照らし合せて点数を出す(エクセルなど)

のうち、2が今回のお話。

 * * *

たとえば解答欄はたいてい横長で、そこに数字や文字を書いたときに、ノイズも含めて解答欄のどこに答えが書かれているか?の判別は意外に難しい。プログラムで処理を行う以上、プログラムでその方法論が書けなければいけない。

f:id:molingit:20171009231934j:plain

実際はこれを以下のように行列の形にして扱う。

f:id:molingit:20171009231952j:plain

いろいろ手段はあると思うんだけど、結論から言うと「重さ」と「中央値」のセットで行う。行列にする際、画像の白い部分を0、字やノイズを1とすると、なにかしら線がある部分は数字が入り、”重さ”があると言える。その重さがある列の番号を記録しておき、その番号セットの中央値付近に数字や文字の重心があるだろうと。

f:id:molingit:20171009231941j:plain

f:id:molingit:20171009231945j:plain

その重心から適当な距離で正方形に区切ったら、数字や文字のみを含む画像ができる。この方法のいいところはノイズが大きくなり過ぎない限り、ノイズの存在を全く無視して数字や文字だけを捉えられること。(って、やってきてけど、重み重心を取ったほうがいいような気がしてきた・・・)

* * *

話はとんで、これって人間が数字や文字を認識しているプロセスかと。いくつかの文字らしきもの(含む:ノイズ)の集まりを見て、まず、大きな母集団を持つ ” 線の塊 ”  の1つに注目する(重みの中央値を探す)。そして、その重みの中央値からちょっと半径を広げた円に視界を広げて、そこに映る画像を切り取り、数字や文字として変換される。

ってことを考えていたら、自分は一つの文字のなかで、中心より若干左に重心を感じているらしいことが分かった。おそらく自分が書く字は重心が少し左寄りになっているんだろうと思う。逆に字のバランスのいい人は一文字のなかで感じる重心の位置が違うのかもしれない。とすると、字の指導は重心の位置感覚の指導から始めるべきことかもしれない。

* * *

話を数字・文字認識に戻すと、当然解答は一文字であるこのほうが珍しくて、2文字以上が当たり前なわけで、二つ以上重心があるやつはどうすんじゃ!?と考えたら、すでに「クラスタリング」という複数の重心を弾き出す機械学習(≒AI)の手法がある。

ってか、一文字でもこれ使えるじゃん・・・。