Keras:Unet 네트워크 는 여러 가지 의미 분할 방식 을 실현 합 니 다.
U-Net 은 처음에는 의학 적 이미지 에 대한 의미 분할 용 으로 사 용 됐 으 나,나중 에는 다른 분야 에 적용 하 는 사람 도 있 었 다.그러나 대부분 은 두 가지 분 류 를 하 는 데 사용 되 고 원시 이미 지 를 두 개의 그 레이스 케 일 급 이나 색도 로 나 누 어 이미지 에서 관심 이 있 는 목표 부분 을 순서대로 찾 을 것 이다.
본 고 는 주로 U-Net 네트워크 구 조 를 이용 하여 여러 가지 의미 분할 을 실현 하고 일부 테스트 효 과 를 보 여 주 었 으 니 유용 하 기 를 바 랍 니 다!
2 소스 코드
(1)훈련 모델
from __future__ import print_function
import os
import datetime
import numpy as np
from keras.models import Model
from keras.layers import Input, concatenate, Conv2D, MaxPooling2D, Conv2DTranspose, AveragePooling2D, Dropout, \
BatchNormalization
from keras.optimizers import Adam
from keras.layers.convolutional import UpSampling2D, Conv2D
from keras.callbacks import ModelCheckpoint
from keras import backend as K
from keras.layers.advanced_activations import LeakyReLU, ReLU
import cv2
PIXEL = 512 #set your image size
BATCH_SIZE = 5
lr = 0.001
EPOCH = 100
X_CHANNEL = 3 # training images channel
Y_CHANNEL = 1 # label iamges channel
X_NUM = 422 # your traning data number
pathX = 'I:\\Pascal VOC Dataset\\train1\\images\\' #change your file path
pathY = 'I:\\Pascal VOC Dataset\\train1\\SegmentationObject\\' #change your file path
#data processing
def generator(pathX, pathY,BATCH_SIZE):
while 1:
X_train_files = os.listdir(pathX)
Y_train_files = os.listdir(pathY)
a = (np.arange(1, X_NUM))
X = []
Y = []
for i in range(BATCH_SIZE):
index = np.random.choice(a)
# print(index)
img = cv2.imread(pathX + X_train_files[index], 1)
img = np.array(img).reshape(PIXEL, PIXEL, X_CHANNEL)
X.append(img)
img1 = cv2.imread(pathY + Y_train_files[index], 1)
img1 = np.array(img1).reshape(PIXEL, PIXEL, Y_CHANNEL)
Y.append(img1)
X = np.array(X)
Y = np.array(Y)
yield X, Y
#creat unet network
inputs = Input((PIXEL, PIXEL, 3))
conv1 = Conv2D(8, 3, activation='relu', padding='same', kernel_initializer='he_normal')(inputs)
pool1 = AveragePooling2D(pool_size=(2, 2))(conv1) # 16
conv2 = BatchNormalization(momentum=0.99)(pool1)
conv2 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv2)
conv2 = BatchNormalization(momentum=0.99)(conv2)
conv2 = Conv2D(64, 1, activation='relu', padding='same', kernel_initializer='he_normal')(conv2)
conv2 = Dropout(0.02)(conv2)
pool2 = AveragePooling2D(pool_size=(2, 2))(conv2) # 8
conv3 = BatchNormalization(momentum=0.99)(pool2)
conv3 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv3)
conv3 = BatchNormalization(momentum=0.99)(conv3)
conv3 = Conv2D(128, 1, activation='relu', padding='same', kernel_initializer='he_normal')(conv3)
conv3 = Dropout(0.02)(conv3)
pool3 = AveragePooling2D(pool_size=(2, 2))(conv3) # 4
conv4 = BatchNormalization(momentum=0.99)(pool3)
conv4 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv4)
conv4 = BatchNormalization(momentum=0.99)(conv4)
conv4 = Conv2D(256, 1, activation='relu', padding='same', kernel_initializer='he_normal')(conv4)
conv4 = Dropout(0.02)(conv4)
pool4 = AveragePooling2D(pool_size=(2, 2))(conv4)
conv5 = BatchNormalization(momentum=0.99)(pool4)
conv5 = Conv2D(512, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv5)
conv5 = BatchNormalization(momentum=0.99)(conv5)
conv5 = Conv2D(512, 1, activation='relu', padding='same', kernel_initializer='he_normal')(conv5)
conv5 = Dropout(0.02)(conv5)
pool4 = AveragePooling2D(pool_size=(2, 2))(conv4)
# conv5 = Conv2D(35, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv4)
# drop4 = Dropout(0.02)(conv5)
pool4 = AveragePooling2D(pool_size=(2, 2))(pool3) # 2
pool5 = AveragePooling2D(pool_size=(2, 2))(pool4) # 1
conv6 = BatchNormalization(momentum=0.99)(pool5)
conv6 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv6)
conv7 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv6)
up7 = (UpSampling2D(size=(2, 2))(conv7)) # 2
conv7 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(up7)
merge7 = concatenate([pool4, conv7], axis=3)
conv8 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(merge7)
up8 = (UpSampling2D(size=(2, 2))(conv8)) # 4
conv8 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(up8)
merge8 = concatenate([pool3, conv8], axis=3)
conv9 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(merge8)
up9 = (UpSampling2D(size=(2, 2))(conv9)) # 8
conv9 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(up9)
merge9 = concatenate([pool2, conv9], axis=3)
conv10 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(merge9)
up10 = (UpSampling2D(size=(2, 2))(conv10)) # 16
conv10 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(up10)
conv11 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv10)
up11 = (UpSampling2D(size=(2, 2))(conv11)) # 32
conv11 = Conv2D(8, 3, activation='relu', padding='same', kernel_initializer='he_normal')(up11)
# conv12 = Conv2D(3, 1, activation='relu', padding='same', kernel_initializer='he_normal')(conv11)
conv12 = Conv2D(3, 1, activation='relu', padding='same', kernel_initializer='he_normal')(conv11)
model = Model(input=inputs, output=conv12)
print(model.summary())
model.compile(optimizer=Adam(lr=1e-3), loss='mse', metrics=['accuracy'])
history = model.fit_generator(generator(pathX, pathY,BATCH_SIZE),
steps_per_epoch=600, nb_epoch=EPOCH)
end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
#save your training model
model.save(r'V1_828.h5')
#save your loss data
mse = np.array((history.history['loss']))
np.save(r'V1_828.npy', mse)
(2)테스트 모델
from keras.models import load_model
import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
model = load_model('V1_828.h5')
test_images_path = 'I:\\Pascal VOC Dataset\\test\\test_images\\'
test_gt_path = 'I:\\Pascal VOC Dataset\\test\\SegmentationObject\\'
pre_path = 'I:\\Pascal VOC Dataset\\test\\pre\\'
X = []
for info in os.listdir(test_images_path):
A = cv2.imread(test_images_path + info)
X.append(A)
# i += 1
X = np.array(X)
print(X.shape)
Y = model.predict(X)
groudtruth = []
for info in os.listdir(test_gt_path):
A = cv2.imread(test_gt_path + info)
groudtruth.append(A)
groudtruth = np.array(groudtruth)
i = 0
for info in os.listdir(test_images_path):
cv2.imwrite(pre_path + info,Y[i])
i += 1
a = range(10)
n = np.random.choice(a)
cv2.imwrite('prediction.png',Y[n])
cv2.imwrite('groudtruth.png',groudtruth[n])
fig, axs = plt.subplots(1, 3)
# cnt = 1
# for j in range(1):
axs[0].imshow(np.abs(X[n]))
axs[0].axis('off')
axs[1].imshow(np.abs(Y[n]))
axs[1].axis('off')
axs[2].imshow(np.abs(groudtruth[n]))
axs[2].axis('off')
# cnt += 1
fig.savefig("imagestest.png")
plt.close()
3 효과 전시설명:왼쪽 에서 오른쪽으로 그림 을 예측 하고 실제 그림 을 표시 합 니 다.이 를 통 해 알 수 있 듯 이 일부 데이터 의 분할 효 과 는 아직도 개선 되 어야 한다.주요 원인 은 데이터 세트 가 상대 적 으로 복잡 하고 모델 은 그 중의 규칙 을 찾기 어렵다.
이상 의 Keras:Unet 네트워크 에서 여러 가지 의미 분할 방식 을 실현 하 는 것 은 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
UNet에서 뇌종양을 검출해 보았다 (colab 환경)이번에는 Semantic Segmentation의 UNet을 뇌의 MRI 화상의 데이터 세트를 학습시켜 가시화까지 실시했습니다. kagge에서 공개된 뇌의 MRI 데이터 세트( )를 사용했습니다. 2014년에 발표된...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.