🐟

GPUなしローカルでも高速・高精度なOCRができるOnnxOCRが凄い

に公開

社内のDXを進めていく中でアナログデータをOCRするという要件がそこそこあるのですが、お堅い企業だとクラウド利用禁止だったり低スペPCしかなかったりの制約があり、エッジで動作する汎用OCRで何か良いのないかなーと探していたら、素晴らしいライブラリを見つけました。

日本語で紹介している記事が全く見つからなかったので、AI驚き屋みたいに紹介していきます。

OnnxOCRとは

https://github.com/jingsongliujing/OnnxOCR

OnnxOCRとは、PaddleOCRをベースにした軽量なOCRでpaddlepaddle深層学習フレームワークなしでも動作し、高速な推論速度を備えています。

PaddleOCRと同じモデルをonnxモデルに変換すると、精度とパフォーマンスが向上し、推論速度は paddlepaddle フレームワークを使用する場合よりも 5 倍速くなります。

簡単に言うと従来のOCRエンジンと比較すると圧倒的に高速高性能なOCRエンジンです。

また、Apache ライセンスなので商用利用も可能です。

使い方

インストールはPYPIからできます
デフォルトでライブラリデータ内にonnxモデルをDLするので、すぐに使い始められます。

pip install onnxocr

使い方も非常に簡単で以下のようなプログラムでOCRが実行できます。

from onnxocr.onnx_paddleocr import ONNXPaddleOcr

def sample():
    ocr = ONNXPaddleOcr(use_gpu=False, lang="japan")
    result = ocr.ocr("sample.png")

    for data in result:
        for box, (text, score) in data:
            print(f"text: {text}, score: {score}")

ONNXとは

OnnxOCRを紹介する上でONNXとは何ぞやということも軽く解説します。
ONNX(Open Neural Network Exchange)とは、機械学習モデルを異なるフレームワーク間で共有・運用するためのオープンなフォーマットです。

https://qiita.com/motoJinC25/items/d662be70b6b9b8ebbaea

このフォーマットに従うことで、PyTorch、TensorFlow、Scikit-learnなど、異なる機械学習フレームワークで作成されたモデルを、共通の形式で保存・読み込みできるようになります。

ハードウェアベンダーはONNXに最適化を施すことで、複数のフレームワークに対応した高速な推論環境を提供できます。

そしてONNX Runtimeというエコシステムが非常に協力で、これによって高速な推論を可能にしています。

つまりOnnxOCRはPaddleOCRをONNXの強力なエコシステムを使うことで高速化したライブラリということになります。

実際に速度と精度を比較してみる

言葉だけで紹介しても凄さが伝わらないので実際に検証してみます。

検証条件は以下のとおりです。

  • EasyOCRPaddleOCROnnxOCRの3つで比較

  • モデルはEasyOCRはデフォルト設定、PaddleOCROnnxOCRはそれぞれ同じモバイル向けの軽量モデルを使用

  • CPU推論のみ(Intel製12世代 Core i7を使用)

Tesseractは上記3つとは少し毛色が違うので今回は比較しませんでした。

ベンチマークプログラムはGitHubで公開してます。それぞれライブラリの使い方や処理が異なるので、これらのOCRライブラリを使いたい人は参考にしてください。

https://github.com/harumiWeb/onnxocr_benchmark/blob/0da7796ce066afe518c244bdbf3d08038a4b6e48/main.py

比較① (風景に写る案内表示)

以下の画像を使用しました。

日本の風景に写る案内表示の画像

町中の案内表示

各OCRエンジンの認識結果は以下です。

  • EasyOCR

  • PaddleOCR

  • OnnxOCR

  • 速度ベンチマーク

認識精度に関してはどのOCRエンジンも概ね正確に認識できました。
注目すべきは推論速度です。
速度ベンチマークグラフを見て分かる通り、OnnxOCRの推論速度が0.62秒と最も高速です。認識精度との兼ね合いを考慮するとものすごい性能です。

比較② (文字の多い文書)

次は文書ファイルのような綺麗な文字の画像を渡してみます。文字数は多めですがどうでしょうか。

一般的な内定通知書の画像データ

  • EasyOCR

  • PaddleOCR

  • OnnxOCR

  • 速度ベンチマーク

文字の多い文書のデータでは推論速度に大きな差はでませんでしたが、OnnxOCRが最速となりました。

推論に最も時間のかかるEasyOCRと認識精度が同じなのは凄いです。

比較③ (文字は少ないが変形している画像)

最後に以下の画像を検証しました。

斜めに撮影された橋の看板の写真

  • EasyOCR

  • PaddleOCR

  • OnnxOCR

  • 速度ベンチマーク

比較③ではOnnxOCRが圧倒的な成績を出しました。

何も設定していませんがOnnxOCRだけ傾き補正もしっかり効いて高い文字認識をしています。

また、推論速度ではPaddleOCR2倍EasyOCR7.5倍高速に動作しました。

ただ、EasyOCRはどの画像でも3.5秒ほどで完了しているので、対象の実際の情報量にあまり影響されないのかもしれません。

おわりに

大前提モデルの性能に依存するところはありますが、OnnxOCRは軽量ながら情報量の少ない画像データでは圧倒的な推論速度・文字認識を誇ることがわかりました。

このレベルのモデルをオープンソースで公開する Baidu(百度)は恐ろしいですね。

CPU推論でもこれだけの性能が出れば、かなり実用的なOCR処理がエッジ環境でも実行できそうです。

ONNXに非常に興味が湧いたのでもう少し色々調べてみたいと思います。

その他参考リンク

https://github.com/PaddlePaddle/PaddleOCR
https://github.com/JaidedAI/EasyOCR
https://onnx.ai

Discussion