オープンソースで作るスマホ文字認識アプリ

44
有限会社 来栖川電算 山口陽平 オープンソースカンファレンス名古屋2012

description

OpenCV・NHocrを使った文字認識アプリの作り方を解説します。

Transcript of オープンソースで作るスマホ文字認識アプリ

Page 1: オープンソースで作るスマホ文字認識アプリ

有限会社 来栖川電算 山口陽平 オープンソースカンファレンス名古屋2012

Page 2: オープンソースで作るスマホ文字認識アプリ

自己紹介

はじめに

紹介するOSS

設計

実装

???

まとめ

参考文献

あじぇんだ

Page 3: オープンソースで作るスマホ文字認識アプリ

自己紹介

山口陽平

有限会社来栖川電算

Page 4: オープンソースで作るスマホ文字認識アプリ

プログラミング言語・型理論の研究者

世界を美しく記述することを夢見る33歳

名古屋工業大学大学院出身

未踏ソフトウェア経験

人を驚かせるのが好き

Nativeコードより速いJavaコード

1日でHaskellを作る

ハードリアルタイムJavaVM

1000台越え構成のペタバイト級分散DB

PC上で秒間1000万クエリ処理できるKVS

山 口 陽 平

※あくまでもイメージです。 実物に髪の毛はありません。

Page 5: オープンソースで作るスマホ文字認識アプリ

概要 名古屋工業大学発ベンチャー(2003年)

目的 ソフトウェアの品質・生産性向上

スタッフ 役員3人・正社員7人・アルバイト9人

データ作成4人・家政婦2人

IPA未踏ソフトウェア経験者多数

社風 職人・挑戦・自由

昼食・夕食・飲み会は無料

有限会社来栖川電算

イオン千種・名大病院・名工大の間

Page 6: オープンソースで作るスマホ文字認識アプリ

はじめに

何を作るの?

準備するもの

取り組む姿勢

Page 7: オープンソースで作るスマホ文字認識アプリ

スマホで撮影した写真から単語を抽出するアプリ

何を作るの?

Page 8: オープンソースで作るスマホ文字認識アプリ

準備するもの

スマホ

Android 2.3

サーバ

Scientific Linux 6.2

Java SE 7

Apache Tomcat 7.0

OpenCV-2.2.0

O2-tools-2.00

nhocr-0.20

開発環境

サーバと同じソフト

android-sdk_r18

Eclipse Indigo JavaEE IDE for Web Developers.

CDT

ADT

ここを紹介するよ!

Page 9: オープンソースで作るスマホ文字認識アプリ

考慮すること

動くこと

分かりやすさ

考慮しないこと

認識精度

安全性

信頼性

可用性

拡張性

取り組む姿勢

Page 10: オープンソースで作るスマホ文字認識アプリ

紹介するOSS

OpenCV

NHocr & O2-tools

Page 11: オープンソースで作るスマホ文字認識アプリ

元はインテル製の画像処理ライブラリ

APIが単純で割と使いやすい 様々な画像(※GIF除く)の読み書きに便利

様々な分野のアルゴリズムを網羅 画像処理・特徴抽出とディスクリプタ抽出

クラスタリング・多次元空間探索・オブジェクト検出

ビデオ解析・カメラキャリブレーション・姿勢推定

ステレオ・機械学習

サイト

【公式】http://opencv.willowgarage.com/

【日本コミュニティ】http://opencv.jp/

OpenCV

Page 12: オープンソースで作るスマホ文字認識アプリ

日本語OCR・画像処理ライブラリ

一文字認識の認識精度はわりとよい 一応、行認識もできる

コマンドラインツールがある 画像ファイルの文字認識・フォントからの辞書作成

本格的に使うにはわりと改良がいる コード量が少ないので難しくはない

サイト

【後藤研究室】http://www.imglab.org/

注意

一部をコメントアウトしないとビルドできない場合が

NHocr & O2-tools

Page 13: オープンソースで作るスマホ文字認識アプリ

設計

概要(もう一度)

スマホアプリ

文字認識サービス

文字認識コマンド

Page 14: オープンソースで作るスマホ文字認識アプリ

スマホで撮影した写真から単語を抽出するアプリ

概要

Page 15: オープンソースで作るスマホ文字認識アプリ

マッシュアップでシンプルに!

主な作り込みは単語抽出(言語処理)だけ

スマホアプリ

Page 16: オープンソースで作るスマホ文字認識アプリ

中継するだけ!

主な作り込みは文字認識コマンドの中

文字認識サービス

Page 17: オープンソースで作るスマホ文字認識アプリ

OepnCV・NHocrのAPIはシンプルで使いやすい!

難しいのは文字領域抽出だけ

文字認識コマンド

Page 18: オープンソースで作るスマホ文字認識アプリ

実装

画像読込

二値化

文字領域抽出

文字認識

XML出力

言語処理

Page 19: オープンソースで作るスマホ文字認識アプリ

OpenCVなら画像の読み書きが簡単!

BMP DIB JPEG JPG JPE PNG PBM PGM PPM SR RAS TIFF TIF

画像読込

#include <opencv/cv.h> #include <opencv/highgui.h> int main() { IplImage* tImage = cvLoadImage("input/club_adriana.jpg", CV_LOAD_IMAGE_COLOR); cvNot(tImage, tImage); cvSaveImage("output/not_club_adriana.png", tImage); cvReleaseImage(&tImage); return 0; }

Page 20: オープンソースで作るスマホ文字認識アプリ

OpenCVには基本的な二値化アルゴリズムがある!

cvThreshold:与えた閾値で二値化する。(大津の方法も)

cvAdaptiveThreshold:近傍の平均から閾値を決める。

二値化

#include <opencv/cv.h> #include <opencv/highgui.h> int main() { IplImage* tImage = cvLoadImage( "input/club_adriana.jpg", CV_LOAD_IMAGE_GRAYSCALE); IplImage* tBinarizedImage = cvCreateImage( cvGetSize(tImage), tImage->depth, tImage->nChannels); cvAdaptiveThreshold(tImage, tBinarizedImage, 256, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 19); cvSaveImage("output/binarized_club_adriana.png", tBinarizedImage); cvReleaseImage(&tBinarizedImage); cvReleaseImage(&tImage); return 0; }

ライトが当たっているとなかなかうまくいかない

Page 21: オープンソースで作るスマホ文字認識アプリ

ヒストグラムで文字がある場所を見つけるぞ!

ぐるぐるループしながら四則演算するだけ

行の上下に余分なものが写っているとうまくいかない

文字領域抽出

Page 22: オープンソースで作るスマホ文字認識アプリ

NHocrなら文字認識が簡単! ①辞書の選択・初期化など ascii+(英数字)

jpn(日本語)

ユーザ辞書

②画像形式の変換

OpenCV ⇒ NHocr

③文字認識 入力 文字の場所

出力 {文字:距離, ..., 文字:距離}

文字認識

#include <opencv/cv.h> #include <opencv/highgui.h> #include <siplib.h> #include <nhocr.h> int main() { NHrec tNHrec; tNHrec.setlibdir( (char*) "/usr/local/moji/nhocr-0.20/share/"); tNHrec.setdiccodes((char*) "ascii+"); tNHrec.open(); IplImage* tImage = cvLoadImage("input/Ao.png", CV_LOAD_IMAGE_GRAYSCALE); SIPImage* tSIPImage = createSIPImage(tImage); int tCount = 10; RecResultItem tCondidates[tCount]; tNHrec.rec_character(tSIPImage, 0, 0, tImage->width, tImage->height, tCondidates); for (int tIndex = 0; tIndex < tCount; tIndex++) printf("%c:%f¥n", (char)tCondidates[tIndex].id, tCondidates[tIndex].dist); sip_DestroyImage(tSIPImage); cvReleaseImage(&tImage); tNHrec.close(); return 0; }

Page 23: オープンソースで作るスマホ文字認識アプリ

各文字領域は複数の候補を持つ

各候補は文字と距離を持つ

XML出力

<result> <candidates> <candidate><character>H</character><distance>1</distance></candidates> <candidate><character>4</character><distance>2</distance></candidates> </candidates> <candidates> <candidate><character>O</character><distance>1</distance></candidates> <candidate><character>0</character><distance>2</distance></candidates> </candidates> <candidates> <candidate><character>M</character><distance>1</distance></candidates> <candidate><character>m</character><distance>2</distance></candidates> </candidates> <candidates> <candidate><character>U</character><distance>1</distance></candidates> <candidate><character>u</character><distance>2</distance></candidates> </candidates> </result>

Page 24: オープンソースで作るスマホ文字認識アプリ

様々な言語処理

距離の和が最も小さいパスを選ぶ。

文字種を限定する。

記号・数字・英字(大・小)・かな・カナ・漢字

辞書に含まれている単語だけを選ぶ。

文法にあうパスを選ぶ。

正規表現・文脈自由・自然言語

言語処理

Page 25: オープンソースで作るスマホ文字認識アプリ

簡単に使えるけど それ以外が難しい

AdaptiveThresholdもあんまり使えない

ヒストグラム使った文字領域抽出が話にならない

1位だけを採用する言語処理でも話にならない

Page 26: オープンソースで作るスマホ文字認識アプリ

WebAPIで画像をPOSTするだけ

難しいことは全部サーバでやってくれる!

recognize.jp まだまだ利用申請できるよ!どんどんしてね!

Page 27: オープンソースで作るスマホ文字認識アプリ

タンゴチュウが (前より)賢くなった!

4月のrecognize.jpのアップデートで目に見えて良くなったぞ!

1年前とくらべて・・・4倍の賢さだ!

Page 28: オープンソースで作るスマホ文字認識アプリ

情景画像からの

文字認識サービス

http://tangochu.jp

説明前に宣伝させて!

Page 29: オープンソースで作るスマホ文字認識アプリ

写真(情景画像)から単語を抽出

例えば メニュー チラシ お菓子のパッケージ レシート 名刺 看板 …

タンゴチュウとは

Page 30: オープンソースで作るスマホ文字認識アプリ

情景画像の文字認識とは

Page 31: オープンソースで作るスマホ文字認識アプリ

情景画像の文字認識とは

Page 32: オープンソースで作るスマホ文字認識アプリ

従来のOCRとは戦場が違う

悪環境下での文字認識

手書き・様々な書体・かすれ・点描・きついパース・統一性のない並び・逆光・陰・影・グラデーション・モアレなど

情景画像の文字認識とは

目指すはこんなかっこいい世界!

Page 33: オープンソースで作るスマホ文字認識アプリ

手軽に文字認識を体験できる!

タンゴチュウ for Twitter

@tcfox

Page 34: オープンソースで作るスマホ文字認識アプリ

手軽に文字認識を体験できる!

タンゴチュウ for Twitter

Page 35: オープンソースで作るスマホ文字認識アプリ

写真の検索・整理に役立つ!

タンゴチュウ for Evernote

Page 36: オープンソースで作るスマホ文字認識アプリ

4倍の賢さ・6倍の速さ

着実に進化している!

情景画像文字認識ではトップクラス

性能推移

0.0

1.0

2.0

3.0

4.0

5.0

6.0

7.0

20

11年

06月

20

11年

07月

20

11年

08月

20

11年

09月

20

11年

10月

20

11年

11月

20

11年

12月

20

12年

01月

20

12年

02月

20

12年

03月

20

12年

04月

Page 37: オープンソースで作るスマホ文字認識アプリ

棚卸し・検査・電子辞書などに

用途を限定すると非常に高精度

既に稼働していて、驚くほど高性能

出版系・測量系からも引き合いがきているぞ!

カスタマイズOK

Android端末 への組み込み もやってるよ

Page 38: オープンソースで作るスマホ文字認識アプリ

とにかくアクセス!

http://tangochu.jp

萌えキャラたちも待ってるぞ!

Page 39: オープンソースで作るスマホ文字認識アプリ

まとめ

オープンソースを活用すれば

とりあえず動くものは作れる

性能がでるかは腕次第

recognize.jpを使えば割とよい

今回のスマホアプリのソースコードは ダウンロードできるようにしておくよ!

Page 40: オープンソースで作るスマホ文字認識アプリ

参考文献

リンクとか

Page 42: オープンソースで作るスマホ文字認識アプリ

OpenCV

http://opencv.willowgarage.com/

【日本コミュニティ】http://opencv.jp/

O2-tool

http://www.imglab.org/p/O2/

NHocr

http://code.google.com/p/nhocr/

参考文献②

Page 43: オープンソースで作るスマホ文字認識アプリ

recognize.jp(情景画像文字認識API)

http://recognize.jp/

撮って文字入力(文字認識IME)

http://www.nttdocomo.co.jp/smt/service/trial/trial_app/totte_moji/index.html

タンゴチュウ(情景画像文字認識サービス)

http://tangochu.jp/

来栖川電算

http://kurusugawa.jp/

参考文献③

Page 44: オープンソースで作るスマホ文字認識アプリ

どんどん賢くするので応援してね

ご清聴ありがとうございました