粵文 OCR 評測資料集

粵文(廣東話)有一批廣大的使用者與多元的情境,例如香港城市中的招牌、 廣告、塗鴉等。

粵文中有許多字如「冇」、「嘅」、「嘢」等,較少出現於台灣繁體中文使用中。 目前較缺乏供視覺辨識(OCR)所用之資料集,模型表現也不甚理想。此專案 旨在製作圖片資料集,將粵文字詞、語句製作成資料集,以供模型評測與訓練。

HuggingFace ↗ GitHub ↗ CC BY-SA 4.0 MIT 4,930 張

01 · 動機與目標

粵語書寫用的字,主流 OCR 沒學過。

現有資源的不足

  • 影像資料集較少。 HuggingFace 上搜得到的粵語資料集有二十多個,內容都是純文字或語音, 目前未找到以影像形式提供的粵語 OCR 資料集。
  • 既有評測都在測文字理解。 近年的粵語基準測試(如 CantoNLU、HKCanto-Eval)評估的是語言理解與文化知識, 視覺辨識這一塊尚未見到公開的評測基準。
  • 部分粵語字連字型都缺。 我檢查了 33 個開源字型實例,𠮶(U+20BB6)的支援數是 0。 字型都沒收錄的字,模型自然沒有機會學會。

真正棘手的其實不是罕見字,而是那些「長得很像常用字」的。 (沒有)和 只差兩筆,語義卻完全相反。 辨錯一個字,整句話的意思就顛倒了。

本專案的貢獻

  • 一份可重現的粵語 OCR 資料集。 把粵語字詞、語句都製作成圖片,供模型評測與訓練使用。三層結構(單字、 詞彙、短句),涵蓋 154 個粵語特有字,固定亂數種子,同一份語料可產出 逐位元相同的結果。
  • 能區分兩種失敗原因的實驗設計。 同一個字同時出現在單字層與句子層,可以分辨模型是「看不清楚」 還是「知道形狀但被語言習慣蓋過去」。
  • 授權乾淨的開源生成流程。 語料與字型全部採用明確授權的來源,產出的資料集可以公開發表。
  • 兩個視覺語言模型的測試分數。 提供後續研究比較的起點。

02 · 製作方式

三份語料,合成渲染,全程可重現。

  • 語料:粵語維基百科、香港粵語語料庫(HKCanCor)、rime-cantonese 詞庫。三者授權都乾淨。
  • 字表:從語料字頻扣掉兩岸及香港的標準字表推導出粵語特有字,再經人工複核。
  • 字型:只用 SIL OFL 授權字型(昭源黑體、昭源宋體、Noto CJK、香港民間字集),共 33 個實例。
  • 增強:旋轉、透視、彈性形變、筆畫粗細、模糊、雜訊、JPEG 壓縮痕跡,分四個難度等級。
  • 品質檢查:渲染前檢查字型是否真的收錄該字形,渲染後檢查可讀性,避免產出「空白方框但標註寫著某字」這種汙染標註的樣本。
  • 可重現:固定亂數種子,同一份語料產出逐位元相同的結果。

完整方法論、參數與驗證數據寫在 GitHub READMEHuggingFace dataset card

03 · 資料集內容

三層結構,同一個字跨層出現。

4,930
影像
1,433
相異文字
154
粵語特有字
33
字型實例
41 MB
總容量
層級內容張數 相異文字字數測什麼
單字粵語特有字 1,1621661 純字形辨識,沒有上下文可依賴
詞彙含粵語字的詞 1,7816002–4 詞彙層辨識
短句真實粵語句子 1,9876674–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 · 未來展望

合成資料只是起點。

  • 真實影像評測集。合成資料無法取代真實場景。下一步是蒐集香港街景招牌、餐牌、報紙,人工校對成一個小型真實評測集。
  • 訓練集與微調驗證。把規模拉大到足以微調,然後實測「用了合成資料的模型,在真實粵語影像上有沒有變好」。沒有這一步,合成資料集的價值就只停留在推測。
  • 直排與手寫。香港招牌大量使用直排,目前只有橫排。手寫則卡在粵語手寫字型幾乎不存在。
English