woonadz :)

차량 번호판 가상 데이터 만들기 - 가상 이미지 생성 본문

프로젝트/인공지능 개발(미완성)

차량 번호판 가상 데이터 만들기 - 가상 이미지 생성

C_scorch 2021. 11. 24. 06:07
반응형

아마 이 개발에서 쓴 모듈은 코랩과 같은 환경에서 시도해보지 않았다. 그리고 딱히 많은 모듈을 쓰지 않아 2개 정도만 검색해서 cmd에 다운 받아주면 되었기에 노트북에 깔린 파이썬을 이용해 개발하였다.

 

개발 환경 : 파이썬 3.9.2

 

완성 코드

#차량 번호판에 대한 규정을 모두 참고한 것이 아님.

import numpy as np
import random
from PIL import Image,ImageDraw,ImageFont

list_A = []
number = '0123456789' 
for num in number:
    list_A.append(num) #번호판의 숫자를 담은 리스트
list_B = []
korean = '가나다라마바사아자하거너더러머버서어저허구누도로부수우주호고노더소오지두'
for kor in korean:
    list_B.append(kor) #번호판의 문자를 담은 리스트

for i in range(20): #전체 데이터셋을 50개 만들 계획(그 중 20개는 2019년에 개정된 번호판)
    list_1 = [random.choice(number) for i in range(3)] 
    list_2 = [random.choice(korean) for i in range(1)]
    list_3 = [random.choice(number) for i in range(4)]
    list_1 = ["".join(list_1)]
    list_3 = ["".join(list_3)]
    list_last = list_1 + list_2 + list_3
    str = " ".join(list_last) #문자와 숫자 사이 공백
    draw_text = str
    font = ImageFont.truetype("NotoSansKR-Medium.otf",37, encoding="unic") #파라미터 순대로 폰트,폰트 크기
    path = "license_plate.png" #기존의 번호판 배경 이미지
    image_pil = Image.open(path)
    draw = ImageDraw.Draw(image_pil)
    w, h = font.getsize(draw_text)
    draw.text((16,-3),draw_text,'black', font) #(x,y), 번호판 문자열, 폰트 색, 위에서 설정한 폰트  

    image_pil.save(draw_text+'.png',"PNG")
	#image_pil.show() 만약 이미지를 보고 싶다면 입력(저장하는 기능은 아님)
    
for i in range(30): #전체 데이터셋을 50개 만들 계획(그 중 30개는 2019년 전에 만들어진 번호판)
    list_1 = [random.choice(number) for i in range(2)]
    list_2 = [random.choice(korean) for i in range(1)]
    list_3 = [random.choice(number) for i in range(4)]
    list_1 = ["".join(list_1)]
    list_3 = ["".join(list_3)]
    list_last = list_1 + list_2 + list_3
    str = " ".join(list_last)
    draw_text = str
    font = ImageFont.truetype("NotoSansKR-Medium.otf",37, encoding="unic")
    path = "license_plate.png"
    image_pil = Image.open(path)
    draw = ImageDraw.Draw(image_pil)
    w, h = font.getsize(draw_text)
    draw.text((27,-3),draw_text,'black', font)

    image_pil.save(draw_text+'.png',"PNG")

 

가상 이미지 생성을 위해 코드를 작성하던 중 만난 오류와 해결방안들

 

(1) 

font = ImageFont.truetype("NotoSansKR-Medium.otf",37, encoding="unic")

처음 폰트를 작성할 때 개발을 위해 참고한 블로그 코드대로 내가 다운받은 폰트의 주소를 복사했었다.

font = ImageFont.truetype("C:\Users\pc\OneDrive\문서\인공지능",37, encoding="unic")

이전에는 이런 코드였다. 하지만 이 코드를 작성하니 OSError가 났다. 

해결방안 : 폰트를 파이썬 코드 파일과 같은 폴더에 넣어주고 폰트 자체 이름을 주소 대신 입력하였다.

폰트 자체 이름을 입력할 때는 폰트의 유형을 빼먹지 않도록 주의해야 한다.(ex : ttf,otf 등등)

 

(2)

image_pil = Image.open(path)

이 코드의 기존 코드는 아래와 같았다.

image_pil = Image.open(path)
image = np.array(image_pil)

코드를 작성하기 위해 참조한 블로그에서 이러한 방식으로 이미지를 열었다. 하지만 2번째 줄로 인해 np.ndarray 오류가 났다. np.array의 역할을 생각해보았는데 내가 작성하려는 코드에서는 크게 의미가 있는 역할이 아니었다. 그래서 삭제를 결정했고 이후에 잘 작동되었다.

 

(3)

draw.text((16,-3),draw_text,'black', font)
draw.text((27,-3),draw_text,'black', font)

이 두가지 코드에 대해서는 오류가 없었지만 x,y 값을 조절해 폰트의 위치를 중앙으로 옮겼다. 이 때  show()를 사용해 굳이 저장하지 않고 그림으로 바로 바로 확인하며 직관적으로 조절했다.

 

이외에도 자잘 자잘한 오류가 많았지만 기억에 남는 것은 이 정도이다.

 

가장 힘 빠지게 했던 문제는 바로 폰트 관련 문제였다. 글자 위치와 사이즈까지 조정하고 나니 내가 다운받은 글씨체가 한글 지원이 안되는 것이었다. <가상 데이터를 활용한 번호판 문자 인식 및 차종 인식 시스템 제안>이라는 논문을 참고하여 다운 받은 글씨체였다. 차량 번호판과 가장 유사도가 높은 글씨체이기에 이를 대체할 수 있는 글씨체는 없었다. 정말 열심히 짠 코드인데 글씨체 때문에 완벽하지 않다는 게 마음에 걸리긴 했지만 일단 구글 DoHyeon-Medium 글씨체로 대체하였다. 이 문제와 관련해서는 추후에 더 개발을 하게 된다며 해결할 것 같다.

이렇게 총 50개의 가상 번호판 데이터를 만들었다. 이제 이 데이터를 이용해 논문을 토대로 학습할 예정이다.

 

코드 참조 :

https://diyver.tistory.com/171

 

파이썬으로 한글폰트 텍스트 이미지 만들기

OpenCV의 putText( ) 는 글꼴이 한정되어 있다. 여러가지 방법으로 글자를 넣을 수 있는 것 같은데, 방법이 좀 복잡해 보여서 다른 방법을 찾아보다가 쉬운 방법을 찾아서 소개해본다. 일단 파이썬 의

diyver.tistory.com

https://todayisbetterthanyesterday.tistory.com/68

 

[Python] 이미지 시각화의 기초 PIL, opencv활용

<!DOCTYPE html> 1-10. 시각화 기초 (이미지) package 불러오기¶ In [1]: import numpy as np from PIL import Image import matplotlib.pyplot as plt %matplotlib inline 이미지 파일 열기¶ opencv로도 열수..

todayisbetterthanyesterday.tistory.com

 

논문 참조 :

이승주, 박구만(2020) . <가상 데이터를 활용한 번호판 문자 인식 및 차종 인식 시스템 제안> . 방송공학회 논문지

이유진, 김상준, 박경무, 박구만(2020) . <3차원 회전을 이용한 인조 번호판 생성기의 번호판 인식 성능 비교> . 2020년 한국방송·미디어공학회 하계학술대회

장일식, 박구만(2021) . <인조 번호판을 이용한 자동차 번호인식 성능 향상 기법> . 방송공학회논문지

 


초기 아이디어에서 발전 과정

가상번호판 관련 생성 프로그램이나 코드를 알아보기 위해 구글링과 유튜브 영상 참조 등 서치를 많이 했다. 그러던 중 발견한 논문들이 바로 위 논문들인데 아쉽게도 논문에는 생성 자체에 대한 자세한 방법은 나와있지 않다. 그래서 유튜브 에서 중 그림판을 이용한 번호판 만드는 강의를 따라해보려고 했다. 현재는 데이터 50개를 만들었지만 이후에 천개, 만개를 만들어야하는 상황이 온다면 위에 방법으로는 절대 불가능하다. 그럼에도 방법이 떠오르지 않아 하나 하나 번호를 따는 것까지 했었다.(완벽한 시간낭비를 했다) 

그러던 중 정말 이 방법이 말이 안된다고 생각해 합성에 대한 코드들을 찾아보았다. 그러다 PIL과 opencv2(결국 사용하진 않았다)에 대한 코드들을 보았고 이 방법을 이용해야겠다고 생각했다.

블로그에 있는 코드들을 복붙한 것이 아니라 문법만 참고했기에 코드를 짜는데는 조금 시간이 걸렸다.(막상 결과물을 보니 너무나도 허접하고 초라한 코드였지만..ㅎ)

 

이제 이 데이터를 가지고 3차원 회전과 스타일 변환 등(논문에 나와 있는 방법)을 통해 최종 학습 데이터를 만들것이다.

 

 

반응형