みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

TensorFlowで文字認識にチャレンジ(1)

TensorFlowのチュートリアル[1]の中に, 手書きの数字認識を試すものがある.
数字であれば99%以上の認識性能を出すことができるが, 日本語のかな/漢字ではどの程度の認識性能が出るのだろうか?
そこで, まずはひらがなで認識を試してみることにした.

Deep Learningを試すには大量の学習データが必要であるが, 以前日本語のオンライン手書き文字の認識技術の開発を行っていたので, 当時のデータを用い28x28dotの画像データを作成することにした.
手書きのストロークデータから28x28dotの画像への変換がイマイチなようで画像が少し汚いが, こんな感じ...

[元データ]
f:id:moonlight-aska:20160528225841p:plain

[28x28dot画像]
f:id:moonlight-aska:20160528225922p:plain

今回準備したデータは, 小文字を除くひらがな73文字種.

学習用:約130サンプル/文字, 計9,874サンプル
評価用:約30サンプル/文字, 計2,010サンプル

今回, 画像データのフォーマットは以下とし, データの読み込み部分を作成してみた.
f:id:moonlight-aska:20160529001133p:plain

[コード]

# -*- coding: utf-8 -*-

import struct
import numpy as np

# ひらがな
class Hiragana:
    def __init__(self, LT):
        if LT == 'L':
            self.fnImage = './data/train_hira.img'
        else:
            self.fnImage = './data/test_hira.img'

    def getImage(self):
        return _readImage(self.fnImage)

# 文字データ読み込み
def _readImage(fnImage):
    f = open(fnImage, 'r')
    pixel = np.empty((20000, 784))
    label = np.zeros((20000, 90))
    for i in range(20000):
        ## header
        header = f.read(10)
        dummy = f.read(6)
        if header == '':
            break

        key1, key2, jis, row, col = struct.unpack('<5H', header)
        # 正解ラベル
        label[i][jis - 0x2420] = 1;
        if key1 == 0xf001 & key2 == 0xf001:
            # pixels
            npixel = row * col
            buf = struct.unpack('>%dB' % npixel, f.read(npixel))
            # 0-1.0に正規化
            pixel[i, :] = np.array(buf) / 255.0
        else:
            break

    f.close()
    return i, pixel, label

注意することは, Deep MNIST for Expertsで紹介されている認識プログラムでは, グレースケール画像の画素値を0~1.0に正規化しておく必要がある.

次回は, このデータを使って, ひらがなの学習/認識を行ってみる.

----
[1] Tutorials - TensorFlow






人工知能は私たちを滅ぼすのか―――計算機が神になる100年の物語

人工知能は私たちを滅ぼすのか―――計算機が神になる100年の物語


AIの衝撃 人工知能は人類の敵か (講談社現代新書)

AIの衝撃 人工知能は人類の敵か (講談社現代新書)