brunch

You can make anything
by writing

C.S.Lewis

by 티맵모빌리티 Mar 24. 2023

유저와의 환상적 콜라보! 블랙박스로 표지판 정보 얻기

19편 – 모바일 환경에서 YOLO 돌려보기 (방면표지판인식)


1. 길안내에 필요한 수많은 정보들, 블랙박스로 얻을 순 없을까?


TMAP은 사용자들에게 보다 정확한 길안내를 하기 위해 안내에 필요한 여러 정보들을 주기적으로 수집하고 있습니다. 방면표지판, 과속카메라, 제한속도, 횡단보도, 과속방지턱 등 여러 정보들이 길안내에 필요하거든요.


이러한 정보들을 수집하기 위해 티맵은 영상 수집 차량을 주기적으로 운영합니다. 실제 도로의 영상을 수집한 뒤, Computer Vision 및 Machine Learning을 통해 필요한 Object들을 Detecting하여 이미지들을 추출하고, 이를 지도에 mapping해 길안내를 하는 거죠. 그런데 이러한 작업은 생각보다 운영비용이 많이 듭니다. 그래서 한 가지 아이디어를 생각해 봤어요. 


현재 TMAP에서는 고객들의 안전 운전을 위해 Blackbox 기능을 제공하고 있는데요. 이 Blackbox 기능을 이용하시는 고객분들과 함께 위와 같은 데이터를 수집하고 처리할 수 있다면 어떨까? 보다 빠르고 정확하게 안내를 할 수 있지 않을까?


이렇게 고민이 시작됐습니다. 고객과 함께 만들어 가는 TMAP을 꿈꾸면서 말이죠.


2. 기능의 검토


A. Object Detection


YOLO (You Only Look Once)

Object Detecting기술에는 CNN, YOLO 등 많은 기술들이 소개되고 발전하고 있습니다. 이중 YOLO의 경우는 최근 v8까지 발표되면서 활발히 업데이트가 되고 있습니다. 

(이미지 출처 : https://arxiv.org/pdf/1506.02640v5.pdf)


community의 활동도 활발하고, 특히 custom train을 수행하기 위한 영상이나 자료들이 풍부하여 비교적 최신 model인 YOLOv7을 이용하여 검토를 진행하였습니다.


YOLOv7

YOLOv7은 여러 모델들을 소개하고 있는데 대표적으로 다음과 같이 분류할 수 있습니다.

YOLOv7 : 기본이 되는 model입니다.

YOLOv7-tiny : mobile환경에서 동작을 시킬 목적으로 만든 경량화 모델입니다.

YOLOv7-W6 : cloud환경에서 동작을 시킬 목적으로 만든 모델입니다(출처: https://viso.ai/deep-learning/yolov7-guide/).

Mobile환경에서의 동작을 위하여 tiny model을 이용하기로 결정하였습니다.


B. Object Tracking


기본적으로 YOLO의 동작은 하나의 이미지에서 object를 추출하는 방식입니다. TMAP의 blackbox는 30fps로 영상촬영을 하기 때문에 초당 30장의 이미지를 처리할 수 있습니다. 입력되는 모든 이미지를 처리하여 detect를 수행한 결과를 이용한다면 동일한 이미지의 중복이 많이 발생할 수 있습니다(수집도 수집이지만 수집된 데이터의 후처리도 상당히 복잡하겠지요).


따라서 추출된 이미지들 중 동일한 이미지를 추적하고 최적의 이미지를 골라내는 작업이 필요합니다. realtime으로 object를 tracking하는 방법으로는 SORT (Simple Online and Realtime Tracking) 알고리즘이 대표적인데요. 이 알고리즘으로 각 frame별로 추출된 object들을 추적하면서 처리하게 되면 중복은 제거하면서 최소한으로 추출된 이미지들을 정리할 수 있습니다.


SORT의 동작 원리


Object Detection으로 인식된 bounding box들을 기본 재료로 사용하며 다음의 순서로 처리가 됩니다.

IOU계산을 통한 Kalmanfilter를 적용하여 box의 이동경로 계산

Hungarian알고리즘을 이용하여 각 box들의 번호 부여


IOU (Intersection over Union)

'교집합(두 개의 박스가 겹치는 부분의 면적) / 합집합(두 개의 박스의 모든 면적)'의 결과물이 비율로 나오게 되어 이 점수가 크면 확률상 같은 ID라고 판단할 수 있습니다.

(이미지 출처: https://mickael-k.tistory.com/48 )

Kalmanfilter

검출된 bounding box의 흔들림을 보정하여 동일한 bounding box임을 확인하고 궤적을 보정합니다.

(이미지 출처: https://mickael-k.tistory.com/48 )

Hungarian 알고리즘

추적된 box들에 고유 번호를 부여하여 추적합니다.

(이미지출처: https://mickael-k.tistory.com/48 )

3. 학습의 시행착오


기본적으로 제공되는 YOLO의 모델은 사람, 자동차등을 포함하여 80개의 class를 인식할 수 있도록 학습되어 있습니다.

https://github.com/WongKinYiu/yolov7/blob/main/data/coco.yaml  

여기에는 아쉽게도(?) 방면표지판에 대한 내용은 없습니다.


따라서 방면 표지판을 인식하는 모델을 만들기 위해선 custom data를 이용하여 학습을 진행해야 하는데요. 720p로 기록된 blackbox영상을 이용하여 학습을 시켜보기로 마음먹었습니다. blackbox의 영상은 사용자가 자동차에 직접 단말기를 거치하여 촬영을 하기 때문에 영상의 촬영 방향이 정확히 주행방향과 일치하지 않고 오른쪽으로 기울여 촬영이 될 가능성이 높습니다. 

(이미지 출처: 아래)


다행히 카메라의 방향이 오른쪽으로 기울어져 있어도 이미지의 인식에는 큰 영향은 없었습니다.


학습은 python pip로 제공되는 labelImg를 이용하여 학습을 진행하였습니다. 초기에는 49장의 이미지를 이용한 학습만으로도 어느 정도 방면 표지판이 인식되는 모델을 만들 수 있었는데요. 문제는 false positive가 많이 발생하는 것이었습니다.

false positive: 모델은 표지판이 맞다고 인식하였는데 실제로는 표지판이 아님 

(이미지 출처: TMAP)

false positive로 인식되는 이미지들을 살펴보니, 간판의 내용이나 아파트의 창문 등이 인식이 되었습니다. 이 문제를 해결하기 위해 고민을 하다가, 학습 시 오답을 직접 알려주는 방식이 어떨까 생각하게 되었습니다.

이미지 label을 작성할 때 false positive로 인식되는 이미지들을 모아 영역의 size를 강제로 0으로 설정하여 학습 시 반영을 하도록 하였더니 false positive가 줄어드는 것을 확인할 수 있었습니다.

labelImg의 경우 이미지와 label이 1:1로 대칭되도록 label file이 생성되는데요, 영역을 지정하지 않으면 label file이 생성되지 않고, 학습에 반영되지 않습니다.

따라서 false positive의 경우는 영역이 0인 내용으로 강제로 file을 생성해 주어 학습에 이용되도록 하는 형태인 것이지요.


label file 예시

0 0.407020 0.494667 0.085796 0.102222  -> 일반적인 영역설정
-                                                            -> 인식 category의 index (zero base)
  -------------------------------------------------- -> 인식 영역 좌표
0 0.000000 0.000000 0.000000 0.000000  -> false positive 학습을 위한 강제 영역 설정


(이미지 출처: TMAP)

v1 : 초기 모델

v2 : false positive 보완

v3 : 시내주행 / 전용도로 주행이미지 데이터 balance조정 (180장 - train 125장 / validation 55장)

v4 : 표지판 인식영역 조정

YOLOv7의 custom data 학습 참조 : https://www.youtube.com/watch?v=-QWxJ0j9EY8&themeRefresh=1 


4. Mobile 환경에서의 동작


iOS의 개발환경으로 사용하는 xcode에서는 기본적으로 MLModel을 test 하기 위한 preview 기능을 제공하고 있습니다. 이를 이용하면 학습된 모델의 동작상태를 쉽게 확인할 수 있어, 빠른 prototype이 가능하다고 판단되었습니다. 따라서 Mobile환경에서의 동작은 iOS를 이용하도록 결정하였습니다. 

(이미지 출처: TMAP)

다만, xcode의 preview기능을 사용할 수 있도록 model을 export 하기 위해선 별도의 추가 작업이 필요했습니다. YOLOv7의 공식 github에서 제공되는 script에서는 NMS (Non-Maximum Suppression)가 없는 상태로 mlmodel이 생성되어 preview기능을 이용할 수 없습니다.

공식 github의 export script : https://github.com/WongKinYiu/yolov7/blob/main/export.py  

NMS는 하나의 객체에 대해 일정 임계치 이상의 bounding box가 여러 개 인식이 될 수 있는데, 이중 가장 신뢰도가 높은 하나의 bounding box만 남기는 작업을 수행합니다. 

(이미지 출처 : https://towardsdatascience.com/non-maximum-suppression-nms-93ce178e177c )


따라서, NMS를 포함시켜 mlmodel을 만드는 작업을 수행해야 합니다.

참조 : https://colab.research.google.com/drive/1QiTlFsN948Xt2e4WgqUB8DnGgwWwtVZS?usp=sharing#scrollTo=Hpigyc_5Fbri  


또한 YOLOv7을 기본 option으로 export 하는 경우 quantization이 32bit으로 설정되어 size가 25MB model이 만들어지는데, 이를 16bit으로 조정하면 12.3MB 정도로 절반 size의 model을 얻을 수 있습니다. 물론 quantization을 조정하게 되면 정확도가 떨어지긴 하나, 실제 test에서는 큰 차이를 보이지 않았습니다. 

(이미지 출처: TMAP)

위의 이미지는 1시간가량 주행을 하면서 720p로 촬영된 영상으로부터 추출된 표지판의 이미지입니다. (confidence 0.9 이상)


5. 남아있는 숙제들..


이렇게 prototyping을 진행하고 나서 상용 적용까지는 많은 과정들이 남아 있습니다.

이미지 생성 시 capture시점의 mapmatch좌표를 저장하는 방식이긴 하나, 이미지의 특성상 멀리 있는 표지판의 인식도 가능하기 때문에 표지판의 정확한 좌표를 계산하는 방식이 필요합니다. 갈림길에서 건너편의 표지판도 인식이 되니까요

캡처된 이미지의 size를 최적화하는 것도 큰 숙제입니다. 1시간가량의 주행 시 confidence 0.9 이상의 표지판 이미지만 16MB가 수집이 됩니다. 이미지의 size는 사용자의 데이터 사용량과 직결되기 때문에 수집 데이터의 최적화 및 size를 줄이는 노력이 필요합니다.

기존의 데이터 정제 과정에 crowd sourcing 데이터의 정제를 추가해야 합니다. 매우 안정적으로 수행하고 있던 현재의 데이터 정제과정에 신규 추가된 데이터의 정제과정을 포함시켜야 하며, 많은 시행착오를 거치게 되겠지요.

하지만 TMAP을 사랑해 주시고 늘 이용해주시는 고객분들과 함께 만들어가는 TMAP의 꿈은 계속될 예정입니다.

 


매거진의 이전글 포켓몬고와 티맵은 내 위치를 어떻게 잡을까?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari