今回は、FessでオープンソースのOCRエンジン「Tesseract OCR」を利用する方法を紹介します。OCR(Optional Character Recognition:光学文字認識)とは、手書きや印刷された文字が含まれる画像をコンピュータで処理可能な文字コードの列に変換する技術です。OCRでは、パターン認識の技術などを用いて画像から文字情報を認識しています。

Fessでは、画像ファイルのメタデータで検索できるのですが、OCRを利用することで画像内の文字列でも検索できるようになります。

今回はFess 13.6.3とtesseract 4.1.1を使用し、画像内の文字列を検索するまでの手順を説明していきます。

Tesseract OCRの準備

まず、Tesseract OCRをインストールします。利用OSがMacOSの場合は、以下のコマンドを実行してください。

$ brew install tesseract
$ brew install tesseract-lang

その他のOSに関しては、Apache Tikaのサイトを参照してください。

PDFでOCRを適用する設定

PDFに対してもOCRを適用するためには、Fessの設定ファイルを更新する必要があります(画像だけを検索対象にするのであれば、この設定は不要です)。

設定ファイル「extractor.xml」をこちらのリンクから取得して、「app/WEB-INF/classes/crawler」に配置してください。

次に、配置したextractor.xmlを編集し、 以下の箇所をコメントアウトします。

<!--
        <postConstruct name="addExtractor">
                <arg>[
                        "application/pdf"
                        ]</arg>
                <arg>pdfExtractor</arg>
        </postConstruct>
-->

続いて、同じディレクトリ内にある「rule.xml」の以下の行もコメントアウトします。同じ内容の行が2カ所あるので、どちらもコメントアウトしてください。

<!--
        + "|application/pdf"
 -->

Tesseract OCR用設定ファイルの準備

Tesseract OCR用の設定ファイルを作成して、Fessのインストールディレクトリ内に配置します。

「TesseractOCRConfig.properties」を以下の内容で作成します。

#tesseractPath=
language=eng+jpn
pageSegMode=1
extractAcroFormContent=true
useNonSequentialParser=false
extractAnnotationText=true
sortByPosition=false
extractUniqueInlineImagesOnly=true
enableAutospace=true
maxFileSizeToOcr=2147483647
minFileSizeToOcr=0
timeout=30
suppressDuplicateOverlappingText=false
outputType=txt
preserveInterwordSpacing=false
enableImageProcessing=1
ImageMagickPath=/usr/local/bin
density=300
depth=4
colorspace=rgb
filter=triangle
resize=200

PDFにもOCRを適用するためには以下のように「PDFParser.properties」も作成します。

enableAutoSpace true
extractAnnotationText true
sortByPosition false
suppressDuplicateOverlappingText false
extractAcroFormContent true
extractBookmarksText true
extractInlineImages false
extractUniqueInlineImagesOnly true
checkExtractAccessPermission false
allowExtractionForAccessibility true
ifXFAExtractOnlyXFA false
catchIntermediateIOExceptions true
ocrStrategy ocr_and_text_extraction
ocrDPI 300
ocrImageFormatName png
ocrImageType gray
ocrImageScale 2.0
maxMainMemoryBytes 524288000
setKCMS false

「app/WEB-INF/classes/tika.xml」では、以下の行をコメントアウトしておきます。

<!--
      <parser-exclude class="org.apache.tika.parser.ocr.TesseractOCRParser"/>
-->

クローラの設定/実行

クロール設定を作成します。今回は/ocrディレクトリ以下を対象に検索するものとします。

Fessの管理画面を開き、「クローラー」>「ファイルシステム」>「新規作成」をクリックします。

「名前」には任意の設定名を、「パス」には「file:/ocr 」を設定します。「設定パラメータ」には先ほど作成したTesseractOCRConfig.propertiesとPDFParser.properties のパスを指定してください。今回は、以下のような設定となりました。

config.tika.tesseract.config=/Users/codelibs/fess-13.6.0/TesseractOCRConfig.properties
config.tika.pdf.config=/Users/codelibs/fess-13.6.0/PDFParser.properties

クロール設定登録後、「システム」>「スケジューラ」>「Default Crawler」で「今すぐ開始」をクリックします。

クロールが完了したら、Fessの検索画面を表示して検索フォームから画像に含まれる単語で検索してみてください。画像内の文字列が検索できることを確認できるはずです。

検索画面

* * *

今回は、FessでOCRを利用する方法を紹介しました。画像に含まれる文字列の検索もTesseract OCRを用いると簡単に実現できます。実用に足るかどうかはOCRの精度にも依存しますが、Tesseract OCRであればチューニングなども可能なので、画像内の文字列検索にぜひ利用してみてください。

著者紹介

菅谷 信介 (Shinsuke Sugaya)

Apache PredictionIOにて、コミッター兼PMCとして活動。また、自身でもCodeLibs Projectを立ち上げ、オープンソースの全文検索サーバFessなどの開発に従事。