o
    *j                     @   sV  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lZd dl	Z
d dlZddlmZ ejdkr5ejjZejejdd ejjjZejjddd	 d
ZdZdZdZdZdZdZdZd ZdZdZ d Z!d
Z"dd Z#d[ddZ$						d\ddZ%							d]ddZ&							d]ddZ'							d^dd Z(							d^d!d"Z)						d\d#d$Z*d%d& Z+d'd( Z,d)d* Z-					d_d+d,Z.d`d-d.Z/d`d/d0Z0d1d2 Z1d[d3d4Z2d5d6 Z3d7d8 Z4d9d: Z5d;d< Z6d=d> Z7d?d@ Z8dAdB Z9dCdD Z:dEdF Z;dGdH Z<dIdJ Z=dKdL Z>dMdN Z?dOdP Z@dQdR ZAdSdT ZBdUdV ZCdWdX ZDdYdZ ZEdS )a    N   )utilsz2.0T)Z
known_onlyweight_init_methodxavierzWeight initialization method                  c                 C   sZ   t jt jt jtd| }dtt	 dd t
}t|| t|}|S )z'
  Load TensorFlow operator library.
  z	lib{0}.soz/tmp/lib{0}_{1}.soNr   )ospathjoindirnamerealpath__file__formatstruuiduuid4ZLIB_NAMEshutilcopyfiletfZload_op_library)Zlib_nameZlib_pathZlib_copy_pathZoplib r   f/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/cv/ocr_utils/ops.py
load_oplib0   s   
r   c                 K   s  |dkr
t d}nn|dkrDt|dkr)|dd \}}}td|| |  }	nt|dkr;|\}}
td	|
 }	nd
t d|	}n4|dkr\t|dkrUt jj }n#t jj }nt	|t
rtt|dksiJ t |d |d }nd| t j| ||d}|durt || |S )a7  
  Create or reuse a variable
  ARGS
    name: variable name
    shape: variable shape
    init_method: 'zero', 'kaiming', 'xavier', or (mean, std)
    collection: if not none, add variable to this collection
    kwargs: extra parameters passed to tf.get_variable
  RETURN
    var: a new or existing variable
  zero        Zkaimingr	   Nr          @r
         ?zUnsupported shaper   r   r   z*Unsupported weight initialization method: )shapeinitializer)r   Zconstant_initializerlenmathsqrtZtruncated_normal_initializerZkerasZinitializersZglorot_normal
isinstancetupleZget_variableZadd_to_collection)namer!   Zinit_method
collectionkwargsr"   Zkhkwn_inZinit_stdn_outvarr   r   r   _nn_variableA   s2   

r/   SAMEFc
                 K   s  |pt j}|
dd}|dkrr|  d }|  d }|| dkr)t|| d}n	t|||  d}|| dkr@t|| d}n	t|||  d}|d }|| }|d }|| }tddg||g||gddgg}t| |d}n| }t|	pyd_ t	d	||||g|fd
|rdnd i|
}tj
j||d||dgdd}|du rt	d|gdfd
|rdnd i|
}tj
||}|}|du rtj
|}W d    ||fS W d    ||fS 1 sw   Y  ||fS )N	trainableTr0   r   r
   r   ZCONSTANTconv2dweightr)   weightsZVALIDpaddingbiasr   biases)FLAGSr   get	get_shapemaxr   constantpadvariable_scoper/   nnr2   bias_addrelu)xr,   r-   ksizestrider6   weight_initr7   rB   scoper*   r1   Z	in_heightZin_widthZpad_along_heightZpad_along_widthZ
pad_bottompad_top	pad_rightpad_leftZpaddingsZinput_paddedkernelZycZybyr   r   r   r2   l   sh   




r2   group_conv2dc                 K   s   t |  d }t| t|| g| |}g }t|D ]!}t|| || || ||||||	d|
|f d
\}}|| qtj|||
d d}tj	
|}	||	fS )Nr   %s_%drD   rE   r6   rF   r7   rB   rG   _concatvaluesaxisr(   )r#   r;   r   splitintranger2   appendconcatr@   rB   )rC   r,   r-   rD   rE   groupr6   rF   r7   rB   r(   r*   
group_axissplits	conv_listi
conv_split
relu_splitconvr   r   r   group_conv2d_relu   s(   

ra   c                 K   s   t |  d }t| t|| g| |}g }t|D ]!}t|| || || ||||||	d|
|f d
\}}|| qtj|||
d d}t	|
d  tj
j|ddd	d	d
}W d    n1 sew   Y  tj|}	||	fS )Nr   rN   rO   rP   rQ   _bn?h㈵>TZmomentumepsilonscaleZtraining)r#   r;   r   rT   rU   rV   r2   rW   rX   r?   layersbatch_normalizationr@   rB   )rC   r,   r-   rD   rE   rY   r6   rF   r7   rB   r(   r*   rZ   r[   r\   r]   r^   r_   r`   bnr   r   r   group_conv2d_bn_relu   s2   


rk   next_conv2dc                 K      t | ||d fdd||||	|
d d|\}}t||d |d f|||||||	|
d d|\}}t ||d |fdd||||	|
d d|\}}||fS Nr
   r   Z_arO   _b)rD   rE   rY   r6   rF   r7   rB   r(   Z_c)	conv_relura   rC   r,   r-   rD   rE   rY   r6   rF   r7   rB   r(   r*   Zconv_aZrelu_aZconv_bZrelu_bZconv_cZrelu_cr   r   r   	next_conv   ^   


rr   c                 K   rm   rn   )conv_bn_relurk   rq   r   r   r   next_conv_bn%  rs   ru   c
                 K   s   |pt j}|
dd}t|	pdY td||||g|fd|r!dnd i|
}tjj| |d||dg|d}|du rQtd	|gd
fd|rDdnd i|
}tj||}|du rctj	|}W d    |S W d    |S 1 snw   Y  |S )Nr1   Tr2   r3   r)   r4   r   r5   r7   r   r8   )
r9   r   r:   r   r?   r/   r@   r2   rA   rB   )rC   r,   r-   rD   rE   r6   rF   r7   rB   rG   r*   r1   rK   rL   r   r   r   
conv2d_ori\  s>   




rv   c                  O   &   d|d< d|vrd|d< t | i |S NTrB   rG   rp   )r2   argsr*   r   r   r   rp        rp   c                  O   s   d|d< d|vrd|d< t | i |\}}t|d d  tjj|ddddd}W d    n1 s4w   Y  tj|}||fS )	NTrB   rG   rp   rb   rc   rd   re   )r2   r   r?   rh   ri   r@   rB   )rz   r*   r`   rB   rj   Zbn_relur   r   r   rt     s   
rt   c                  O   rw   rx   )rv   ry   r   r   r   conv_relu_ori  r{   r|   c
                 K   s   |pt j}|
dd}t|	pdN td||||g|fd|r!dnd i|
}tjj| |||d}|du rMtd|gd	fd|r@d
nd i|
}tj||}|du rWtj	|}|W  d    S 1 scw   Y  d S )Nr1   Tatrous_conv2dr3   r)   r4   r5   r7   r   r8   )
r9   r   r:   r   r?   r/   r@   r}   rA   rB   )rC   r,   r-   rD   Zdilationr6   rF   r7   rB   rG   r*   r1   rK   rL   r   r   r   r}     s4   


$r}   c              	   C   V   t |pd t j| d||dgd||dg|}W d    |S 1 s$w   Y  |S )Navg_poolr   )r   r?   r@   r   rC   rD   rE   r6   rG   rL   r   r   r   r        
r   c              	   C   r~   )Nmax_poolr   )r   r?   r@   r   r   r   r   r   r     r   r   c                 C   s2   t t | t j|dd}t j||}t |S )zl
  Classification loss
  ARGS
    gt_labels: int32 [n]
    match_scores: [n, n_classes]
  RETURN
    loss
  r    r   )r   Zone_hotcastZint64r@   Z!softmax_cross_entropy_with_logits
reduce_sum)Z	gt_labelsZmatch_scoresZ	n_classesZ
embeddingsZlossesr   r   r   
score_loss  s   	
r   c                 C   s   t |pd: t |}t | | }t t |dt j}d| }dt | | }|d | }t || dW  d   S 1 sDw   Y  dS )z
  Smooth L1 loss between offsets and encoded_gt
  ARGS
    offsets: [m?, 5], predicted offsets for one example
    gt_offsets: [m?, 5], corresponding groundtruth offsets
  RETURN
    loss: scalar
  smooth_l1_lossr          ?r   N)	r   r?   Zstop_gradientabsr   lessfloat32Zsquarer   )offsetsZ
gt_offsetsrG   diffZlesser_maskZlarger_maskZlosses1Zlosses2r   r   r   r     s   	
$r   c                 C   s  | d }| d }| d }| d }| d }| d }| d }| d }|| | | d }	|| | | d }
t ||||}t ||||}t|	|
||||}t|	|
||||}|| }|| d }t|| || }t|| || }|| d }t|	|
|||gS )	Nr   r   r
   r   r	   r   r      )
point_distpoint_line_distnparctan2array)Zpolygonx1y1x2y2Zx3Zy3Zx4Zy4Zc_xZc_yZw1Zw2Zh1h2hwZtheta1Ztheta2thetar   r   r   polygon_to_rboxe  s(   r   c                 C   s&   t ||  ||   || ||   S N)r   r%   )r   r   r   r   r   r   r   r     s   &r   c                 C   s\   d}|| }|| }t || ||  | }	t | | ||  ||  ||  |	 }
|
S )Nư>)r   r%   r   )Zpxpyr   r   r   r   epsZdxZdydivdistr   r   r   r     s   *r   c              	   C   s*  |d }|d }t ||dft j}t| jd D ] }t t t| |d d f t j	d}t
||gddd qt
|t
j}t
|ddt
j\}}	t
|	t
jt
j\}
}}t|dkr|d }t
|}|D ]}t
||kry|}t
|}qit
|}t t
|d}|S t g d	}|S )
Nr   r   r   )r   r   r
   )   r   r   r      r   )r   r   r   r   r   r   r   r   )r   zerosZuint8rV   r!   reshaper   r   Zrboxes_to_polygonsint32cv2ZdrawContoursZcvtColorZCOLOR_BGR2GRAY	thresholdZTHRESH_BINARYZfindContoursZ	RETR_TREEZCHAIN_APPROX_SIMPLEr#   ZcontourAreaZminAreaRectZ	boxPoints)ZrboxesZresize_sizeZimage_wZimage_hZimgr]   segmentZimg2grayretZthreshZim2ZcontoursZ	hierarchyZcntZmax_areacontrectZcombined_polygonr   r   r   get_combined_polygon  s6   




r   c                  C   sd  t | } | jdksJ d| jd dksJ dt| dkrG| d }| d }| d	 }| d
 }| d }| d }t ||}t |||||gS | d d df }| d d df }	| d d df }
| d d df }t | |
 }t |}t 	|	||  }||	 | ||  |d d  }|| |	 ||  | |d d  }t 
||fd}d}d}d}tt|D ]4}||d d f }t|d t|D ] }||d d f }t t || d }||kr|}|}|}qq|dkr|dksJ | |d d f }| |d d f }|d d |d d  d \}}t 	| d d df }||d |d  d  }|||||fS )Nr
   zinvalid segs ndimr   r   zinvalid segs shaper   )r   r   )r   r   )r   r
   )r   r   )r   r	   )r   r   r   r	   r   r   r   )r   asarrayndimr!   r#   r   r   sumtanmeanstackrV   r%   ) ZsegsZcxcyr   r   Z	theta_sinZ	theta_cosr   ZcxsZcysZ
theta_cossZ
theta_sinsZ	bar_thetakbZproj_xsZproj_ysZproj_pointsZmax_distZidx1Zidx2r]   Zpoint1jZpoint2r   Zseg1Zseg2ZbcxZbcyZbhbwr   r   r   combine_segs-  sV   

 $ r   c                 C   s$  d}g }g }t |D ]M}|| }| |d d d d f }||d d f }	g }
t |D ]!}|t|	|kd d d f }|jd dkrJt|}|
| q)||
 |t|
 q
t|}t |D ]"}|| |ks|||  tdg g }t	|| t
|f||< qat|tjt|tjfS )Nr   r   r   )rV   r   wherer!   r   rW   r#   r<   RBOX_DIMvstackr   r   r   r   )Zsegments_batchZgroup_indices_batchZsegment_counts_batch
batch_sizeZcombined_rboxes_batchZcombined_counts_batchimage_idZgroup_countsegmentsgroup_indicescombined_rboxesr]   Zsegments_groupZcombined_rbox	max_countZcombined_rboxes_padr   r   r   combine_segments_batchc  sB   




r   c                 C   s(   t t| ||gt jt jg\}}||fS r   )r   py_funcr   r   r   )r   r   segment_countsr   Zcombined_countsr   r   r   combine_segments_python  s
   

r   c                 C   s  | |d d k rd}| |d d  }| |d d  }n| |d d k rBd}| |d d  |d d  }| |d d  |d d  }n| |d d k rid}| |d d  |d d  }| |d d  |d d  }nl| |d d k rd}| |d d  |d d  }| |d d  |d d  }nE| |d d k rd}| |d d  |d d  }| |d d  |d d  }nd}| |d d  |d d  }| |d d  |d d  }|||fS )Nr   r   r
   r   r	   r   r   )r   map_sizeoffsets_defaultsl_idxrC   rL   r   r   r   	get_coord  s0   
r   c                 C   s|   | |d d k r| t  }| t  }n| |d d  t t  |d d  }| |d d  t t  }t|||\}}}||||fS Nr   r   )N_LOCAL_LINKSN_CROSS_LINKSr   )r   r   r   Zoffsets_nodelink_idxr   rC   rL   r   r   r   get_coord_link  s   

r   c                 C   s8   ||  d }||  d }|dko||k o|dko||k S r   r   )r   rC   rL   r   r   r   r   r   r   is_valid_coord  s    r   c                 C   s  | dkr?d|d |d fd||d fd|d |d fd|d |fd|d |fd|d |d fd||d fd|d |d fg}nj| |d |d f| ||d f| |d |d f| |d |f| |d |f| |d |d f| ||d f| |d |d f| d d| d| f| d d| d d| f| d d| d| d f| d d| d d| d fg}g }d}|D ]Z\}}	}
t ||	|
|r|| d || d |
  |	 }| dkr||  d ||  d | | t  | }n||  d | | tt  }||  d | | }||||g |d7 }q|S )Nr   r   r
   )r   r   r   rW   )r   rC   rL   r   r   ZcoordZneighbours_offsetsr   Znl_idxnxnyZneighbours_offset_nodeZneighbours_offset_linkZoff_tmpr   r   r   get_neighbours  sX   ,((($0

r   c              
      s   d t j fdd|D dd}t j fdd|D dd}t j fdd|D dd}t t|||| t |gt jt jt jt jg\}}	}
}||	|
|fS )Nr   c                       g | ]}t | d tgqS r   r   r   N_SEG_CLASSES.0or   r   r   
<listcomp>      z0decode_segments_links_python.<locals>.<listcomp>rS   c                    r   r   r   r   N_LNK_CLASSESr   r   r   r   r     r   c                    r   r   r   r   
OFFSET_DIMr   r   r   r   r     r   )r   rX   r   decode_batchr=   r   r   
image_size	all_nodes	all_linksall_reganchor_sizesZall_nodes_flatZall_links_flatZall_reg_flatr   r   r   Zgroup_indices_allr   r   r   decode_segments_links_python  s(   r   c              
      s   t j tj fdd|D dd}tj fdd|D dd}tj fdd|D dd}tt|||| t|gtjtjtjtjg\}}	}
}||	|
|fS )Nc                    r   r   r   r   r   r   r   r     r   z/decode_segments_links_train.<locals>.<listcomp>r   r   c                    r   r   r   r   r   r   r   r     r   c                    r   r   r   r   r   r   r   r     r   )	r9   Ztrain_batch_sizer   rX   r   r   r=   r   r   r   r   r   r   decode_segments_links_train  s(   r   c              	   C   s`  | j d }g }g }g }g }	t|D ]C}
| |
d d d d f }||
d d d d f }||
d d d d f }t|||||\}}}}|| || || |	| qt|}t|D ]7}
||
 |ks|||
  tdg g }t||
 t|f||
< t	||
 t|||
  dg f||
< q^t
|tjt
|tjt
|tjt
|	tjfS )Nr   r   r   )r!   rV   decode_imagerW   r   r<   r   r   r   Zhstackr   r   r   )r   r   r   r   r   r   Zbatch_segmentsZbatch_group_indicesZbatch_segments_countsZbatch_group_indices_allr   image_node_scoresimage_link_scores	image_regimage_segmentsimage_group_indicesimage_segments_countsimage_group_indices_allr   Zbatch_segments_padr   r   r   r     sZ   






r   c                 C   s"  g }g }d}d}t tD ]I}	|||g ||dd|	    |||	 d ||	 d  7 }|	dkrC|||	 d ||	 d  t 7 }q|||	 d ||	 d  tt  7 }qt| |tjtj||}
|
d8 }
|
t	
|
dkd  }t|}t	j|tft	jd}tt	
|
dkd D ]\}	}||df }||df }||df }||df }||df }||df }t|||\}}}|| }d}|| dd|  |d	   ||	df< || dd|  |d	   ||	df< t	|| | ||	df< t	|| | ||	df< |||	df< |||	df< q||||
fS )
Nr   r
   r   Zdtyper   r	   r   r   r   )rV   N_DET_LAYERSrW   r   r   decode_image_by_joinr9   node_thresholdlink_thresholdr   r   r#   r   r   r   	enumerater   exp)r   r   r   r   r   r   r   Zoffsets_default_nodeZoffsets_default_linkr]   r   r   r   r   r   Z
encoded_cxZ
encoded_cyZencoded_widthZencoded_heightZencoded_theta_cosZencoded_theta_sinr   rC   rL   rsr   r   r   r   r   '  sd   
$$r   c                    s(  | d d t f |k|d d t f |k}ttjd tdkd fdd fdd fdd fd	d
fdd}fdd}d}	tD ]9\}
}t|||\}}}t|||||}t|D ]\}}||d  }|d  }|r|r|	d7 }	|||d  qnqU| }|S )Nr   r   c                        |  S r   r   point
group_maskr   r   find_parent`     z)decode_image_by_join.<locals>.find_parentc                       | | < d S r   r   r   parentr   r   r   
set_parentc     z(decode_image_by_join.<locals>.set_parentc                        | dkS Nr   r   r   r  r   r   is_rootf  r  z%decode_image_by_join.<locals>.is_rootc                    6   | }d}|s |}d}|r|r| | |S NFTr   r   rootZupdate_parentr  r  r  r   r   	find_rooti     
z'decode_image_by_join.<locals>.find_rootc                    s*    | } |}||kr|| d S d S r   r   p1p2Zroot1root2)r  r  r   r   r   v  
   z"decode_image_by_join.<locals>.joinc                     N   i   fdd} t jt jd}tD ]\}}|}| |}|||< q|S )Nc                        |  vrt  d  | <  |  S Nr   r#   r  Zroot_mapr   r   	get_index     z8decode_image_by_join.<locals>.get_all.<locals>.get_indexr   r   
zeros_liker   r   )r  maskr]   r   
point_rootbbox_idx)r  	node_maskoffsets_posr  r   get_all}     
z%decode_image_by_join.<locals>.get_all)	POS_LABELr   r!  r   r   r   r   r   )node_scoreslink_scoresr   r   r   r   	link_maskr   r'  pos_linkr]   r   r   rC   rL   
neighboursZn_idxnoffsetsZ
link_valuenode_clsr"  r   )r  r  r   r  r%  r&  r  r   r   Y  s0   r   c                 C   s&  t |}t | d|d d  tdf |d d |d|d d < t | |d d |d d  tt df |d d |d d  ||d d |d d < t | |d d |d d  tt df |d d |d d  ||d d |d d < t | |d d |d d  tt df |d d |d d  ||d d |d d < t | |d d |d d  tt df |d d |d d  ||d d |d d < t | |d d d  tt df t||d d  ||d d d < |S )Nr   r   r
   r   r	   r   )r   r!  Ztiler   Z	transposer   r   r#   )r%  r   link_maxr,  r   r   r   get_link_mask  s`   





r2  c                 C   s6  t | jd }ttD ]}|dkrG|| d || d  t }|| d || d  td  }|| d || d  td  }d|d |< q||| d || d  t  }||| d || d  td   }|}||| d || d  td t  7 }d|||< d|||< q| t |dkd d d f S )Nr   r      )r   r   r!   rV   r   r   r   r   )Zlink_scores_rawr   Z
link8_maskr]   Zoffsets_startZoffsets_endoffsets_linkZoffsets_link_prer   r   r   	get_link8  s4   
r5  c                    s  | d d t f |k|d d t f }|d d tf }tjt||fdd}tdkd  	||k}	t||}
t||
 |	  }|d t		d  }tj
tjdd t	g g fddfdd	fd
d

fdd
fdd
fdd fddfddfdd} fdd}	fdd}d}d}t|D ]\}}t|||\}}}}|| d || d |  | }|	v rJt|||||}t	tt|d d df |kd dksJ|tt|d d df |kd d  }||d  }||d  }|d  }|r7||kr7|d7 }|||d  q|rJ||k rJ|d7 }|||d  q| }|S )Nr   r   r   r   r   c                    r   r   r   r   r   r   r   r    r  z*decode_image_by_mutex.<locals>.find_parentc                    r  r   r   r  r   r   r   r    r  z)decode_image_by_mutex.<locals>.set_parentc                    r  r   r   )r   mutex_point_list)
mutex_maskr   r   set_mutex_constraint  r  z3decode_image_by_mutex.<locals>.set_mutex_constraintc                    sN   |  }g }|g ks |D ]}|s |}||vr| | q| | |S r   rW   )r   r6  Zmutex_point_list_newmutex_point)r  r  r7  r8  r   r   find_mutex_constraint  s   

z4decode_image_by_mutex.<locals>.find_mutex_constraintc                    sJ    | } |}|D ]}|s|}||vr| | q
|| d S r   r9  )r   r  r6  Zmutex_parent_listr:  )r;  r  r  r8  r   r   combine_mutex_constraint  s   
z7decode_image_by_mutex.<locals>.combine_mutex_constraintc                    sL    | } |}| |vr| |  ||vr| | | | || d S r   r9  )r  r  Zmutex_point_list1Zmutex_point_list2)r;  r8  r   r   add_mutex_constraint  s   


z3decode_image_by_mutex.<locals>.add_mutex_constraintc                    r  r	  r   r   r
  r   r   r    r  z&decode_image_by_mutex.<locals>.is_rootc                    r  r  r   r  r  r   r   r    r  z(decode_image_by_mutex.<locals>.find_rootc                    sD   | }|}||kr||vr ||  || d S d S d S r   r   r  )r<  r;  r  r  r   r   r     s   
z#decode_image_by_mutex.<locals>.joinc                    s*   | }|}||kr || d S d S r   r   r  )r=  r  r   r   disjoin%  r  z&decode_image_by_mutex.<locals>.disjoinc                     r  )Nc                    r  r  r  r  r  r   r   r  /  r  z9decode_image_by_mutex.<locals>.get_all.<locals>.get_indexr   r   )r  r"  _r   r#  r$  )r  r%  offsets_pos_listr  r   r'  ,  r(  z&decode_image_by_mutex.<locals>.get_allr
   )r)  	MUT_LABELr   r<   r   r   tolistr2  Zargsortr#   r!  r   r   r   r   r   )r*  r+  r   r   r   r   Zlink_posZlink_mutr1  Zlink_mask_thr,  Zoffsets_link_maxr   r>  r'  r-  Zmut_linkr?  r4  r   rC   rL   r   r   r.  r/  Zlink_pos_valueZlink_mut_valuer0  r"  r   )r=  r<  r;  r  r  r   r  r7  r%  r@  r8  r  r   decode_image_by_mutex  sz   
 

rC  r   )r   r0   NTFN)r   r	   r0   NTFrM   )r   r	   r0   NTFrl   )r0   NTFN)r0   N)Fr$   r   r   sysr   Z
absl.flagsflagsZ
absl_flagsr   numpyr   Z
tensorflowr    r   __version__compatZv1r9   argvZappZDEFINE_stringr   r   r   r   r   r   ZMATCH_STATUS_POSZMATCH_STATUS_NEGZMATCH_STATUS_IGNORErA  r)  Z	NEG_LABELr   r   r/   r2   ra   rk   rr   ru   rv   rp   rt   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2  r5  rC  r   r   r   r   <module>   s   


/
?
&
)
;
;
$

#

	6 !#2C