synthonly-ja-str-6m-202611:合成データだけで学習した日本語文字列認識モデル
日本語の文字列画像(1 行の切り出し)を読む、約 600 万パラメータの文字認識モデルです。
学習データは合成だけです。 実際の撮影画像や実際の手書きは学習に使っていません。
読める対象: 看板、レシート、紙面などの印刷文字と、手書き文字です。横書きも縦書きも読めます。
JaWildText の test での結果: 次のとおり、実データで学習した NDLOCR-Lite を上回りました。
対象 このモデル NDLOCR-Lite board+receipt の合算 81.0% 70.6% 手書き行(CER) **32.7%**(12.4) 30.0%(15.9) 速度: CPU 1 スレッドで 1 行あたり約 19 ms です。
概要
| 項目 | 内容 |
|---|---|
| タスク | 文字列認識(切り出した 1 行の画像 → 文字列)。日本語とラテン文字、横書きと縦書き |
| パラメータ数 | 6.00M |
| 速度 | CPU 1 スレッド、バッチ 1、前処理込みで 1 行あたり約 19 ms(Apple M シリーズ) |
使い方
pip install torch numpy opencv-python-headless safetensors
python synthonly_infer/recognize.py --model . crop1.jpg crop2.png
import sys
sys.path.insert(0, "synthonly_infer")
from recognize import Recognizer
rec = Recognizer(".", device="cpu") # または "cuda"
print(rec(["crop.jpg"])) # パス、エンコード済み画像のバイト列、RGB uint8 配列のいずれか
synthonly_infer/には、推論に必要な最小限のコードだけを入れてあります。上記のパッケージ以外に依存はありません。- 入力は 1 行分の切り出し画像にしてください。このモデルは文字の検出をしません。
- 出力できるのは、
charset.txtにある 7,090 文字です。最大 50 文字まで出力します。 - 出力は次の正規形で、空白は含みません。
- NFKC 正規化のうえ、空白を除きます。
- ダッシュ類は
-、波ダッシュ類は~、中点類は・、曲がった引用符は'/"にそろえます。 - 分離した濁点・半濁点は合成します。
学習
データ
学習データはすべて合成です。
- 印刷文字:
- 1,910 個のフォントファイル(OFL / Apache / IPA)で描画しています。
- 看板、レシート、値札、紙面、LED、7 セグなどのさまざまな場面のテンプレートを使っています。
- 手書き文字:
- 漢字のストロークデータを、書き手ごとの癖のモデルで変形して合成しています。
- 筆記具は、ボールペン、鉛筆、サインペン、マーカー、タブレットのペンを模しています。
- 紙はノートの罫線や方眼です。
- 手書きの撮影条件: 白地に極細のデジタルインクで書いた行や、ノートを撮影した写真のように暗め・ぼけ気味・暖色に仕上げた行も含みます。
- 文の出所: 青空文庫、Tatoeba、辞書・統計データ由来の固有名詞、価格・日付などのテンプレート、英単語などです。
JaWildText は評価にだけ使い、学習には使っていません。
評価
評価の方法(JaWildText)
- 評価データは JaWildText(Apache-2.0)の test です。行はポリゴンから補正して切り出しました。
- 分割は、board / receipt では画像のハッシュ単位、手書きでは書き手単位です。
- 正解率は、上記の正規化後の完全一致(行単位)です。
- 95% 信頼区間は、board / receipt では画像単位、手書きでは書き手単位、英語では行単位のブートストラップで求めました。
JaWildText の結果
| test セット | 行数 | 正解率 | 1−NED | CER |
|---|---|---|---|---|
| board | 21,671 | 76.18 [74.12, 78.16] | 90.94 | 8.09 |
| receipt | 36,098 | 83.94 [83.26, 84.61] | 94.44 | 10.16 |
| board+receipt(合算) | 57,769 | 81.03 [80.13, 81.93] | 93.13 | 9.20 |
| 手書き | 4,087 | 32.66 [30.65, 34.70] | 88.66 | 12.42 |
英語ベンチマーク
英語ベンチマークは、大文字小文字を区別しない英数字 36 文字での正解率です(PARSeq の評価方法)。
| IIIT5k | SVT | IC13 (1015) | IC15 (2077) | SVTP | CUTE80 | 合算(7,672 行) |
|---|---|---|---|---|---|---|
| 90.60 | 84.39 | 90.34 | 67.40 | 71.32 | 81.25 | 81.79 |
ほかのモデルとの比較
同じ test の切り出し画像で比べました。
| モデル | パラメータ数 | 学習データ | board+receipt | 手書き 正解率 / CER | 英語(合算) |
|---|---|---|---|---|---|
| このモデル | 6.0M | 合成、2,200 万サンプル | 81.03 | 32.66 / 12.4 | 81.79 |
| NDLOCR-Lite | 8.8–9.8M | 実データ | 70.57 | 30.02 / 15.9 | 67.70 |
- NDLOCR-Lite: バックスラッシュとして出力される ¥ は、¥ に戻して評価しています。
制限事項
- 1 行のみ。 入力は切り出した 1 行の画像にしてください。50 文字を超える行は出力できません。極端に長い画像は幅 768 px に縮められます。
- 向き。 文字が約 45° 以上傾いた画像や、上下が逆の画像は誤読します。自動で回転するのは縦長の画像だけで、反時計回りに 90° 回します。
- 手書き。 印刷文字に比べると、まだ大きく劣ります。とくに苦手なのは次のものです。
- 崩し字や乱れた字;
- 手書きのラテン文字、ギリシャ文字、数式。
- 英語。 英語専用のモデルには及びません。学習データに占める英語は約 7% です。
- 文字集合。 7,090 文字にない文字は出力できません。JIS 第 2 水準を超える漢字や絵文字がこれに当たります。
ライセンス
このリポジトリ(重みと同梱コード)は CC BY 4.0(Creative Commons Attribution 4.0 International)で提供します。
- 利用、改変、再配布は、商用を含めて自由です。
- 配布や公開の際は、出典としてこのリポジトリを表示してください。
合成データの元にした素材
| 素材 | 用途 | ライセンス | 表示 |
|---|---|---|---|
| フォント 1,910 ファイル(OFL-1.1:1,864、Apache-2.0:44、IPA:2) | 文字の描画 | SIL OFL 1.1 / Apache-2.0 / IPA フォントライセンス | フォントで描画した画像はフォントによる成果物で、OFL の条件は及びません |
| KanjiVG(r20260714) | 手書き文字の合成 | CC BY-SA 3.0 | Copyright (C) 2009-2026 Ulrich Apel, https://kanjivg.tagaini.net/ |
| Poly Haven、ambientCG のテクスチャ | 背景 | CC0-1.0 | — |
| PD12M の写真 | 背景 | CC0-1.0 / Public Domain Mark | — |
| 青空文庫のパブリックドメイン作品(globis-university/aozorabunko-clean 経由) | 文 | CC BY 4.0(作品自体はパブリックドメイン) | 青空文庫(aozora.gr.jp)、globis-university/aozorabunko-clean |
| Tatoeba(日本語・英語の文、英単語の頻度) | 文、英単語 | CC BY 2.0 FR | Tatoeba(tatoeba.org)の投稿者 |
| dwyl/english-words | 英単語 | Unlicense | — |
| SudachiDict(small+core。UniDic、NEologd の一部を含む) | 人名、地名、名詞、カタカナ語 | Apache-2.0(UniDic 部分は BSD-3-Clause) | Works Applications、UniDic コンソーシアム、NEologd |
| 国土数値情報(鉄道データ)N02 2024 | 駅名、路線名、事業者名 | CC BY 4.0 | 「国土数値情報(鉄道データ)」(国土交通省)を加工して作成 |
| 国税庁法人番号公表サイト | 会社名、市区町村名、町名 | 公共データ利用規約 第1.0版(PDL 1.0) | 出典:国税庁法人番号公表サイト(国税庁)を加工して作成 |
| レシートの語彙、テンプレート、記号 | 文のテンプレート | 本プロジェクトで作成 | — |
ファイル
| ファイル | 内容 |
|---|---|
model.safetensors |
モデルの重み(fp32) |
config.json |
推論に使う設定 |
charset.txt |
出力の 7,090 文字を ID 順に並べたもの(ID は行番号、0 は系列の終わり) |
synthonly_infer/ |
推論用の最小限のコード(recognize.py ほか) |
- Downloads last month
- 26