
    ^jjz                     V   U d Z ddlZddlZddlZddlmZ ddlmZ ddlm	c m
Z ddlZddlmZ ddlmZ ddlmZ ddlmZ  e       Z ej.                  g d	ej0                  
      dz  ZdZ e       Zee   ed<    edd       G d d             Z ed       G d d             Z dedefdZ!deddfdZ"dededz  fdZ#dede$eef   fdZ%dede&e'   dz  de&e'   dz  fdZ(dede&e'   dz  de&e'   dz  fdZ)deddfdZ*dede&e'   dz  de&e   fd Z+ded!e&e   defd"Z,ded#e&e$e-ef      defd$Z.d%ej^                  dej^                  fd&Z0d'e&ej^                     d(e&e   dej^                  fd)Z1d'ej^                  ddfd*Z2d+ed,e3ddfd-Z4 G d. d/      Z5dd0d1ed,e3ddfd2Z6y)3a'  COCO evaluator for ONNX/TRT export benchmarking.

Provides :class:`CocoEvaluator` used by :mod:`rfdetr.export.benchmark` to compute mAP during ONNX and TensorRT inference
benchmarks.

Implementation mirrors torchvision's evaluator structure but uses ``faster_coco_eval`` as the runtime backend.
    N)	dataclass)Any)COCO)COCOeval)
all_gather)
get_logger)gp=
ף?      ?r	   ffffff?r
   HzG?r   
ףp=
?r   ףp=
?r   Q?r   ףp=
?r   {Gz?r   dtypeg      $@g?"_WARNED_CUSTOM_KEYPOINT_OKS_COUNTST)frozenslotsc                   B    e Zd ZU dZee   ed<   eed<   ee   dz  ed<   y)_KeypointCategoryGroupzDKeypoint categories sharing one keypoint count and OKS sigma vector.category_idskeypoint_countNkeypoint_oks_sigmas)__name__
__module____qualname____doc__listint__annotations__float     f/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/evaluation/coco_eval.pyr   r   D   s$    Ns)et++r$   r   )r   c                   P    e Zd ZU dZee   ed<   ej                  ed<   ee	   ed<   y)_GroupedKeypointCOCOevalzLAggregate COCO keypoint stats for categories with different keypoint counts.groupsstatsevalsN)
r   r   r   r   r   r   r!   npndarrayr   r#   r$   r%   r'   r'   M   s%    V'((::>r$   r'   coco_gtreturnc                    t        | t              rt        | d      r| S t               }t        j                  | j
                        |_        |j                          t        | dd      }| t        |dt        j                  |             |S )zAReturn a faster-coco-eval COCO object for evaluator construction.cat_img_map	label2catN)	
isinstancer   hasattrcopydeepcopydatasetcreateIndexgetattrsetattr)r-   faster_cocor1   s      r%   _ensure_faster_cocor;   V   sq    '4 WWm%D&K--8Kd3I[$--	*BCr$   c                     i }| j                   j                  dg       D ]j  }|j                  d      }t        |t              r|||<   |j                  d      }d|vs?t        |t              sPt        d |ddd   D              |d<   l | j                  j                         D ]f  \  }}|j                  d      }d|vr+t        |t              rt        d	 |ddd   D              |d<   |j                  |      }|Zd|v s_|d   |d<   h y)
zEPopulate missing COCO ``num_keypoints`` fields from visibility flags.annotationsid	keypointsnum_keypointsc              3   ,   K   | ]  }|d kD  s	d  ywr      Nr#   .0
visibilitys     r%   	<genexpr>z*_backfill_num_keypoints.<locals>.<genexpr>m        -dJU_bcUca-d   
   N   c              3   ,   K   | ]  }|d kD  s	d  ywrB   r#   rD   s     r%   rG   z*_backfill_num_keypoints.<locals>.<genexpr>r   rH   rI   )r6   getr2   r    r   sumannsitems)r-   annotations_by_id
annotationannotation_idr?   dataset_annotations         r%   _backfill_num_keypointsrU   d   s   35oo))-< e
"t,mS)/9m,NN;/	*,It1L*--d)ADqD/-d*dJ'e &-\\%7%7%9 N!zNN;/	*,It1L*--d)ADqD/-d*dJ'.22=A)o.K2<_2M/Nr$   c                     t        |       j                         D ch c]
  }|dkD  s	| }}|syt        |      dkD  rt        dt	        |       d      t        t        |            S c c}w )zIInfer a single keypoint count from COCO category metadata or annotations.r   NrC   z_COCO keypoint evaluation requires one keypoint count across evaluated categories; found counts .)"_infer_keypoint_counts_by_categoryvalueslen
ValueErrorsortednextiter)r-   countcountss      r%   _infer_keypoint_countra   x   sw    !CG!L!S!S!UcY^abYbecFc
6{Q"6N+1.
 	
 V ds
   
A*A*c                    i }| j                   j                         D ]A  \  }}|j                  d      }t        |t              s(|s+t        |      |t        |      <   C | j                  j                  dg       D ]_  }|j                  d      }t        |t              r|s't        |d         }t        |j                  |d      t        |      dz        ||<   a | j                  j                         D ]_  }|j                  d      }t        |t              r|s't        |d         }t        |j                  |d      t        |      dz        ||<   a |S )zRInfer keypoint count for each category from COCO category metadata or annotations.r?   r=   category_idr   rK   )catsrP   rM   r2   r   rZ   r    r6   maxrO   rY   )r-   r`   rc   categoryr?   rR   s         r%   rX   rX      sD   F!(!3!3!5 6XLL-	i&9'*9~F3{#$6
 oo))-< S
NN;/	)T*)*]34!&**[!"<c)nPQ>QR{S ll))+ S
NN;/	)T*)*]34!&**[!"<c)nPQ>QR{S Mr$   r   c                 n   t        |       }|t        j                  |t        j                        }|j                  dk7  s|j
                  dk(  rt        d      t        j                  |      j                         rt        j                  |dk        rt        d      |+|j
                  |k7  rt        d|j
                   d| d	      |j                         S ||t        t              k(  ryt        |       t        j                  |t        t        j                        j                         S )
z<Resolve OKS sigmas for faster-coco-eval keypoint evaluation.Nr   rC   r   Akeypoint_oks_sigmas must be a non-empty one-dimensional sequence.;keypoint_oks_sigmas values must be positive finite numbers.keypoint_oks_sigmas length ' does not match dataset keypoint count rW   )ra   r+   asarrayfloat32ndimsizer[   isfiniteallanytolistrZ   _COCO_PERSON_KEYPOINT_SIGMAS$_warn_custom_keypoint_oks_sigma_oncefull"_DEFAULT_CUSTOM_KEYPOINT_OKS_SIGMA)r-   r   r   sigmass       r%   _resolve_keypoint_oks_sigmasry      s    *73N&/rzzB;;!v{{a/`aa{{6"&&(BFF6Q;,?Z[[%&++*G-fkk]:abpaqqrs  }}37S3T!T(877>#ERZZX__aar$   r   c                 V   |V| t        t              k(  ryt        |        t        j                  | t
        t        j                        j                         S t        j                  |t        j                        }|j                  dk7  s|j                  dk(  rt        d      t        j                  |      j                         rt        j                  |dk        rt        d      |j                  | k  rt        d|j                   d|  d	      |d|  j                         S )
z0Resolve OKS sigmas for one keypoint-count group.Nr   rC   r   rh   ri   rj   rk   rW   )rZ   rt   ru   r+   rv   rw   rm   rs   rl   rn   ro   r[   rp   rq   rr   )r   r   rx   s      r%   "_resolve_group_keypoint_oks_sigmasr{      s    
 "S!=>>,^<ww~'IQSQ[Q[\cceeZZ+2::>F{{a6;;!+\]];;v""$v{(;VWW{{^#)&++6]^l]mmno
 	
 />"))++r$   c                 v    | t         v ryt         j                  |        t        j                  d| t               y)zBWarn once per keypoint count when using uniform custom OKS sigmas.NzCOCO keypoint metadata defines %s keypoints, but no keypoint_oks_sigmas were provided. Using uniform OKS sigma %.3f for custom keypoint evaluation.)r   addloggerwarningrw   )r   s    r%   ru   ru      s4    ;;&**>:
NN	G*	r$   c                 <   t        |       }i }|j                         D ],  \  }}|dk  r|j                  |g       j                  |       . t	        |j                               D cg c]&  \  }}t        t	        |      |t        ||            ( c}}S c c}}w )zPBuild category groups that can each be evaluated by one COCO keypoint evaluator.r   )r   r   r   )rX   rP   
setdefaultappendr\   r   r{   )r-   r   counts_by_categorygrouped_category_idsrc   r   r   s          r%   _build_keypoint_category_groupsr      s    
 <GD13'9'?'?'A P#^Q'';BB;OP -33G3M3M3O,P )NL 	-) B>Sf g	
  s   )+Br   c           
      *   t        |      }t        j                  | j                        }|j	                  dg       D cg c]  }t        |d         |v s| c}|d<   |j	                  dg       D cg c]!  }t        |j	                  dd            |v r|# c}|d<   t               }||_        |j                          t        | dd      }|4t        |d|j                         D 	ci c]  \  }}	|	|v s||	 c}	}       |S c c}w c c}w c c}	}w )zNReturn a COCO object containing only the requested categories and annotations.
categoriesr>   r=   rc   r1   N)setr4   r5   r6   rM   r    r   r7   r8   r9   rP   )
r-   r   category_id_setr6   rf   rR   filteredr1   labelcat_ids
             r%   _filter_coco_by_category_idsr      s   ,'OmmGOO,G!(\2!>#htnBUYhBhGL
 "++mR8z~~mR01_D 	GM vHHd3I090A_}ufVE^UF]_	

 O' `s   DD3&D
)D6Dresultsc                    |rt        j                  | |      S t               }t        j                  | j                  j                  di             |j                  d<   t        j                  | j                  j                  dg             |j                  d<   t        j                  | j                  j                  dg             |j                  d<   g |j                  d<   |j                          |S )z@Build a COCO detections object, including the empty-result case.infoimagesr   r=   )r   loadResr4   r5   r6   rM   r7   )r-   r   coco_dts      r%   _load_coco_resultsr     s    ||GW--fG"mmGOO,?,?,KLGOOF $goo.A.A(B.O PGOOH$(MM'//2E2ElTV2W$XGOOL!%'GOOM"Nr$   boxesc                     | j                         } | dddfxx   | dddf   z  cc<   | dddfxx   | dddf   z  cc<   | S )z6Convert boxes from [x1, y1, x2, y2] to [x1, y1, w, h].NrJ   r   rK   rC   )r4   )r   s    r%   _xyxy_to_xywhr     sF    JJLE	!Q$K5A;K	!Q$K5A;KLr$   r)   weightsc                    | s&t        j                  ddt         j                        S t        d | D              }t        j                  |fdt         j                        }t	        |      D ]X  }d}d}t        | |      D ]5  \  }}t        |      |k  s||   dk  r|t        ||         |z  z  }||z  }7 |dkD  sQ||z  ||<   Z |S )zNCompute category-weighted mean COCO stats, ignoring unavailable ``-1`` values.
         r   c              3   2   K   | ]  }t        |        y w)N)rZ   )rE   items     r%   rG   z,_weighted_mean_coco_stats.<locals>.<genexpr>!  s     .#d).s   g        r   )r+   rv   rm   re   rangeziprZ   r"   )	r)   r   max_len
aggregatedstat_idx	numeratordenominatorstatweights	            r%   _weighted_mean_coco_statsr     s    wwud"**55...G'T<J'N 	;	w/ 	"LD&4yH$X(:tH~.77I6!K		"
 ?#,{#:Jx 	; r$   c                     d}d}|D ]P  \  }}}}}}t        |       |kD  rt        | |         nd}	t        j                  |j	                  ||||||	             R y)z>Log keypoint COCO stats from an already accumulated evaluator.)
)Average Precision(AP)	0.50:0.95rq      r   )r   r   0.50rq   r   rC   )r   r   0.75rq   r   rJ   )r   r   r   mediumr   rK   )r   r   r   larger      )Average Recall(AR)r   rq   r      )r   r   r   rq   r      )r   r   r   rq   r      )r   r   r   r   r      )r   r   r   r   r   	   B {:<18} {} @[ IoU={:<9} | area={:>6s} | maxDets={:>3d} ] = {:0.3f}r   N)rZ   r"   r~   r   format)
r)   labelslog_templatetitlemetric_typeiouareamax_detsr   values
             r%   _log_keypoint_statsr   0  sl    F XL=C Y9{Cx*-e*x*?eHo&TL''{CxQVWXYr$   	coco_evallog_summaryc                ,   |r| j                          t        |        yt        t        j                  d      5 }t        j                  |      5  | j                          t        | d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zJAccumulate a COCO evaluator and populate ``stats`` regardless of log mode.NwFr   )
accumulatepatched_pycocotools_summarizeopenosdevnull
contextlibredirect_stdout)r   r   r   s      r%   _accumulate_and_summarizer   D  s    %i0	bjj#	 H'''0 	H  "))G	HH H	H 	HH Hs#   B
A>-B
>B	B

Bc                      e Zd ZdZ	 	 	 d dedee   dedee   dz  de	ddfd	Z
d
ede	dedz  fdZdee   de	fdZdeeef   ddfdZd!dZd!dZd!dZdededdfdZdeddfdZedededeeeef      dee   ddf
d       Zdeeef   dedeeeef      fdZdeeef   deeeef      fdZdeeef   deeeef      fdZdeeef   deeeef      fdZy)"CocoEvaluatorz.COCO evaluator that works in distributed mode.Nr-   	iou_typesr   r   r   r.   c           	      J   t        |t        t        f      sJ t        j                  t        |            }d }g }d|v r1t        |       t        ||      }t        |      dk  rt        ||      }|| _
        || _        t        |dd       | _        || _        i | _        |D ]  }|dk(  rNt        |      dkD  r@t!        |t#        j$                  ddt"        j&                        g       | j                  |<   V|dk(  rd|ini }	t)        |fd	|i|	}
|dk(  rd
gndd|g|
j*                  _        |
| j                  |<    g | _        |D ci c]  }|g  c}| _        t3        |j4                  j7                               | _        t;        |      | _        d| _        || _         y c c}w )Nr?   rC   r1   r   r   r   )r(   r)   r*   kpt_oks_sigmasiouTyper   r   F)!r2   r   tupler4   r5   r;   rU   r   rZ   ry   r-   r   r8   r1   r   r   r'   r+   rv   rm   r   paramsmaxDetsimg_idscoco_resultsr   rd   keyscat_idsrX   _keypoint_counts_by_category_prefer_raw_category_ids_log_summary)selfr-   r   r   r   r   resolved_keypoint_oks_sigmaskeypoint_category_groupsiou_typekwargsr   ks               r%   __init__zCocoEvaluator.__init__T  s    )dE]333-- 3G <='+$AC )##G,'FwPc'd$+,1/KGUh/i,  18d0S"IK! 	1H;&3/G+H1+L+C3''%RZZ@,x(
 IQU`I`&(DEfhF E(EfEI/7;/FtQPRT\L]I$'0DNN8$	1 #%MV=Wae=W7<<,,./,Nw,W)(-%'	 >Xs   
F r   use_raw_category_idsc                     |r|| j                   v r|S dS | j                  -| j                  j                  |      }|| j                   v r|S dS || j                   v r|S y)z0Resolve a predicted label to a COCO category_id.N)r   r1   rM   )r   r   r   rc   s       r%   _resolve_category_idz"CocoEvaluator._resolve_category_id  sc    !T\\15;t;>>%..,,U3K"-"=;G4GDLL Lr$   r   c                     | j                   y| j                  ryt        | j                   j                               t        | j                   j	                               k(  }|rd| _        yy)zCDetect whether model predictions are already raw COCO category IDs.TF)r1   r   r   r   rY   )r   r   uses_raw_idss      r%   _should_use_raw_category_idsz*CocoEvaluator._should_use_raw_category_ids  sZ    >>!((DNN//12d4>>;P;P;R6SS,0D)r$   predictionsc                 &   t        t        j                  t        |j                                           }| j                  j                  |       | j                  D ]2  }| j                  ||      }| j                  |   j                  |       4 y)z!Accumulate per-image predictions.N)	r   r+   uniquer   r   extendr   preparer   )r   r   r   r   r   s        r%   updatezCocoEvaluator.update  sq    ryyk&6&6&8!9:;G$ 	8Hll;9Gh'..w7	8r$   c                    t        | j                        }i }t        |      D ]  \  }}|D ]  }||vs|||<     t        |j	                               | _        | j
                  D ]n  }t        | j                  |         }g }t        |      D ]5  \  }}	|	D ]+  }
|j                  |
d         |k(  s|j                  |
       - 7 || j                  |<   p y)u  Merge image IDs and COCO result records across distributed processes.

        Each image ID is assigned to exactly one rank (first rank that reports it), so
        predictions for images that appear on multiple ranks due to
        ``DistributedSampler(drop_last=False)`` padding are included only once.  Without
        this deduplication, padded images produce duplicate DT entries that compete for
        the per-image ``maxDets`` cap and bias mAP upward in early epochs then downward
        as genuine new detections are displaced — the "peak-then-decrease" pattern.

        Contract:
            This method assumes that when the same ``image_id`` appears on multiple ranks
            its predictions are *identical* (DDP-padding duplicates).  It is **not** safe
            for evaluation strategies where independent predictions for the same image are
            produced on different ranks, because only the first rank's predictions are kept
            and the rest are silently discarded.

        Single-process path:
            When ``all_gather`` is called in a non-distributed context it returns a
            single-element list ``[x]``, so ``rank_idx`` is always 0 and every result
            passes the ownership check unchanged — the dedup loop is a no-op and all
            results are preserved.  This makes the method safe for single-GPU and ONNX/TRT
            benchmark use via :mod:`rfdetr.export.benchmark`.
        image_idN)	r   r   	enumerater\   r   r   r   rM   r   )r   gathered_img_idsimg_id_to_rankrank_idxrank_img_idsimg_idr   gathered_resultsdedupedrank_resultsresults              r%   synchronize_between_processesz+CocoEvaluator.synchronize_between_processes  s    0 &dll3 *,&/0@&A 	6"Hl& 6/-5N6*6	6 n1134 	2H)$*;*;H*EF,.G*34D*E /&,* /F%))&*<=Iv.// +2Dh'	2r$   c                     | j                   j                         D ]q  \  }}t        |t              r3| j	                  |       | j
                  rt        |j                         I| j                  ||       t        || j
                         s y)z:Accumulate per-image evaluation results into mean metrics.r   N)
r   rP   r2   r'   _evaluate_grouped_keypointsr   r   r)   	_evaluater   r   r   r   s      r%   r   zCocoEvaluator.accumulate  st    #'>>#7#7#9 	PHi)%=>00;$$'	8NN8Y/%iT=N=NO	Pr$   c                     | j                   j                         D ]Z  \  }}t        j                  dj	                  |             t        |t              rt        |j                         Pt        |       \ y)z&Print and log COCO summary statistics.zIoU metric: {}N)
r   rP   r~   r   r   r2   r'   r   r)   r   r  s      r%   	summarizezCocoEvaluator.summarize  sZ    #'>>#7#7#9 	9HiKK(//9:)%=>#IOO4-i8	9r$   r   r   c                    | j                   |   }t        t        j                  d      5 }t	        j
                  |      5  t        | j                  |      }||_        t        t        j                  | j                              |j                  _        |j                          ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zDRun faster-coco-eval evaluation for accumulated COCO result records.r   N)r   r   r   r   r   r   r   r-   cocoDtr   r+   r   r   r   imgIdsevaluate)r   r   r   r   r   r   s         r%   r  zCocoEvaluator._evaluate  s    ##H-"**c" 	%g++G4 %,T\\7C#*	 *.ryy/F*G	  '""$	%	% 	%% %	% 	%s$   C A%B6%C6B?	;CCgrouped_evalc                    g |_         g }g }| j                  d   }t        t        j                  | j
                              }|j                  D ]   }t        |j                        }t        | j                  |j                        }|D 	cg c]  }	t        |	d         |v s|	 }
}	t        |d|j                        }dg|j                  _        | j!                  |||
|       t#        |d       |j                   j%                  |       |j%                  t        j&                  |j(                  t        j*                               |j%                  t-        |j                               # t/        ||      |_        yc c}	w )	zERun keypoint evaluation per keypoint-count group and aggregate stats.r?   rc   )r   r   r   Fr   r   N)r*   r   r   r+   r   r   r(   r   r   r   r-   r    r   r   r   r   "_evaluate_grouped_keypoint_resultsr   r   rl   r)   rm   rZ   r   )r   r  group_statsgroup_weightsall_resultsr   groupr   group_gtr  group_resultsgroup_coco_evals               r%   r  z)CocoEvaluator._evaluate_grouped_keypoints  sL   (*#%''4ryy./!(( 	:E!%"4"45O3DLL%BTBTUH2=oVMEZA[_nAnVoMo&#$88O
 /1TO""*33OX}^ef%o5I%%o6rzz/*?*?rzzRS  U%7%7!89	:  7{MR ps   F"Fr   r   c                    t        t        j                  d      5 }t        j                  |      5  t        ||      }|| _        || j                  _        | j                          ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z)Evaluate one grouped keypoint result set.r   N)
r   r   r   r   r   r   r
  r   r  r  )r   r-   r   r   r   r   s         r%   r  z0CocoEvaluator._evaluate_grouped_keypoint_results  s     "**c" 	%g++G4 %,Wg>#*	 *1	  '""$	%	% 	%% %	% 	%s"   B5A7&B7B 	<BBc                     |dk(  r| j                  |      S |dk(  r| j                  |      S |dk(  r| j                  |      S t        dj	                  |            )z:Convert predictions to COCO format for the given iou_type.bboxsegmr?   zUnknown iou type {})prepare_for_coco_detectionprepare_for_coco_segmentationprepare_for_coco_keypointr[   r   )r   r   r   s      r%   r   zCocoEvaluator.prepare  sd    v22;??55kBB$11+>>299(CDDr$   c           	         g }|j                         D ]  \  }}t        |      dk(  r|d   }t        |j                         j	                               j                         }|d   j                         }|d   j                         }| j                  |      }t        |      D ]6  \  }	}
| j                  ||	   |      }||j                  |||
||	   d       8  |S )z5Format bounding-box predictions as COCO result dicts.r   r   scoresr   )r   rc   r  score)
rP   rZ   r   cpunumpyrs   r   r   r   r   )r   r   r   original_id
predictionr   r  r   r   r   boxrc   s               r%   r  z(CocoEvaluator.prepare_for_coco_detection  s    '2'8'8': 	#K:!#w'E!%))+"3"3"56==?E)002F)002F#'#D#DV#L #E* 3"77q	CWX&##$/'2 #!'			* r$   c                    g }|j                         D ]2  \  }}t        |      dk(  r|d   }|d   }|d   }|dkD  }|d   j                         }|d   j                         }| j                  |      }|D 	cg c]e  }	t	        j
                  t        j                  |	j                         dddddt        j                  f   t        j                  d            d   g }
}	|
D ]  }|d	   j                  d
      |d	<    t        |
      D ]6  \  }}| j                  ||   |      }||j                  |||||   d       8 5 |S c c}	w )z:Format segmentation mask predictions as COCO result dicts.r   r  r   masks      ?NF)r   orderr`   zutf-8)r   rc   segmentationr   )rP   rZ   rs   r   	mask_utilencoder+   arrayr!  newaxisuint8decoder   r   r   )r   r   r   r#  r$  r  r   r'  r   maskrlesrler   rc   s                 r%   r  z+CocoEvaluator.prepare_for_coco_segmentation7  s   '2'8'8':  	#K:!#)F)Fw'ECKE)002F)002F#'#D#DV#L  "   $((*Q1bjj5H*IQSQYQYad!efghiD   > #H 4 4W =H> $D/ 3"77q	CWX&##$/'2(+!'		+ 	B 's   8A*Ec           	      Z   g }|j                         D ]  \  }}t        |      dk(  r|d   }t        |j                         j	                               j                         }|d   j                         }|d   j                         }|d   }|j                  d      j                         }| j                  |      }	t        |      D ][  \  }
}| j                  ||
   |	      }|| j                  j                  |      }||d|d	z   }|j                  |||||
   d
       ]  |S )z1Format keypoint predictions as COCO result dicts.r   r   r  r   r?   rC   )	start_dimNrK   )r   rc   r?   r   )rP   rZ   r   r!  r"  rs   flattenr   r   r   r   rM   r   )r   r   r   r#  r$  r   r  r   r?   r   r   keypointrc   r   s                 r%   r  z'CocoEvaluator.prepare_for_coco_keypoint]  sM   '2'8'8': 	#K:!#w'E!%))+"3"3"56==?E)002F)002F";/I!))A)6==?I#'#D#DV#L (3 8"77q	CWX&!%!B!B!F!F{!S!-'(<.1*<=H##$/'2%-!'		4 r$   )d   NT)r.   N)r   r   r   r   r   r   strr    r"   boolr   r   r   dictr   r  r   r  r   r  r'   r  staticmethodr   r  r   r  r  r  r#   r$   r%   r   r   Q  s   8 26 +(+( 9+( 	+(
 "%[4/+( +( 
+(Z	# 	T 	cTXj 	
49 
 
8$sCx. 8T 8(2T	P9%# %( %t %S8P SUY S4 %%% d38n%% c	%
 
% %	E4S> 	ES 	ET$sTWx.EY 	Ed38n dSVX[S[nI] 4$c3h $DQUVY[^V^Q_L` $LT#s(^ TRUWZRZ^H\ r$   r   r   r   c                P    ddt         dt        dz  dt        dt         dt        f
 fddt        j                  f fd}dt        j                  ffd	} j
                  st        d
       j                  j                  }|dk(  s|dk(  r|}n|dk(  r|}         _	        y)z;Compute and display summary metrics for evaluation results.Napiou_thrarea_rngr   r.   c           
         j                   }d}| dk(  rdnd}| dk(  rdnd}|,dj                  |j                  d   |j                  d	         nd
j                  |      }t        |j                        D 	
cg c]  \  }	}
|
|k(  s|	 }}	}
t        |j
                        D 	cg c]  \  }	}||k(  s|	 }}	}| dk(  rLj                  d   }|*t        j                  ||j                  k(        d   }||   }|d d d d d d ||f   }nHj                  d   }|*t        j                  ||j                  k(        d   }||   }|d d d d ||f   }t        ||d	kD           dk(  rd	n#t        t        j                  ||d	kD                 }r)t        j                  |j                  ||||||             |S c c}
}	w c c}}	w )Nr   rC   r   r   r   r   z{:0.2f}:{:0.2f}r   r   z{:0.2f}	precisionrecall)r   r   iouThrsr   
areaRngLblr   evalr+   whererZ   r"   meanr~   r   )r?  r@  rA  r   pr   	title_strtype_striou_striaRngaindmDetmindstmean_sr   r   s                    r%   
_summarizez1patched_pycocotools_summarize.<locals>._summarize  s   KK[+-7'8H	1W6&EL_$$QYYq\199R=AZcZjZjkrZs 	 "+1<<!8MgaDH<LMM!*199!5Jga9IJJ7		+&A"HHW		1215aD!Q4%&A		(#A"HHW		1215aD!Qd"#A1QV9~*bggaBi6H0IKK++Ix(T\^def# NJs   9F;F;&G4Gc                     t        j                  d      }  dj                  j                  d         | d<    ddj                  j                  d         | d<    ddj                  j                  d         | d<    dd	j                  j                  d   
      | d<    ddj                  j                  d   
      | d<    ddj                  j                  d   
      | d<    dj                  j                  d         | d<    dj                  j                  d         | d<    dj                  j                  d         | d<    dd	j                  j                  d   
      | d<    ddj                  j                  d   
      | d<    ddj                  j                  d   
      | d<   | S )N)   rC   rJ   r   r   r(  )r@  r         ?small)rA  r   rK   r   r   r   r   r   r   r   r   r      )r+   zerosr   r   )r)   rV  r   s    r%   _summarizeDetsz5patched_pycocotools_summarize.<locals>._summarizeDets  s   a$++*=*=a*@Aaat{{7J7J17MNaa8K8KA8NOaa'DKK<O<OPQ<RSaa(T[[=P=PQR=STaa'DKK<O<OPQ<RSaa$++*=*=a*@Aaa$++*=*=a*@Aaa$++*=*=a*@Aaa'DKK<O<OPQ<RSaq8dkk>Q>QRS>TUb	q7T[[=P=PQR=STb	r$   c                  F   t        j                  d      }  dd      | d<    ddd      | d<    ddd      | d	<    ddd
      | d<    ddd      | d<    dd      | d<    ddd      | d<    ddd      | d<    ddd
      | d<    ddd      | d<   | S )Nr   rC   r   rY  r   r(  )r   r@  rZ  rJ   r   )r   rA  rK   r   r   r   r   r   r   r   )r+   r]  )r)   rV  s    r%   _summarizeKpsz4patched_pycocotools_summarize.<locals>._summarizeKps  s    a"-aa"c:aa"d;aa"x@aa"w?aa"-aa"c:aa"d;aa"x@aa"w?ar$   zPlease run accumulate() firstr  r  r?   )rC   Nrq   r9  )
r    r"   r:  r+   r,   rG  	Exceptionr   r   r)   )r   r   r^  r`  r   r  rV  s   ``    @r%   r   r     s    s   _b mr 8BJJ  2::  99788{{""H6X/"		[	 !	DJr$   )7r   r   r4   r   dataclassesr   typingr   faster_coco_eval.core.maskcorer2  r,  r"  r+   faster_coco_evalr   %faster_coco_eval.core.faster_eval_apir   rfdetr.utilities.distributedr   rfdetr.utilities.loggerr   r~   rl   rm   rt   rw   r   r   r    r!   r   r'   r;   rU   ra   r<  rX   r   r"   ry   r{   ru   r   r   r:  r   r,   r   r   r   r;  r   r   r   r#   r$   r%   <module>rj     s     	 !  . .  ! : 3 .	 BJJ	
& jj), - 2 &* "/2u "CH 4 $d#, , $,     NT Nd N(4 C$J  c3h .b$ bT%[SWEW b\`af\gjn\n b,,,et+, 
%[4,.
 
 
et+ 

 !*$ d3i D 4 tDcN/C   

 T"**%5 S	 bjj (Yrzz Yd Y(
H 
H4 
HD 
Hi i`	 JN D D$ DRV Dr$   