딥러닝/딥러닝 Baseline

TEST IMAGE Sequence 상속 받아서 예측하기 (CNN Baseline 연계)

Stevelee_HMC 2022. 11. 10. 12:38

제목과 같이 테스트 이미지도 단순 for문을 통해서 image -> tensor 변형이 어려울 때 , sequence 를 사용할 수 있다.

이때 train data에서 사용한 sequence 그대로 쓰면 안되고 약간 변형만 해주면 된다. 

(label 내용들만 빼면 된다.)

 

# TEST 데이터를 불러온다 (당연히 label은 right answer라서 없다)

PATH_TEST = 'test data 경로' 

glob(PATH_TEST + "/*/*")    # *를 바꿔가며 이미지 경로 .jpg 단위확장자까지 잘들어가는지 확인 후

test = pd.DataFrame([])

test["image_files"] = glob(PATH_TEST + "/*/*")   

test_image_path = test["image_files"].values 

# TEST 데이터용 Sequence 선언

class test_data_set(Sequence):
    
    def __init__(self , image_filenames , batch_size = BATCH_SIZE , augmentor = None , pre_func = None , shuffle = None):
        
        self.image_filenames = image_filenames 
        # label 내용 삭제 
        self.batch_size = BATCH_SIZE 
        self.augmentor = augmentor 
        self.pre_func = pre_func 
        self.shuffle = shuffle
        
    def __len__(self):
        return int(np.ceil(len(self.labels)/self.batch_size))
    
    def __getitem__(self, index):
        
        image_name_batch = self.image_filenames[index * self.batch_size : (index+1)* self.batch_size]
        
        image_batch = np.zeros((image_name_batch.shape[0],IMAGE_SIZE , IMAGE_SIZE , 3))
        
        for image_index in range(image_name_batch.shape[0]):
            image = cv2.cvtColor(cv2.imread(image_name_batch[image_index]) , cv2.COLOR_BGR2RGB)
            image = image/ 255.0
            image = cv2.resize(image , (IMAGE_SIZE , IMAGE_SIZE))
        
            if self.augmentor is not None:
                image = self.augmentor(image = image)["image"]
            if self.pre_func is not None:
                image = self.pre_func(image)
            
            image_batch[image_index] = image
            
        return image_batch # return 은 image batch만
    
    
    def on_epoch_end(self):
        if(self.shuffle):
            self.image_filenames, self.labels = sklearn.utils.shuffle(self.image_filenames , self.labels)
        else:
            pass
            
            
 ### TEST data 인스턴스 생성 
 
 test_ds = data_set(test_image_path) ## label 넣을 필요 없어요 헷갈리지 않기 
 
 pred_sequence = model.predict(test_ds)  # 학습모델은 baseline 참조

 #pred_sequence.shape 결과 (전체 이미지 크기 , 라벨숫자) 차원이면 제대로 된 것 
 
 result = [np.argmax(value) for value in pred_sequence]
 
 categories = pd.factorize(train["image_labels"])[1] # 이미지 크기 작을때와 동일
 final_result =  categories[result]
 
 # to_csv로 제출하면 완료 
 # submission file 활용

위와 같이 참조해서 진행하면 된다.