o
    ߥi                     @   sx   d dl 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 ddlmZmZ eje	ejd	G d
d deZdS )    )DictN)Metrics)
OutputKeys)default_group   )Metric)METRICS
MetricKeys)	group_keymodule_namec                       s^   e Zd ZdZ fddZdedefddZdd	 ZdddZdd Z	dd Z
dddZ  ZS )AveragePrecisionMetriczThe metric computation class for multi average precision classes.

    This metric class calculates multi average precision for the whole input batches.
    c                    s0   t  j|i | g | _g | _|dd| _d S )N	threshold      ?)super__init__predslabelsgetthresh)selfargskwargs	__class__ Q/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/metrics/map_metric.pyr      s   zAveragePrecisionMetric.__init__outputsinputsc           	      C   s   t j|v rt jnt j}|| }|| }t jt jt jt jt jfD ]}||v r1|| d ur1|| } nqt|t|ks<J |D ]}| j	| q>|D ]}t
|tr]| j	| dd qI| j	| qId S )N  )r   LABELLABELSCAPTIONTEXTBOXESSCOREStyper   append
isinstancestrr   stripreplace)	r   r   r   
label_nameground_truthseval_resultskeytruthresultr   r   r   add   s$   
zAveragePrecisionMetric.addc                 C   s>   t | jt | jksJ | | j| j| j}tj|  iS N)	lenr   r   _calculate_ap_scorer   r	   mAPmeanitem)r   scoresr   r   r   evaluate0   s   zAveragePrecisionMetric.evaluateotherc                 C   s    | j |j  | j|j d S r3   )r   extendr   )r   r;   r   r   r   merge5   s   zAveragePrecisionMetric.mergec                 C   s   | j | j| jfS r3   )r   r   r   )r   r   r   r   __getstate__9   s   z#AveragePrecisionMetric.__getstate__c                 C   s   |    |\| _| _| _d S r3   )r   r   r   r   )r   stater   r   r   __setstate__<   s   z#AveragePrecisionMetric.__setstate__r   c                 C   s  t |}t |}t |d d d df |d d d df k |d d d df |d d d df }t |d d dd f |d d dd f k |d d dd f |d d dd f }t j||gdd}|d d df |d d df  |d d df |d d df   }	|d d df |d d df  |d d df |d d df   }
|d d df |d d df  }|d d df |d d df  }|| }||	|
 | d  }||k|dk@ |dk@ S )N   r   )axisr      gư>)nparraywhereconcatenate)r   r   r   r   hypsrefsab	interactsarea_predictionsarea_targetsinteracts_winteracts_harea_interactsiousr   r   r   r5   @   s    

RR@  z*AveragePrecisionMetric._calculate_ap_score)r;   r   )r   )__name__
__module____qualname____doc__r   r   r2   r:   r=   r>   r@   r5   __classcell__r   r   r   r   r      s    
r   )typingr   numpyrD   modelscope.metainfor   modelscope.outputsr   modelscope.utils.registryr   baser   builderr   r	   register_modulemulti_average_precisionr   r   r   r   r   <module>   s   