どうも、こんにちは。
このブログは完全に私の趣味で色々なPythonコードを書いて楽しんだりしている「なんちゃって技術ブログ」なのですが。。。
新しい記事のネタに新しい OCR をテストして記事にしようと思っていたら、気付いたら5モデルを比較しておりましたので、その内容を書かせていただきます。
以前、EasyOCR で日本語を読ませるという内容で記事を書かせて。あれから時間が経って「最近は GOT-OCR2.0 という新しい OCR がある」「LLM に画像を渡せばそれっぽく OCR してくれるらしい」という話を聞き、せっかくなら同じ画像を全部に食わせて並べたら面白いのでは、と思い立ったのが始まりです。
本記事では、5モデルそれぞれに同じ4枚の画像を食わせた結果と、最終的にどれが今回の比較で一番精度が高かったか、を順に書いていきます。
本記事で使用するモデル
OCR を「専用モデル」と「VLM(汎用マルチモーダル)」に分け、現代的な選択肢を1つずつ並べました。
| モデル | 種類 | サイズ | 実行場所 |
|---|---|---|---|
| EasyOCR | OCR 専用(CRNN系・旧世代) | ~500MB | ローカル |
| GOT-OCR2.0 | OCR 専用(end-to-end Transformer・新世代) | ~2GB | ローカル |
| Qwen2.5-VL-3B-Instruct | VLM(汎用マルチモーダル) | ~7GB | ローカル |
| Florence-2-large | VLM(軽量・タスクトークン式) | ~1.6GB | ローカル |
| Gemini 2.5 Flash-Lite | VLM(クラウドAPI) | API経由 | クラウド |
ローカル実行 4 つに、クラウド経由の Gemini を1つ加えた構成です。今回は Mac (Apple Silicon) で CPU を使って動かしました。
環境を準備する
Python 3.9 の venv に必要なパッケージを入れます。
python3 -m venv .venv
source .venv/bin/activate
pip install torch transformers easyocr qwen-vl-utils einops timm google-genai pillow python-dotenvこれで5モデル全部動きます。それぞれのモデル DL は初回のみで、合計で 10GB ほどダウンロードされます(Qwen2.5-VL-3B が一番大きい)。Gemini は API キーを GEMINI_API_KEY 環境変数にセットするだけ。
各モデルを呼び出すコードはどれもこんな感じで、画像を渡してテキストを受け取るだけのシンプルな形にしました(共通部分は省略)。
import easyocr
reader = easyocr.Reader(["ja", "en"], gpu=False)
detections = reader.readtext("image.png")
text = "\n".join(text for _, text, _ in detections)
print(text)from transformers import AutoModelForImageTextToText, AutoProcessor
model_id = "stepfun-ai/GOT-OCR-2.0-hf"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(model_id).eval().to("mps")
inputs = processor("image.png", return_tensors="pt").to("mps")
ids = model.generate(**inputs, tokenizer=processor.tokenizer, max_new_tokens=4096)
print(processor.decode(ids[0, inputs["input_ids"].shape
:], skip_special_tokens=True))import os
import PIL.Image
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
image = PIL.Image.open("image.png")
response = client.models.generate_content(
model="gemini-2.5-flash-lite",
contents=[image, "画像内のすべての文字を書き起こしてください。"],
)
print(response.text)Qwen2.5-VL と Florence-2 のスクリプトもほぼ同じ流れですが、prompt の渡し方が独特なので末尾の「ハマりポイント」で触れます。
テスト画像(4種類)
OCR の得意・不得意が見えるよう、性質の違う4枚を用意しました。
- 手書き風(leter.png): 「空とひこうき / あいうえお / アイウエオ / ABCDEFG / 123456789」など、ひらがな・カタカナ・英字・数字が全部入っているクリーン画像。前回の EasyOCR 記事で使ったのと同じ素材
- 活字日本語文書(sample_doc.png): 夏目漱石「吾輩は猫である」の冒頭を PIL で描画。明治期表記の「生れた」「始めて」や、難読字「獰悪」を含む
- 実写真の標識(pexels_tokyo_streetsign.jpg): 東京・築地周辺の街路標識(Pexels のフリー素材)。漢字・英字・数字が混在し、看板に貼られたステッカーがノイズ
- 筆字の看板(pexels_takayama_sign.jpg): 高山の伝統的な木製看板(Pexels)。「アンティーク/ギャラリー/京染」「加」「家」が筆字で書かれている
サンプル①:手書き風 (leter.png)

もっとも素直な「クリーンな手書き風」入力。背景は白、文字は黒。ひらがな・カタカナ・英字・数字を含んだ12要素。
| モデル | 出力 | 正解数 | 備考 |
|---|---|---|---|
| EasyOCR | 空とひこうき 花とちょうちょ あいうえお あいうえお アイウエオ アイウエオ ABCPEFG ABCDEFG 123456789 123456789 | 11/12 | ABCDEFG の D を P と1箇所誤読 |
| GOT-OCR2.0 | P个工才 ABCDEFG ABCDEFG 123456789 123456789 | 4/12 | ひらがな全行を黙殺。カタカナ「アイウエオ」が「P个工才」(簡体字「个」混入) |
| Qwen2.5-VL | 空とひこうき 花とちょうちょ あいうえお あいうえお アイウエオ アイウエオ ABCDEFG ABCDEFG 123456789 123456789 | 12/12 | 左右の列構造もそのまま再現 |
| Florence-2 | をしいここうえ をとおけけうけ あいうみけら あしいうとけっ Pイタエオ Pパタエイオ ABCDEFG ABCDEFG ABCDFG 123456789 1234567789 | 2/12 | 「ABCDFG」という存在しない行を生成、数字も「1234567789」と誤読 |
| Gemini 2.5 | 空とひこうき あいうえお アイウエオ ABCDEFG 123456789 花とちょうちょ あいうえお アイウエオ ABCDEFG 123456789 | 12/12 | 列ごとに縦読みして出力 |
素直なクリーン画像でこの差。GOT-OCR2.0 がひらがな・カタカナ系を弱いのは、学習データが英語・中国語中心だからと思われます。Qwen と Gemini は満点で、しかもレイアウト(左右の列対応)まで保持してきたのが印象的でした。
サンプル②:活字日本語文書 (sample_doc.png)

夏目漱石の冒頭文をフォントで描画。完全にPCの綺麗な文字です。明治期の表記(「生れた」「始めて」)や、難読字「獰悪」が含まれているのがポイント。
| モデル | 出力 | 評価 | 備考 |
|---|---|---|---|
| EasyOCR | 吾肇は猫である。 名前はまだ無い。 どこで生れたかとんと見当がつかぬ 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。 吾肇はここで始めて人間というものを見た。 しかもあとで聞くとそれは書生という人間中で ~番擦悪な種族であったそうだ。 夏目瀬石 『吾葦は猫である』 より (青空文庫) | 約85% | 「輩」を「肇」「葦」と誤読(3箇所)、「漱石」→「瀬石」、「獰悪」→「擦悪」 |
| GOT-OCR2.0 | 吾華猫。名前無。 何薄暗所泣記憶 吾華始人間の見。 間生人間中 一番磨種族。 夏目漱石吾華猫(青空文库) | 破壊的 | ひらがな・助詞をほぼ全部消去して漢字だけ抜き出し、「青空文庫」→「青空文库」と簡体字化 |
| Qwen2.5-VL | 以下は、画像内のすべての文字を書き起こしたものです: 吾輩は猫である。名前はまだ無い。 どこで生まれたかとんと見当がつかぬ。 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。 吾輩はここで初めて人間というものを見た。 しかもあとで聞くとそれは書生という人間中で 一番癡悪な種族であったそうだ。 ——夏目漱石『吾輩は猫である』より(青空文庫) | ほぼ完璧 | 「生れた」→「生まれた」「始めて」→「初めて」と現代表記に正規化、「獰悪」を「癡悪」と誤変換、前置きが付いてくる |
| Florence-2 | 日本は時である。 第前はまただ記い。 とこできれたかかととと時がかかかけけ。 本でもも時にいいいしゃしただででーニーーー二二ついていたを時を放けはけにしている。 日用はここでお約ので人山にいるおけのをままた。 しかもももとでくとれはは生きれはといけいおいごが設計で 一時間を書時代をおっただけただ。 一日日第は「日間は曼時はおゃうける」とり (日定社) (无定目) | 壊滅 | 完全に意味不明な日本語を返してきて壊滅 |
| Gemini 2.5 | 吾輩は猫である。名前はまだ無い。 どこで生まれたかとんと見当がつかぬ。 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。 吾輩はここで始めて人間というものを見た。 しかもあとで聞くとそれは書生という人間中で 一番獰悪な種族であったそうだ。 ―― 夏目漱石『吾輩は猫である』より (青空文庫) | ほぼ完璧 | 「生れた」→「生まれた」の正規化は Qwen と同じだが、「獰悪」は正しく読み取った |
このサンプルが一番それぞれの性能がよくわかるかなって個人的に思いました。
PCで出力かつ標準的な文字なので、綺麗な文字の画像なので。
GOT-OCR2.0 が「吾輩は猫である」を「吾華猫」とだけ返したときは画面の前で固まりました。日本語の助詞・ひらがなを消して漢字だけ抜き出すのは、おそらく中国語向けの学習バイアスが強いせいで、日本語ドキュメントには使い物にならない、というのが見えた瞬間です。
逆に Qwen と Gemini は「画像を読む」というより「画像を理解して書き写す」動きをしていて、明治期の旧表記を勝手に現代表記に置き換えてきました。これは VLM 特有のクセで、「OCR としては正確さが下がる」とも言えるし「読みやすい現代日本語に直してくれる」とも言える。
Gemini は「獰悪」のような難読字を Qwen より正確に読み取っていたのも興味深い差でした。
サンプル③:実写真の標識 (pexels_tokyo_streetsign.jpg)

「聖路加国際病院 / 築地本願寺 / 東京中央卸売市」の3段の街路標識。日英混在で、看板の表面に小さなステッカー(「TETO STEW PHEAR」「OVER HERE」など)が貼られているのがノイズになります。
| モデル | 出力 | 評価 | 備考 |
|---|---|---|---|
| EasyOCR | 聖路加国際病院 ST LUKES INTERNATIONAL HOSP 6oom 繁地本願寺 TSUKIJI HONGANJ 12Om TET@ 5TEW1 心o3 に町河 東京中央卸売市 350ぐ TTSuKWJI MKET 上町* PYAT [隊 | 誤読+ノイズ大量 | 「築地」→「繁地」、「m」を「o」「ぐ」と誤読。ステッカーも全部拾う |
| GOT-OCR2.0 | 聖路加国際病院 ST.LUKESINTERNATIONALHOSP.6OOm 築地本寺 TSUKIJI HONGANJ 120m TETC 东京中央卸壳市 STEW1 东京市 350m T SUKIJI MARKET OVER HERE PAYAT | 簡体字化 | 「東京中央卸売市」を「东京中央卸壳市」と簡体字化。ステッカーも拾う |
| Qwen2.5-VL | + 聖路加國際病院 ST. LUKE’S INTERNATIONAL HOSP. 600m 築地本願寺 TSUKIJI HONGANJ 120m 東京中央卸売市場 350m TSUKIJI MARKET OVER EK SHUT UP HERE FISH GUNA PAYAT | 旧字化+補完癖 | 「願」も含めて読めているが、「国際」を「國際」と旧字化、「卸売市」に「場」を補完。ステッカーは1行に纏めて拾う |
| Florence-2 | 山展力可国際清酒店 ST. LUKES INTERNATIONAL HOSP. 600m 美國國大酸酷 KAT TSUKIJI HONGANJ. 120m TETC 米安中可自動致行 STEWI NO1% PHEAR SHUT 350m TSUKIJI MARKET OVER HERE EK* PAYAT | 中国語化 | 「山展力可国際清酒店」など、漢字を中国語に化けさせて壊滅 |
| Gemini 2.5 | 聖路加国際病院 ST. LUKE’S INTERNATIONAL HOSP. 600m 築地本願寺 TSUKIJI HONGANJI. 120m 東京中央卸売市場 350m TSUKIJI MARKET | クリーン出力 | 看板本文だけクリーンに出力、ステッカー類は完全に無視。HONGANJI の「I」も拾う |
実写真は実用に近いシナリオで、ここで Gemini の「画像を意味で理解して、看板内容とノイズを区別できる」挙動が際立ちました。「これは看板に貼られたただのステッカーで本文ではない」と判別して落としてくれているのは、純粋な OCR にはできない芸当です。
Qwen は「卸売市場」と語尾を補完したり「国際」を「國際」と旧字に変えたりと、言語モデル的な再生成のクセが出ました。OCR としての厳密さでは Gemini に一歩譲る感じです。
サンプル④:筆字の看板 (pexels_takayama_sign.jpg)

高山の伝統的な木製看板で、上から「アンティーク/ギャラリー/京染」「加」「家」(筆字、崩し字)。OCR にとって最難クラスのサンプルです。
| モデル | 出力 | 正解数 | 備考 |
|---|---|---|---|
| EasyOCR | 観 う 加 阿 | 1/5 | 上段の縦書き3列を取りこぼし、「家」を「阿」と誤読 |
| GOT-OCR2.0 | 京染 加 | 2/5 | 控えめに正解だけ返す(「家」「アンティーク」「ギャラリー」は黙殺) |
| Qwen2.5-VL | 京染 アソニーティーク ギャラリー 加 屋 | 4/5 | 「アンティーク」を「アソニーティーク」と誤読、「家」を「屋」と誤読 |
| Florence-2 | おお | 0/5 | 2文字だけで完全沈黙 |
| Gemini 2.5 | 京染 ギャラリー アンティーク 加 夜 | 4/5 | 「家」のみ「夜」と誤読、上段の縦書き3列も含めて読み取り |
筆字「家」を最終的にどう読んだかが、5モデルでバラバラに分かれたのが面白い結果です。
- EasyOCR:阿
- GOT-OCR2.0:(黙殺)
- Qwen2.5-VL:屋
- Florence-2:(読まず)
- Gemini 2.5:夜
誰一人「家」と読まなかったので、これは元の筆字がそもそも難しい字なのだと思います。それでも Gemini は上段の「アンティーク」「ギャラリー」「京染」を全部正確に読んでいて、筆字に対する地力の差が出ました。
5モデル × 4画像の総合比較
| 画像 | EasyOCR | GOT-OCR2 | Qwen2.5-VL | Florence-2 | Gemini 2.5 |
|---|---|---|---|---|---|
| 手書き風 | 11/12 | 4/12 | 12/12 | 2/12 + 幻覚 | 12/12 |
| 活字日本語文書 | ~85% | ひらがな全消去・簡体字化 | ほぼ完璧(正規化癖) | 壊滅 | ほぼ完璧 |
| 実写真の標識 | 漢字誤読+ノイズ | 簡体字化 | 旧字化+ステッカー混入 | 中国語化壊滅 | クリーン出力 |
| 筆字看板 | 1/4 | 2/4 | 4/5 | 1/5 | 5/5(家のみ誤読) |
この5モデル × 4画像で見えてきた性格差をまとめると、こうなりました。
- EasyOCR:堅実なベースライン。日本語のひらがなは保持してくれて、漢字を時々誤読する程度。実写真のノイズには弱い
- GOT-OCR2.0:日本語ドキュメントとは相性が悪い。ひらがなを消し、漢字を簡体字化してしまう。英字・数字は正確
- Qwen2.5-VL:日本語に強い。ただし VLM 的に「読む」より「書き直す」動きをするので、旧字を現代表記に正規化したり語尾を補完したりするクセがある
- Florence-2:日本語にはほぼ未対応の挙動。英語ベンチマークで強くても、日本語タスクで使うのは厳しい
- Gemini 2.5 Flash-Lite:4枚すべてで一番精度が高かった。難読字を正確に、ノイズを賢く除外してくる。API 課金とクラウド送信の制約はあるが、その代わり手元の作業が一番楽だった
使い分けのおすすめ(個人的な感想)
- とりあえず一番精度が高いのを使いたい → Gemini 2.5 Flash-Lite。今回の比較では4枚すべてで一番きれいに読めた
- 機密データでクラウドに送れない → Qwen2.5-VL。ローカル VLM の中では日本語に一番強い
- 軽く試したい・オフライン必須 → EasyOCR で十分。インストールも軽く動作も安定
- GOT-OCR2.0 と Florence-2:日本語タスクには現状おすすめしにくい。英語や数式・楽譜などの専門用途では別の強みがあるかもしれない
まとめ
新しい OCR 専用モデルや軽量 VLM をいろいろ試してみたんですが、結局のところ4枚すべてで一番きれいに読めたのは Gemini 2.5 Flash-Lite でした。とくに、看板に貼られたステッカーを「これはノイズ」と判別して除外してきたり、明治期の難読字「獰悪」を正しく読んだりと、文字を1個ずつ認識するというより画像全体を意味で理解した上で書き起こしている感じが、そのまま OCR の精度に効いているようでした。
API 課金とクラウドにデータを送る制約はあるので、機密性が高いデータでは Qwen2.5-VL がローカル代替の第一候補になりそうです。EasyOCR から始めて、新しいモデルを試したい人には、Gemini と Qwen2.5-VL の2つに絞って試してみるのを推したい、というのが今回の感想でした。
