o
    ॵi                     @   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)
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uuid4LIB_NAMEshutilcopyfiletfload_op_library)lib_namelib_pathlib_copy_pathoplib r!   Y/home/ubuntu/.local/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        kaimingr
   Nr          @r         ?zUnsupported shaper   r   r   z*Unsupported weight initialization method: )shapeinitializer)r   constant_initializerlenmathsqrttruncated_normal_initializerkerasinitializersglorot_normal
isinstancetupleget_variableadd_to_collection)namer)   init_method
collectionkwargsr*   khkwn_ininit_stdn_outvarr!   r!   r"   _nn_variableA   s2   

rA   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	trainableTrB   r   r   r   CONSTANTconv2dweightr9   weightsVALIDpaddingbiasr$   biases)FLAGSr   get	get_shapemaxr   constantpadvariable_scoperA   nnrE   bias_addrelu)xr=   r?   ksizestriderJ   weight_initrK   rV   scoper:   rC   	in_heightin_widthpad_along_heightpad_along_width
pad_bottompad_top	pad_rightpad_leftpaddingsinput_paddedkernelycybyr!   r!   r"   rE   l   sh   




rE   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rX   rY   rJ   rZ   rK   rV   r[   _concatvaluesaxisr7   )r,   rO   r   splitintrangerE   appendconcatrT   rV   )rW   r=   r?   rX   rY   grouprJ   rZ   rK   rV   r7   r:   
group_axissplits	conv_listi
conv_split
relu_splitconvr!   r!   r"   group_conv2d_relu   s(   

r~   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   rk   rl   rm   rn   _bn?h㈵>Tmomentumepsilonscaletraining)r,   rO   r   rq   rr   rs   rE   rt   ru   rS   layersbatch_normalizationrT   rV   )rW   r=   r?   rX   rY   rv   rJ   rZ   rK   rV   r7   r:   rw   rx   ry   rz   r{   r|   r}   bnr!   r!   r"   group_conv2d_bn_relu   s2   


r   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   _arl   _b)rX   rY   rv   rJ   rZ   rK   rV   r7   _c)	conv_relur~   rW   r=   r?   rX   rY   rv   rJ   rZ   rK   rV   r7   r:   conv_arelu_aconv_brelu_bconv_crelu_cr!   r!   r"   	next_conv   ^   


r   c                 K   r   r   )conv_bn_relur   r   r!   r!   r"   next_conv_bn%  r   r   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 )NrC   TrE   rF   r9   rG   r   rI   rK   r$   rL   )
rM   r   rN   r   rS   rA   rT   rE   rU   rV   )rW   r=   r?   rX   rY   rJ   rZ   rK   rV   r[   r:   rC   rf   ri   r!   r!   r"   
conv2d_ori\  s>   




r   c                  O   &   d|d< d|vrd|d< t | i |S NTrV   r[   r   )rE   argsr:   r!   r!   r"   r        r   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 )	NTrV   r[   r   r   r   r   r   )rE   r   rS   r   r   rT   rV   )r   r:   r}   rV   r   bn_relur!   r!   r"   r     s   
r   c                  O   r   r   )r   r   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 )NrC   Tatrous_conv2drF   r9   rG   rI   rK   r$   rL   )
rM   r   rN   r   rS   rA   rT   r   rU   rV   )rW   r=   r?   rX   dilationrJ   rZ   rK   rV   r[   r:   rC   rf   ri   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   rS   rT   r   rW   rX   rY   rJ   r[   ri   r!   r!   r"   r        
r   c              	   C   r   )Nmax_poolr   )r   rS   rT   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   one_hotcastint64rT   !softmax_cross_entropy_with_logits
reduce_sum)	gt_labelsmatch_scores	n_classes
embeddings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], correponding groundtruth offsets
  RETURN
    loss: scalar
  smooth_l1_lossr(         ?r   N)	r   rS   stop_gradientabsr   lessfloat32squarer   )offsets
gt_offsetsr[   difflesser_masklarger_masklosses1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)polygonx1y1x2y2x3y3x4y4c_xc_yw1w2h1h2hwtheta1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   )pxpyr   r   r   r   epsdx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   zerosuint8rs   r)   reshaper   r   rboxes_to_polygonsint32cv2drawContourscvtColorCOLOR_BGR2GRAY	thresholdTHRESH_BINARYfindContours	RETR_TREECHAIN_APPROX_SIMPLEr,   contourAreaminAreaRect	boxPoints)rboxesresize_sizeimage_wimage_himgrz   segmentimg2grayretthreshim2contours	hierarchycntmax_areacontrect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stackrs   r.   ) segscxcyr   r   	theta_sin	theta_cosr   cxscys
theta_coss
theta_sins	bar_thetakbproj_xsproj_ysproj_pointsmax_distidx1idx2rz   point1jpoint2r   seg1seg2bcxbcy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%   )rs   r   wherer)   r/  rt   r,   rP   RBOX_DIMvstackr   r  r   r   )segments_batchgroup_indices_batchsegment_counts_batch
batch_sizecombined_rboxes_batchcombined_counts_batchimage_idgroup_countsegmentsgroup_indicescombined_rboxesrz   segments_groupcombined_rbox	max_countcombined_rboxes_padr!   r!   r"   combine_segments_batchc  sB   




rB  c                 C   s(   t t| ||gt jt jg\}}||fS r   )r   py_funcrB  r   r   )r;  r<  segment_countsr=  combined_countsr!   r!   r"   combine_segments_python  s
   

rF  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_idxrW   ri   r!   r!   r"   	get_coord  s0   
rJ  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_LINKSrJ  )r   rG  rH  offsets_nodelink_idxrI  rW   ri   r!   r!   r"   get_coord_link  s   

rP  c                 C   s8   ||  d }||  d }|dko||k o|dko||k S rK  r!   )rI  rW   ri   rG  r   r   r!   r!   r"   is_valid_coord  s    rQ  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   )rQ  rL  rM  rt   )rI  rW   ri   rG  rH  coordneighbours_offsetsrO  nl_idxnxnyneighbours_offset_nodeneighbours_offset_linkoff_tmpr!   r!   r"   get_neighbours  sX   ,((($0

rZ  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r6  r!   r"   
<listcomp>      z0decode_segments_links_python.<locals>.<listcomp>rp   c                    r[  r\  r   r   N_LNK_CLASSESr_  rb  r!   r"   rc    rd  c                    r[  r\  r   r   
OFFSET_DIMr_  rb  r!   r"   rc    rd  )r   ru   rC  decode_batchrQ   r   r   
image_size	all_nodes	all_linksall_reganchor_sizesall_nodes_flatall_links_flatall_reg_flatr;  r<  rD  group_indices_allr!   rb  r"   decode_segments_links_python  s(   ru  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_  rb  r!   r"   rc    rd  z/decode_segments_links_train.<locals>.<listcomp>r   re  c                    r[  r\  rf  r_  rb  r!   r"   rc    rd  c                    r[  r\  rh  r_  rb  r!   r"   rc    rd  )	rM   train_batch_sizer   ru   rC  rj  rQ   r   r   rk  r!   rb  r"   decode_segments_links_train  s(   rw  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)   rs   decode_imagert   r   rP   ri  r2  r   hstackr  r   r   )rm  rn  ro  rl  rp  r6  batch_segmentsbatch_group_indicesbatch_segments_countsbatch_group_indices_allr9  image_node_scoresimage_link_scores	image_regimage_segmentsimage_group_indicesimage_segments_countsimage_group_indices_allr@  batch_segments_padr!   r!   r"   rj    sZ   






rj  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   dtyper   r
   r   r   r   )rs   N_DET_LAYERSrt   rL  rM  decode_image_by_joinrM   node_thresholdlink_thresholdr   r0  r,   r   ri  r   	enumeraterJ  exp)r~  r  r  rl  rp  rG  rH  offsets_default_nodeoffsets_default_linkrz   r  r  r  r  r   
encoded_cx
encoded_cyencoded_widthencoded_heightencoded_theta_cosencoded_theta_sinrI  rW   ri   rsr   r!   r!   r"   rx  '  sd   
$$rx  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  root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p2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  root_mapr!   r"   	get_index     z8decode_image_by_join.<locals>.get_all.<locals>.get_indexr  r   
zeros_liker   r  )r  maskrz   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   r0  r  rJ  rZ  )node_scoreslink_scoresr  r  rG  rH  	link_maskr   r  pos_linkrz   r   rI  rW   ri   
neighboursn_idxnoffsets
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  tilerL  	transposer   rM  r,   )r  rH  link_maxr  r!   r!   r"   get_link_mask  s`   





r  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)   rs   r  rL  rM  r0  )link_scores_rawrG  
link8_maskrz   offsets_startoffsets_endoffsets_linkoffsets_link_prer!   r!   r"   	get_link8  s4   
r  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   re  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   rt   )r  r  mutex_point_list_newmutex_point)r  r  r  r  r!   r"   find_mutex_constraint  s   

z4decode_image_by_mutex.<locals>.find_mutex_constraintc                    sJ    | } |}|D ]}|s|}||vr| | q
|| d S r   r  )r  r  r  mutex_parent_listr  )r  r  r  r  r!   r"   combine_mutex_constraint  s   
z7decode_image_by_mutex.<locals>.combine_mutex_constraintc                    sL    | } |}| |vr| |  ||vr| | | | || d S r   r  )r  r  mutex_point_list1mutex_point_list2)r  r  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   rP   r2  r0  tolistr  argsortr,   r  r   r  rP  rZ  r   )r  r  r  r  rG  rH  link_poslink_mutr  link_mask_thr  offsets_link_maxr   r  r  r  mut_linkr  r  rI  rW   ri   rO  r   r  r  link_pos_valuelink_mut_valuer  r  r!   )r  r  r  r  r  r  r  r  r  r  r  r  r"   decode_image_by_mutex  sz   
 

r  r   )r   rB   NTFN)r   r
   rB   NTFrj   )r   r
   rB   NTFr   )rB   NTFN)rB   N)Fr-   r   r   sysr   
absl.flagsflags
absl_flagsr   numpyr   
tensorflowr    r   __version__compatv1rM   argvappDEFINE_stringri  r1  rL  rM  r^  rg  MATCH_STATUS_POSMATCH_STATUS_NEGMATCH_STATUS_IGNOREr  r  	NEG_LABELr  r#   rA   rE   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r/  rB  rF  rJ  rP  rQ  rZ  ru  rw  rj  rx  r  r  r  r  r!   r!   r!   r"   <module>   s   


/
?
&
)
;
;
$

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