岡本順治研究室

学習院大学

cosmos
HOMERESEARCHEDUCATIONLinuxLaTeXet cetraPDGHOME(Deutsch)

LinuxでもOCR を使うぞ![03/20/2006]

  1. イントロ

    OCRとは,Optical Character Recognition の略.「光学文字認識」と訳されている.スキャナで読み取るデータは,基本的に画像イメージなので, たとえオプション機能でPDF に変換してくれるソフト付きのスキャナであっても,データとしては, 画像イメージのPDF化でしかないことがある. 最近では,このようなソフトウエアにOCR 機能を持たせているものもあり, 画像イメージから文字認識をして, 文字コードに変換してくれる.こうすれば,文字から成る文書として, 全文検索の対象になる.

    元来,文字認識は,パターン認識(Pattern Recognition)の一種で, コンピュータ処理としては,かなり高度なものに属する. 以前は,Omnipageとか, Recognita のような優秀だが非常に高価なソフトウエアと高分解能スキャナが前提とされていた. しかし,近年では,Windowsソフトウエアで, 日本語と英語に対応したOCRがお手頃な価格で出回っているし, スキャナの価格は劇的に下がり,性能も十二分に高くなった.

    だだし,日本語と英語以外の言語に対応した,いわゆる多言語対応製品となると, それほど選択肢は多くない.2006年3月現在で, 市販されているものではOmniPage Pro 15(62,800円), CROSS OCR JX(15,642円)は,9カ国語に対応する. Presto! OCR Proは,欧米15カ国語対応で 14,800円だったが,今はすでに販売を終了している.

    しかし,Linux上で動くOCR ソフトというのはあまり聞いたことがない.そこで,今回は,2006年3月現在での Linux上のOCRソフト探しと, その結果をまとめてみた. 日本語対応のOCRソフトは, 発見できなかったことをまず最初に明記しておく.

  2. まずはスキャナ選び

    日本で購入できるLinux 対応のスキャナと言えば, エプソンとHPということになる.残念ながら, キャノン製品は使用できないと考えた方がよい.若干古い製品で, Saneのドライバで使えるものがあるようだが, こちらでは未確認だ.

    今回使用したのは,エプソンのGT-F570http://colorio.jp/参照). 3200dpiの,実売価格 19000円前後のもの.

  3. VineLinux3.1CRでスキャナを使うには?

    エプソンのGT-F570を購入しても,Linux 用のドライバが付属するわけではない.エプソンアヴァシス株式会社の http://www.avasys.jp/linux/から, 該当するスキャナを選び,そのドライバとマニュアルをダウンロードして使うことになる.

    GT-F570をチェックして,たどりついたドライバは, (1) iscan-2.0.0-0.i386.rpmと, (2) iscan-plugin-gt-f520-1.0.0-1.i386.rpmの2つ. そして,マニュアルである userg_revG_j.pdfをダウン ロードした.

    ドライバは,RPM パッケージを選択したが,tarballも ある.ここでは,簡単にRPM パッケージを選択してインストールした.

    # rpm -ivh iscan-2.0.0-0.i386.rpm iscan-plugin-gt-f520-1.0.0-1.i386.rpm

    参考までに,RPM Pacakgeの情報を見てみたが, 将来的には,SEIKO EPSON以外のスキャナにも対応する つもりがあるようだ.なお,Licenseのところに, GPLと並んで EAPLと記してあるのは, EPSON AVASYS PUBLIC LICENSEのことで, /usr/share/doc/iscan-2.0.0/EAPL.ja.txt にある文書に説明がある.著作権は放棄しないが, 「プログラムは自由に複製し、頒布することができます。」とある.

    [ora@hogehoge ora]$ rpm -qi iscan
    Name        : iscan                        Relocations: (not relocateable)
    Version     : 2.0.0                             Vendor: EPSON AVASYS Corporation
    Release     : 0                             Build Date: 2006年01月25日 10時04分25秒
    Install date: 2006年03月2日 23時17分07秒      Build Host: build.epkowa.co.jp
    Group       : Applications/Multimedia       Source RPM: iscan-2.0.0-0.src.rpm
    Size        : 931373                           License: GPL (with exception clauses) and EAPL
    Packager    : EPSON AVASYS Corporation <○×○×@avasys.jp>
    URL         : http://www.avasys.jp/linux/index.html
    Summary     : simple, easy to use scanner utility for EPSON scanners
    Description :
    Image Scan! is a graphical scanner utility for people that do not need
    all the bells and whistles provided by several of the other utilities
    out there (xsane, QuiteInsane, Kooka).
    
    At the moment it only supports SEIKO EPSON scanners and all-in-ones.
    However, the scanner driver it provides can be used by any other SANE
    standard compliant scanner utility.
    
    Note that several scanners require a non-free plugin before they can
    be used with this software.
     

    ついでに,plug-inの情報も見ておく(メールアドレ スは,スパム防止のために,書き換えてある.上の例も同じ).

    [ora@hogehoge ora]$ rpm -qi iscan-plugin-gt-f520
    Name        : iscan-plugin-gt-f520         Relocations: (not relocateable)
    Version     : 1.0.0                             Vendor: EPSON AVASYS Corporation
    Release     : 1                             Build Date: 2005年11月14日 18時37分37秒
    Install date: 2006年03月2日 23時17分7秒      Build Host: build.epkowa.co.jp
    Group       : Applications/Multimedia       Source RPM: iscan-1.18.0-1.src.rpm
    Size        : 250036                           License: EAPL
    Packager    : EPSON AVASYS Corporation <○×○×@avasys.jp>
    URL         : http://www.avasys.jp/linux/index.html
    Summary     : Image Scan! plugin for the GT-F520/F570 / Perfection 3490/3590
    Description :
    This package adds support for the GT-F520, GT-F570, Perfection 3490
    and Perfection 3590 to Image Scan!
     

    さて,これでインストール終了で,後は,
    $ iscan &
    だけで起動するLinux環境の人もいるだろう(hotplug が有効な場合).Vine 3.1CRでは,残念ながらそうは いかなかった.

    Image Scan! for Linux 操作ガイド」によれば, (1) libusb 経由での利用方法,(2) スキャナモジュールでの利用方法がある. 私は,まず(1) を試し,うまくいかなかったので(2)を試し,成功した. なお,その後,思うことがあり,再び(1) を試したところ,今度は成功し, 結局,今では,libusb 経由での利用をしている.

    基本的に, 「Image Scan! for Linux 操作ガイド」 を読めば分かることだが,一応,簡単にメモしておく.
    (2) スキャナモジュールでの利用方法
    [1] /etc/sane.d/epkowa.conf の編集(2箇所)
    ○ 以下のコメントアウトされている行を生かす(# を削除)(L24)
       #usb /dev/usb/scanner0
    → usb /dev/usb/scanner0

    ○ 以下の行をコメントアウトする(# を行頭に挿入)(L18)
       usb
    → # usb

    [2] Product IDの取得
    スキャナの電源を入れて,USBで接続する.
    「ぴっ」といって認識するので,接続したスキャナ機種のIDを得るために以下の ようにすると,Product IDが分かる:

    $ cat /proc/bus/usb/devices | grep 04b8
    P: Vendor=04b8 ProdID=0122 Rev= 1.10

    ProdID=0122というのがその部分.
    [3] ルートになって,以下のようにモジュールをロード
    # /sbin/modprobe scanner vendor=0x04b8 product=0x0122

    これで,iscanが動く.具体的には:

    [ora@hogehoge ora]$ iscan &
    

    iscan! for linux, image-file
    iscan! for linux v.2.0 のイメージ

    (1) libusb 経由での利用方法
    スキャナモジュールでの利用でもよいのだが,その場合は,modprobe の行を /etc/rc.d/rc.local の最後の方に書いておかないと, 起動時に設定をしてくれずに, 使う前にかならずモジュールをロードしなければならずめんどうなことになる. VineLinux 3.1CRでは, murasakiを利用しているので,これを使えば, libusbでホットプラグができるはずだ.そこで,(2) で一旦修正した/etc/sane.d/epkowa.confを元に戻す.
    [1] /etc/sane.d/epkowa.conf の設定
    ○ /etc/sane.d/epkowa.conf のL18
     # usb
    → usb
    ○ /etc/sane.d/epkowa.conf のL24
      usb /dev/usb/scanner0
    → # usb /dev/usb/scanner0

    [2] /var/log/messages から scanner に関するメッセージを探す
    # grep "0x4b8" /var/log/messages

    localhost murasaki.usb[1338]: usb device is added
    localhost murasaki.usb[1338]: vendor:0x4b8 product:0x122 Dclass:0xff (折り返し)
         Dsubclass:0xff Dprotocol:0xff Iclass:0x0 Isubclass:0x0 Iprotocol:0x0 
    localhost murasaki.usb[1338]: The device match nothing in mapfile
    localhost murasaki.usb[1338]: Please change MODULE in following line to (折り返し)
         the appropriate  module name, add it
    to /etc/murasaki/murasaki.usbmap
    localhost murasaki.usb[1338]: MODULE 0x0073 0x4b8 0x122 0 0 0xff 0xff 0xff 0x0 0x0 0x0 0x00000000
    

    [3] /etc/murasaki/murasaki.usbmap への追記
    そこで,メッセージ通り,/etc/murasaki/murasaki.usbmap の最後に,以下のような一行を追加した.

    libusbscanner  0x0073  0x4b8 0x122 0 0 0xff 0xff 0xff 0x0 0x0 0x0 0x00000000
    

    [4] 接続テスト
    murasaki の再起動,あるいは,めんどうなら reboot する.そして, ふたたびUSBでスキャナを接続してみて,「ぴっ」といけば成功. 
    「スキャナにコマンドを転送できません。スキャナの状態を確認してください。」 というメッセージが出て,iscan がスキャナと接続できない時には, スキャナがちゃんと起きているかどうか,確認すること. どのようなタイミングでなるのかは定かでないが, 自動的に電源オフする(省エネモードに入る?)ことがあるので,その時には, スキャナの電源コードを一度,引き抜き,もう一度入れる(スキャナ自体には, 電源スイッチがないのでこうなる).この状態が分からなくて,しばらく慌てた.
    なお, スキャナモジュールでの利用方法を先に試した場合には, scanner モジュールがロードされているので,libusb 経由の利用をする前に
    # /sbin/rmmod scanner
    しておく必要がある.また,/etc/rc.local/sbin/modprobe の行を追加した ままにしておくと,scanner モジュールがぶつかってしまい,起動できなくなる ので,この/sbin/modprobe 行は削除しておく必要があるのは言うまでもない.

  4. OCRソフトウエアを探す

    OCRソフトウエアをネットで探すと, かなり古い情報が多くひっかかる.その中で,唯一かなり信頼性の高い便利なサ イトは,Linux and OCR(http://www.linux-ocr.ekitap.gen.tr/) だ.ここで古くなっているリンクは,kooka くらいだ(後で,kookaについては触れる).

    ソフトウエアとして紹介されているのは,以下のものだ.
    (1) GOCR
    (2) Clara OCR
    (3) Ocrad
    (4) OCRE
    (5) XOCR
    (6) OCR Shop
    (7) OCRchie
    (8) LOCR
    (9) Qui-ne-faut
    (10) Kooka
    (11) ABBYY FineReader Engine 6.0 for LINUX

    今回試したのは,(1),(2),(3),(10)だ. たまたま,最初に出会ったのが(3)であり, 今回の試用では4つのソフトウエアの中で一番よい結果だった. なお,OCR Shopは,上のリストの中で唯一市販品であり, Product Review: Two OCR packages for Linux comparedという, LinuxWorld誌に Joe Barrによって書かれた(07/03/2003 09:31:36)レビュー記事があり, そこで紹介されている.この記事によれば, Vividata Inc.社の OCR ShopOmniPage engine を使っていることもあり,"Not a single error." と絶賛されている.Linuxで(日本語を対象にせずに) OCRをミッションクリティカルに使いたいなら, (そして多少のお金を支払ってもよいなら)お勧めかもしれない.

  5. 最初に試したOcrad

    Ocrad -- The GNU OCRは, Antonio Diaz Diazによって作られたもので, 今回試用したものは,ocrad-0.14.tar.bz2で,更新日 は 15-Feb-2006 08:20,サイズは,72kGPL v.2の元に配布されているもの.

    その特徴は,
    (1) 特徴抽出法(feature extraction method)を用いた認識.
    (2) 入力データは, pbm (bitmap), pgm (greyscale), ppm (color)に制限されている.
    (3) 出力は,テキストファイルであり, text in byte(8-bit)あるいは, text in UTF-8になる.
    (4) レイアウト解析を行ない,テキストエリアを自動的に分離.
    (5) スタンドアローンとしてコマンドベースでも使えるし, 他のプログラムのバックエンドとしても使える.

    [1] Ocrad のインストール
    特に特殊なことはなく,普通にconfigure script が使えるので,適切なディレクトリにソースocrad-0.14.tar.bz2 を置き,展開して,configuremake で OK だ.

    $ tar xjvf ocrad-0.14.tar.bz2
    $ cd ./ocrad-0.14/ 
    $ ./configure
    $ make
    $ make check
    # make install; make install-man
    

    [2] Ocrad での処理
    まず最初に試したのは,南ドイツ新聞(Süddeutsche Zeitung) の小さな記事.この記事には,ドイツ語の記事の中に英語の単語も含まれている. Ocradは,Latin-1の文字は読める, と書いてあったので多分大丈夫だろうと思って試した.

    ○ 記事をスキャンしてpnm(Portable aNyMap) で保存する
    コメント:
    (a) 他の画像フォーマットで保存しても,ImageMagickなどで,pbm (bitmap), pgm (greyscale),ppm (color)に変換しておく必要が生じる(pnmもOK).
    (b) 取り込む画像は,グレー・スケールでよいが,解像度は低すぎても高すぎてもよくない. 今回の試行錯誤の結果,欧文の場合,おそらく300dpiで十分だろう. ただし,原稿の種類にもよるので400dpi600dpi を試してみる価値もある.
    (c) スキャンは,「プレビュー」し,スキャナしたい範囲をマウスで選択し, 「ズーム」し,調整が必要な場合は調整し,「取り込み」をクリックして, ファイルを保存するというのが大まかな手順.

    ○ Ocrad でOCR
    コマンドラインで,以下のようにすれば,テキストファイルが出力される. 今回のような,小さな記事だと処理は一瞬で終了する.今回は, 600dpi, grayscaleでスキャンしたものを用いた. (ファイル名:discovery.pnm,サイズ: 3,333,457 bytes

    $ ocrad  discovery.pnm >discovery.txt
    (あるいは,出力ファイルのコードを指定して) $ ocrad -F utf8 discovery.pnm >discovery.txt
    スキャンしたSDZ の記事
    スキャンした新聞記事(discovery.pnm, 3,333,457 bytes)
    OCRで処理した結果
    OCRで処理した結果(discovery.txt, 774 bytes, ISO-8859-1)

    ○ 結果と感想 上の右のテキストファイル(に誤認識をしたものをピンクの背景にしたもの) を見て分かるように,5箇所に問題がある.ただし,その内の2箇所は, ゴミを読んでしまったもので,文字の認識の間違いとしては,3つだった.

    OCRで誤認識されたもの   オリジナル   結果
      aüßerte aüaerte
      Zuvor ZNvor
      Weltraum Weltrauw

    Ocrad -- The GNU OCRBug-ocradMailing List Archieveで, Antonio Diaz Diaz氏自らが, Wed, 18 Jan 2006 17:17:50 +0100に以下のように答えており, 現バージョンでは (ß)はサポートされていないことが分かる.

    I have no plans to support the eszet (ß) anytime soon, but perhaps
    a German programmer could contribute the code to recognize it.
    ...snip...
    

  6. KDEのKookaが定番?

    KDEの中で,OCRとして有名な Kookaは, http://kooka.kde.org/ で公開されている.最新版は,0.44 (May 4, 2004)だ. そう,2004年5月以来,止まっているかのように見える.
    VineLinux 3.1で, KDEをインストールしてあるならば,実はおそらくすでに kookaも入っているはずだ. 以下のように,kdegraphicsパッケージに入っており, そのバージョンは,最新版であることが分かる.

    $ rpm -qf /usr/bin/kooka
    kdegraphics-3.5.1-0vl1
    $ kooka -v
    Qt: 3.3.5
    KDE: 3.5.1-0vl1
    Kooka: 0.44
    

    kookaの特徴は,X interface を備えた統合環境であり,スペリングチェッカー(ispell or aspell)と連動して, 文字認識した結果を楽に修正できるようになっている. 文字認識エンジンは,上で説明したOcradか, gocrと接続して使えるようになっている. 逆に言うと,kooka自体は,エンジンを持たない.

    kooka environment on VineLinux3.1CR
    kookaの環境(KDEをドイツ語環境で起動)

    kookaでは,同じようにOcrad を選択し,画像を読み込んだ後にOCR で結果を表示させてみたのだが,日本語環境では,エディタがISO-8859-1 のファイルをきちんと開いてくれないので,いったんログアウトし, KDEをドイツ語環境で起動させてみた.その結果が以下のエディタのスクリーンである.

    Result of kooka-OCR  on VineLinux3.1CR
    kookaでの文字認識の結果(KDEをドイツ語環境で起動)

    同じOcradエンジンで,この惨めな結果を見ると, OCRソフトウエアの調整の難しさが分かる. 統合環境がかえって足を引っ張っている感じだ.


  7. gocr も試したが...

    gocrのサイトから, 最新版を持ってきて試そうとしたが,最新版の0.40 は,glibcの版がVineLinux 3.1CR のものより新しいものを要求するので,今回は, gocr-0.39-1.FC2.i386.rpmをインストールした. 開発者は,Joerg Schulenburg と,Bruno Barberi Gneccoで, 最新版(0.40)のリリースでさえもMarch 13th, 2005 であり,それ以前のものである(0.39)のHISTORY ファイルを見ても,日付が入っていないのでいつの時点のものか,不明である. ライセンスも,GPLなのかどうかもはっきりしない.

    gocrは,その構造が比較的分かりやすく, OCRソフトウエアの基本的な勉強をするのには 適しているかもしれない.gocr --helpで, かなりのパラメータが設定できるので,いろいろな設定を試してみることができる.

    さて,パラメータはまったく与えず,
    $ goocr discovery.pnm >discovery-gocr.txt
    とした結果は以下のようになった.

    スキャンしたSDZ の記事
    スキャンした新聞記事(discovery.pnm)
    gocrで処理した結果
    gocrで処理した結果(discovery-gocr.txt, 802 bytes, ISO-8859-1)

    gocrで処理した結果を見ると少しがっかりする. しかし,これは,新聞記事を600dpiでスキャンした原稿であり, gocrでお勧めの,300dpiで試せば, もう少しよい結果が得られるかもしれない(ゴミの誤認が多い気がする).また, パラメータの設定をまったくしていないので, 最良の状況での文字認識ではない.

  8. 奥が深ーい OCR ソフトウエアの今後

    Clara OCRは,現在, clara-20031214.tar.gzしか配布されておらず, 目下,最新版作成に取り組んでいる最中とのことなので, 今回は試用してみた結果は報告しないことにした.

    Ocradのテスト結果が5箇所の過りだけだったのは, 特筆に値する.それは,新聞紙というかなり悪い紙質での印刷物でこれだけの結 果だったからだ.そこで,雑誌2つ (Der Spiegel, Focus)Timesのフォントを使って LaTeXで作成し, XdviBrother HL-5070DNに出力したものをスキャンして, Ocradにかけてみた.

    その結果,雑誌を対象とした文字認識は意外に思わしくなく, Focusでは, 若干太めで見やすいフォントが使われているものの, それがかえって問題となっていることが判明した.
    LaTeXで出力したものは,スキャナにかけるときに 300dpi, 400dpi, 600dpiを試してみた. その結果,300dpi, 400dpiでは差がなく, どちらもß以外は完璧に文字化されていた. 600dpiでは,なぜか1文字だけ認識できなかったもの があった(Lの小文字).当然といえば当然だが, コンピュータ出力の欧文なら,現状のOcrad でも十分によい結果が得られると思う(今回はドイツ語の文章だったが, 英語なら本当に問題ないだろう). ただ,文書量が増えると,たった 1%でも 相当な数になるというのも事実で,そこらへんがOCR を実用化する時の大きな障害でもある. 今回のDiscoveryの新聞記事の語数は 109だが,この10倍の記事で 1% だったら10個のミスになり,1000文字の中から10個のミスを人の目で探すのは大変である. 一万字の文章だって珍しくないから,そうすると100個のミスになってしまう. 10,000文字の中から100個のミスを人の目で探すのはしんどい. そんな時は,スペリングチェッカーが大きな役割を果たすことになる.

    Ocradのソースコードを眺めてみたが, recognize* という複数の種類の関数で文字の種類を切り分けている.なかなか面白い処理だが, 日本語でこれと同じことをやる(特徴抽出)のはかなりの困難を伴うだろう (「平仮名」や「カタカナ」だったらできそうだが「漢字」が問題). 日本語OCRは, おそらく素(そ)の文字情報を効率よく持たせるところにポイントがある. 漢字の複数フォントの扱いは,どうやっているのだろうか? 興味は尽きないが, データ処理自体に非常に地味な長時間の作業が必要となることが想像でき, ここらへんがオープンソースの日本語OCR の出現を拒んでいる部分ではないか,と勝手に想像している.

    LaTeX のソースファイル
    LaTeX のソースファイル
    LaTeXで処理し,Xdviで表示
    LaTeX で処理し,Xdvi で表示
    300dpi でスキャンし,Ocradで処理した結果
    300dpi でスキャンし,Ocradで処理した結果 (ßが2箇所l3 <Lの小文字と数字の3>となっている)
    geditiso-8859-1のテキスト データを読み込みキャプチャーしたもの)

  このページの先頭へ戻る

  LINUXのページのトップへ戻る