a *fx@@sddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z m Z mZddlmZddlZddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZm Z m!Z!m"Z"dd l#m$Z$dd l%m&Z&dd l'm(Z(m)Z)ddl*m+Z+ddl,m-Z-m.Z.m/Z/ddl0m1Z1m2Z2ddl3m4Z4ddl5m6Z6m7Z7m8Z8m9Z9m:Z:GdddeZ;ddZddZ?d)e@dd d!ZAd*e@dd"d#ZBe@dd$d%ZCeeDd&d'd(ZEdS)+N) OrderedDict)DictIterableListOptional)COCO)tabulate)CfgNode)MetadataCatalog)DatasetEvaluator)BoxMode)gatherget_rankis_main_process synchronize) PathManager)create_small_table)ToChartResultConverterToMaskConverter)'maybe_filter_and_map_categories_cocoapi)DensePoseChartPredictorOutput!DensePoseEmbeddingPredictorOutputquantize_densepose_chart_result)DensePoseCocoEvalDensePoseEvalMode)MeshAlignmentEvaluator)SingleProcessFileTensorStorageSingleProcessRamTensorStorageSingleProcessTensorStorageSizeDatastorage_gatherc@sxeZdZdeeeeeeeedddZ dd Z d d Z dd d Z dddZ ddZeeefeedddZdS)DensePoseCOCOEvaluatorNiuv?F)evaluator_typemin_iou_thresholdstorageshould_evaluate_mesh_alignmentmesh_alignment_mesh_namesc Cs||_||_||_||_||_||_|r8|dur8Jd|rHt|| |_t d|_ t t |_t||_||_t|jj} ttt| |_Wdn1s0Yt||jdS)NzHMesh alignment evaluation is activated, but no vertex embedder provided!cpu) _embedder _distributed _output_dirZ_evaluator_type_storage_should_evaluate_mesh_alignmentr_mesh_alignment_evaluatortorchdevice _cpu_devicelogging getLogger__name___loggerr get _metadata_min_thresholdrget_local_path json_file contextlibredirect_stdoutioStringIOr _coco_apir) self dataset_name distributedZ output_dirr%r&r'embedderr(r)r<rFK/data1/chongzheng_p23/Projects/CatVTON-hf/densepose/evaluation/evaluator.py__init__0s2    (zDensePoseCOCOEvaluator.__init__cCs g|_dSN) _predictions)rBrFrFrGresetVszDensePoseCOCOEvaluator.resetc Cst||D]\}}|d|j}|ds.q t||d|j|jj|jdu}|jdur|D]T}i}|jj D]} || || <ql|j |} | |d<t |d<|jj D] } || =qq\|j |q dS)a Args: inputs: the inputs to a COCO model (e.g., GeneralizedRCNN). It is a list of dict. Each dict corresponds to an image and contains keys like "height", "width", "file_name", "image_id". outputs: the outputs of a COCO model. It is a list of dicts with key "instances" that contains :class:`Instances`. The :class:`Instances` object needs to have `densepose` field. instancespred_denseposeimage_idN record_idrank)ziptor3hasprediction_to_dictr+r9class_to_mesh_namer.Z data_schemaputrrJextend) rBinputsoutputsinputoutputrLZprediction_listZprediction_dictZ dict_to_store field_namerOrFrFrGprocessYs,        zDensePoseCOCOEvaluator.processcCsb|jr&tt|j}ttj|}n|j}|jdur@t|jnd}t sNdSt | |||SrI) r,rr rJlist itertoolschainr.r!rcopydeepcopy_eval_predictions)rBimg_ids predictions multi_storagerFrFrGevaluatezs zDensePoseCOCOEvaluator.evaluatec Cs|jd|jrft|jtj|jd}t|d}t ||Wdn1s\0Y|jdt }t |j |||j|jd|j|d\}}} ||d<||d <| |d <|jr||d <|S) zj Evaluate predictions on densepose. Return results with the metrics of the tasks. z%Preparing results for COCO format ...zcoco_densepose_predictions.pthwbNzEvaluating predictions ... thing_classes) class_names min_thresholdrdZ densepose_gpsZdensepose_gpsmZdensepose_segmZdensepose_mesh_alignment)r7infor-rmkdirsospathjoinopenr1saver_evaluate_predictions_on_cocorAr+r9r8r:r/_evaluate_mesh_alignment) rBrerfrd file_pathfres results_gps results_gpsm results_segmrFrFrGrcs.  *    z(DensePoseCOCOEvaluator._eval_predictionsc Cs|jd|j\}}}|d|dd}t}|D]:}||D](\}}|d||d|<||qHq8||||S)NzMesh alignment evaluation ...d)GEGPS-)r7rlr0rgsetitemsadd_print_mesh_alignment_results) rBZmean_geZmean_gpsZper_mesh_metricsresults mesh_names metric_name mesh_namevaluerFrFrGrts  z/DensePoseCOCOEvaluator._evaluate_mesh_alignment)rrc Cs |jd|jdddddddddd |jd |D]n}d |}||vrd||d nd }d|}||vr||d nd }|jd|dd|dd|dd qB|jdd}||vr||d nd }d}||vr||d nd }|jdddd|dd|dd dS)Nz1Evaluation results for densepose, mesh alignment:z| MeshZ13sz | ZGErrZ7sr}z |z%| :-----------: | :-----: | :-----: |zGE-z.4f zGPS-z%| :-------------------------------: |r|MEAN)r7rl)rBrrrZge_keyZge_strZgps_keyZgps_strrFrFrGrs &   ( z4DensePoseCOCOEvaluator._print_mesh_alignment_results)Nr#r$NNFN)N)NN)r6 __module__ __qualname__strfloatrrboolrrHrKr]rgrcrtrrrrFrFrFrGr"/s( &!  r"c Cs|j}|j}t|jjtjtj }t |j t rJt ||||}n"t |j trl|sdt|}nt|}g} tt|D]8} ||| || || d} | i| || q|| S)z Args: instances (Instances): the output of the model img_id (str): the image id in COCO Returns: list[dict]: the results in densepose evaluation format )rN category_idbboxscore)scorestolist pred_classesr convert pred_boxestensorcloneXYXY_ABSXYWH_ABS isinstancerMr!densepose_cse_predictions_to_dictr#densepose_chart_predictions_to_dict+densepose_chart_predictions_to_storage_dictrangelenappend) rLimg_idrErU use_storagerclassesZraw_boxes_xywhZresults_denseposerkresultrFrFrGrTs,      rTcCst|j|j|j}g}tt|D]z}tt|j||j|}|j |_ |j |}t tj|tjdgd}|dd|d<||d}||q$|S)NF)dtype requirementscountszutf-8) densepose segmentation)rrrMr image_sizerrrrlabels_uv_uint8r*r mask_utilsencodenprequirenumpyuint8decoder)rLZ segmentationsrrZdensepose_results_quantizedrZsegmentation_encodedrrFrFrGrs(   rcCslg}tt|D]V}|j|}|jd|jd|jd|jdd}| |q|S)Nr coarse_segm fine_segmuv) rrrMrsqueezer*rrrr)rLrrdensepose_predictor_outputrrFrFrGrs  rcCsHg}tt|D]2}|j|}||jd|jddq|S)Nrr embedding)rrrMrrr*r)rLrErUrrrcserFrFrGrs   rr$)rkc Cstt}t|}t|dkr\|ddd|D} dd|D} dd|D} | | | fS||} g} dD]>}tt|}t || d|||d }t ||||||}| |qn| S) Nrz/No predictions from the model! Set scores to -1cSsi|] }|dqSrF.0metricrFrFrG 0z1_evaluate_predictions_on_coco..cSsi|] }|dqSrrFrrFrFrGr1rcSsi|] }|dqSrrFrrFrFrGr2r)r}ZGPSMZIOUr)Z dpEvalMode) r4r5r6_get_densepose_metricsrwarnZloadResgetattrrr_derive_results_from_coco_evalr)Zcoco_gtZ coco_resultsrfrErjrkrdloggerZdensepose_metricsrxryrzZcoco_dtreval_mode_nameZ eval_mode coco_evalrrFrFrGrs"s(         rscCsNdg}|dkr|dg7}|dkr*|dg7}|dkr<|dg7}|gd|S) NAPg|?5^?ZAP20g$C?ZAP30gDl?ZAP40) ZAP50ZAP75ZAPmZAPlARZAR50ZAR75ZARmZARl)rW)rkmetricsrFrFrGrDs   rcs|dur|j_tj|dttd|ddddj_ fddt |D}t t }|d|d t||dust|dkr|Sjd }t||jd ksJg} t |D]`\} } |dddd| d d f} | | d k} | jrt| ntd} | | t| dfqtdt| d ttj| tjfddtD}t|ddddgd dd}|d|d||dd| D|S)Ngffffff?g?rT)endpointcs$i|]\}}|tj|dqS)r{)rstats)ridxr)rrFrGr[rz2_derive_results_from_coco_eval..z"Evaluation results for densepose, z metric: precisionrrnanr{csg|]}|dqSrIrF)ri)n_colsresults_flattenrFrG vrz2_derive_results_from_coco_eval..pipez.3fcategoryrleft)tablefmtfloatfmtheadersnumalignz Per-category z AP: cSsi|]\}}d||qS)zAP-rF)rnameaprFrFrGrr)paramsZimgIdsrlinspaceintroundZiouThrsrg accumulate summarize enumerater4r5r6rlrrevalshapesizemeanrrminr^r_r` zip_longestrrupdate)rrrrjrkrdrrZ precisionsZresults_per_categoryrrrrZ results_2dtablerF)rrrrGrPsL     r)cfg output_folderc CsF|jj}|dkrdS|jj}|jjj}|jjj}|jjj}|dkr|jjjd}td|||fdtd|||fdtd|||fdtd|||fdd}nJ|dkr|jjj j } td|||fdtd| ||fdd}nt d ||d krt |t } nH|d kr4tj|d td } t|t|| d} nt d|| S)Nnoner#rfloat32)rrrrrzUnknown evaluator type: ramfilezDensePoseEvaluatorStorage.z.binrhzUnknown storage specification: )DENSEPOSE_EVALUATIONSTORAGETYPEMODELROI_DENSEPOSE_HEAD HEATMAP_SIZENUM_COARSE_SEGM_CHANNELS NUM_PATCHESr CSE EMBED_SIZE ValueErrorrr?BytesIOrnrorprrrmr) rrZ storage_specr%ZhoutZwoutZn_cscZn_fscschema embed_sizer'fpathrFrFrG!build_densepose_evaluator_storages8      r )NNNr$N)r$)Fr=rar?r_r4rrrn collectionsrtypingrrrrpycocotools.maskmaskrr1pycocotools.cocorrdetectron2.configr Zdetectron2.datar Zdetectron2.evaluationr detectron2.structuresr Zdetectron2.utils.commr rrrdetectron2.utils.file_iordetectron2.utils.loggerrdensepose.convertersrrZdensepose.data.datasets.cocordensepose.structuresrrrZdensepose_coco_evaluationrrZmesh_alignment_evaluatorrZtensor_storagerrrr r!r"rTrrrrrsrrrr rFrFrFrGsV             % "  4