o
    'jr                     @   sN   d Z 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gZG dd de	Z
dS )z^
This part code is refered from: 
https://github.com/songdejia/EAST/blob/master/data_utils.py
    NSASTProcessTrainc                   @   s   e Zd ZddgddddfddZdd Zd	d
 Zdd Z		d:ddZdd Zdd Z			d;ddZ
		d<ddZdd Zdd Z		 d=d!d"Z	 d>d#d$Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9S )?r   i      333333?
   c                 K   s&   |d | _ || _|| _|| _|| _d S )N   )
input_sizemin_crop_sizemin_crop_side_ratiomin_text_sizemax_text_size)selfZimage_shaper   r	   r
   r   kwargs r   h/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddleocr/ppocr/data/imaug/sast_process.py__init__   s
   

zSASTProcessTrain.__init__c                 C   s   |d d |d d  |d d |d d   |d d |d d  |d d |d d   |d d |d d  |d d |d d   |d d |d d  |d d |d d   g}t |d S )zQ
        compute area of a polygon
        :param poly:
        :return:
        r   r                @)npsum)r   polyedger   r   r   	quad_area*   s   ....zSASTProcessTrain.quad_areac                 C   s  |j d }tjdtjd}	 t|tj}|d }tt	|}d}d}t
dD ]P}	tj||	d d  |d  tj||	d d  ||d d    tj||	d d  ||d    tj||	d	 d  |d
   }
|
|k r{|
}|	}q+t
dD ]}	|||	 d  ||	< q|S )3
        Generate min area quad from poly.
        r      r   ZdtypeT     @r   r   r   r   )shaper   zerosfloat32cv2minAreaRectastypeint32array	boxPointsrangelinalgnorm)r   r   	point_nummin_area_quadrectcenter_pointboxfirst_point_idxmin_distidistr   r   r   gen_quad_from_poly6   s2   
&"z#SASTProcessTrain.gen_quad_from_polyc                 C   s  |\}}|j d dkr|tg tg fS t|dddddf d|d |dddddf< t|dddddf d|d |dddddf< g }g }g }t||D ]\}	}
| |	}| |}t|dk rptd qW|dkr|
dkr~td d}
|	dddf }	|d	ddf }tj	
|d |d  tj	
|d
 |d   }tj	
|d |d
  tj	
|d |d   }d}|d |k rd}||	 ||
 || qWt|t|t|fS )z
        check so that the text poly is in the same direction,
        and also filter some invalid polygons
        :param polys:
        :param tags:
        :return:
        r   Nr   zinvalid polyFzpoly in wrong directionT)r                  r   	               r   r   r   r   )r   r   r   r   r   r   r   )r   r   r&   clipzipr4   r   absprintr)   r*   append)r   polystagsZxxx_todo_changemehwZvalidated_polysZvalidated_tagshv_tagsr   tagquadZp_areaZlen_wZlen_hZhv_tagr   r   r   check_and_validate_polysQ   sJ   66

""

z)SASTProcessTrain.check_and_validate_polysF   c                 C   s  |j \}}}	|d }
|d }tj||
d  tjd}tj||d  tjd}|D ]M}tj|ddtj}t|dddf }t|dddf }d||| || < t|dddf }t|dddf }d|||
 ||
 < q(t|dkd }t|dkd }t	|dkst	|dkr||||fS t
|D ]}tjj|dd}t|| }t|| }t|d|d }t|d|d }tjj|dd}t||
 }t||
 }t|d|d }t|d|d }|| | jk s|| | jk rq|j d dkrM|dddddf |k|dddddf |k@ |dddddf |k@ |dddddf |k@ }ttj|dd	d
kd }ng }t	|dkrw|rv|||d ||d ddf || || || f  S q|||d ||d ddf }|| }|| }|| }|dddddf  |8  < |dddddf  |8  < ||||f  S ||||fS )z
        make random crop from the input image
        :param im:
        :param polys:
        :param tags:
        :param crop_background:
        :param max_tries: 50 -> 25
        :return:
        r   r   r   r   ZdecimalsNr   )sizeZaxisr   )r   r   r    r%   roundr$   minmaxwherelenr(   randomchoicer?   r   r   )r   imrD   rE   rH   crop_backgroundZ	max_triesrF   rG   _Zpad_hZpad_wZh_arrayZw_arrayr   ZminxZmaxxZminyZmaxyZh_axisZw_axisr2   xxZxminZxmaxyyZyminZymaxZpoly_axis_in_areaZselected_polysr   r   r   	crop_area   sr   2 "zSASTProcessTrain.crop_areac              	   C   s^  g }g }|D ]@}t j|d |d  t j|d |d   d }t j|d |d  t j|d |d   d }|| || qtt|t|d  d}tt|t|d  d}	|D ]I}|d |d  |d |d   d }
|
t j|
d  | }ttt	|d |d d|	d  g}t
|| t jt jddddf | qc|S )		
        r   r   r   r   r   ư>      ?N)r   r)   r*   rC   rR   r   rT   tuplemapfloatr"   fillPolyrP   r$   r%   newaxis)r   
poly_quadsdirection_mapZ
width_listheight_listrJ   quad_wquad_hZ
norm_widthaverage_heightZdirect_vector_fullZdirect_vectorZdirection_labelr   r   r   generate_direction_map   sJ   
 "z'SASTProcessTrain.generate_direction_mapc                 C   sf   g }|D ]!}t j|d |d  t j|d |d   d }|| qtt|t| d}|S )r]   r   r   r   r   r   r_   )r   r)   r*   rC   rR   r   rT   )r   re   rg   rJ   ri   rj   r   r   r   calculate_average_height   s   z)SASTProcessTrain.calculate_average_height333333?c                 C   sZ  |\}}t || t || }}|| }tj||ftjd}	tj||dftjd}
tj||ftjd}t||dftg dg dtj }tt	||D ]\}}|d }|d }| 
|\}}dtj|d |d  tj|d |d	    }dtj|d |d  tj|d	 |d    }t||| j| k st||| j| krqS|rt||tjtjd
d
d
d
f d qS| ||}| |}| |}| j||d| d\}}t|	t|tjd t|D ]1\}}tj||ftjd}t|t|tjd
d
d
d
f tjd}| |||  ||
}
qqS|	|
|fS )z#
        Generate polygon.
        r   r>   r   )r   r   r   )r   r   r   r   r         ?r   Nrm   r_   )shrink_ratio_of_widthexpand_height_ratio)intr   r    r!   onesr&   reshaper$   	enumerater@   gen_min_area_quad_from_polyr)   r*   rQ   r
   r   r"   rc   r%   rd   poly2tcl
poly2quadsshrink_poly_along_widthrP   gen_quad_tbo)r   hwrD   rE   ds_ratio	tcl_ratioro   rF   rG   	score_maptbo_maptraining_maskrf   Zpoly_idxpoly_tagr   rI   r,   r.   min_area_quad_hmin_area_quad_wtcl_polyZ	tcl_quadsre   Z
stcl_quadsZ
quad_indexidxrJ   Z	quad_maskr   r   r   generate_tcl_label   s   
 


&
z#SASTProcessTrain.generate_tcl_label      ?c                 C   s  |\}}t || t || }}|| }tj||ftjd}tjd||ftjd}	ttd||df|	ddd< ttd||dfj|	ddd< tjd||ftjd}
tjd||ftjd}ttd||df|d< ttd||dfj|d< tjd||ftjd}tj||ftjd}t||D ]\}}|d	krq| 	|}| 
|\}}d
tj|d |d  tj|d |d    }d
tj|d |d  tj|d |d    }| ||}tdD ]T}t|
d|  t|tjddddf tjttt||df d| t|
d| d  t|tjddddf tjttt||df d| qtdD ]!}t|| t|tjddddf tjt||  qGt|t|tjddddf tjttt||d t|t|tjddddf tjd q|	|9 }	|	dd  |
8  < |	d  |  < |	d}	||9 }|dd  |8  < |d  |  < |d}|	|fS )z8
        Generate tcl map, tvo map and tbo map.
        r   r:   r   r   r   r   r;   r   Trn   r   Nr_   )r   r   r   )rq   r   r    r!   rr   ZtilearangeTr@   adjust_pointru   r)   r*   rv   r(   r"   rc   rP   rd   r$   r%   rb   rQ   rR   	transpose)r   rz   rD   rE   r|   r{   rF   rG   Z	poly_masktvo_mapZpoly_tv_xy_maptco_mapZpoly_tc_xy_mapZpoly_short_edge_mapr   r   r,   r.   r   r   r   r   r   r   r   generate_tvo_and_tco9  s   	"$

$$$
$$

z%SASTProcessTrain.generate_tvo_and_tcoc                 C   sB  |j d }|dkrOtj|d |d  }tj|d |d  }tj|d |d  }tj|d |d  }|| d || k rM|g dddf }|S |dkr|d |d  }|d |d  }t||tj|tj| d	  }	ttj|	dd
}
t|
dtj	 krt
td|dg }|t|ddf }|S )z%
        adjust point order.
        r   r   r   r   r   g      ?)r   r   r   r   Nr^   rM   g98?)r   r   r)   r*   dotZarccosrP   rA   mathpilistr(   r&   )r   r   r+   Zlen_1Zlen_2Zlen_3Zlen_4Zvector_1Zvector_2Z	cos_thetathetaindexr   r   r   r     s(   

zSASTProcessTrain.adjust_pointc                 C   sF  |j d }tjdtjd}|dkr |}tj|ddd }||fS t|tj}|d }t	t
|}d}d}tdD ]P}	tj||	d d  |d  tj||	d d  ||d d    tj||	d d  ||d    tj||	d	 d  |d
   }
|
|k r|
}|	}q=tdD ]}	|||	 d  ||	< q||fS )r   r   r   r   r   rO   r   r   r   r   r   )r   r   r    r!   r   r"   r#   r$   r%   r&   r'   r(   r)   r*   )r   r   r+   r,   r.   r-   r/   r0   r1   r2   r3   r   r   r   ru     s8   
&"z,SASTProcessTrain.gen_min_area_quad_from_poly        r_   c                 C   sr   t j|g|ggt jd}|d |d |d  |  }|d |d |d  |  }t |d |d |d |d gS )z3
        Generate shrink_quad_along_width.
        r   r   r   r   r   r   r&   r!   )r   rJ   begin_width_ratioend_width_ratio
ratio_pairZp0_1Zp3_2r   r   r   shrink_quad_along_width  s   "z(SASTProcessTrain.shrink_quad_along_widthc                 C   sj  g }dd }|D ]}t j|d |d  }|| qt j|d d |d d  | }t j|d d |d d  | }	t||	t|| }
|
}t||
 }|||\}}| j|| |dd}|||\}}| j|| d|d}g }||kr||d |d |d |d g n|| t|d |D ]	}|||  q|| t |t	t||d fS )	z0
        shrink poly with given length.
        c                 S   sF   t | D ]\}}||8 }|dkr || |  | |  }||f  S qd S )Nr^   )rt   )Zedge_len_listZcut_lenr   Zedge_lenratior   r   r   get_cut_info  s   z>SASTProcessTrain.shrink_poly_along_width.<locals>.get_cut_infor   r   r   r   r   )r   r   )
r   r)   r*   rC   rQ   r   r   r(   r&   r   )r   Zquadsro   rp   Zupper_edge_listr   rJ   Zupper_edge_lenZleft_lengthZright_lengthZshrink_lengthZupper_len_leftZupper_len_rightZleft_idxZ
left_ratioZ	left_quadZ	right_idxZright_ratioZ
right_quadZout_quad_listr   r   r   r   rx     sP   



z(SASTProcessTrain.shrink_poly_along_widthc                 C   s0   t |d |d  |d |d  g}t j| S )zV
        Calculate the angle between vector AB and x-axis positive direction.
        r   r   )r   r&   Zarctan2)r   ABZABr   r   r   vector_angle
  s   &
zSASTProcessTrain.vector_anglec                 C   s4   |\}}t |}t |}|| || ||  gS )zZ
        Calculate the line through given point and angle in ax + by + c =0 form.
        )r   cossin)r   r   pointxyr   r   r   r   r   theta_line_cross_point  s   

z'SASTProcessTrain.theta_line_cross_pointc                 C   s   |  ||}| ||S )zX
        Calculate the line through given point A and B in ax + by + c =0 form.
        )r   r   )r   r   r   angler   r   r   line_cross_two_point  s   z%SASTProcessTrain.line_cross_two_pointc                 C   s0   |\}}}}|  ||}|  ||}|| d S )zX
        Calculate the average angle between left and right edge in given poly.
        r   )r   )r   r   p0p1Zp2Zp3Zangle30Zangle21r   r   r   average_angle!  s   zSASTProcessTrain.average_anglec                 C   s   |\}}}|\}}}|| ||  }	|	dkr$t d tjddgtjdS || ||  |	 }
|| ||  |	 }tj|
|gtjdS )z`
        line1 and line2 in  0=ax+by+c form, compute the cross point of line1 and line2
        r   zCross point does not existr   )rB   r   r&   r!   )r   line1line2Za1b1c1Za2b2c2dr   r   r   r   r   line_cross_point*  s   

z!SASTProcessTrain.line_cross_pointc                 C   s   t jd|d  gd|d  ggt jd}|d |d |d  |  }|d |d |d  |  }t |d |d |d |d gS )zG
        Generate center line by poly clock-wise point. (4, 2)
        rn   r   r   r   r   r   r   )r   r   r   r   Zp0_3Zp1_2r   r   r   quad2tcl=  s   "zSASTProcessTrain.quad2tclc                 C   s   t jd|d  gd|d  ggt jd}t |}|jd }t|d D ]$}|| ||d |  ||  |  }|d ||< |d ||d | < q$|S )z@
        Generate center line by poly clock-wise point.
        rn   r   r   r   r   )r   r&   r!   Z
zeros_liker   r(   )r   r   r   r   r   r+   r   
point_pairr   r   r   rv   G  s   

zSASTProcessTrain.poly2tclc                 C   sX  |  |d |d }|  |d |d }dtj|d |d  tj|d |d    }dtj|d |d  tj|d |d    }| |}t|dk}	|	D ]S\}
}||
f}| ||}| ||}| ||}|| \}}|| \}}|||
|df< |||
|df< |||
|df< |||
|df< dtt	||d d ||
|df< qV|S )z1
        Generate tbo_map for give quad.
        r   r   r   r   rn   r_   r   )
r   r   r)   r*   r   Zargwherer   r   rR   rQ   )r   rJ   Ztcl_maskr~   Zup_lineZ
lower_lineri   rh   r   Z
xy_in_polyr   r   r   lineZcross_point_upperZcross_point_lowerZupper_offset_xZupper_offset_yZlower_offset_xZlower_offset_yr   r   r   ry   W  s.   
$zSASTProcessTrain.gen_quad_tboc                 C   s   g }|j d }g }t|d D ]}|| ||d |  g}|| q|d d }t|D ]}|t|||d g ddg d  q-t|S )z(
        Split poly into quads.
        r   r   r   r   )r   r   r   r   )r   r(   rC   r   r&   rs   )r   r   Z	quad_listr+   Zpoint_pair_listr   r   Zquad_numr   r   r   rw   w  s   

zSASTProcessTrain.poly2quadsc                 C   s  |d }|d }|d }|d u rd S |j d dkrd S |j \}}}| ||||f\}}}|j d dkr6d S tddd}	tj|	}
tj dk rNd|
 }
t|
}
|
}d|
 }t	j
|d ||d	}|d d d d df  |9  < |d d d d d
f  |9  < |j \}}}t||dkrdt|| }t	j
|d ||d	}||9 }|j \}}}t||dk rd S | j||||dd\}}}}|j d dkrd S t|d |jkrd S |j \}}}|d u s|d u rd S t| jt|| }tg d}|tj| }t	j
|d ||d	}|d d d d df  |9  < |d d d d d
f  |9  < tj dk rJtjdd d
 }t|d d d
 }t	j|||fddd}tj dk rd|dtj d   }t|dd}tj dk r~|dtj d   }t|dd}|j \}}}t||| jd k rd S tj| j| jdftjd}d|d d d d df< d|d d d d d
f< d|d d d d df< | j| }| j| }d\}}|d
krttj | }|d
krttj | }| |||| ||| d d f< |d d d d df  |7  < |d d d d d
f  |7  < | | j| jf||d\}}}| j| j| jf||ddd\}}|d d d d df  d8  < |d d d d d
f  d8  < |d d d d df  d8  < |d d d d df  d   < |d d d d d
f  d!  < |d d d d df  d"  < |d#}|d d d$d d d d f |d< |tjd d d d f |d%< |d#|d&< |tjd d d d f |d'< |d#|d(< |d#|d)< |S )*NimagerD   Zignore_tagsr   r_   g?g?rn   )ZdsizeZfxfyr   i   g      @   F)rX   )r   g      ?rn   g      ?g      ?g      ?r_   r_   r_   r_   r_   g?r>   r   )ZksizeZsigmaXZsigmaYr   g     o@r   r   g33333^@gR]@gRY@)r   r   r   r   )r|   r{   g(\2M@g(\L@g     L@)r   r   r   r   r}   
border_mapr   r   r   )r   rK   r   r   rU   rV   Zrandr   sqrtr"   resizerR   rQ   r\   r   rN   rb   r   r&   Zpermutationrq   ZGaussianBlurr?   rr   r!   copyr   r   r   rd   )r   datarW   Z
text_polysZ	text_tagsrF   rG   rY   rH   Z
asp_scalesZ	asp_scaleZasp_wxZasp_hyZrd_scaleZnew_hZnew_wZ	std_ratioZrand_scalesZrz_scaleksZ	im_paddedZdel_hZdel_wshswr}   r   r   r   r   r   r   r   __call__  s   






&



 zSASTProcessTrain.__call__N)FrL   )r   rm   )r   r   )r   r_   )r_   )__name__
__module____qualname__r   r   r4   rK   r\   rk   rl   r   r   r   ru   r   rx   r   r   r   r   r   r   rv   ry   rw   r   r   r   r   r   r      sL    
3
K
J
X!

3		
 )__doc__r   r"   numpyr   jsonsysos__all__objectr   r   r   r   r   <module>   s   