# Benchmark — Đánh giá phân tích bố cục (parser vs OmniDocBench) Đo độ chính xác của `StageAParser` (giai đoạn phân tích cấu trúc của PDFTranslator) bằng cách đối chiếu trực tiếp với ground truth của **OmniDocBench**. Quy trình gồm **hai giai đoạn**: 1. **Sinh prediction** — chạy parser trên toàn bộ trang OmniDocBench → cần **GPU** (nên dùng Google Colab A100). 2. **Chấm điểm (eval)** — tính các độ đo (định vị, phân loại, OCR, thứ tự đọc, công thức, bảng) → chỉ cần **CPU**, chạy local. Riêng chỉ số **CDM** cho công thức cần thêm TeX Live + ImageMagick. --- ## Cấu trúc thư mục ``` benchmark/parser/ ├── run_parser/ # build_pdfs.py, run_parser.py (sinh prediction — cần GPU) ├── evaluation/ # eval_layout / eval_formula / eval_table / eval_formula_cdm │ # aggregate_reports.py, compare_matchers.py, download_dataset.py │ # requirements-eval.txt ├── data/ # OmniDocBench.json + images/ + pdfs/ (tải/tạo ở bước 1) ├── parser_results/ # batch_*.json (ParsedDocument) + mapping.json (đầu ra parser) └── eval_results/ # *.json report + eval_summary_*.csv (đầu ra eval) ``` --- ## 0. Chuẩn bị ```bash git clone https://github.com/HoanggNguyen/PDFTranslator.git cd PDFTranslator # repo OmniDocBench chỉ cần cho CDM (đánh giá công thức): git clone https://github.com/opendatalab/OmniDocBench.git cd benchmark/parser ``` --- ## 1. Sinh prediction bằng parser (GPU) Giai đoạn này cần GPU lớn. Nếu GPU laptop không đủ thì dùng **GoogleColab**. ### 1a. Kiểm tra GPU và tạo môi trường ảo ```bash nvidia-smi ``` Trên Colab, tạo môi trường ảo riêng để **tránh xung đột** với các gói cài sẵn: ```bash pip install virtualenv virtualenv myenv ./myenv/bin/pip install -r ../../requirements.txt ``` (Nếu chạy local có GPU đủ: dùng venv của repo và `pip install -r ../../requirements.txt`.) ### 1b. Tải dữ liệu → gộp PDF → chạy parser ```bash # (1) tải ảnh + OmniDocBench.json về data/ ./myenv/bin/python evaluation/download_dataset.py --out data # (2) gộp ảnh thành PDF 32 trang/PDF (tạo kèm data/pdfs/mapping.json) ./myenv/bin/python run_parser/build_pdfs.py \ --images data/images --out data/pdfs --per-pdf 32 # (3) chạy parser -> parser_results/batch_*.json + báo cáo thời gian ./myenv/bin/python run_parser/run_parser.py \ --pdfs data/pdfs \ --out parser_results \ --timing eval_results/parser_timing.json \ --device cuda ``` Tuỳ chọn hữu ích của `run_parser.py`: - Batch size (điều chỉnh theo VRAM): `--layout-batch-size`, `--detection-batch-size`, `--ocr-batch-size`, `--table-batch-size`, `--page-batch-size` (mặc định hợp cho A100). - Ngưỡng detector: `--blank-threshold`, `--text-threshold`. - `--limit N`: chỉ chạy N PDF đầu (test nhanh); `--overwrite`: chạy lại PDF đã có JSON. > `build_pdfs.py` ghi `mapping.json` cạnh các PDF (`data/pdfs/mapping.json`). Để các > lệnh eval ở Giai đoạn 2 chạy nguyên trạng, sau khi chạy parser hãy copy nó vào > `parser_results/`: `cp data/pdfs/mapping.json parser_results/`. - Tải `parser_results/` từ Colab về máy để chấm điểm ở Giai đoạn 2. --- ## 2. Chấm điểm (eval — CPU, chạy local) ### 2a. Môi trường eval ```bash python3 -m venv .venv .venv/bin/pip install -r evaluation/requirements-eval.txt sudo apt install -y texlive-latex-base texlive-latex-extra \ texlive-fonts-recommended imagemagick ``` Đặt cho gọn: `PY=.venv/bin/python`. ### 2b. Localization + Classification + OCR + Reading order ```bash # fine (bung merge_list — khuyến nghị) $PY evaluation/eval_layout.py \ --gt data/OmniDocBench.json --pred parser_results \ --mapping parser_results/mapping.json \ --gt-granularity fine --out eval_results/eval_report_fine.json # merged (box top-level như OmniDocBench) $PY evaluation/eval_layout.py \ --gt data/OmniDocBench.json --pred parser_results \ --mapping parser_results/mapping.json \ --gt-granularity merged --out eval_results/eval_report_merged.json # fine + mask-math (thay công thức inline bằng token -> CER/WER text thuần) $PY evaluation/eval_layout.py \ --gt data/OmniDocBench.json --pred parser_results \ --mapping parser_results/mapping.json \ --gt-granularity fine --mask-math \ --out eval_results/eval_report_fine_maskmath.json ``` ### 2c. Công thức (edit distance) + Bảng (nội dung) ```bash $PY evaluation/eval_formula.py \ --gt data/OmniDocBench.json --pred parser_results \ --mapping parser_results/mapping.json \ --out eval_results/eval_report_formula.json $PY evaluation/eval_table.py \ --gt data/OmniDocBench.json --pred parser_results \ --mapping parser_results/mapping.json \ --out eval_results/eval_report_table.json ``` ### 2d. Công thức CDM (chuẩn vàng — cần TeX Live + ImageMagick + pylatexenc) ```bash $PY evaluation/eval_formula_cdm.py \ --gt data/OmniDocBench.json --pred parser_results \ --mapping parser_results/mapping.json \ --omnidocbench ../../OmniDocBench \ --out eval_results/eval_report_formula_cdm.json # thêm --limit 200 để test nhanh ``` ### 2e. Gom kết quả thành CSV ```bash $PY evaluation/aggregate_reports.py \ --layout fine=eval_results/eval_report_fine.json \ --layout merged=eval_results/eval_report_merged.json \ --layout fine_maskmath=eval_results/eval_report_fine_maskmath.json \ --formula eval_results/eval_report_formula.json \ --report table=eval_results/eval_report_table.json \ --out eval_results/eval_summary ``` ### 2f. (tuỳ chọn) So sánh 3 cách matching localization ```bash $PY evaluation/compare_matchers.py --iou 0.5 --granularity fine ``` --- ## Ghi chú - GT↔pred nối theo **tên ảnh** (`image_path`) qua `mapping.json` — khớp 1:1. - Eval chạy **CPU** (trừ CDM cần TeX Live). Chỉ Giai đoạn 1 (parser) mới cần GPU. - Các script trong `evaluation/` import lẫn nhau theo thư mục cạnh bên; hãy gọi bằng `python evaluation/