2022.7.19 차량,번호판 오브젝트 디텍션 프로젝트 2일차

정성우·2022년 7월 19일
0

현재 정규화된 coco형태의 bbox값을 yolo5모델학습을 위해 yolo형태로 바꿔주어야 한다.

학습한내용

import os
import json
from tqdm import tqdm
import shutil
#x,y 좌표의 위치를 박스 좌상단이 아닌 중심으로 변경하고
#w,h는 그대로 
def convert_bbox_coco2yolo(img_width, img_height, bbox):

    x_tl, y_tl, w, h = bbox

    x_center = x_tl + w / 2.0
    y_center = y_tl + h / 2.0

    x = x_center 
    y = y_center 
    w = w 
    h = h 
    return [x, y, w, h]

def make_folders(path="output"):
    os.makedirs(path)
    return path


def convert_coco_json_to_yolo_txt(output_path, json_file):

    path = make_folders(output_path)

    with open(json_file, encoding='utf8') as f:
        json_data = json.load(f)

    # write _darknet.labels, which holds names of all classes (one class per line)
    label_file = os.path.join(output_path, "_labels")
    with open(label_file, "w") as f:
        for category in tqdm(json_data["categories"], desc="Categories"):
            category_name = category["name"]
            f.write(f"{category_name}\n")

    for image in tqdm(json_data["images"], desc="Annotation txt for each iamge"):
        img_id = image["id"]
        img_name = image["file_name"].split('/')[-1]
        img_width = image["width"]
        img_height = image["height"]

        anno_in_image = [anno for anno in json_data["annotations"] if anno["image_id"] == img_id]
        anno_txt = os.path.join(output_path, img_name.split("png")[0][:-1]+'.txt')
        with open(anno_txt, "w") as f:
            for anno in anno_in_image:
                category = anno["category_id"]-1
                bbox_COCO = anno["bbox"]
                x, y, w, h = bbox_COCO
                box = x,y,w,h
                x, y, w, h = convert_bbox_coco2yolo(img_width, img_height, box)
                f.write(f"{category} {x:.10f} {y:.10f} {w:.10f} {h:.10f}\n")

    print("Converting COCO Json to YOLO txt finished!")

convert_coco_json_to_yolo_txt("./a_label", "./a.json")

실행결과

0=car
1=plate

학습한 내용 중 어려웠던 점 또는 해결못한 것들

해결방법 작성

학습 소감

0개의 댓글