본문 바로가기

KAIROS 2기

[카이로스2기] 통합 프로젝트2 : 한국 번호판 숫자 인식하기(딥러닝/OCR)

이번 포스팅에서는 카이로스 2기 통합 프로젝트에서 내가 진행한 번호판 인식 파트에 대한 상세 과정을 나누고자 한다.

한국 번호판을 딥러닝/OCR을 통해 인식하고자 하는 사람들에게 조금이라도 도움이 되지 않을까 한다.🤗

우리 프로젝트는 고객이 요청한 차량의 타이어 마모도를 자동으로 측정해주는 로봇으로, 로봇이 착오 없이 해당 고객의 차량을 확인할 수 있도록 번호판을 인식하여 고객 등록 시 input된 DB 데이터와 대조하여 확인하는 절차를 넣었다.

이를 위해서 AGV 카메라를 통해 MAMOT 존에 있는 차량의 번호판을 촬영하고, 촬영된 이미지를 딥러닝과 OCR을 통해 분석하여 번호판 숫자를 뽑아내도록 하였다.

진행 과정을 순서대로 기술하자면 아래와 같다.🙌

1. 이미지 처리 
2. 딥러닝 도입
3. rotation 처리
4. 선 rotation 적용 및 resize 제외

 

1. 이미지 처리

가장 먼저 크게 나온 일반적인 번호판 사진에 대해 cv2 이미지 처리를 하여 contour를 잡아주는 작업을 진행하였다.

GaussianBlur와 Threshold 처리를 하고, contour 중에서 번호인지 아닌지를 min max width height와 ratio를 통해 구분하는 방법을 사용하였다. 

- 🔗 해당 방법은 하단 github 링크에 있는 license_plate_recognition 문서를 통해 같은 방법을 사용하였다.

다만 우리의 프로젝트에서는 번호를 찍는 각도가 정면으로 동일하기 때문에 각도 계산을 통해 숫자로 복원하는 부분은 생략하였고, 대신 번호를 기준으로 좌측 상단과 우측 하단까지만 영역을 잡는 별도 함수를 추가하였다.

이렇게 처리된 이미지에 pytesseract OCR을 적용해보았을 때, plate_text : 출력을 보면 7800 부분은 잘 나오지만, 좌측이 잘 잡히지 않는 것을 볼 수 있다.🤔

SOCAR 공유 차량 번호판입니다.

 

 

https://github.com/kairess/license_plate_recognition

 

GitHub - kairess/license_plate_recognition: Car License Plate Recognition using OpenCV and tesseract

Car License Plate Recognition using OpenCV and tesseract - kairess/license_plate_recognition

github.com

 

 

2. 딥러닝 모델 도입

위의 예시는 번호판이 주로 크게 나온 사진으로 하여 contour에서 번호를 잘 잡아낼 수 있지만, 실제 프로젝트 환경에서는 AGV 카메라의 화각 상 번호판을 가까이에서 크게 잡는 것이 불가능했다.😥

이에 딥러닝을 통해 전체 이미지에서 번호판을 인식해서 그 부분만 불러온 후 OCR을 진행하도록 수정해보았다.

딥러닝 모델은 YOLOv8을 사용하였고, 데이터셋은 simple imgs download를 통해 받은 이미지들을 주로 학습시켰다.

아래 결과를 보면 AGV 캠을 통해 촬영된 사진에서 박스에 붙은 번호판 이미지에서 번호판 부분만 빨간색으로 잘 잡아내는 것을 볼 수 있다.😊

이렇게 인식된 번호판 영역에 대해 이미지 처리된 사진으로 OCR을 적용하여 번호를 추출할 수 있었다.

 

 

3. rotation 처리

이 단계에서 남은 문제로는, AGV 카메라 촬영 사진이 기본적으로 기울어져 있다는 것이었다.

위의 사진에서도 보이듯이, 분명 반듯하게 붙여놓았는데도 사진 상으로는 번호판이 기울어져 있다보니 번호판 영역이 좌측 상단과 우측 하단이 비는 직사각형으로 잡혔고, 이는 OCR에도 똑같이 반영되었다.😅

이 부분을 수정하기 위해서 cv2의 getRotationMatrix2D를 적용해서 OCR 시에는 약 -5도 정도 회전을 시킨 이미지에 적시킴으로 정확도를 많이 개선할 수 있었다.

contour 된 이미지도 훨씬 명확하고, plate_text 결과도 123가 4568을 모두 읽어내는 것을 볼 수 있다!😎

 

 

4. 선 rotation 적용 및 resize 제외

가장 최근에 적용한 추가 개선으로는 적용했던 것들을 좀 덜어내는 수정을 했다.

프로젝트가 계속 진행되며 시뮬레이션 환경이 변경되었고, 번호판도 위의 예시 번호판이 아닌 공용차량을 실제 촬영한 번호판으로 교체하였다.

번호판 크기가 커지면서 OCR 정확도가 높아질 수 있지 않을까 했는데, 오히려 빛번짐 등으로 번호판 인식이 안되는 등 기존 작동하던 로직이 잘 되지 않아서 수정을 진행하게 되었다.😭

우선 번호판 영역 결과 영역이 기울어지지 않도록 하기 위해서 rotation을 번호판 인식 전으로 적용시켰다.

그리고 기존에는 OCR 인식이 큰 이미지를 대상으로 더 잘 될 것이라 생각하여 resize를 통해 width=750 크기로 하여 OCR을 적용했는데, 이미지 처리로 인한 품질 저하와 불필요한 앞뒤 (| 이나 , 같은 부분)를 인식하는 문제를 해결하기 위해 resize가 불필요하다고 판단되어 제거하였다.

현재 버전으로는 변경된 번호판을 잘 인식하고, OCR의 경우 숫자는 잘 인식하지만 '하'와 같은 한글은 0으로 인식되는 부분이 있다.😮 ('하'라는 글자가 번호판 글씨체 상 '가' 등보다 훨씬 어려운 것 같다..!)

SOCAR 공유차량 번호판 이미지입니다.

 

 

🔄 이러한 과정을 통해 한국 번호판을 인식하고, 숫자를 읽어오는 개발을 진행하고 있다.

딥러닝을 사용할 것인지 여부와, 숫자까지 딥러닝으로 진행할 것인지 등에 대해서 여러 고민이 있었던 만큼, 포스팅을 보시는 분들 중에서도 비슷한 고민이 있으시다면 이런 방법이 있다는 하나의 안이 될 수 있지 않을까 싶다.

특히 위 github 링크에서는 demo에 대한 동영상 강의도 제공하고 있으니 한번 진행해보셔도 좋을 것 같다.

 

카이로스 2기 통합 프로젝트 중간 후기👀

- 프로젝트가 막바지에 이르고 있는데, 정말 많은 새로운 것에 도전해보고, 성취하는 시간이 되고 있다.

- 번호판 탐지 외에도 AGV 주행 개선, 시스템 간 통신, 하드웨어 제작 등 재밌는 개발과 경험을 할 수 있어서 즐겁다!

- 아직 남은 허들이 많이 있지만 잘 넘기고 멋진 마무리를 할 수 있도록 최선을 다 할 예정이다!🎄

 

 

🌱 카이로스 2기 통합 프로젝트 기획과 초기 개발이 궁금하다면?

https://bagjo2884.tistory.com/34

 

[카이로스2기] 통합 프로젝트1 : 타이어 마모도 측정 로봇 Mamot

드디어 카이로스 2기의 꽃, 통합 프로젝트 진행 상황에 대한 포스팅을 할 차례이다! 🌸교육을 진행하며 팀 구성을 한 후 틈틈히 프로젝트 컨셉과 주제를 정하였고, 현재는 한창 열심히 개발을

bagjo2884.tistory.com