o
    *j+                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d,ddZ	ej
d d gejdd fddZdd Zd	d
 Zdd Zdd Zd-ddZdd Zd.ddZd/ddZd0ddZd1ddZd2dd Zd!d" Zd#d$ Zd%d& Z	'	(	)d3d*d+ZdS )4    Nc                 C   sX   t | j}t||||dd}t| jd D ]}t| |ddf |||ddf< q|S )N   )invr      )npzerosshapeget_affine_transformrangeaffine_transform)Zcoordscenterscaleoutput_sizerotZtarget_coordstransp r   p/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/cv/ocr_utils/table_process.pytransform_preds   s
   $r   Zdtypec                 C   s  t |tjst |tstj||gtjd}|}|d }|d }|d }	tj| d }
td|d g|
}td|d gtj}tjdtjd}tjdtjd}| ||  |dd d f< | | ||  |dd d f< |d |	d g|dd d f< t|d |	d gtj| |dd d f< t	|dd d f |dd d f |dd d d f< t	|dd d f |dd d f |dd d d f< |rt
t|t|}|S t
t|t|}|S )	Nr   r   r      g      )   r         ?r   )
isinstancer   Zndarraylistarrayfloat32piget_dirr   get_3rd_pointcv2ZgetAffineTransform)r   r   r   r   shiftr   Z	scale_tmpZsrc_wZdst_wZdst_hrot_radsrc_dirZdst_dirsrcdstr   r   r   r   r      s,   *22r   c                 C   s8   t j| d | d dgt jdj}t ||}|d d S )Nr   r   g      ?r   r   )r   r   r   Tdot)pttZnew_ptr   r   r   r
   <   s    r
   c                 C   sZ   t |t |}}ddg}| d | | d |  |d< | d | | d |  |d< |S Nr   r   )r   sincos)Z	src_pointr!   ZsncsZ
src_resultr   r   r   r   B   s
   r   c                 C   s*   | | }|t j|d  |d gt jd S )Nr   r   r   )r   r   r   )abdirectr   r   r   r   L   s   "r   c                 C   s   t j|  ddd}|S )Ng-C6?gH.?)minmax)torchclampZsigmoid_)xyr   r   r   _sigmoidQ   s   r6   c                 C   sf   |  d}|d| d| d|}| d|} |d ur1|d| }| | } | d|} | S )Nr   r   r   )sizeZ	unsqueezeexpandZgatherZ	expand_asview)featindmaskdimr   r   r   _gather_featV   s   
 r?   c                 C   s<   |  dddd } | | dd| d} t| |} | S )Nr   r   r   r   r7   )Zpermute
contiguousr:   r8   r?   )r;   r<   r   r   r   _tranpose_and_gather_feata   s   
rA   r   c                 C   s<   |d d }t jj| ||fd|d}|| k }| | |fS )Nr   r   )Zstridepadding)nnZ
functionalZ
max_pool2dfloat)heatZkernelpadZhmaxkeepr   r   r   _nmsh   s   rH   (   c                 C   s   |   \}}}}t| ||d|\}}|||  }||   }||   }	t||d|\}
}||  }t||dd|||}t||dd|||}t|	|dd|||}	|
||||	fS )Nr7   r   )r8   r2   Ztopkr:   intrD   r?   )scoresKbatchcatheightwidthZtopk_scoresZ	topk_indsZtopk_ysZtopk_xsZ
topk_scoreZtopk_indZ
topk_clsesr   r   r   _topkq   s   rQ   d   c           
      C   s<   |   \}}}}t| |}||||}t|d\}}	|	S )Nr   )r8   rA   r:   r2   r1   )
rE   indsrL   rM   rN   rO   rP   Zscore_Typer   r   r   decode_by_ind   s
   
rV   c                 C   s  |   \}}}}t| \} }t| |d\}	}
}}}|d urRt||
}|||d}|||d|d d d d ddf  }|||d|d d d d ddf  }n|||dd }|||dd }t||
}|||d}|||d }|	||d}	tj||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  gdd}tj||	|gdd}||
fS )NrL   r   r   r   r      .r               r>   r8   rH   rQ   rA   r:   rD   r2   rN   )rE   ZwhregrL   rM   rN   rO   rP   rG   rK   rS   clsesysxsbboxesZ
detectionsr   r   r   bbox_decode   s8   
(*

rd     c                 C   s  |   \}}}}t| \} }t| |d\}	}
}}}|d urRt||
}|||d}|||d|d d d d ddf  }|||d|d d d d ddf  }n|||dd }|||dd }|	||d}	|||d }t||
}tj||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  gdd}tj||||	|gdd|fS )NrW   r   r   r   r   .r   rY   rZ   r[   r\   rX   r]   r^   )mkZst_regr_   rL   rM   rN   rO   rP   rG   rK   rS   r`   ra   rb   Zst_Regrc   r   r   r   gbox_decode   s4   
(*

rg   c                 C   s  t | jd D ]~}t| |d d ddf || || ||f| |d d ddf< t| |d d ddf || || ||f| |d d ddf< t| |d d ddf || || ||f| |d d ddf< t| |d d ddf || || ||f| |d d ddf< q| S )Nr   r   rY   r[   rX   r	   r   r   )bboxcshwir   r   r   bbox_post_process   s   >>>@ro   c                 C   sN  t | jd D ]}t| |d d ddf || || ||f| |d d ddf< t| |d d ddf || || ||f| |d d ddf< t| |d d ddf || || ||f| |d d ddf< t| |d d ddf || || ||f| |d d ddf< t| |d d ddf || || ||f| |d d ddf< q| S )Nr   r   rY   r[   rX   
   rh   )gboxrj   rk   rl   rm   rn   r   r   r   gbox_post_process   s   >>>>"rr   c                 C   s  t | dk r| S g }g }tt | D ]0}| | }|d |k r" n"d}| | d | | d  | | d  | | d  d }| | d | | d  | | d	  | | d
  d }tt | D ]}	||	ksl| |	 d |k rn n| |	 d | |	 d }
}| |	 d | |	 d }}| |	 d | |	 d	 }}| |	 d | |	 d
 }}||
 ||  || ||
   }|| ||  || ||   }|| ||  || ||   }|
| ||  || ||   }|dkr|dkr|dkr|dks|dk r-|dk r-|dk r-|dk r-| | d | |	 d kr|dk r|}q^| | d | |	 d k r-d} nq^|dkr9|| q|dkrC|| qtdt |D ]}|| ||   qKt|S )Nr   rX   r7   r   rY   r[   r   r   rZ   r\   )lenr	   appendr   r   )detsZthreshZ
index_keeprG   rn   boxZmax_score_indexctxctyjx1y1x2y2x3y3x4y4r-   r.   rj   dr   r   r   nms   sL   44    6$



r   333333?r   r   c              
   C   s  dd }dd }t | }tt|df}t|D ]\}	}
|
d |k r' | S |
d |
d g}tddD ]}|
d	| d	  |
d	| d
  g}||||k rNq4t|D ]\}}|d |k r^ nt|| dkrgqRt|d |d  t|d |d	   d	 }t|d
 |d  t|d |d   d	 }t	||}|||rd\}}tddD ]}|||d	|  |d	| d  g}||k r|}|}q|dkr||| k r|| | dkr|d | | d	| < |d | | d	| d < d|| |< qRq4q| S )Nc                 S   s"  | d | d | d | d f\}}}}| d | d | d | d f\}}}}	|d |d }
}|| ||  || |
|   }|| ||  || |
|   }|| ||  |	| |
|   }|| ||	  ||	 |
|   }|dkr}|dkr}|dkr}|dks|dk r|dk r|dk r|dk rd	S d
S )Nr   r   r   r   rY   rZ   r[   r\   TFr   )rw   pointr{   r|   r}   r~   r   r   r   r   rx   ry   r-   r.   rj   r   r   r   r   point_in_box  s   $$    8z(group_bbox_by_gbox.<locals>.point_in_boxc                 S   sF   t | d |d  | d |d   | d |d  | d |d    S r)   )mathsqrt)Zpt1Zpt2r   r   r   get_distance  s   "z(group_bbox_by_gbox.<locals>.get_distancerY   rp   r   r   r   r   rX   r[   rZ   r\   )g     @r7   r7   )
copydeepcopyr   r   rt   	enumerater	   sumabsr1   )rc   ZgboxesZscore_thredZv2c_dist_thredZc2v_dist_thredr   r   rv   signidxrq   Zvertexrn   r   kri   rm   rl   mZmin_distZmin_idrz   distr   r   r   group_bbox_by_gbox  sN   
 ,,

r   )r   )N)r   )rI   )rR   )NrR   )Nre   )r   r   r   )r   r   randomr   numpyr   r2   Ztorch.nnrC   r   r   r   r   r
   r   r   r6   r?   rA   rH   rQ   rV   rd   rg   ro   rr   r   r   r   r   r   r   <module>   s:   

$



	


%	)