Edge AI를 적용한 교통 단속 시스템 프로젝트 과정

졸업 프로젝트 개념인 캡스톤 디자인 수업에서 진행된 내용입니다.

  처음 프로젝트를 진행할 때는 정말 관심있던 분야였던 T맵 프로젝트를 지원하였으나 기업 측의 반려로 자유 주제로 노선을 바꾸게 되었다. 그래서 사거리에서 차선별 대기열을 계산하여 혼잡도를 분산시켜서 도로 정체를 완화시킬 목적으로 AI 신호등을 구상하였다. 교수님께서 연결해주신 "라온피플"은 이미 AI 신호등을 진행 중에 있었고 국제도로교통박람회에 참여해 어떤 원리인지와 어떤 기술들이 적용되서 쓰이고 있는지 알 수 있었다. 또한, 기업체분들께서 멘토링을 해주셔서 프로젝트를 한다면 어떤 걸 해야하는지 그리고, 어떤 역량이 필요한지 알게 되었는데 안타깝게도 가장 중요한 시간적 문제로 인해 진행되기 힘들다는 게 결론이었다. 다행인 점은 멘토링과 사전 조사에서 얻었던 정보를 바탕으로 범위를 좁혀서 할 수 있는 일이 어떤 건지 알 수 있었다는 점이다. 그런 과정을 거쳐 딥러닝을 이용한 좌회전 끼어들기 단속 시스템으로 목표를 바꾸게 되었다.

   좌회전 끼어들기 단속 시스템이 구현해야하는 기능은 다음과 같다.

1. 차량을 인식한다.

2. 인식된 차량을 추적한다.

3. 직진 차선의 차량이 좌회전 대기열에 끼어드는지 판별한다.

4. 위반한 장면을 저장한다.

요구 사항에 맞춰서 필요한 핵심 기술은 Object detection, Object tracking이었다. 구현하기 쉬운 기술이면서 정확하게 검출을 할 수 있는가가 주요 관건이였다. Yolo_v3, Mobilenet, tiny_yolov3, centernet 등 여러 detection model들을 조사하였고 그 중에서 어느 정도의 성능이 보장된 점과 사용이 편리한 점을 택하여 Yolo_v3모델을 택하게 되었다. 가장 기본이 되는 기술이었던 만큼 우선적으로 구현하긴 했다. 그 뒤에 우리가 하는 프로젝트와 비슷한 일이 있는지에 대해서 찾아보고, github에서 그러한 프로젝트를 찾을 수 있었다. 그래서 이것만 구현한다면 일이 좀 더 빨리 될 수 있겠다는 생각에 윈도우에서 구현하려 했으나 cuda를 비롯해서 여러번의 에러를 경험하여 윈도우에선 구현하기 힘들다는 점을 깨닫고 GCP에서 진행하였다. 지난 번의 GCP사용 경험이 몇 번 있던 터라 GCP에서의 구축 과정은 크게 어렵지 않았다. 하지만 이 코드를 구현하기 GCP같은 서버 환경에서는 화면 출력이 불가능해서 진행이 막히게 되었다. 그래서 가상의 visual desktop환경을 구축하기 위해서 xfce나 xtigervnc등 여럿을 했으나 안타깝게도 GCP의 성능과 별개로 vnc의 성능이 뒷받침이 되지 않아 느린 화면으로 구동되거나 구동되지 못하였다. 그래서 GCP에서의 구축은 보류하였다.

  그렇다면 어떻게 해결해야할까 많은 고민을 겪다가, 대부분의 오픈소스 프로젝트는 linux에서 구동된다는 점을 알게 되어 desktop에 Ubuntu를 깔아서 진행하였다. 관련 requirements들을 다시 깔아서 도전했으나 이번에도 관련 프로젝트는 구현하지 못했다. 지금 생각하건데 버전의 차이도 있으며 github 작성자가 코드 일부분에서 문제가 있는 상태로 냅둔 게 아닌가라는 생각이 든다. 처음부터 다시 시작하는 것 외엔 방법이 없었다. 그래서 다시 조사를 시작해서 관련 오픈소스를 찾아봤고, detection기술 보다는 이제는 tracking기술에 초점을 맞춰서 찾아보도록했다. tracking기술을 찾다가 Deep_SORT알고리즘에 대해서 알게 되었다. Deep_SORT는 다른 트래킹 model에 비해서 성능이 매우 높아 detection이 끊기더라도 고유 번호를 잘 유지할 수 있었다. 또한, SORT알고리즘에 비해 GPU를 적용하였기 때문에 fps면에서 매우 유리하였다. 그래서 위와 같은 기술들을 바탕으로 구현에 성공하였다.

  핵심 기술 구현에 성공하였으므로 이제는 성능을 높이고, ui를 좋게해서 상품성이 있도록 만드는 과정이라고 판단했다. yolo_v3모델을 택한 이유는 화면의 대부분의 물체에 대해서 탐지하기 때문이다. 거기서 더 성능을 높이기 위해서 팀원에게 AI_hub에서 국내 자동차 인식용 데이터를 제공받아 custom_training한 weight 파일을 만들어달라 요구하였다. 이 때 Google Colab을 이용해서 커스텀 트레이닝을 할 수 있었다. 오랜 시간이 걸려서 만든 weight 파일이지만 기존의 coco 데이터와 달리 너무 차량만 인식하도록 하여 다른 사물과 차량을 구분하지 못해 오히려 성능이 대폭 감소하였다. 다시금 전이학습을 통해서 기존의 weight파일을 이용하길 바랐으나 시간 상의 문제와 지식 부족으로 기존의 weight파일을 사용할 수 밖에 없었다. 다행인 점은 기존의 weight파일로도 충분히 화면 상의 대부분의 차량을 인식하는데에 성공했다. 그러나 fps의 문제가 있었다. fps이 8정도밖에 나오지 않아서 이러한 부분을 개선시키기 위해서 새롭게 영상을 인코딩해보기도 했다. 다음은 여러 인코딩 환경에서 나온 fps를 기록한 표이다. 이 표와 같이 영상의 퀄리티와 크게 연관이 없다는 점을 고려해 하드웨어의 성능이 영향이 있는지 판단하기 위해 GCP에서도 구동하도록 했다.

  다시 돌아온 GCP에서 T4*1, T4*2, T4*3, V100에서 화면 출력 옵션을 끄고 파일로 저장하도록 하여 진행하였다. 그럼에도 fps는 큰 차이를 보이지 않고 대부분 8 정도를 유지했다. 그래서 성능 개선에 대해서는 모델을 바꿔야 했으나 프로젝트 기한의 막바지여서 모델을 수정하지 않기로 하였다. 성능 부분을 일단락지었으니 새롭게 처리해야 할 부분은 사용성이었다. 기존의 코드는 위반 기준이 될 선분을 코드에 직접 tuple 형태로 입력하였으나 영상이 바뀌게 되면 새롭게 선분 위치를 잡아야 한다는 점에서 불편한 점이 많았다. 이러한 점을 개선하기 위해서 프로그램을 실행했을 때 선분을 그을 수 있는 화면을 띄우고 거기서 긋고 난 뒤 'c' 키를 입력하면 선분이 저장되어 위반선으로 지정되게끔 하였다. 이러한 과정을 진행하다보니 과속 단속 카메라 기능도 구현하는 것이 어렵지 않다 생각되어 넣게 되었다. 실제 촬영된 장소의 구간의 길이를 측정하고 지정된 두 선분을 얼마만큼의 시간이 걸려 지나갔는지 측정하여 속도를 측정하였다. 이렇게 측정된 속도 중 지정된 속도 이상으로 지나간 차량에 한해서 id와 속도를 좌측에 표시하였다.

  위반 장면을 그대로 저장하는 것도 좋은 방안이지만, 위반한 장면을 작게하여 추출해서 서버로 전송한다면 서버 용량을 절약할 수 있으므로 위반한 장면의 차량 근처의 박스만큼을 추출 저장하도록 하였다. 이 때 박스가 화면 바깥으로 넘어가게 되면 오류 메세지가 뜨면서 작동을 멈췄다. 지정할 수 없는 곳을 지정했기 때문이므로 if문을 설정하여 화면 밖으로 나가기 전에 저장을 중단하도록 하여 해결하였다. 프로젝트 말미에 Nvidia Jetson Nano에 대해서 알게 되었고 10일도 안 남은 상황이였지만 금방 구현할 수 있을 거라 생각하여 제품을 구입하였다. 사고나서 확인해보니 아키텍쳐가 기존의 desktop과는 많이 달라서 같은 ubuntu기반이지만 관련 패키지를 까는 과정이 상당히 복잡했다. numpy만 해도 까는데 상당한 시간이 걸려서 이식하는 부분은 포기할까도 생각했다. 난관은 또 있었는데 메모리가 4GB뿐이 되지 않아서 구동자체가 되지 않았다. 실행을 시켜도 진행되고 있다는 메세지가 아니라 메모리가 부족하다는 것만 나왔다. 스왑 메모리를 설정하여 해결하고자 했으나 별 차이가 없이 되지 않았다. 이걸 해결하기 위해 github에서 issue들을 조사하고 nvidia developer forums에 질문을 올렸다. nvidia 측에서는 본인들의 sw인 deepstream 을 사용하길 권장했으나 c++로 되어있어섯 수정하기 힘들었다. (현재는 python 버전의 deepstream이 나와서 일정 부분 사용이 가능하나 사용법에 대한 공부가 더 필요하다.) 그래서 github에서 찾은 새로운 방법을 시도하였는데 tensorflow에서 직접 메모리를 할당해서 실행하는 방법이다. 천만 다행으로 잘 실행되었다. 그러나 fps이 0.8~1정도로 매우 느려서 영상을 즉각적으로 재생하긴 힘들었다. 3분 짜리 10fps영상을 저장하는데에 30분 정도 시간이 소요되는 셈이다. 그럼에도 주요 목표는 좌회전 끼어들기에 대한 부분이었기 때문에 이 부분과 구동 성공에 인정을 받아 운이 좋게도 캡스톤 디자인 결과발표회에서 우수한 성적을 거둘 수 있었다.

프로젝트가 끝난 뒤에 관련 부분을 개선하고자 노력 중에 있습니다.