개발일지

라즈베리파이 이용한 자율주행 프로젝트 본문

인공지능 AI/자율주행

라즈베리파이 이용한 자율주행 프로젝트

kosssshhhh 2023. 6. 21. 20:14

이번 학기 IoT시스템 설계 및 실습 수업에서 라즈베리 파이를 이용한 자율주행 프로젝트를 진행하였다.

 

사실 수업 초반에는 아두이노라던가 라즈베리파이에 대해서 무지한 상태였다.

 

따라서 초반엔 흥미롭지 않았지만, 자율주행 프로젝트를 진행하며 모델을 학습시키고 주행해보고 하는 과정에서 흥미를 느껴 한학기간 진행한 프로젝트를 블로그에 정리해보고자 한다.

 

해당 글은 라즈베리파이를 이용한 자율주행 자동차 제작이고,  학습 데이터 수집과 딥러닝 모델 학습에 중점을 두었다.

 

 

 

자율주행 자동차란?

 

 

자율주행 자동차란, 운전자 또는 승객의 조작 없이 자동차 스스로 운행이 가능한 자동차를 말한다.

 

정의에서 알 수 있듯이, 인간의 삶에 편리함을 주는 운전 장치라고 볼 수 있지만, 자율 주행 학습 과정에서 양질의 데이터가 주어지지 않거나, 제대로 학습이 진행되지 않는다면 큰 사고로 이어질 수 있는 가능성이 있다.

 

따라서 이를 방지하기 위해 더 다양하고 제대로된 학습 과정을 통해 최적의 학습모델을 구축해야한다. 

 

본 프로젝트에서는 RaspberryPi 를 이용한 자율주행 자동차를 제작하여, 축소된 자동차 트랙 안에서 최대한 목표 지점까지 빠르게 도달하는 것, 그리고 자동차가 자율주행하는 과정에서 트랙을 밟는 횟수를 최소화 하면서 최종 목적지까지 도달하는 것을 목표로 하였다. 

 

 

 

 

학습 데이터 수집 

 

 

데이터를 수집하기 위해, OpenCV 를 활용하여 자율주행 자동차에 부착되어있는 카메라를 사용하였다. 카메라로 손수 주행을 진행하며 연속해서 사진 촬영을 하며 학습 이미지 데이터를 수집하였다.

 

트랙의 라인을 인지하는데에 이미지의 하단 일부분만이 필요했고 윗부분은 오히려 노이즈로 작용하여 이미지의 윗부분을 잘라내어 학습 데이터로 사용하였다. 

 

또한 자율주행 자동차의 중요한 점 중 하나가 차선을 식별하는 능력이다. 차선을 식별하는 데에 필요한 것을 여러 색이 아닌 밝기를 통한 차선의 유무이기에 밝기에 좀 더 예민하게 조절하였다.

 

또한 Gaussian Blur 를 통해 기본적인 노이즈 값을 제거하여, 더 잘 식별되도록 하였다.

 

마지막으로 Threshold 값 조절을 통해 빛의 밝기가 160 이하인 값들은 모두 0으로 만들어 완전한 검정색을, 밝기 정도가 160 이상인 값들은 255로 밝기를 최대한으로 조정하여 구분되는 두개의 밝기로 조절하였다.

 

이러한 방식을 통해 학습데이터를 얻은 것이 아래의 이미지이다. 

 

조향각에 따른 학습 데이터 구분

 

 

다음으로, 학습 데이터 수집과정에서 이미지에 해당하는 방향을 정해주어야 한다.

 

따라서 학습과정에서 운전자가 방향키를 통해 자동차를 운전하고, 누른 방향키에 따라 그 값을 이미지에 저장해주었다.

 

그리고 코스를 여러 바퀴 주행하며, 대략 30000~50000장의 이미지 데이터를 수집하였다. 

 

 

 

학습 모델 및 방법 

 

 모델링 하는 과정에서 좋은 학습모델을 구축하기 위해 직진, 좌회전, 우회전 데이터가 치우치지 않도록 골고루 분포하도록 데이터를 조정하였다. 

 

학습 모델은 Nvidia 모델을 사용하였다. 

 

Nvidia model 구축

 

모든 이미지들은 200 x 66 x 3 개의 픽셀로 이루어져 있는데, 이 값들을 딥러닝 모델을 통해 줄여나가기 위해, Convolution 을 통해 픽셀의 크기를 줄여나간다. 

 

위에 모델은 픽셀 크기를 조정해 나가는 과정을 [5, 5] 사이즈를 Convolution 한다. 이 과정에서 Strides 는 2로 지정하여 기존 픽셀을 잘 보존하면서 Convolution 을 해나가도록 설정하였다. 

 

그리고 데이터셋에 대해 test, valid 학습 데이터셋으로 나누어 학습할 수 있도록 하였다. 

 

이러한 과정을 거친 후, 해당 데이터셀을 바탕으로 학습모델을 학습하고 자율주행 테스트를 하는 과정이 필요하다. 

 

모델 학습에서 중요한 batch size 와 epoch 수를 설정한 후, 중간 결과들을 저장하기 위해 pickle 모듈을 사용하여 저장하였다. 

 

중간중간 저장한 pickle 모듈을 통해 다음과 같이 모델의 loss 를 시각화 해보았다.

 

학습 loss, 딥러닝 모델 학습 과정

 

 

학습 성능을 확인하기 위한 지표로 MSE 와 r-squared 값을 사용하였다. 

 

딥러닝 모델에 대해서 batch size와 epoch을 하이퍼파라미터 튜닝하며 최적의 하이퍼파라미터를 찾기위해 튜닝해보았다.

 

하이퍼파라미터 튜닝 결과

 

하이퍼파라미터 튜닝 결과 지표들과 해당 모델로 주행까지 해본 결과이다. 

 

표에서도 보다시피 r-square 값과 주행의 결과와는 크게 상관이 없는 것을 확인할 수 있었다. 

 

따라서 프로젝트를 진행할수록 성능지표에 크게 신경을 쓰는 것이 아니라 모델을 구축한 후 그 모델로 실제 자율주행을 진행하여 확인하는 방식으로 진행하였다. 

 

또한 카메라 각도, 타이어 등의 하드웨어적인 문제점도 존재하여 문제가 발생하였을 때 어떤 것이 잘못된 것인지 파악하는데에도 큰 혼란을 겪었다. 

 

또한 직각 코스에 대해서 카메라의 각도가 고정되어 있으므로 좌회전 우회전에 전반적인 상황을 모두 담는 것에 큰 난항을 겪었다.

 

프로젝트를 진행하며 하드웨어적인 문제에 대한 고찰도 할 수 있었다. 

 

 

 

기본 코스 자율주행

 

U턴 코스 자율주행