dsp-repro-bundle / scripts /data_process /dior /01.b.process_test.py
junwatu's picture
Upload folder using huggingface_hub
c881b77 verified
Raw
History Blame Contribute Delete
4.15 kB
import os
import xml.etree.ElementTree as ET
import json
PROJECT_DIR = os.getenv('DSP_PROJECT_DIR', '/path/to/DSP_PROJECT_DIR') # Set this manually if the environment variable is unavailable
base_dir = '/path/to/DIOR-VOC/Annotations/Horizontal_Bounding_Boxes' # Replace with your actual path
category_list = [
'vehicle', 'baseballfield', 'groundtrackfield', 'windmill', 'bridge',
'overpass', 'ship', 'airplane', 'tenniscourt', 'airport',
'expressway-service-area', 'basketballcourt', 'stadium', 'storagetank', 'chimney',
'dam', 'expressway-toll-station', 'golffield', 'trainstation', 'harbor'
]
category_dict_rev = {v: i for i, v in enumerate(category_list)}
novel_categories = [
'windmill', 'airport', 'chimney', 'dam', 'trainstation'
]
novel_ids = set([category_dict_rev[cate] for cate in novel_categories])
novel_dict_rev = {v: i for i, v in enumerate(novel_categories)}
num_classes = 20
width_height = 800
caption_prefix = "The aerial image features a city with "
thr = 15
os.makedirs(os.path.join(PROJECT_DIR, 'data', 'DIOR', 'metadatas', 'data_setting1'), exist_ok=True)
if __name__ == '__main__':
base_list, novel_list = [], [[], [], [], [], [], []]
filenames = sorted(os.listdir(base_dir))[11725:]
for filename in filenames:
dictin = {}
root = ET.parse(os.path.join(base_dir, filename)).getroot()
categories_in_this_image = set()
categories, bndboxes, obndboxes= [], [], []
for object in root.findall('object'):
category = object.find('name').text.lower()
category_id = category_dict_rev[category]
xmin, ymin, xmax, ymax = [int(child.text) / width_height for child in object.find('bndbox')]
categories.append(category)
bndboxes.append([xmin, ymin, xmax, ymax])
obndboxes.append([xmin, ymin, xmax, ymin, xmax, ymax, xmin, ymax])
categories_in_this_image.add(category_id)
caption = [caption_prefix + ", ".join(categories)]
is_novel = False
if categories_in_this_image & set(novel_ids):
is_novel = True
tmp_categories, tmp_bndboxes, tmp_obndboxes= [], [], []
for i in range(len(categories)):
if categories[i] in novel_categories:
tmp_categories.append(categories[i])
tmp_bndboxes.append(bndboxes[i])
tmp_obndboxes.append(obndboxes[i])
categories, bndboxes, obndboxes = tmp_categories, tmp_bndboxes, tmp_obndboxes
if len(categories) > thr:
categories = categories[:thr]
bndboxes = bndboxes[:thr]
obndboxes = obndboxes[:thr]
while len(categories) < thr:
categories.append("")
bndboxes.append([0,0,0,0])
obndboxes.append([0,0,0,0,0,0,0,0])
dictin["file_name"] = f"../../images/{filename[:5]}.jpg"
caplist = caption + categories
dictin["captions"] = caplist
dictin["bndboxes"] = bndboxes
dictin["obboxes"] = obndboxes
if is_novel:
if len(categories_in_this_image) > 1:
novel_list[5].append(dictin.copy())
else:
novel_list[novel_dict_rev[category_list[next(iter(categories_in_this_image))]]].append(dictin.copy())
else:
base_list.append(dictin.copy())
with open(os.path.join(PROJECT_DIR, "data/DIOR/metadatas/data_setting1/test_base.jsonl"), "w", encoding="utf-8") as f:
for item in base_list:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
for i in range(5):
with open(os.path.join(PROJECT_DIR, f"data/DIOR/metadatas/data_setting1/test_novel_{novel_categories[i]}.jsonl"), "w", encoding="utf-8") as f:
for item in novel_list[i]:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
with open(os.path.join(PROJECT_DIR, "data/DIOR/metadatas/data_setting1/test_novel_mixed.jsonl"), "w", encoding="utf-8") as f:
for item in novel_list[5]:
f.write(json.dumps(item, ensure_ascii=False) + "\n")