mirror of
https://github.com/THU-MIG/yolov10.git
synced 2025-05-23 21:44:22 +08:00
COnvert json to Yaml
This commit is contained in:
parent
649871d5e6
commit
1f932c36f4
127
json_to_yaml.py
Normal file
127
json_to_yaml.py
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
import json
|
||||||
|
import yaml
|
||||||
|
from pathlib import Path
|
||||||
|
from tqdm import tqdm
|
||||||
|
import os
|
||||||
|
|
||||||
|
os.environ["PYDEVD_CONTAINER_RANDOM_ACCESS_MAX_ITEMS"] = "1000000000"
|
||||||
|
|
||||||
|
category_dict = {
|
||||||
|
0: "box0_small",
|
||||||
|
1: "box0_medium",
|
||||||
|
2: "box0_large",
|
||||||
|
3: "box1_medium",
|
||||||
|
4: "box1_large",
|
||||||
|
5: "box2_medium",
|
||||||
|
6: "box2_large",
|
||||||
|
7: "box3_small",
|
||||||
|
8: "box3_medium",
|
||||||
|
9: "box3_large",
|
||||||
|
10: "cart_0",
|
||||||
|
11: "cart_1",
|
||||||
|
12: "cone_1",
|
||||||
|
13: "traffic cone",
|
||||||
|
14: "crate_0_small",
|
||||||
|
15: "crate_1_small",
|
||||||
|
16: "crate_0_large",
|
||||||
|
17: "crate_1_large",
|
||||||
|
18: "ram",
|
||||||
|
19: "dvere",
|
||||||
|
20: "euro_pallet",
|
||||||
|
21: "shelf",
|
||||||
|
22: "piso mojado",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_key(dictionary, value):
|
||||||
|
return [key for key, val in dictionary.items() if val == value][0]
|
||||||
|
|
||||||
|
|
||||||
|
def convert_coco_json_to_yaml(json_file, output_dir, image_dir_path):
|
||||||
|
# Create output directory if it doesn't exist
|
||||||
|
output_dir = Path(output_dir)
|
||||||
|
output_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Load JSON data
|
||||||
|
with open(json_file, "r") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
# Prepare YAML data
|
||||||
|
yaml_data = {
|
||||||
|
"path": str(Path(json_file).parent),
|
||||||
|
"train": "images/train",
|
||||||
|
"val": "images/val",
|
||||||
|
"test": "",
|
||||||
|
"names": {
|
||||||
|
get_key(category_dict, cat["name"]): cat["name"]
|
||||||
|
for cat in data["categories"]
|
||||||
|
},
|
||||||
|
"nc": len(data["categories"]),
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create image to annotation mapping
|
||||||
|
img_to_anns = {}
|
||||||
|
for ann in data["annotations"]:
|
||||||
|
ann["category_id"] = get_key(category_dict, ann["category_id"])
|
||||||
|
image_id = ann["image_id"]
|
||||||
|
if image_id not in img_to_anns:
|
||||||
|
img_to_anns[image_id] = []
|
||||||
|
img_to_anns[image_id].append(ann)
|
||||||
|
|
||||||
|
# To read all the image names and use the same filename for labels by changing .jpg at the end to .txt
|
||||||
|
directory = Path(image_dir_path)
|
||||||
|
files = sorted(directory.glob("*.jpg"))
|
||||||
|
|
||||||
|
# Process annotations
|
||||||
|
for idx, img in enumerate(tqdm(data["images"], desc="Processing annotations")):
|
||||||
|
img_id = img["id"]
|
||||||
|
filename = img["file_name"]
|
||||||
|
width, height = img["width"], img["height"]
|
||||||
|
|
||||||
|
annotations = []
|
||||||
|
if img_id in img_to_anns:
|
||||||
|
for ann in img_to_anns[img_id]:
|
||||||
|
category_id = ann["category_id"] # YOLO format uses 0-indexed classes
|
||||||
|
bbox = ann["bbox"]
|
||||||
|
x_center = (bbox[0] + bbox[2] / 2) / width
|
||||||
|
y_center = (bbox[1] + bbox[3] / 2) / height
|
||||||
|
bbox_width = bbox[2] / width
|
||||||
|
bbox_height = bbox[3] / height
|
||||||
|
|
||||||
|
annotations.append(
|
||||||
|
{
|
||||||
|
"class": category_id,
|
||||||
|
"x_center": x_center,
|
||||||
|
"y_center": y_center,
|
||||||
|
"width": bbox_width,
|
||||||
|
"height": bbox_height,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Write COCO format annotation file with same name as image but .txt extension
|
||||||
|
|
||||||
|
output_file = str(Path(output_dir).joinpath(files[idx].stem)) + ".txt"
|
||||||
|
|
||||||
|
with open(output_file, "w") as f:
|
||||||
|
for ann in annotations:
|
||||||
|
f.write(
|
||||||
|
f"{ann['class']} {ann['x_center']:.6f} {ann['y_center']:.6f} {ann['width']:.6f} {ann['height']:.6f}\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Write YAML file
|
||||||
|
yaml_file = output_dir / "dataset_euro_pallet.yaml"
|
||||||
|
with open(yaml_file, "w") as f:
|
||||||
|
yaml.dump(yaml_data, f, sort_keys=False)
|
||||||
|
|
||||||
|
print(f"Conversion complete. YAML file saved to {yaml_file}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
json_file = "/home/vyasd/projects/ARCHIVED/yolov10/merged_coco_version_2_val_corrected.json"
|
||||||
|
output_dir = (
|
||||||
|
"/home/vyasd/projects/ARCHIVED/yolov10/datasets/warehouse-full/labels/val"
|
||||||
|
)
|
||||||
|
image_dir_path = (
|
||||||
|
"/home/vyasd/projects/ARCHIVED/yolov10/datasets/warehouse-full/images/val/"
|
||||||
|
)
|
||||||
|
convert_coco_json_to_yaml(json_file, output_dir, image_dir_path)
|
Loading…
x
Reference in New Issue
Block a user