做现代汉字 OCR,随便拉一个开源模型就能跑出 95% 以上的准确率。但把同样的模型扔到甲骨文拓片上,识别率直接跌到不可用的程度——字形变异大、样本稀缺、标注门槛极高,古文字 OCR 长期处于"各家自建小数据集、互相无法对比"的碎片状态。Chronicles-OCR 的出现,第一次给这个领域搭了一个统一的考场。
"七体之变":覆盖汉字演化的完整链条
Chronicles-OCR 最核心的卖点不是数据量,而是演化覆盖的完整性。汉字从甲骨文到今天楷书,经历了七次重大书体演变——甲骨文、金文、篆书、隶书、草书、行书、楷书。此前古文字 OCR 评测往往只覆盖单一书体(比如只做甲骨文),模型能力只能在一个窄切片上评估,无法回答"模型对字形演化规律的泛化能力如何"这个问题。
Chronicles-OCR 把七体全部纳入评测,意味着你可以直接测量:
- 模型在早期象形文字(甲骨、金文)上的识别底线在哪;
- 从篆书到隶书这条"隶变"关键转折上,模型是否捕捉到了结构简化规律;
- 同一个字在不同书体间的跨体识别能力。
这种纵向评测维度,是此前任何基准都不提供的。
数据来源:每个书体都由专业实验室背书
古文字标注不是找几个实习生就能干的活。一个甲骨文字形的释读,可能需要甲骨文研究者多年论证。Chronicles-OCR 的数据来源直接对接了国内最硬核的专业团队:
| 书体 | 数据来源 |
|---|---|
| 甲骨文 | 安阳师范学院甲骨文信息处理重点实验室 |
| 金文、篆书 | 中科院信工所 + 古文字学专家团队 |
| 隶书、草书、行书、楷书 | 南开大学 + SSV 数字文化实验室 |
腾讯混元和 SSV 技术架构部负责工程化与评测框架搭建。这种"专业释读 + 工程封装"的组合,保证了标注质量不会成为短板。
实操:用 Chronicles-OCR 跑一次古文字识别评测
基准开源后,最自然的起点是下载数据集、跑一遍 baseline 模型看得分。下面给出一个可复用的评测流程示例。
1. 下载与解压数据集
假设数据集已在 GitHub 或 Hugging Face 上发布(仓库地址以实际开源页面为准):
# 从 Hugging Face 下载(示例,请替换为实际 repo id)
pip install huggingface_hub
huggingface-cli download Tencent/Chronicles-OCR \
--repo-type dataset \
--local-dir ./chronicles_ocr_data \
--local-dir-use-symlinks False
# 查看数据目录结构
tree ./chronicles_ocr_data -L 2
预期目录结构大致如下:
chronicles_ocr_data/
├── oracle/ # 甲骨文
├── bronze/ # 金文
├── seal/ # 篆书
├── clerical/ # 隶书
├── cursive/ # 草书
├── semi_cursive/ # 行书
├── regular/ # 楷书
└── annotations/ # 标注文件(JSON/CSV)
2. 加载标注并可视化样本
import json
from pathlib import Path
import matplotlib.pyplot as plt
from PIL import Image
DATA_ROOT = Path("./chronicles_ocr_data")
def load_annotations(script_name: str):
"""加载某一书体的标注文件"""
ann_path = DATA_ROOT / "annotations" / f"{script_name}.json"
with open(ann_path, "r", encoding="utf-8") as f:
return json.load(f)
def show_sample(script_name: str, idx: int = 0):
"""可视化单条样本:原图 + 标注字形 + 现代对应字"""
ann = load_annotations(script_name)
sample = ann[idx]
img_path = DATA_ROOT / script_name / sample["image_file"]
img = Image.open(img_path)
fig, ax = plt.subplots(1, 1, figsize=(4, 4))
ax.imshow(img)
ax.set_title(
f"书体: {script_name} | 释读: {sample['modern_char']} | "
f"原始编号: {sample['char_id']}",
fontsize=10
)
ax.axis("off")
plt.tight_layout()
plt.savefig(f"sample_{script_name}_{idx}.png", dpi=150)
plt.show()
# 示例:查看甲骨文第一条样本
show_sample("oracle", idx=0)
注意:以上字段名(
image_file、modern_char、char_id)为合理推测,实际格式以仓库文档为准,使用前请核对 annotations JSON 的真实 key。
3. 用 PaddleOCR 跑 baseline 并计算准确率
选 PaddleOCR 作为 baseline,因为它对中文支持成熟且开箱即用:
pip install paddleocr paddlepaddle
from paddleocr import PaddleOCR
from pathlib import Path
import json
from collections import defaultdict
# 初始化 OCR 引擎(使用中文模型)
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
DATA_ROOT = Path("./chronicles_ocr_data")
def evaluate_script(script_name: str):
"""对某一书体跑 OCR,逐条比对标注"""
ann = load_annotations(script_name)
correct = 0
total = len(ann)
for sample in ann:
img_path = str(DATA_ROOT / script_name / sample["image_file"])
result = ocr.ocr(img_path, cls=True)
# 提取 OCR 识别文本
recognized_chars = []
for line in result[0]:
recognized_chars.append(line[1][0])
# 简化比对:OCR 结果中是否包含目标现代字
target = sample["modern_char"]
if target in recognized_chars:
correct += 1
acc = correct / total if total > 0 else 0
return {"script": script_name, "total": total, "correct": correct, "accuracy": acc}
# 七体全跑
scripts = ["oracle", "bronze", "seal", "clerical",
"cursive", "semi_cursive", "regular"]
results = []
for s in scripts:
r = evaluate_script(s)
results.append(r)
print(f"{r['script']}: {r['accuracy']:.2%} ({r['correct']}/{r['total']})")
# 输出对比表
print("\n=== 七体识别准确率对比 ===")
for r in results:
print(f" {r['script']:15s} {r['accuracy']:.2%}")
这段代码的核心逻辑很简单:拿通用中文 OCR 模型直接跑七体数据,看每个书体的准确率落差。你大概率会看到甲骨文和金文准确率极低、楷书接近正常水平的结果——这正是 Chronicles-OCR 要揭示的问题。
4. 用评测结果指导模型改进
拿到 baseline 分数后,可以针对性地改进:
# 分析错误模式:哪些字跨书体一致性地识别失败
from collections import Counter
error_chars_by_script = defaultdict(Counter)
for script_name in scripts:
ann = load_annotations(script_name)
for sample in ann:
img_path = str(DATA_ROOT / script_name / sample["image_file"])
result = ocr.ocr(img_path, cls=True)
recognized = "".join([line[1][0] for line in result[0]])
if sample["modern_char"] not in recognized:
error_chars_by_script[script_name][sample["modern_char"]] += 1
# 打印每个书体 top-5 误识字
for script_name, counter in error_chars_by_script.items():
print(f"\n{script_name} 最难识别的 5 个字:")
for char, count in counter.most_common(5):
print(f" {char}: 错误 {count} 次")
这类错误模式分析,是 Chronicles-OCR 作为"统一考场"最直接的价值——不再凭感觉说"古文字很难",而是精确量化到底难在哪、哪些字形是瓶颈。
落地建议与边界认知
谁应该立刻关注这个基准?
- 正在构建古文字数字化平台的技术团队——有了统一评测,模型选型不再靠拍脑袋;
- 做多语言/多书体 OCR 研究的学术团队——七体演化数据是研究字形泛化的天然实验场;
- 文博机构的数字化部门——可以直接用基准分数评估供应商方案的真实水平。
需要留意的边界:
- 标注格式尚未完全标准化——古文字释读本身存在学术争议,同一字形不同学者可能给出不同释读结果,基准标注采用的是"主流释读",但并非唯一答案。
- 样本量分布不均——甲骨文和金文的可用样本远少于楷书和行书,这是客观文物存量决定的,评测时需要按书体分层看分数,不宜简单取全局平均。
- 现代字映射是简化评测维度——古文字识别的终极目标不是映射到现代楷书,而是还原当时的字形与用法,当前基准以现代字为锚点是为了可计算性,更深入的评测还需要词义和用法层级。
快速上手清单:
- ✅ 克隆/下载 Chronicles-OCR 数据集与评测代码
- ✅ 用现有中文 OCR 模型跑一遍七体 baseline,记录各书体准确率
- ✅ 分析错误模式,确定最需要针对性训练的书体
- ✅ 基于基准数据构建 fine-tune 数据集,迭代模型
- ✅ 每轮迭代后回到基准重跑分数,确保改进可量化
古文字 OCR 从"各自为战"进入"统一度量衡"阶段,Chronicles-OCR 是第一步。基准本身不会直接提升识别率,但它让每一次提升变得可验证、可对比——这才是评测基础设施真正的力量。