o
    ॵi+                     @   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)coordscenterscaleoutput_sizerottarget_coordstransp r   c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/ocr_utils/table_process.pytransform_preds   s
   $r   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   ndarraylistarrayfloat32piget_dirr   get_3rd_pointcv2getAffineTransform)r   r   r   r   shiftr   	scale_tmpsrc_wdst_wdst_hrot_radsrc_dir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t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)	src_pointr*   sncs
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clampsigmoid_)xyr   r   r   _sigmoidQ   s   rE   c                 C   sf   |  d}|d| d| d|}| d|} |d ur1|d| }| | } | d|} | S )Nr   r   r   )size	unsqueezeexpandgather	expand_asview)featindmaskdimr   r   r   _gather_featV   s   
 rQ   c                 C   s<   |  dddd } | | dd| d} t| |} | S )Nr   r   r   r   rF   )permute
contiguousrL   rG   rQ   )rM   rN   r   r   r   _tranpose_and_gather_feata   s   
rT   r   c                 C   s<   |d d }t jj| ||fd|d}|| k }| | |fS )Nr   r   )stridepadding)nn
functional
max_pool2dfloat)heatkernelpadhmaxkeepr   r   r   _nmsh   s   r`   (   c                 C   s   |   \}}}}t| ||d|\}}|||  }||   }||   }	t||d|\}
}||  }t||dd|||}t||dd|||}t|	|dd|||}	|
||||	fS )NrF   r   )rG   r@   topkrL   intrZ   rQ   )scoresKbatchcatheightwidthtopk_scores	topk_indstopk_ystopk_xs
topk_scoretopk_ind
topk_clsesr   r   r   _topkq   s   rq   d   c           
      C   s<   |   \}}}}t| |}||||}t|d\}}	|	S )Nr   )rG   rT   rL   r@   r?   )
r[   indsre   rf   rg   rh   ri   score_Typer   r   r   decode_by_ind   s
   
rw   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re   r   r   r   r      .r               rP   rG   r`   rq   rT   rL   rZ   r@   rg   )r[   whregre   rf   rg   rh   ri   r_   rd   rs   clsesysxsbboxes
detectionsr   r   r   bbox_decode   s8   
(*

r     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 )Nrx   r   r   r   r   .r   rz   r{   r|   r}   ry   r~   r   )mkst_regr   re   rf   rg   rh   ri   r_   rd   rs   r   r   r   st_Regr   r   r   r   gbox_decode   s4   
(*

r   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   rz   r|   ry   r	   r   r   )bboxcshwir   r   r   bbox_post_process   s   >>>@r   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   rz   r|   ry   
   r   )gboxr   r   r   r   r   r   r   r   gbox_post_process   s   >>>>"r   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   ry   rF   r   rz   r|   r   r   r{   r}   )lenr	   appendr   r   )detsthresh
index_keepr_   r   boxmax_score_indexctxctyjx1y1x2y2x3y3x4y4r;   r<   r   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   rz   r{   r|   r}   TFr   )r   pointr   r   r   r   r   r   r   r   r   r   r;   r<   r   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 r4   )mathsqrt)pt1pt2r   r   r   get_distance  s   "z(group_bbox_by_gbox.<locals>.get_distancerz   r   r   r   r   r   ry   r|   r{   r}   )g     @rF   rF   )
copydeepcopyr   r   r   	enumerater	   sumabsr?   )r   gboxesscore_thredv2c_dist_thredc2v_dist_thredr   r   r   signidxr   vertexr   r   kr   r   r   mmin_distmin_idr   distr   r   r   group_bbox_by_gbox  sN   
 ,,

r   )r   )N)r   )ra   )rr   )Nrr   )Nr   )r   r   r   )r   r   randomr#   numpyr   r@   torch.nnrW   r   r   r   r   r
   r!   r"   rE   rQ   rT   r`   rq   rw   r   r   r   r   r   r   r   r   r   r   <module>   s:   

$



	


%	)