[Research] Autonomous Vehicle project(GPS & Computer Vision) - step1. Creating datasets

 

자율주행 Lane Tracing 프로젝트: Intersection 중심 데이터셋 구축

이번 시간부터 GPS 데이터와 Computer Vision을 결합한 Lane Tracing 프로젝트를 시작한다. 첫 번째 단계로, Computer Vision 모델 학습에 필요한 데이터셋을 구축하는 과정을 살펴보겠다. 특히, Lane Tracing에서 중요한 Intersection 분석과 학습 이미지 생성 로직을 중심으로 분석한다.

Intersection의 중요성

Lane Tracing은 차선을 인식하고 차량의 주행 경로를 결정하는 자율주행의 핵심 기술이다. Intersection은 여러 차선이 교차하는 지점으로, Lane Tracing 알고리즘의 성능을 좌우하는 중요한 요소이다. Intersection에서 차선은 복잡하게 얽혀있고, 차선 변경, 좌회전/우회전, 다른 차량과의 상호 작용 등 다양한 상황이 발생하기 때문이다. 따라서, Intersection을 효과적으로 처리하는 것은 자율주행 시스템의 안전성과 효율성을 높이는 데 필수적이다.

intersection

데이터셋 구축 전략

Intersection 중심의 데이터셋을 구축하기 위해 다음과 같은 전략을 사용하였다.

  1. Intersection 주변 데이터 집중: Intersection 주변의 다양한 상황을 충분히 반영하기 위해 Intersection 근처에서 데이터를 집중적으로 수집.
  2. 다양한 시나리오 반영: 좌회전/우회전, 차선 변경, 다른 차량과의 상호 작용 등 다양한 주행 시나리오를 포함하여 모델의 일반화 성능을 높임.

코드 분석

첨부된 .ipynb 파일의 코드는 Carla 시뮬레이터를 이용하여 Intersection 중심의 데이터셋을 생성하는 과정을 보여준다. 주요 단계는 다음과 같다.

  1. Carla 환경 설정: Carla client를 생성하고 원하는 맵을 로드한다.
  2. 차량 및 센서 설정: 차량을 생성하고 RGB 카메라를 부착한다.
  3. Intersection 정보 획득: 맵에서 Intersection의 위치 정보를 가져온다.
  4. 데이터 수집 루프:
    • Intersection 주변에서 차량을 이동시키며 다양한 시나리오를 생성한다.
    • 각 시나리오에서 카메라 이미지와 차선 정보를 저장한다.


Image 생성 Logic

Intersection 탐색

먼저, 주행 경로에서 intersection을 탐색한다. is_junction 또는 is_intersection 속성을 이용하여 waypoint가 intersection에 해당하는지 확인한다.

Python
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들을 가져온다.

Python
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(우회전)으로 구성되어 있다.

Python
gen_dir_angle = get_distant_angle(vehicle, idx, route, 30) # 30 waypoint 이후 지점까지의 angle

차량 배치 및 이미지 생성

Intersection 이전 지점에 차량을 배치하고, 다양한 각도에서 이미지를 생성한다. set_transform() 메서드를 이용하여 차량의 위치를 설정하고, random.randrange() 함수를 이용하여 yaw angle을 조정한다.

Python
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)

Lane Change 탐지 및 무시

Lane change 지점에서는 general direction이 급격하게 변할 수 있으므로, 이러한 지점을 탐지하여 이미지 생성을 무시한다. lane_id 속성을 이용하여 lane change 여부를 확인한다.

Python
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별하

hyeon_B

안녕하세요! AI 기술을 이용해 더 나은 세상을 만들어 나가고 싶은 과기원생 Hyeon이라고 합니다. 저는 앞으로 인공지능 시대에는 지식을 '활용'하는 능력이 중요해질 것이라고 생각합니다. 대부분의 일들은 인공지능이 뛰어난 모습을 보이지만, 인공지능은 데이터로 부터 연관관계를 학습하기 때문에 지식들을 새로 통합해서 활용하는 능력이 부족합니다. 인공지능이 뉴턴 전에 만들어졌다면 사과가 떨어지는 이유에 대답하지 못했을 것이고, 아인슈타인 전에 만들어졌다면 중력이 어떻게 생기는지 설명하지 못했을 것입니다. 따라서 앞으로 우리는 '본질'을 탐구하고 그 본질로부터 다른 곳에 적용하며 인공지능을 현명하게 활용해야 할 것입니다. 함께 인공지능 시대를 준비합시다!

댓글 쓰기

다음 이전

POST ADS1

POST ADS 2