본문 바로가기

Back/Deep Learning

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

이전글에서 이어집니다.


3-4 모델 불러오기, 정확도 확인

def load_model():
    from keras.models import load_model
    model = load_model('BrailleNet.h5')
    return model

def acc_chk(model, val):
    acc = model.evaluate_generator(val)[1]
    print('model accuracy: {}'.format(round(acc,4)))

 

짧지만 중요한 부분중 하나입니다. 위에서 모델을 만들며 만든 모델은 Modelcheckpoint 콜백에 의해 저장됩니다.

저장된 모델을 불러오고 그 모델의 정확도를 검증합니다.

검증데이터는 따로 만들어서 불러와도 되고 이전에 만든 val_generator를 써도 됩니다. 


3-5 사진 자르기

 

사진으로 들어오는 점자는 가로로 길고 세로로 짧은 이미지가 들어오도록 처리해야 합니다.

실생활에 적용하려면 모델을 만들어 예측하는 것보다 이미지를 처리해 사용할 수 있게 만드는 작업이 더 중요할 것입니다. 다만 이미 그런 전처리 과정을 다 수행했다는 전제하에 예시 이미지를 사용하겠습니다.

 

hello world

 

최종 확인에사용될 이미지로 hello world를 점자로 바꿨습니다. 해상도는 1320*120 입니다.

해상도를 보면 알 수 있지만 세로길이 * 글자수 를 할경우 가로 길이가 나옵니다.

실제 점자는 세로로 약간 긴비율을 가지지만, 간격이 일정하기 때문에 전체 길이를 보면 글자수를 추정 할 수 있습니다.

아니면 점자를 찾아서 자르는 모델도 만들거나..

 

실제로 이미지데이터를 다루는것 역시 ImagedataGenerator를 이용하여 불러온뒤 가공하면 더욱 빠르게, 효율적으로 처리할 수 있지만 눈으로 잘리는 과정을 확인 하기 위해 실제로 파일을 생성하여 확인합니다.

 

from PIL import Image
import os

이미지를 다루는 PIL과 파일 및 경로를 다룰 os를 import 합니다. 

 

class img_devide():
    def __init__(self,img_path):
        self.img_path = img_path
        self.path = ''
        self.call_num = 0
        self.lengh = 0
        self.width = 0
        self.height = 0
        self.img = ''

 

이미지경로를 받아오는 클래스를 만들었습니다.

 



    def create_dir(self):
        try:
            try:
                os.mkdir('./test/')
            except:
                pass
            os.mkdir('./test/a')
            print('create new dir')
        except:
            print('already exist')
            pass
        self.path = './test/a'

    def set_image(self):
        self.img = Image.open(self.img_path)
        self.width = self.img.size[0]
        self.height = self.img.size[1]
        self.lengh = int(self.width / self.height)

    def remove_file(self):
        try:
            os.remove(self.path+'/'+str(self.call_num-1)+'.jpg')
        except:
            pass

    def remove_dir(self) :
        try:
            os.rmdir(self.path)
        except :
            print('fail')

 

우선 파일이 생성될 경로를 만들고 그 경로를 지정해 둡니다. 또한 이미지를 열어 이미지의 가로, 세로, 점자의 길이를 측정합니다. 필요없는 파일이나 경로를 지우기 위한 함수도 만들어 두었습니다.

 

def devide_img(self):
        self.img = Image.open(self.img_path)
        area = (0+self.call_num*self.height,0,self.width/self.lengh*(self.call_num+1),self.height)
        cropped_img = self.img.crop(area)
        cropped_img.save(self.path + '/'+str(self.call_num)+'.jpg')

        self.call_num+=1

이미지를 자르기 위한 함수입니다. 이미지를 열어 정해진 area로 자르고(crop) 저장합니다.

call_num 값을 추가하여 area는 함수가 호출 될때마다 한칸씩 옆으로 이동합니다.

 

이하 코드 전문

from PIL import Image
import os

class img_devide():
    def __init__(self,img_path):
        self.img_path = img_path
        self.path = ''
        self.call_num = 0
        self.lengh = 0
        self.width = 0
        self.height = 0
        self.img = ''


    def create_dir(self):
        try:
            os.mkdir('./test/a')
            print('create new dir')
        except:
            print('already exist')
            pass
        self.path = './test/a'

    def devide_img(self):
        self.img = Image.open(self.img_path)
        area = (0+self.call_num*self.height,0,self.width/self.lengh*(self.call_num+1),self.height)
        cropped_img = self.img.crop(area)
        cropped_img.save(self.path + '/'+str(self.call_num)+'.jpg')

        self.call_num+=1


    def set_image(self):
        self.img = Image.open(self.img_path)
        self.width = self.img.size[0]
        self.height = self.img.size[1]
        self.lengh = int(self.width / self.height)

    def remove_file(self):
        try:
            os.remove(self.path+'/'+str(self.call_num-1)+'.jpg')
        except:
            pass

    def remove_dir(self) :
        try:
            os.rmdir(self.path)
        except :
            print('fail')