A.I
U-Net으로 시맨틱 세그멘테이션을 이용해 도로찾기 본문
1. 시맨틱 세그멘테이션 데이터셋¶
이미지, 데이터 가져오기¶
- mkdir -p ~/aiffel/semantic_segmentation/data
- wget https://s3.eu-central-1.amazonaws.com/avg-kitti/data_semantics.zip
- unzip data_semantics.zip -d ~/aiffel/semantic_segmentation/data
데이터 로더(data loader) 만들기¶
pip install albumentations
참고자료
In [1]:
#필요한 라이브러리를 로드합니다.
import os
import math
import numpy as np
import tensorflow as tf
from PIL import Image
import matplotlib.pyplot as plt
from skimage.io import imread
from skimage.transform import resize
from glob import glob
from tensorflow.keras.models import *
from tensorflow.keras.layers import *
from tensorflow.keras.optimizers import *
print('슝=3')
슝=3
In [2]:
from albumentations import HorizontalFlip, RandomSizedCrop, Compose, OneOf, Resize
def build_augmentation(is_train=True):
if is_train: # 훈련용 데이터일 경우
return Compose([
HorizontalFlip(p=0.5), # 50%의 확률로 좌우대칭
RandomSizedCrop( # 50%의 확률로 RandomSizedCrop
min_max_height=(300, 370),
w2h_ratio=370/1242,
height=224,
width=224,
p=0.5
),
Resize( # 입력이미지를 224X224로 resize
width=224,
height=224
)
])
return Compose([ # 테스트용 데이터일 경우에는 224X224로 resize만 수행합니다.
Resize(
width=224,
height=224
)
])
In [3]:
import os
dir_path = os.getenv('HOME')+'/aiffel/semantic_segmentation/data/training'
augmentation = build_augmentation()
input_images = glob(os.path.join(dir_path, "image_2", "*.png"))
# 훈련 데이터셋에서 5개만 가져와 augmentation을 적용해 봅시다.
plt.figure(figsize=(12, 20))
for i in range(5):
image = imread(input_images[i])
image_data = {"image":image}
resized = augmentation(**image_data, is_train=False)
processed = augmentation(**image_data)
plt.subplot(5, 2, 2*i+1)
plt.imshow(resized["image"]) # 왼쪽이 원본이미지
plt.subplot(5, 2, 2*i+2)
plt.imshow(processed["image"]) # 오른쪽이 augment된 이미지
plt.show()
In [4]:
class KittiGenerator(tf.keras.utils.Sequence):
'''
KittiGenerator는 tf.keras.utils.Sequence를 상속받습니다.
우리가 KittiDataset을 원하는 방식으로 preprocess하기 위해서 Sequnce를 커스텀해 사용합니다.
'''
def __init__(self,
dir_path,
batch_size=16,
img_size=(224, 224, 3),
output_size=(224, 224),
is_train=True,
augmentation=None):
'''
dir_path: dataset의 directory path입니다.
batch_size: batch_size입니다.
img_size: preprocess에 사용할 입력이미지의 크기입니다.
output_size: ground_truth를 만들어주기 위한 크기입니다.
is_train: 이 Generator가 학습용인지 테스트용인지 구분합니다.
augmentation: 적용하길 원하는 augmentation 함수를 인자로 받습니다.
'''
self.dir_path = dir_path
self.batch_size = batch_size
self.is_train = is_train
self.dir_path = dir_path
self.augmentation = augmentation
self.img_size = img_size
self.output_size = output_size
# load_dataset()을 통해서 kitti dataset의 directory path에서 라벨과 이미지를 확인합니다.
self.data = self.load_dataset()
def load_dataset(self):
# kitti dataset에서 필요한 정보(이미지 경로 및 라벨)를 directory에서 확인하고 로드하는 함수입니다.
# 이때 is_train에 따라 test set을 분리해서 load하도록 해야합니다.
input_images = glob(os.path.join(self.dir_path, "image_2", "*.png"))
label_images = glob(os.path.join(self.dir_path, "semantic", "*.png"))
input_images.sort()
label_images.sort()
assert len(input_images) == len(label_images)
data = [ _ for _ in zip(input_images, label_images)]
if self.is_train:
return data[:-30]
return data[-30:]
def __len__(self):
# Generator의 length로서 전체 dataset을 batch_size로 나누고 소숫점 첫째자리에서 올림한 값을 반환합니다.
return math.ceil(len(self.data) / self.batch_size)
def __getitem__(self, index):
# 입력과 출력을 만듭니다.
# 입력은 resize및 augmentation이 적용된 input image이고
# 출력은 semantic label입니다.
batch_data = self.data[
index*self.batch_size:
(index + 1)*self.batch_size
]
inputs = np.zeros([self.batch_size, *self.img_size])
outputs = np.zeros([self.batch_size, *self.output_size])
for i, data in enumerate(batch_data):
input_img_path, output_path = data
_input = imread(input_img_path)
_output = imread(output_path)
_output = (_output==7).astype(np.uint8)*1
data = {
"image": _input,
"mask": _output,
}
augmented = self.augmentation(**data)
inputs[i] = augmented["image"]/255
outputs[i] = augmented["mask"]
return inputs, outputs
def on_epoch_end(self):
# 한 epoch가 끝나면 실행되는 함수입니다. 학습중인 경우에 순서를 random shuffle하도록 적용한 것을 볼 수 있습니다.
self.indexes = np.arange(len(self.data))
if self.is_train == True :
np.random.shuffle(self.indexes)
return self.indexes
In [5]:
augmentation = build_augmentation()
test_preproc = build_augmentation(is_train=False)
train_generator = KittiGenerator(
dir_path,
augmentation=augmentation,
)
test_generator = KittiGenerator(
dir_path,
augmentation=test_preproc,
is_train=False
)
In [6]:
def unet(input_shape=(224, 224, 3)):
inputs = Input(input_shape)
#Contracting Path
conv1 = Conv2D(64, 3, activation='relu', padding='same',kernel_initializer='he_normal')(inputs)
conv1 = Conv2D(64, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(128, 3, activation='relu', padding='same',kernel_initializer='he_normal')(pool1)
conv2 = Conv2D(128, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = Conv2D(256, 3, activation='relu', padding='same',kernel_initializer='he_normal')(pool2)
conv3 = Conv2D(256, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
conv4 = Conv2D(512, 3, activation='relu', padding='same',kernel_initializer='he_normal')(pool3)
conv4 = Conv2D(512, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv4)
drop4 = Dropout(0.5)(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)
conv5 = Conv2D(1024, 3, activation='relu', padding='same',kernel_initializer='he_normal')(pool4)
conv5 = Conv2D(1024, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv5)
#Expanding Path
drop5 = Dropout(0.5)(conv5)
up6 = Conv2D(512, 2, activation='relu', padding='same',kernel_initializer='he_normal')(UpSampling2D(size = (2,2))(drop5))
merge6 = concatenate([drop4,up6], axis = 3)
conv6 = Conv2D(512, 3, activation='relu', padding='same',kernel_initializer='he_normal')(merge6)
conv6 = Conv2D(512, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv6)
up7 = Conv2D(256, 2, activation='relu', padding='same',kernel_initializer='he_normal')(UpSampling2D(size = (2,2))(conv6))
merge7 = concatenate([conv3,up7], axis = 3)
conv7 = Conv2D(256, 3, activation='relu', padding='same',kernel_initializer='he_normal')(merge7)
conv7 = Conv2D(256, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv7)
up8 = Conv2D(128, 2, activation='relu', padding='same',kernel_initializer='he_normal')(UpSampling2D(size = (2,2))(conv7))
merge8 = concatenate([conv2,up8], axis = 3)
conv8 = Conv2D(128, 3, activation='relu', padding='same',kernel_initializer='he_normal')(merge8)
conv8 = Conv2D(128, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv8)
up9 = Conv2D(64, 2, activation='relu', padding='same',kernel_initializer='he_normal')(UpSampling2D(size = (2,2))(conv8))
merge9 = concatenate([conv1,up9], axis = 3)
conv9 = Conv2D(64, 3, activation='relu', padding='same',kernel_initializer='he_normal')(merge9)
conv9 = Conv2D(64, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv9)
conv9 = Conv2D(2, 3, activation='relu', padding='same',kernel_initializer='he_normal')(conv9)
conv10 = Conv2D(1, 1, activation='sigmoid')(conv9)
model = Model(inputs = inputs, outputs = conv10)
return model
모델 학습하기¶
In [ ]:
unet = build_model()
unet.compile(optimizer = Adam(lr = 1e-4), loss = 'binary_crossentropy')
unet.fit_generator(
generator=train_generator,
validation_data=test_generator,
steps_per_epoch=len(train_generator),
epochs=100,
)
In [7]:
model_path = dir_path + '/unet.h5'
#unet.save(model_path) #학습한 모델을 저장해 주세요.
시맨틱 세그멘테이션 모델 시각화¶
- model = tf.keras.models.load_model(model_path) 저장된 모델 불러오기
In [8]:
unet = tf.keras.models.load_model(model_path)
In [9]:
def get_output(model, preproc, image_path, output_path):
origin_img = imread(image_path)
data = {"image":origin_img}
processed = preproc(**data)
output = model(np.expand_dims(processed["image"]/255,axis=0))
output = (output[0].numpy()>0.5).astype(np.uint8).squeeze(-1)*255 #0.5라는 threshold를 변경하면 도로인식 결과범위가 달라집니다.
output = Image.fromarray(output)
background = Image.fromarray(origin_img).convert('RGBA')
output = output.resize((origin_img.shape[1], origin_img.shape[0])).convert('RGBA')
output = Image.blend(background, output, alpha=0.5)
output.show()
return output
In [10]:
def calculate_iou_score(target, prediction):
intersection = np.logical_and(target, prediction)
union = np.logical_or(target, prediction)
iou_score = float(np.sum(intersection)) / float(np.sum(union))
print('IoU : %f' % iou_score )
return iou_score
In [11]:
def get_output(model, preproc, image_path, output_path, label_path):
origin_img = imread(image_path)
data = {"image":origin_img}
processed = preproc(**data)
output = model(np.expand_dims(processed["image"]/255,axis=0))
output = (output[0].numpy()>=0.5).astype(np.uint8).squeeze(-1)*255 #0.5라는 threshold를 변경하면 도로인식 결과범위가 달라집니다.
prediction = output/255 # 도로로 판단한 영역
output = Image.fromarray(output)
background = Image.fromarray(origin_img).convert('RGBA')
output = output.resize((origin_img.shape[1], origin_img.shape[0])).convert('RGBA')
output = Image.blend(background, output, alpha=0.5)
output.show() # 도로로 판단한 영역을 시각화!
if label_path:
label_img = imread(label_path)
label_data = {"image":label_img}
label_processed = preproc(**label_data)
label_processed = label_processed["image"]
target = (label_processed == 7).astype(np.uint8)*1 # 라벨에서 도로로 기재된 영역
return output, prediction, target
else:
return output, prediction, _
In [45]:
# 완성한 뒤에는 시각화한 결과를 눈으로 확인해봅시다!
i = 2 # i값을 바꾸면 테스트용 파일이 달라집니다.
output, prediction, target = get_output(
unet,
test_preproc,
image_path=dir_path + f'/image_2/00{str(i).zfill(4)}_10.png',
output_path=dir_path + f'./result_{str(i).zfill(3)}.png',
label_path=dir_path + f'/semantic/00{str(i).zfill(4)}_10.png'
)
calculate_iou_score(target, prediction)
IoU : 0.622965
Out[45]:
0.6229652927219556
In [13]:
plt.figure(figsize=(8, 16))
for i in range(5) :
data = next(iter(train_generator))
plt.subplot(5, 2, 2*i+1)
plt.imshow(data[0][0, :, :])
plt.subplot(5, 2, 2*i+2)
plt.imshow(data[1][0, :, :])
plt.show()
In [27]:
def build_UNet_Plus(input_shape=(224, 224, 3), n = 16) :
filters = [n, n*2, n*4, n*8, n*16]
inputs = Input(input_shape)
#conv0_0
conv001 = Conv2D(filters=filters[0], kernel_size=3, padding='same', kernel_initializer='he_normal', name='conv0_0_1')(inputs)
bn001 = BatchNormalization()(conv001)
act001 = Activation('relu')(bn001)
conv002 = Conv2D(filters=filters[0], kernel_size=3, padding='same', kernel_initializer='he_normal', name='conv0_0_2')(act001)
bn002 = BatchNormalization()(conv002)
conv00 = Activation('relu')(bn002)
#conv1_0
conv00_down = MaxPooling2D(strides=2)(conv00)
conv101 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_0_1')(conv00_down)
bn101 = BatchNormalization()(conv101)
act101 = Activation('relu')(bn101)
conv102 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_0_2')(act101)
bn102 = BatchNormalization()(conv102)
conv10 = Activation('relu')(bn102)
#conv2_0
conv10_down = MaxPooling2D(strides=2)(conv10)
conv201 = Conv2D(filters[2], 3, padding='same', kernel_initializer='he_normal', name='conv2_0_1')(conv10_down)
bn201 = BatchNormalization()(conv201)
act201 = Activation('relu')(bn201)
conv202 = Conv2D(filters[2], 3, padding='same', kernel_initializer='he_normal', name='conv2_0_2')(act201)
bn202 = BatchNormalization()(conv202)
conv20 = Activation('relu')(bn202)
#conv3_0
conv20_down = MaxPooling2D(strides=2)(conv20)
conv301 = Conv2D(filters[3], 3, padding='same', kernel_initializer='he_normal', name='conv3_0_1')(conv20_down)
bn301 = BatchNormalization()(conv301)
act301 = Activation('relu')(bn301)
conv302 = Conv2D(filters[3], 3, padding='same', kernel_initializer='he_normal', name='conv3_0_2')(act301)
bn302 = BatchNormalization()(conv302)
conv30 = Activation('relu')(bn302)
#conv4_0
conv30_down = MaxPooling2D(strides=2)(conv30)
conv401 = Conv2D(filters[4], 3, padding='same', kernel_initializer='he_normal', name='conv4_0_1')(conv30_down)
bn401 = BatchNormalization()(conv401)
act401 = Activation('relu')(bn401)
conv402 = Conv2D(filters[4], 3, padding='same', kernel_initializer='he_normal', name='conv4_0_2')(act401)
bn402 = BatchNormalization()(conv402)
conv40 = Activation('relu')(bn402)
#conv0_1
conv10_up = UpSampling2D()(conv10)
conv01_in = Concatenate()([conv00, conv10_up])
conv011 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_1_1')(conv01_in)
bn011 = BatchNormalization()(conv011)
act011 = Activation('relu')(bn011)
conv012 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_1_2')(act011)
bn012 = BatchNormalization()(conv012)
conv01 = Activation('relu')(bn012)
#conv1_1
conv20_up = UpSampling2D()(conv20)
conv11_in = Concatenate()([conv10, conv20_up])
conv111 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_1_1')(conv11_in)
bn111 = BatchNormalization()(conv111)
act111 = Activation('relu')(bn111)
conv112 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_1_2')(act111)
bn112 = BatchNormalization()(conv112)
conv11 = Activation('relu')(bn112)
#conv2_1
conv30_up = UpSampling2D()(conv30)
conv21_in = Concatenate()([conv20, conv30_up])
conv211 = Conv2D(filters[2], 3, padding='same', kernel_initializer='he_normal', name='conv2_1_1')(conv21_in)
bn211 = BatchNormalization()(conv211)
act211 = Activation('relu')(bn211)
conv212 = Conv2D(filters[2], 3, padding='same', kernel_initializer='he_normal', name='conv2_1_2')(act211)
bn212 = BatchNormalization()(conv212)
conv21 = Activation('relu')(bn212)
#conv3_1
conv40_up = UpSampling2D()(conv40)
conv31_in = Concatenate()([conv30, conv40_up])
conv311 = Conv2D(filters[3], 3, padding='same', kernel_initializer='he_normal', name='conv3_1_1')(conv31_in)
bn311 = BatchNormalization()(conv311)
act311 = Activation('relu')(bn311)
conv312 = Conv2D(filters[3], 3, padding='same', kernel_initializer='he_normal', name='conv3_1_2')(act311)
bn312 = BatchNormalization()(conv312)
conv31 = Activation('relu')(bn312)
#conv0_2
conv11_up = UpSampling2D()(conv11)
conv02_in = Concatenate()([conv00, conv01, conv11_up])
conv021 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_2_1')(conv02_in)
bn021 = BatchNormalization()(conv021)
act021 = Activation('relu')(bn021)
conv022 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_2_2')(act021)
bn022 = BatchNormalization()(conv022)
conv02 = Activation('relu')(bn022)
#conv1_2
conv21_up = UpSampling2D()(conv21)
conv12_in = Concatenate()([conv10, conv11, conv21_up])
conv121 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_2_1')(conv12_in)
bn121 = BatchNormalization()(conv121)
act121 = Activation('relu')(bn121)
conv122 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_2_2')(act121)
bn122 = BatchNormalization()(conv122)
conv12 = Activation('relu')(bn122)
#conv2_2
conv31_up = UpSampling2D()(conv31)
conv22_in = Concatenate()([conv20, conv21, conv31_up])
conv221 = Conv2D(filters[2], 3, padding='same', kernel_initializer='he_normal', name='conv2_2_1')(conv22_in)
bn221 = BatchNormalization()(conv221)
act221 = Activation('relu')(bn221)
conv222 = Conv2D(filters[2], 3, padding='same', kernel_initializer='he_normal', name='conv2_2_2')(act221)
bn222 = BatchNormalization()(conv222)
conv22 = Activation('relu')(bn222)
#conv0_3
conv12_up = UpSampling2D()(conv12)
conv03_in = Concatenate()([conv00, conv01, conv02, conv12_up])
conv031 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_3_1')(conv03_in)
bn031 = BatchNormalization()(conv031)
act031 = Activation('relu')(bn031)
conv032 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_3_2')(act031)
bn032 = BatchNormalization()(conv032)
conv03 = Activation('relu')(bn032)
#conv1_3
conv22_up = UpSampling2D()(conv22)
conv13_in = Concatenate()([conv10, conv11, conv12, conv22_up])
conv131 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_3_1')(conv13_in)
bn131 = BatchNormalization()(conv131)
act131 = Activation('relu')(bn131)
conv132 = Conv2D(filters[1], 3, padding='same', kernel_initializer='he_normal', name='conv1_3_2')(act131)
bn132 = BatchNormalization()(conv132)
conv13 = Activation('relu')(bn132)
#conv0_4
conv13_up = UpSampling2D()(conv13)
conv04_in = Concatenate()([conv00, conv01, conv02, conv03, conv13_up])
conv041 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_4_1')(conv04_in)
bn041 = BatchNormalization()(conv041)
act041 = Activation('relu')(bn041)
conv042 = Conv2D(filters[0], 3, padding='same', kernel_initializer='he_normal', name='conv0_4_2')(act041)
bn042 = BatchNormalization()(conv042)
conv04 = Activation('relu')(bn042)
output = Conv2D(1, 1, activation='sigmoid', name='final')(conv04)
model = Model(inputs = inputs, outputs = output)
return model
In [28]:
unet_pp = build_UNet_Plus()
unet_pp.summary()
Model: "functional_5" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_3 (InputLayer) [(None, 224, 224, 3) 0 __________________________________________________________________________________________________ conv0_0_1 (Conv2D) (None, 224, 224, 16) 448 input_3[0][0] __________________________________________________________________________________________________ batch_normalization_60 (BatchNo (None, 224, 224, 16) 64 conv0_0_1[0][0] __________________________________________________________________________________________________ activation_60 (Activation) (None, 224, 224, 16) 0 batch_normalization_60[0][0] __________________________________________________________________________________________________ conv0_0_2 (Conv2D) (None, 224, 224, 16) 2320 activation_60[0][0] __________________________________________________________________________________________________ batch_normalization_61 (BatchNo (None, 224, 224, 16) 64 conv0_0_2[0][0] __________________________________________________________________________________________________ activation_61 (Activation) (None, 224, 224, 16) 0 batch_normalization_61[0][0] __________________________________________________________________________________________________ max_pooling2d_8 (MaxPooling2D) (None, 112, 112, 16) 0 activation_61[0][0] __________________________________________________________________________________________________ conv1_0_1 (Conv2D) (None, 112, 112, 32) 4640 max_pooling2d_8[0][0] __________________________________________________________________________________________________ batch_normalization_62 (BatchNo (None, 112, 112, 32) 128 conv1_0_1[0][0] __________________________________________________________________________________________________ activation_62 (Activation) (None, 112, 112, 32) 0 batch_normalization_62[0][0] __________________________________________________________________________________________________ conv1_0_2 (Conv2D) (None, 112, 112, 32) 9248 activation_62[0][0] __________________________________________________________________________________________________ batch_normalization_63 (BatchNo (None, 112, 112, 32) 128 conv1_0_2[0][0] __________________________________________________________________________________________________ activation_63 (Activation) (None, 112, 112, 32) 0 batch_normalization_63[0][0] __________________________________________________________________________________________________ max_pooling2d_9 (MaxPooling2D) (None, 56, 56, 32) 0 activation_63[0][0] __________________________________________________________________________________________________ conv2_0_1 (Conv2D) (None, 56, 56, 64) 18496 max_pooling2d_9[0][0] __________________________________________________________________________________________________ batch_normalization_64 (BatchNo (None, 56, 56, 64) 256 conv2_0_1[0][0] __________________________________________________________________________________________________ activation_64 (Activation) (None, 56, 56, 64) 0 batch_normalization_64[0][0] __________________________________________________________________________________________________ conv2_0_2 (Conv2D) (None, 56, 56, 64) 36928 activation_64[0][0] __________________________________________________________________________________________________ batch_normalization_65 (BatchNo (None, 56, 56, 64) 256 conv2_0_2[0][0] __________________________________________________________________________________________________ activation_65 (Activation) (None, 56, 56, 64) 0 batch_normalization_65[0][0] __________________________________________________________________________________________________ max_pooling2d_10 (MaxPooling2D) (None, 28, 28, 64) 0 activation_65[0][0] __________________________________________________________________________________________________ conv3_0_1 (Conv2D) (None, 28, 28, 128) 73856 max_pooling2d_10[0][0] __________________________________________________________________________________________________ batch_normalization_66 (BatchNo (None, 28, 28, 128) 512 conv3_0_1[0][0] __________________________________________________________________________________________________ activation_66 (Activation) (None, 28, 28, 128) 0 batch_normalization_66[0][0] __________________________________________________________________________________________________ conv3_0_2 (Conv2D) (None, 28, 28, 128) 147584 activation_66[0][0] __________________________________________________________________________________________________ batch_normalization_67 (BatchNo (None, 28, 28, 128) 512 conv3_0_2[0][0] __________________________________________________________________________________________________ activation_67 (Activation) (None, 28, 28, 128) 0 batch_normalization_67[0][0] __________________________________________________________________________________________________ max_pooling2d_11 (MaxPooling2D) (None, 14, 14, 128) 0 activation_67[0][0] __________________________________________________________________________________________________ conv4_0_1 (Conv2D) (None, 14, 14, 256) 295168 max_pooling2d_11[0][0] __________________________________________________________________________________________________ batch_normalization_68 (BatchNo (None, 14, 14, 256) 1024 conv4_0_1[0][0] __________________________________________________________________________________________________ activation_68 (Activation) (None, 14, 14, 256) 0 batch_normalization_68[0][0] __________________________________________________________________________________________________ conv4_0_2 (Conv2D) (None, 14, 14, 256) 590080 activation_68[0][0] __________________________________________________________________________________________________ batch_normalization_69 (BatchNo (None, 14, 14, 256) 1024 conv4_0_2[0][0] __________________________________________________________________________________________________ activation_69 (Activation) (None, 14, 14, 256) 0 batch_normalization_69[0][0] __________________________________________________________________________________________________ up_sampling2d_23 (UpSampling2D) (None, 28, 28, 256) 0 activation_69[0][0] __________________________________________________________________________________________________ up_sampling2d_22 (UpSampling2D) (None, 56, 56, 128) 0 activation_67[0][0] __________________________________________________________________________________________________ concatenate_23 (Concatenate) (None, 28, 28, 384) 0 activation_67[0][0] up_sampling2d_23[0][0] __________________________________________________________________________________________________ up_sampling2d_21 (UpSampling2D) (None, 112, 112, 64) 0 activation_65[0][0] __________________________________________________________________________________________________ concatenate_22 (Concatenate) (None, 56, 56, 192) 0 activation_65[0][0] up_sampling2d_22[0][0] __________________________________________________________________________________________________ conv3_1_1 (Conv2D) (None, 28, 28, 128) 442496 concatenate_23[0][0] __________________________________________________________________________________________________ up_sampling2d_20 (UpSampling2D) (None, 224, 224, 32) 0 activation_63[0][0] __________________________________________________________________________________________________ concatenate_21 (Concatenate) (None, 112, 112, 96) 0 activation_63[0][0] up_sampling2d_21[0][0] __________________________________________________________________________________________________ conv2_1_1 (Conv2D) (None, 56, 56, 64) 110656 concatenate_22[0][0] __________________________________________________________________________________________________ batch_normalization_76 (BatchNo (None, 28, 28, 128) 512 conv3_1_1[0][0] __________________________________________________________________________________________________ concatenate_20 (Concatenate) (None, 224, 224, 48) 0 activation_61[0][0] up_sampling2d_20[0][0] __________________________________________________________________________________________________ conv1_1_1 (Conv2D) (None, 112, 112, 32) 27680 concatenate_21[0][0] __________________________________________________________________________________________________ batch_normalization_74 (BatchNo (None, 56, 56, 64) 256 conv2_1_1[0][0] __________________________________________________________________________________________________ activation_76 (Activation) (None, 28, 28, 128) 0 batch_normalization_76[0][0] __________________________________________________________________________________________________ conv0_1_1 (Conv2D) (None, 224, 224, 16) 6928 concatenate_20[0][0] __________________________________________________________________________________________________ batch_normalization_72 (BatchNo (None, 112, 112, 32) 128 conv1_1_1[0][0] __________________________________________________________________________________________________ activation_74 (Activation) (None, 56, 56, 64) 0 batch_normalization_74[0][0] __________________________________________________________________________________________________ conv3_1_2 (Conv2D) (None, 28, 28, 128) 147584 activation_76[0][0] __________________________________________________________________________________________________ batch_normalization_70 (BatchNo (None, 224, 224, 16) 64 conv0_1_1[0][0] __________________________________________________________________________________________________ activation_72 (Activation) (None, 112, 112, 32) 0 batch_normalization_72[0][0] __________________________________________________________________________________________________ conv2_1_2 (Conv2D) (None, 56, 56, 64) 36928 activation_74[0][0] __________________________________________________________________________________________________ batch_normalization_77 (BatchNo (None, 28, 28, 128) 512 conv3_1_2[0][0] __________________________________________________________________________________________________ activation_70 (Activation) (None, 224, 224, 16) 0 batch_normalization_70[0][0] __________________________________________________________________________________________________ conv1_1_2 (Conv2D) (None, 112, 112, 32) 9248 activation_72[0][0] __________________________________________________________________________________________________ batch_normalization_75 (BatchNo (None, 56, 56, 64) 256 conv2_1_2[0][0] __________________________________________________________________________________________________ activation_77 (Activation) (None, 28, 28, 128) 0 batch_normalization_77[0][0] __________________________________________________________________________________________________ conv0_1_2 (Conv2D) (None, 224, 224, 16) 2320 activation_70[0][0] __________________________________________________________________________________________________ batch_normalization_73 (BatchNo (None, 112, 112, 32) 128 conv1_1_2[0][0] __________________________________________________________________________________________________ activation_75 (Activation) (None, 56, 56, 64) 0 batch_normalization_75[0][0] __________________________________________________________________________________________________ up_sampling2d_26 (UpSampling2D) (None, 56, 56, 128) 0 activation_77[0][0] __________________________________________________________________________________________________ batch_normalization_71 (BatchNo (None, 224, 224, 16) 64 conv0_1_2[0][0] __________________________________________________________________________________________________ activation_73 (Activation) (None, 112, 112, 32) 0 batch_normalization_73[0][0] __________________________________________________________________________________________________ up_sampling2d_25 (UpSampling2D) (None, 112, 112, 64) 0 activation_75[0][0] __________________________________________________________________________________________________ concatenate_26 (Concatenate) (None, 56, 56, 256) 0 activation_65[0][0] activation_75[0][0] up_sampling2d_26[0][0] __________________________________________________________________________________________________ activation_71 (Activation) (None, 224, 224, 16) 0 batch_normalization_71[0][0] __________________________________________________________________________________________________ up_sampling2d_24 (UpSampling2D) (None, 224, 224, 32) 0 activation_73[0][0] __________________________________________________________________________________________________ concatenate_25 (Concatenate) (None, 112, 112, 128 0 activation_63[0][0] activation_73[0][0] up_sampling2d_25[0][0] __________________________________________________________________________________________________ conv2_2_1 (Conv2D) (None, 56, 56, 64) 147520 concatenate_26[0][0] __________________________________________________________________________________________________ concatenate_24 (Concatenate) (None, 224, 224, 64) 0 activation_61[0][0] activation_71[0][0] up_sampling2d_24[0][0] __________________________________________________________________________________________________ conv1_2_1 (Conv2D) (None, 112, 112, 32) 36896 concatenate_25[0][0] __________________________________________________________________________________________________ batch_normalization_82 (BatchNo (None, 56, 56, 64) 256 conv2_2_1[0][0] __________________________________________________________________________________________________ conv0_2_1 (Conv2D) (None, 224, 224, 16) 9232 concatenate_24[0][0] __________________________________________________________________________________________________ batch_normalization_80 (BatchNo (None, 112, 112, 32) 128 conv1_2_1[0][0] __________________________________________________________________________________________________ activation_82 (Activation) (None, 56, 56, 64) 0 batch_normalization_82[0][0] __________________________________________________________________________________________________ batch_normalization_78 (BatchNo (None, 224, 224, 16) 64 conv0_2_1[0][0] __________________________________________________________________________________________________ activation_80 (Activation) (None, 112, 112, 32) 0 batch_normalization_80[0][0] __________________________________________________________________________________________________ conv2_2_2 (Conv2D) (None, 56, 56, 64) 36928 activation_82[0][0] __________________________________________________________________________________________________ activation_78 (Activation) (None, 224, 224, 16) 0 batch_normalization_78[0][0] __________________________________________________________________________________________________ conv1_2_2 (Conv2D) (None, 112, 112, 32) 9248 activation_80[0][0] __________________________________________________________________________________________________ batch_normalization_83 (BatchNo (None, 56, 56, 64) 256 conv2_2_2[0][0] __________________________________________________________________________________________________ conv0_2_2 (Conv2D) (None, 224, 224, 16) 2320 activation_78[0][0] __________________________________________________________________________________________________ batch_normalization_81 (BatchNo (None, 112, 112, 32) 128 conv1_2_2[0][0] __________________________________________________________________________________________________ activation_83 (Activation) (None, 56, 56, 64) 0 batch_normalization_83[0][0] __________________________________________________________________________________________________ batch_normalization_79 (BatchNo (None, 224, 224, 16) 64 conv0_2_2[0][0] __________________________________________________________________________________________________ activation_81 (Activation) (None, 112, 112, 32) 0 batch_normalization_81[0][0] __________________________________________________________________________________________________ up_sampling2d_28 (UpSampling2D) (None, 112, 112, 64) 0 activation_83[0][0] __________________________________________________________________________________________________ activation_79 (Activation) (None, 224, 224, 16) 0 batch_normalization_79[0][0] __________________________________________________________________________________________________ up_sampling2d_27 (UpSampling2D) (None, 224, 224, 32) 0 activation_81[0][0] __________________________________________________________________________________________________ concatenate_28 (Concatenate) (None, 112, 112, 160 0 activation_63[0][0] activation_73[0][0] activation_81[0][0] up_sampling2d_28[0][0] __________________________________________________________________________________________________ concatenate_27 (Concatenate) (None, 224, 224, 80) 0 activation_61[0][0] activation_71[0][0] activation_79[0][0] up_sampling2d_27[0][0] __________________________________________________________________________________________________ conv1_3_1 (Conv2D) (None, 112, 112, 32) 46112 concatenate_28[0][0] __________________________________________________________________________________________________ conv0_3_1 (Conv2D) (None, 224, 224, 16) 11536 concatenate_27[0][0] __________________________________________________________________________________________________ batch_normalization_86 (BatchNo (None, 112, 112, 32) 128 conv1_3_1[0][0] __________________________________________________________________________________________________ batch_normalization_84 (BatchNo (None, 224, 224, 16) 64 conv0_3_1[0][0] __________________________________________________________________________________________________ activation_86 (Activation) (None, 112, 112, 32) 0 batch_normalization_86[0][0] __________________________________________________________________________________________________ activation_84 (Activation) (None, 224, 224, 16) 0 batch_normalization_84[0][0] __________________________________________________________________________________________________ conv1_3_2 (Conv2D) (None, 112, 112, 32) 9248 activation_86[0][0] __________________________________________________________________________________________________ conv0_3_2 (Conv2D) (None, 224, 224, 16) 2320 activation_84[0][0] __________________________________________________________________________________________________ batch_normalization_87 (BatchNo (None, 112, 112, 32) 128 conv1_3_2[0][0] __________________________________________________________________________________________________ batch_normalization_85 (BatchNo (None, 224, 224, 16) 64 conv0_3_2[0][0] __________________________________________________________________________________________________ activation_87 (Activation) (None, 112, 112, 32) 0 batch_normalization_87[0][0] __________________________________________________________________________________________________ activation_85 (Activation) (None, 224, 224, 16) 0 batch_normalization_85[0][0] __________________________________________________________________________________________________ up_sampling2d_29 (UpSampling2D) (None, 224, 224, 32) 0 activation_87[0][0] __________________________________________________________________________________________________ concatenate_29 (Concatenate) (None, 224, 224, 96) 0 activation_61[0][0] activation_71[0][0] activation_79[0][0] activation_85[0][0] up_sampling2d_29[0][0] __________________________________________________________________________________________________ conv0_4_1 (Conv2D) (None, 224, 224, 16) 13840 concatenate_29[0][0] __________________________________________________________________________________________________ batch_normalization_88 (BatchNo (None, 224, 224, 16) 64 conv0_4_1[0][0] __________________________________________________________________________________________________ activation_88 (Activation) (None, 224, 224, 16) 0 batch_normalization_88[0][0] __________________________________________________________________________________________________ conv0_4_2 (Conv2D) (None, 224, 224, 16) 2320 activation_88[0][0] __________________________________________________________________________________________________ batch_normalization_89 (BatchNo (None, 224, 224, 16) 64 conv0_4_2[0][0] __________________________________________________________________________________________________ activation_89 (Activation) (None, 224, 224, 16) 0 batch_normalization_89[0][0] __________________________________________________________________________________________________ final (Conv2D) (None, 224, 224, 1) 17 activation_89[0][0] ================================================================================================== Total params: 2,297,441 Trainable params: 2,293,793 Non-trainable params: 3,648 __________________________________________________________________________________________________
In [29]:
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
# Restrict TensorFlow to only allocate 1GB of memory on the first GPU
try:
tf.config.experimental.set_virtual_device_configuration(
gpus[0],
[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=6144)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
# Virtual devices must be set before GPUs have been initialized
print(e)
Virtual devices cannot be modified after being initialized
In [30]:
unet_pp.compile(
optimizer = Adam(lr=1e-4), loss = 'binary_crossentropy')
unet_pp.fit_generator(
generator=train_generator,
validation_data=test_generator,
steps_per_epoch=len(train_generator),
epochs=100
)
model_path = dir_path + '/unet_pp.h5'
unet_pp.save(model_path) #학습한 모델을 저장해 주세요.
Epoch 1/100 2/11 [====>.........................] - ETA: 1s - loss: 0.6303WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.1030s vs `on_train_batch_end` time: 0.2016s). Check your callbacks. 11/11 [==============================] - 3s 307ms/step - loss: 0.5503 - val_loss: 0.6677 Epoch 2/100 11/11 [==============================] - 3s 276ms/step - loss: 0.4594 - val_loss: 0.6182 Epoch 3/100 11/11 [==============================] - 3s 298ms/step - loss: 0.3954 - val_loss: 0.5686 Epoch 4/100 11/11 [==============================] - 3s 303ms/step - loss: 0.3503 - val_loss: 0.5203 Epoch 5/100 11/11 [==============================] - 3s 308ms/step - loss: 0.3402 - val_loss: 0.4828 Epoch 6/100 11/11 [==============================] - 3s 287ms/step - loss: 0.3191 - val_loss: 0.4569 Epoch 7/100 11/11 [==============================] - 3s 285ms/step - loss: 0.2980 - val_loss: 0.4325 Epoch 8/100 11/11 [==============================] - 3s 282ms/step - loss: 0.2806 - val_loss: 0.4140 Epoch 9/100 11/11 [==============================] - 3s 280ms/step - loss: 0.2853 - val_loss: 0.3961 Epoch 10/100 11/11 [==============================] - 3s 278ms/step - loss: 0.2731 - val_loss: 0.3802 Epoch 11/100 11/11 [==============================] - 3s 278ms/step - loss: 0.2588 - val_loss: 0.3646 Epoch 12/100 11/11 [==============================] - 3s 278ms/step - loss: 0.2499 - val_loss: 0.3533 Epoch 13/100 11/11 [==============================] - 3s 278ms/step - loss: 0.2660 - val_loss: 0.3443 Epoch 14/100 11/11 [==============================] - 3s 278ms/step - loss: 0.2470 - val_loss: 0.3355 Epoch 15/100 11/11 [==============================] - 3s 278ms/step - loss: 0.2344 - val_loss: 0.3208 Epoch 16/100 11/11 [==============================] - 3s 278ms/step - loss: 0.2314 - val_loss: 0.3142 Epoch 17/100 11/11 [==============================] - 3s 279ms/step - loss: 0.2332 - val_loss: 0.3098 Epoch 18/100 11/11 [==============================] - 3s 279ms/step - loss: 0.2270 - val_loss: 0.2968 Epoch 19/100 11/11 [==============================] - 3s 279ms/step - loss: 0.2167 - val_loss: 0.2866 Epoch 20/100 11/11 [==============================] - 3s 279ms/step - loss: 0.2057 - val_loss: 0.2806 Epoch 21/100 11/11 [==============================] - 3s 279ms/step - loss: 0.2033 - val_loss: 0.2729 Epoch 22/100 11/11 [==============================] - 3s 279ms/step - loss: 0.2038 - val_loss: 0.2612 Epoch 23/100 11/11 [==============================] - 3s 280ms/step - loss: 0.2130 - val_loss: 0.2573 Epoch 24/100 11/11 [==============================] - 3s 280ms/step - loss: 0.2050 - val_loss: 0.2499 Epoch 25/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1926 - val_loss: 0.2371 Epoch 26/100 11/11 [==============================] - 3s 280ms/step - loss: 0.2019 - val_loss: 0.2375 Epoch 27/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1864 - val_loss: 0.2337 Epoch 28/100 11/11 [==============================] - 3s 281ms/step - loss: 0.1952 - val_loss: 0.2265 Epoch 29/100 11/11 [==============================] - 3s 281ms/step - loss: 0.1903 - val_loss: 0.2213 Epoch 30/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1824 - val_loss: 0.2184 Epoch 31/100 11/11 [==============================] - 3s 281ms/step - loss: 0.2046 - val_loss: 0.2163 Epoch 32/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1974 - val_loss: 0.2095 Epoch 33/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1864 - val_loss: 0.1972 Epoch 34/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1973 - val_loss: 0.2059 Epoch 35/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1790 - val_loss: 0.1989 Epoch 36/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1812 - val_loss: 0.1968 Epoch 37/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1894 - val_loss: 0.1968 Epoch 38/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1747 - val_loss: 0.1938 Epoch 39/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1823 - val_loss: 0.1863 Epoch 40/100 11/11 [==============================] - 3s 283ms/step - loss: 0.1760 - val_loss: 0.1866 Epoch 41/100 11/11 [==============================] - 3s 281ms/step - loss: 0.1796 - val_loss: 0.1852 Epoch 42/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1755 - val_loss: 0.1854 Epoch 43/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1672 - val_loss: 0.1826 Epoch 44/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1736 - val_loss: 0.1813 Epoch 45/100 11/11 [==============================] - 3s 281ms/step - loss: 0.1699 - val_loss: 0.1787 Epoch 46/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1625 - val_loss: 0.1784 Epoch 47/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1547 - val_loss: 0.1751 Epoch 48/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1575 - val_loss: 0.1700 Epoch 49/100 11/11 [==============================] - 3s 281ms/step - loss: 0.1540 - val_loss: 0.1700 Epoch 50/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1532 - val_loss: 0.1638 Epoch 51/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1604 - val_loss: 0.1639 Epoch 52/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1498 - val_loss: 0.1574 Epoch 53/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1477 - val_loss: 0.1588 Epoch 54/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1529 - val_loss: 0.1632 Epoch 55/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1479 - val_loss: 0.1465 Epoch 56/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1482 - val_loss: 0.1425 Epoch 57/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1424 - val_loss: 0.1490 Epoch 58/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1495 - val_loss: 0.1426 Epoch 59/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1472 - val_loss: 0.1400 Epoch 60/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1423 - val_loss: 0.1371 Epoch 61/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1443 - val_loss: 0.1375 Epoch 62/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1391 - val_loss: 0.1337 Epoch 63/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1383 - val_loss: 0.1387 Epoch 64/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1378 - val_loss: 0.1345 Epoch 65/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1371 - val_loss: 0.1349 Epoch 66/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1397 - val_loss: 0.1350 Epoch 67/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1407 - val_loss: 0.1278 Epoch 68/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1363 - val_loss: 0.1247 Epoch 69/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1315 - val_loss: 0.1307 Epoch 70/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1269 - val_loss: 0.1475 Epoch 71/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1359 - val_loss: 0.1284 Epoch 72/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1332 - val_loss: 0.1260 Epoch 73/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1280 - val_loss: 0.1249 Epoch 74/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1276 - val_loss: 0.1217 Epoch 75/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1285 - val_loss: 0.1199 Epoch 76/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1250 - val_loss: 0.1208 Epoch 77/100 11/11 [==============================] - 3s 281ms/step - loss: 0.1249 - val_loss: 0.1369 Epoch 78/100 11/11 [==============================] - 3s 281ms/step - loss: 0.1281 - val_loss: 0.1291 Epoch 79/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1219 - val_loss: 0.1176 Epoch 80/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1208 - val_loss: 0.1223 Epoch 81/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1176 - val_loss: 0.1163 Epoch 82/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1191 - val_loss: 0.1120 Epoch 83/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1195 - val_loss: 0.1099 Epoch 84/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1154 - val_loss: 0.1239 Epoch 85/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1139 - val_loss: 0.1157 Epoch 86/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1127 - val_loss: 0.1090 Epoch 87/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1109 - val_loss: 0.1128 Epoch 88/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1077 - val_loss: 0.1108 Epoch 89/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1094 - val_loss: 0.1043 Epoch 90/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1052 - val_loss: 0.1034 Epoch 91/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1200 - val_loss: 0.1050 Epoch 92/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1042 - val_loss: 0.1074 Epoch 93/100 11/11 [==============================] - 3s 279ms/step - loss: 0.1051 - val_loss: 0.1124 Epoch 94/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1071 - val_loss: 0.1065 Epoch 95/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1094 - val_loss: 0.1014 Epoch 96/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1031 - val_loss: 0.1110 Epoch 97/100 11/11 [==============================] - 3s 280ms/step - loss: 0.1017 - val_loss: 0.1060 Epoch 98/100 11/11 [==============================] - 3s 280ms/step - loss: 0.0974 - val_loss: 0.1054 Epoch 99/100 11/11 [==============================] - 3s 280ms/step - loss: 0.0971 - val_loss: 0.1054 Epoch 100/100 11/11 [==============================] - 3s 280ms/step - loss: 0.0968 - val_loss: 0.1048
In [40]:
def get_output(model, preproc, image_path, output_path):
origin_img = imread(image_path)
data = {"image":origin_img}
processed = preproc(**data)
output = model(np.expand_dims(processed["image"]/255,axis=0))
output = (output[0].numpy()>0.5).astype(np.uint8).squeeze(-1)*255 #0.5라는 threshold를 변경하면 도로인식 결과범위가 달라집니다.
output = Image.fromarray(output)
background = Image.fromarray(origin_img).convert('RGBA')
output = output.resize((origin_img.shape[1], origin_img.shape[0])).convert('RGBA')
output = Image.blend(background, output, alpha=0.5)
output.show()
return output
# 완성한 뒤에는 시각화한 결과를 눈으로 확인해봅시다!
i = 2 # i값을 바꾸면 테스트용 파일이 달라집니다.
get_output(
unet,
test_preproc,
image_path=dir_path + f'/image_2/00{str(i).zfill(4)}_10.png',
output_path=dir_path + f'./result_{str(i).zfill(3)}.png'
)
Out[40]:
In [41]:
# 완성한 뒤에는 시각화한 결과를 눈으로 확인해봅시다!
i = 2 # i값을 바꾸면 테스트용 파일이 달라집니다.
get_output(
unet_pp,
test_preproc,
image_path=dir_path + f'/image_2/00{str(i).zfill(4)}_10.png',
output_path=dir_path + f'./result_{str(i).zfill(3)}.png'
)
Out[41]:
In [42]:
def get_output(model, preproc, image_path, output_path, label_path):
origin_img = imread(image_path)
data = {"image":origin_img}
processed = preproc(**data)
output = model(np.expand_dims(processed["image"]/255,axis=0))
output = (output[0].numpy()>=0.5).astype(np.uint8).squeeze(-1)*255 #0.5라는 threshold를 변경하면 도로인식 결과범위가 달라집니다.
prediction = output/255 # 도로로 판단한 영역
output = Image.fromarray(output)
background = Image.fromarray(origin_img).convert('RGBA')
output = output.resize((origin_img.shape[1], origin_img.shape[0])).convert('RGBA')
output = Image.blend(background, output, alpha=0.5)
output.show() # 도로로 판단한 영역을 시각화!
if label_path:
label_img = imread(label_path)
label_data = {"image":label_img}
label_processed = preproc(**label_data)
label_processed = label_processed["image"]
target = (label_processed == 7).astype(np.uint8)*1 # 라벨에서 도로로 기재된 영역
return output, prediction, target
else:
return output, prediction, _
In [43]:
def calculate_iou_score(target, prediction):
intersection = np.logical_and(target, prediction)
union = np.logical_or(target, prediction)
iou_score = float(np.sum(intersection)) / float(np.sum(union))
print('IoU : %f' % iou_score )
return iou_score
In [44]:
# 완성한 뒤에는 시각화한 결과를 눈으로 확인해봅시다!
i = 2 # i값을 바꾸면 테스트용 파일이 달라집니다.
output, prediction, target = get_output(
unet_pp,
test_preproc,
image_path=dir_path + f'/image_2/00{str(i).zfill(4)}_10.png',
output_path=dir_path + f'./result_{str(i).zfill(3)}.png',
label_path=dir_path + f'/semantic/00{str(i).zfill(4)}_10.png'
)
calculate_iou_score(target, prediction)
IoU : 0.674780
Out[44]:
0.674779843444227
정리¶
- 시각화로 보았을때 U-Net은 자전거를 인식하지못하고 도로로 인식한 반면, U-Net++는 자전거를 인식한 모습을 볼 수 있습니다.
- IoU 수치로 비교해보았을 땐, 1번 파일비교시 U-Net++가 0.12, 2번파일 비교시 0.05정도 성능이 좋아짐을 확인할 수 있었습니다.
'Going Deeper' 카테고리의 다른 글
OCR의 개요 (0) | 2021.04.24 |
---|---|
CAM, Grad-CAM (0) | 2021.04.20 |
Segmentation (0) | 2021.04.15 |
RetinaNet으로 자율주행 시스템 만들기 (0) | 2021.04.13 |
Object detection (0) | 2021.04.12 |