
     h                         d dl mZ d dlmZ d dlZd dlmZ d dlmZ d dl	Z
d dlmZ  G d de      Z G d d	ej                        Zdd
Zy)    )	rearrange)ListN)postprocess)DPTOutputAdapterc                   L     e Zd ZdZd fd	Zddeej                     fdZ xZ	S )DPTOutputAdapter_fixz}
    Adapt croco's DPTOutputAdapter implementation for dust3r:
    remove duplicated weigths, and fix forward for dust3r
    c                 4    t         |   |       | `| `| `| `y N)superinitact_1_postprocessact_2_postprocessact_3_postprocessact_4_postprocess)selfdim_tokens_enc	__class__s     C/home/cameronsmith/repos/controll3r/dust3r/dust3r/heads/dpt_head.pyr   zDPTOutputAdapter_fix.init   s'    ^$""""    encoder_tokensc           	         | j                   J d       || j                  n|}|\  }}|| j                  | j                  z  z  }|| j                  | j                  z  z  }| j
                  D cg c]  }||   	 }}|D 	cg c]  }	| j                  |	       }}	|D 	cg c]  }	t        |	d||       }}	t        |      D 
	cg c]  \  }
}	 | j                  |
   |	       }}
}	t        |      D 
	cg c]$  \  }
}	 | j                  j                  |
   |	      & }}
}	| j                  j                  |d         d d d d d |d   j                  d   d |d   j                  d   f   }| j                  j                  ||d         }| j                  j                  ||d         }| j                  j!                  ||d         }| j#                  |      }|S c c}w c c}	w c c}	w c c}	}
w c c}	}
w )Nz0Need to call init(dim_tokens_enc) function firstzb (nh nw) c -> b c nh nw)nhnw         r   )r   
image_sizestride_levelP_HP_Whooksadapt_tokensr   	enumerateact_postprocessscratchlayer_rn
refinenet4shape
refinenet3
refinenet2
refinenet1head)r   r   r   HWN_HN_Whooklayerslidxpath_4path_3path_2path_1outs                   r   forwardzDPTOutputAdapter_fix.forward"   s   "".b0bb(2(:T__

1D%%01D%%01 48::>4.&>> 1771$##A&77 U[[q)A9ccJ[[=Fv=NO63+$&&s+A.OO>G>OPFC,$,,'',Q/PP ((3Aq:M6!9??1;M:MObPVWXPYP_P_`aPbOb4bc((;((;((; ii
+ ? 8 \OPs   /GG#G(G-5)G3)i   r
   )
__name__
__module____qualname____doc__r   r   torchTensorr:   __classcell__r   s   @r   r   r      s"    
#d5<<&8 r   r   c            	       <     e Zd ZdZddddddddd fd
Zd Z xZS )PixelwiseTaskWithDPTzH DPT module for dust3r, can return 3D points + confidence for all pixelsr   Nr   )n_cls_token	hooks_idx
dim_tokensoutput_width_rationum_channelsr   
depth_mode	conf_modec                &   t         t        |           d| _        || _        || _        || _        |dk(  sJ d       t        d||d|	}
||
j                  |       t        di |
| _
        |i nd|i} | j                  j                  di | y )NTr   zNot implemented)rH   rI   )r!   r    )r   rD   __init__return_all_layersr   rJ   rK   dictupdater   dptr   )r   rE   rF   rG   rH   rI   r   rJ   rK   kwargsdpt_argsdpt_init_argsr   s               r   rN   zPixelwiseTaskWithDPT.__init__G   s    "D24!%&$"a2!22 "+=%1" "  OO)O,'3(3(07G6T&&r   c                     | j                  ||d   |d   f      }| j                  r'| j                  || j                  | j                        }|S )Nr   r   )r   )rR   r   rJ   rK   )r   ximg_infor9   s       r   r:   zPixelwiseTaskWithDPT.forwardY   sK    hhqhqk8A;%?h@""3HC
r   )r;   r<   r=   r>   rN   r:   rA   rB   s   @r   rD   rD   D   s$    R&'4D$%A4TXdh'$r   rD   c                    | j                   dkD  sJ | j                   }d}|dz  }d}| j                  }| j                  }t        ||z   ||d|dz  dz  |dz  dz  |g||||gt        | j
                  | j                  d	      S )	z:
    return PixelwiseTaskWithDPT for given net params
    	      r   r   r      
regression)	rI   feature_dimlast_dimrF   rG   r   rJ   rK   	head_type)	dec_depthenc_embed_dimdec_embed_dimrD   r   rJ   rK   )nethas_confl2r^   r_   	out_nchaneddds           r   create_dpt_headrj   `   s     ==1	BKA~HI			B			BY-A,7)1+,bdAgr!tQw*C,.B+;,7+.>>*---*68 8r   )F)einopsr   typingr   r?   torch.nnnndust3r.heads.postprocessr   dust3r.utils.path_to_crocodust3rmodels.dpt_blockr   r   ModulerD   rj   rM   r   r   <module>rt      s?        0 ! --+ -`299 88r   