자율주행 Lane Tracing 프로젝트: Computer Vision 모델 학습 및 테스트
1. 서론
지난 블로그 게시물에서는 Carla 시뮬레이터를 이용하여 GPS와 Computer Vision을 결합한 lane tracing을 위한 데이터셋을 생성하는 과정을 살펴보았다. 이번에는 생성된 데이터셋을 이용하여 Computer Vision 모델을 학습하고, 실제 Carla 시뮬레이터에서 주행 테스트를 진행하는 과정을 다뤄보겠다. 특히, 모델 학습 과정에서 발생했던 문제점과 이를 해결하기 위한 다양한 시도들을 소개하고자 한다.
2. 모델 학습 및 테스트
2.1 첫 번째 모델
첫 번째 모델은 1130장의 original image data를 사용하여 학습했다. 데이터셋의 크기가 부족했기 때문에 모델의 steer prediction은 비교적 고르게 분포되어 있었음에도 불구하고, 실제 주행 테스트에서는 steering이 지속적으로 튀면서 부자연스럽게 주행하는 문제가 발생했다.
2.2 두 번째 모델
두 번째 모델에서는 2420장의 데이터를 사용하고, 특정 범위의 steer angle로 편향되는 것을 막기 위해 dataset balancing을 수행했다. 하지만 balancing 과정에서 데이터셋의 크기가 너무 많이 줄어드는 문제가 발생했다. 가장 작은 bin에 맞춰 쏠림이 발생한 데이터들을 삭제하는 작업을 수행하는 바람에 training data의 손실이 크게 발생했다.
second training data histogram |
데이터가 적어서인지는 모르겠으나, 이렇게 학습한 모델은 이상하게 right-hand side로 편향되도록 steering하는 경향성을 보였다.
2.3 세 번째 모델
세 번째 모델에서는 3350장의 데이터를 사용하여 데이터셋의 크기를 보충하고, 모델에 regularizer를 추가하여 overfitting을 방지했다.
third training data histogram |
from keras import regularizers
def create_model():
# Image input
image_input = Input(shape=(HEIGHT, WIDTH, 3))
# Integer input
integer_input = Input(shape=(1,))
# Preprocess the image input
x = Conv2D(64, kernel_size=(3, 3), activation='relu',padding='same',activity_regularizer=regularizers.L2(1e-5))(image_input)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(64, kernel_size=(3, 3), activation='relu',padding='same',activity_regularizer=regularizers.L2(1e-5))(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(64, kernel_size=(3, 3), activation='relu',padding='same',activity_regularizer=regularizers.L2(1e-5))(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dense(128, activation='relu',activity_regularizer=regularizers.L2(1e-5))(x)
x = Dense(32, activation='relu',activity_regularizer=regularizers.L2(1e-5))(x)
x = Dense(4, activation='relu',activity_regularizer=regularizers.L2(1e-5))(x)
x = Flatten()(x)
# Concatenate image features with integer input
concatenated_inputs = Concatenate()([x, integer_input])
# Dense layers for prediction
output = Dense(1, activation='linear')(concatenated_inputs)
# Create the model
model = Model(inputs=[image_input, integer_input], outputs=output)
return model
model = create_model()
model.summary()
세 번째 모델은 주행 자체는 괜찮았고, steer angle도 깔끔하게 lane을 인식하는 것처럼 보였다. 하지만 한 박자 빠르게 steering하여 회전하면 안 되는 타이밍에 먼저 회전하는 문제가 발생했다. 지금까지 시도들에 비하면...학습은 잘 됐다고 판단할 수 있는 결과물이었다.
이번 경우는 Training data에서 global direction을 설정할 때 30th ahead waypoint를 기준으로 설정했던 것이 문제라고 판단하였다. 모델에 문제가 있다기 보다는 데이터가 너무 앞서있는 정보를 주도록 학습시켰기 때문이라고 보았다. 그래서 25th ahead waypoint를 기준으로 학습시켜 보았다.
그 후...
하지만 이러한 시도에도 불구하고 문제는 해결되지 않았다.
데이터를 수집하는 것부터 직접 학습하는 것까지. 굉장한 노력이 필요하고 알아야 할 것들이 많았다. 그래서 직접 하기보다는 논문을 참조하며 기존 모델부터 이해하는게 어떻느냐라는 피드백을 수용하기로 했다. (train하는 것도 상당한 computing 성능을 요구하니...)
3. 결론
이번 블로그 게시물에서는 지난 시간에 생성한 데이터셋을 이용하여 Computer Vision 모델을 학습하고, Carla 시뮬레이터에서 주행 테스트를 진행하는 과정을 살펴보았다. 특히, 모델 학습 과정에서 발생했던 문제점과 이를 해결하기 위한 다양한 시도들을 소개했다.
앞으로 기존 논문을 참고하여 검증된 lane tracing 모델을 Carla 시뮬레이터에서 재현하고 테스트 할 예정.
[Research] Autonomous Vehicle project(GPS & Computer Vision) - step1. Creating datasets | be별하
[Research] Carla 환경 설정 (server: window + client: ubuntu) | be별하