Skip to main content

자율주행 자동차를 위한 시맨틱 세그멘테이션

fast.ai를 이용한 시맨틱 세그멘테이션. 이 글은 AI 번역본입니다. 오역 가능성이 있으면 댓글로 알려주세요.
Created on September 15|Last edited on September 15
자율주행차는 주변 환경에 대한 깊은 이해가 필요합니다. 이를 위해 카메라 프레임을 활용해 도로, 보행자, 자동차, 보도를 픽셀 단위의 정확도로 인식합니다. 이 프로젝트에서는 fast.ai와 데이터셋을 사용해 시맨틱 세그멘테이션을 수행하는 신경망을 개발하고 최적화합니다. Berkeley DeepDrive.
U-Net 네트워크는 시맨틱 세그멘테이션에 매우 효율적입니다. fast.ai 같은 라이브러리는 U-Net 네트워크를 빠르게 구성하고, 전이 학습을 활용하기 위해 수축 경로(아래 그림의 왼쪽 절반)를 사전 학습된 네트워크로 교체할 수 있는 기능을 기본 제공한다는 점에서 매력적입니다. 여러 보조 함수가 고급 학습 정책과 학습 방법론도 편리하게 구현해 줍니다. 덕분에 우리는 아키텍처의 다양한 변형을 빠르게 반복 실험하고 최적화에 집중할 수 있었습니다.

일반적인 U-Net 아키텍처
Berkeley DeepDrive 데이터셋은 다양성이 매우 높으며, 여러 도시와 다양한 날씨 조건에서 서로 다른 차량들이 수집한 라벨된 세그멘테이션 데이터를 제공합니다. 이는 자율주행차에 필수적인데, 다양한 기상 상황 전반에서 모델 성능을 향상시키고 과적합을 피하며 불필요한 정규화를 줄이는 데 도움이 됩니다.
샘플 수가 너무 적거나 이미지들이 서로 지나치게 유사하면, 신경망은 학습 데이터에 과도하게 집중하게 되어 보지 못한 데이터에 일반화하지 못합니다(검증 손실이 높아짐). 정규화를 통해 이를 완화할 수 있지만, 그 과정에서 학습 손실이 나빠지는 부작용이 따릅니다. 더 풍부하고 다양한 데이터셋을 사용하면 이러한 상황을 피할 수 있으며, 학습 손실과 검증 손실 모두를 개선할 수 있습니다.


이 데이터셋이 완벽하지 않다는 점은 중요합니다. 이런 유형의 데이터를 라벨링하는 일은 매우 어렵기 때문입니다.

세그멘테이션 데이터는 각 클래스를 서로 다른 정수로 표현한 이미지입니다. 라벨이 있는 픽셀은 0부터 18까지이며, 이는 고유한 클래스(도로, 자동차, 보행자, 표지, 기차 등)를 나타냅니다. 라벨이 없는 픽셀은 255로 설정됩니다. 우리는 전처리 과정에서 라벨이 없는 픽셀을 19로 변경하여, 연속된 정수로 표현된 20개의 고유 클래스를 구성합니다. 이는 세그멘테이션 데이터의 보다 표준적인 표현 방식입니다.
정확도를 계산할 때는 라벨이 없는 픽셀(클래스 “19”)을 제외합니다.
먼저 입력 해상도를 256×256으로 줄여 시작하고, 다양한 변형을 실험해 무엇이 효과적인지 빠르게 파악합니다.

첫 번째 실행 묶음에서 얻은 몇 가지 관찰 사항:
  • 사전 학습된 네트워크는 훨씬 더 나은 결과를 가져왔다
  • the "1사이클" 정책을 적용하자 훨씬 더 나은 결과가 나왔다
  • 최적의 학습률, 가중치 감쇠, 배치 크기는 단순히 결정할 수 있는 문제가 아니며, 다른 하이퍼파라미터에 따라 크게 달라집니다.
  • 두 인코더 변형 모두 높은 정확도로 이어질 수 있습니다
마지막으로, 더 큰 이미지를 사용할 때는 정확도 90%를 목표로 삼는 것이 타당해 보입니다.
원본 가로세로 비율을 유지할 때 320×180 해상도만으로는 좋은 예측을 얻기 어렵기 때문에, 결국 640×360을 사용합니다.
우리는 빠르게 정확도 89%에 도달했지만, 90%에 도달하는 것은 의외로 어렵습니다. 더 긴 학습과 학습률 조정을 통해 결국 성공했습니다.
우리는 2단계로 학습을 시도하기도 합니다:
  • 첫 단계에서는 사전 학습된 네트워크를 인코더로 사용하며, 해당 가중치는 고정합니다.
  • 두 번째 단계에서는 네트워크의 동결을 해제하고 더 낮은 학습률로 학습합니다
이는 학습 손실을 개선하지만 검증 정확도는 변하지 않아, 과적합이 발생했음을 시사하며 더 많은 데이터나 정규화가 필요할 수 있음을 보여줍니다.
마지막으로, 학습 과정에서 예측 결과가 어떻게 변화하는지 관찰하는 것도 흥미롭습니다. 이미지에서 큰 비중을 차지하는 보닛과 도로는 네트워크가 빠르게 식별하여 정확도가 빠르게 높아집니다. 이후에는 경계를 점차 정교하게 다듬고 보행자, 자동차 등 다른 클래스들을 식별하는 법을 학습합니다.

이는 손실 함수에 일부 개선이 필요함을 시사합니다.
  • 각 클래스마다 서로 다른 가중치를 정의해야 합니다.
  • 교차 엔트로피 손실은 이 과업에 더 적합한 손실(예: )로 대체되어야 합니다 다이스 계수, 즉 F1 점수).
제가 처음 시도할 방법은 F-베타 점수 각 클래스에 대해(“베타” 요소를 포함한다는 점을 제외하면 Dice 계수와 동일) 일반화된 공식은 다음과 같이 정의됩니다:

재현율과 정밀도는 아래와 같이 정의됩니다:

베타 값을 조정하면 정밀도와 재현율 중 어디에 더 가중치를 둘지 결정할 수 있습니다. 예를 들어, 보행자 클래스에는 재현율을 더 중시하기 위해 베타를 크게(> 1) 설정해 놓치지 않도록 하겠습니다. 반면, 베타를 낮게 설정해
손실 함수는 기울기를 계산해 최소화할 수 있도록 미분 가능해야 합니다. 우리는 참양성 값을 레이블과 로짓의 곱을 합한 값으로 근사합니다. 또한 두 집합의 합집합은 같은 요소를 두 번 세더라도 그 합으로 간주합니다. 몇 가지 단순화를 거치면 다음과 같은 식으로 정리됩니다:

수치적 안정성과 검출된 픽셀이나 정답 픽셀이 전혀 없는 경우를 처리하기 위해 분자와 분모에 작은 항을 추가합니다. 또한 이 값을 최대화해야 한다는 점이 중요하므로, 손실은 그 반대 부호로 정의할 수 있습니다.
마지막으로, 네트워크가 이미지에서 가장 큰 영역을 차지하는 클래스(예: 도로, 차량 보닛)에 과도하게 집중하지 않도록, 전체 점수는 각 개별 점수의 합으로 정의합니다:

여기서 가중치 𝛼는 각 클래스에 더 큰 혹은 더 작은 중요도를 부여하도록 조정됩니다.
첫 실험으로는 모든 가중치를 동일하게 두겠습니다. 이는 각 클래스가 이미지에서 차지하는 비율과 무관하게 동일한 중요도를 부여한다는 뜻입니다. 이후에는 직관을 활용해 각 클래스의 중요도를 정하고(예를 들어 보행자는 배너보다 더 중요할 가능성이 큽니다), 관찰된 결과를 바탕으로 가중치를 조정하겠습니다.
극단적으로는, 이러한 가중치가 다른 매개변수에 따라 달라질 수도 있습니다:
  • 가시성 조건은 무엇인가요? 예를 들어 밤, 눈 등일 때, 그에 따라 교통 표지에 더 높은 중요도를 부여해야 할까요?
  • 지금 도시 안에 있나요? 그렇다면 다가오는 자전거와 보행자에 특히 더 주의해야 할까요?
가장 성공적인 모델은 대개 구조가 단순하고 직관적입니다. 따라서 기준선으로는 각 클래스에 동일한 가중치를 부여한 손실 함수를 확실히 사용하겠습니다.
모델을 자유롭게 실험해 보세요! 자세한 내용은 다음을 참고하세요:

이 글은 AI로 번역된 기사입니다. 번역 오류가 의심되는 부분이 있으면 댓글로 알려주세요. 원문 리포트 링크는 다음과 같습니다: 원문 리포트 보기