
네이버 지도 내비게이션, 꽃길만 가자 — 좁은 길 탐지 모델
Open in app Sign up Sign in Write Sign up Sign in 네이버 플레이스 개발 블로그 · #글로벌서비스 #최신기술 #코드리뷰 #자기주도적 #자율출퇴근 #오프라인회의최소화 #온라인협업도구활용. 선지원 후고민! https://www.naver-monthlyopening.com 네이버 지도 내비게이션, 꽃길만 가자 — 좁은 길 탐지 모델 sjskgks · Follow Published in 네이버 플레이스 개발 블로그 · 14 min read · Oct 2, 2024 -- Share 1. INTRODUCTION 안녕하세요. NAVER Maps Directions의 김준태 입니다. 저희 팀은 네이버 지도에서 내비게이션, 대중교통 길찾기 서비스 개발을 중심으로 좋은 품질의 서비스를 제공하기 위해서 빅데이터 수집, 분석, 모델링(통계, DL) 등도 수행하고 있는데요. 이번에 소개드릴 내용은 내비게이션 품질 향상을 위한 좁은 도로 추출 모델에 관한 이야기 입니다. 2. 문제 저희 내비게이션 서비스는 최단거리, 과거와 실시간 교통정보 기반 소요시간 예측, 도로 품질 등 다양한 요소를 고려해서 최적의 길을 안내해 주고 있습니다. 따라서 데이터 품질이 서비스의 품질로 직결되기 때문에 정확한 label 분류는 중요한 문제 입니다. 오늘 주제인 도로 너비를 예시로 들어보겠습니다. 도로는 너비에 따라서 level을 부여할 수 있는데요. 다음과같이 크게 3개의 level이 있고 level 값이 클 수록 차량이 가기 어려운 도로라고 가정해 보겠습니다. level 0 도로 level 1 도로 level 2 도로 level 2 도로를 불필요하게 안내하지 않기 위해 정확한 label 분류가 되어야 합니다. 문제는 도로데이터는 일일히 사람이 확인하기에는 너무나 커서 전부 확인하기 어렵고 유저분들께 리포팅 받을 때만 처리한다면 지속적으로 안좋은 서비스 경험을 드릴 수 있기 때문에 사전에 감지해서 해결할 필요가 있었습니다. 따라서 좁은 도로를 탐지하는 모델을 개발했습니다. 3. 모델1: 수치지형도 도로 너비 기반 모델 첫번째 방식은 Maps Data 팀에서 여러 데이터들을 검토 및 test 해주시고 최종 제안해 주신 방법인 수치지형도 polygon 데이터로 부터 도로의 너비를 측정하는 방식입니다. 수치지형도란 측량 결과에 따라 지표면 상의 위치와 지형 등 다양한 공간정보를 일정한 축척에 따라 나타낸 것을 말하고 polygon data는 말 그대로 도로와 같은 공간 data를 다각형으로 표현한 것을 의미합니다. 따라서 수치지형도를 이용하면 보다 실제와 근접한 길이의 공간 polygon data를 얻을 수 있습니다. 3.1 도로 polygon 너비 추정 도로 너비를 구하기 위해서는 polygon내부의 중심점과 outline과의 거리로부터 추출해 볼 수 있는데요. 단순히 polygon의 centroid를 활용하면 될것 같지만 다음과 같은 문제가 발생합니다. Centroid of polygon 이렇게 조금이라도 휘어진 polygon이라면 중심점이 바깥쪽으로 잡히면서 해당 점을 기준으로는 전혀 다른 width가 구해질 수 있습니다. 위 예시에서는 실제보다 좁게 width가 구해지겠네요. 3.1.1 Voronoi Diagram Centroid 가 아닌, polygon medial axis 를 구해야 합니다. 팀에서 활용하고 있는 apache sedona(spark geometry lib) 에서는 해당 기능이 없어서, Voronoi Polygon 기능을 활용해 구현했습니다. Voronoi Diagram Voronoi Diagram 이란 쉽게 설명하면 위 그림처럼 점과 점을 연결한 선을 수직이등분 하는 선들로 구성되는 다각형입니다. 앞서 본 도로 polygon 처럼 휘어진 polygon의 꼭짓점을 기준으로 voronoi diagram을 그리면 다음과 같은 모습이 됩니다. 이후 해당 polygon 내부에 들어온 voronoi diagram edge들을 보면 다음 처럼 polygon(파란색)의 medial axis(빨간색)를 근사시킬 수 있습니다. 해당 방식을 통해 앞서본 polygon을 포함해서 medial axis를 구하고 해당 line을 구성하는 점을 구해보면 다음과 같습니다. 이런식으로 polygon 내부 후보군 point 들을 얻을 수 있고 좀더 point들을 확보하기 위해 다음 point들도 추가했습니다. polygon의 minimum boundary rectangle 의 각 대각선과 polygon이 intersection하는 line의 중점 두개 centroid 중 polygon 내부로 들어오는 점 이후 ‘후보 point들과 polygon outline 과의 최소 거리들 중 가장 긴 거리 * 2’ 를 해당 polygon의 너비로 정의했습니다. polygon 내부에서 임의의 점과 outline과의 최소거리들 중 최댓 값은 너비의 절반을 넘어갈 수 없기 때문입니다. 물론 도로의 너비가 일정하지 않은 경우 넓은쪽으로 너비가 잡힐 수 있으나 확실하게 좁은 도로들 위주로만 잡아내는 것이 목적이어서 보수적으로 진행했습니다. 3.2 결과 수치지형도 polygon들 중 오류케이스, 교차로 등 정제를 해준 후 width를 낮춰가면서 통계값, 거리뷰 사진을 참고해 level 2 기준 width를 잡았습니다. 이후 다음과 같은 결과들을 확인해 볼 수 있었습니다. (빨간색: polygon, 초록색: road line, 파란색: width / 2) 대부분 잘 동작하지만, 수치지형도 polygon width 가 일정 이하인 경우 높은 level 간 구별 정확도가 충분하지 않았습니다. 위 오른쪽 사진처럼 실제 level 이 낮지만 높게 잡히는 문제가 있었습니다. 최대한 정확하게 매우 좁은 도로만 추출해 낼 필요가 있어 거리뷰 이미지 데이터를 기반으로 새로운 모델을 만들었습니다. 4. 모델2: 거리뷰 이미지 기반 모델 4.1 image classification 처음에는 시험삼아 구글에서 제공하는 teacheable machine을 통해 적당히 좁은도로와 매우좁은 도로데이터를 준비해서 이들을 구별하는 image classification 모델을 만들어 test 했습니다. 문제는 대부분 매우좁은 도로들은 농로이기 때문에 배경에 흙, 풀 색 등이 많으면 넓은 도로더라도 매우 좁은 도로로 구분하려는 문제가 있었습니다. 따라서 이미지 내의 도로 segmentation을 인식해서 좁은 도로를 detect 하는 방향으로 수정했습니다. 4.2 road color similarity(YUV space) 도로위 픽셀들의 여러 색상들을 추출한 후 해당 색상들과 유사한 색을 갖는 픽셀들을 도로로 인식하도록 해서 road coverage(road 로 판정된 pixel 수의 비율)를 계산하는 모델을 구현해 봤습니다. color similarity는 RGB값을 human perception상 유의미하다고하는 YUV color space 로 변환해서 distance를 구했습니다. 최종 방식은 아래와 같습니다. 관심 있는 영역 정의(좌측 이미지의 두 red line) 도로위의 9개의 작은 box로부터 9개의 중위 rgb 값을 구한 후 영역 내 일정 수준의 색상 유사도를 띄는 pixel들을 road 로 판정 최종적으로 타겟 영역내 road 비율이 일정 수준 이하인 경우 좁은 도로로 판정 역시 color similarity threshold와 road coverage threshold를 조정해가며 좁은 도로 추출 기준을 잡습니다. 결과는 아래와 같습니다. 어느정도 잘 되는듯 하지만 아래와 같은 케이스들에 대해 도로를 제대로 인식 못해 정확도가 떨어지는 한계 점이 존재했습니다. 그림자나 도로의 일부만 포장 된 등 도로 색상이 균일하지 않은 경우 배경색이 도로의 특정색과 유사한 경우 해당 case들을 해결하기 위해 단순히 도로 color box 수를 늘린다면 그만큼 해당 영역에 대한 similarity 비교 연산이 늘어나고 매우 좁은 도로의 경우 box들이 도로를 벗어나 도로 색상을 잘못 가져오는 문제가 생깁니다. 따라서 최종적으로는 semantic segmentation 모델을 사용했습니다. 4.3 image semantic segmentation(SegFormer) SegFormer Framework 사용한 deep learning 모델은 SegFormer 라는 semantic segmentation 모델입니다. 특징은 아래와 같습니다. transformer 기반 semantic segmentation 모델 encoder: overlapped patch merging 으로 image feature 해상도차원을 축소해가며 계층적으로 multi-level feature들 추출 decoder: 오직 MLP로만 가볍게 구성하여 빠른 학습 및 inference 속도 바닥부터 학습시키기에는 학습셋부터 구성하는데 리소스가 크게 들기 때문에 거리뷰 이미지에서 관심영역을 crop하고 이미 거리 이미지로 trained 된 model의 weight 수정 없이 그대로 이용했습니다. 최종 class는 실질적으로 관심있는 road, car 두가지만 얻도록 했습니다. 4.4 pixel 단위 도로 너비 추정 앞서 color similarity 방식에서 road pixel 수의 비율로 좁은 도로를 추정 했는데 해당 방식으로는 도로의 넓고 좁음을 구별하기 에는 적합하지 않아서 수정을 했습니다. semantic segmentation 이후 아래와 같은 과정을 통해 도로 너비를 추정합니다. 초록색 선이 도로의 양 끝을 의미 도로 너비를 측정할 영역 정의(사진속 빨간 window들) 양 끝 window에서 가운데 window까지 다가오면서 window내 pixel 수 대비 해당 window 속 road로 masking된 pixel들의 수 비율 확인 특정 window에서 road mask 비율이 일정 수준 이상 높아지면 해당 window 속 road pixel들 중 바깥쪽 pixel의 위치를 road의 끝으로 정의(사진의 초록색 선) 양쪽 끝이 정해진다면 각 끝사이 pixel 단위 너비 계산 마찬가지로 거리뷰로 확인하며 level2 도로에 대한 window내 road 비율과 pixel 단위 road 너비 threshold를 정의했습니다. 결과 아래는 최종적으로 level 2도로일 것으로 탐지된 예시들 입니다. 보시다시피 유의미한 목적달성이 되어 품질 개선에 바로 적용하였습니다. 아래사진들에서 이전 color similarity 기반으로 road masking 했을 때 문제가 됐던 케이스들도 해소가 되는 것을 확인할 수 있습니다. 좌: color similarity, 중간: original image, 우: SegFormer 5. model1 vs model2 polygon 기반 모델과 semantic segmentation 기반 모델 결과도 비교했습니다. 각 모델에서 탐지한 랜덤 100개 sample을 직접 거리뷰로 눈으로 확인해서 level 2, level 1.8, level 1.5로 label을 매겼습니다. 실제 level 값은 continuous 하지 않고 discrete 한 값이지만 앞서 3가지로 설명 드렸기에 이해를 위해 continuous한 값으로 label을 표현했습니다. 좌: level2, 중간: level1.8, 우: level1.5 위 table 속 coverage는 대상 도로들 중 좁은 도로를 탐지해낸 비율을 의미합니다. polygon 기반 모델은 image 기반 모델에 비해서 2배가량 많은 좁은 도로들을 탐지해 내지만 그만큼 level 2 탐지 비율이 적습니다. 반면 image 기반 모델의 경우 level 2 탐지 비율이 2배더 많습니다. 각 모델 모두 level2를 추출을 목적으로 threshold를 조정했기 때문에 이 결과는 image 기반 모델이 더 정확하게 pixel 단위 너비 threshold 조정만으로 의도한 넓이의 도로를 잘 탐지할 수 있음을 의미합니다. 6. 더 나아가서 이미지 data는 다양한 정보들이 있기 때문에 많은 것들을 시도해 볼 수 있습니다. 예를들어 도로위에 주정차 차량이 많은 케이스들에 대해서도 탐지 해볼 수 있습니다. 좌에서 우 순서대로 ‘road’, ‘car’, ‘road+car’ masking 도로가 넓더라도 주정차 차량이 많아 지나가기 어렵다면 좋은 도로라고 보기는 어려운데요. 위처럼 차량에 대해서도 detect 함으로써 주정차 차량이 많은 도로에 대해서도 확인할 수 있습니다. 현재는 주행하는 차량인지, 주정차 차량인지 구분할 필요가 있어 보수적으로 ‘road + car’ mask 기준으로만 좁은 도로를 추출해내고 있습니다. 7. 마치며 지금까지 어떻게 해서 정확하게 좁은 도로를 탐지해 냈는지 알아봤습니다. level1.5 정도 좁은 도로들 대상으로 거리뷰 이미지를 확인 했을 때 약 96% 가량의 도로에 거리뷰 이미지 data가 있음을 확인했습니다. 대상을 더 넓은 도로들을 포함하여 전국 도로로 확장한다면 더 많은 비율로 거리뷰 이미지 데이터가 있게 됩니다. 저희 팀은 해당 이미지 data를 기반으로 앞으로 다양한 data 품질향상 작업들을 계획중에 있는데요. 다음에는 더욱 발전되고 재밌는 이야기로 찾아 뵙길 기대하며 마치겠습니다. 삶을 연결하는 네이버지도, 꾸준한 관심과 격려 부탁드립니다. 감사합니다. 8. REFERENCE https://sedona.apache.org/latest/ https://groups.csail.mit.edu/graphics/classes/6.838/S98/meetings/m25/m25.html https://teachablemachine.withgoogle.com/ https://stackoverflow.com/questions/5392061/algorithm-to-check-similarity-of-colors https://github.com/NVlabs/SegFormer Data Modeling Data Analysis Deep Learning Navigation Published in 네이버 플레이스 개발 블로그 406 Followers ·Last published Nov 26, 2024 #글로벌서비스 #최신기술 #코드리뷰 #자기주도적 #자율출퇴근 #오프라인회의최소화 #온라인협업도구활용. 선지원 후고민! https://www.naver-monthlyopening.com Follow Written by sjskgks 1 Follower ·3 Following Follow No responses yet Help Status About Careers Press Blog Privacy Rules Terms Text to speech
