09:30Tweet前回の「冬休みの自由研究でOCRを作ってみた」では、最後の認識にMNISTを学習データとして使ったので、あまり精度が良くなかった。そこで、認識の部分にOSSのOCRであるtesseractを使用することで、再度検証してみることにした。tesseractには、-psmというパラメータで認識方法を指定できる。character.10を指定すれば、1つの文字として認識を行うことができる。いう話になるが、tesseractは、特定の苦手なシーンがあり、今回の方法でそれが克服できないかを検証することが目的だ。Visionとの比較もしてみることにする。Visionは、このサイトで簡単に試してみることが可能だ。今回は、こういう画像を使用。tesseractは二値化されていないと精度が著しく落ちるので、予め二値化してある。Vision使ってみると、きちんと認識されている。今回のOCRは数字が等幅フォントで1行で書かれたものを処理対象とするため、ここから切り出してから処理する。普通に切り出したものを処理してみる。10で1文字ずつ認識するようにしてみた。3.14159265正しく認識されている。7を指定しても正しく認識できる。Visionでもok。お次は、イメージ切り抜きの際にズレて右側の罫線が入ってしまったケース。普通にtesseractで認識してみる。digits3.141592651罫線部分が1と認識されてしまう。今回のOCRで処理してみる。3.14159265等幅フォントを仮定して切り離した後に、幅が極端に小さなものは捨てるためきちんと認識できている。Visionだと、正しく認識できている。次は罫線がもっと数字に寄ってしまったケース。digits3.14159263最後の5が3と誤認識されていることが分かる。3.14159265正しく認識できた。等幅フォントを仮定して切り取るため、罫線がうまく削除できたのだと思われる。Visionだと、やはり正しく認識できていてさすがだ。次は下に罫線が残ってしまったケース。.全然ダメになってしまった。11159255幾分改善するが、やはり誤読が見られる。横方向の罫線については、黒成分が極端に高いものを除外することで、除去できるかもしれない。Visionだと、やはりきちんと認識されている。Visionの圧勝だ。次に印字が不鮮明なケースを検証してみる。ドット・インパクト・プリンタの場合、良く一部が不鮮明になるケースがある。これは6の下部が消えてしまった例。tesseractで認識してみる。digits3.14159255誤読してしまっている。3.14159265正しく認識された。1文字として認識する場合には精度が上がるようだ。Visionでは、やはり圧倒的な強さを見せつけている。最後に全体にもっと不鮮明な上に罫線がカブっているケースを見てみる。digits70001393652最後の2桁を誤読しているが、左の罫線による悪影響は出ていなかった。今回のOCRを試してみる。7000139369正しく認識できた。Visionでは、Google先生、全勝はならず。Visionはそういう指定が無く、言語の指定しかできないので印字が不鮮明な場合は、tesseractの方が良い結果が得られる場合もあるようだ。いうわけで、割と良い結果が得られたので満足。