ナンバープレート(ANPR)を認識できるアプリを開発しています。最初のステップは、イメージからライセンスプレートを抽出することです。私はOpenCVを使用して幅/高さの比率に基づいてプレートを検出していますが、これはかなりうまくいきます:
しかし、ご覧のとおり、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でさらに画像操作を行う必要がありますか?または、テセラクトで改善できるものはありますか?
これを完全に修正するものが2つあります。
画像からtextではないすべてのものを削除します。いくつかのCVを使用して(たとえば、色などで)プレート領域を見つけてから、背景のすべてをマスクallする必要があります。 tesseractへの入力を白黒にします。テキストは黒で、それ以外はすべて白です。
スキューを除去します(上記の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として認識されます。
Tesseractについてはあまり知りませんが、OCRについての情報はあります。さあ。
お役に立てれば。
古い電力計からOCRを試してみた私の実例です。 OpenCVが画像の自動トリミングを行うようにOpenCVコードを使用したいと思います。また、画像クリーニングスクリプトを実行します。
ライセンスモデルはmlmodelで簡単に認識できるようになりました。あなたがそれを見つけることができるコアモデルを作成しました here 。ビジョンフレームワークを介して28 * 28解像度で文字を分割し、この画像を以下のようにVNImageRequestHandlerに送信するだけです。
let handler = VNImageRequestHandler(cgImage: imageUI.cgImage!, options: [:])
コアmlmodelを使用して、目的の結果を得ることができます。明確にするために this リンクを使用しますが、ナンバープレート認識の結果を改善するためにモデルを使用します。また、ナンバープレート認識用に mlmodel を作成しました。