Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
TensorFlowで文字認識にチャレンジ! / Japanese Character Recognition with TensorFlow
moonlight-aska
December 11, 2016
0
15
TensorFlowで文字認識にチャレンジ! / Japanese Character Recognition with TensorFlow
2016年12月11日開催の「TensorFlow勉強会#11」のLT資料です.
moonlight-aska
December 11, 2016
Tweet
Share
More Decks by moonlight-aska
See All by moonlight-aska
Kingo AI Navi LINEをもっと使い倒せ!!
aska
0
32
Depth画像で物体検知やってみたー。/ Objects Detection with Depth Images
aska
0
230
Kingyo AI Naviアプリ開発 / Kingyo AI Navi App
aska
0
210
AutoML Vision Edgeで金魚分類モデルを学習してみた / Kingyo Classification Model with AutoML Vision Edge
aska
0
230
AutoML Vision Edge + ML Kit for Firebase ⇒ Kingyo Classification
aska
1
350
Kingyo AI Navi
aska
0
300
ピープルカウンタ、その後。/ People Counter
aska
0
320
物体検出をPythonで動かしてみる! / Try using YOLOv3 in Python
aska
0
600
ML Kitでちょびっと金魚AI / Recognition of goldfish type using ML Kit
aska
0
210
Featured
See All Featured
JazzCon 2018 Closing Keynote - Leadership for the Reluctant Leader
reverentgeek
172
8.3k
Pencils Down: Stop Designing & Start Developing
hursman
112
9.8k
Facilitating Awesome Meetings
lara
29
3.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
396
62k
Art, The Web, and Tiny UX
lynnandtonic
280
17k
The Brand Is Dead. Long Live the Brand.
mthomps
45
2.7k
Code Review Best Practice
trishagee
41
6.7k
A better future with KSS
kneath
225
15k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
268
11k
Writing Fast Ruby
sferik
612
57k
VelocityConf: Rendering Performance Case Studies
addyosmani
316
22k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_i
21
14k
Transcript
TensorFlowで 文字認識にチャレンジ! 2016/12/11 Moonlight 明日香 TensorFlow勉強会#11 LT
自己紹介 Moonlight 明日香 鶴田 彰 関西の外資系家電メーカー勤務 昔は,
・パターン認識(音声, 文字, etc) ・ユーザ適応(レコメンド, etc) なども・・・ 最近は, 週末プログラマとして また機械学習に再チャレンジ中! Twitter @moonlight_aska Blog:みらいテックラボ http://mirai-tec.hatenablog.com Wiki : Androidプログラマへの道 ~Moonlight 明日香~ http://seesaawiki.jp/w/moonlight_aska/
目次 1. 文字認識とは 2. 特徴量の抽出 3. モデル構造 4. 学習と評価 5.
実装ポイント 6. 最後に
1) オフライン手書き文字認識 紙に書かれている文字を判別する技術 2) オンライン手書き文字認識 画面に入力した文字を判別する技術 文字認識とは あ 5 今回はこちらで!!
オンライン手書き認識手法 1. 構造解析的方式 例) 基本ストローク法 2) パターンマッチング方式 例) DPマッチング法 ストロークパターン例
「林」のサブパターン認識結果 今回はこちらで!!
文字の特徴点抽出 前処理・特徴抽出 1) 同一座標点の除去 2) 変化点の抽出 3) 文字の重心を求め, 重心が文字中央になるように文字データを 拡大/縮小変換
4) 所定のピッチで特徴点を抽出. ただし, できるだけ変化点は残すように.
特徴点の抽出例
特徴点表現 1) 文字枠内の座標 2) ストロークの移動方向 3) ストロークのON/OFF状態 特徴ベクトル
DNNは何を使うか? 画像データ ⇒ CNN (Convolutional Neural Network) 時系列データ ⇒ RNN
(Recurrent Neural Network) ここは CNNでチャレンジ!! 理由1:当時TensorFlow始めたばかりで, CNNのチュートリアル しかよく知らなかった!! 理由2:自然言語処理(NLP)の分野で, CNNを適用したという 記事があった. http://www.wildml.com/2015/11/understanding- convolutional-neural-networks-for-nlp
入力表現 128 d10 d11 d12 d13 d10 ' d11 '
d12 ' d13 ' d20 d21 d22 d23 d20 ' d21 ' d22 ' d23 ' : : : : : : : : dN0 dN1 dN2 dN3 dN0 ' dN1 ' dN2 ' dN3 ' 0 0 0 0 0 0 0 0 : : : : : : : : 0 0 0 0 0 0 0 0 特徴点1 特徴点2 特徴点N Zero Padding ONストローク情報 OFFストローク情報
モデル構造 画像方式のモデル構造 1) 畳み込み層 2) プーリング層 3) 畳み込み層 4) プーリング層
5) 全結合層 6) Softmax Regression層
学習と評価 [学習条件] • 認識対象:ひらがな73文字種+漢字2,965文字種(JIS第一水準) • 学習データ:約340,000(ひらがな約10,000, 漢字約330,000) • 学習回数:ミニバッチ(100サンプル)×100,000回 [認識条件]
• 評価データ:ひらがな2,010, 漢字29,471 [実験結果] 方式 対象 1位 累積(5位) 筆点列 ひらがな 97.56% 99.95% 漢字 95.95% 98.93% 画像 ひらがな 95.37% 99.80% 漢字 95.71% 99.13%
文字認識の難しさ ★画数の少ない文字に類似文字が多い [例1] 同じ形状の文字 ・ひらがらの「へ」とカタカナの「ヘ」 ・記号「+」と漢字「十」 ・カタカナ「カ」と漢字「力」 ・数字「1」と英字「I」,「l」と記号「|」 : [例2]
類似した形状の文字 ・カタカナ「ス」, 「ヌ」と漢字「又」 ・カタカナ「フ」or「ワ」と数字「7」 ・漢字「土」と「士」 ・漢字「乙」と英字「z」, 「Z」 : 認識性能upには言語処理が必須!!
実装ポイント(1) 基本はDeep MNIST for Expertsベース ポイント1: One-Hotをミニバッチ毎に生成 [コード] for i
in range(ITELATION_NUM): # ミニバッチのデータ idxs = random.sample(xrange(num1), MINI_BATCH_SIZE) batch_xs = dat1[idxs] ys = label1[idxs] # JISコード batch_ys = np.zeros((MINI_BATCH_SIZE, JP_CATEGORY_SIZE)) for j in range(MINI_BATCH_SIZE): batch_ys[j][jp.getIdx(ys[j])] = 1
実装ポイント(1) ID ⇒ 漢字表記 self.code = np.array([ '_', # 0
[0x2121] '、', # 1 [0x2122] '。', # 2 [0x2123] ',', # 3 [0x2124] '・', # 4 [0x2126] ':', # 5 [0x2127] : '麒', # 3410 [0x734a] '黎', # 3411 [0x7355] '齟', # 3412 [0x7372] '齬', # 3413 [0x7377] ]) JISコード ⇒ ID self.index = np.array([ 0, # [0x0000] 0, # [0x0001] 0, # [0x0002] : 0, # [0x2121] 1, # [0x2122] 2, # [0x2123] 3, # [0x2124] : 0, # [0x7f7e] 0, # [0x7f7f] ])
実装ポイント(2) ポイント2: 識別結果を分かり易く [コード] test_res = res.Accuracy(CANDIDATE_MAX) for i in
range(num2): label2 = np.zeros((1,JP_CATEGORY_SIZE)) label2[0][jp.getIdx(code[i])] = 1 cand = sess.run(y_conv, feed_dict={x: dat2[[i]], y_: label2, keep_prob: 1.0}) test_res.setResult(i, cand, code[i]) test_res.calcAccuracy(num2)
実装ポイント(2) def _setResult(self, no, res, label): jp = mj.Japanese() correct
= jp.getCode(label) print('--- No. %5d %s ---' % ((no+1), correct)) for i in range(self.order): idx = np.argsort(res)[0][::-1][i] code = jp.getCode2(idx) if code == correct: self.rank[i] += 1 print('* %d位 : %s (%f)' % ((i+1), code, np.sort(res)[0][::-1][i])) else: print(' %d位 : %s (%f)' % ((i+1), code, np.sort(res)[0][::-1][i])) --- No. 29487 腕 --- * 1位 : 腕 (0.999989) 2位 : 脇 (0.000008) 3位 : 腰 (0.000001) 4位 : 肺 (0.000001) 5位 : 胸 (0.000000) --- No. 29488 腕 --- 1位 : 脇 (0.923074) * 2位 : 腕 (0.076144) 3位 : 閥 (0.000144) 4位 : 腺 (0.000126) 5位 : 畷 (0.000102)
最後に • 特徴量やモデル構造も大事だが, やはり最後は学習データの 量が効く. • やはり, GPUマシンはほしい!! 詳しくは, 「TensorFlow
文字認識」で検索.