粵文 OCR 評測資料集
粵文(廣東話)有一批廣大的使用者與多元的情境,例如香港城市中的招牌、 廣告、塗鴉等。
粵文中有許多字如「冇」、「嘅」、「嘢」等,較少出現於台灣繁體中文使用中。 目前較缺乏供視覺辨識(OCR)所用之資料集,模型表現也不甚理想。此專案 旨在製作圖片資料集,將粵文字詞、語句製作成資料集,以供模型評測與訓練。
01 · 動機與目標
粵語書寫用的字,主流 OCR 沒學過。
現有資源的不足
- 影像資料集較少。 HuggingFace 上搜得到的粵語資料集有二十多個,內容都是純文字或語音, 目前未找到以影像形式提供的粵語 OCR 資料集。
- 既有評測都在測文字理解。 近年的粵語基準測試(如 CantoNLU、HKCanto-Eval)評估的是語言理解與文化知識, 視覺辨識這一塊尚未見到公開的評測基準。
-
部分粵語字連字型都缺。
我檢查了 33 個開源字型實例,
𠮶(U+20BB6)的支援數是 0。 字型都沒收錄的字,模型自然沒有機會學會。
真正棘手的其實不是罕見字,而是那些「長得很像常用字」的。
冇(沒有)和 有 只差兩筆,語義卻完全相反。
辨錯一個字,整句話的意思就顛倒了。
本專案的貢獻
- 一份可重現的粵語 OCR 資料集。 把粵語字詞、語句都製作成圖片,供模型評測與訓練使用。三層結構(單字、 詞彙、短句),涵蓋 154 個粵語特有字,固定亂數種子,同一份語料可產出 逐位元相同的結果。
- 能區分兩種失敗原因的實驗設計。 同一個字同時出現在單字層與句子層,可以分辨模型是「看不清楚」 還是「知道形狀但被語言習慣蓋過去」。
- 授權乾淨的開源生成流程。 語料與字型全部採用明確授權的來源,產出的資料集可以公開發表。
- 兩個視覺語言模型的測試分數。 提供後續研究比較的起點。
02 · 製作方式
三份語料,合成渲染,全程可重現。
- 語料:粵語維基百科、香港粵語語料庫(HKCanCor)、rime-cantonese 詞庫。三者授權都乾淨。
- 字表:從語料字頻扣掉兩岸及香港的標準字表推導出粵語特有字,再經人工複核。
- 字型:只用 SIL OFL 授權字型(昭源黑體、昭源宋體、Noto CJK、香港民間字集),共 33 個實例。
- 增強:旋轉、透視、彈性形變、筆畫粗細、模糊、雜訊、JPEG 壓縮痕跡,分四個難度等級。
- 品質檢查:渲染前檢查字型是否真的收錄該字形,渲染後檢查可讀性,避免產出「空白方框但標註寫著某字」這種汙染標註的樣本。
- 可重現:固定亂數種子,同一份語料產出逐位元相同的結果。
完整方法論、參數與驗證數據寫在 GitHub README 與 HuggingFace dataset card。
03 · 資料集內容
三層結構,同一個字跨層出現。
| 層級 | 內容 | 張數 | 相異文字 | 字數 | 測什麼 |
|---|---|---|---|---|---|
| 單字 | 粵語特有字 | 1,162 | 166 | 1 | 純字形辨識,沒有上下文可依賴 |
| 詞彙 | 含粵語字的詞 | 1,781 | 600 | 2–4 | 詞彙層辨識 |
| 短句 | 真實粵語句子 | 1,987 | 667 | 4–25 | 真實情境,語言模型先驗會介入 |
核心設計:同一個字會同時出現在「單字」和「句子」兩層。
如果模型在單字層把 冇 認對、在句子層卻讀成 有,
那就不是視覺問題,而是語言模型的先驗蓋過了實際看到的字形。
只測句子的評測分不出這兩種情況。
最小對立對
資料集刻意收錄成對的書面語對照字(有、既、左、但等)作為基準線。
沒有基準線就無法判斷模型把 冇 讀成 有
究竟是視覺問題還是語言習慣問題。以下是設計時鎖定的部分字對:
組成分布
| 面向 | 分布 |
|---|---|
| 難度 | 乾淨 1,215/輕微 1,709/中等 1,250/困難 756 |
| 單字層 Unicode 分區 | 基本區 994/擴展 A 區 28/擴展 B 區以上 140 |
| 語料來源 | rime-cantonese 1,781/字表 1,162/HKCanCor 999/維基百科 988 |
| 影像規格 | 高度 48 px,JPEG,共 41 MB |
| 每筆 metadata | 層級、難度、字型、語料來源、Unicode 分區、語料頻率、對立對標記 |
擴展區字元佔單字層 14%,遠高於自然語料中的比例。這是刻意打平長尾的結果: 按語料頻率抽樣的話,高頻字會塞滿整個評測集,而罕見字一次都不會出現。
04 · 資料集預覽
資料實際長什麼樣。
紅色標示的是粵語特有字。可依層級、難度篩選,或只看擴展區(Unicode Extension) 字元與最小對立對(minimal pair)。
05 · 評測結果
模型在粵語字上的表現。
瀏覽全部 9,860 筆評測結果 →兩個同為 4B 參數的視覺語言模型,在 NVIDIA L40S 上以相同 prompt 與解碼參數跑完整 4,930 張。指標採 OCR 慣例:CER(字元錯誤率,越低越好)、 ACC(整句完全正確率)、1−NED(正規化編輯相似度)。
- CER
- 字元錯誤率。把模型答案跟正確答案逐字比對,錯的字元佔全部字元的比例。 100 個字錯 30 個就是 30%,數字越低代表認得越準。
- ACC
- 整句正確率。整行文字要一字不漏、一字不錯才算對,錯一個字整行就算不對, 所以通常比「1 減 CER」看起來嚴格很多。
- 1−NED
- 正規化編輯相似度。概念跟 CER 接近,但抵消了文字長度的影響,短句和長句 比較起來更公平,是 OCR 競賽(ICDAR)慣用的指標,數字越高越好。
- 分層 ACC
- 同一種整句正確率,只是分開只算「一個字」「一個詞」「一句話」或 「Unicode 擴展區罕見字」這幾種樣本,看模型在哪種情境比較容易出錯。
| 模型 | CER ↓ | ACC ↑ | 1−NED ↑ | 單字層 ACC | 短句層 ACC | 擴展區字 ACC |
|---|---|---|---|---|---|---|
| Qwen3-VL 4B | 70.1% | 17.5% | 30.0% | 16.7% | 5.7% | 0.0% |
| InternVL3.5 4B | 34.1% | 29.3% | 66.4% | 25.6% | 20.9% | 0.0% |
完整 4,930 張影像 × 2 個模型,共 9,860 筆,全數成功執行,無失敗樣本。
觀察
- 兩個模型在擴展區字(168 張樣本)上正確率都是 0%,字形完全認不出來。
粵語常用字也有類似分化:
冇單字層兩個模型都是 0/7 全錯, 句子層依然接近 0%(InternVL3.5 0/99、Qwen3-VL 7/99),上下文救不回來, 是純粹的視覺辨識失敗。但嘅同樣單字層 0/7,句子層卻回升到 三成多(InternVL3.5),代表模型雖然認不出這個字的形狀,卻能靠語言記憶 把常見虛詞「猜」回來。同一種視覺缺陷會不會被語言先驗補償,因字而異。 - 兩個模型的錯法也不一樣。單字層測
冇時,Qwen3-VL 每次給的 答案都不同(渡、浸、侵……),像是在瞎猜;InternVL3.5 幾乎每次都固定 回答同一個形近字,錯得有規律。這代表 InternVL3.5 的失敗更像是「認錯字」 而不是「認不出字」——一致性的錯誤,理論上比隨機亂猜更容易靠額外訓練 資料修正回來。 - 整句正確率並不是隨文字變長單調下降。以 InternVL3.5 為例,單字層 25.6%、 詞彙層卻回升到 41.1%、短句層再降到 20.9%——詞彙層反而是三層裡最高的。 推測是 2–4 字的常見詞組合能給模型一個可以辨認的固定搭配,孤立的單一 字形反而沒有這種線索;但句子一長,累積出錯的機會也跟著變多,ACC 自然被拉低。
06 · 未來展望
合成資料只是起點。
- 真實影像評測集。合成資料無法取代真實場景。下一步是蒐集香港街景招牌、餐牌、報紙,人工校對成一個小型真實評測集。
- 訓練集與微調驗證。把規模拉大到足以微調,然後實測「用了合成資料的模型,在真實粵語影像上有沒有變好」。沒有這一步,合成資料集的價值就只停留在推測。
- 直排與手寫。香港招牌大量使用直排,目前只有橫排。手寫則卡在粵語手寫字型幾乎不存在。