C#でTesseract 5

矢野です。
社内向けに作成していたC#アプリケーションで利用するTesseractのバージョンを4系から5系に更新した概要を簡単にメモしておきます。Tesseractに限らずC#での画像認識に関する情報って、Pythonなどに比べると日本語でも英語でもかなり少ないですよね。ビジネスロジックをつくっていく段階であれば、もちろん他のプログラミング言語向けの情報でも大いに参考になるのですけれど、最初の一歩して「とりあえず動くようにする」ところがその言語なり、ライブラリなりの固有の手順が必要で、そういうところで引っ掛かりがちです。 .NET Framework, .NET向けに作成されたTesseractのラッパーライブラリとしてよく使われているのは恐らくcharlesw/tesseractだと思います。私もこれまでお世話になってきていたのですが、残念ながらTesseract 4.1までしかサポートされていません。今すぐ5系が必要な状況というわけではないですが、余力のある時に乗り換えておいた方が良いこともあるだろうと思って、対応したライブラリを探してみました。 上記のcharleswさんのところから派生したSicos1977/TesseractOCRを導入することで、ほんの少しのコードの修正でTesseract 4系から5系へ移行することができました。
NuGetパッケージマネージャーからTesseractOCRをインストール
Visual Studioからであれば、NuGetパッケージとして簡単にインストールできます。 以降前のcharlesw/tesseract向けのコードは、非常に簡素に書くとこんな感じ。

using Tesseract;

// 中略

// PictureBoxに表示
pictureBox1.Image = new Bitmap("image\\lipsum.png");

// 文字認識
var engine = new TesseractEngine("tessdataフォルダのパス", "eng");
using (var pix = Pix.LoadFromFile("image\\lipsum.png"))
{
    var page = engine.Process(pix);

    // 結果表示
    textBox1.Text = page.GetText();
}


これを、Sicos1977/TesseractOCR向けに修正すると、

using TesseractOCR;

// 中略

// PictureBoxに表示
pictureBox1.Image = new Bitmap("image\\lipsum.png");

// 文字認識
var engine = new Engine("tessdataフォルダのパス", "eng");
using (var pix = TesseractOCR.Pix.Image.LoadFromFile("image\\lipsum.png"))
{
    var page = engine.Process(pix);

    // 結果表示
    textBox1.Text = page.Text;
 }


名前空間とクラス名、オブジェクトの構成を少し修正するだけで、ほぼそのまま使えました。
分かりにくいけど上が認識対象の画像、下がTesseract 5.2での認識結果です。
えっ? たったこれだけ? そうなんです、たったこれだけでした。その先は、これまでのTesseract 4系向けにつくっていたのと同じようにビジネスロジックをつくり込んでいくことができました(同時期にEAST text detectorを組み込んでみたりもしたけど、それは別の話)。これまで未経験の技術とか、「たかが」ライブラリのアップデートとか、どうしても気後れしちゃうこともありますが、一歩踏み出してしまえば「たったこれだけ」で進めちゃうこともよくあるよね、というお話でした。