(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!")