본문 바로가기

Back/Deep Learning

[Python] [CNN]점자번역 프로그램(2)

이전 글에서 이어 집니다.

 

2020/09/02 - [Python] - [Python] [CNN]점자번역 프로그램(0)

2020/09/02 - [Python] - [Python] [CNN]점자번역 프로그램(1)

 

 

 

ex.zip
0.04MB

 

3-2

이미지 데이터 생성 및 부풀리기

 

학습에 사용될 이미지는 다양한 이미지 종류를 사용하는게 좋습니다. 가능하면 여러 폰트와 점자예를 이용하여 데이터를 준비하면 좋겠지만.. 점자 폰트라는게 좋은 것만 있는 것도 아니고( 띄어쓰기 간격 고려가 안된 폰트가 많습니다.) 원하는 폰트를 이용하려 해도 이미지로 변환하여 넣는 과정에서 간격이 일정하지 않아 문제였습니다. 

 

팀원이 영문 > 점자 변환에 사용한 이미지를 이용해 보도록 하겠습니다.


1.DataImageGenerator 설정

from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img

datagen = ImageDataGenerator(
        rotation_range=5,
        width_shift_range=0.1,
        height_shift_range=0.1,
        shear_range=0.05,
        zoom_range=0.01,
        fill_mode='nearest'
        )

(https://keras.io/ko/preprocessing/image/) - 전체 속성에 대한정보

(https://tykimos.github.io/2017/06/10/CNN_Data_Augmentation) - 예시 이미지 까지 잘 사용해 주신 분

 

ImageDataGenerator는 다음과 같은 속성을 가집니다.

rotation_range : 시계방향 회전

width_shift_range : 좌우 이동(1이상일 경우 픽셀, 1이하일 경우 비율)

height_shift_range : 상하 이동(1이상일 경우 픽셀, 1이하일 경우 비율)

shear_range : 층밀리기 강도입니다. 쉽게 말해 찌그러지는 정도이며 반시계 방향 radian으로 나타냅니다.

zoom_range : 확대 및 축소 범위입니다. 1에서 ± 해서 적용됩니다.

fill_mode : 회전, 축소등으로 생기는 빈자리를 어떻게 채울지 정합니다.


 

2. 이미지 불러오기, 데이터 부풀리기

def all_new():
    alpha = 'a'
    for j in range (0,26):

        img = load_img('./Braille Dataset/ex/'+alpha+'.png')  # PIL 이미지
        x = img_to_array(img)
        x = x.reshape((1,) + x.shape)


        i = 0
        for batch in datagen.flow(x, batch_size=1,
                                  save_to_dir='./Braille Dataset/Braille Dataset3', save_prefix=alpha, save_format='jpg'):
            i += 1
            if i > 20:
                break  # 이미지 20장을 생성하고 마칩니다

        alpha = chr(ord(alpha) + 1)

이미지를 x로 불러와 datagen으로 쓸수 있도록 reshape 한 후 flow를 이용하여 복사해 냅니다. 

x : 복사할 이미지

batch_size : 한번에 생성할 이미지(?), 2로 설정할 경우 한번에 2장의 이미지가 나옵니다만.. 

save_to_dir : 저장경로

save_prefix : 생성된 파일명에 고정으로 붙을 이름입니다. 뒤에 무작위 숫자가 붙습니다.

save_format : 저장 형식.

 

반복문 구조로 짜고 i를 통해서 몇장을 뽑아낼 것인지 정합니다. 

alpha의 아스키 코드값을 변경해가며 a부터 z까지 뽑아냅니다.

 

 

def single_new(alpha):
    img = load_img('./Braille Dataset/ex/'+alpha+'.png')  # PIL 이미지
    x = img_to_array(img)
    x = x.reshape((1,) + x.shape)

    i = 0
    for batch in datagen.flow(x, batch_size=1,
                          save_to_dir='./Braille Dataset/Braille Dataset2', save_prefix=alpha, save_format='jpg'):
        i += 1
        if i > 10:
         break  # 이미지 10장을 생성하고 마칩니다

 

아스키 코드에 포함되지 않은 빈칸이나, 혹은 추가적인 학습을 위해 특정 문자만을 골라서 복사하는 함수입니다. 마찬가지로 i의 값을 바꿔주며 몇장을 뽑을 것인지 정해주면 됩니다.

 

 

예시로 쓸 점자 이미지 입니다.

 

이런식으로 복사되게 됩니다.


이하 코드 전문

from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img

datagen = ImageDataGenerator(
        rotation_range=5,
        width_shift_range=0.1,
        height_shift_range=0.1,
        shear_range=0.05,
        zoom_range=0.01,
        fill_mode='nearest'
        )


def all_new():
    alpha = 'a'
    for j in range (0,26):

        img = load_img('./Braille Dataset/ex/'+alpha+'.png')  # PIL 이미지
        x = img_to_array(img)
        x = x.reshape((1,) + x.shape)


        i = 0
        for batch in datagen.flow(x, batch_size=1,
                                  save_to_dir='./Braille Dataset/Braille Dataset2', save_prefix=alpha, save_format='jpg'):
            i += 1
            if i > 20:
                break  # 이미지 20장을 생성하고 마칩니다

        alpha = chr(ord(alpha) + 1)


def single_new(alpha):
    img = load_img('./Braille Dataset/ex/'+alpha+'.png')  # PIL 이미지
    x = img_to_array(img)
    x = x.reshape((1,) + x.shape)

    i = 0
    for batch in datagen.flow(x, batch_size=1,
                          save_to_dir='./Braille Dataset/Braille Dataset2', save_prefix=alpha, save_format='jpg'):
        i += 1
        if i > 10:
         break  # 이미지 20장을 생성하고 마칩니다