이전 포스팅에서 TF2에서 새로 작성된 코드의 네트워크 구조가 이해가 되지 않아, 원문 DeepFloorplan의 net.py의 코드를 최신화하여, TF2DeepFloorPlan에서 사용할 수 있도록 호환성 작업을 해보았다. 논문에서 원작자가 의도한 모델의 구조를 직관적으로 이해할 수 있다. 아래는, 모델의 전체 구조를 간략히 설명해본다.
model
초기화. * 모델 구조는 Keras 에서 권장하는 함수형 API (Functional API) 를 따른다.
model = deepfloorplanModel(config=config)
초기화 시, Input → 인코더→ 디코더 의 모델의 모든 레이어가 구축된다. 각 레이어는 종속 함수에 의해 필요한 레이어를 구축한다.
build_f_net
: VGG-16 기반의 엔코더 레이어
build_cw_net
: Room Boundary을 예측하는 디코더 레이어.
build_r_net
: Room Type을 예측하는 디코더 레이어. 아래는 r_net의 일부를 발췌한것으로, 내부 context feature 계산을 위해 *non_local_context
함수에서 수행한다. 해당 함수에서는 cw_net 레이어의 각 디코더 단의 출력 (context_module)을 가지고 attention weight를 생성하여 room type 예측에 도움을 준다.
def build_r_net(self, pools, cw):
# Room Types (Decoder)
pool1, pool2, pool3, pool4, pool5 = pools
up2_cw, up4_cw, up8_cw, up16_cw = cw
up2 = (_upconv2d(pool5, dim=256, act = 'linear', name= 'up2_1r') +
_conv2d(pool4, dim=256, act='linear', name='pool4_r'))
up2 = _conv2d(up2, dim=256, act = 'relu', name='up2_2r')
up2, _ = _non_local_context(up2_cw, up2, name='context_up2')
출력은 다중 출력으로, Room Boundary를 예측하는 logits_cw
, logits_r
을 출력을 가지는 deep_net
을 생성한다.
class deepfloorplanModel(Model):
def __init__(self, config: argparse.Namespace = None, dtype=tf.float32, input_shape=[512,512,3]):
super(deepfloorplanModel, self).__init__()
inputs = layers.Input(shape=input_shape, name='input_layer')
# Build Models
pools: List[tf.Tensor] = self.build_f_net(inputs)
cw: List[tf.Tensor] = self.build_cw_net(pools)
up16_cw, up16_r = self.build_r_net(pools, cw)
# Compute Logits
logits_cw = _up_bilinear(up16_cw, dim=3, shape=(512,512), name='logits_cw')
logits_r = _up_bilinear(up16_r, dim=9, shape=(512,512), name='logits_r')
logits = [logits_cw, logits_r]
# Create Models
self.deep_net = Model(inputs=inputs, outputs=logits, name="DEEP_NET")
def build_f_net(self, inputs) -> List[tf.Tensor]:
# Feature Extraction (Encoder)
def build_cw_net(self, pools):
# Room Boundary (Decoder)
...
def build_r_net(self, pools, cw):
# Room Types (Decoder)
...
def call(self, inputs: tf.Tensor):
# predict logits
return self.deep_net(inputs)
해당 모델의 입력으로 입력 이미지를 전달하면, call 함수가 호출되고 logits_cw 와 logits_r 을 얻을 수있다.
# img는 텐서 이미지임.
logits_cw, logits_r = model(img)
해당 네트워크를 그대로 사용하면 기존 TF2모델에서 사용한 코드와 호환하며, 결과도 동일한 결과를 보여주는걸 확인했다.
연구를 깊이 이해하기 위해, 먼저 참조한 논문의 코드를 구현하여 시작했다. 해당 논문은 VGG-16의 인코더와 디코더를 사용하여 건축 도면 데이터의 특징을 학습하고, 이를 바탕으로 방의 경계(예: Room Boundary)와 방의 형태(예: Room Type)를 분류하는 방법을 제시했다.
이제는 대략적인 코드 분석은 완료된 것 같고, 본격적으로 내 도메인에 맞추어 연구 논문 작성을 위한 개발을 진행할 예정이다.
연구를 진행하는 전체적인 프로세스는 다음과 같다:
연구의 분류 대상은 다음과 같다:
이에 따라, 연구는 도면 데이터(PNG 또는 JPG 형식)의 특징을 인코더(Encoder)를 통해 추출하고, 디코더(Decoder)를 통해 실내 자율 주행 로봇에 적합한 주행 지도를 생성할 수 있는 모델을 개발하는 것이다.