o
    'j4x                     @   sb   d dl Z d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 dd Zdd Zdd	 ZdddZdS )    N)check_install)iodarea_of_intersectionareac           $   
   C   sb  d}dd }dd }d!dd}d	d
 }dd }t |D ] }|dkr|dkr|dkr|dkr|dkr|dkr|dkr||}	|| }
||	|
}	g }t t|
D ]}|
| d dkre|| qVd}|D ]}|| }|
|= |d7 }qjtt|
t|	f}tt|
t|	f}i }i }t|
D ]}\}}t|	dkrt|	D ]m\}}|}dd |d dD }ttt	|}|d 
 }|dd d }|dd d }ttt	t|d }ttt	t|d }t|d  d }||||||||f< ||||||||f< |||< |||< qq|}|} |}!|}"qi }#||#d< | |#d< |!|#d< |"|#d < |#S )"N   c                 S   Z   g }t | }t|D ] }| | d }| | d }dtt|d}|||g q
|S z&This helper reads input from txt filespointsZtexts,lenrangejoinmapstrreshapeappend	pred_dictZdetnir	   textpoint r   i/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddleocr/ppocr/utils/e2e_metric/Deteval.pyinput_reading_mod      z&get_socre_A.<locals>.input_reading_modc              
   S   s*  g }t | }t|D ]}| | d  }t |}| | d }tjdgdddtjdgdddtjdgd	dtjdgd	dg}g g }}	t|D ]}
|||
 d  |	||
 d
  qGtj|gdd|d
< tj|	gdd|d< |dkrtj|gdt |d|d< tjdgd	d|d< || q
|S )-This helper reads groundtruths from mat filesr	   r   zx:z<U2)Zdtyper   zy:#z<U1r   Zint16    zU{}   c   )r   r   tolistnparrayr   format)Zgt_dictgtr   r   r	   hr   xxZt_xZt_yjr   r   r   gt_reading_mod&   s<   
z#get_socre_A.<locals>.gt_reading_mod      ?c                 S      t |D ]q\}}|d dkru|d jd dkrutttt|d }tttt|d }t | D ]6\}}|}	dd |d dD }ttt|}|dd d	 }
|dd d	 }t|
|||}||krig | |< q3d
d | D | d d < q| S )Nr$   r   r   r    c                 S      g | ]}t |qS r   float.0xr   r   r   
<listcomp>H       z<get_socre_A.<locals>.detection_filtering.<locals>.<listcomp>r   r
      c                 S      g | ]}|g kr|qS r   r   r4   itemr   r   r   r6   P       		enumerateshapelistr   intr&   squeezesplitr   
detectionsgroundtruths	thresholdgt_idr)   gt_xgt_ydet_id	detectiondetection_origdet_xdet_y
det_gt_iour   r   r   detection_filteringA   "   z(get_socre_A.<locals>.detection_filteringc                 S       t t| |||t|| dS .
        sigma = inter_area / gt_area
        r8   r&   roundr   r   rN   rO   rI   rJ   r   r   r   sigma_calculationS   
   z&get_socre_A.<locals>.sigma_calculationc                 S   2   t | |dkr	dS tt| |||t | | dS N        r   r8   r   r&   rW   r   rX   r   r   r   tau_calculationZ      z$get_socre_A.<locals>.tau_calculation	.DS_StorePascal_result.txtPascal_result_curved.txtPascal_result_non_curved.txtDeteval_result.txtDeteval_result_curved.txtDeteval_result_non_curved.txtr$   r   r   c                 S   r0   r   r1   r3   r   r   r   r6      r7   zget_socre_A.<locals>.<listcomp>r
   r8   r    r"   sigma
global_tauglobal_pred_strglobal_gt_strr.   )r   r   r   r&   zerosr>   rC   r@   r   rA   striprB   r   r%   )$gt_dirr   	allInputsr   r-   rQ   rY   r_   input_idrE   rF   dc_idr   cntanumlocal_sigma_tablelocal_tau_tablelocal_pred_strlocal_gt_strrH   r)   rK   rL   rM   pred_seq_strrN   rO   rI   rJ   
gt_seq_strglobal_sigmari   rj   rk   single_datar   r   r   get_socre_A   s~   




r~   c           %   
   C   sh  d}dd }dd }d!dd}d	d
 }dd }t |D ]}	|	dkr|	dkr|	dkr|	dkr|	dkr|	dkr|	dkr||}
|| | }||
|}
g }t t|D ]}|| d dkrh|| qYd}|D ]}|| }||= |d7 }qmtt|t|
f}tt|t|
f}i }i }t|D ]}\}}t|
dkrt|
D ]m\}}|}dd |d dD }tt	t
|}|d  }|dd d }|dd d }tt	t
t|d }tt	t
t|d }t|d  d }||||||||f< ||||||||f< |||< |||< qq|} |}!|}"|}#qi }$| |$d< |!|$d< |"|$d< |#|$d < |$S )"Nr   c                 S   r   r   r   r   r   r   r   r      r   z&get_socre_B.<locals>.input_reading_modc                 S   s   t d| |f }|d }|S )Nz%s/poly_gt_img%s.matZpolygt)ioZloadmat)ro   rH   r)   r   r   r   r-      s   z#get_socre_B.<locals>.gt_reading_modr.   c                 S   r/   )Nr$   r   r   r    c                 S   r0   r   r1   r3   r   r   r   r6      r7   z<get_socre_B.<locals>.detection_filtering.<locals>.<listcomp>r   r
   r8   c                 S   r9   r   r   r:   r   r   r   r6      r<   r=   rD   r   r   r   rQ      rR   z(get_socre_B.<locals>.detection_filteringc                 S   rS   rT   rV   rX   r   r   r   rY      rZ   z&get_socre_B.<locals>.sigma_calculationc                 S   r[   r\   r^   rX   r   r   r   r_      r`   z$get_socre_B.<locals>.tau_calculationra   rb   rc   rd   re   rf   rg   r$   r   r   c                 S   r0   r   r1   r3   r   r   r   r6      r7   zget_socre_B.<locals>.<listcomp>r
   r8   r    r"   rh   ri   rj   rk   rl   )r   r%   r   r   r&   rm   r>   rC   r@   r   rA   rn   rB   r   )%ro   Zimg_idr   rp   r   r-   rQ   rY   r_   rq   rE   rF   rr   r   rs   rt   ru   rv   rw   rx   ry   rH   r)   rK   rL   rM   rz   rN   rO   rI   rJ   r{   r|   ri   rj   rk   r}   r   r   r   get_socre_B   s~   




r   c                    s  t dd ddldd } fdd}d	d
  d fdd	} fdd} fdd}g }|D ]}	||	dddddf d q/|| |}
|||
}tt|
d ddD ]}|
| d dkrf|
| qWtt|
t|f}tt|
t|f}t	|
D ]i\}}t|dkrt	|D ]Z\}}|d j
d d }t|d |dd}|}|ddd }|ddd }tt|t|f}|dd }|}||||||f< ||||||f< qqi }||d< ||d< d|d< d|d< |S )z8
    get score for CentripetalText (CT) prediction.
    PolygonZPolygon3r   Nc                 S   sB   g }t | }t|D ]}|| d | |  d}|| q
|S )r   r   )transcriptionr	   )r   r   numpyr   )gt_labelr   rF   Znboxr   labelr   r   r   r-     s   z#get_score_C.<locals>.gt_reading_modc                    s"   |   }|  }||  | | S )Nr   )pDpGZareaAZareaBget_intersectionr   r   	get_union%  s   zget_score_C.<locals>.get_unionc                 S   s    | |@ }t |dkrdS | S )Nr   )r   r   )r   r   ZpIntr   r   r   r   *  s   z%get_score_C.<locals>.get_intersectionr.   c              	      s  |D ]}|d j d d }|d dkr|dkrt|d |dd}|}t| D ]J\}}|dd d }|dd d }	tt|	t|f}
|
dd }
|
}
z |
||
	  }W n
   t
|	|| Y ||krxg | |< q.d	d
 | D | d d < q| S )Nr	   r   r8   r   ###int32r   r   c                 S   r9   r   r   r:   r   r   r   r6   H  r<   z<get_score_C.<locals>.detection_filtering.<locals>.<listcomp>)r?   r&   r'   r   astyper   r>   concatenate	transposer   print)rE   rF   rG   r)   	point_numgt_prK   rL   rO   rN   det_prP   r   Zplgr   r   rQ   0  s:   

z(get_score_C.<locals>.detection_filteringc                    s"   |  dkrdS  | ||   S )rU   r]   r   r   r   r   r   r   r   rY   K     z&get_score_C.<locals>.sigma_calculationc                    s"   |   dkrdS  | ||    S )z-
        tau = inter_area / det_area
        r]   r   r   r   r   r   r   r_   S  r   z$get_score_C.<locals>.tau_calculationr   r   r   r   r	   r8   r   rh   ri   r!   rj   rk   rl   )r   r   r   r   r   r   popr&   rm   r>   r?   r'   r   r   r   )r   r   Zpred_bboxesr-   r   rQ   rY   r_   rE   r;   rF   idxrv   rw   rH   r)   rK   rL   r   r   rO   rN   r   datar   r   r   get_score_C  s^   

$



r   Tc                    s  ddd dg }g }g g | D ]}| |d  | |d   |d   |d  qd	}d	}d	}d	}d	}	d	}
fd
d} fdd} fdd}tt|D ]y}t|| }|| }|jd	 |jd | }| }d	}d	}tdf}tdf}|||||||||||
\}}}}}}}|	|7 }	|||||||||||
\}}}}}}}|	|7 }	|||||||||||
\}}}}}}}|	|7 }	qez|| }W n ty   d	}Y nw z|| }W n ty   d	}Y nw zd| | ||  }W n ty   d	}Y nw z
dt|	|  }W n ty3   d}Y nw zt|	| }W n tyH   d	}Y nw zt|	| }W n ty]   d	}Y nw zd| | ||  }W n tyv   d	}Y nw ||||	|||||||d}|S )Ngffffff?g333333?g?r8   rh   ri   rj   rk   r   c
                    s  d}
t D ]}t| |d d f k}|d jd }t||d d f k}|d jd }t| d d |d f k}|d jd }t|d d |d f k}|d jd }|dkr|dkr|dkr|dkr|d }|d }|d }|d }d|d|f< t| |d d f k}|	r | | }| |d  d  }||kr|
d7 }
n| | kr|
d7 }
d|d|f< q|||||||
fS Nr   r   g      ?)r   r&   wherer?   r%   lower)rv   rw   local_accumulative_recalllocal_accumulative_precisionglobal_accumulative_recallglobal_accumulative_precisiongt_flagdet_flagidyrec_flaghit_str_numrH   Z&gt_matching_qualified_sigma_candidatesZ*gt_matching_num_qualified_sigma_candidatesZ$gt_matching_qualified_tau_candidatesZ(gt_matching_num_qualified_tau_candidatesZ'det_matching_qualified_sigma_candidatesZ+det_matching_num_qualified_sigma_candidatesZ%det_matching_qualified_tau_candidatesZ)det_matching_num_qualified_tau_candidatesZmatched_det_id
gt_str_curpred_str_cur)rk   rj   num_gttptrr   r   
one_to_one  sv   
z#combine_results.<locals>.one_to_onec
                    s  d}
t D ]}|d|f dkrqt| |d d f dk}|d jd }|krt||d d f k|dd d f dk@ }|d jd }|dkr|||f kr| ||f kr|d }|d }|d }|d }d|d|f< d|d|f< |	r| | }| |d  d  }||kr|
d7 }
q| | kr|
d7 }
qt| ||f krd|d|f< d|d|f< |	r| | }| |d  d  }||kr|
d7 }
n| | kr|
d7 }
|  }||   }|  }||   }q|||||||
fS r   )r   r&   r   r?   r%   r   sum)rv   rw   r   r   r   r   r   r   r   r   r   rH   Znon_zero_in_sigmaZnum_non_zero_in_sigmaZqualified_tau_candidatesZnum_qualified_tau_candidatesr   r   )fsc_krk   rj   kr   r   r   r   r   one_to_many  sx   



z$combine_results.<locals>.one_to_manyc
                    sj  d}
t D ]$}|d|f dkrqt|d d |f dk}|d jd }|kr+t| d d |f k|dd d f dk@ }|d jd }|dkr|||f kr| ||f kr|d }|d }|d }|d }d|d|f< d|d|f< |	r| | }t|d }t |D ]-}|d  | }|| vrq| | }||kr|
d7 }
 n| | kr|
d7 }
 qt|||f kr+d|d|f< d|d|f< |	r| | }t|d }t |D ]1}|d  | }|| vrq| | }||kr|
d7 }
 n| | kr|
d7 }
 nq||   }|  }||   }|  }q|||||||
fS r   )r   r&   r   r?   r   r%   r   r   )rv   rw   r   r   r   r   r   r   r   r   r   rK   Znon_zero_in_tauZnum_non_zero_in_tauZqualified_sigma_candidatesZnum_qualified_sigma_candidatesr   Zgt_lenr   Z	ele_gt_idr   )r   rk   rj   r   num_detr   r   r   r   many_to_one  s   
$



z$combine_results.<locals>.many_to_oner   )total_num_gttotal_num_detr   hit_str_countrecall	precisionf_scoreseqerr
recall_e2eprecision_e2ef_score_e2e)	r   r   r   r&   r'   r?   rm   ZeroDivisionErrorr2   )Zall_datar   r|   ri   r   r   r   r   r   r   Z	hit_countr   r   r   r   rv   rw   r   r   r   r   r   r   r   r   r   r   r   r   finalr   )r   rk   rj   r   r   r   r   r   r   combine_results  s   2DR






r   )T)jsonr   r&   Zscipy.ior   Zppocr.utils.utilityr   Z#ppocr.utils.e2e_metric.polygon_fastr   r   r   r~   r   r   r   r   r   r   r   <module>   s    
sw