논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

Towards End-to-End Lane Detection: an Instance Segmentation Approach

Problem

  • 카메라 기반의 Lane 검출은 hand-craft feature에서부터 CNN을 이용하는 방법까지 발전되어왔다.
  • 최근의 CNN을 이용하는 방향 중 하나는 binary segmentation 이후, 후처리를 이용하여 각 lane을 구분해 낸다. 그 중에는 geometric 속성을 이용한 휴리스틱 방법에 기대는 방법이 있고, multi-class segmentation 으로 각 lane을 종류별로 구분해서 처리하는 방법도 있다.
  • 전자는 계산량이 많고 robustness 이슈가 있고, 후자는 각 lane이 class로 명확하게 구분이 되어야 하기 때문에 lane 변경 하는 상황에는 대응할 수 없는 단점이 있다.

Essence

  • 논문에서는 이러한 문제를 뛰어 넘고자 각 lane을 lane의 instance를 가지도록 설계하였다.
  • 모델을 multi-task로 구성하여 lane segmentation branch와 lane embedding branch로 구성하여 end-to-end로 학습하였다. Lane segmentation branch는 background와 lane을 구분하도록 하고 lane embedding branch는 segmented lane을 각 instance로 구분짓는 역할을 한다.
  • 이렇게 하면 segmentation branch는 instance에 관련없이 lane만을 검출하는데 집중할 수 있고, embedding branch는 배경 정보는 무시하고 각 lane을 구분하는데 집중할 수 있게 된다.
  • Lane이 검출되면 마지막 단계로 각 lane을 parametric description으로 변환하는 작업을 한다.
  • 여기에서는 perspective transform을 이용하여 curve를 fitting할텐데, 기존 연구들에서 정해진 transform을 이용하는 반면 여기에서는 neural network로 학습한 transform을 이용하였다.

Detail

LaneNet

  • LaneNet은 multi-task network로 학습되는 lane detection 네트워크로 lane의 수에 제한이 없으며 차선 변경에도 대응할 수 있다. 그림과 같이 2개의 branch로 나누어진다.

Binary Segmentation

  • Segmentation branch는 lane에 해당하는지 하지 않는지에 대한 binary segmentation map을 출력한다.
  • GT는 모든 lane에 해당하는 연결하여 하나의 segment로 생성한다. 차로 가려져 있거나 화면에서 lane이 없어지더라도 마치 있는 것처럼 연결하여야 한다. 이렇게 함으로써 가려지는 등의 상황에서도 lane을 검출할 수 있게 된다.
  • Loss는 cross-entropy loss를 사용하며, class가 매우 unbalance하기 때문에 [29]에 나온 것처럼 inverse class weighting을 적용하였다.

Instance segmentation

  • Lane의 instance를 생성하기 위해 distance metric learning 기반의 ont-shot method [5]를 사용하였다.
  • Instance embedding branch는 서로 같은 lane끼리는 값의 차이가 적고, 서로 다른 lane 끼리는 값의 차이가 최대가 되도록 학습시킨다. 이렇게 함으로써 같은 lane들을 cluster로 묶을 수 있다.
  • 이 방법은 veriance term L_{var}과 distance term L_{dist}을 이용함으로써 학습이 되는데, 전자는 각 embedding이 그 평균에 가까워지는 힘을 반영하고, 후자는 다른 cluster들이 서로 얼마나 떨어져 있는지를 반영한다.
  • 두 term은 hinged되어있어 variance에서는 \delta_v 이상 떨어진 경우에만 활성화되고 distance에서는 \delta_d내에 위치하는 경우만 활성화된다.
  • 실제 로스는 아래와 같다.

L = L_{var} + L_{dist}

L_{var} = \frac{1}{C} \sum^C_{c=1} \frac{N_c}{1} \sum^{N_c}_{i=1} [||\mu_c - x_i|| - \delta_v]_+^2

L_{dist} = \frac{1}{C(C-1)} \sum^C_{c_A=1} \sum_{c_B = 1,_{C_A \neq c_B}}^C [||\delta_d - ||\mu_{c_A} - \mu_{c_B}||]_+^2

  • 여기서 C는 cluster (lane)의 수, N_c는 각 cluster에 속하는 element의 수를 의미한다. x_i는 각 pixel의 embedding을, \mu_c는 cluster c의 평균 embedding을 의미힌다. || \cdot ||는 L2 distance이며, [x]_+ = \max(0, x)는 hinge를 의미한다.

Clustering

  • 클러스터링은 iterative procedure로 이루어진다.
  • 먼저 위의 loss에서 \delta_d \gt 6 \delta_v로 설정하였을 경우, 하나의 lane embedding을 선택하여 2\delta_v내의 embedding을 같은 lane으로 선택한다. 이것을 모든 lane embedding이 할당될 때까지 반복한다.
  • 단, threshold 근처의 outlier가 선택되는 것을 막기 위해 mean shift를 먼저 적용하고 cluster center로부터 thresholding 을 한다.

Network architecture

  • LaneNet은 encoder-decoder 구조의 ENet에서 출발하였는데, 모든 파라미터를 공유하는 것은 결과가 좋지 않았다.
  • 따라서 1, 2번째 encoder 스테이지만을 공유하고, 이후 3번째 encoder 스테이지와 decoder 부분은 각 branch마다 따로 분리하였다.

Curve fitting using H-Net

  • 보통 사용되는 방법은 lane을 bird-eye-view로 변환하여 polynomial로 fitting하는 방법을 사용하는데, 주로 변환 matrhx H가 고정된 것을 사용하여 ground-plane이 변화하는 환경에서 에러가 발생한다.
  • 이를 해결하기 위해 H-Net을 이용하여 H를 prediction하도록 하였다. H는 다음과 같이 6개의 DoG를 가진다.

H = \begin{bmatrix} a & b & c \ 0 & d & e \ 0 & f & 1 \end{bmatrix}

  • 어느 한 lane의 픽셀들과 H가 주어질 경우, lane의 위치 \mathbf{p}_i는 transformed 위치 \mathbf{p'}_i = H \mathbf{p}_i로 변환된다. 이 변환된 점들에 대해 least-sqaure를 이용하여 n-degree polynomial fitting f(y')을 하여 {x'}_i^\ast 를 추정한다. 다음 fitting된 x로 교체된 \mathbf{p'}_i^\ast = [{x'}_i^\ast, y'_i, 1]^T를 이용하여 다시 원래 lane의 위치로 projection한 뒤, x 위치에 대해 차이를 계산한다. 이 차이를 이용하여 H를 평가할 수 있다.

  • 이를 식으로 표현하면 다음과 같다.

\mathbf{P'} = H\mathbf{P}

\mathbf{w} = (\mathbf{Y}^T \mathbf{Y})^{-1} \mathbf{Y}^T \mathbf{x'}

\mathbf{w} = [\alpha, \beta, \gamma]^T, \mathbf{x'} = [x'_1, x'_2, \cdots, x'_N]^T

\mathbf{Y} = \begin{bmatrix} {y'}_1^2 & {y'}_1 & 1 \ \vdots & \vdots & \vdots \ {y'}_N^2 & {y'}_N & 1 \end{bmatrix}

\mathbf{p}_i^\ast = H^{-1} \mathbf{p'}_i^\ast

  • 최종 loss는 아래와 같다.

Loss = \frac{1}{N} \sum_{i=1, N} (x^\ast_i - x_i)^2

  • 네트워크는 3x3 convolution, batchnorm, ReLU로 구성된 블록을 연속으로 붙였으며, max-pooling으로 차원을 줄인 뒤, 2개의 fully connected layer를 붙였다.



Add a Comment Trackback