a *f @s ddlZddlZddlmZddlmZmZmZm Z ddl Z ddl Z ddl m Z ddlmZddlmZddlmZdd lmZdd lmZd d lmZmZmZd d lmZeee jdddZ GdddZ!eeeeeeej"fdddZ#Gddde!Z$dS)N) lru_cache)DictListOptionalTuple) PathManager)build_densepose_embedder)!get_closest_vertices_mask_from_ES)get_class_to_mesh_name_mapping)!DensePoseEmbeddingPredictorOutput) create_mesh)BoxesImageMatrixVisualizerget_texture_atlas) mesh_namedevicecCs|dkrXtd}tj|dd\}}t|dddf}||8}||}n8t ||}|j j dd}||8}||}|d}|S) N smpl_27554z?https://dl.fbaipublicfiles.com/densepose/data/cse/mds_d=256.npyT) allow_picklerr)dimr ) rget_local_pathnploadtorchtensorfloatminmaxr verticessum)rrZ embed_path embed_map_meshr&S/data1/chongzheng_p23/Projects/CatVTON-hf/densepose/vis/densepose_outputs_vertex.pyget_xyz_vertex_embeddings    r(c@sVeZdZdejdddfddZeeee ee ee e feddd Z d d Zd S) DensePoseOutputsVertexVisualizerTgffffff?cudarc sVt||d|d_t|_t|_t|_|_fddj D_ dS)Ng?)inplacecmap val_scalealphacs,i|]$}j|r||jqSr&)embedderhas_embeddingstor.0rselfr&r' =s z=DensePoseOutputsVertexVisualizer.__init__..) rmask_visualizerr class_to_mesh_namerr/rr default_classvaluesmesh_vertex_embeddings)r5cfgr+r,r.rr9kwargsr&r4r'__init__+s     z)DensePoseOutputsVertexVisualizer.__init__ image_bgroutputs_boxes_xywh_classesreturnc Cs|ddur|S||\}}}}}t|D]}||\} } } } |j||} t||g||g| | |j| |j\}}t| |j}|| ddd }| j t jd}|j|||| | | | g}q,|S)Nrro@)dtype)#extract_and_check_outputs_and_boxesrangeinttolistr8r r;rr(clipcpunumpyastyperuint8r7 visualize)r5r@rASEN bboxes_xywh pred_classesnxywhrclosest_verticesmaskr#visZ mask_numpyr&r&r'rNCs*   z*DensePoseOutputsVertexVisualizer.visualizecCs|\}}}|dur"|jgt|}t|ts>Jdt||j}|j}|d}||dkszJd|||t|ksJdt|||t|ksJdt|||||||fS)Nz:DensePoseEmbeddingPredictorOutput expected, {} encounteredrzECSE coarse_segm {} and embeddings {} should have equal first dim sizezKnumber of bounding boxes {} should be equal to first dim size of outputs {}zNnumber of predicted classes {} should be equal to first dim size of outputs {}) r9len isinstancer formattype coarse_segm embeddingsize)r5rAdensepose_outputrRrSrOrPrQr&r&r'rEcsB   zDDensePoseOutputsVertexVisualizer.extract_and_check_outputs_and_boxesN)__name__ __module__ __qualname__cv2 COLORMAP_JETr>rrrr rrrGrNrEr&r&r&r'r)*s  r))json_strrBcCs(|dur dSt|}dd|DS)z] json_str is a JSON string representing a mesh_name -> texture_atlas_path dictionary NcSsi|]\}}|t|qSr&r)r3rpathr&r&r'r6z'get_texture_atlases..)jsonloadsitems)ripathsr&r&r'get_texture_atlasess rpc@sJeZdZd ddZeeeeeeee e fedddZ dd Z d S) !DensePoseOutputsTextureVisualizerr*rc st|_i_i_|D]}||jddkr~||dddddfdj|<||ddddddfj|<q||jdddkj|<||j|<qt|_t |_ |_ fddj D_ dS) NrC)axisrcs i|]}||jqSr&)r/r1rr2r4r&r'r6sz>DensePoseOutputsTextureVisualizer.__init__..)rr/texture_image_dict alpha_dictkeysshaper"rrr r8r9r:r;)r5r<texture_atlases_dictrr9r=rr&r4r'r>s  $&   z*DensePoseOutputsTextureVisualizer.__init__r?c s8|}|ddur|S|\}}}}}fddt|D} t|D]} || \} } } }j|| }t || g|| g|| j |j \}}| || j | d}|dd}|| | || | | f||j|| }|durqL||| | || | | f<qL|S)Nrcs i|]}|tj|jqSr&)r r8r)r3pr4r&r'r6sz?DensePoseOutputsTextureVisualizer.visualize..)r rrr)copyrEruniquerFrGrJrKr8r r;r texcoordspermuterIgenerate_image_with_texture)r5r@rAimage_target_bgrrOrPrQrRrSmeshesrTrUrVrWrXrrYrZuv_arrayZtextured_imager&r4r'rNs@      z+DensePoseOutputsTextureVisualizer.visualizecCs|j|}|j|}|dus(|dur,dS|\}}||jdt} ||jdt} || | f|} t|| | f|d} |} | |d| | | | |<| tj S)Nrrrr) rwgetrvryrLrGr expand_dimsr|rM)r5Zbbox_image_bgrrrZrr.Z texture_imageUVZx_indexZy_indexZ local_textureZ local_alphaZ output_imager&r&r'rs  z=DensePoseOutputsTextureVisualizer.generate_image_with_textureN)r*r) rdrerfr>rrrr rrrGrNrr&r&r&r'rqs  ,rq)%rlrKr functoolsrtypingrrrrrgrdetectron2.utils.file_iordensepose.modelingrZdensepose.modeling.cse.utilsr Z data.utilsr structuresr Zstructures.meshr baserrrZdensepose_results_texturesrstrrr(r)ndarrayrprqr&r&r&r's$        [&