딥러닝 기반 불법 주·정차 자동 탐지 시스템 제작 ②
상태바
딥러닝 기반 불법 주·정차 자동 탐지 시스템 제작 ②
  • 김지성, 양주영, 이새몬, 이지현, 최재영
  • 승인 2019.05.10 09:39
  • 댓글 0
이 기사를 공유합니다

어린이 보호구역의 불법 주·정차 단속을 위해 고가의 단속 전용 카메라 대신, 방범용 CCTV에 딥러닝 기술을 적용해 불법 주·정차 차량을 자동으로 탐지하는 시스템을 개발했다. 지난 호에서는 불법 주정차 차량을 인지하기 위한 객체 탐지, 추적에 방법에 대해 알아봤다. 이번에는 자동차의 특정 요소, 즉 번호판의 차량 번호와 색상을 DB화하고 서비스 구현하는 과정에 대해 알아보겠다.

이미지 전처리
불법주정차 차량의 번호판영역을 특정해냈다면, 해당 차량의 번호판 이미지가 따로 추출된다[그림 1]. 그러나 추출된 번호판 이미지는 기울어져있고 노이즈가 많아 해당 이미지에서 차량번호를 판독해내기 어렵다. [그림 1]에서의 차량 번호판 탐지 결과는 노이즈 없이 깔끔한 이미지로 보이지만 번호판 테두리 등이 노이즈로 작용한다.
차량번호를 보다 정확하게 텍스트로 변환하기 위해서는 이미지 이진화, 수평 기울기 보정, 문자영역 추출, 노이즈 처리, 선명도 보정, 글자 영역 추출과 같은 이미지 전처리과정이 필수다. 이런 과정을 통해 깨끗하게 이진화된 이미지를 얻어낼 수 있어야 이후의 차량 번호 인식 프로세스가 가능해진다.
이미지 전처리는 실시간 이미지 프로세싱에 중점을 둔 OpenCV 3.4 라이브러리를 사용했다. 본 프로젝트는 파이썬(Python)을 위주로 프로그래밍을 진행했으며, OpenCV 또한 OpenCV-Python을 사용했다.
이진화를 통해서 잡음이 없는 배경과 문자 두 가지로 확실하게 구분하는 것이 차량번호 인식률을 극대화 할 수 있는 방법이다. 따라서 이후에 진행될 차량 번호 인식과정 전에 이미지의 이진화가 반드시 선행돼야 한다. 차량 번호판 이미지를 이진화하기 위해 OpenCV의 ‘Adaptive thresholding’을 활용했다. 이미지의 작은 영역별로 임계값을 결정하고 그 임계값에 따라 픽셀을 흰색 또는 검정색으로 변환하는 식이다. 단, 이미지 이진화를 진행하기에 앞서 이미지를 보다 선명하게 변환하기 위해서 몇 가지 전처리가 더 필요했다. 그대로 이진화를 진행할 경우 선명하지 않고, 매끄럽지 않게 이진화되기 때문이다[그림 2].
첫 번째로 진행해야 할 작업은 이미지 블러링(Image Blurring)이다. 여러 이미지 블러링 알고리즘 중 양방향 필터링(Bilateral Filtering)을 사용했다. 이는 경계선은 유지하며 전체적으로 밀도가 동일한 노이즈, 화이트 노이즈를 제거해 경계선이 흐려지지 않고 이미지를 부드럽게 변환한다.
두 번째로 실시한 작업은 이미지 팽창(Image Dilation)이다. 이는 이미지를 확장해 작은 구멍을 채우는 방식으로 결과적으로 경계가 부드러워 지고, 작은 구멍을 메꿀 수 있다.
이런 두 작업을 통해 이미지 이진화를 진행하면, 좀 더 선명하고 부드러운 이미지를 얻을 수 있다[그림 3].

차량 번호판 이미지의 수평 기울기를 보정하는 이유는 이미지에서 문자를 탐지해내는 OCR 과정에서 기울어진 형태의 문자이미지는 인식률이 많이 떨어지기 때문이다. 물론 기울어진 문자이미지를 라벨링한 후 학습시켜 왜곡된 문자까지 인식하는 학습 모델을 얻어낼 수도 있다. 하지만, 학습을 위한 데이터 수집이 쉽지 않고 OpenCV의 이미지 처리 기술로도 충분히 가능하기 때문에 수평 기울기 보정방식을 채택했다. 수평 기울기 보정을 위해서는 다음과 같은 세 가지 과정을 거쳐 보정된 형태의 차량 번호판 이미지를 얻을 수 있다.
첫 번째로 차량 번호판 기울기를 검출하기 전에 이미지에서 경계선만을 검출해낸다. 이는 차량 번호판 기울기를 좀 더 정확하게 검출하기 위해서 꼭 선행돼야 하는 과정이다.
OpenCV의 ‘Canny Edge Detection’을 활용해 윤곽선 이미지를 검출할 수 있다.
두 번째로 경계선만 검출된 차량 번호판 이미지에서 OpenCV의 ‘Hough transform’을 활용해 번호판의 위, 아래 부분의 직선을 검출한다. 이 직선의 각도를 알아내면 차량 번호판이 수평으로 얼마나 기울어져 있는지 얻어낼 수 있다. 차량번호판 이미지의 기울기를 알아냈다면, 세 번째로 차량 번호판 이미지의 수평을 맞춘다. OpenCV의 ‘Rotation’을 활용해 번호판이 수평으로 위치하도록 이미지를 회전시킨다.
이런 세 가지 작업을 모두 마치면, 수평 형태의 이진화된 차량 번호판 이미지를 얻을 수 있다[그림 4].
이후에 진행될 차량 번호판 인식 과정에서는 차량 번호판의 테두리 부분이 매우 큰 노이즈로 작용했다. 노이즈를 제거하기 위해 문자 영역만 추출해 차량 번호판의 테두리를 삭제하는 방법을 선택했다.
이 진 화 된 차 량 번 호 판 이 미 지 와 OpenCV의 ‘Image Contours’를 활용해 문자 영역을 찾아낼 수 있다. 이는 같은 색 또는 동일한 강도를 갖고 있는 영역의 경계선을 연결하는 함수다. 폐곡선을 그리기 때문에 차량 번호판 이미지 내 모든 객체를 탐지할 수 있다.
문자는 어느 정도 특정 비율과 면적을 갖기 때문에 객체의 크기와 면적을 이용해 문자를 특정해낼 수 있다[그림 5].
차량 번호판에서 문자영역을 추출한 후 [그림 6]과 [그림 7]과 같이 문자 영역만 잘라내어 다음과정을 진행했다.

이 프로젝트는 어린이 보호구역에 있는 CCTV 영상을 대상으로 하기 때문에 영상 속 차량이 멀리 있거나 또는 CCTV의 성능 문제로 차량 번호판이 선명하지 않게 캡처될 수 있다. 선명도를 보정하는 방법을 여러 가지 시도해 본 결과 포토샵 선명도 보정방법에서 힌트를 얻어 선명도를 보정했다. 과정은 크게 두 가지로 필터 처리와 이미지 합성처리로 나뉜다.
먼저 필터 처리에서는 원본 차량 번호판 이미지를 CLAHE(Contrast Limited Adaptive Histogram Equalization)를 이용해 히스토그램 균일화한다. OpenCV의 ‘equalizeHist’ 함수를 사용해 간단한 히스토그램 균일화를 할 경우 이미지의 전체적인 부분에 균일화가 적용돼, 밝고 어두운 부분이 섞여있는 이미지일 경우 밝은 부분의 윤곽선이 사라지는 문제가 발생하기 때문에 CLAHE를 사용했다.
CLAHE는 이미지를 작은 title 형태로 나누고, 그 title 안에서 균일화를 적용하는 방식이다. 이때, 한 가지 중요한 것은 작은 노이즈까지 반영되는 것을 최소화하기 위해 ‘contrast limit’ 값을 적용해, 이 값을 넘어가는 경우 그 영역은 다른 영역에 균일하게 배분하도록 적용했다.
다음으로 이미지 합성처리는 원본 차량 번호판 이미지 위에 필터 처리한 이미지를 합성하는 과정이다. 이때, 차량 번호만 추출해 원본 이미지에 더하기 위해 필터 처리한 이미지를 흑백 변환해 마스크와 역마스크를 생성하고 이미지 비트 연산을 수행한뒤 둘을 더하게 되면 차량 번호 부분만 추출된다. 이 과정을 마친 필터 이미지 [그림 9]를 원본 이미지 [그림 8]에 합성하면 [그림 10]과 같은 선명한 결과 이미지를 얻을 수 있다.

이미지에서 문자를 탐지해내는 OCR 과정에서는 이미지 내에서 문자를 제외한 아주 작은 잡음도 문자로 인식하여 번호판을 정확하게 판독해내지 못한다. 따라서 노이즈를 최소한으로 줄이는 방법이 필요하다.
노이즈 제거를 위해서 첫 번째로 필요한 것은 노이즈를 찾아내는 것이다. 문자 영역 추출에서 사용했던 방법과 동일하게 OpenCV의 ‘Image Contours’를 이용하여 노이즈를 찾는다. 문자를 제외한 모든 객체를 노이즈라고 생각할 수 있다. 노이즈를 찾아냈다면, 배경색과 동일한 흰색으로 덮어 잡음을 제거한 효과를 낼 수 있다.
[그림 11]과같이 선명하고 깔끔한 이진화 이미지가 이미지 전처리의 최종 결과물이 된다.

차량 색상 검출
적발된 차량이 무슨 색상인지 검출하는 기능은 OpenCV의 HSV 색상 필터링을 활용했다. 빨간색, 초록색, 파란색, 노란색, 주황색, 검정색, 회색/흰색을 각각 검출해 어떤 색상에서 가장 많은 픽셀이 검출됐는가에 따라 해당 색상을 표시하는 방식이다.
단, 필터링을 진행하기에 앞서 여러 가지 작업들이 선행돼야만 했다. 그대로 검출할 경우에는 시간대, 날씨, 양지/음지 여부, 또는 주변의 아스팔트 도로나 차량의 창문 등의 영향으로 오차가 크기 때문이다.
첫 번째 작업은 히스토그램 평활화(Histogram equalization)다. 이는 이미지의 명도를 균일화해 시간대나 날씨, 혹은 공간에 따라 달라질 수 있는 명도차를 줄인다. 이를 통해 어두운 곳에서 찍은 파란색 자동차가 검은색으로 인식될 가능성을 줄일 수 있다[그림 12].

두 번째는 크로핑이다. 자동차 이미지에는 해당 차량의 색상이 아닌 부분(도로의 아스팔트나 차량의 창문)이 포함돼 있기 때문에 색상 검출에 있어 종종 틀린 결과(주로 아스팔트나 창문의 색상)를 유발한다. 따라서 이를 방지하기 위해 차량의 특정 부분만 잘라내는 방식을 사용해야 한다[그림 13].

이같은 전처리 작업을 거친 후에서야 색상 필터링을 진행할 수 있다. 그럼에도 불구하고 회색과 흰색은 오차가 심해 그림자가 어떻게 지느냐에 따라 결과가 달라졌기 때문에 굳이 나누지 않았다.

차량 번호 인식
문자가 포함된 이미지를 텍스트 데이터로 변환하는 것을 OCR(Optical Character Recognition)이라고 한다. OCR 기술을 제공하는 많은 프로그램들이 있지만, 이 프로젝트에서는 구글에서 개발한 TesseractOCR을 사용했다. 그 이유는 파이썬에서 ‘pytesseract’ 라이브러리를 무료로 제공하기 때문에 쉽게 이용할 수 있으며 정확도도 높기 때문이다.
하지만 ‘TesseractOCR’의 단점은 한글 인식률이 떨어진다는 점이다. 그래서 정확한 한글 인식을 위해 직접 한글을 학습시킨 OCR 모델을 생성함으로써 OCR 한글 인식률을 향상시켰다. 또한 실제 차량 번호판 데이터를 직접 학습시켜 전체 인식률을 높였다[그림 14].

먼저 한글 학습을 위해 대한민국의 번호판 폰트와 비슷한 고딕체 폰트의 tif 파일을 ttf 파일로 변환해야 한다. 이를 위해 번호판에 들어가는 46개의 문자를 여러 고딕체 폰트를 사용해 txt 파일에 적는다. 그리고 고딕체 문자가 적혀있는 txt 파일을 jTessbox2.0을 이용해 변환함으로써 ‘고딕체.tif’ 파일과 ‘고딕체.box’ 파일을 생성했다. 생성된 tif, box 파일을 jTessBox를 이용해 학습시켜 하나의 ‘고딕체.traineddata’ 파일을 생성했다. 이렇게 생성된 ‘고딕체.traineddata’를 사용해 OCR을 적용하면 한글 인식률을 향상시킬 수 있다.
그렇지만 한글 인식률을 높였다고 전체 OCR 인식률이 올라가는 것은 아니다. 영상 중 차량 번호판 추출 과정에서 멀리 있는 차량 번호판 이미지는 선명하지 않을 수 있기 때문이다. 그래서 전체 OCR 인식률을 높이기 위해 동일한 화질의 광학문자를 학습시킨 OCR 모델을 추가로 생성했다.
현장과 비슷한 환경에서 직접 수집한 700개의 차량 데이터 중 안 좋은 화질의 차량 이미지와 중복 차량 이미지를 제거하고 약 400개의 학습 이미지를 선별해 이미지 전처리 과정을 수행했다. 전처리된 이미지의 크기를 증가시킨 다음, 각 문자마다 라벨링하고 jTessbox를 이용해 학습시켰다. 그 결과 번호판 이미지만을 학습시킨 ‘번호판.traineddata’ 파일을 생성했다[그림 15].

TesseracOCR을 사용할 때, 앞에서 생성한 2가지 traineddata인 ‘고딕체.traineddata’와 ‘번호판.traineddata’를 이용해 OCR을 진행함으로써 결과적으로 87%의 OCR 인식률을 얻을 수 있었다.

사용자 GUI 구현
이 프로젝트는 결과적으로 사용자가 딥러닝 기반의 어린이 보호구역 불법 주·정차 자동탐지 시스템을 GUI 환경을 통해서 이용할 수 있도록 제공한다.
사용자가 분석하고자하는 어린이 보호구역 CCTV 영상을 업로드하면 실시간 분석을 통해 불법 주·정차 여부와 차량의 번호판과 증거사진을 캡처해 제공한다. 또한 번호판 인식이 어려운 차량 번호는 사용자가 직접 수정할 수 있도록 서비스를 제공한다.
[그림 16]은 사용자가 분석하고 싶은 CCTV 영상을 직접 업로드 할 수 있는 화면이다.

[그림 17]은 실시간 분석 단계이다. 업로드 된 영상에서 차량별로 ID를 부여하고, 머무는 시간을 측정해 불법 주·정차 여부를 판단한다. 이때, 차량의 정보와 사진을 캡처해 저장하고 불법 주·정차로 판단한 시간과 차량번호를 화면에 보여준다.

[그림 18]은 불법 주·정차 차량을 조회해 정보를 확인하기 위한 화면이다. 조회 내용으로는 차량번호, 차량색상, 위반일시, 위반내용, 자진납부와 의견진술 기한, 단속 구분, 증거사진 등을 제공한다.

[그림 19]는 사용자가 직접 차량번호를 수정한 후 조회한 화면이다. 상단의 수정버튼을 통해 내용을 수정할 수 있으며, 차량번호의 판단이 어려워 인식이 제대로 되지 않은 경우를 대비해 직접 수정할 수 있는 기능을 제공한다.

결론
이 글에서는 인력과 비용이 많이 드는 기존의 불법 주·정차 단속 서비스를 대체할 딥러닝 기반의 자동 단속 서비스를 구현하는 방법에 대해 알아봤다. 현재 다양한 환경에 설치돼 있는 CCTV에 딥러닝 기반 불법 주·정차 자동 탐지 시스템을 적용하면, CCTV 영상 속에서 자동으로 불법 주·정차 차량을 탐지하고 추적해, 증거 사진과 영상을 촬영한 뒤 해당 차량 번호와 색상을 추출하고 과태료를 고지해준다.
이 과정을 GUI를 통해 시각적으로 보여주고 서비스하는 홈페이지에서는 직접 촬영한 영상을 업로드해 불법 주·정차 차량을 판단하고 사용자에게 영상 속 불법 주·정차 차량의 차량 번호, 차량 색상, 위반 일시, 위반 내용, 납부 기한, 증거사진을 제공한다.
고가의 단속 카메라 설치비용 문제와 인력부족 문제를 해결하는 이 서비스는 24시간 무인 단속이 가능하기 때문에 향후 불법 주·정차를 줄이고, 다양한 교통 문제를 개선할 수 있을 것이다.

 

이 글은 과학기술정보통신부와 정보통신기획평가원의 ‘2018년 혁신성장 청년인재 집중양성 사업’ 중, 한양대학교에서 수행한 ‘프로젝트 주도형 빅데이터 전문가 양성과정’의 프로젝트 결과물이며, 담임강사 장석주 교수(한국폴리텍대/융합기술교육원)와 박주열 교수(한양대학교 SW융합원)의 감수로 진행됐다.


본 프로젝트는 취업준비생의 교육을 위해 진행된 것으로 본 제작물의 저작권 침해 등에 대한 문의는 hyuswec@naver.com으로 메일주시면 안내해드립니다.