hoang.nguyen6
deploy
f66643d unverified
|
Raw
History Blame Contribute Delete
6.48 kB
# 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/<script>.py` (đừng đổi tên/di chuyển lẻ từng file).