古文字 OCR 终于有了统一考场:Chronicles-OCR 开源评测基准解析

2026-05-19 23 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:11 分钟

做现代汉字 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_filemodern_charchar_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 研究的学术团队——七体演化数据是研究字形泛化的天然实验场;
  • 文博机构的数字化部门——可以直接用基准分数评估供应商方案的真实水平。

需要留意的边界:

  1. 标注格式尚未完全标准化——古文字释读本身存在学术争议,同一字形不同学者可能给出不同释读结果,基准标注采用的是"主流释读",但并非唯一答案。
  2. 样本量分布不均——甲骨文和金文的可用样本远少于楷书和行书,这是客观文物存量决定的,评测时需要按书体分层看分数,不宜简单取全局平均。
  3. 现代字映射是简化评测维度——古文字识别的终极目标不是映射到现代楷书,而是还原当时的字形与用法,当前基准以现代字为锚点是为了可计算性,更深入的评测还需要词义和用法层级。

快速上手清单:

  • ✅ 克隆/下载 Chronicles-OCR 数据集与评测代码
  • ✅ 用现有中文 OCR 模型跑一遍七体 baseline,记录各书体准确率
  • ✅ 分析错误模式,确定最需要针对性训练的书体
  • ✅ 基于基准数据构建 fine-tune 数据集,迭代模型
  • ✅ 每轮迭代后回到基准重跑分数,确保改进可量化

古文字 OCR 从"各自为战"进入"统一度量衡"阶段,Chronicles-OCR 是第一步。基准本身不会直接提升识别率,但它让每一次提升变得可验证、可对比——这才是评测基础设施真正的力量。


相关推荐