DIY 번호인식 기반 차단기 제어 시스템 구축하기

by Taylor
0 comment

안녕하세요, 오늘은 번호인식 기반 차단기 제어 시스템을 구축한 내용에 대해 적어보려 합니다.

우선 왜 이런 힘든 일을 하게 되었는지 설명이 필요한듯 한데요. 제가 다니는 비행장에는 입차 차단기가 설치되어 있습니다. 하지만 리모컨을 통해서만 열리고 번호인식 등의 기능은 없었는데요. 그래서 항상 직원들이 예의주시 하고 있다가 문을 열어주어야 하는 불편함이 있었습니다. 그래서 번호인식 기반으로 자동으로 문을 열어주면 어떨까 하는 생각에서 입차관리 시스템을 찾아보았는데 기본 몇백만원 부터 시작하는 시스템들이 대부분 이었습니다.

항상 잘못된 선택은 이런것에서부터 시작하는데요. 가격이 비싸? 그럼 내가 직접 만들고 말지 뭐. 그래서 조금 찾아보니 한국 번호판을 인식할수 있는 공개되어 있는 라이브러리 등은 많지 않았고 API 를 제공하는 외국 서비스의 경우 정확도가 높지않고, SDK 형식으로 제공하는 한국 솔루션 회사의 경우 차라리 입차관리 시스템을 구매해여 구축하는게 나을정도로 가격이 비쌌습니다.

그렇게 포기하려던 찰나 딥러닝을 기반으로 pre learning 해놓은 Github Repo 를 찾았는데요 그것이 바로 요 레포였습니다.

https://github.com/gyupro/EasyKoreanLpDetector

Yolov5 와 EasyOCR 를 기반으로 제작된 레포였으며 Yolov5 를 사용하여 차량여부를 판별하고 그 다음에 EasyOCR 를 이용하여 차량 이미지에서 번호판을 식별해내는 라이브러리 였습니다.

문득 생각이 드는것은 번호판의 모양이 아닌 차량에 랩핑이 되어있는 글자도 인식이 될 수 있겠다는 생각이 들었으나 요것은 나중의 일로 미뤄두고 일단 프로토타이핑에 집중하였습니다.

우선 비행장에서 사용되는 웹 어플리케이션 Python Flask 서버에 Yolov5 와 EasyOCR 를 추가하고 해당 코드를 서버에 맞게 수정한 뒤 간단하게 테스트를 해보았습니다.

결과는 대 성공! (정보 보호 이슈로 한글 글자 부분을 지워놓았습니다)

사실 안될리가 없습니다.

이제 이걸 프로덕션에서 사용할수 있도록 좀 더 수정하고 기록도 남기고 직원들의 차량정보 기반으로 자동으로 오픈해주는 시스템을 개발합니다.

입차 기록 (번호인식이 아직은 불안정하다)
입차 허용을 위한 직원 이름과 차량번호 매칭 테이블

개발을 완료하고 셋팅한 화면입니다.

차량이 들어오는 타이밍에 맞추어 사진을 촬영하기 위해 Hikvision 카메라의 Line crossing event 로 차량이 가상으로 그려진 선을 특정 방향(입차)으로 넘는 경우에 Synology Surveillance Station 에서 이벤트를 받아서 스냅샷을 촬영하고 Python Flask 서버로 Webhook 을 쏘게하여 이벤트를 처리할수 있는 파이프라인을 구축하였습니다.

하지만 개발 환경에서는 아이폰으로 찍은 사진들을 사용하여 크게 문제가 없었지만 프로덕션 환경에서는 CCTV 카메라를 통해 번호인식(ANPR) 작업을 진행하므로 화질이나 명암 등의 차이가 있어 제대로 되지 않는듯 하였습니다.

열악한 테스트 환경

위와 같이 카메라를 임시로 고정해놓은 상태에서 테스트를 하였는데 아이폰 카메라와 이미지 품질이 많이 달라서 잘 인식되지 않는듯 보였습니다.

Yolov5 에서 차량을 인식하긴 하지만 EasyOCR 에서 번호판의 글자를 제대로 인식하지 못하는듯 했습니다.

최근에 촬영한 자료 이미지

이 이슈는 차량이 너무 멀리있을때 인식되는 것과도 연관이 있어보여서 우선 Hikvision 카메라의 Line Crossing Event 의 설정을 조정하여 차량이 좀 더 가까이 왔을때 이벤트가 전송되도록 설정하였고, 추가로 EasyOCR 에 이미지 처리를 요청하기전 Python PIL 라이브러리를 통해 이미지를 Gray scale 로 처리하는 과정이 있었는데 이 부분의 파라미터를 조정하고 더 좋은 퀄리티의 Gray scale processor 를 사용하도록 수정하여 개선하였습니다.

그 결과 현재는 정확도 90% 확률로 많이 올라왔습니다.

아직도 정확도가 10%가 낮은 이유는 이벤트 파이프라인의 문제가 큰데 Hikvision 카메라가 Synology Surveillance Station NVR 로 이벤트를 전송하면 Synology Surveillance Station 이 그걸 받고 스냅샷을 촬영한뒤 Python Flask 서버로 웹훅을 전송하게 되는데 이 과정에서 Synology Surveillance Station 의 딜레이로 인해 스냅샷이 원하는 시간이 촬영되지 않고 차량의 번호판이 잘 보이지 않는 각도로 넘어간 이후에 스냅샷이 촬영되게 되어 발생하는 문제 때문이었습니다.

이 문제를 해결하기 위해서는 다른 입차 차단기 시스템들과 같이 차량이 특정 지점을 넘을때 사진을 촬영하거나, 애초에 번호판을 촬영하기 좋은 지점을 넘어가지 못하도록 차단기를 더 앞쪽에 설치하는 방법이 있으나 후자는 이미 차단기가 설치되어 있기 때문에 실행이 불가능하고 첫번째가 그나마 제일 좋은 솔루션 이었습니다. 이 부분은 후반부에 다시 설명드리겠습니다.

그래서 정확도를 더 높여야 하기 때문에 Realtime worker 가 계속 카메라의 이미지를 받아와서 번호인식을 시도하다 정확히 일치하는 번호가 있으면 문을 열어주도록 하였으나 이것도 근본적인 해결책은 아니어서 결국 파이프라인을 수정하기로 하였습니다.

근본적인 이슈는 이벤트 파이프라인의 딜레이이고 이를 해결하기 위해서는 이벤트가 거쳐서 전달되는 hop 을 줄여야 하는데 이를 진행하기 위해 리서치 하던 도중 Hikvision 카메라에 Alarm server 라는 기능이 있다는것을 확인하였습니다. 이 기능에 대한 상세한 설명이 있지 않아 정확히 어떤 기능인지는 모르고 단순히 아래 이미지와 같은 UI 만 있었기 때문에 직접 서버쪽으로 전송되도록 설정해놓고 들어오는 request 값들을 살펴보기로 하였습니다.

Hikvision 카메라의 Alarm server 기능

사실 이전에 Hikvision 의 Doorbell 에서 socket 통신을 통해 실시간 문열림 요청을 받아와서 차단기와 연동하는 기능을 개발했었기 때문에 자신감이 충만한 상태였습니다.

역시나 Doorbell 과 같은 XML 형식의 데이터가 서버로 HTTP POST Form 으로 넘어왔으며 이 내용에는 Line Crossing Event 라는 내용과 시각, 그리고 가장 중요한 이벤트 이미지 까지 포함되어 있었습니다.

이 기능을 사용하면 딜레이 없이 촬영된 이미지로 번호인식을 진행할수 있게 됩니다.

그럼 빠르게 개발하여 적용해봅니다.

새로운 파이프라인

결과는 대성공!!

원하는 지점에서 원하는 스냅샷을 촬영하여 hop 이 줄어들어 딜레이 없이 Python Flask 서버로 이미지를 전송하여 번호인식까지 진행하는데에 성공하였습니다.

인식 파이프라인을 시각화한 화면

사실 이벤트 파이프라인을 개선하는건 시간이 다소 소요될것 같아 계속 미뤄두고 있었는데 최근 파이프라인 자체가 너무 느려져서 10초 이상 딜레이가 생기는 경우도 많았고 Doorbell 이벤트를 받아서 처리하는 부분을 진행한 뒤에 카메라 설정에서도 비슷한 메뉴를 보고 뭔가 될 것 같은데? 하는 생각이 든것도 큰 계기였습니다.

근데 앞서 이야기했던 특정 지점에서 더 정확히 촬영하기 위해 진행하는 프로젝트가 있는데요.

어찌저찌 중고장터에서 상용 번호인식 시스템에서 사용되는 스피드 카메라와 IR Emitter 그리고 하우징까지 셋트로 구하게 되어 이걸 사용하여 더 정확한 시점에 더 좋은 퀄리티의 이미지를 촬영하는 것을 계획하고 있습니다.

하지만 IR Emitter 를 사용하게 되어 촬영하게 되면 차량의 윤곽이 제대로 보이지 않아 Yolov5 를 사용하지 못하게 되고 이미지 자체도 이미 Gray scale 이기 때문에 기존 ANPR 코드에 대한 수정이 필요해서 요것도 날을 잡고 진행하려 합니다.

상용 스피드 카메라와 IR Emitter 그리고 하우징

여기까지 읽어주셔서 감사합니다!

다음 번에는 딥러닝 기반 항공기 진입 인식 및 자동 ATC 시스템에 대해 이야기 해보겠습니다.

You may also like

Leave a Comment