[w13d2] 딥러닝 데이터 만들기

GGG·2022년 5월 10일
0
post-thumbnail

(Ubuntu 18.04.6 LTS)
2022.05.10
프로그래머스 자율주행 데브코스 3기

left
right
stop
crosswalk
uturn
traffic_light
ignore

학습을 위해 데이터 라벨링을 진행하였으며 이전에 다루었던 CVAT를 이용하였습니다. 클래스의 종류는 위와 같습니다. 라벨링 결과를 kitti 데이터셋으로 추출했는데, 해당 결과를 중심좌표, 너비와 높이로 변경하기 위해서 코드를 작성했고, 결과는 아래와 같습니다. (640, 480 이미지)

import glob


file_list = glob.glob("./default/label_2/*.txt")
input_dir = "./default/label_2/"
output_dir = "./output/"


data_table = {
    'left': 0,
    'right': 1,
    'stop': 2,
    'crosswalk': 3,
    'uturn': 4,
    'traffic_light': 5,
    'ignore': 6
}

for file_name in file_list:
    tmp = ""
    with open(file_name, "r") as f:
        lines = f.readlines()
        for line in lines:
            data_split = line.split()
            data_kitti = ""
            data_kitti = data_kitti + str(data_table[data_split[0]])
            xyxy = list(map(float, data_split[4:8]))
            xywh = [round((xyxy[0]+xyxy[2])/2/640, 6), round((xyxy[1]+xyxy[3])
                                                             / 2/480, 6), round((xyxy[2]-xyxy[0])/640, 6), round((xyxy[3]-xyxy[1])/480, 6)]

            for datum in xywh:
                data_kitti = data_kitti + ' ' + str(datum)
                output_file = output_dir+file_name.replace(input_dir, "")
            tmp = tmp + data_kitti + "\n"
        with open(output_file, "a") as f2:
            f2.write(tmp)
# 변경 전
traffic_light 0.0 0 -1 108.02 116.76 200.11 285.04 -1 -1 -1 -1 -1 -1 -1
ignore 0.0 0 -1 312.82 208.03 321.42 216.63 -1 -1 -1 -1 -1 -1 -1

# 변경 후
5 0.243898 0.419063 0.152453 0.345875
6 0.49493 0.442479 0.015953 0.020208

추가적으로 rosbag을 이용해서 주행 영상을 얻고, 라벨링을 하기 위해서 동영상을 이미지 파일로 만들어주는 코드를 작성하였습니다.

import cv2
import argparse
import sys


def parse_args():
    parser = argparse.ArgumentParser(description="video2img")
    parser.add_argument("--video_path", type=str,
                        help="video path", default=None)
    parser.add_argument("--img_path", type=str,
                        help="image directory. for example, ./output",
                        default="./output")
    parser.add_argument("--frame_pass", type=int,
                        help="frame gaps passed per image", default=1)
    if (len(sys.argv) == 1):
        # python file opened without any argument
        parser.print_help()
        sys.exit(1)
    args = parser.parse_args()
    return args


if __name__ == "__main__":
    count = 0
    args = parse_args()
    cap = cv2.VideoCapture(args.video_path)
    video_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)

    if args.frame_pass != 1:
        frame_pass = args.frame_pass
        print("frame pass:", frame_pass,
              "\nExpected frames:", int(video_frames/frame_pass))

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        if count % frame_pass != 0:
            count += 1
            continue
        file_name = args.img_path + '/' + str(int(count/frame_pass)) + ".png"
        cv2.imwrite(file_name, frame)
        count += 1
    print("The job is successfully finished!")
profile
GGG

0개의 댓글