computer vision fundamental

udacity self driving car의 computer vision 부분을 통해 학습한 내용을 정리한 페이지 입니다.

차선인식?

자율주행을 위해 상황을 인식하는 건 매우 중요한 일입니다. 특히 도로주행의 기본인 차선을 따라 이동하는 건 당연히 차선을 정확히 인식하여야 합니다. 사람은 차선을 인식하기 위해 눈으로 도로를 보고, 도로에서 차선을 식별하여 주행을 합니다. 컴퓨터 역시 차선을 인식하기 위해 카메라 혹은 다른 별도의 센서를 통해 도로를 감지하고, 센서로부터 받은 데이터중 유효한 데이터를 통해 차선을 인식합니다.

udacity self driving car에서는 차선을 인식하기 위한 정보로 크게 색상, 모양, 방향, 위치를 예시로 설명하고 있는 듯 합니다.

색상

카메라로 이미지를 받아 처리할때 컴퓨터는 이미지를 RGB로 처리하게 됩니다. 이미지는 가로 * 세로의 크기를 가지고 Red, Green, Blue의 정보를 담은 배열로 나타내어 집니다. 이 중 차선 (보통의 경우 흰색이므로 (255,255,255)) 과 비슷한 수치에 해당하는 RGB 값을 추출하여 차선을 인식하게 됩니다.

위치 (ROI)

위와 같이 이미지에서 흰색만 추출하는 경우 차선 이외에도 구름, 건물과 같이 원하지 않는 흰색 역시 추출하게 됩니다. 이러한 경우를 막기 위해 특정영역에서만(현재 상황에선 도로가 됩니다) 차선을 인식 하도록 설정하여야 합니다. 이러한 개념을 관심영역(ROI : Region Of Interest)라고 합니다.

모양 그리고 방향

먼저 컴퓨터 비전에 대한 간략한 이야기를 해야할 것 같습니다. 사용자는 컴퓨터 비전 기술을 통해 이미지 데이터를 받고 일련의 알고리즘을 통해 데이터를 처리, 추출하게 되는데 이러한 과정을 쉽게 할수 있도록 도와 주는 open library가 있습니다. 바로 OpenCv입니다.

Note

OpenCv는 c/c++로 개발되었으나 다양한 프로그래밍 언어에서 지원을 하며 python도 그중 하나입니다.

앞으로 나올 canny edge와 허프 변환 둘다 OpenCv에서 지원하는 기능입니다.

canny edge

canny edge는 John F. Canny에 의해 개발되었으며 이미지를 grayscale(채도가 없는 상태)로 변환한 후 gradient 값이란 것을 찾게 됩니다. gradient값이란, 픽셀값 변화의 기울기를 뜻합니다. 예를 들어 흰색과 검은색이 붙어있는 경우를 생각해보면 흰색에서 검은색으로 이동할 경우 gradient값은 높아지게 됩니다. (grayscale 변화량/ pixel 변화량 으로 이해하시면 될 듯 합니다)

gradient 값을 찾은 경우, 사용자가 설정한 값에 따라 edge를 결정합니다.

그림과 같이 사용자가 최대수치와 최소수치를 정하게 되는데, 최대수치 이상의 gradient값 인 경우 edge로 보고, 최소수치 이하인 경우 edge에서 제외시킵니다. 그후 최대와 최소값 사이의 gradient값은 최대 수치 이상의 gradient값과 연결되어 있는 경우 edge로 보게 됩니다.

허프 변환

허프 변환은 차선을 쉽게 찾기위해 사용됩니다. 보통 차선은 직선의 형태를 가지고 있기에, 카메라로 도로 이미지를 받아온 후 흰색 직선을 찾는 것이 간단한 차선인식의 한 방법입니다. 이때 직선을 찾기 위하여 사용 하는 방법이 허프 변환 입니다.

허프 변환을 쉽게 이해하기 위해 y=mx+b라는 선형 방정식이 있다고 합시다. 이러한 경우 x,y축 상에서 m,b가 상수라 취급하면 기울기 m, y절편 b의 값을 가지는 직선이 생깁니다. 그럼 반대로 m,b축을 가지는 좌표계에서 x,y 를 상수로 취급하면 x,y는 점이 됩니다. 그럼 x,y의 한점은 m,b가 변수인 선형 방정식이 됩니다. 그럼 x,y 가 여러점일경우 위의 그림과 같이 m,b방정식의 교점이 직선을 나타내는 값이 됩니다.

이러한 방식에는 문제점이 있습니다. 기울기가 y축에 평행하게 되는 경우 m이 무한대가 되어버리기 때문에 m,b좌표계에서 표현할 수 없게 되어버립니다. 이러한 문제를 막기 위해 r(원점에서의 떨어진 거리), \theta (x축에서의 각도)를 축으로 하는 좌표계를 사용합니다.