SlideShare a Scribd company logo
有限会社   来栖川電算 山口陽平
オープンソースカンファレンス名古屋2012
あじぇんだ
         
 自己紹介
 はじめに
 紹介するOSS
 設計
 実装
 ???
 まとめ
 参考文献
自己紹介
   
  山口陽平
有限会社来栖川電算
山口陽平
               
 プログラミング言語・型理論の研究者
  世界を美しく記述することを夢見る33歳
  名古屋工業大学大学院出身
  未踏ソフトウェア経験
 人を驚かせるのが好き
    Nativeコードより速いJavaコード
    1日でHaskellを作る
    ハードリアルタイムJavaVM
    1000台越え構成のペタバイト級分散DB
    PC上で秒間1000万クエリ処理できるKVS
                              ※あくまでもイメージです。
                              実物に髪の毛はありません。
有限会社来栖川電算
           
 概要
  名古屋工業大学発ベンチャー(2003年)
 目的
  ソフトウェアの品質・生産性向上
 スタッフ
  役員3人・正社員7人・アルバイト9人
  データ作成4人・家政婦2人
  IPA未踏ソフトウェア経験者多数
 社風
  職人・挑戦・自由
                          イオン千種・名大病院・名工大の間
  昼食・夕食・飲み会は無料
はじめに
  
 何を作るの?
 準備するもの
 取り組む姿勢
何を作るの?
        
 スマホで撮影した写真から単語を抽出するアプリ
準備するもの
              
 スマホ                       開発環境
  Android 2.3                サーバと同じソフト
 サーバ                         android-sdk_r18
    Scientific Linux 6.2     Eclipse Indigo JavaEE IDE
    Java SE 7                 for Web Developers.
                                  CDT
    Apache Tomcat 7.0
                                  ADT
    OpenCV-2.2.0
    O2-tools-2.00       ここを紹介するよ!
    nhocr-0.20
取り組む姿勢
           
 考慮すること
  動くこと
  分かりやすさ
 考慮しないこと
    認識精度
    安全性
    信頼性
    可用性
    拡張性
紹介するOSS
       
     OpenCV
  NHocr & O2-tools
OpenCV
                  
 元はインテル製の画像処理ライブラリ
  APIが単純で割と使いやすい
      様々な画像(※GIF除く)の読み書きに便利

  様々な分野のアルゴリズムを網羅
      画像処理・特徴抽出とディスクリプタ抽出
      クラスタリング・多次元空間探索・オブジェクト検出
      ビデオ解析・カメラキャリブレーション・姿勢推定
      ステレオ・機械学習

 サイト
  【公式】http://opencv.willowgarage.com/
  【日本コミュニティ】http://opencv.jp/
NHocr & O2-tools
             
 日本語OCR・画像処理ライブラリ
  一文字認識の認識精度はわりとよい
      一応、行認識もできる

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




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

 サイト
  【後藤研究室】http://www.imglab.org/
 注意
  一部をコメントアウトしないとビルドできない場合が
設計
  
概要(もう一度)
 スマホアプリ
文字認識サービス
文字認識コマンド
概要
          
 スマホで撮影した写真から単語を抽出するアプリ
スマホアプリ
        
 マッシュアップでシンプルに!
  主な作り込みは単語抽出(言語処理)だけ
文字認識サービス
       
 中継するだけ!
  主な作り込みは文字認識コマンドの中
文字認識コマンド
        
 OepnCV・NHocrのAPIはシンプルで使いやすい!
  難しいのは文字領域抽出だけ
実装
 
 画像読込
  二値化
文字領域抽出
 文字認識
 XML出力
 言語処理
画像読込
                           
 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;
     }
二値化
                                  
 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;
 }
文字領域抽出
        
 ヒストグラムで文字がある場所を見つけるぞ!
  ぐるぐるループしながら四則演算するだけ
  行の上下に余分なものが写っているとうまくいかない
文字認識
                            #include <opencv/cv.h>

 NHocrなら文字認識が簡単!            #include <opencv/highgui.h>
                             #include <siplib.h>

  ①辞書の選択・初期化など              #include <nhocr.h>
                             int main() {
                               NHrec tNHrec;
    ascii+(英数字)               tNHrec.setlibdir(
    jpn(日本語)                   (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);
    OpenCV ⇒ NHocr            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;
                             }
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>
言語処理
          
 様々な言語処理
  距離の和が最も小さいパスを選ぶ。
  文字種を限定する。
   記号・数字・英字(大・小)・かな・カナ・漢字
  辞書に含まれている単語だけを選ぶ。
  文法にあうパスを選ぶ。
   正規表現・文脈自由・自然言語
簡単に使えるけど
それ以外が難しい
            
   AdaptiveThresholdもあんまり使えない
ヒストグラム使った文字領域抽出が話にならない
 1位だけを採用する言語処理でも話にならない
まだまだ利用申請できるよ!どんどんしてね!


         recognize.jp
             
 WebAPIで画像をPOSTするだけ
  難しいことは全部サーバでやってくれる!
タンゴチュウが
(前より)賢くなった!
               
4月のrecognize.jpのアップデートで目に見えて良くなったぞ!


   1年前とくらべて・・・   4倍      の賢さだ!
情
                     文   景
                         画
                    字   像
                         か
                     認   ら
                     識   の

                     サ
                     ー
http://tangochu.jp
                     ビ
説明前に宣伝させて!
                     ス
タンゴチュウとは
               
 写真(情景画像)から単語を抽出
  例えば メニュー チラシ お菓子のパッケージ
  レシート 名刺 看板 …
情景画像の文字認識とは

    
情景画像の文字認識とは

    
情景画像の文字認識とは

              
 従来のOCRとは戦場が違う
  悪環境下での文字認識
   手書き・様々な書体・かすれ・点描・きつい
    パース・統一性のない並び・逆光・陰・影・グ
    ラデーション・モアレなど




    目指すはこんなかっこいい世界!
タンゴチュウ
            for Twitter


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


        @tcfox
タンゴチュウ
           for Twitter


             
 手軽に文字認識を体験できる!
タンゴチュウ
           for Evernote


             
 写真の検索・整理に役立つ!
0.0
           1.0
           2.0
           3.0
           4.0
           5.0
           6.0
           7.0
2011年06月

2011年07月

2011年08月

2011年09月

2011年10月
                                        4倍の賢さ・6倍の速さ
                                   着実に進化している!




2011年11月

2011年12月
                                               



2012年01月
              情景画像文字認識ではトップクラス




2012年02月
                                                       性能推移




2012年03月

2012年04月
カスタマイズOK
                
  棚卸し・検査・電子辞書などに
     用途を限定すると非常に高精度
        既に稼働していて、驚くほど高性能
     出版系・測量系からも引き合いがきているぞ!




Android端末
への組み込み
もやってるよ
とにかくアクセス!

       



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



    http://tangochu.jp
まとめ
         
 オープンソースを活用すれば
 とりあえず動くものは作れる
    性能がでるかは腕次第
 recognize.jpを使えば割とよい

今回のスマホアプリのソースコードは
ダウンロードできるようにしておくよ!
参考文献
  
 リンクとか
参考文献①
                   
 Scientific Linux
    http://www.scientificlinux.org/
 Jave SE
    http://www.oracle.com/technetwork/java/
 Apache Tomcat
    http://tomcat.apache.org/
 Android SDK & ADT (Eclipse Plugin)
    http://developer.android.com/index.html
 Eclipse & CDT
    http://www.eclipse.org/
参考文献②
                 
 OpenCV
   http://opencv.willowgarage.com/
   【日本コミュニティ】http://opencv.jp/
 O2-tool
   http://www.imglab.org/p/O2/
 NHocr
   http://code.google.com/p/nhocr/
参考文献③
                 
 recognize.jp(情景画像文字認識API)
   http://recognize.jp/
 撮って文字入力(文字認識IME)
   http://www.nttdocomo.co.jp/smt/service/trial/trial_app/to
    tte_moji/index.html
 タンゴチュウ(情景画像文字認識サービス)
   http://tangochu.jp/
 来栖川電算
   http://kurusugawa.jp/
ご清聴ありがとうございました

      




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

More Related Content

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

  • 1. 有限会社 来栖川電算 山口陽平 オープンソースカンファレンス名古屋2012
  • 2. あじぇんだ   自己紹介  はじめに  紹介するOSS  設計  実装  ???  まとめ  参考文献
  • 3. 自己紹介  山口陽平 有限会社来栖川電算
  • 4. 山口陽平   プログラミング言語・型理論の研究者  世界を美しく記述することを夢見る33歳  名古屋工業大学大学院出身  未踏ソフトウェア経験  人を驚かせるのが好き  Nativeコードより速いJavaコード  1日でHaskellを作る  ハードリアルタイムJavaVM  1000台越え構成のペタバイト級分散DB  PC上で秒間1000万クエリ処理できるKVS ※あくまでもイメージです。 実物に髪の毛はありません。
  • 5. 有限会社来栖川電算   概要  名古屋工業大学発ベンチャー(2003年)  目的  ソフトウェアの品質・生産性向上  スタッフ  役員3人・正社員7人・アルバイト9人  データ作成4人・家政婦2人  IPA未踏ソフトウェア経験者多数  社風  職人・挑戦・自由 イオン千種・名大病院・名工大の間  昼食・夕食・飲み会は無料
  • 6. はじめに  何を作るの? 準備するもの 取り組む姿勢
  • 7. 何を作るの?   スマホで撮影した写真から単語を抽出するアプリ
  • 8. 準備するもの   スマホ  開発環境  Android 2.3  サーバと同じソフト  サーバ  android-sdk_r18  Scientific Linux 6.2  Eclipse Indigo JavaEE IDE  Java SE 7 for Web Developers.  CDT  Apache Tomcat 7.0  ADT  OpenCV-2.2.0  O2-tools-2.00 ここを紹介するよ!  nhocr-0.20
  • 9. 取り組む姿勢   考慮すること  動くこと  分かりやすさ  考慮しないこと  認識精度  安全性  信頼性  可用性  拡張性
  • 10. 紹介するOSS  OpenCV NHocr & O2-tools
  • 11. OpenCV   元はインテル製の画像処理ライブラリ  APIが単純で割と使いやすい  様々な画像(※GIF除く)の読み書きに便利  様々な分野のアルゴリズムを網羅  画像処理・特徴抽出とディスクリプタ抽出  クラスタリング・多次元空間探索・オブジェクト検出  ビデオ解析・カメラキャリブレーション・姿勢推定  ステレオ・機械学習  サイト  【公式】http://opencv.willowgarage.com/  【日本コミュニティ】http://opencv.jp/
  • 12. NHocr & O2-tools   日本語OCR・画像処理ライブラリ  一文字認識の認識精度はわりとよい  一応、行認識もできる  コマンドラインツールがある  画像ファイルの文字認識・フォントからの辞書作成 あ  本格的に使うにはわりと改良がいる  コード量が少ないので難しくはない  サイト  【後藤研究室】http://www.imglab.org/  注意  一部をコメントアウトしないとビルドできない場合が
  • 13. 設計  概要(もう一度) スマホアプリ 文字認識サービス 文字認識コマンド
  • 14. 概要   スマホで撮影した写真から単語を抽出するアプリ
  • 15. スマホアプリ   マッシュアップでシンプルに!  主な作り込みは単語抽出(言語処理)だけ
  • 16. 文字認識サービス   中継するだけ!  主な作り込みは文字認識コマンドの中
  • 17. 文字認識コマンド   OepnCV・NHocrのAPIはシンプルで使いやすい!  難しいのは文字領域抽出だけ
  • 18. 実装  画像読込 二値化 文字領域抽出 文字認識 XML出力 言語処理
  • 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; }
  • 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; }
  • 21. 文字領域抽出   ヒストグラムで文字がある場所を見つけるぞ!  ぐるぐるループしながら四則演算するだけ  行の上下に余分なものが写っているとうまくいかない
  • 22. 文字認識  #include <opencv/cv.h>  NHocrなら文字認識が簡単! #include <opencv/highgui.h> #include <siplib.h>  ①辞書の選択・初期化など #include <nhocr.h> int main() { NHrec tNHrec;  ascii+(英数字) tNHrec.setlibdir(  jpn(日本語) (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);  OpenCV ⇒ NHocr 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; }
  • 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>
  • 24. 言語処理   様々な言語処理  距離の和が最も小さいパスを選ぶ。  文字種を限定する。  記号・数字・英字(大・小)・かな・カナ・漢字  辞書に含まれている単語だけを選ぶ。  文法にあうパスを選ぶ。  正規表現・文脈自由・自然言語
  • 25. 簡単に使えるけど それ以外が難しい  AdaptiveThresholdもあんまり使えない ヒストグラム使った文字領域抽出が話にならない 1位だけを採用する言語処理でも話にならない
  • 26. まだまだ利用申請できるよ!どんどんしてね! recognize.jp   WebAPIで画像をPOSTするだけ  難しいことは全部サーバでやってくれる!
  • 27. タンゴチュウが (前より)賢くなった!  4月のrecognize.jpのアップデートで目に見えて良くなったぞ! 1年前とくらべて・・・ 4倍 の賢さだ!
  • 28. 文 景 画  字 像 か 認 ら 識 の サ ー http://tangochu.jp ビ 説明前に宣伝させて! ス
  • 29. タンゴチュウとは   写真(情景画像)から単語を抽出  例えば メニュー チラシ お菓子のパッケージ レシート 名刺 看板 …
  • 32. 情景画像の文字認識とは   従来のOCRとは戦場が違う  悪環境下での文字認識  手書き・様々な書体・かすれ・点描・きつい パース・統一性のない並び・逆光・陰・影・グ ラデーション・モアレなど 目指すはこんなかっこいい世界!
  • 33. タンゴチュウ for Twitter   手軽に文字認識を体験できる! @tcfox
  • 34. タンゴチュウ for Twitter   手軽に文字認識を体験できる!
  • 35. タンゴチュウ for Evernote   写真の検索・整理に役立つ!
  • 36. 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 2011年06月 2011年07月 2011年08月 2011年09月 2011年10月  4倍の賢さ・6倍の速さ  着実に進化している! 2011年11月 2011年12月  2012年01月  情景画像文字認識ではトップクラス 2012年02月 性能推移 2012年03月 2012年04月
  • 37. カスタマイズOK   棚卸し・検査・電子辞書などに  用途を限定すると非常に高精度  既に稼働していて、驚くほど高性能  出版系・測量系からも引き合いがきているぞ! Android端末 への組み込み もやってるよ
  • 38. とにかくアクセス!  萌えキャラたちも待ってるぞ!  http://tangochu.jp
  • 39. まとめ  オープンソースを活用すれば とりあえず動くものは作れる 性能がでるかは腕次第 recognize.jpを使えば割とよい 今回のスマホアプリのソースコードは ダウンロードできるようにしておくよ!
  • 40. 参考文献  リンクとか
  • 41. 参考文献①   Scientific Linux  http://www.scientificlinux.org/  Jave SE  http://www.oracle.com/technetwork/java/  Apache Tomcat  http://tomcat.apache.org/  Android SDK & ADT (Eclipse Plugin)  http://developer.android.com/index.html  Eclipse & CDT  http://www.eclipse.org/
  • 42. 参考文献②   OpenCV  http://opencv.willowgarage.com/  【日本コミュニティ】http://opencv.jp/  O2-tool  http://www.imglab.org/p/O2/  NHocr  http://code.google.com/p/nhocr/
  • 43. 参考文献③   recognize.jp(情景画像文字認識API)  http://recognize.jp/  撮って文字入力(文字認識IME)  http://www.nttdocomo.co.jp/smt/service/trial/trial_app/to tte_moji/index.html  タンゴチュウ(情景画像文字認識サービス)  http://tangochu.jp/  来栖川電算  http://kurusugawa.jp/
  • 44. ご清聴ありがとうございました  どんどん賢くするので応援してね