今回は、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などの開発に従事。