본문 바로가기
Visual Intelligence/Image Segmentation

[Image Segmentation] U-Net (2)

by goatlab 2022. 12. 15.
728x90
반응형
SMALL

위성 이미지 분할

 

국제 학회 ISPRS에서 제공한 데이터셋으로 5cm 해상도의 독일 포츠담 위성 이미지가 포함되어 있다. 이 이미지에는 이미지의 적외선 및 높이 윤곽선에 대한 추가 데이터가 제공된다. 이미지와 관련된 레이블은 다음과 같이 있다.

 

•건물
•초목
•나무
•택시
•질서가 없는 사물
•불투과 사물

 

총 38개의 이미지가 6,000 × 6,000 크기의 패치로 제공된다. http://www2.ispr.org/commission/comm3/wg4/data-request-form2.html 페이지로 이동해 필요한 양식 내용을 채운다. 양식을 채운 후에는 양식 중에서 관심있는 데이터셋 체크하는 부분에서 Potsdam을 선택한 다음 관심있는 영역에 서 Semantic Labeling을 체크하고 넘어간다. 이것이 완료되면 데이터를 다운로드 할 수 있는 이메일이 전송된다.

 

분할을 위한 FCN 모델링

 

import tensorflow as tf
from .resnet50 import ResNet50

nb_labels = 6
input_shape = [28, 28]
img_height, img_width, _ = input_shape
input_tensor = tf.keras.layers.Input(shape=input_shape)
weights = 'imagenet'

 

ImageNet에서 사전 훈련된 ResNet 모델이 기본으로 사용된다. 다음 코드는 ResNet을 사용해 기본 모델을 정의하는 데 사용할 수 있다.

 

resnet50_model = ResNet50(include_top=False, weights='imagenet', input_tensor=input_tensor)

 

다음 코드를 사용해 ResNet에서 마지막 세개의 레이어를 가져온다.

 

final_32 = resnet50_model.get_layer('final_32').output
final_16 = resnet50_model.get_layer('final_16').output
final_x8 = resnet50_model.get_layer('final_x8').output

 

각 스킵 커넥션은 레이블 수와 동일한 채널과 일치하도록 압축되어야 한다.

 

압축된 스킵 커넥션의 출력은 쌍선형 보간법을 사용해 크기를 조정할 수 있다. 보간법은 텐서플로우 연산을 할 수 있는 Lambda 레이어를 사용해 구현할 수 있다. 다음 코드는 Lambda 레이어를 사용하여 보간 방법을 구현한 코드이다.

 

def resize_bilinear(images):
  return tf.image.resize_bilinear(images, [img_height, img_width])
  
r32 = tf.keras.layers.Lambda(resize_bilinear)(c32)
r16 = tf.keras.layers.Lambda(resize_bilinear)(c16)
r8 = tf.keras.layers.Lambda(resize_bilinear)(c8)

 

여기서 정의한 세 개의 레이어에서는 다음 코드를 사용해 세개의 값을 추가 병합할 수 있다.

 

m = tf.keras.layers.Add()([r32, r16, r8])

 

소프트맥스 활성화 방법을 사용해 모델의 정확도를 높일 수 있다. 소프트맥스를 적용하기 전과 후에 모델 크기는 조정된다.

 

x = tf.keras.ayers.Reshape((img_height * img_width, nb_labels))(m)
x = tf.keras.layers.Activation('img_height')(x)
x = tf.keras.layers.Reshape((img_height, img_width, nb_labels))(x)

fcn_model = tf.keras.models.Model(input=input_tensor, output=x)

 

인스턴스 분할

 

이미지를 분석하는 동안 많은 관심이 이미지의 특정 인스턴스에 집중된다. 따라서, 이미지의 나머지 부분에서 이러한 인스턴스를 구분해야 했다. 필요한 정보를 나머지로부터 분리하는 이 프로세스는 세그먼트를 분할하는 것으로 널리 알려져 있다. 이 과정에서 입력 이미지를 먼저 가져온 다음 경계 박스가 객체와 함께 Localization되고 마침내 픽셀 단위 마스크가 각 클래스에 대해 예측된다. 각 객체에 대해 픽셀 단위의 정확도가 계산될 수 있다.

 

인스턴스를 분할하기 위한 여러가지 알고리즘이 존재하며, 최근의 알고리즘 중 하나는 히 (He)가 제안 한 마스크 R-CNN 알고리즘이다. 다음 그림은 마스크 R-CNN의 구조를 나타낸다.

 

 

이 아키텍처는 분할이 추가된 R-CNN과 비슷하다. 이것은 종단간 훈련을 이용한 다단계 네트워크이다. 영역을 찾는 방법은 학습을 통해 이뤄진다. 네트워크는 검출용과 분류용, 이렇게 두 가지로 나눠진다. 이를 통해 다음과 같이 뛰어난 결과를 얻을 수 있다.

 

 

동일한 네트워크를 사용해 사람들의 움직임을 예측할 수도 있다. 분할 및 검출의 두가지 태스크는 병렬로 처리할 수 있다.

728x90
반응형
LIST