web-dev-qa-db-ja.com

tesseractを使用してナンバープレートを認識する

ナンバープレート(ANPR)を認識できるアプリを開発しています。最初のステップは、イメージからライセンスプレートを抽出することです。私はOpenCVを使用して幅/高さの比率に基づいてプレートを検出していますが、これはかなりうまくいきます:

extracting license plates

extracting license plates

しかし、ご覧のとおり、OCRの結果はかなり悪いものです。

Objective C(iOS)環境でtesseractを使用しています。これらは、エンジンを起動するときのinit変数です。

// init the tesseract engine.
    tesseract = new tesseract::TessBaseAPI();
    int initRet=tesseract->Init([dataPath cStringUsingEncoding:NSUTF8StringEncoding], [language UTF8String]);
    tesseract->SetVariable("tessedit_char_whitelist", "BCDFGHJKLMNPQRSTVWXYZ0123456789-");
    tesseract->SetVariable("language_model_penalty_non_freq_dict_Word", "1");
    tesseract->SetVariable("language_model_penalty_non_dict_Word ", "1");
    tesseract->SetVariable("load_system_dawg", "0");

結果を改善するにはどうすればよいですか? OpenCVでさらに画像操作を行う必要がありますか?または、テセラクトで改善できるものはありますか?

36
unicorn80

これを完全に修正するものが2つあります。

  1. 画像からtextではないすべてのものを削除します。いくつかのCVを使用して(たとえば、色などで)プレート領域を見つけてから、背景のすべてをマスクallする必要があります。 tesseractへの入力を白黒にします。テキストは黒で、それ以外はすべて白です。

  2. スキューを除去します(上記のFrankPIで述べたとおり)。 tesseractは実際にはスキューで問題なく動作するはずです(「 Tesseract OCR Engine "R. Smithによる概要」を参照)一方で、それは 常に動作しない 、特にいくつかの段落とは対照的に、単一の行があります。そのため、スキューを確実に行うことができるのであれば、スキューを最初に手動で除去することは常に適切です。おそらく、ステップ1のプレートの境界台形の正確な形状を知っているので、これはそれほど難しくないはずです。スキューを除去するプロセスでは、遠近感を削除することもできます:すべてのナンバープレートは(通常)同じフォントを持ち、同じ(遠近のない)形状に拡大縮小すると、文字の形状はまったく同じになります。テキスト認識。

さらにいくつかのポインター...

最初はこれをコーディングしようとしないでください。非常に簡単なOCR(つまり、正面から、遠近感なし)のプレートの写真を撮り、Photoshop(またはgimp)で編集し、コマンドラインでtesseractを実行します。これが機能するまで、さまざまな方法で編集を続けます。たとえば、色で選択する(または文字の形を塗りつぶす)、黒で塗りつぶす、選択を反転する、白で塗りつぶす、プレートの角が長方形になるように遠近法を変換するなど。角度など)。それらすべてでこれを行います。これが完全に機能したら、photoshopで行ったのと同じことを行うCVアルゴリズムの作成方法について考えてください:)

追伸また、可能であれば、より高い解像度の画像から開始することをお勧めします。例のテキストの高さは約14ピクセルのようです。 tesseractは300 dpiの12ポイントのテキストで非常によく機能します。これは約50ピクセルの高さであり、600 dpiでははるかに良く機能します。文字サイズを少なくとも50、できれば100ピクセルにしてください。

P.P.S. train tesseract に何かをしていますか?あなたはそれをしなければならないと思います、ここのフォントは問題になるほど十分に異なっています。おそらく、テキストで非常に一般的なダッシュを認識する(ペナルティを科さない)必要があります。2番目の例のように、「T-」はHとして認識されます。

50
Alex I

Tesseractについてはあまり知りませんが、OCRについての情報はあります。さあ。

  • OCRタスクでは、列車データが認識しようとしているものと同じフォントを持っていることを確認する必要があります。または、複数のフォントを認識しようとしている場合は、最高のパフォーマンスを得るために、トレインデータにそれらのフォントがあることを確認してください。
  • 私の知る限り、tesseractはいくつかの異なる方法でOCRを適用します。1つは、複数の文字が含まれる画像を指定し、tesseractにセグメンテーションを実行させます。また、セグメント化された文字をtesseractに渡し、それが文字を認識することだけを期待します。たぶん、あなたが使用しているものを変更しようとすることができます。
  • 自分でレコグナイザーをトレーニングしている場合は、列車データに各文字が十分かつ均等にあることを確認してください。

お役に立てれば。

13
guneykayim

私はiOSアプリに取り組んでいます。結果を改善する必要がある場合、tesseract OCRをトレーニングする必要があります。これにより、90%改善されました。変換する前は、OCRの結果はかなり悪かった。

それで、私はこれを Gist を使って、ナンバープレートフォントでtesseract ORCを訓練しました。

興味があれば、数週間前に github でこのプロジェクトをオープンソース化しました

8
chroman

古い電力計からOCRを試してみた私の実例です。 OpenCVが画像の自動トリミングを行うようにOpenCVコードを使用したいと思います。また、画像クリーニングスクリプトを実行します。

  • 最初の画像は元の画像です(パワーメーターの番号がトリミングされています)
  • 2番目の画像はGIMPでわずかにクリーンアップされ、tesseractで約50%のOCR精度
  • 3番目の画像は完全にクリーンな画像です-トレーニングなしで100%OCRが認識されました!

enter image description hereenter image description hereenter image description here

2
valentt

ライセンスモデルはmlmodelで簡単に認識できるようになりました。あなたがそれを見つけることができるコアモデルを作成しました here 。ビジョンフレームワークを介して28 * 28解像度で文字を分割し、この画像を以下のようにVNImageRequestHandlerに送信するだけです。

let handler = VNImageRequestHandler(cgImage: imageUI.cgImage!, options: [:])

コアmlmodelを使用して、目的の結果を得ることができます。明確にするために this リンクを使用しますが、ナンバープレート認識の結果を改善するためにモデルを使用します。また、ナンバープレート認識用に mlmodel を作成しました。