본문 바로가기

Back/Deep Learning

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

이전글에서 이어집니다.

 

3-5 예측

import operator
from alpabet_trans import alpha

class Predic():
    result = []
    def Predict(self,model,real):
        my_list = model.predict(real)
        index, value = max(enumerate(my_list[0]), key=operator.itemgetter(1))
        print(index,alpha(index))
        self.result.append(alpha(index))

        return self.result

    def reset(self):
        self.result = []

def chk_trans():
    for i in range(0, 27):
        print(str(i) + ':' + alpha(i),end='  ')
        if i%3 ==2 :
            print()

예측을 위해선 불러온 모델과, 예측에 사용될 Imagegenarator 값이 필요합니다.

model.predict를 통해 값을 예측해내면 마지막 softmax 함수로 인하여 0~26까지의 Categorical variable이 생성되고 그중 최고 값을 가지는 값이  result 리스트에 추가됩니다. 

마찬가지로 value를 모아서 확인해 본다면 각 알파벳에 대한 학습 정도를 알아 볼수도 있습니다.

 

chk_trans는  Categorical variable이 어떻게 알파벳으로 바뀌는지 알려 줍니다, 안에 들어간 alpha는 다음과 같습니다. 

def alpha(num):

    if num == 26:
        return  ' '
    else:
        num_tr = num+97
        return chr(num_tr)

3 - 6 마무리

지금까지의 모든 과정은 다음과 같이 정리됩니다.

##GPU 오류 해결 (keras_scratch_graph)
#import keraserr
#keraserr.fixerr()

## 이미지 준비 *한번 실행되면 다시 실행할 필요 없음.
import Rdy_image
Rdy_image.Preset()

## data Generator 테스트, 검증 데이터 생성
import DATAGenerator
train_generator, val_generator = DATAGenerator.data_ready()

#MAKE MODEL *한번 모델이 생성되면 다시 실행할 필요 없음
import Make_model
#hist = Make_model.Make_model(train_generator,val_generator)
#Make_model.print_acc_loss(hist)

# BrailleNet에 저장된 모델을 불러옴.
# acc확인
import Load_model
model = Load_model.load_model()
acc = Load_model.acc_chk(model,val_generator)

# 사진 데이터 불러오기, 예측
import divide
import Predict

#path = 'D:/ML/Project_f/real/a/l.jpg'

def action(path):

    Predict.chk_trans()
    b = Predict.Predic()
    a = divide.img_devide(path)

    a.create_dir()
    a.set_image()
    b.reset()

    for i in range(0,a.lengh):
        a.devide_img()
        real = DATAGenerator.load_image('./test')
        b.Predict(model,real)
        a.remove_file()


    print(b.result)
    result = ''.join(b.result)
    return result

#action(path)
''''''

이미지를 준비하고 준비한이미지로 데이터 셋을 만들며 모델을 만들고 모델로 예측하는 모든 준비 과정과 작동을 한군데로 묶었습니다. 

 

이파일 자체는 다른 팀원으로 부터 이미지 경로를 전달받아 문자열의 형태로 번역해주는 역할을 하게 됩니다.

 

#path = 'D:/ML/Project_f/real/a/l.jpg'

def action(path):

    Predict.chk_trans()
    b = Predict.Predic()
    a = divide.img_devide(path)

    a.create_dir()
    a.set_image()
    b.reset()

    for i in range(0,a.lengh):
        a.devide_img()
        real = DATAGenerator.load_image('./test')
        b.Predict(model,real)
        a.remove_file()


    print(b.result)
    result = ''.join(b.result)
    return result

#action(path)

 

액션 부분을 살펴보겠습니다. 액션이 호출되면 chk_trans로 어떤 식으로 번역될것인지 보여주고 예측과 나누는 클래스를 생성합니다. 

 

divide 클래스는 나누어질 이미지 경로를 만든 뒤 이미지를 세팅하고

predict 클래스는 예측 이전에 한 번 초기화 합니다.

 

divide 클래스에 저장된 점자의 길이만큼 점자를 하나씩 잘라가며 예측을 진행하게 됩니다.

모든 예측이 끝나면 predict클래스의 result list를 한번 출력하고 문자열 형태로 바꿔 반환합니다.

 

 

 


 

 

21/04/29 추가 점자 학습 까지만, colab을 통해 구현한 노트입니다.

colab.research.google.com/drive/17IhRSFbVFHvaWJlEsF36BD5Cc5yje6zH?usp=sharing