[자율주행] Lane Detection

이진호·2023년 5월 19일
1

자율주행

목록 보기
1/7
post-thumbnail
post-custom-banner

2023년 5월 2일부터 5월 4일까지 열린 '제2회 국제 대학생 EV 자율주행 경진대회(ADSC)'에 참여했다.
내가 맡은 분야와 이번 대회를 통해서 전체적으로 느낀점을 써보려고 한다.

1. 기존에 있던 ENet을 활용하여 Lane Detection 하는 방법

Tusimple dataset을 활용하여 Lane detection ENet model을 학습시켰다.(해당 gihub: https://github.com/IrohXu/lanenet-lane-detection-pytorch)
epoch와 optimizer, batchsize등의 하이퍼 파라미터 값들을 조정해가며 학습을 시켰으며 이전 작성글처럼 더 좋은 성능을 내는 것을 확인할 수 있었다. 하지만 시뮬레이션 환경인 MORAI에서는 잘 작동하지 않는 것을 확인할 수 있었다.


위의 사진처럼 segmentation 자체가 이상하게 나오는 것을 알 수 있다. 이는 여러가지 이유가 있을 수 있다.
일단 첫 번째로 학습 데이터의 문제이다. 앞서 언급했듯이 해당 모델은 실제 도로 데이터인 Tusimple을 가지고 학습했다. 실제 도로와 시뮬레이터 사이의 괴리감이 인지를 잘 하지 못한 것 같다.
내가 분석한 두 번째 이유는 카메라의 외부 파라미터 값이다. 실제로 카메라를 어디에 어떻게 다드냐, 어떤 각도로 다드냐에 따라서도 해당 시뮬레이터에서의 segmentation하는 결과가 달라졌다. 위 사진 카메라를 낮게 달아 성능이 엄청 안 좋을때 찍은 결과이다.
마지막으로 카메라의 해상도 문제이다. 학습 데이터인 Tusimple data는 1280*720의 해상도를 가진 data들이다. 하지만 MORAI에서 사용해야만하는 카메라의 해상도는 640*480이다. 이로 인해서 차선을 보는 시야각이 많이 좁아지며 학습한 data와 달라 충분히 문제가 생길 수 있다고 생각한다. (Tusimple data 사진 한 장 추가할 것)

2. OpenCV를 활용한 Lane detection

MORAI에서 segmentation data를 따로 만들어서 학습시키면 될 것 같다고 생각했었다. 하지만 시간적인 여유가 없어서 결국 OpenCV를 활용하기로 했다. OpenCV는 이전 MACARON 사람들이 사용했던 코드를 개선해서 사용하기로 했다.
ROS를 이용하여 Image Topic을 받아온 것을 GaussianBlur를 해준다. (아래는 GaussianBlur를 해준 image)

이후 CannyEdge와 ROI를 통해서 원하는 구역의 차선을 검출하도록 한다.
CannyEdge를 통해 얻은 image(위)와 ROI(아래)를 bitwise_and 연산을 한다.

그러면 아래와 같이 원하는 구역만 계산된다.

여기에서 Lane detection을 해주면 된다.
해당 코드에서는 위의 사진을 input으로 하며, h(height)의 2/3 지점부터 끝까지 탐색을 하고 0부터 w(width)의 1/6까지 5/6*w 부터 끝까지 탐색을 하도록 코드를 작성하였다. 쉽게 말해서 또 한 번의 ROI를 설정한 것이다. 값이 있으면 left와 right list에 (x,y)좌표를 append한다. 이렇게 append한 값을 제1 사분위수 y값과 제4 사분위수 y값을 구하고 이를 서로 빼준다. 해당 값을 cutoff, 즉 기준점으로 삼아서 제1 사분위수와 제4 사분위수 값에서 각각 빼준다. 이 값을 lower와 upper로 설정하고 이 값 사이에 있는 것을 새롭게 차선으로 정의해준다. 새롭게 정의한 차선의 최대값과 최소값 index를 통해서 1차 함수인 직선을 만들어주고 기울기를 통해서 center값을 계산하고 이를 publish하도록 한다. steer값은 np.deg2rad(-center)값으로 조정해주면 된다. (아래는 OpenCV로 차선을 Detect한 결과.)

OpenCV를 통한 Lane Detection 결과는 만족스럽게 나왔다.

느낀점

우리 팀은 장려상을 수상했다. 팀원들이 밤낮없이 고생하고 코딩해줘서 탈 수 있었던 것 같다. 특히 팀장인 지민이와 승범이가 많이 고생한 것 같다.

물론 아쉬운 점도 있다. 내가 너무 방황했다는 점. 프로젝트도 하려고 하고 성적도 챙기려다 보니깐 이것도 저것도 아니게 돼버렸다. 프로젝트도 많이 참여한 것도 아니고, 그렇다고 중간고사를 잘 본 것도 아니고. 내가 조금만 더 열심히 참여했다면 어땠을까 싶은 생각이 많이 든다. 본 대회에서는 이런 생각이 나지 않게 열심히 해야 겠다.
또 아쉬운 점은 자율주행에 많이 벗어난 느낌이 들었다. 대회 결과만 생각하면 Global path를 전체적으로 매핑하고, 매핑으로 처리할 수 있는 부분은 최대한 처리하도록 했을 것이다. 하지만 우리는 그러지 않았다. 우리의 경험을 위해서 윤지의 주차도 공식을 활용하는 등 최대한 자율주행을 활용하려했다. 그런데 점점 Flag 변수가 많아지더니 뭔가 누더기 코드가 되어버린 것 같다.
이러한 점들이 너무 아쉽다.

배울 점도 있었다. 제대로 하나만 하자는 것. 그리고 시험보다 더 중요한 것들이 많다는 것. 이러한 프로젝트나 경험이 A+ 하나 더 맞는 것보다 더 중요한 것 같다. 요번 MORAI 프로젝트를 통해서 비록 Deep Learning을 사용하진 않았지만 코드를 짜는 법, 코드 분석하는 법을 배울 수 있었다. 실제 MACARON 자동차 코드도 이와 비슷해서 술술 읽히는 것 같다. git 사용법도 많이 늘어서 어떤 식으로 사용하는지 알게 되었다. 쉽게 말해서 '코딩 실력'이 많이 늘었다.
제대로 된 팀플도 처음 해봤다. 학교 과제로 팀플하는 것들은 다들 하기 싫어해서 누구 한 명이 안 해오거나 대충하는 경우가 있는데, 요번 프로젝트는 모두가 하고 싶어서 참여한 것이니 더 의미가 깊다. 결과도 나쁘지 않아서 더 뿌듯하고 좋은 것 같다. 완주를 했다는 것에 의의를 두자!

더 이상 미루지 않고 열심히 공부해야겠다. 무엇보다 프로젝트 같은 것들을 많이 참여하고 수상실적도 채워야겠다. 좋은 결과가 나오니 뿌듯하다.
우선적으로 해야하는 것은 지민이가 내준 Vision team project, CLRNet 수정이다. 이후에 Lidar, IMU 코드를 보면서 이것저것 해보고 싶다.

화이팅!

post-custom-banner

4개의 댓글

comment-user-thumbnail
2023년 9월 21일

1번으로 할 때, lanenet환경 다 맞추셨나요???? 우분투 16, cuda9.0 ,... etc

1개의 답글
comment-user-thumbnail
2024년 8월 8일

안녕하세요
혹시 rosbrigde 연결할 때
publish: Cannot infer topic type for topic /Ego_topic_0 as it is not yet advertised
라는 오류 어떻게 해결하는지 알려주실 수 있나요..?
roslaunch rosbridge_server rosbridge_websocket.launch
명령어 실행 이후에 네트워트 connect하면 이런 오류가 생깁니다,,

1개의 답글