junwatu's picture
Upload folder using huggingface_hub
c881b77 verified
Raw
History Blame Contribute Delete
5.93 kB
from pathlib import Path
from PIL import Image
import shutil
import os
import imagesize
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/ExDark' # Replace with your actual path
output_dir = os.path.join(PROJECT_DIR, 'data', 'EXDARK', 'images')
image_dir = os.path.join(base_dir, 'images')
anno_dir = os.path.join(base_dir, 'annos')
category_dict = {
1: 'Bicycle', 2: 'Boat', 3: 'Bottle', 4: 'Bus', 5: 'Car', 6: 'Cat',
7: 'Chair', 8: 'Cup', 9: 'Dog', 10: 'Motorbike', 11: 'People', 12: 'Table'
}
category_dict_rev = {v: i for i, v in category_dict.items()}
novel_categories = ['Bus', 'Dog', 'Motorbike', 'Table']
novel_ids = set([category_dict_rev[cate] for cate in novel_categories])
novel_dict_rev = {v: i for i, v in enumerate(novel_categories)}
split_dict = {
1: 'train', 2: 'val', 3: 'test'
}
caption_prefix = "A dark image of "
thr = 15
os.makedirs(os.path.join(PROJECT_DIR, 'data', 'EXDARK', 'metadatas', 'data_setting1'), exist_ok=True)
def save_as_jpg(src_path, dst_dir):
src = Path(src_path)
dst_dir = Path(dst_dir)
dst_dir.mkdir(parents=True, exist_ok=True)
if src.suffix == ".jpg":
shutil.copy(src, dst_dir / src.name)
else:
img = Image.open(src).convert("RGB")
img.save(dst_dir / (src.stem + ".jpg"), "JPEG")
if __name__ == '__main__':
train_base_list, train_novel_list = [], [[] for i in range(len(novel_categories) + 1)]
val_base_list, val_novel_list = [], [[] for i in range(len(novel_categories) + 1)]
test_base_list, test_novel_list = [], [[] for i in range(len(novel_categories) + 1)]
meta_base_list = [train_base_list, val_base_list, test_base_list]
meta_novel_list = [train_novel_list, val_novel_list, test_novel_list]
with open(os.path.join(base_dir, 'imageclasslist.txt'), 'r') as f:
metadata = list(map(lambda line: line.strip().split(), f.readlines()[1:]))
metadata = list(map(lambda line: [line[0]] + list(map(int, line[1:])), metadata))
for data in metadata:
image_file = os.path.join(base_dir, 'images', category_dict[data[1]], data[0])
save_as_jpg(image_file, os.path.join(output_dir, split_dict[data[-1]]))
width, height = imagesize.get(image_file)
anno_file = os.path.join(base_dir, 'annos', category_dict[data[1]], f'{data[0]}.txt')
with open(anno_file, 'r') as f:
anno = list(map(lambda line: line.strip().split(), f.readlines()[1:]))
anno = list(map(lambda line: [line[0]] + list(map(int, line[1:5])), anno))
dictin = {}
categories, bndboxes, obndboxes= [], [], []
categories_in_this_image = set()
for object in anno:
category, xmin, ymin, w, h = object
xmin, ymin, w, h = int(xmin), int(ymin), int(w), int(h)
xmin, ymin, xmax, ymax = xmin, ymin, xmin + w, ymin + h
xmin = xmin / width
ymin = ymin / height
xmax = xmax / width
ymax = ymax / height
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_dict_rev[category])
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
categories = [cate.lower() for cate in categories]
caption = [caption_prefix + ", ".join(categories)]
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/{split_dict[data[-1]]}/{os.path.splitext(os.path.basename(image_file))[0]}.jpg'
caplist = caption + categories
dictin["captions"] = caplist
dictin["bndboxes"] = bndboxes
dictin["obboxes"] = obndboxes
if is_novel:
if len(categories_in_this_image) > 1:
meta_novel_list[data[-1] - 1][-1].append(dictin.copy())
else:
meta_novel_list[data[-1] - 1][novel_dict_rev[category_dict[next(iter(categories_in_this_image))]]].append(dictin.copy())
else:
meta_base_list[data[-1] - 1].append(dictin.copy())
# json_list[data[-1]].append(dictin)
for i in range(1, 4):
with open(os.path.join(PROJECT_DIR, f"data/EXDARK/metadatas/data_setting1/{split_dict[i]}_base.jsonl"), "w", encoding="utf-8") as f:
for item in meta_base_list[i - 1]:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
for j in range(len(novel_categories)):
with open(os.path.join(PROJECT_DIR, f"data/EXDARK/metadatas/data_setting1/{split_dict[i]}_novel_{novel_categories[j].lower()}.jsonl"), "w", encoding="utf-8") as f:
for item in meta_novel_list[i - 1][j]:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
with open(os.path.join(PROJECT_DIR, f"data/EXDARK/metadatas/data_setting1/{split_dict[i]}_novel_mixed.jsonl"), "w", encoding="utf-8") as f:
for item in meta_novel_list[i - 1][-1]:
f.write(json.dumps(item, ensure_ascii=False) + "\n")