junwatu's picture
Upload folder using huggingface_hub
c881b77 verified
Raw
History Blame Contribute Delete
2.56 kB
import os
import json
import cv2
import torch
from torchvision import transforms
from PIL import Image
from collections import defaultdict
import xml.etree.ElementTree as ET
from collections import Counter
PROJECT_DIR = os.getenv('DSP_PROJECT_DIR', '/path/to/DSP_PROJECT_DIR') # Set this manually if the environment variable is unavailable
image_dir = '/path/to/RUOD/RUOD_pic/train' # Replace with your actual path
label_dir = '/path/to/RUOD/RUOD_ANN' # Replace with your actual path
output_dir = os.path.join(PROJECT_DIR, "data", "RUOD", "patches")
os.makedirs(output_dir, exist_ok=True)
annos = json.load(open(os.path.join(label_dir, "instances_train.json"), "r"))
images_items = annos["images"]
annos_items = annos["annotations"]
cates_items = annos["categories"]
catemap = {}
for cate in cates_items:
catemap[cate["id"]] = cate["name"]
files = [i["file_name"] for i in images_items]
labels = defaultdict(list)
for item in annos_items:
image_id = item["image_id"]
filename = files[image_id-1]
labels[filename].append([catemap[item["category_id"]]] + item["bbox"])
print(len(files))
counter = Counter()
for image_name in files:
if not image_name.endswith(".jpg"):
continue
image_path = os.path.join(image_dir, image_name)
image = cv2.imread(image_path)
image_height, image_width, _ = image.shape
lines = labels[image_name]
# if image_name == '008431.jpg':
# import pdb; pdb.set_trace()
for i,line in enumerate(lines):
parts = line
class_name = parts[0]
xmin, ymin, w, h = parts[1:]
bbox_width = w
bbox_height = h
xmax = xmin + w
ymax = ymin + h
bbox_area = bbox_width * bbox_height
image_area = image_width * image_height
bbox_ratio = bbox_area / image_area
if bbox_ratio < 0.001:
continue
class_dir = os.path.join(output_dir, class_name)
os.makedirs(class_dir, exist_ok=True)
counter[class_dir] += 1
xmin, ymin, xmax, ymax = int(xmin), int(ymin), int(xmax), int(ymax)
cropped_image = image[ymin:ymax, xmin:xmax]
output_image_name = f"{image_name[:-4]}_{i}.jpg"
output_image_path = os.path.join(class_dir, output_image_name)
try:
cv2.imwrite(output_image_path, cropped_image)
except:
import pdb; pdb.set_trace()
print(bbox_ratio, xmin, ymin, xmax, ymax, image_name)
print(counter)