o
    'j0-                     @   s   d Z ddlZddlZddlZddlZddlmZ ddlZG dd dZ	dddZ
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd deZdS )z
This code is refer from:
https://github.com/open-mmlab/mmocr/blob/main/mmocr/models/textdet/postprocess/drrg_postprocessor.py
    N)normc                   @   s4   e Zd Zdd Zedd Zedd Zdd Zd	S )
Nodec                 C   s   || _ t | _d S N)
_Node__indset_Node__links)selfind r
   m/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddleocr/ppocr/postprocess/drrg_postprocess.py__init__   s   zNode.__init__c                 C   s   | j S r   )r   r   r
   r
   r   r	   !   s   zNode.indc                 C   s
   t | jS r   )r   r   r   r
   r
   r   links%   s   
z
Node.linksc                 C   s   | j | |j |  d S r   )r   add)r   Z	link_noder
   r
   r   add_link)   s   zNode.add_linkN)__name__
__module____qualname__r   propertyr	   r   r   r
   r
   r
   r   r      s    

r         I@c                 C   s  | j dksJ | jd dksJ | jd |jd ksJ |j dks#J t|ts*J tj| dd} i }t| D ]o\}}|d urw||d d df dd}||d d df dd}tj|dd}	tj|dd}
t	|	|
 }||krwd||< |d |d f|v rd||d |d f ||   ||d |d f< q7|| ||d |d f< q7tt
|  }dtjt|d tjd	 }t|jd ||< ||  }d
d |D }|D ]}||d  ||d   q||fS )N      r   Zaxis            ?)Zdtypec                 S   s   g | ]}t |qS r
   )r   .0noder
   r
   r   
<listcomp>J   s    z%graph_propagation.<locals>.<listcomp>)ndimshape
isinstancefloatnpsort	enumeratereshapemeanr   uniqueflattenZonesmaxint32Zaranger   )edgesscores
text_compsZedge_len_thr
score_dictiedgeZbox1Zbox2Zcenter1Zcenter2ZdistancenodesmappingZ
order_indsverticesr	   r
   r
   r   graph_propagation.   s:   r7   c                    s   t | tsJ tdd | D sJ t tsJ t  ts J g }t| } | rf|  h}g}|r]|dt fddjD }|| | | |	| |
| |s4|t| | s(|S )Nc                 S      g | ]}t |tqS r
   r#   r   r   r
   r
   r   r    S       z(connected_components.<locals>.<listcomp>r   c                    s,   g | ]}t tj|jg  kr|qS r
   )tuplesortedr	   )r   Zneighborlink_thrr   r1   r
   r   r    _   s
    )r#   listalldictr$   r   popr   difference_updateupdateextendappend)r4   r1   r>   clustersclusterZ
node_queueZ	neighborsr
   r=   r   connected_componentsQ   s.   





rI   c                 C   s|   t | tsJ tdd | D sJ tdd | D sJ t |ts$J t|}t| D ]\}}|D ]}|||j< q3q-|S )Nc                 S   r8   r
   r#   r?   )r   rH   r
   r
   r   r    m   r:   z#clusters2labels.<locals>.<listcomp>c                 S       g | ]}|D ]}t |tqqS r
   r9   )r   rH   r   r
   r
   r   r    o        )r#   r?   r@   intr%   Zzerosr'   r	   )rG   Z	num_nodesZnode_labelscluster_indrH   r   r
   r
   r   clusters2labelsk   s   
rO   c                    s   | j dksJ | jd |jd ksJ t| t|}|D ]}||k}t|dkr7d t|d d < q fddtt|D }| |d d f }|| }||fS )Nr   r   r   c                    s   g | ]} | s|qS r
   r
   )r   r2   Zsingle_flagsr
   r   r       s    z!remove_single.<locals>.<listcomp>)	r!   r"   r%   Z
zeros_liker*   sumwhererangelen)r0   comp_pred_labelspred_labelslabelZcurrent_label_flagZkeep_indZfiltered_text_compsZfiltered_labelsr
   rP   r   remove_singley   s   

rX   c                 C   s,   | d |d  d | d |d  d  d S )Nr   r   r   r   r
   )Zpoint1Zpoint2r
   r
   r   norm2   s   ,rY   c                 C   s  t | tsJ tdd | D sJ tdd | D sJ |  }g }g g g}i }i }|d |d< |d |d< ||d  |r|D ] }t||d }||d g||< t|d |}|d |g||< qBt| }	t| }
|	|
kr||	 d }||	 d }|d| 	|| 	|g || ||d< n"||
 d }||
 d }|
| 	|| 	|g || ||d< i }i }|s@ttj|}tt||j	d}|S )Nc                 S   r8   r
   rJ   r   pointr
   r
   r   r       r:   z$min_connect_path.<locals>.<listcomp>c                 S   rK   r
   )r#   rM   )r   r[   coordr
   r
   r   r       rL   r   r   )key)r#   r?   r@   copyremoverY   minkeysinsertindexrF   	functoolsreduceoperatorconcatr<   r   )pointsZpoints_queueshortest_pathZcurrent_edgeZ
edge_dict0Z
edge_dict1r[   Zlength0Zlength1key0key1startendr
   r
   r   min_connect_path   sH   


rn   c                 C   s*   |\}}t | t|t|fddk}|S )NFr   )cv2ZpointPolygonTestrM   )contr[   xyZis_innerr
   r
   r   
in_contour   s   rs   c           	      C   s  t | tsJ tdd | D sJ t |tsJ tdd |D s$J |j|j  kr1dks4J  J t| |d d d  }|d |d  d }|d	 |d  d }|d |d  d }|d	 |d  d }t||s| d|d   |d|d   nt||s| d|d	   |d|d   t||s| 	|d   |	|d   | |fS t||s| 	|d	   |	|d   | |fS )
Nc                 s       | ]}t |tV  qd S r   rJ   rZ   r
   r
   r   	<genexpr>       zfix_corner.<locals>.<genexpr>c                 s   rt   r   rJ   rZ   r
   r
   r   ru      rv   )r   r   r   r      r   r   )
r#   r?   r@   r"   r%   arrayrs   rb   tolistrF   )	top_linebot_lineZ	start_boxZend_boxZcontourZstart_left_midZstart_right_midZend_left_midZend_right_midr
   r
   r   
fix_corner   s0    



r|   c                 C   s  | j dksJ t| t|ksJ g }t| dk r|S tdtt|d D ]}t||k}| |d df dtj	}t
| |df }|jd dk rPq'|jd dkrtj
|ddtj	 }t|}|| }tj
|d d ddd d f ddtj	 }	tj
|d d ddd d f ddtj	 }
t|	|
|d |d \}	}
|	|
d d d  }n'|dddd d f tj	 }	|ddddd d f tj	 }
|	|
 }d	d
 |D |g }|| q'|S )Nr   r   r   r   )r   r   r   r   r   r   c                 S   s   g | ]	}|D ]}|qqS r
   r
   )r   r\   pr
   r
   r   r       s    z$comps2boundaries.<locals>.<listcomp>)r!   rT   rS   rM   r%   r,   rR   r(   Zastyper-   r)   r"   ry   rn   r|   rF   )r0   rU   
boundariesrN   Zcluster_comp_indsZtext_comp_boxesZscoreZcentersri   rz   r{   Zboundary_pointsboundaryr
   r
   r   comps2boundaries   sN   "$r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	DRRGPostprocesszMerge text components and construct boundaries of text instances.

    Args:
        link_thr (float): The edge score threshold.
    c                 K   s   t |tsJ || _d S r   )r#   r$   r>   )r   r>   kwargsr
   r
   r   r   	  s   
zDRRGPostprocess.__init__c                 C   s  |\}}}|duret |tjr| }t |tjr| }t |tjr'| }t|t|ks1J |jdks8J |jd dksAJ t|||\}}t||| j	}t
||jd }	t||	\}}	t||	}
ng }
| |
d|dddf   ddd \}
}t|
|dg}|S )aw  
        Args:
            edges (ndarray): The edge array of shape N * 2, each row is a node
                index pair that makes up an edge in graph.
            scores (ndarray): The edge score array of shape (N,).
            text_comps (ndarray): The text components.

        Returns:
            List[list[float]]: The predicted boundaries of text instances.
        Nr   r   	   r   r   )rh   r/   )r#   paddleZTensornumpyrT   r!   r"   r7   rI   r>   rO   rX   r   resize_boundaryry   rA   )r   predsZ
shape_listr.   r/   r0   r6   r1   rG   rV   r~   Zboxes_batchr
   r
   r   __call__  s,   
"zDRRGPostprocess.__call__c                 C   s   g }g }|D ]?}t |}||d  t|d|d  t|dd t|d d d|d    }|t|ddg q||fS )aF  Rescale boundaries via scale_factor.

        Args:
            boundaries (list[list[float]]): The boundary list. Each boundary
            with size 2k+1 with k>=4.
            scale_factor(ndarray): The scale factor of size (4,).

        Returns:
            boundaries (list[list[float]]): The scaled boundaries.
        r   Nr   r   )	rT   rF   r%   rx   ZtilerM   r(   r+   ry   )r   r~   Zscale_factorZboxesr/   bszr
   r
   r   r   1  s   
zDRRGPostprocess.resize_boundaryN)r   r   r   __doc__r   r   r   r
   r
   r
   r   r     s
    $r   )r   )r   rd   rf   r   r%   r   Znumpy.linalgr   ro   r   r7   rI   rO   rX   rY   rn   rs   r|   r   objectr   r
   r
   r
   r   <module>   s$   
#-&