🤖

OCRメモ

2024/09/27に公開

OCR についてのメモ

OCR の定義について

OCR は、光学文字認識のことで、紙に印刷された文書や手書きの文字をデジタルデータに変換する技術

とのことなので、ただ自分としては、写真とかそこらへんも OCR に含まれる気がするのだが、一旦そこは置いとく

現在強そうなサービス

https://mathpix.com/

これすごいと思う。というか

https://mathpix.com/pricing

これで API サービス提供してて、かつ安いので、開発なんてせずにこれ使えば良くない?感がすごい

あと一応 google のやつ

https://cloud.google.com/vision/pricing?hl=ja

意外と OCR って安いんやな。
精度どのくらいなんだろうか

自作 OCR について

OCR と言いながら実は、やりたいことが OCR ではなく、物体検知のパターンも往々にしてある気がする。
例えば、写真の中のマーク読み取りは物体検知のタスクになるのかな?

いずれにせよ、今の自分だとこの物体検知なのかよくわからんアプローチは 2 つあると思っている

  • Area Detection をしてから分類問題もしくは ViT
  • YoLo

認識領域特定をしてから分類問題もしくは ViT

領域特定をしてから、画像を分類問題に落とすというもの
ただ、風の噂だと、OCR でも画像に映る文字を全部領域に区切って、分類問題に落とし込む手法も存在するらしい。
今だと LLM で、画像と「これに書かれている文字を教えてください」というプロンプトを落とし込めばそれで良い気がする。
というか、流行りの LLM の API に画像送りつけて、プロンプトをガチればもうそれで事足りる説もある。
まぁ今回はそれで事足りなかった時の話ということで、

認識領域特定

基本的には画像から、対象となる物体を特定するタスクが存在しする。
いろんなデータセットがあるが、ひとまず自分の場合は、風景の中のテキスト認識系のモデルを漁った。

https://paperswithcode.com/sota/scene-text-detection-on-total-text

自分が過去に使ったことはあるのは、

https://paperswithcode.com/paper/east-an-efficient-and-accurate-scene-text

である。一応普通に fine-tuning できたので、開発自体は可能だった。

というかよくよく考えた場合、上記の mathpix とかって、論文の画像データとかだから、比較的対象の難易度低いんじゃないか?
自分の場合は、人が撮った写真に対してのアプローチだったから、そこに対しては精度出にくい感じだったと思う。

領域特定してからの認識

上記で領域特定してから、その後クリッピングを行い、その画像に対して、あーだーこーだするけども
自分の場合は CNN を使って、分類問題に落とし込んだ。

CNN のモデルに関しては
https://pytorch.org/vision/stable/models.html

で落とせるので、適当にランキング上位のものを使えばいい気がする。

もちろん CNN を使うのではなく、上記のように LLM にぶん投げて、「これなんっすか?」ていう旨のプロンプトで認識かけてもいいと思う。

YOLO

現在、物体検知の王様な気がする

https://paperswithcode.com/sota/real-time-object-detection-on-coco

自分はこのデータセット詳しくないが、多分 YOLO が強いという認識は間違ってないと思う。

https://qiita.com/hirekatsu0523/items/f2f0e1a0f8a9ea92d913

YOLO を使えば、領域特定と分類までやってくれる。
あれ?全部これでよくないか?

ということで GPT に聞いてみた

  1. YOLO(You Only Look Once)を使う場合
    メリット:
    YOLO はオブジェクト検出と分類を一度に行うため、高速です。
    一般的にリアルタイム処理が必要なタスク(監視カメラや自動運転など)に適しています。
    小さなオブジェクトや多数のオブジェクトが画像中に存在する場合でも、検出精度が高い。
    デメリット:
    クラス間で大きな特徴の違いがない、細かい分類が必要な場合には、CNN による分類に比べて精度が劣ることがあります。
  2. area detection + CNN による分類問題
    メリット:
    特定の領域を検出した後、CNN で細かい分類を行うことで、より高い精度を期待できる場合が多い。
    特徴の抽出やクラスの数が多い場合には、カスタマイズした CNN の方が精度が高くなることがあります。
    一つのタスクに特化した分類問題として柔軟に調整しやすい。
    デメリット:
    検出と分類を別々に行うため、全体の処理速度が遅くなる可能性がある。
    リアルタイム処理にはあまり向かない。
    判断ポイント
    高速性が重視される場合は、YOLO が適しています。
    分類精度や細かい違いを検出する必要がある場合は、area detection + CNN がより効果的です。
    最終的に、タスクの要求されるスピードと精度のバランス、そして目的に応じて選択するのが良いです。

あーなるほど、自分のタスクは似たような物体対象が多いかつ、リアルタイムじゃなかったのでそんな悪いアプローチじゃなかったのか

まとめ

OCR 系のタスクは割とアプローチの幅が広いため、しっかりゴールがなんなのかを見極めないとわけわからん方向に進みかねないと思った。

GitHubで編集を提案

Discussion