【機械学習】VC++で手書き数字認識のWindowsアプリを作ってみた 2/2

前回の記事↓では内部処理について簡単に記載しましたが、今回は手書き数字認識を実際に試してみます。

kuranabe.hatenablog.com

Windowsタブレットで実行するとMFCアプリでも少し先進的に見えます(笑)

f:id:kuranabe:20180703034229j:plain

 

それでは、各数字の認識結果を見ていきます。


・0

f:id:kuranabe:20180703005626p:plain  f:id:kuranabe:20180703005629p:plain

斜めに潰した書き方でも問題なく認識しています。

・1

f:id:kuranabe:20180703005526p:plain  f:id:kuranabe:20180703005529p:plain

センタリング処理を入れているので、中心部から大きく外れていても問題ありません。
※センタリング無しで試したところ、全くダメでした。
(センタリング無しのCNNでも同じ結果になるのか気になります)

 

・2

f:id:kuranabe:20180703005532p:plain  f:id:kuranabe:20180703005535p:plain

左側の教科書的な書き方より右側の方が確度が高いです。これはMNISTの元データに右側の書き方が多いからでしょうね。

・3

f:id:kuranabe:20180703005539p:plain  f:id:kuranabe:20180703005542p:plain

問題なく認識しています。

・4

f:id:kuranabe:20180703005545p:plain  f:id:kuranabe:20180703005549p:plain

左側は正しく認識されていますが、斜辺の部分が少し傾くと確度が95%→23%に減少し、6と誤認識されました。
連結成分を考慮すれば改善すると思います。

・5

f:id:kuranabe:20180703005552p:plain  f:id:kuranabe:20180703005555p:plain

斜めに書いても問題なく認識されました。他にもパターンを試しましたが5は総じて認識率が高かったです、

・6

f:id:kuranabe:20180703005600p:plain  f:id:kuranabe:20180703005603p:plain

問題なく認識しています。

・7

f:id:kuranabe:20180703005606p:plain  f:id:kuranabe:20180703005610p:plain

私を含めて日本人の多くは右側の書き方をするかと思いますが、この書き方は総じて認識率が低いです。MNISTの元データに左の書き方が多いためと考えられます。

・8

f:id:kuranabe:20180703005613p:plain  f:id:kuranabe:20180703005616p:plain

正しく認識されていますが、斜めに書いた右側は9と判定がギリギリですね。

・9 

f:id:kuranabe:20180703005619p:plain  f:id:kuranabe:20180703005622p:plain

正しく認識されていますが、7の判定が高いです。
7と9は成分が似ているため、連結成分を考慮すると正しく認識されるはずです。

 

さて、実際に試してみると認識しやすい数字とそうではない数字が明確に別れている印象でした。特に「7」は学習データと入力データで書き方の傾向が明らかに異なるためか、誤認識が多いです。(日本人と外国人の書き方の違い)

コンペ等で提供された学習・テストデータの中だけで回す運用の場合は問題ないですが、学習データと実運用が全く別環境の場合は学習データのローカライズが必要と感じる結果でした。