B
     9b(-                 @   sp   d Z ddlZddlZddlmZ ddlmZ ddl	m
Z dZdd	 Zd
d Zdd Zdd Zdd Zdd ZdS )a;  
2D MOT2016 Evaluation Toolkit
An python reimplementation of toolkit in
2DMOT16(https://motchallenge.net/data/MOT16/)

This file lists the matching algorithms.
1. clear_mot_hungarian: Compute CLEAR_MOT metrics

- Bernardin, Keni, and Rainer Stiefelhagen. "Evaluating multiple object
tracking performance: the CLEAR MOT metrics." Journal on Image and Video
 Processing 2008 (2008): 1.

2. idmeasures: Compute MTMC metrics

- Ristani, Ergys, et al. "Performance measures and a data set for multi-target,
 multi-camera tracking." European Conference on Computer Vision. Springer,
  Cham, 2016.



usage:
python evaluate_tracking.py
    --bm                       Whether to evaluate multiple files(benchmarks)
    --seqmap [filename]        List of sequences to be evaluated
    --track  [dirname]         Tracking results directory: default path --
                               [dirname]/[seqname]/res.txt
    --gt     [dirname]         Groundtruth directory:      default path --
                               [dirname]/[seqname]/gt.txt
(C) Han Shen(thushenhan@gmail.com), 2018-02
    N)linear_sum_assignment   )bbox_overlap)EasyDictFc       +   	      s  t | dddf }t |dddf }t | dddf }t |dddf }t|}t|}t|}	t j|ftd}
t j|ftd}t j|ftd}t j|ftd}t j|ftd}t j||ftd}t j||	ftd}dd t|D }dd t|D }dd t|D  x`t|jd D ]N}t |||df kd d }t |||df kd d }||| |< q*W t|}xTt| jd D ]B}|	| |df }t || |df kd d }||| |< qW xt|D ]ȉtt| 
 |< dkr t d  
 }t| xtt|D ]}|| t| 
 kr8 d  ||  t| 
 kr8| ||  }|  d  ||   }t| |d	d
f ||d	d
f }||kr8 d  ||    || < tr8td||   ||  f  q8W g g  }} fdd| 
 D } fdd| 
 D }t|dkrt|dkrt j||	ftd}xtt|D ]~}| ||  }xftt|D ]V} | ||   }t| |d	d
f ||d	d
f }|d |kr|d || | < qW qW td| }!xzt|! D ]n}"||"d |"d f dkrXq6||"d    ||"d  < tr6td||"d    ||"d   f  q6W t  
 }#t   }$ fdd| 
 D }%x*tt|%D ]}|%| | |%| < qW dkrxtt|#D ]}|#| }&  |& }'d}(x2td ddD ]} |& |  
 krV| }(P qVW |&|d  
 kr(|(dkr(d\})}*|&  kr  |& })|& |( krԈ |( |& }*|)|*kr(|
  d7  < q(W t|#|< tt| 
 |< |  | 8  < | |  |< xltt|#D ]\}|#| }&  |& }'| |& }| |' }t| |d	d
f ||d	d
f | |&< qNW qW |
||||| |fS )z
    compute CLEAR_MOT and other metrics
    [recall, precision, FAR, GT, MT, PT, ML, falsepositives, false negatives,
     idswitches, FRA, MOTA, MOTP, MOTAL]
    Nr   r   )dtypec             S   s   g | ]}i qS  r   ).0ir   r   S/content/gdrive/MyDrive/yolov5_deepsort/yolov5/mot_evaluation/utils/measurements.py
<listcomp>E   s    z'clear_mot_hungarian.<locals>.<listcomp>c             S   s   g | ]}i qS r   r   )r   r	   r   r   r
   r   F   s    c             S   s   g | ]}i qS r   r   )r   r	   r   r   r
   r   H   s          zperserving mapping: %d to %dc                s$   g | ]}|t    kr|qS r   )listkeys)r   key)Mtr   r
   r   n   s    c                s$   g | ]}|t    kr|qS r   )r   values)r   r   )r   r   r   r
   r   p   s    zadding mapping: %d to %dc                s$   g | ]}|t    kr|qS r   )r   r   )r   r   )r   r   r   r
   r      s    )r   r   )npuniquelenzerosfloatrangeshapewherer   indexr   sortedr   VERBOSEprintlinear_assignmentzipr   )+stDBgtDB	thresholdZ	st_frames	gt_framesst_idsgt_idsf_gtn_gtn_stmmecfpmissedgdallfpsZgt_indsZst_indsr	   framegidgt_frames_listZsidZmappingskZrow_gtZrow_stdistZunmapped_gtZunmapped_stoverlapsjmatched_indicesmatchedZcur_trackedZ
st_trackedZfpsctestZlast_non_emptyZmtctZmlastnonemptyctr   )r   r   r
   clear_mot_hungarian)   s    
& 
 "
"
 
 
6r>   c                s  t dddf t dddf t}t}fddt|D  fddt|D t j|| || ftd}tj||dd|f< tj|d||df< t |j}t |j}t	 |\}}	}
||d|d|f< |	|d|d|f< |
|d|d|f< xFt|D ]:}| jd ||| |f< | jd ||| |f< q"W xFt|D ]:} | jd |||| f<  | jd |||| f< qjW yt
|}W n   ddl}|  Y nX t fddt|D }tfd	dt|D }d}d}xBt| D ]6}|||d |d f 7 }|||d |d f 7 }qW || }||| kslt|||  d
 }|||  d
 }d| ||  d
 }t }||_||_||_||_||_||_||_||_|S )z3
    compute MTMC metrics
    [IDP, IDR, IDF1]
    Nr   c                s:   g | ]2} t  d d df | kd d d f qS )Nr   r   )r   r   )r   r	   )r$   r(   r   r
   r      s   zidmeasures.<locals>.<listcomp>c                s:   g | ]2} t  d d df | kd d d f qS )Nr   r   )r   r   )r   r	   )r#   r'   r   r
   r      s   )r   r   c                s   g | ]} | j d  qS )r   )r   )r   r	   )groundtruthr   r
   r      s    c                s   g | ]} | j d  qS )r   )r   )r   r	   )
predictionr   r
   r      s    d   r   )r   r   r   r   r   r   sysmaxsizer   cost_between_gt_predr!   pdbZ	set_tracesumr"   AssertionErroredictIDPIDRIDF1IDTPIDFPIDFNnbox_gtnbox_st)r$   r#   r%   r+   r*   costr.   fnZ
cost_blockZfp_blockZfn_blockr	   r:   rE   rO   rP   rM   rN   r;   rL   rI   rJ   rK   Zmeasuresr   )r?   r$   r(   r@   r#   r'   r
   
idmeasures   sf      rS   c             C   s   d\}}dt j|ftd }xh||k r||k r| | || k rPd||< |d7 }q| | || krz|||< |d7 }|d7 }q|d7 }qW |S )zs
    Find the matching position in traj2 regarding to traj1
    Assume both trajectories in ascending frame ID
    )r   r   r   )r   r   )r   onesint)traj1len1traj2len2p1p2locr   r   r
   corresponding_frame   s    

r]   c             C   sl   t jt|ftd}xRtt|D ]B}|| dkr6q"q"t| |ddf ||| ddf }|||< q"W |S )z:
    Compute the loss hit in traj2 regarding to traj1
    )r   r   r   r   )r   r   r   r   r   r   )rV   rX   Zmatched_posdistancer	   Ziour   r   r
   compute_distance  s    &r_   c                s   | j \}}|j \}}| d }| d }|d }	|d }
t||	t||
k }|s\|}|}||fS t| d d df ||d d df |}t|d d df || d d df |}t| || t|| |t fddt|D }tfddt|D }||fS )N)r   r   )r   r   r   c                s   g | ]} | k rd qS )r   r   )r   r	   )dist1r%   r   r
   r   .  s    z-cost_between_trajectories.<locals>.<listcomp>c                s   g | ]} | k rd qS )r   r   )r   r	   )dist2r%   r   r
   r   0  s    )r   maxminr]   r_   rF   r   )rV   rX   r%   Znpoints1Zdim1Znpoints2Zdim2Zstart1Zend1Zstart2Zend2Zhas_overlaprR   r.   Zmatched_pos1Zmatched_pos2r   )r`   ra   r%   r
   cost_between_trajectories  s(    

$$rd   c       
      C   s   t | }t |}tj||ftd}tj||ftd}tj||ftd}xjt|D ]^}xXt|D ]L}	t| | ||	 |\|||	f< |||	f< |||	f |||	f  |||	f< q^W qPW |||fS )N)r   )r   r   r   r   r   rd   )
r?   r@   r%   r*   r+   rQ   r.   rR   r	   r9   r   r   r
   rD   4  s    &(rD   )__doc__rB   numpyr   scipy.optimizer   r!   bboxr   easydictr   rH   r   r>   rS   r]   r_   rd   rD   r   r   r   r
   <module>   s    E