Skip to content

PaddleOCR-VL测评精度更正 #136

@changdazhou

Description

@changdazhou

您好,

非常感谢贵团队在该项目中的付出和努力。最近,我们注意到您对 PaddleOCR-VL 的评估指标与我们实测精度存在一些不一致的地方。经过我们的分析评估指标不同的来源可能在以下两个方面:

  1. 不同的推理脚本

    我们在评测 PaddleOCR-VL 的时候采用了关闭文档方向分类、版面校正以及美化 Markdown 等美化功能方式推理,这些功能均会影响评估的准确性。为了能够对齐我们的推理方式,您可以使用如下的推理脚本进行推理,得到全部的 Markdown 结果以用于评估:

import os
import time
from tqdm import tqdm
from multiprocessing import Process, Lock, Queue, current_process, Manager
from paddleocr import PaddleOCRVL

GPU_NUM = 8
PROCESS_NUM = 16
DATASET_PATH = r"/path/to/minibench_v1_5"
VLLM_REC_SERVER_URL="http://127.0.0.1:8118/v1"
OUTPUT_DIR = "output"


def worker(task_queue, gpu_id, lock, output_dir, progress_dict):
    pipeline = PaddleOCRVL(vl_rec_backend="vllm-server", vl_rec_server_url=VLLM_REC_SERVER_URL,device=f'gpu:{gpu_id}')
    while True:
        task = task_queue.get()
        if task is None:
            task_queue.put(None)
            break
        input_dir, file = task
        output = pipeline.predict(
            f"{input_dir}/{file}",
            use_doc_orientation_classify=False,
            use_doc_unwarping=False,
        )
        for res in output:
            res.save_to_markdown(output_dir, pretty=False)
        
        with lock:
            progress_dict['processed'] += 1

if __name__ == "__main__":
    manager = Manager()
    progress_dict = manager.dict({'processed': 0, 'total': 0})
    files = os.listdir(f"{DATASET_PATH}")
    progress_dict['total'] = len(files)
    progress_dict['processed'] = 0

    task_queue = Queue()
    for file in files:
        task_queue.put((DATASET_PATH, file))
    for _ in range(PROCESS_NUM):
        task_queue.put(None)
    lock = Lock()
    processes = []
    for i in range(PROCESS_NUM):
        p = Process(
            target=worker,
            args=(
                task_queue, 
                i % GPU_NUM, 
                lock, 
                OUTPUT_DIR, 
                progress_dict, 
            )
        )
        p.start()
        processes.append(p)

    with tqdm(total=progress_dict['total'], desc="Processing", ncols=100) as pbar:
        while progress_dict['processed'] < progress_dict['total']:
            processed = progress_dict['processed']
            pbar.update(processed - pbar.n)
            time.sleep(0.1)
        pbar.update(progress_dict['total'] - pbar.n)

    for p in processes:
        p.join()
  1. 不同的评估环境/评估方式

    OminDocBech v1.5 中使用 CDM 来对公式进行评估,该评估方式能够有效的避免不同模型对于公式表达式的差异而带来的指标差异,能够更加客观公正的评估公式的实际指标。 为了尽可能的对齐官方提供的评估方法,我们参考了 UniMERNet 中关于 CDM 环境构建的方法( https://github.com/opendatalab/UniMERNet/blob/main/cdm/DockerFile) 构建了一个标准的 Docker 镜像,并在此环境下进行指标测评。经过我们的测试和验证,发现评测指标的结果除了 CDM 指标本身外,其他指标不受该环境影响,但无论是 CDM 指标本身还是其他指标均未能正确的评测出您在官网提供的指标结果,所以我们在此附上我们构建好的标准 Docker 镜像,辛苦帮忙看下是否哪里存在差异:

docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlex/paddlex:cdm-env

除了以上的两个问题外,我们也注意到在 README.md 文档的 Text OCR Evaluation 部分,给出了 PaddleOCR 的评测指标,希望能写明一下该处的指标来源是 PaddleOCRPP-StructureV3 算法还是最新的 PaddleOCR-VL 算法。

我们已在 #135 提交中提供了修正后的评估结果。如您在评估过程中遇到任何问题,请随时与我们联系。非常感谢您的理解与合作!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions