이미지기반의 차선변경 알고리즘(SLC)은 무엇을 보면서 판단을 할까?

자율주행차와 운전자의 안전한 차선변경 조작을 돕기 위해서 고안된 이미지기반의 차선변경 학습 알고리즘(Image based Safe Lane-Change, 이하 SLC)1은 인접 차로의 점유상태(free 또는 blocked)를 판단하는 이진 분류기(binary classifier)이다. SLC는 정확한 이미지 분류를 위해 ConvNet (convolution neural network)을 사용하는데, 이는 많은 양의 훈련 데이터를 통해 판단의 근거가 되는 이미지 특징들을 스스로 학습한다.

ConvNet은 이전에 사람이 알고리듬을 고안하는 과정에서 미처 생각하지 못했던 미묘하고 섬세한 영역의 이미지 특징들까지 효율적으로 활용함으로써 높은 성능을 나타낸다. 하지만 ConvNet에 의해 계산된 이미지 특징들이 인간의 직관과 일치하지 않는 경우에 우리는 경이로움과 동시에 두려움을 느끼게 된다. 설계한 ConvNet의 동작원리를 제대로 파악하지 못하는 경우, 예외 상황에서 나타날 수 있는 결과를 예측하고 대응하기 힘들기 때문이다. 특히, 자율주행차의 실험은 매순간 상황이 변하는 실제 도로 환경에서 이루어진다. 보다 안정적이고 예측 가능한 결과를 생성하기 위해, 우리는 ConvNet의 동작원리를 제대로 이해하고 분석하려는 노력이 필요하다.

우리는 최근 weakly-supervised object localization 연구에서 ConvNet의 의사결정 과정을 해석할 수 있는 단서를 얻었다. 본 글에서는 CAM (class activation mapping)2을 활용하여 SLC의 동작원리를 분석하고자 한다.

Weakly-supervised object localization은 무엇인가?

일반적으로 널리 알려진 지도 학습(supervised learning)의 경우, 모델을 학습하기 위해서 해결하고자 하는 문제와 상응하는 정답셋이 요구된다. 예를 들어, 이미지 분류(image classification)문제에 대한 정답은 입력 영상에 대한 키워드로 주어지고, 사물인식(object detection)의 정답은 찾고자 하는 사물의 종류와 이미지 상에서의 좌표 값이 된다(그림 1). 문제의 난이도가 높아질 수록 정답셋을 구축하는 과정에 소요되는 시간과 비용은 증가되기 때문에, 기존의 데이터셋을 재활용하는 방법에 대한 다양한 연구들이 진행되고 있다. 약지도학습(weakly-supervised learning)은 반쪽짜리 정답셋을 이용하여 지도 학습과 동일한 임무를 수행하는 것을 목표로 한다. 대표적으로 weakly-supervised object localization은 사물의 종류만 알려진 이미지 분류 데이터셋을 활용해서 사물의 정확한 위치를 예측하는 문제이다.


그림1: 해결하려는 문제에 따라 같은 이미지에 대한 정답셋의 형식이 다를 수 있다. 이미지 분류 데이터셋(좌)과 사물인식 데이터셋(우)의 정답셋 예시.

 

실제로 모델 학습은 어떻게 이루어질까?

이미지 분류를 위한 ConvNet 모델들은 크게 영상 특징을 추출하기 위한 convolution 레이어와 이를 활용하여 영상의 클래스를 구분하기 위한 fully-connected 레이어로 구분된다(그림 2).


그림2: 기본적인 ConvNet 구조는 이미지특징을 추출하는 convolution 레이어와 추출된 특징을 이용하여 클래스를 구분하기위한 fully-connected 레이어로 구분된다. 지도 학습의 경우, 주어진 정답(y)과 예측값(x)의 격차를 줄여나가는 방식으로 학습이 진행된다.

 

Convolution 레이어들을 거친 뒤 얻어진 중간 특징값은 입력 영상 특징들을 공간적으로 보존한 상태이지만, fully-connected 레이어의 입력으로 그 형태가 변환되는 과정에서 원래 갖고 있던 공간 정보를 상실하게 된다. 사물의 정확한 위치를 알지 못하는 weakly-supervised object localization 문제에서는 convolution 레이어까지 통과한 중간 결과물을 활용하여 판단 과정에서 영상의 어느 영역이 주로 활성화가 되는지에 주목한다. 즉, 주어진 사물의 클래스에 대해서 보다 많은 영상 특징들을 포함하는 영역 안에 해당 사물이 위치할 것이라는 단순한 원리이다.

CAM의 구현3 4은 다음과 같다. 구체적으로 (224,224) 크기의 입력 영상에 대한 VGG16 네트워크의 마지막 convolution 레이어는 (512,7,7) 형태의 출력을 나타내는데, 이를 조금 다르게 해석하면 512개의 채널을 가진 (7,7)의 작은 특징 지도(feature map)로 생각할 수 있을 것이다. 이 때, 각 채널은 사물의 클래스를 판별하는데 각자 서로 다른 기여를 할 것이다. 따라서 CAM의 fully-connected 레이어는 학습 과정에서 각 채널에 대한 가중치 값들을 배우게 된다. 주어진 클래스의 종류에 따라 특징 지도 채널들의 가중합을 이용하면 ConvNet이 판단을 할 때 영상의 어떠한 영역을 주로 활용하는지에 대한 해석이 가능하다(그림 3).


그림3: Weakly supervised object localization 문제에서는 사물의 위치에 대한 정답이 누락된 상태이므로, 지도학습법과 동일한 방식으로 모델을 학습할 수 없다. Fully-connected 레이어의 파라미터와 convolution레이어를 거쳐 생성된 영상특징지도의 가중합으로 우리는 네트워크가 결정을 할 때 어느 영역의 영상정보를 보다 많이 활용하는지 이해할 수 있다.

 

다시 자율주행차 연구로 돌아가보자

SLC 모델을 학습시키기 위해서 우리는 아래의 기준으로 다양한 도로상황에서 취득한 측후방 영상들을 분류했다.

  • Blocked: 차량이 물리적으로 해당 공간으로 이동 또는 진입이 불가능한 경우
  • Free: 차량이 이동하기에 충분한 공간이 확보된 경우
  • Undefined: 차량이 이미 차선변경 상태이거나, 교차로, 또는 특이한 도로에 있는 경우

즉, 인간 운전자가 방향지시등 신호를 입력하고 사이드 미러를 통해 차선변경 가능 여부를 판단하는 것과 동일한 기준을 적용한 것이다. 또한 SLC 데이터셋은 다양한 운전자의 운전 성향을 반영하기 위해서 같은 장면에 대해서 여러 명의 작업자가 동일한 판단을 했을 때, 그것을 정답으로 인정하고 있다.

그렇다면 SLC모델은 전혀 가보지 않았던 새로운 도로에서도 정확한 판단을 할 수 있을까? 일반화 측면에서 SLC모델의 성능을 검증 위해서 우리는 학습과정에서 노출되지 않은 영상들을 따로 모아 테스트를 진행했으며, 96.98%의 높은 정확도를 얻었다.

이번에는 앞서 소개한 CAM을 이용해서 SLC모델이 실제로 우리가 의도대로 동작하는지 분석을 해보자. 우리는 이미 학습이 완료된 SLC모델의 convolution 레이어들의 모델 파라미터들은 고정하고, 기존의 fully-connected 레이어들은 512 차원의 새로운 fully-connected 레이어로 치환한 다음 재학습을 실시했다(재학습 과정에서 사용된 데이터셋은 초기 SLC모델 학습에 이용한 것과 동일하다). 아래의 그림에서 확인할 수 있듯이, 우리는 SLC모델이 사람 운전자의 판단과정과 유사하게 인접 차로의 빈 공간 유무를 통하여 차선변경 가능여부를 판단함을 알게 되었다.

그림4: SLC의 분류결과(좌), CAM을 통해 SLC가 집중하는 영역을 시각화(우)

아래 영상은 복잡한 도심 속 도로 환경에서 자율주행 상태로 주행 중인 차량의 실내와 인식 알고리듬들이 작동하는 모습을 동시에 녹화한 것이다. SLC알고리듬을 적용한 네이버랩스의 자율주행차는 실제 도로에서 여유 공간을 확보한 다음 안전한 차선 변경을 시도하고 있음을 확인할 수 있다.

참고자료

1. S.-G. Jeong, J. Kim, S. Kim, and J. Min, End-to-end Learning of Image based Lane-Change Decision, in Proc. IEEE IV’17

2. B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, and A. Torralba, Learning Deep Features for Discriminative Localization, in Proc. IEEE CVPR’16

3. matcaffe Implementation of class activation mapping: https://github.com/metalbubble/CAM

4. Keras Implementation of class activation mapping: https://github.com/jacobgil/keras-cam

Related Articles