1. 기존 Tesseract방식의 문제점

 - 번호판의 해상도와 관계없이 글자 일부를 잘못 인식하는 등 정확성이 다소 떨어짐.

 - 숫자나 문자 이외에 특수문자 또한 인식하여 추출하므로 특수문자가 여럿 섞여 정확도가 더욱 떨어짐.

 

글자 인식오류

2. LPR Net

참고 : https://arxiv.org/pdf/1806.10447.pdf

 - NinV의 자동차 번호판 글자인식 알고리즘

 - 다양한 번호판 데이터를 이용한 학습으로 번호판 글자인식에 최적화

 - 번호판에서 나올 수 있는 한글만을 가지고 구분하여 정확성 향상

 

기존에 있는 코드에서 글자인식부분만 tesseract -> LPR Net 으로 바꾸어 진행

 

출처 : http://happy-car.kr/model/DetailView.asp?ShopNo=30150806&MemberNo=1000182962&OnCarNo=201830382374

1. Tesseract란?

 

 - 이미지속 글자를 자동으로 인식하여 글자로 변환해주는 광학 문자 인식 OCR(Optical character recognition)

 - 문자 인식의 정확성을 높이기위해 이미지의 전처리과정이 필수적임.

 - 이미지의 흑백 반전, 수평 보정, 노이즈제거 등을 통해 문자 인식이 정확하게 이루어지도록 해야함.

 


2. Tesseract를 이용한 번호판 텍스트 추출

 

 (1) 이미지의 흑백 반전

opencv의 cvtColor를 이용하여 이미지를 흑백반전 처리 하였다.

이미지의 흑백반전

 (2) 이미지의 수평보정

 - Tesseract로 글자인식의 정확성을 높이기 위해 기울여진 사진을 보정하는 과정.

 - 허프변환으로 번호판 외곽의 기울기를 구하고 해당 기울기만큼 사진을 회전시켜 수평보정 진행

 

 ※ 허프변환?

 - 영상내에서 직선을 검출하는 대표적 알고리즘 중 하나.

 - Opencv에서 기본적인 허프 변환 직선 검출 방법 제공

 

  - canny함수를 통해 에지 검출후 HoughLines을 통해 거리와 각도를 저장

  - 최소 각도를 구하여 따로 저장, 이때 최소 각도를 이용하여 사진을 회전시킴.

 

허프변환 직선검출결과

  - 허프변환 과정에서 얻은 최소 각도를 이용해 사진 회전

수평보정 결과

 (3) Tesseract로 텍스트 추출

최종적으로 전처리한 이미지를 가지고 Tesseract를 이용하여 글자를 인식하게 되면

 

다음과 같이 번호판을 인식하고 번호를 텍스트로 추출하는 것이 가능하다. 

 

참고 : https://bkshin.tistory.com/entry/OpenCV-23-%ED%97%88%ED%94%84-%EB%B3%80%ED%99%98Hough-Transformation

             https://crmn.tistory.com/53

1. 데이터 학습하기

 - Colab환경에서 darknet을 실행시켜 YOLO를 위한 환경을 설정해준다.

 - 이 때, 기존 darknet 파일은 모두 윈도우용 파일이므로, dos2unix를 통해 유닉스용으로 변환한다.

 - 처음 학습시, 비교대상 weights 파일은 미리 설치된 darknet53.conv.74를 사용한다.

 

 - 최종적으로 2200번의 학습을 끝낸 weights 파일을 얻어냈다.


 

2. 차량번호판 추출하기

 

  Opencv 라이브러리를 사용, 파이썬으로 구현했다.

 

- cv2의 dnn 모듈을 사용하여 학습해둔 파일을 불러와 테스트를 진행했다.

- 가중치 파일인 weight 파일, 구성파일인 cfg 파일, 객체의 이름이 담긴 Name파일을 각각 불러온다.

- 이미지를 불러오고 너비와 높이도 따로 저장한다.

- 가져온 이미지는 바로 사용이 불가하므로 blob의 형태로 변환한다.

 

 - 객체 탐지후 탐지결과 신뢰도 50%이상인 객체(번호판)만을 따로 저장한다.

 - 객체(번호판)의 주변으로 직사각형을 그리고, 객체이름 또한 삽입한다.

실행결과, 차량의 이미지에서 번호판을 따로 인식하여 Box처리가 되었음을 알 수 있다.

 

 

 

참고 : YOLO object detection using Opencv with Python - Pysource

1. Colab

- 구글에서 제공하는 클라우드 기반 주피터 노트북 개발환경

- 브라우저에서 python을 작성하고 실행이 가능

 

YOLO가 이미지를 처리하는 과정이기 떄문에 개인의 pc환경에서 학습하고자 한다.

이 때, cpu만을 사용한다면 학습시간은 현저하게 낮아지게 된다. gpu의 성능에 따라서도 학습시간이 달라진다.

Colab을 통해 학습을 시킨다면 자신의 pc환경과 상관없이 제공받는 GPU로 딥러닝 환경을 간편하게 설정할 수 있다.

개인 PC의 성능이 좋지않으므로 Colab을 통해 학습시간을 단축시켰다.

 


2. YOLO 트레이닝하기

- YOLO 트레이닝을 위해서는 이미지외 라벨, 두가지 데이터가 필요

- 이미지파일은 존재하므로, 각 이미지에 해당하는 라벨이 필요

 

※라벨이란?

출처 :  https://blog.testworks.co.kr/data-labeling/

그림과 같이 탐지를 원하는 객체에 Bounding Box를 그려 표현, 딥러닝모델에 학습데이터로 쓰임.

이 때, 이 라벨값은 좌표값으로 변환되어 라벨파일(txt) 형태로 저장된다.   


3. YOLO mark 사용하기

- 각 이미지에 해당하는 라벨을 쉽게 얻기위해 쓰는 툴

- YOLO Mark GitHub : https://github.com/AlexeyAB/Yolo_mark

- Darknet 환경에서 구동가능하며 GPU를 쓰는 것이 아닌 단순 작업이므로 개인 PC에서 진행

출처:  https://news.sbs.co.kr/news/endPage.do?news_id=N1002301509

보기와 같이 차량의 번호판부분에 Bounding Box로 처리하여 번호판을 학습할 수 있도록 이미지를 라벨링을 해준다.

차량이미지 400개를 가져와 각 이미지에 해당하는 번호판 라벨을 400개를 만들어 학습시켰다.

 

 

참고 : [YOLO - darknet] Window 10에서 YOLO_MARK로 YOLO 학습(Custom) - 19.8.26. 수정 완료 (tistory.com)

             colab에서 yolo 트레이닝하기 : 네이버 블로그 (naver.com)

+ Recent posts