자율주행 Lane Tracing 프로젝트: Intersection 중심 데이터셋 구축
이번 시간부터 GPS 데이터와 Computer Vision을 결합한 Lane Tracing 프로젝트를 시작한다. 첫 번째 단계로, Computer Vision 모델 학습에 필요한 데이터셋을 구축하는 과정을 살펴보겠다. 특히, Lane Tracing에서 중요한 Intersection 분석과 학습 이미지 생성 로직을 중심으로 분석한다.
Intersection의 중요성
Lane Tracing은 차선을 인식하고 차량의 주행 경로를 결정하는 자율주행의 핵심 기술이다. Intersection은 여러 차선이 교차하는 지점으로, Lane Tracing 알고리즘의 성능을 좌우하는 중요한 요소이다. Intersection에서 차선은 복잡하게 얽혀있고, 차선 변경, 좌회전/우회전, 다른 차량과의 상호 작용 등 다양한 상황이 발생하기 때문이다. 따라서, Intersection을 효과적으로 처리하는 것은 자율주행 시스템의 안전성과 효율성을 높이는 데 필수적이다.
![]() |
intersection |
데이터셋 구축 전략
Intersection 중심의 데이터셋을 구축하기 위해 다음과 같은 전략을 사용하였다.
- Intersection 주변 데이터 집중: Intersection 주변의 다양한 상황을 충분히 반영하기 위해 Intersection 근처에서 데이터를 집중적으로 수집.
- 다양한 시나리오 반영: 좌회전/우회전, 차선 변경, 다른 차량과의 상호 작용 등 다양한 주행 시나리오를 포함하여 모델의 일반화 성능을 높임.
코드 분석
첨부된 .ipynb
파일의 코드는 Carla 시뮬레이터를 이용하여 Intersection 중심의 데이터셋을 생성하는 과정을 보여준다. 주요 단계는 다음과 같다.
- Carla 환경 설정: Carla client를 생성하고 원하는 맵을 로드한다.
- 차량 및 센서 설정: 차량을 생성하고 RGB 카메라를 부착한다.
- Intersection 정보 획득: 맵에서 Intersection의 위치 정보를 가져온다.
- 데이터 수집 루프:
- Intersection 주변에서 차량을 이동시키며 다양한 시나리오를 생성한다.
- 각 시나리오에서 카메라 이미지와 차선 정보를 저장한다.
Image 생성 Logic
Intersection 탐색
먼저, 주행 경로에서 intersection을 탐색한다. is_junction
또는 is_intersection
속성을 이용하여 waypoint가 intersection에 해당하는지 확인한다.
start_intersection = 0
for i, waypoint in enumerate(route):
if (route[i][0].is_junction or route[i][0].is_intersection) and start_intersection == 0:
start_intersection = i
break
print('intersection begins at point:', i)
Entry 및 Exit Point 추출
Intersection의 entry 및 exit point를 추출한다. get_junction()
메서드를 이용하여 junction 정보를 얻고, get_waypoints()
메서드를 이용하여 entry 및 exit point에 해당하는 waypoint들을 가져온다.
temp_wp = route[start_intersection][0] # Intersection 시작 지점
my_junction = temp_wp.get_junction()
junction_wps = my_junction.get_waypoints(carla.LaneType.Driving)
for waypoint in junction_wps:
# entry points
world.debug.draw_string(waypoint[0].transform.location, '^',
draw_shadow=False,
color=carla.Color(r=0, g=0, b=255), life_time=125.0,
persistent_lines=True)
# exit points
world.debug.draw_string(waypoint[1].transform.location, '^',
draw_shadow=False,
color=carla.Color(r=255, g=0, b=0), life_time=125.0,
persistent_lines=True)
General Direction 계산
차량의 현재 위치에서 intersection까지의 경로를 고려하여 general direction을 계산한다. get_distant_angle()
함수를 이용하여 현재 waypoint에서 delta waypoint 이후의 waypoint까지의 각도를 계산하고, 이를 기반으로 general direction을 결정한다.
general direction의 값은 -1(좌회전), 0(직진), +1(우회전)으로 구성되어 있다.
gen_dir_angle = get_distant_angle(vehicle, idx, route, 30) # 30 waypoint 이후 지점까지의 angle
차량 배치 및 이미지 생성
Intersection 이전 지점에 차량을 배치하고, 다양한 각도에서 이미지를 생성한다. set_transform()
메서드를 이용하여 차량의 위치를 설정하고, random.randrange()
함수를 이용하여 yaw angle을 조정한다.
transform = waypoint[0].transform
vehicle.set_transform(transform)
initial_yaw = waypoint[0].transform.rotation.yaw
for i in range(5): # 5개의 각도
trans = waypoint[0].transform
angle_adj = random.randrange(-YAW_ADJ_DEGREES, YAW_ADJ_DEGREES, 1)
trans.rotation.yaw = initial_yaw + angle_adj
vehicle.set_transform(trans)
# 이미지 저장
![]() |
collecting image data |
이미지는 다음과 같이 time, general dirction, current direction(vehicle의 forward vector와 +1만큼 앞서있는 waypoint의 vector가 이루는 각도)로 naming되어있다. 모델은 이미지와 general direction을 바탕으로 current direction을 예측하게 될 것이다.
Python # semantic 이미지 저장
if idx +1 < len(route)-1:
predicted_angle = get_angle(vehicle,route[idx+1][0]) # get the angle to +1 waypoint ahead of us
time_grab = time.time_ns()
sem_image = camera_data['sem_image']
if np.sum(sem_image) > 0: #check for black images
cv2.imwrite('_img/%06d_%s_%s.png' % (time_grab, gen_dir_angle,round(predicted_angle,0)), sem_image)
Python
# semantic 이미지 저장
if idx +1 < len(route)-1:
predicted_angle = get_angle(vehicle,route[idx+1][0]) # get the angle to +1 waypoint ahead of us
time_grab = time.time_ns()
sem_image = camera_data['sem_image']
if np.sum(sem_image) > 0: #check for black images
cv2.imwrite('_img/%06d_%s_%s.png' % (time_grab, gen_dir_angle,round(predicted_angle,0)), sem_image)
Lane Change 탐지 및 무시
Lane change 지점에서는 general direction이 급격하게 변할 수 있으므로, 이러한 지점을 탐지하여 이미지 생성을 무시한다. lane_id
속성을 이용하여 lane change 여부를 확인한다.
lane_change = False
if not waypoint[0].is_intersection and not waypoint[0].is_junction:
if idx < len(route) - 2:
if route[idx][0].lane_id != route[idx + 1][0].lane_id:
lane_change = True
print('lane_change detected')
![]() |
lane change |
결론
Intersection 중심의 데이터셋 구축은 Lane Tracing 모델의 성능 향상에 매우 중요하다. Carla 시뮬레이터를 이용하여 다양한 Intersection 시나리오를 생성하고, semantic 이미지와 차선 정보를 수집하여 모델 학습에 필요한 데이터셋을 구축할 수 있다. 다음 시간에는 이렇게 구축한 데이터셋을 이용하여 Computer Vision 모델을 학습해 보겠다.
추천글:
[Research] Carla 환경 설정 (server: window + client: ubuntu) | be별하
[Research] Carla Client and Vehicle spawn | be별하
[Research] Automated Driving with RGB Camera in Carla | be별하