a ne@sddlZddlZddlZddlmZddlmZddlZddlm Z ddl m Z ddl m Z ddlmZdd lmZGd d d eZe ee jd d dZGddde jZdS)N)Enum)Optional)nn)CfgNode) PathManager)VertexDirectEmbedder)VertexFeatureEmbedderc@seZdZdZdZdZdS) EmbedderTypez Embedder type which defines how vertices are mapped into the embedding space: - "vertex_direct": direct vertex embedding - "vertex_feature": embedding vertex features Z vertex_directZvertex_featureN)__name__ __module__ __qualname____doc__ VERTEX_DIRECTVERTEX_FEATURErrO/home/alin0222/detectron2/projects/DensePose/densepose/modeling/cse/embedder.pyr sr ) embedder_spec embedder_dimreturncCst|j}|tjkr:t|j|d}|jdkr||jnF|tjkrrt|j|j ||j d}|jdkr||jnt d||j s| d|S)aG Create an embedder based on the provided configuration Args: embedder_spec (CfgNode): embedder configuration embedder_dim (int): embedding space dimensionality Return: An embedder instance for the specified configuration Raises ValueError, in case of unexpected embedder type ) num_vertices embed_dim)r feature_dimrtrain_featureszUnexpected embedder type F)r TYPErrZ NUM_VERTICESZ INIT_FILEloadrr Z FEATURE_DIMZFEATURES_TRAINABLE ValueErrorZ IS_TRAINABLErequires_grad_)rrZ embedder_typeembedderrrrcreate_embedders*      r csbeZdZdZdZedfdd Zdeeeddd Z ee j d d d Z ee d d dZZS)Embedderz Embedder module that serves as a container for embedders to use with different meshes. Extends Module to automatically save / load state dict. zroi_heads.embedder.)cfgcstt|t|_|jjjj}t t }|jjjj D]B\}}|d|d||d|t|||j|q<|jjdkr||jjdS)z Initialize mesh embedders. An embedder for mesh `i` is stored in a submodule "embedder_{i}". Args: cfg (CfgNode): configuration options zAdding embedder embedder_z with spec embedder_rN)superr!__init__set mesh_namesMODELROI_DENSEPOSE_HEADCSE EMBED_SIZElogging getLoggerr EMBEDDERSitemsinfo add_moduler addWEIGHTSload_from_model_checkpoint)selfr"rlogger mesh_namer __class__rrr%Js   zEmbedder.__init__N)fpathprefixcCs|durtj}d}|drXt|d}tj|dd}Wdq1sL0Yn@t|d$}tj|tdd}Wdn1s0Y|dur d|vr i}|dD]D}| |r|d|}t |t j rt |}|||t|d<q|j|dd dS) Nz.pklrblatin1)encodingcpu) map_locationmodelF)strict)r!DEFAULT_MODEL_CHECKPOINT_PREFIXendswithropenpicklertorchdevice startswith isinstancenpndarray from_numpylenload_state_dict)r5r:r; state_dicthFileZstate_dict_localkeyZv_keyrrrr4]s" .2     z#Embedder.load_from_model_checkpoint)r7rcCst|d|S)a Produce vertex embeddings for the specific mesh; vertex embeddings are a tensor of shape [N, D] where: N = number of vertices D = number of dimensions in the embedding space Args: mesh_name (str): name of a mesh for which to obtain vertex embeddings Return: Vertex embeddings, a tensor of shape [N, D] r#)getattrr5r7rrrforwardrs zEmbedder.forwardcCst|d|S)Nr#)hasattrrTrrrhas_embeddingsszEmbedder.has_embeddings)N)r r r rrCrr%strrr4rGTensorrUboolrW __classcell__rrr8rr!Bs  r!)r,numpyrKrFenumrtypingrrGrdetectron2.configrdetectron2.utils.file_iorvertex_direct_embedderrvertex_feature_embedderr r intModuler r!rrrrs        %