자율 주행 차량은 점차 자동차 산업의 중요한 부분이 되어가고 있습니다. 많은 사람들이 완전 자율 주행 차량이 곧 인간과 함께 도로를 달릴 것이라고 믿으며, 기술 회사들은 완전 자율 주행 차량을 배치하기 위해 경쟁 중입니다. 2018년 12월, Waymo, 구글의 자율 주행 차 프로젝트에서 출발한 회사는 피닉스 교외에서 상업적 자율 주행 차 서비스를 공식적으로 시작했습니다. May Mobility, Drive.ai, Uber와 같은 회사들도 같은 길을 따르고 있습니다.
자율 주행 차량은 거창한 비전처럼 보일 수 있지만, 반자율 주행 차량은 이미 우리 사이에 있습니다. 새로운 테슬라 차량에는 차선 인식 및 추적, 적응형 크루즈 컨트롤, 자동 주차가 가능한 테슬라 오토파일럿 기능이 탑재되어 있습니다. 도로 위의 차선을 식별하고 추적하는 능력은 무인 차량에 필요한 많은 전제 조건 중 하나입니다. 차선 인식이 어려운 문제처럼 보일 수 있지만, NVIDIA Jetson Nano 하드웨어 플랫폼을 사용하여 차선 인식 및 추적 알고리즘 개발을 시작할 수 있습니다.
Jetson Nano COM은 Raspberry Pi 3보다 약간 크지만, 472 Gflops의 성능으로 병렬로 신경망을 실행할 수 있습니다. 이는 Raspberry Pi 3보다 약 22배 더 강력하며, 단 5W만 소비하는 매우 효율적인 전력 소비를 자랑합니다. 이 보드는 축소된 리눅스 커널에서 실행되는 임베디드 AI 애플리케이션에 완벽합니다. 고품질 이미지 및 비디오 처리 애플리케이션을 위한 충분한 처리 능력과 온보드 메모리를 갖추고 있습니다. Jetson Nano의 주요 특징은 다음과 같습니다:
이 프로젝트를 위해서는 Jetson Nano COM 또는 개발 보드와 CSI 카메라(라즈베리 파이 CSI 카메라 v2가 잘 작동함)가 필요합니다. 이 애플리케이션을 Nano 개발 보드를 사용하여 보여드리겠지만, Nano COM용 사용자 정의 베이스보드를 쉽게 구축하고 이 애플리케이션을 배포할 수 있습니다. CSI 카메라는 Jetson Nano의 카메라 포트에 연결될 것이지만, USB 카메라나 IP 카메라를 사용할 수도 있습니다. 이 프로젝트를 성공적으로 작동시키기 위한 필요한 요구 사항은 다음과 같습니다:
이 프로젝트의 전체 구현은 GitHub에서 찾을 수 있습니다. 이 프로젝트의 데모를 실행하고 작동시키기 위해 다음 단계를 따라하세요. 이 단계들은 차선 인식을 더 정확하게 만들기 위해 의도된 중요한 이미지 처리 단계입니다.
우리의 차선 감지 시스템의 첫 번째 단계는 카메라에서 실시간 이미지를 읽을 수 있는 것입니다. Jetson Nano를 처음 사용하는 사용자들에게는 카메라 작업이 까다로울 수 있습니다. 이를 위해 NanoCamera 라이브러리를 사용할 것입니다. 이 라이브러리는 생산 등급 애플리케이션에는 최선의 선택이 아닐 수 있지만, 여기에 표시된 것과 같은 간단한 애플리케이션에는 작동합니다.
먼저, pip로 라이브러리를 설치하세요:
카메라에서 실시간 이미지 읽기:
이미지를 부드럽게 하고 원치 않는 노이즈를 제거하기 위해, 가우시안 블러를 적용할 수 있습니다. 이는 주변 픽셀의 가중 평균을 계산하여 각 픽셀의 값을 계산하는 것을 포함합니다.
OpenCV는 이미지에 가우시안 블러를 적용하기 위한 함수를 포함하고 있습니다:
가우시안 블러 이후에도 이미지는 여전히 RGB 상태이며 HSV 색 공간으로 변환되어야 합니다. 색상 분리는 이미지에서 원치 않는 색상을 제거하는 데 사용됩니다. 이미지가 HSV에 있으면, 회색조 범위를 지정하여 이미지에서 모든 불필요한 색상을 "제거"할 수 있습니다.
확장은 이미지의 객체 경계에 픽셀을 추가합니다. 이미지에 확장을 적용하면 선 이미지의 느슨한 공간을 닫는 데 도움이 됩니다.
차선을 감지하기 위해 Canny 에지 검출이라는 기술을 사용할 수 있습니다. Canny 에지 검출은 객체에서 유용한 구조적 정보를 추출하는 데 사용될 수 있습니다. OpenCV 라이브러리는 이미지에서 에지를 감지하는 데 사용할 수 있는 Canny 에지 검출 함수를 제공합니다. Canny 검출이 작동하려면 최소 및 최대 임계값을 제공해야 합니다. OpenCV는 보통 (100, 200) 또는 (200, 400) 값을 권장하므로, 우리는 (200, 400)을 사용하고 있습니다.
Canny 에지 출력 이미지에는 일부 노이즈가 포함되어 있습니다. 이미지에서 차선 이외의 모든 정보는 관심 영역을 줄임으로써 분리될 수 있습니다. 차선 인식 및 탐색을 수행할 때 전체 이미지를 볼 필요는 없습니다. 이를 수행하는 쉬운 방법은 이미지 상단 절반을 자르는 것입니다.
관심 영역을 줄이는 코드는 다음과 같습니다:
관심 영역을 축소한 후, 네 개의 뚜렷한 선으로 구성된 차선이 명확하게 보입니다. 그러나 컴퓨터는 이 선들이 두 차선의 경계를 나타낸다는 것을 알지 못합니다. 그래서, 이 차선 선들의 좌표를 추출하는 방법이 필요합니다. 허프 변환은 선, 원, 타원과 같은 특징을 추출하기 위해 이미지 처리에서 사용되는 기술입니다. 이는 선을 형성하는 것처럼 보이는 여러 픽셀로부터 직선을 찾는 데 사용될 수 있습니다. 이는 OpenCV의 HoughLinesP 함수를 사용하여 수행될 수 있습니다. 이 함수는 모든 흰색 픽셀을 통해 많은 선을 맞추고 일정한 최소 임계값 제약 조건을 충족하는 가장 가능성 있는 선의 집합을 반환합니다.
여기 허프 변환을 사용하여 선분을 감지하는 우리의 코드가 있습니다. 여기서 사용된 대부분의 매개변수는 시행착오를 통해 결정하거나 참조 이미지에서 매개변수를 선택하여 결정할 수 있습니다.
detect_line_segments() 함수의 출력은 끝점 좌표(x1, y1) 및 (x2, y2)를 가진 작은 선들의 집합을 생성합니다. 우리는 이것들을 왼쪽과 오른쪽 차선 선으로 단지 두 개의 선으로 결합하는 방법을 찾아야 합니다, 그러나 어떻게 이루어질까요? 한 가지 방법은 이 선분들을 그들의 기울기에 따라 분류하는 것입니다.
모든 왼쪽 차선 라인은 양의 기울기를 가지고 있으며, 오른쪽 차선 라인에 속하는 선분들은 음의 기울기를 가집니다. 이 두 새로운 그룹을 기반으로, 선분들의 기울기와 절편의 평균을 취하여 왼쪽과 오른쪽 차선 라인의 기울기와 절편을 얻을 수 있습니다. 이는 average_slope_intercept() 함수로 구현됩니다:
make_points() 함수는 average_slope_intercept() 함수를 위한 헬퍼 함수로, 선의 기울기와 절편을 받아 선분의 끝점을 반환합니다. 이 시점에서, 우리는 이제 차선 라인을 가지고 있습니다!
이 시점에서, 이 함수의 출력은 차량의 속도와 방향을 제어하기 위한 다른 알고리즘에 입력될 것입니다. 이를 위해, 감지된 차선 라인에서 조향 각도를 계산한 다음 이를 PID 컨트롤러에 전달하여 조향 각도를 최소화하고 차량을 중앙에 유지할 수 있습니다.
이 작업은 나노 개발 보드를 사용하여 수행되었지만, 동일한 코드는 생산 환경에서 임베디드 이미지 처리 시스템을 배포하기 위한 시작점을 제공합니다. 이를 위해서는 Jetson Nano용 실제 베이스보드를 구축해야 합니다. 이는 Upverter 보드 빌더 애플리케이션에서 모듈러 전자 설계 도구를 사용할 때 가장 쉽습니다. 모듈러 접근 방식을 취함으로써, Jetson Nano, 카메라 및 차선 인식을 위한 기타 센서용 베이스보드를 쉽게 맞춤 설정할 수 있습니다.
Upverter의 모듈러 전자 설계 도구는 새로운 소프트웨어를 다운로드하거나 설치하지 않고도 산업 표준 COM 및 인기 모듈에 대한 광범위한 접근을 제공합니다. 드래그 앤 드롭 사용자 인터페이스를 사용하여 Jetson Nano를 사용한 차선 인식 및 기타 이미지 처리 작업을 포함한 다양한 애플리케이션을 위한 생산 등급 하드웨어를 만들 수 있습니다. 시스템에 추가 기능이 필요한 경우, 무선 연결성, 다양한 센서 등을 포함할 수 있습니다.
Gumstix 고객 성공 사례를 살펴보거나 오늘 저희에게 연락하여 저희 제품, 설계 도구 및 서비스에 대해 자세히 알아보세요.