プロジェクトの新しいサブプロジェクトと人材募集

6 views
Skip to first unread message

Takashi Okumura

unread,
Sep 1, 2020, 9:58:20 PM9/1/20
to faxocr
お世話となっております。

現在、とあるグループがFaxOCRに新規機能の追加を試みてくださって
おりまして、なかなか楽しい数字になってきたので、現状のご紹介と
協力者の募集をさせて頂きます。宜しければ、ご一読を頂けますと
幸いです。

■ 手書き漢字認識に向けた検証

FaxOCRのOCRエンジンであるkocrに、数字、アルファベットの認識
機能が実装されつつありまして、その延長で、手書きの漢字認識に取
り組んで下さいました。手書き文字データは、産総研の公開している
ETLデータを利用しており、まずは、pythonにてプロトタイピングを
試みて下さっています。

データ量としては、全画像数607,200を、学習に546,248、テストに
60,952と分けたものを利用し、クラス数(文字種)は3,036とのことで
した。それで、認識率としては、現状、95.3~97.1%出るようでした。
ご参考に、評価時に利用したイメージのプレビュー画面(OKとNG)を
添付させて頂きます。ファイル名の先頭文字が、認識した結果となり
ます。読めない文字は、それぞれに機械の言い分もわかる誤読がほと
んどのようです。実験環境の詳細は文末に引用させて頂きました。

■ 今後の作業・KOCRへの組み込み作業依頼

今後、学習データを増やして、プロトタイプの精度向上に取り
組んでくださいます。ただ、その成果をKOCRに取り入れていく
うえで、いくつか課題が生じています。

まず、現在のKOCRに実装されているCNNでは、日本語文字の
学習が収束しないようで、我々のC++コードには実装されてい
ないBatchNormalizationレイヤーを実装する必要があるようです。

また、そもそも数字の認識に特化して設計されていたkocrでは、
マルチバイトのクラス名を扱うことができず、関係するコードを、
既存の文字種への影響を避けつつマルチバイト化する修正が必要
です。

さらに、それらの環境変更に合わせて、KOCRの学習用のフレー
ムワークを微調整する必要があります。

ということで、少しだけ手間があるのですけれども、スクラッチ
からの実装ではないことに加えて、コードが大きいわけでもない
ため、取り掛かってしまえばそこまで大掛かりの作業にはならな
いのではないかと期待しています。

どなたか、ご興味をお持ちいただける方がおられれば、ご一報
頂ければ大変助かります。なお、薄謝のご用意もできるかと
思いますので、ご検討頂ければ幸いです。

■ サイトの確認依頼

最後に、プロジェクトのサイトについてです。
今まで、Google siteを利用して公開をしていたのですけれども、
なんだかGoogle siteに仕様変更がありまして、「新Google site」
へと移行する必要が生じました。

https://sites.google.com/site/faxocr2010/

それで、一通りの移行作業をして頂いたのですけれども、全体を
チェックして、場合によっては修正や追記をする作業があります。
そうした状況でして、もし宜しければ、どなたか、上記サイトを
チェックし、場合によっては必要な修正をお願いできませんで
しょうか。修正を要する点のリスト化だけでも結構です。

以上、どうか宜しくお願い申し上げます。


奥村 貴史@北海道

====学習内容詳細====
<データセット>
ETL9Bに含まれる日本語(ひらがな、漢字)画像をを9対1の割合で、学習用、テスト用にランダムで分割し、
学習用画像をtrain_cnn.pyを利用して学習モデルを生成、テスト用画像を利用してモデルを評価した。
・学習用データ数 :546,248
・テスト用データ数: 60,952
なお、train_cnn.pyで学習するため、事前に、画像ファイル名の先頭に、クラス名を付与した。

<ネットワークの変更>
現行のネットワークでは、学習が収束しなかったため、
学習時のネットワークを次のものに変更して学習しました。

---- train_cnn.py ----
def build_model(nb_dim, nb_output):
model = Sequential()
IMAGE_SIZE=48
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(1,
nb_dim, nb_dim)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,(3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
num_classes=3036
model.add(Dense(num_classes,activation='softmax'))
return model
Screenshot from 2020-08-26 09-53-09-OK.png
Screenshot from 2020-08-25 17-14-17-NG.png
Reply all
Reply to author
Forward
0 new messages