Deep Learning

[Paper] Discovering Design Concepts for CAD Sketches (3)

ju_young 2023. 5. 14. 23:31
728x90

4.2 Explicit concept structure generation

- Concept structure expansion

# https://github.com/yyuezhi/SketchConcept/blob/main/model.py
def structual_expansion(self,structual_selection_code):
    ##then process reference
    B,S1,E = structual_selection_code.shape
    expand_factor = self.max_abstruction
    structural_decoder_query = self.structual_expansion_FC(structual_selection_code) #[B,S1,L*E+A*E]
    structual_input_L0 = structural_decoder_query[:,:,:self.recon_dim * expand_factor].reshape(B,S1,expand_factor,self.recon_dim).flatten(1,2) #[B,S1,L*E+A*E] -> [B,S1,L*E] -> [B,S1,L,E] ->[B,S1*L,E]
    ref_arg_ptr_inscope_in = structural_decoder_query[:,:,self.recon_dim * expand_factor:self.recon_dim * (expand_factor + self.ref_in_argument_num)].reshape(B,S1,self.ref_in_argument_num,self.recon_dim)#[B,S1,L*E+A*E] -> [B,S1,A*E] ->[B,S1,A,E]
    ref_arg_ptr_inscope_out = structural_decoder_query[:,:,self.recon_dim * (expand_factor + self.ref_in_argument_num):].reshape(B,S1,self.ref_out_argument_num,self.recon_dim)#[B,S1,L*E+A*E] -> [B,S1,A*E] ->[B,S1,A,E]

    return (structual_input_L0,ref_arg_ptr_inscope_in,ref_arg_ptr_inscope_out)

이전의 Concept Detection에 이어서 MLP를 통해 composition matrix와 arguments를 얻는다.

# https://github.com/yyuezhi/SketchConcept/blob/main/model.py
def lower_layer_selection(self,structual_output,query_validity,validity_flag ,cad_embedding, mode_flag):
    structual_input_L0 = structual_output[0]

    structual_type_code = self.type_FC(structual_input_L0)
    library_code = torch.cat([getattr(cad_embedding.module,"Lower_library_embedding").weight.to(self.device), getattr(cad_embedding.module,"Lower_library_nontype").weight.to(self.device)],dim=0) # cat [S2,E] ,[1,E] ->[S2+1,E]   
    structual_probability_raw = torch.einsum('bie,je->bij', structual_type_code,library_code)  #[B,S0,E]X[B,L0,E]  ->[B,S0,L0] 
    structual_one_hot = F.gumbel_softmax(structual_probability_raw,dim=2,hard=True) #[B,S1,L0] where L0 dimnesion is one-hot dimension 
    structual_probability_temp = torch.softmax(structual_probability_raw,dim=2)
    structual_probability = torch.zeros_like(structual_probability_temp)

    return structual_probability,structual_one_hot
  • $L^0$ 타입 instance의 max number를 $k_{L^0}$(default 12)로 고정하고 inward argument와 outward argument로 나눈다. 각 arguement($k_{arg}$)는 default 2이다.
  • element가 없다는 것을 가리키기위해 null type에 대한 확률도 추가해주었는데 위 코드에서 "Lower_library_nontype"에 해당한다.
  • composition operator $R_{T^1}$의 shape은 $(2k_{L^0})+k_{arg}x(k_{L^0}+k_{arg})$이고 각 row는 constraint reference/inward argument, 각 column은 primitive/outward argument에 해당한다.
  • argument의 각 row는 discrete probability distribution(softmax)이고 i-th(row) constraint/outward arg는 j-th(column) primitive/inward arg를 참조한다.
  • concept code $q^{\prime}$는 $R_{T^1}$의 shape의 logit matrix에 매핑하고 각 row는 softmax를 적용한다.
  • 자기 자신을 참조하는 element와 같은 의미없는 것들을 없애기위해 diagnoal block을 마스킹하고 argument block에 해당하는 부분은 -$\inf$을 적용한다.

- Cross-concept composition

  • cross-concept composition operator $R_S$는 MLP를 통해 $q_R$을 매핑한 $(k_{qry} \cdot k_{qrg}) x (k_{qry} \cdot k_{arg})$ shape의 matrix $R_S$로 구현된다. 각 row는 discrete distribution(softmax) 이다
  • 최종 cross-concept reference는 다음과 같다.

Concept instantiation by parameter generation

  • 이전에 봤던 Fig.2에서 parameter generation network는 concept structure $T^1$을 받고 implicit instance encoding $q$도 input으로 받는다.
# https://github.com/yyuezhi/SketchConcept/blob/main/model.py
parameter_L0_input =  self.parameter_expansion(parameter_input) # expand instance code q
structural_embedding = cad_embedding.module.type_embedding(structual_index).reshape(B,structual_L0_one_hot.shape[1],-1)
parameter_decoder_input  = structural_embedding + parameter_L0_input
  • instance code q (Fig.2에서 $q_i$)는 MLP를 통해 expand되고 structural embedding이 더해진다.
# https://github.com/yyuezhi/SketchConcept/blob/main/model.py
parameter_decoder_output = self.parameter_decoder(tgt2, memory, memory_key_padding_mask=pad_mask, query_pos=parameter_decoder_input,pos=batch_posi)
parameter_decoder_output = parameter_decoder_output.transpose(0,1)
parameter_decoder_output = self.done_parameter_FC(parameter_decoder_output)
  • decoder_input은 transformer decoder를 통과하고 마지막으로 decoding layer(FC)를 통해 변환된다.
728x90