
    i|                     R   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJ	r	J
r
  S SKrS SKJr  S SKrS SKJr  S rS rS rS rS	 rS
 rS rS rS rSS jr    S S jr    S S jrS!S jrS!S jrS r S"S jrS r S#S jr!S r"S r#S$S jr$S r%S r&S%S jr'S r(\)S:X  a  gg)&    N)Image	ImageDraw	ImageFont)	inference)
get_loggerc                 (    U R                  5       S;   $ )N)trueyesty1)lower)vs    ]/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddleocr/tools/infer/utility.pystr2boolr      s    779666    c           	          [        U R                  S5       Vs/ s H  n[        UR                  5       5      PM     sn5      $ s  snf )N,)tuplesplitintstrip)r   is     r   str2int_tupler   !   s1    !''#,7,Q#aggi.,7887s   #Ac                  |   [         R                  " 5       n U R                  S[        SS9  U R                  S[        SS9  U R                  S[        SS9  U R                  S[        SS9  U R                  S[        SS	S
9  U R                  S[        SS9  U R                  S[        SS9  U R                  S[        SS9  U R                  S[
        SS9  U R                  S[        SS9  U R                  S[        SS9  U R                  S[
        S9  U R                  S[        SS9  U R                  S[
        SS9  U R                  S[
        S9  U R                  S[        SS9  U R                  S[
        SS9  U R                  S[
        S S9  U R                  S![        S"S9  U R                  S#[        S$S9  U R                  S%[        S&S9  U R                  S'[        S(S9  U R                  S)[        SS9  U R                  S*[
        S+S9  U R                  S,[        S-S9  U R                  S.[        S/S9  U R                  S0[        S1S9  U R                  S2[        S3S9  U R                  S4[        S1S9  U R                  S5[        SS9  U R                  S6[        S7S9  U R                  S8[        S9S9  U R                  S:[        S;S9  U R                  S<[        / S=QS9  U R                  S>[        S?S9  U R                  S@[        S?S9  U R                  SA[        SBS9  U R                  SC[
        SDS9  U R                  SE[
        S9  U R                  SF[        SS9  U R                  SG[
        SHS9  U R                  SI[        SJS9  U R                  SK[        SLS9  U R                  SM[
        SNS9  U R                  SO[        SS9  U R                  SP[
        SQS9  U R                  SR[        S3S9  U R                  SS[
        STS9  U R                  SU[
        S9  U R                  SV[        SWS9  U R                  SX[
        SS9  U R                  SY[        S3S9  U R                  SZ[
        S[S9  U R                  S\[
        S]S9  U R                  S^[
        S+S9  U R                  S_[        SS9  U R                  S`[
        S9  U R                  Sa[
        SbS9  U R                  Sc[        SdSe/S9  U R                  Sf[        SJS9  U R                  Sg[        ShS9  U R                  Si[        SS9  U R                  Sj[        S(S9  U R                  Sk[        SS9  U R                  Sl[        SS9  U R                  Sm[
        S9  U R                  Sn[
        SoS9  U R                  Sp[        S;S9  U R                  Sq[
        SrS9  U R                  Ss[        SS9  U R                  St[
        SuS9  U R                  Sv[        SS9  U R                  Sw[        S;S9  U R                  Sx[        SS9  U R                  Sy[        SS9  U R                  Sz[
        S{S9  U R                  S|[        SS9  U R                  S}[        SS9  U R                  S~S[
        SS9  U R                  S[        SS9  U R                  S[        SSS
9  U $ )Nz	--use_gpuT)typedefaultz	--use_xpuFz	--use_npuz	--use_mluz	--use_gcuz%Use Enflame GCU(General Compute Unit))r   r   helpz
--ir_optimz--use_tensorrtz--min_subgraph_size   z--precisionfp32z	--gpu_mem  z--gpu_idr   z--image_dir)r   z
--page_numz--det_algorithmDBz--det_model_dirz--det_limit_side_leni  z--det_limit_typemaxz--det_box_typequadz--det_db_threshg333333?z--det_db_box_threshg333333?z--det_db_unclip_ratio      ?z--max_batch_size
   z--use_dilationz--det_db_score_modefastz--det_east_score_threshg?z--det_east_cover_threshg?z--det_east_nms_threshg?z--det_sast_score_thresh      ?z--det_sast_nms_threshz--det_pse_threshz--det_pse_box_threshg333333?z--det_pse_min_area   z--det_pse_scale   z--scales)   r)       z--alpha      ?z--betaz--fourier_degree   z--rec_algorithm
SVTR_LCNetz--rec_model_dirz--rec_image_inversez--rec_image_shapez
3, 48, 320z--rec_batch_num   z--max_text_length   z--rec_char_dict_pathz./ppocr/utils/ppocr_keys_v1.txtz--use_space_charz--vis_font_path./doc/fonts/simfang.ttfz--drop_scorez--e2e_algorithmPGNetz--e2e_model_dirz--e2e_limit_side_leni   z--e2e_limit_typez--e2e_pgnet_score_threshz--e2e_char_dict_pathz./ppocr/utils/ic15_dict.txtz--e2e_pgnet_valid_set	totaltextz--e2e_pgnet_modez--use_angle_clsz--cls_model_dirz--cls_image_shapez
3, 48, 192z--label_list0180z--cls_batch_numz--cls_threshg?z--enable_mkldnnz--cpu_threadsz--use_pdservingz--warmupz--sr_model_dirz--sr_image_shapez
3, 32, 128z--sr_batch_numz--draw_img_save_dirz./inference_resultsz--save_crop_resz--crop_res_save_dirz./outputz--use_mpz--total_process_numz--process_idz--benchmarkz--save_log_pathz./log_output/z
--show_logz
--use_onnxz--onnx_providers+)nargsr   r   z--onnx_sess_optionsz--return_word_boxzxWhether return the bbox of each word (split by space) or chinese character. Only used in ppstructure for layout recovery)argparseArgumentParseradd_argumentr   r   strfloatlistparsers    r   	init_argsrA   %   s3   $$&F
(DA
(EB
(EB
(EB
4	   8TB
(xG
-CD
C@
#s;

a8 C0
3:
)TB
)4
.UCH
*eD
(sFC )sC
-E3G
/eSI
*bA
(xG
-CH 1sK
1sK
/eSI 1sK
/eSI *B
.UDI
,5"E
)Q? 
{C
	s;
uc:
*a@ )\J
)4
-HdK
+#|L
)Q?
+#rB
S2S   *4H
)=VW
UC@ )WE
)4
.UCH
*eD 2L
S2O   /c;O
*fE )%H
)4
+#|L
TC<H
)Q?
UC@
)%H
c2>
)%H

5A (s3
*lK
(sA> -CAVW
)%H
-CL 
5A
-CC
S!<
HeD
)_M
8TB
8UC
*#CO
-D%H  H	   Mr   c                  6    [        5       n U R                  5       $ N)rA   
parse_argsr?   s    r   rD   rD      s    [Fr   c           	         US:X  a  U R                   nOUS:X  a  U R                  nO~US:X  a  U R                  nOkUS:X  a  U R                  nOXUS:X  a  U R                  nOEUS:X  a  U R
                  nO2US:X  a  U R                  nOUS:X  a  U R                  nOU R                  nUc6  UR                  S	R                  X5      5        [        R                  " S
5        U R                  (       Ga+  S
S KnUn[        R                   R#                  U5      (       d  [%        SR                  U5      5      eU R&                  =(       d    S nU R(                  (       a5  [+        U R(                  5      S
:  a  UR-                  UU R(                  US9nOEU R.                  (       a"  UR-                  USU R0                  SS.4/US9nOUR-                  US/US9nUR3                  5       nU[+        U5      S:X  a  US
   S S 4$ U V	s/ s H  oR4                  PM     sn	S S 4$ SS/n
U
 H1  nU SU S3n[        R                   R#                  U5      (       d  M1    O   [        R                   R#                  W5      (       d  [%        SW SU 35      e[        R                   R#                  U SW S35      (       d?  [        R                   R#                  U SU S35      (       d  [%        SU SU SU S35      e[        R                   R#                  U SU S35      (       a	  U SU S3nOU SU S3n[6        R8                  " X\5      n[;        U S5      (       a  U R<                  S:X  a,  U R>                  (       a  [6        R@                  RB                  nO`U R<                  S :X  a  [6        R@                  RD                  nO5[6        R@                  RF                  nO[6        R@                  RF                  nU R.                  (       a  [I        5       nUc  URK                  S!5        URM                  U RN                  U R0                  5        U R>                  (       a  URQ                  S"UU RR                  U RT                  S#S$9  [        R                   RW                  X1 S%35      n[        R                   R#                  U5      (       d%  URY                  U5        UR                  S&U 35         UR[                  US'5        GOWGOUU R^                  (       a  URa                  S)5        GO1U Rb                  (       a  URa                  S*5        GOU Rd                  (       a  URg                  S+5        GOU Rh                  (       Ga7  [j        Rl                  Ro                  S,5      (       d   S-5       eS
S K8J9s  J:n  URw                  5         U R<                  S:X  aG  URa                  S,S
[j        R6                  R@                  RB                  5        URy                  U5        OURa                  S,5        [j        Rz                  R}                  5       (       aE  UR                  S'5        UR                  S'5        UR                  S'S.S/9nUR                  US'5        OUR                  5       nUR                  US.5        OUR                  5         U R                  (       a  UR                  S05        UR                  5         U R<                  S:X  a  UR                  5         [;        U S15      (       a  UR                  U R                  5        OUR                  S05        UR                  5         UR                  5         U Rh                  (       d  UR                  S25        UR                  S35        US:X  a!  U R                  S4:X  a  UR                  S55        US:X  a  UR                  S65        US:X  a  UR                  S75        UR                  S#5        UR                  S'5        [6        R                  " U5      nUR                  5       nUS8;   a,  / nU H#  nUR                  UR                  U5      5        M%     OU H  nUR                  U5      nM     [        XU5      nUWUU4$ s  sn	f ! [\         a-  nUR                  U5        UR                  S(5         S nAGNS nAff = f)9Ndetclsrectableserresrlayoutznot find {} model file path {}r   znot find model file path {})	providerssess_optionsCUDAExecutionProviderDEFAULT)	device_idcudnn_conv_algo_searchCPUExecutionProviderr*   modelr   /z
.pdiparamsz	not find z.pdiparams in z.pdmodelz.jsonzneither z
.json nor z.pdmodel was found in .	precisionfp16int8ziGPU is not found in current device by nvidia-smi. Please check your device or ignore it if run on jetson.i   @F)workspace_sizeprecision_modemax_batch_sizemin_subgraph_sizeuse_calib_modez_trt_dynamic_shape.txtz"collect dynamic shape info into : Tz+Please keep your paddlepaddle-gpu >= 2.3.0!npumlui   gcuzArgs use_gcu cannot be set as True while your paddle is not compiled with gcu! 
Please try: 
	1. Install paddle-custom-gcu to run model on GCU. 
	2. Set use_gcu as False in args to run model on CPU.	PaddleOCR)use_pirnamer&   cpu_threads&conv_transpose_eltwiseadd_bn_fuse_pass"matmul_transpose_reshape_fuse_passSRN$gpu_cpu_map_matmul_v2_to_matmul_passsimplify_with_basic_ops_passfc_fuse_pass)rJ   rK   )Vdet_model_dircls_model_dirrec_model_dirtable_model_dirser_model_dirre_model_dirsr_model_dirlayout_model_dire2e_model_dirinfoformatsysexituse_onnxonnxruntimeospathexists
ValueErroronnx_sess_optionsonnx_providerslenInferenceSessionuse_gpugpu_id
get_inputsre   r   ConfighasattrrX   use_tensorrtPrecisionTypeHalfInt8Float32get_infer_gpuidwarningenable_use_gpugpu_memenable_tensorrt_enginer]   r^   joincollect_shape_range_info#enable_tuned_tensorrt_dynamic_shape	Exceptionuse_npuenable_custom_deviceuse_mluuse_xpu
enable_xpuuse_gcupaddledeviceis_compiled_with_custom_devicepaddle_custom_device.gcu.passesrb   passessetUp"set_exp_enable_mixed_precision_ops	frameworkuse_pir_apienable_new_irenable_new_executorinference_passesenable_custom_passespass_builderappend_passes_for_legacy_irdisable_gpuenable_mkldnnset_mkldnn_cache_capacityenable_mkldnn_bfloat16 set_cpu_math_library_num_threadsrf   enable_memory_optimdisable_glog_infodelete_passrec_algorithmswitch_use_feed_fetch_opsswitch_ir_optimcreate_predictorget_input_namesappendget_input_handleget_output_tensors)argsmodelogger	model_dirortmodel_file_pathrO   sessinputsvo
file_names	file_nameparams_file_pathconfigrX   r   trt_shape_fE
gcu_passeskPirGcuPassesr   	predictorinput_namesinput_tensorre   output_tensorss                             r   r   r      s   u}&&		&&		&&		((		&&		%%		%%			))	&&	4;;DLM}}}!#ww~~o..:AA/RSS--53t':':#;a#?''--) ( D
 \\'' 0&*kkYW * ( 	D ''12) ( D
 "V)F1I	
 	
BH/I&B&/I	
 	
 {+
#I"+Ai[
Cww~~.// $
 ww~~.//y>)MNN GGNNi[)H=>>ww~~1YKu=>>9+Z	{:PQZP[[\]  77>>YKq59::!*1YKu=O!*1YKx@O!!/D4%%~~'D,=,=%3388	6)%3388	%33;;	!//77I<<$&F~ !!$,,<  --#*#,#'#6#6&*&<&<#( .  !ggll9>T6UVww~~k2233K@KK"D[M RSO>>{DQ! !* \\''.\\''.\\./\\\==??FF IF A@~~'++1f..<<AA ==fE++E2++--$$T***40 * ; ; { !< ! ++M4@%22466|[Q !!004$$&>>V+1134//;;D<L<LM ;;B?""$  "||GH?@5=T//58EF4<=>7?~.((/t$ ..v6	//1= L###I$>$>t$DE $ $(99$? $+D	B,>>[ 0J@ ! OKKNKK MNNOs    b$+b) )
c 3"cc c                 :   UR                  5       n/ nUS:X  aW  U R                  S;   aG  SnXS;   a  UR                  U5      /$ U H%  nUR                  U5      nUR                  U5        M'      U$ U H%  nUR                  U5      nUR                  U5        M'     U$ )NrH   )CRNNr/   
SVTR_HGNetzsoftmax_0.tmp_0)get_output_namesr   get_output_handler   )r   r   r   output_namesr   output_nameoutput_tensors          r   r   r   y  s    --/LNu}++/SS'&//<==+ ) ; ;K H%%m4  ,  (K%77DM!!-0 ( r   c                  Z   [        5       n [        R                  R                  (       d!  [        R
                  R                  SS5      nO [        R
                  R                  SS5      nUR                  S5      nU R                  SR                  US   5      5        [        US   5      $ )zb
Get the GPU ID to be used for inference.

Returns:
    int: The GPU ID to be used for inference.
CUDA_VISIBLE_DEVICESr5   HIP_VISIBLE_DEVICESr   z:The first GPU is used for inference by default, GPU ID: {}r   )r   r   r   is_compiled_with_rocmr|   environgetr   r   rw   r   )r   
gpu_id_strgpu_idss      r   r   r     s     \F==..ZZ^^$:C@
ZZ^^$93?
s#G
NNDKKGTUJW wqz?r   c                 j   [         R                  " U5      n[        X5       H  u  pEUR                  [        R
                  5      R                  S5      n[         R                  " X4/SSSS9  [         R                  " UU[        US   5      [        US   5      4[         R                  SS	S
S9  M     U$ )Nr*      T   r   r   r   color	thicknessr   r   r   )r   r   r*   gffffff?)r   r   r   r*   )orgfontFace	fontScaler   r   )cv2imreadzipastypenpint32reshape	polylinesputTextr   FONT_HERSHEY_COMPLEX)dt_boxesstrsimg_pathsrc_imboxr<   s         r   draw_e2e_resr     s    ZZ!F'jj"**:6feT!LS\"CG$56--	
 ( Mr   c           	          U  H^  n[         R                  " U5      R                  [         R                  5      R	                  SS5      n[
        R                  " X/SSSS9  M`     U$ )Nr   r   Tr   r   )r   arrayr   r   r   r   r   )r   imgr   s      r   draw_text_det_resr    sP    hhsm""288,44R;c5$mqI  Jr   c                     [         R                  " U 5      n U R                  n[         R                  " USS 5      n[	        U5      [	        U5      -  n[
        R                  " U SSXDS9n U $ )zB
resize img and limit the longest side of the image to input_size
r   r   N)fxfy)r   r   shaper#   r=   r   resize)r   
input_sizeim_shapeim_size_maxim_scales        r   
resize_imgr    s[     ((3-CyyH&&!A'KZ 5#55H
**S$
?CJr   c           	         Uc  S/[        U5      -  n[        U5      n[        U5       H  nUb'  X7   U:  d  [        R                  " X7   5      (       a  M-  [        R
                  " [        R                  " X   5      / SQ5      R                  [        R                  5      n[        R                  " [        R                  " U 5      U/SSS5      n M     Ubz  [        R                  " [        U SS95      n	[        UUU	R                  S   SUUS	9n
[        R                  " [        R                  " U	5      [        R                  " U
5      /SS
9n	U	$ U $ )a  
Visualize the results of OCR detection and recognition
args:
    image(Image|array): RGB image
    boxes(list): boxes with shape(N, 4, 2)
    txts(list): the texts
    scores(list): txxs corresponding scores
    drop_score(float): only scores greater than drop_threshold will be visualized
    font_path: the path of font which is used to draw text
return(array):
    the visualized img
r*   r   Tr   r   r   r   X  )r  r   )img_himg_w	threshold	font_pathaxis)r   rangemathisnanr   r   r   r   int64r   r   r  text_visualr  concatenate)imageboxestxtsscores
drop_scorer  box_numr   r   r   txt_imgs              r   draw_ocrr"    s   ( ~s5z!%jG7^69z#9TZZ	=R=Rjj%(+Z8??IbhhuoudKK	 
 hhz%C89))A, 
 nnbhhsmRXXg->?aH
Lr   c                 J   U R                   U R                  pvU R                  5       n[        R                  " XgS4[        R
                  S9S-  n	[        R                  " S5        [        R                  " U5      n
Ub  [        U5      [        U5      :w  a  S /[        U5      -  n[        [        X5      5       H  u  nu  pUb
  X;   U:  a  M  [        R                  " SS5      [        R                  " SS5      [        R                  " SS5      4nU
R                  XS9  [        Xv4XU5      n[        R                   " U[        R"                  5      R%                  S5      n[&        R(                  " UU/SUS5        [&        R*                  " X5      n	M     [,        R.                  " XS	5      n[,        R0                  " S
US-  U4S5      nUR3                  USSXv45        UR3                  [,        R4                  " U	5      USUS-  U45        [        R                   " U5      $ )N   dtyper   r   )fillr   Tr*   r(   RGBr   r   r   r   )heightwidthcopyr   onesuint8randomseedr   Drawr   	enumerater   randintpolygondraw_box_txt_finer   r   r   r   r   bitwise_andr   blendnewpaste	fromarray)r  r  r  r  r  r  hwimg_left	img_right	draw_leftidxr   txtr   img_right_textptsimg_shows                     r   draw_ocr_box_txtrE    s    <<qzz|Hq	2S8I
KKNx(I|s4yCJ.vE
"$S%56Zc&+
":3'3)?PQSVAWX#**A63YGhhsBHH%--j9nseT5!<OOI>	 7 {{5C0HyyQ
O<HNN8aA\*NN5??9-1a!eQ/?@88Hr   c           	      @   [        [        R                  " US   S   US   S   -
  S-  US   S   US   S   -
  S-  -   5      5      n[        [        R                  " US   S   US   S   -
  S-  US   S   US   S   -
  S-  -   5      5      nUSU-  :  a~  US:  ax  [        R                  " SXE4S5      n[
        R                  " U5      nU(       a"  [        X$U4U5      nUR                  SS/USUS	9  UR                  [        R                  5      nOX[        R                  " SXT4S5      n[
        R                  " U5      nU(       a"  [        X%U4U5      nUR                  SS/USUS	9  [        R                  " SS/US/XT/SU//5      n	[        R                  " U[        R                  S
9n
[        R                  " X5      n[        R                  " U[        R                   S
9n[        R"                  " UUU [        R$                  [        R&                  SS9nU$ )Nr   r$  r   r*      r(  r)  r   )r'  fontr%  )flags
borderModeborderValue)r   r  sqrtr   r8  r   r1  create_fonttext	transpose
ROTATE_270r   float32r   r   getPerspectiveTransformr.  warpPerspectiveINTER_NEARESTBORDER_CONSTANT)img_sizer   rA  r  
box_height	box_widthimg_text	draw_textrH  pts1pts2MrB  s                r   r5  r5    s   		3q6!9s1vay(Q.#a&)c!fQi2GA1MMNJ 		3q6!9s1vay(Q.#a&)c!fQi2GA1MMNI A	M!j2o99UZ$;_MNN8,	s$;YGDNNAq63YTNB%%e&6&6799UY$;_MNN8,	s
$;YGDNNAq63YTNB::
Q)Q)!81j/JD 88Crzz*D##D/Axx1H((	&&#N r   c                 \   [        US   S-  5      n[        R                  " X#SS9n[        [        R                  R                  S5      S   5      S:  a  UR                  U 5      S   nOUR                  U 5      nXQS   :  a(  [        X1S   -  U-  5      n[        R                  " X#SS9nU$ )Nr*   gGz?utf-8encodingrW   r   r&   )r   r   truetypePIL__version__r   getsize	getlength)rA  szr  	font_sizerH  lengths         r   rM  rM  6  s    BqEDL!IiWED
3??  %a()B.c"1%$1~	qE)F23	!!)IKr   c                 6   SSK nS=p#[        U 5      nSnU  Hd  nXaR                  ;   d*  UR                  5       (       d  UR	                  5       (       a  US-  nMC  UR                  5       (       a  US-  nM_  US-  nMf     U[        R                  " US-  5      -
  $ )z
Count the number of Chinese characters,
a single English character and a single number
equal to half the length of Chinese characters.
args:
    s(string): the input of string
return(int):
    the number of Chinese characters
r   Nr*   r   )stringr   ascii_lettersisdigitisspaceisalphar  ceil)srk  count_zhcount_pus_lenen_dg_countcs          r   	str_countrw  D  s     HFEK$$$		qyy{{1KYY[[MHMH  499[1_---r   c                   ^^ Ub  [        U 5      [        U5      :X  d   S5       eUU4S jnU" 5       u  pxSn	Sn
[        R                  " XYSS9nU	S-   n/ nS	u  p[        U 5       GH  u  nnUS
-  nUU   U:  d  [        R
                  " UU   5      (       a  US
-  nM:  Sn[        U5      TU	-  S-
  :  a  UnUSTU	-  S-
   nU(       a  [        U5      S-   U-   nSnOSU-   nUR                  SX-  4UXS9  UTU	-  S-
  S nUTU-  S
-
  :  a0  UR                  [        R                  " U5      5        U" 5       u  pxSnUS
-  n[        U5      TU	-  S-
  :  a  M  U(       a  [        U5      S-   U-   S-   SUU   -  -   nOSU-   S-   SUU   -  -   nUR                  SX-  4UXS9  UTU-  S
-
  :  aB  US
-   [        U 5      :  a0  UR                  [        R                  " U5      5        U" 5       u  pxSnUS
-  nGM     UR                  [        R                  " U5      5        [        U5      S
:X  a  [        R                  " US   5      nO[        R                  " US
S9n[        R                  " U5      $ )a&  
create new blank img and draw txt on it
args:
    texts(list): the text will be draw
    scores(list|None): corresponding score of each txt
    img_h(int): the height of blank img
    img_w(int): the width of blank img
    font_path: the path of font which is used to draw text
return(array):
Nz6The number of txts and corresponding scores must matchc                     > [         R                  " TT/[         R                  S9S-  n SU S S 2TS-
  S 24'   [        R                  " U 5      R                  S5      n [        R                  " U 5      nX4$ )N)r  r&  r   r   r*   r(  )r   r-  r.  r   r:  convertr   r1  )	blank_imgdraw_txtr  r  s     r   create_blank_img%text_visual.<locals>.create_blank_imgo  sd    GG5%.ACG	$%	!UQY[.!OOI.66u=	>>),""r      r   r_  r`  r.   )r*   r   r*   T   z: Fz    r   )rH  z   z%.3fz  r  )r   r   rb  r2  r  r  rw  r<   rN  r   r   r   r  )textsr  r  r  r  r  r}  r{  r|  rh  	txt_colorrH  gaptxt_img_listcountindexr@  rA  
first_linetmpnew_txts     ``                 r   r  r  ]  s    5zS
 
 	DC	D 
# +,IIIiWED
a-CLLEe$S
#;"djj&=&=QJE
n 2Q 66C.*Q./Ce*t+c1"
 3,MM1ck*GYMJey(1,./Cq((##BHHY$78&6&8#	QJE n 2Q 66 %j4'#-5&+8NNGSj4'&F3K*@@Gq#+&FESL1$$q3u:)= 34"2"4IE
? %@ +,
<AHH\!_-	NN<a8	88Ir   c                     SS K nUR                  U R                  S5      5      n[        R                  " U[        R
                  5      n[        R                  " U[        R                  5      nU$ )Nr   utf8)	base64	b64decodeencoder   
frombufferr.  r   imdecodeIMREAD_COLOR)b64strr  datas      r   base64_to_cv2r    sM    FMM&12D==rxx(D<<c../DKr   c                 R   Uc  S/[        U5      -  n[        X5       H  u  pEXS:  a  M  [        R                  " [        R                  " U5      / SQ5      R                  [        R                  5      n[        R                  " [        R                  " U 5      U/SSS5      n M     U $ )Nr*   r   Tr  r   )	r   r   r   r   r   r   r  r   r   )r  r  r  r  r   scores         r   
draw_boxesr    s    ~s5z!%(
jj#
3::288DbhhuoudKK	 )
 Lr   c           
         [        U5      S:X  d   S5       e[        [        [        R                  R                  US   US   -
  5      [        R                  R                  US   US   -
  5      5      5      n[        [        [        R                  R                  US   US   -
  5      [        R                  R                  US   US   -
  5      5      5      n[        R                  " SS/US/X#/SU//5      n[        R                  " X5      n[        R                  " U UX#4[        R                  [        R                  S9nUR                  SS u  pxUS-  U-  S	:  a  [        R                  " U5      nU$ )
a$  
img_height, img_width = img.shape[0:2]
left = int(np.min(points[:, 0]))
right = int(np.max(points[:, 0]))
top = int(np.min(points[:, 1]))
bottom = int(np.max(points[:, 1]))
img_crop = img[top:bottom, left:right, :].copy()
points[:, 0] = points[:, 0] - left
points[:, 1] = points[:, 1] - top
r  zshape of points must be 4*2r   r*   r   r$  )rJ  rI  r-   r%   )r   r   r#   r   linalgnormrQ  r   rR  rS  BORDER_REPLICATEINTER_CUBICr  rot90)	r   pointsimg_crop_widthimg_crop_heightpts_stdr]  dst_imgdst_img_heightdst_img_widths	            r   get_rotate_crop_imager    s`    v;!:::IINN6!9vay01299>>&)fUViBW3X	
N
 IINN6!9vay01299>>&)fUViBW3X	
O
 jjFQ- 		
G 	##F4A!!		)''ooG %,MM!A$6!Nm+s2((7#Nr   c                    [         R                  " [        R                  " U5      R	                  [        R
                  5      5      n[        [        [         R                  " U5      5      S S9nSu  p4pVUS   S   US   S   :  a  SnSnOSnSnUS   S   US   S   :  a  SnSnOSnSnX   X   X   X   /n[        U [        R                  " U5      5      nU$ )Nc                     U S   $ )Nr    )xs    r   <lambda>'get_minarea_rect_crop.<locals>.<lambda>  s    QqTr   )key)r   r*   r   r$  r*   r   r$  r   )
r   minAreaRectr   r   r   r   sortedr>   	boxPointsr  )	r   r  bounding_boxindex_aindex_bindex_cindex_dr   crop_imgs	            r   get_minarea_rect_cropr    s    ??288F#3#:#:288#DELD|45>JF)3&Ggay|fQil"ay|fQil"?FOV_fo
NC$S"((3-8HOr   c              #     #    [        U [        R                  5      (       d  [        R                  " U 5      n U R                  S S u  pEXB-   S-
  U-  nXQ-   S-
  U-  nUS:  d   SU S35       eUS:  d   SU S35       eXc:  a   [        SXC-  5      S-   n  SU SU S	35       eXs:  a   [        SXS-  5      S-   n	  SU S
U	 S	35       e[        U5       Hp  n
[        SX-  5      n[        U
S-   U-  U5      nXU2S S 24   n[        U5       H4  n[        SX-  5      n[        US-   U-  U5      nUS S 2UU24   nUX4v   M6     Mr     g 7f)Nr   r*   r   zInvalid number (z) of vertical slicesz) of horizontal slicesz#Too computationally expensive with z< slices, try a higher vertical stride (recommended minimum: )z> slices, try a higher horizontal stride (recommended minimum: )
isinstancer   ndarrayr   r  r#   r  min)r  horizontal_stridevertical_stridemaximum_slicesimage_himage_wvertical_num_sliceshorizontal_num_slicesrecommended_vertical_striderecommended_horizontal_stridev_slice_idxv_startv_endvertical_sliceh_slice_idxh_starth_endhorizontal_slices                     r   slice_generatorr    s    eRZZ(({{2AG"4q8_L$81<ARR 	aD	-..BCD 	!H	/00FGH! ,&)!W-F&G!&K#	a01D0E  FB  C^  B_  _`  a	a .(+Aw/H(IA(M%	g01F0G  HF  Gd  Fe  ef  g	g 01a+79kAo87Cu}a/0 !67K!k=?G+/->>IE-a.>?#W66 8	 2s   EE	c                 J    U S   S   nU S   S   nU S   S   nU S   S   nXX44$ )Nr   r*   r   r  )r   min_xmax_xmin_ymax_ys        r   calculate_box_extentsr  &  sA    F1IEF1IEF1IEF1IE%%r   c                    [        U 5      u  pEpg[        U5      u  pp[        Xj-
  5      U::  aX  [        X{-
  5      U::  aG  [        XX-
  5      U::  a6  [        XH5      n[        XY5      n[        Xj5      n[        X{5      nX/X/X/X//$ g rC   )r  absr  r#   )box1box2x_thresholdy_thresholdmin_x1max_x1min_y1max_y1min_x2max_x2min_y2max_y2new_xminnew_xmaxnew_yminnew_ymaxs                   r   merge_boxesr  .  s    %:4%@"FF%:4%@"FF 	FO+ K/ K/v&v&v&v&    	
 	
 r   c           	         / n[        5       n[        U 5       Hy  u  pVXT;   a  M  U Vs/ s H  owS S  PM	     nn[        XS-   S  US-   S9 H2  u  pX;  d  M  [        XXS9nU(       d  M  UnUR                  U	5        M4     UR	                  U5        M{     [        U5      [        U 5      :X  a  [        R                  " U5      $ [        X1U5      $ s  snf )Nr*   )start)r  r  )	setr2  r  addr   r   r   r   merge_fragmented)r  r  r  merged_boxesvisitedr   r  point
merged_boxjr  merged_results               r   r  r  E  s    LeGU#<,01D5AhD
1 1uwq1u=GA ++! !=!.JKKN > 	J' $" <CJ&xx%%;GG! 2s   Cc                     U (       a>  [         R                  " 5       (       a"  [         R                  R                  5       S:X  a  Sn U $ )NcpuF)r   is_compiled_with_cudar   
get_device)r   s    r   	check_gpur  `  s2    ((**fmm.F.F.HE.QNr   __main__)r  )NNr(   r2   )r2   )i  r  g        z./doc/simfang.ttf)Nr(   )r!   )r&   r&   )*r9   r|   rx   r   numpyr   r   rc  r   r   r   r  r   r/  ppocr.utils.loggingr   r   r   rA   rD   r   r   r   r   r  r  r"  rE  r5  rM  rw  r  r  r  r  r  r  r  r  r  r  __name__r  r   r   <module>r     s     	 
 
   
 + +    *79BJ
G?T$("	 
'(\ 
'@%P.4 CVGT)X.%7P&.H6 z r   