TF1 -> TF2 네트워크 호환 작업 ! 그리고 다음 단계로 !!

Yougurt_Man·2023년 12월 25일
0

프로젝트

목록 보기
5/6
post-thumbnail

이전 포스팅에서 TF2에서 새로 작성된 코드의 네트워크 구조가 이해가 되지 않아, 원문 DeepFloorplan의 net.py의 코드를 최신화하여, TF2DeepFloorPlan에서 사용할 수 있도록 호환성 작업을 해보았다. 논문에서 원작자가 의도한 모델의 구조를 직관적으로 이해할 수 있다. 아래는, 모델의 전체 구조를 간략히 설명해본다.

  1. model 초기화. * 모델 구조는 Keras 에서 권장하는 함수형 API (Functional API) 를 따른다.

    model = deepfloorplanModel(config=config)
  2. 초기화 시, Input → 인코더→ 디코더 의 모델의 모든 레이어가 구축된다. 각 레이어는 종속 함수에 의해 필요한 레이어를 구축한다.

    1. build_f_net: VGG-16 기반의 엔코더 레이어

    2. build_cw_net: Room Boundary을 예측하는 디코더 레이어.

    3. 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')
  3. 출력은 다중 출력으로, 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)
  4. 해당 모델의 입력으로 입력 이미지를 전달하면, call 함수가 호출되고 logits_cw 와 logits_r 을 얻을 수있다.

    # img는 텐서 이미지임. 
    logits_cw, logits_r = model(img)

해당 네트워크를 그대로 사용하면 기존 TF2모델에서 사용한 코드와 호환하며, 결과도 동일한 결과를 보여주는걸 확인했다.


추가

연구를 깊이 이해하기 위해, 먼저 참조한 논문의 코드를 구현하여 시작했다. 해당 논문은 VGG-16의 인코더와 디코더를 사용하여 건축 도면 데이터의 특징을 학습하고, 이를 바탕으로 방의 경계(예: Room Boundary)와 방의 형태(예: Room Type)를 분류하는 방법을 제시했다.

이제는 대략적인 코드 분석은 완료된 것 같고, 본격적으로 내 도메인에 맞추어 연구 논문 작성을 위한 개발을 진행할 예정이다.

연구를 진행하는 전체적인 프로세스는 다음과 같다:

  1. net.py: 모델의 아키텍처를 정의
  2. train.py: net.py를 바탕으로 모델 훈련을 수행
  3. data.py: 사용할 데이터셋 처리
  4. loss.py: 손실 함수 계산

연구의 분류 대상은 다음과 같다:

  • 방의 경계: 벽(Wall), 문(Door)
  • 방의 경계 외의 구조물: 복도(Aisle), 엘리베이터(Elevator)

이에 따라, 연구는 도면 데이터(PNG 또는 JPG 형식)의 특징을 인코더(Encoder)를 통해 추출하고, 디코더(Decoder)를 통해 실내 자율 주행 로봇에 적합한 주행 지도를 생성할 수 있는 모델을 개발하는 것이다.

profile
Greek Yogurt

0개의 댓글