MapleStory Finger Point

미니 프로젝트/가상 번호판 생성

[1] 가상 번호판을 만들어보자

吳鍾振 2023. 4. 20. 14:22

요즘 YOLOv7 기반으로 번호판 인식 모델을 만들고 있는 중이다.

모델을 만들려면 학습할 이미지 데이터가 있어야 하는데

검색해 보면 죄다 외국 번호판 데이터밖에 없다. 

개인적인 생각으로 외국 번호판이랑 우리나라 번호판이랑 약간 다르게 생겨서

외국 번호판을 기반으로 학습해도 인식이 잘 될지 미지수였다.

그래서 생각해낸 것이 바로, 외국 번호판 이미지 데이터셋을 보면 이미지 파일과 어노테이션을 진행하여 번호판 좌표가 들어있는 텍스트 파일 또는 json 파일 같은 게 같이 들어있다. 
여기 좌표에 대한민국 번호판을 집어여면 되지 않을까 라는 생각이었다.

 

 

 

 

GitHub - Oh-JongJin/Virtual_Number_Plate: 가상 번호판 만들기

가상 번호판 만들기. Contribute to Oh-JongJin/Virtual_Number_Plate development by creating an account on GitHub.

github.com

GitHub에 간단한 사용법 정리해두었으니 참고하시면 될 듯 합니다.

 

아래 더보기를 눌러 코드 참고 (배경 이미지는 GitHub 링크 들어가시면 있습니다.)

더보기
import os
import random
import time
import argparse

from tqdm import tqdm
from PIL import Image, ImageDraw, ImageFont


# 대한민국 자동차 번호판의 한글 분류
korean = '가나다라마' \
         '거너더러머버서어저' \
         '고노도로모보소오조' \
         '구누두루무부수우주' \
         '하허호'
korean_taxi = '바사아자'
korean_rental = '하허호'
korean_parcel = '배'

# 결과 이미지 저장할 폴더 생성
os.makedirs('virtual/new8', exist_ok=True)
os.makedirs('virtual/old8', exist_ok=True)
os.makedirs('virtual/old7', exist_ok=True)

# 한글 문자 폰트 정보
# https://www.juso.go.kr/notice/NoticeBoardDetail.do?mgtSn=44&currentPage=11&searchType=&keyword=
ko_font = ImageFont.truetype('C:/Users/user/AppData/Local/Microsoft/Windows/Fonts/한길체.ttf',
                             100, encoding='unic')
# 숫자 폰트 정보
# https://fonts.google.com/noto/specimen/Noto+Sans+KR
font = ImageFont.truetype('C:/Users/user/AppData/Local/Microsoft/Windows/Fonts/NotoSansKR-Medium.otf',
                          120, encoding='unic')


def run():
    new_img_path, old_img_path, count = opt.new_plate, opt.old_plate, opt.count
    
    # 소요 시간 체크
    start = time.time()

    # 8자리 신형 번호판
    for i in tqdm(range(count), desc='8자리 신형 번호판'):
        front = f'{random.randint(100, 999)}'
        middle = random.choice(korean)
        back = f' {random.randint(1000, 9999)}'
        full_name = front + middle + back

        image_pil = Image.open(new_img_path)
        draw = ImageDraw.Draw(image_pil)
        draw.text((85, -20), front, 'black', font)  # (x,y), 번호판 문자열, 폰트 색, 위에서 설정한 폰트
        draw.text((290, 35), middle, 'black', ko_font)
        draw.text((375, -20), back, 'black', font)

        image_pil.save('virtual/new8/' + full_name + '.png', 'PNG')

    # 8자리 예전 번호판
    for i in tqdm(range(count), desc='8자리 이전 번호판'):
        front = f'{random.randint(100, 999)}'
        middle = random.choice(korean)
        back = f' {random.randint(1000, 9999)}'
        full_name = front + middle + back

        image_pil = Image.open(old_img_path)
        draw = ImageDraw.Draw(image_pil)
        draw.text((40, -20), front, 'black', font)  # (x,y), 번호판 문자열, 폰트 색, 위에서 설정한 폰트
        draw.text((245, 35), middle, 'black', ko_font)
        draw.text((340, -20), back, 'black', font)

        image_pil.save('virtual/old8/' + full_name + '.png', 'PNG')

    # 7자리 예전 번호판
    for i in tqdm(range(count), desc='7자리 이전 번호판'):
        front = f'{random.randint(10, 99)}'
        middle = random.choice(korean)
        back = f' {random.randint(1000, 9999)}'
        full_name = front + middle + back

        image_pil = Image.open(old_img_path)
        draw = ImageDraw.Draw(image_pil)
        draw.text((65, -20), front, 'black', font)  # (x,y), 번호판 문자열, 폰트 색, 위에서 설정한 폰트
        draw.text((205, 30), middle, 'black', ko_font)
        draw.text((315, -20), back, 'black', font)

        image_pil.save('virtual/old7/' + full_name + '.png', 'PNG')

    print(f'Done. ({round(time.time() - start, 3)}s)')  # 소요 시간


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--new-plate', type=str, default='number_plate_new.png', help='New number plate image file')
    parser.add_argument('--old-plate', type=str, default='number_plate_old.png', help='Old number plate image file')
    parser.add_argument('--count', type=int, default=100, help='Number of images to store')
    opt = parser.parse_args()

    run()

 

 

 

결 과:


실행하면 virtual 폴더에 세 개의 폴더가 생성된다.

new8: 신형 8자리 번호판
old7: 구형 7자리 번호판
old8: 구형 8자리 번호판

위 사진은 신형 8자리 번호판이다.

번호판이 잘 만들어지는 것을 확인해볼 수 있다.

물론 진짜 번호판과 비교해보면 글꼴도 다르고 배치도 다르다.

진짜 번호판 글꼴을 찾을 수가 없어서 한글 문자는 한길체를 사용하였고,
숫자는 NotaSans KR을 사용함.

다음 작업으로는 지금 만든 번호판을 외국 번호판 데이터셋에 합성해보려한다.

반응형