import os from PIL import Image import xml.etree.ElementTree as ET import numpy as np import json from PIL import Image from shutil import copyfile def convert(ROOT, TRACK, SPLIT): coco_data = { "images": [], "annotations": [], "categories": [{"id": 1, "name": "table"}, ], } DATA_DIR = f"{ROOT}/{TRACK}/{SPLIT}" prefix = "cTDaR_t0" if TRACK == "trackA_archival" else "cTDaR_t1" print(TRACK, SPLIT, prefix) table_count = 0 for file in sorted(os.listdir(DATA_DIR)): if file.startswith(prefix) and file.endswith(".jpg"): img = Image.open(os.path.join(DATA_DIR, file)) coco_data["images"].append( { "file_name": file, "height": img.height, "width": img.width, "id": int(file[7:-4]), } ) elif file.startswith(prefix) and file.endswith(".xml"): # print(file) tree = ET.parse(os.path.join(DATA_DIR, file)) root = tree.getroot() assert len(root.findall("./table/Coords")) > 0 for table_id in range(len(root.findall("./table/Coords"))): four_points = root.findall("./table/Coords")[table_id].attrib["points"] four_points = list(map(lambda x: x.split(","), four_points.split())) four_points = [[int(j) for j in i] for i in four_points] segmentation = [j for i in four_points for j in i] bbox = [ four_points[0][0], four_points[0][1], four_points[2][0] - four_points[0][0], four_points[2][1] - four_points[0][1], ] coco_data["annotations"].append( { "segmentation": [segmentation], "area": bbox[2] * bbox[3], "iscrowd": 0, "image_id": int(file[7:-4]), "bbox": bbox, "category_id": 1, "id": table_count, } ) table_count += 1 with open(f"{ROOT}/{TRACK}/{SPLIT}.json", "w") as f: json.dump(coco_data, f) def clean_img(DATA_DIR): for file in sorted(os.listdir(DATA_DIR)): if file.endswith(".JPG"): os.rename(os.path.join(DATA_DIR, file), os.path.join(DATA_DIR, file.replace(".JPG", ".jpg"))) elif file.endswith(".TIFF"): img = Image.open(os.path.join(DATA_DIR, file)) img.save(os.path.join(DATA_DIR, file.replace(".TIFF", ".jpg"))) os.remove(os.path.join(DATA_DIR, file)) elif file.endswith(".png"): img = Image.open(os.path.join(DATA_DIR, file)) img.save(os.path.join(DATA_DIR, file.replace(".png", ".jpg"))) os.remove(os.path.join(DATA_DIR, file)) if __name__ == '__main__': import argparse parser = argparse.ArgumentParser() parser.add_argument('--root_dir', required=True) parser.add_argument('--target_dir', required=True) args = parser.parse_args() test_data_dir = os.path.join(args.root_dir, 'test', 'TRACKA') test_gt_dir = os.path.join(args.root_dir, 'test_ground_truth', 'TRACKA') training_data_dir = os.path.join(args.root_dir, 'training', 'TRACKA', 'ground_truth') raw_datas = {"train": [training_data_dir], "test": [test_data_dir, test_gt_dir]} TRACKS = ["trackA_modern", "trackA_archival"] SPLITS = ["train", "test"] for track in TRACKS: prefix = "cTDaR_t0" if track == "trackA_archival" else "cTDaR_t1" for split in SPLITS: os.makedirs(os.path.join(args.target_dir, track, split)) for source_dir in raw_datas[split]: for fn in os.listdir(source_dir): if fn.startswith(prefix): ffn = os.path.join(source_dir, fn) copyfile(ffn, os.path.join(args.target_dir, track, split, fn)) clean_img(os.path.join(args.target_dir, track, split)) convert(args.target_dir, track, split)