YOLOv3 모델과 CRNN 모델을 활용한 차량 번호판 인식 시스템 개발
[INDEX]
1. 배경
2. Computer Vision 모델
3. 시스템 구성도
4. 학습 데이터 생성
5. 모델 학습 및 적용
6. 결과 확인
7. 마무리
자동차 번호판 인식은 어떠한 원리로 구현될까?
딥러닝은 현재 자연어/이미지 처리, 예측 및 분류 등 여러 분야에서 좋은 성능을 보여주며 다방면으로 연구되고 있다. 그중 Computer Vision [1]은 좋은 성능을 보여주며 활발한 연구가 진행되고 있다 [2]. 2012년 ILSVRC [3]에서 이전에 대회에 비해 월등한 성능으로 우승한 CNN기반의 딥러닝 알고리즘 AlexNet의 등장은 Computer Vision 영역에서 딥러닝의 새로운 바람을 일으켰다. 이후의 대회에서는 VGGNet, ResNet, GoogleNet 등 더욱 발전된 모델을 통해 사람의 능력을 뛰어넘는 성능을 보여주며 무서울 정도로 빠르게 발전하고 있다. 단순 이미지 분류뿐만 아니라, 특정 객체를 찾아내는 Object Detection, 사람의 관절을 찾아내는 Pose Estimation 및 특정 영역을 찾아내는 Semantic Segmentation 등 다양한 Computer Vision 영역에서 좋은 성능을 보여주고 있다. 본 글에서는 Computer Vision 영역에서 좋은 성능 보여주는 2가지 모델을 이용한 번호판 인식 프로그램 개발 방법을 소개하고자 한다.
Ojbect Detection은 영상(이미지) 속에서 우리가 목표로 하는 객체(사람, 사물 등)를 찾아내는 기술을 뜻 한다. 기본 적인 이미지 Classification과의 가장 큰 차이점은 하나의 영상에서 찾고자 하는 여러 개의 객체를 모두 찾아내는 것이다. 그래서, 객체 인식 모델을 이용하면 해당 영상에 어떤 종류의 객체가 있는지를 모두 확인할 수 있다. 또한, 해당 객체에 대한 영역도 표시가 되어 객체의 종류와 위치까지 모두 확인 가능한 매우 유용한 기술 중 하나이다.
Object Detection에는 대표적으로 2가지 방식이 있다(상세). Two-shot-detection방식은 YOLO가 등장하기 이전부터 사용되던 방식이다. Window라는 이미지를 분석하기 위한 최소의 단위를 설정하고, 일정한 stride [5] 크기만큼 움직이면서 이미지를 분석하는 방식으로 대표적인 모델로는 R-CNN, Fast R-CNN, Faster R-CNN 등이 있다. 이 방식은 세세한 분석을 통해 정확도는 높지만, 시간이 오래 걸리고 각 window에는 하나의 bounding box의 자표만 지정 가능한 단점이 있다. One-shot-detection방식은 YOLO(동영상 강의)에서 처음 사용된 방식으로 Grid와 Anchor box의 개념을 도입하였다. Grid는 [그림 3]과 같이 이미지를 일정 단위로 나누어 처리하는 방식을 의미하고, Anchor box는 탐지할 물체의 형태를 미리 지정해주는 box를 의미하는데 예를 들어 사람과 자동차를 탐지하는 문제에서 사람은 가로보다 세로가 길고, 자동차는 세로보다 가로가 긴 특성을 이용하는 방식을 의미한다(상세). 대표적인 모델 YOLOv3 [6]를 이용하여 번호판 인식 시스템에서 차량의 번호판 위치를 Detection 하는 기능을 구현하고자 한다.
OCR(Optical Character Recognition)은 사람이 쓰거나 기계로 인쇄한 문장의 영상을 이미지 스캐너로 획득하여 기계가 읽을 수 있는 문자로 변환하는 기술을 뜻 한다 [7]. 즉, 영상에 존재하는 글자들을 찾아내고 해당 문자들을 출력하는 것을 의미한다. 딥러닝에서 일반적으로 영상 처리는 CNN 계열의 모델을 주로 사용하고, 자연어 처리는 RNN계열의 모델을 주요 사용한다 [8]. OCR 같은 경우는 이미지를 Input으로 하고, Text를 Output으로 하기 때문에 CNN과 RNN이 합쳐진 복합 구조의 모델이 주로 사용된다. 모델 성능이 뛰어면서 구조가 간단하여 사용이 평이한 CRNN모델을 이용하여 차량의 번호판에서 Text를 추출하는 기능을 구현하고자 한다.
[그림 5]와 같이 CRNN모델은 크게 3가지 구조를 가진다. CNN Layer는 Convolutional Neural Network를 이용하여 입력된 이미지로부터를 이용하여 일정 구간 별로 Feature sequence [9]를 추출하는 영역이고, RNN Layer는 Bi-direction LSTM을 이용하여 추출한 Feature sequence에서 Text sequence [10]를 예측하는 영역이고, 마지막으로 Transcription Layer는 예측된 Text sequence에서 최종 Text(결과)로 변환하는 영역이다.
위에서 언급한 바와 같이 딥러닝 기반의 객체 인식 모델(Obejcet Detection)인 YOLOv3와 OCR 모델을 이용한 자동차 번호판 인식 시스템의 전체 구성도를 간략하게 표현한 것이 위의 [그림 6]과 같다. Input 이미지는 차량의 번호판을 식별할 수 있는 영상이어야 한다. 첫 번째 분석은 YOLOv3 모델을 이용하여 해당 영상에서 번호판의 위치를 식별하여 그 영역을 1차 Output으로 출력한다. 두 번째 분석은 CRNN모델을 이용하여 출력된 번호판 이미지를 Input으로 하여 최종 Output인 차량 번호판을 추출한다. 이처럼 두 가지 모델을 이용하여 차량 번호판 식별이 가능한 이미지에서 해당 번호판의 최종 Text를 추출하는 시스템을 간단히 구현할 수 있다.
YOLOv3에서 기본적으로 제공하는 pre-trained 모델에서 제공하는 기본 Class항목 중에 자동차 번호판에 대한 항목이 존재하지 않아 데이터를 생성해서 학습을 진행해야 한다. 위의 [그림 7]은 자동차 번호판 영역 인식을 위해 학습 데이터 생성 방법을 정리한 내용이다. YOLOv3 모델 학습에는 총 3가지 파일이 필요하다. 첫 번째 이미지 데이 터은 번호판이 포함된 이미지 파일이고, 두 번째 Label데이터는 각 이미지 파일에 대한 Class와 좌표 정보를 가지고 있다. 마지막으로 Classes파일은 전체 Class 정보를 가지고 있다. 기존의 pre-trained 모델의 가중치를 사용하지 않고 새롭게 모델을 생성했기 때문에 Classes의 첫 번째 항목(index=0)을 Plate(차량 번호판)으로 지정했다. 이미지 데이터와 Label 데이터는 쌍을 이루는 데이터이고, 하나의 이미지에 여러 객체가 있다면, Label 데이터에 한 줄씩 값을 추가하면 된다. 학습 데이터셋을 생성할 때 주의해야 할 사항은 Label의 구조를 반드시 확인해야 한다는 것이다. 공개된 코드나 다른 Object detection 모델에서 모두 같은 Label 값을 사용하지는 않는다. Output표현 방식이 조금씩 다르다 [11]. 그렇기 때문에 사용하고자 하는 모델의 Label 구조가 어떻게 되어있는지 미리 확인하고 거기에 맞춰서 생성해야 한다.
자동차 번호판에 대한 데이터셋을 구함에 있어 크게 2가지 어려움이 있었다. 차량 번호판은 개인정보라 수집이 힘들고 생성 가능한 차량 번호의 가짓수가 너무 많아서 모든 번호에 대한 데이터를 확보할 수 없다는 점이다. 이러한 문제점을 해결하기 위해서 가상의 데이터를 생성하여 학습을 수행하였다. 자동차 번호판은 국가에서 지정하고 관리하기 때문에 자동차 등록번호판 등의 기준에 관한 고시에 명시된 내용을 참조하여 실제 번호판에 사용되는 정보(번호판 배경 및 글자의 필기체)를 기반으로 학습 데이터 셋을 생성하였다(다운로드). 고시에 언급된 내용을 기준으로 번호판 배경과 번호판 글자를 형식에 맞게 임의의 조합을 통해 모든 번호에 대한 데이터 셋을 생성이 가능했다.
YOLO모델은 인기가 많아 Tensor flow, Pytorch, Keras 등 다양한 Framework로 구현된 Opensource가 존재한다(Source code). 선호하는 Framework를 이용하여 모델 학습을 진행하면 보다 수월하게 처리할 수 있다. 위에 언급한 기본 소스 사용할 경우, cmake를 이용해 컴파일을 해야 하기 때문에 윈도보다는 리눅스 환경에서 수행하길 추천한다. 기존의 Pre-trained model을 사용하지 않고 새로운 모델을 생성하기 때문에 학습에 필요한 설정 파일은 Train data-set(이미지, label)과 새로 정의한 Classes파일이다. 학습을 수행하면 cfg파일(모델의 구조)과 weight파일(모델의 가중치 파일)이 Output으로 생성된다(상세). 현재 사용되는 번호판의 종류(일반, 상업용, 전기차 등)가 여러 개인데, 종류별로 각 번호판에 대한 Class를 정의[13]하여 학습한 모델의 정확도가 조금 더 높았지만, 모든 데이터를 1가지 Class로 처리했을 때와 크게 차이가 나지 않았다. 학습된 모델을 사용하여 이미지에서 번호판 영역을 추출하면 번호판 영역이 중심점 좌표(x_center, y_center)와 가로/세로 길이(width, height)로 반환된다. 반환된 좌표와 가로/세로 길이를 이용하여 번호판 영역의 이미지를 잘라내어 CRNN모델의 Input으로 처리한다. 이때, 반환된 자동차 번호판의 좌표 영역보다 5~10% 정도 확대한 이미지를 사용했을 때 CRNN모델의 성능이 향상되었다.
CRNN모델 역시 인기가 많아 다양한 종류의 Framework로 구현된 Opensource가 존재하기 때문에 취향에 맞게 선택하여 사용하면 된다(Source code). Train data-set(이미지, label [12])경로만 설정하면 쉽게 모델 학습을 수행할 수 있다(상세). 현재 사용 중이 자동차 번호판마다 Text의 구조가 다름에도 불구하고 하나에 모델을 이용해 모든 번호판에 대한 텍스트 추출이 가능하고, 또한 높은 정확도를 보여 주었다. 또한 [그림 10]을 보면 기존의 앞 2자리 번호판(일반, 상업용, 전기차 등) 뿐만 아니라 새로 나온 앞 3자리 번호판(신규 번호판)에 대해서도 좋은 결과를 보여 주었다. 학습 데이터 이미지에 Noise(잡음)와 Distortion(왜곡)를 추가하여 학습을 진행하면 CRNN모델의 성능을 향상할 수 있다.
테스트를 위해 실제 차량의 이미지 및 동영상 이용하였다. [그림 11]은 다양한 번호판을 가진 실제 차량의 이미지이며, 상당히 좋은 성능을 보여줬다. [그림 12]는 실제 주차장에 들어오는 차량을 촬영하여 테스트한 결과로 마찬가지로 좋은 성능을 보여 주었다. 실생활에서는 단순 이미지보다는 동영상과 같이 움직이는 차량에서 더 많이 활용될 것이고, 이러한 상황에서 번호판 영역 인식과 최종 Text 추출의 성능 향상을 위하여 영상을 보정하는 Pre/Post processing (전/후 처리) 과정이 있는데, 이 부분은 아래에서(보유 특허 기술) 자세히 소개하고자 한다.
현재 좋은 성능을 보여주는 두 가지 딥러닝 모델(YOLOv3와 CRNN)을 이용하여 간단하면서도 좋은 성능을 보여주는 자동차 번호판 인식 프로그램을 소개했다. 자동차 번호판 인식의 성능이 생각보다 뛰어난 결과를 보여주어 놀라웠는데, 특히 신규 3자리 번호판과 기존의 번호판까지 완벽하게 구별하여 Text를 추출하는 CRNN 모델의 성능에 놀랐다. 우리 실생활에서 자동차 번호판 인식은 주차장, 과속 카메라, 방범용 CCTV(도주차량이나 범죄 차량) 등에 아주 유용하게 사용되고 있다. 이러한 기존 시스템과 딥러닝 기반 모델을 비교했을 때 딥러닝 모델의 가장 큰 장점을 두 가지로 볼 수 있다. 비용적인 측면과 범위의 제한성이 낮다는 측면이다. 기존 과속 카메라의 작동 원리를 보면 레이저를 이용해 과속 여부를 판단하고 그 결과에 따라 자동차 번호판을 식별한다. 하지만 YOLOv3 모델을 이용하면 처음 자동차가 영상에 나타는 순간부터 어느 차선(위치)에 있던 계속적인 Tracking이 가능하다. 즉, 별도의 레이저 장치 없이 해당 차량의 속도 계산이 가능하고, 다른 부가장비 없이 오직 카메라 1대로 이 기능을 수행할 수 있다. 최근 신형 3자리 번호판이 과속 카메라에 안 찍혀 화재가 된 사건이 있었다(뉴스). 딥러닝 모델의 이러한 장점들은 신형 번호판 문제와 같이 새로운 문제 해결에 도움될 것으로 기대된다.
차량의 번호판이 정위치에 있으면 인식률은 올라간다. 하지만 정위치에 있는 데이터를 분석하는 경우는 많지 않다. [그림 12]의 동영상을 보더라도 차량의 번호판의 위치가 측면으로 치우쳐져 왜곡과 번호판의 각도가 틀어졌음을 확인할 수 있다. 그래서 각도 계산 공식을 이용하여 틀어진 번호판을 최대한 정위치 시킨 후 영상을 분석하는 전처리 과정을 추가하였다. 해당 방법은 추출된 번호판의 각도를 계산하여 각도가 틀어졌을 경우 수평이 되도록 보정하는 방식이다. 4개의 번호판 영역 좌표 중 아래 2개의 좌표를 이용하여 계산을 수행한다. 계산된 각도를 역으로 빼서 번호판의 위치를 수평에 가깝게 위치시킨다. 해당 Pre-processing(전처리 단계)를 통해 번호판 인식률을 향상할 수 있다. 해당 방식은 기본적인 객체 추출 모델보다는 Semantic Segmentation모델을 이용할 때 더 큰 효과를 볼 수 있다.
하나의 영상을 가지고 차량의 번호판을 분석하는 것보다 여러 장의 서로 다른 영상을 가지고 차량의 번호판을 분석할 때 좋은 결과를 얻을 수 있다. 위의 방법은 여러 영상에서 번호판 Text를 추출하고, 글자 단위로 확률 기반(Counting)으로 최종 번호판의 Text를 추출하는 방법을 제시하고 있다. 특히 [그림 II]에서와 같이 비슷한 글자('어'와 '허' 등)와 같은 경우가 많이 발생하고, 이때 분석 결과가 혼돈되어 정확도가 떨어지는 경우가 발생한다. 이때 제시한 방법을 이용하면 비슷한 글자를 인식 함에 있어 오차율을 줄일 수 있다.
상기 확산도는 예측한 결과 후보군들 중에서 최종적으로 선택된 대표 차량 번호가 가치가 있는 지를 판별하는 방법이다. 즉, 대표 자동차 번호로 추출된 번호의 신뢰성을 확인하는 단계이다. 상기 확산도는 차량 번호 후보군에서 대표 차량 번호에 대한 상기 확산도를 계산한다. 상기 확산도가 특정 임계치(=0.56) 이상이면 대표 번호는 신뢰도가 입증되어 최종 번호로 사용된다. 하지만 임계치를 넘지 못할 경우 다시 번호판 추출 단계로 돌아가 처음부터 차량 번호 후보군을 추출하고 다음 단계를 반복한다.
[1] 기계의 시각에 해당하는 부분을 연구하는 컴퓨터 과학의 최신 연구 분야 중 하나
[2] 인공지능 기술 및 산업 분야별 적용 사례: 한국 주요 인공지능 추진 현황
[3] ImageNet Large Scale Visual Recognition Challenge의 약자로 대용량의 이미지 데이터를 주고 이미지 분류 알고리즘의 성능을 평가하는 이미지 인식 경진 대회
[4] 인공지능 이미지 인식 기술 동향: ILSVRC 연도별 정확도 향상
[5] 1일 경우 1칸씩 움직이고, 2일 경우 2칸씩 움직이는 Window가 움직이는 단위를 의미
[6] YOLO모델 개발자인 Joseph Redmon가 군사적 악용을 이유로 YOLOv3 이후 개발을 중단(뉴스 1, 뉴스 2)
[7] 광학 문자 인식 정의 by wikipedia
[8] 주로 사용되는 것이지 반듯이 구분이 나눠져 있지는 않다. 영상처리에도 RNN모델이 사용되고, 반대로 자연어 처리에도 CNN모델이 사용된다(CNN기반 문장 분류)
[9] 이미지에서 추출된 feature(특징) 값들 집합을 의미
[10] 각각의 feature(특징)에 대해 text 변환을 수행한 결과 값들의 집합을 의미
[11] 사각형의 범위를 표현하는 다양한 방법이 존재함(예: min_x, min_y, max_x, max_y)
[12] 자동차 번호판 이미지에 자동차 번호(Text)에 대한 값(예: 52가 3108)
[13] 일반 번호판 class=0, 상업용 번호판 class=1, 전기차 번호판 class=2 등으로 정의