You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.7 KiB

#!/usr/bin/env python3
"""
PaddleOCR E2EMetric (mode: A) 요구하는 gt_img_{N}.mat 파일을 생성.
입력: PGDataSet 포맷의 label txt 파일
images/000000.jpg\t[{"transcription":"37도1563","points":[[x1,y1],...]}]
출력: gt_mat_dir/gt_img_{1-indexed}.mat (ICDAR2015 wordBB 포맷)
사용법 (서버에서):
python3.10 /workspace/kr_lp_pgnet/tools/make_gt_mat.py \
--label /workspace/train_data/kr_lp_synth/test/test.txt \
--out_dir /workspace/train_data/kr_lp_synth/gt
"""
import argparse
import json
import os
import numpy as np
import scipy.io as sio
def points_to_wordbb(points):
"""[[x0,y0],[x1,y1],[x2,y2],[x3,y3]] → (2, 4) array (ICDAR wordBB 포맷).
axis0: x or y, axis1: corner index (TL, TR, BR, BL)."""
pts = np.array(points, dtype=np.float64) # (4, 2)
# (2, 4): row0=x coords, row1=y coords
return pts.T # [[x0..x3], [y0..y3]]
def make_txt_cell(text):
"""ICDAR txt 셀: numpy array of individual chars (MATLAB cell array 호환)."""
return np.array([list(text)], dtype=object)
def main():
p = argparse.ArgumentParser(description=__doc__)
p.add_argument("--label", required=True, help="PGDataSet label txt 경로")
p.add_argument("--out_dir", required=True, help="gt mat 출력 디렉토리")
args = p.parse_args()
os.makedirs(args.out_dir, exist_ok=True)
with open(args.label, encoding="utf-8") as f:
lines = [ln.rstrip("\n") for ln in f if ln.strip()]
for img_idx, line in enumerate(lines, start=1):
parts = line.split("\t", 1)
if len(parts) != 2:
print(f" skip (no tab): {line[:60]}")
continue
try:
entries = json.loads(parts[1])
except json.JSONDecodeError as ex:
print(f" skip (json err @ {img_idx}): {ex}")
continue
n = len(entries)
if n == 0:
print(f" skip (empty label @ {img_idx})")
continue
# wordBB: (2, 4, N) — ICDAR 포맷
word_bb = np.zeros((2, 4, n), dtype=np.float64)
txt = np.empty((1, n), dtype=object)
for j, entry in enumerate(entries):
word_bb[:, :, j] = points_to_wordbb(entry["points"])
txt[0, j] = make_txt_cell(entry["transcription"])
if n == 1:
# scipy.io는 (2,4,1) → (2,4)로 squeeze하는 경우가 있어 명시적 유지
word_bb = word_bb.reshape(2, 4, 1)
mat_path = os.path.join(args.out_dir, f"gt_img_{img_idx}.mat")
sio.savemat(mat_path, {"wordBB": word_bb, "txt": txt}, do_compression=True)
print(f" gt mat 생성 완료: {len(lines)}개 → {args.out_dir}/gt_img_{{1..{len(lines)}}}.mat")
if __name__ == "__main__":
main()