Ë
    \;jûq  ã                   óN  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ d dlZd dlmZ d dlZd dlZd dlmZ d„ Zd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zdd„Z	 	 	 	 d d„Z	 	 	 	 d d„Zd!d„Zd!d„Zd„ Z 	 d"d„Z!d„ Z"d#d„Z#d„ Z$d„ Z%d$d„Z&d„ Z'd„ Z(d%d„Z)d„ Z*e+dk(  ryy)&é    N)ÚImageÚ	ImageDrawÚ	ImageFont)Ú	inference)Ú
get_loggerc                 ó&   — | j                  «       dv S )N)ÚtrueÚyesÚtÚyÚ1)Úlower)Úvs    úfG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddleocr/tools/infer/utility.pyÚstr2boolr      s   € Ø�7‰7‹9Ð6Ð6Ð6ó    c           	      óŠ   — t        | j                  d«      D �cg c]  }t        |j                  «       «      ‘Œ c}«      S c c}w )NÚ,)ÚtupleÚsplitÚintÚstrip)r   Úis     r   Ústr2int_tupler   #   s1   € Ü¨!¯'©'°#¬,Ó7©, Q”#�a—g‘g“i•.¨,Ñ7Ó8Ð8ùÒ7s   ™ A c                  óÌ  — t        j                  «       } | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  d	t        d¬«       | j                  d
t        d¬«       | j                  dt
        d¬«       | j                  dt        d¬«       | j                  dt        d¬«       | j                  dt
        ¬«       | j                  dt        d¬«       | j                  dt
        d¬«       | j                  dt
        ¬«       | j                  dt        d¬«       | j                  dt
        d¬«       | j                  dt
        d¬«       | j                  dt        d¬«       | j                  d t        d!¬«       | j                  d"t        d#¬«       | j                  d$t        d%¬«       | j                  d&t        d¬«       | j                  d't
        d(¬«       | j                  d)t        d*¬«       | j                  d+t        d,¬«       | j                  d-t        d.¬«       | j                  d/t        d0¬«       | j                  d1t        d.¬«       | j                  d2t        d¬«       | j                  d3t        d4¬«       | j                  d5t        d6¬«       | j                  d7t        d8¬«       | j                  d9t        g d:¢¬«       | j                  d;t        d<¬«       | j                  d=t        d<¬«       | j                  d>t        d?¬«       | j                  d@t
        dA¬«       | j                  dBt
        ¬«       | j                  dCt        d¬«       | j                  dDt
        dE¬«       | j                  dFt        dG¬«       | j                  dHt        dI¬«       | j                  dJt
        dK¬«       | j                  dLt        d¬«       | j                  dMt
        dN¬«       | j                  dOt        d0¬«       | j                  dPt
        dQ¬«       | j                  dRt
        ¬«       | j                  dSt        dT¬«       | j                  dUt
        d¬«       | j                  dVt        d0¬«       | j                  dWt
        dX¬«       | j                  dYt
        dZ¬«       | j                  d[t
        d(¬«       | j                  d\t        d¬«       | j                  d]t
        ¬«       | j                  d^t
        d_¬«       | j                  d`t        dadbg¬«       | j                  dct        dG¬«       | j                  ddt        de¬«       | j                  dft        d¬«       | j                  dgt        d%¬«       | j                  dht        d¬«       | j                  dit        d¬«       | j                  djt
        ¬«       | j                  dkt
        dl¬«       | j                  dmt        d8¬«       | j                  dnt
        do¬«       | j                  dpt        d¬«       | j                  dqt
        dr¬«       | j                  dst        d¬«       | j                  dtt        d8¬«       | j                  dut        d¬«       | j                  dvt        d¬«       | j                  dwt
        dx¬«       | j                  dyt        d¬«       | j                  dzt        d¬«       | j                  d{t        dd|¬}«       | S )~Nz	--use_gpuT)ÚtypeÚdefaultz	--use_xpuFz	--use_npuz	--use_mluz
--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--return_word_boxzxWhether return the bbox of each word (split by space) or chinese character. Only used in ppstructure for layout recovery)r   r   Úhelp)ÚargparseÚArgumentParserÚadd_argumentr   r   ÚstrÚfloatÚlist©Úparsers    r   Ú	init_argsr?   '   sä  € Ü×$Ñ$Ó&€Fà
×Ñ˜¬(¸DÐÔAØ
×Ñ˜¬(¸EÐÔBØ
×Ñ˜¬(¸EÐÔBØ
×Ñ˜¬(¸EÐÔBØ
×Ñ˜¬8¸TÐÔBØ
×ÑÐ(¬xÀÐÔGØ
×ÑÐ-´CÀÐÔDØ
×Ñ˜¬C¸ÐÔ@Ø
×Ñ˜¬#°sÐÔ;Ø
×Ñ˜
¬°aÐÔ8ð ×Ñ˜¬CÐÔ0Ø
×Ñ˜¬3¸ÐÔ:Ø
×ÑÐ)´¸TÐÔBØ
×ÑÐ)´ÐÔ4Ø
×ÑÐ.´UÀCÐÔHØ
×ÑÐ*´¸eÐÔDØ
×ÑÐ(¬s¸FÐÔCð ×ÑÐ)´¸sÐÔCØ
×ÑÐ-´EÀ3ÐÔGØ
×ÑÐ/´eÀSÐÔIØ
×ÑÐ*´¸bÐÔAØ
×ÑÐ(¬xÀÐÔGØ
×ÑÐ-´CÀÐÔHð ×ÑÐ1¼ÀsÐÔKØ
×ÑÐ1¼ÀsÐÔKØ
×ÑÐ/´eÀSÐÔIð ×ÑÐ1¼ÀsÐÔKØ
×ÑÐ/´eÀSÐÔIð ×ÑÐ*´ÀÐÔBØ
×ÑÐ.´UÀDÐÔIØ
×ÑÐ,´5À"ÐÔEØ
×ÑÐ)´¸QÐÔ?ð ×Ñ˜
¬²{ÐÔCØ
×Ñ˜	¬°sÐÔ;Ø
×Ñ˜¤u°cÐÔ:Ø
×ÑÐ*´¸aÐÔ@ð ×ÑÐ)´¸\ÐÔJØ
×ÑÐ)´ÐÔ4Ø
×ÑÐ-´HÀdÐÔKØ
×ÑÐ+´#¸|ÐÔLØ
×ÑÐ)´¸QÐÔ?Ø
×ÑÐ+´#¸rÐÔBØ
×ÑØ¤SÐ2Sð ô ð ×ÑÐ*´À4ÐÔHØ
×ÑÐ)´Ð=VÐÔWØ
×Ñ˜¬U¸CÐÔ@ð ×ÑÐ)´¸WÐÔEØ
×ÑÐ)´ÐÔ4Ø
×ÑÐ.´UÀCÐÔHØ
×ÑÐ*´¸eÐÔDð ×ÑÐ2¼ÈÐÔLØ
×ÑØ¤SÐ2Oð ô ð ×ÑÐ/´cÀ;ÐÔOØ
×ÑÐ*´¸fÐÔEð ×ÑÐ)´À%ÐÔHØ
×ÑÐ)´ÐÔ4Ø
×ÑÐ+´#¸|ÐÔLØ
×Ñ˜¬T¸CÀ¸<ÐÔHØ
×ÑÐ)´¸QÐÔ?Ø
×Ñ˜¬U¸CÐÔ@à
×ÑÐ)´À%ÐÔHØ
×Ñ˜¬c¸2ÐÔ>Ø
×ÑÐ)´À%ÐÔHØ
×Ñ˜
¬¸5ÐÔAð ×ÑÐ(¬sÐÔ3Ø
×ÑÐ*´¸lÐÔKØ
×ÑÐ(¬s¸AÐÔ>ð ×ÑÐ-´CÐAVÐÔWØ
×ÑÐ)´À%ÐÔHØ
×ÑÐ-´CÀÐÔLð ×Ñ˜
¬¸5ÐÔAØ
×ÑÐ-´CÀÐÔCØ
×Ñ˜¬S¸!ÐÔ<à
×Ñ˜¬H¸eÐÔDØ
×ÑÐ)´¸_ÐÔMà
×Ñ˜¬8¸TÐÔBØ
×Ñ˜¬8¸UÐÔCð ×ÑØÜØð Hð	 ô ð €Mr   c                  ó6   — t        «       } | j                  «       S ©N)r?   Ú
parse_argsr=   s    r   rB   rB   ¤   s   € Ü‹[€FØ×ÑÓÐr   c                 ó–  — |dk(  r| j                   }nŠ|dk(  r| j                  }nx|dk(  r| j                  }nf|dk(  r| j                  }nT|dk(  r| j                  }nB|dk(  r| j
                  }n0|dk(  r| j                  }n|dk(  r| j                  }n| j                  }|€6|j                  d	j                  ||«      «       t        j                  d
«       | j                  ršd
d l}|}t        j                   j#                  |«      st%        dj                  |«      «      ‚| j&                  r$|j)                  |d| j*                  ddœfg¬«      }n|j)                  |dg¬«      }||j-                  «       d
   d d fS ddg}|D ]g  }dj                  ||«      }dj                  ||«      }	t        j                   j#                  |«      sŒGt        j                   j#                  |	«      sŒg n t        j                   j#                  «      st%        dj                  |«      «      ‚t        j                   j#                  	«      st%        dj                  |«      «      ‚t/        j0                  ||	«      }
t3        | d«      r{| j4                  dk(  r'| j6                  rt.        j8                  j:                  }n_| j4                  dk(  rt.        j8                  j<                  }n5t.        j8                  j>                  }nt.        j8                  j>                  }| j&                  rõtA        «       }|€|jC                  d«       |
jE                  | jF                  | j*                  «       | j6                  �r”|
jI                  d|| jJ                  | jL                  d¬«       t        j                   jO                  ||› d�«      }t        j                   j#                  |«      s%|
jQ                  |«       |j                  d|› �«       	 |
jS                  |d «       nï| jV                  r|
jY                  d"«       nÑ| jZ                  r|
jY                  d#«       n³| j\                  r|
j_                  d$«       n•|
ja                  «        | jb                  ry|
je                  d%«       |
jc                  «        | j4                  dk(  r|
jg                  «        t3        | d&«      r|
ji                  | jj                  «       n|
ji                  d%«       |
jm                  «        |
jo                  «        |
jq                  d'«       |
jq                  d(«       |dk(  r|
jq                  d)«       |dk(  r|
jq                  d*«       |
js                  d«       |
ju                  d «       t/        jv                  |
«      }|jy                  «       }|d+v r*g }|D ]"  }|j{                  |j}                  |«      «       Œ$ n|D ]  }|j}                  |«      }Œ t        | ||«      }|||
fS # tT        $ r-}|j                  |«       |j                  d!«       Y d }~�Œ?d }~ww xY w),NÚdetÚclsÚrecÚtableÚserÚreÚsrÚlayoutznot find {} model file path {}r   znot find model file path {}ÚCUDAExecutionProviderÚDEFAULT)Ú	device_idÚcudnn_conv_algo_search)Ú	providersÚCPUExecutionProviderÚmodelr   z{}/{}.pdmodelz{}/{}.pdiparamsz1not find model.pdmodel or inference.pdmodel in {}z5not find model.pdiparams or inference.pdiparams 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    r%   Úcpu_threadsÚ&conv_transpose_eltwiseadd_bn_fuse_passÚ"matmul_transpose_reshape_fuse_passÚsimplify_with_basic_ops_passÚfc_fuse_pass)rH   rI   )@Ú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Úuse_gpuÚInferenceSessionÚgpu_idÚ
get_inputsr   ÚConfigÚhasattrrS   Úuse_tensorrtÚPrecisionTypeÚHalfÚInt8ÚFloat32Úget_infer_gpuidÚwarningÚenable_use_gpuÚgpu_memÚenable_tensorrt_enginerX   rY   ÚjoinÚcollect_shape_range_infoÚ#enable_tuned_tensorrt_dynamic_shapeÚ	ExceptionÚuse_npuÚenable_custom_deviceÚuse_mluÚuse_xpuÚ
enable_xpuÚdisable_gpuÚenable_mkldnnÚset_mkldnn_cache_capacityÚenable_mkldnn_bfloat16Ú set_cpu_math_library_num_threadsr]   Úenable_memory_optimÚdisable_glog_infoÚdelete_passÚ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_pathÚsessÚ
file_namesÚ	file_nameÚparams_file_pathÚconfigrS   rw   Útrt_shape_fÚEÚ	predictorÚinput_namesÚinput_tensorÚnameÚoutput_tensorss                       r   r˜   r˜   ©   s|  € Øˆu‚}Ø×&Ñ&‰	Ø	�ŠØ×&Ñ&‰	Ø	�ŠØ×&Ñ&‰	Ø	�ŠØ×(Ñ(‰	Ø	�ŠØ×&Ñ&‰	Ø	�ŠØ×%Ñ%‰	Ø	�ŠØ×%Ñ%‰	Ø	�Ò	Ø×)Ñ)‰	à×&Ñ&ˆ	àÐØ�‰Ð4×;Ñ;¸DÀ)ÓLÔMÜ�‰�ŒØ‡}‚}Û!à#ˆÜ�w‰w�~‰~˜oÔ.ÜÐ:×AÑAÀ/ÓRÓSÐSØ�<Š<Ø×'Ñ'Øð 0Ø&*§k¡kÈYÑWððð (ó ‰Dð ×'Ñ'ØÐ,BÐ+Cð (ó ˆDð �T—_‘_Ó& qÑ)¨4°Ð5Ð5ð ˜{Ð+ˆ
Û#ˆIØ-×4Ñ4°YÀ	ÓJˆOØ0×7Ñ7¸	À9ÓMÐÜ�w‰w�~‰~˜oÕ.´2·7±7·>±>ÐBRÕ3SÙð	 $ô
 �w‰w�~‰~˜oÔ.ÜØC×JÑJÈ9ÓUóð ô �w‰w�~‰~Ð.Ô/ÜØG×NÑNØóóð ô ×!Ñ! /Ð3CÓDˆä�4˜Ô%Ø�~‰~ Ò'¨D×,=Ò,=Ü%×3Ñ3×8Ñ8‘	Ø—‘ 6Ò)Ü%×3Ñ3×8Ñ8‘	ä%×3Ñ3×;Ñ;‘	ä!×/Ñ/×7Ñ7ˆIà�<Š<Ü$Ó&ˆFØˆ~Ø—‘Øôð ×!Ñ! $§,¡,°·±Ô<Ø× Ó Ø×-Ñ-Ø#*Ø#,Ø#'×#6Ñ#6Ø&*×&<Ñ&<Ø#(ð .ô ô !Ÿg™gŸl™l¨9¸¸Ð>TÐ6UÓV�ä—w‘w—~‘~ kÔ2Ø×3Ñ3°KÔ@Ø—K‘KÐ"DÀ[ÀMÐ RÔSðOØ×>Ñ>¸{ÈDÕQð
 �\Š\Ø×'Ñ'¨Õ.Ø�\Š\Ø×'Ñ'¨Õ.Ø�\Š\Ø×ÑÐ.Õ/à×ÑÔ Ø×!Ò!à×0Ñ0°Ô4Ø×$Ñ$Ô&Ø—>‘> VÒ+Ø×1Ñ1Ô3Ü˜4 Ô/Ø×;Ñ;¸D×<LÑ<LÕMð ×;Ñ;¸BÔ?à×"Ñ"Ô$Ø× Ñ Ô"Ø×ÑÐCÔDØ×ÑÐ?Ô@Ø�4Š<Ø×ÑÐ=Ô>Ø�7Š?Ø×Ñ˜~Ô.Ø×(Ñ(¨Ô/Ø×Ñ˜tÔ$ô ×.Ñ.¨vÓ6ˆ	Ø×/Ñ/Ó1ˆØ�=Ñ ØˆLÛ#�Ø×#Ñ# I×$>Ñ$>¸tÓ$DÕEñ $ó $�Ø(×9Ñ9¸$Ó?‘ð $ä+¨D°$¸	ÓBˆØ˜,¨¸Ð>Ð>øô] !ò OØ—K‘K ”NØ—K‘KÐ M×NÒNûðOús   ÐX Ø	YØ"YÙYc                 ó(  — |j                  «       }g }|dk(  rQ| j                  dv rCd}||v r|j                  |«      gS |D ]$  }|j                  |«      }|j                  |«       Œ& |S |D ]$  }|j                  |«      }|j                  |«       Œ& |S )NrF   )ÚCRNNr.   Ú
SVTR_HGNetzsoftmax_0.tmp_0)Úget_output_namesÚrec_algorithmÚget_output_handlerš   )r�   rž   rª   Úoutput_namesr®   Úoutput_nameÚoutput_tensors          r   rœ   rœ   =  s­   € Ø×-Ñ-Ó/€LØ€NØˆu‚}˜×+Ñ+Ð/SÑSØ'ˆØ˜,Ñ&Ø×/Ñ/°Ó<Ð=Ð=ã+�Ø )× ;Ñ ;¸KÓ H�Ø×%Ñ% mÕ4ð  ,ð Ðó (ˆKØ%×7Ñ7¸ÓDˆMØ×!Ñ! -Õ0ð (ð Ðr   c                  ó>  — t        j                  «       } | dk(  ryt        j                  j                  sd}nd}t        j                  |«      j                  «       }t        |«      dk(  ry|d   j                  «       j                  d«      d   }t        |d   «      S )NÚWindowsr   zenv | grep CUDA_VISIBLE_DEVICESzenv | grep HIP_VISIBLE_DEVICESÚ=r)   )ÚplatformÚsystemÚpaddleÚdeviceÚis_compiled_with_rocmrq   ÚpopenÚ	readlinesÚlenr   r   r   )ÚsysstrÚcmdÚenv_cudarw   s       r   r€   r€   O  s…   € Ü�_‰_Ó€FØ�ÒØä�=‰=×.Ò.Ø/‰à.ˆÜ�x‰x˜‹}×&Ñ&Ó(€HÜ
ˆ8ƒ}˜ÒØà˜!‘×"Ñ"Ó$×*Ñ*¨3Ó/°Ñ2ˆÜ�6˜!‘9‹~Ðr   c           
      ór  — t        j                  |«      }t        | |«      D ]’  \  }}|j                  t        j
                  «      j                  d«      }t        j                  ||gddd¬«       t        j                  ||t        |d   «      t        |d   «      ft         j                  dd	d
¬«       Œ” |S )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�   € Ü�Z‰Z˜Ó!€FÜ˜ $Ö'‰ˆˆSØ�j‰jœŸ™Ó"×*Ñ*¨:Ó6ˆÜ�‰�f˜s˜e T°È!ÕLÜ�‰ØØÜ�S˜‘\Ó"¤C¨¨G©Ó$5Ð6Ü×-Ñ-ØØØö	
ð (ð €Mr   c                 óÎ   — | D ]_  }t        j                  |«      j                  t         j                  «      j	                  dd«      }t        j                  ||gddd¬«       Œa |S )NrÈ   rÉ   TrÊ   rÌ   )r×   ÚarrayrÖ   rØ   rÙ   rÓ   rÚ   )rÝ   Úimgrá   s      r   Údraw_text_det_resræ   q  sR   € ÛˆÜ�h‰h�s‹m×"Ñ"¤2§8¡8Ó,×4Ñ4°R¸Ó;ˆÜ�‰�c˜C˜5 $¨mÀqÖIð ð €Jr   c                 óÚ   — t        j                  | «      } | j                  }t        j                  |dd «      }t	        |«      t	        |«      z  }t        j                  | dd||¬«      } | S )zJ
    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ð   x  s]   € ô �(‰(�3‹-€CØ�y‰y€HÜ—&‘&˜ ! A˜Ó'€KÜ�ZÓ ¤5¨Ó#5Ñ5€HÜ
�*‰*�S˜$ ¨°hÔ
?€CØ€Jr   c                 ó–  — |€dgt        |«      z  }t        |«      }t        |«      D ]�  }|�!||   |k  st        j                  ||   «      rŒ&t	        j
                  t	        j                  ||   «      g d¢«      j                  t        j                  «      }t        j                  t	        j                  | «      |gddd«      } ŒŸ |�t	        j                  t        | d¬«      «      }	t        |||	j                  d   d||¬	«      }
t	        j                  t	        j                  |	«      t	        j                  |
«      gd¬
«      }	|	S | S )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  € ð( €~Ø�”s˜5“zÑ!ˆÜ�%‹j€GÜ�7Ž^ˆØÐ 6¨!¡9¨zÒ#9¼T¿Z¹ZÈÈqÉ	Ô=RØÜ�j‰jœŸ™ %¨¡(Ó+ªZÓ8×?Ñ?ÄÇÁÓIˆÜ—‘œbŸh™h u›o°¨u°d¸KÈÓK‰ð	 ð
 ÐÜ�h‰h”z %°CÔ8Ó9ˆÜØØØ—)‘)˜A‘,ØØ Øô
ˆô �n‰nœbŸh™h s›m¬R¯X©X°gÓ->Ð?ÀaÔHˆØˆ
Ø€Lr   c                 óD  — | j                   | j                  }}| j                  «       }t        j                  ||dft        j
                  ¬«      dz  }	t        j                  d«       t        j                  |«      }
|�t        |«      t        |«      k7  rd gt        |«      z  }t        t        ||«      «      D ]Ú  \  }\  }}|�	||   |k  rŒt        j                  dd«      t        j                  dd«      t        j                  dd«      f}|
j                  ||¬«       t        ||f|||«      }t        j                   |t        j"                  «      j%                  d«      }t'        j(                  ||gd|d«       t'        j*                  |	|«      }	ŒÜ t-        j.                  | |d	«      }t-        j0                  d
|dz  |fd«      }|j3                  |dd||f«       |j3                  t-        j4                  |	«      |d|dz  |f«       t        j                   |«      S )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_txtr*  ¯  sÀ  € ð �<‰<˜Ÿ™€q€AØ�z‰z‹|€HÜ—‘˜˜A˜q˜	¬¯©Ô2°SÑ8€IÜ
‡K�K�„Nä—‘˜xÓ(€IØ€|”s˜4“y¤C¨£JÒ.Øˆvœ˜E›
Ñ"ˆÜ$¤S¨°Ó%5Ö6‰ˆ‰Zˆc�3ØÐ &¨¡+°
Ò":ØÜ—‘  3Ó'¬¯©¸¸3Ó)?ÄÇÁÐPQÐSVÓAWÐXˆØ×Ñ˜# EÐÔ*Ü*¨A¨q¨6°3¸¸YÓGˆÜ�h‰h�sœBŸH™HÓ%×-Ñ-¨jÓ9ˆÜ�‰�n s e¨T°5¸!Ô<Ü—O‘O I¨~Ó>‰	ð 7ô �{‰{˜5 (¨CÓ0€HÜ�y‰y˜  Q¡¨ 
¨OÓ<€HØ‡N�N�8˜a  A q˜\Ô*Ø‡N�N”5—?‘? 9Ó-°°1°a¸!±e¸QÐ/?Ô@Ü�8‰8�HÓÐr   c                 ó<  — t        t        j                  |d   d   |d   d   z
  dz  |d   d   |d   d   z
  dz  z   «      «      }t        t        j                  |d   d   |d   d   z
  dz  |d   d   |d   d   z
  dz  z   «      «      }|d|z  kD  r{|dkD  rvt        j                  d||fd«      }t        j                  |«      }|r&t        |||f|«      }|j                  ddg|d|¬	«       |j                  t        j                  «      }nVt        j                  d||fd«      }t        j                  |«      }|r&t        |||f|«      }|j                  ddg|d|¬	«       t        j                  ddg|dg||gd|gg«      }	t        j                  |t        j                  ¬
«      }
t        j                  |	|
«      }t        j                  |t        j                   ¬
«      }t        j"                  ||| t        j$                  t        j&                  d¬«      }|S )Nr   r	  rÉ   r)   é   r  r  rÏ   )r  Úfontr
  )ÚflagsÚ
borderModeÚborderValue)r   rû   Úsqrtr   r  r   r  Úcreate_fontÚtextÚ	transposeÚ
ROTATE_270r×   Úfloat32rä   rÓ   ÚgetPerspectiveTransformr  ÚwarpPerspectiveÚINTER_NEARESTÚBORDER_CONSTANT)Úimg_sizerá   r&  r÷   Ú
box_heightÚ	box_widthÚimg_textÚ	draw_textr-  Úpts1Úpts2ÚMr'  s                r   r  r  Ï  s  € ÜÜ�	‰	�3�q‘6˜!‘9˜s 1™v a™yÑ(¨QÑ.°#°a±&¸±)¸cÀ!¹fÀQ¹iÑ2GÈAÑ1MÑMÓNó€Jô Ü�	‰	�3�q‘6˜!‘9˜s 1™v a™yÑ(¨QÑ.°#°a±&¸±)¸cÀ!¹fÀQ¹iÑ2GÈAÑ1MÑMÓNó€Ið �A˜	‘MÒ! j°2¢oÜ—9‘9˜U Z°Ð$;¸_ÓMˆÜ—N‘N 8Ó,ˆ	ÙÜ˜s Z°Ð$;¸YÓGˆDØ�N‰N˜A˜q˜6 3¨Y¸TˆNÔBØ×%Ñ%¤e×&6Ñ&6Ó7‰ä—9‘9˜U Y°
Ð$;¸_ÓMˆÜ—N‘N 8Ó,ˆ	ÙÜ˜s Y°
Ð$;¸YÓGˆDØ�N‰N˜A˜q˜6 3¨Y¸TˆNÔBä�:‰:Ø
ˆQˆ�)˜Q� )¨ZÐ!8¸1¸j¸/ÐJó€Dô �8‰8�CœrŸz™zÔ*€DÜ×#Ñ# D¨$Ó/€Aä�x‰x˜¬¯©Ô1€HÜ×(Ñ(ØØ	ØÜ×ÑÜ×&Ñ&Ø#ô€Nð Ðr   c                 óh  — t        |d   dz  «      }t        j                  ||d¬«      }t        t        j                  j                  d«      d   «      dk  r|j                  | «      d   }n|j                  | «      }||d   kD  r,t        ||d   z  |z  «      }t        j                  ||d¬«      }|S )Nr)   g®Gáz®ï?úutf-8©ÚencodingÚ.r   r%   )r   r   ÚtruetypeÚPILÚ__version__r   ÚgetsizeÚ	getlength)r&  Úszr÷   Ú	font_sizer-  Úlengths         r   r2  r2  ÷  s¦   € Ü�B�q‘E˜D‘LÓ!€IÜ×Ñ˜i¨¸WÔE€DÜ
Œ3�?‰?× Ñ  Ó% aÑ(Ó)¨BÒ.Ø—‘˜cÓ" 1Ñ%‰à—‘ Ó$ˆà��1‘‚~Ü˜	 B q¡EÑ)¨FÑ2Ó3ˆ	Ü×!Ñ! )¨YÀÔIˆØ€Kr   c                 ó  — ddl }dx}}t        | «      }d}| D ]Q  }||j                  v s |j                  «       s|j	                  «       r|dz  }Œ7|j                  «       r|dz  }ŒM|dz  }ŒS |t        j                  |dz  «      z
  S )a  
    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)ÚsrQ  Úcount_zhÚcount_puÚs_lenÚen_dg_countÚcs          r   Ú	str_countr]    s†   € ó àÐ€HˆxÜ�‹F€EØ€KÛˆØ�×$Ñ$Ñ$¨¯	©	¬°q·y±y´{Ø˜1Ñ‰KØ�Y‰YŒ[Ø˜‰M‰Hà˜‰M‰Hð ð ”4—9‘9˜[¨1™_Ó-Ñ-Ð-r   c                 óÌ  ‡‡— |�t        | «      t        |«      k(  sJ d«       ‚ˆˆfd„} |«       \  }}d}	d}
t        j                  ||	d¬«      }|	dz   }g }d	\  }}t        | «      D �]…  \  }}|d
z  }||   |k  st	        j
                  ||   «      r|d
z  }Œ2d}t        |«      ‰|	z  dz
  k\  r¢|}|d‰|	z  dz
   }|rt        |«      dz   |z   }d}nd|z   }|j                  d||z  f||
|¬«       |‰|	z  dz
  d }|‰|z  d
z
  k\  r0|j                  t        j                  |«      «        |«       \  }}d}|d
z  }t        |«      ‰|	z  dz
  k\  rŒ¢|rt        |«      dz   |z   dz   d||   z  z   }nd|z   dz   d||   z  z   }|j                  d||z  f||
|¬«       |‰|z  d
z
  k\  rA|d
z   t        | «      k  r0|j                  t        j                  |«      «        |«       \  }}d}|d
z  }�Œˆ |j                  t        j                  |«      «       t        |«      d
k(  rt        j                  |d   «      }nt        j                  |d
¬«      }t        j                  |«      S )aJ  
    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                  óî   •— t        j                  ‰‰gt         j                  ¬«      dz  } d| d d …‰dz
  d …f<   t        j                  | «      j                  d«      } t        j                  | «      }| |fS )N)rê   r  rË   r   r)   r  )r×   r  rU   r   r  Úconvertr   r  )Ú	blank_imgÚdraw_txtrô   rõ   s     €€r   Úcreate_blank_imgz%text_visual.<locals>.create_blank_img0  sf   ø€ Ü—G‘G 5¨% .¼¿¹Ô@À3ÑFˆ	Ø$%ˆ	’!�U˜Q‘Y‘[�.Ñ!Ü—O‘O IÓ.×6Ñ6°uÓ=ˆ	Ü—>‘> )Ó,ˆØ˜(Ð"Ð"r   é   rÏ   rD  rE  r-   )r)   r   r)   Té   z: Fz    r   )r-  z   z%.3fz  rø   )rÂ   r   rH  r  rû   rü   r]  r:   r3  rš   r×   rä   rÿ   )Útextsr  rô   rõ   rö   r÷   rc  ra  rb  rN  Ú	txt_colorr-  ÚgapÚtxt_img_listÚcountÚindexr%  r&  Ú
first_lineÚtmpÚnew_txts     ``                 r   rþ   rþ     s¹  ù€ ð ÐÜ�5‹zœSØó
ò 
ð 	DàCó	Dð 
õ#ñ +Ó,Ñ€Iˆxà€IØ€IÜ×Ñ˜i¨¸WÔE€Dà
�a‰-€CØ€LØ�L€Eˆ5Ü˜e×$‰ˆˆSØ�‰
ˆØ�#‰;˜Ò"¤d§j¡j°¸±Ô&=Ø�Q‰JˆEØØˆ
Ü˜‹n ¨Ñ 2°QÑ 6Ò6ØˆCØÐ.˜ Ñ*¨QÑ.Ð/ˆCÙÜ˜e›* tÑ+¨cÑ1�Ø"‘
à  3™,�Ø�M‰M˜1˜c E™kÐ*¨G°YÀTˆMÔJØ�e˜yÑ(¨1Ñ,Ð.Ð/ˆCØ˜ ™ qÑ(Ò(Ø×#Ñ#¤B§H¡H¨YÓ$7Ô8Ù&6Ó&8Ñ#�	˜8Ø�Ø�Q‰JˆEô ˜‹n ¨Ñ 2°QÑ 6Ó6ñ Ü˜%“j 4Ñ'¨#Ñ-°Ñ5¸À&ÈÁ+Ñ8NÑN‰Gà˜S‘j 4Ñ'¨&°F¸3±KÑ*@Ñ@ˆGØ�‰�q˜# ™+Ð&¨°ÀˆÔFà�E˜S‘L 1Ñ$Ò$¨¨q©´3°u³:Ò)=Ø×Ñ¤§¡¨Ó 3Ô4Ù"2Ó"4ÑˆI�xØˆEØ�‰
Šð? %ð@ ×ÑœŸ™ Ó+Ô,Ü
ˆ<Ó˜AÒÜ—H‘H˜\¨!™_Ó-‰	ä—N‘N <°aÔ8ˆ	Ü�8‰8�IÓÐr   c                 óÞ   — dd l }|j                  | j                  d«      «      }t        j                  |t        j
                  «      }t        j                  |t        j                  «      }|S )Nr   Úutf8)	Úbase64Ú	b64decodeÚencoder×   Ú
frombufferr  rÓ   ÚimdecodeÚIMREAD_COLOR)Úb64strrq  Údatas      r   Úbase64_to_cv2ry  h  sM   € Ûà×Ñ˜FŸM™M¨&Ó1Ó2€DÜ�=‰=˜œrŸx™xÓ(€DÜ�<‰<˜œc×.Ñ.Ó/€DØ€Kr   c                 óF  — |€dgt        |«      z  }t        ||«      D ]€  \  }}||k  rŒt        j                  t        j                  |«      g d¢«      j                  t        j                  «      }t        j                  t        j                  | «      |gddd«      } Œ‚ | S )Nr)   rÇ   Trò   rÉ   )	rÂ   rÕ   r×   rÙ   rä   rÖ   rý   rÓ   rÚ   )r   r  r  r  rá   Úscores         r   Ú
draw_boxesr|  q  s…   € Ø€~Ø�”s˜5“zÑ!ˆÜ˜% Ö(‰
ˆˆUØ�:ÒØÜ�j‰jœŸ™ #›ª
Ó3×:Ñ:¼2¿8¹8ÓDˆÜ—‘œbŸh™h u›o°¨u°d¸KÈÓK‰ð	 )ð
 €Lr   c           
      óö  — t        |«      dk(  sJ d«       ‚t        t        t        j                  j                  |d   |d   z
  «      t        j                  j                  |d   |d   z
  «      «      «      }t        t        t        j                  j                  |d   |d   z
  «      t        j                  j                  |d   |d   z
  «      «      «      }t        j                  ddg|dg||gd|gg«      }t        j                  ||«      }t        j                  | |||ft        j                  t        j                  ¬«      }|j                  dd \  }}|dz  |z  d	k\  rt        j                  |«      }|S )
aH  
    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
    re  zshape of points must be 4*2r   r)   rÉ   r	  )r/  r.  r,   r$   )rÂ   r   r"   r×   ÚlinalgÚnormr6  rÓ   r7  r8  ÚBORDER_REPLICATEÚINTER_CUBICrê   Úrot90)	rå   ÚpointsÚimg_crop_widthÚimg_crop_heightÚpts_stdrB  Údst_imgÚdst_img_heightÚdst_img_widths	            r   Úget_rotate_crop_imagerŠ  |  sh  € ô ˆv‹;˜!ÒÐ:Ð:Ó:ÐÜÜÜ�I‰I�N‰N˜6 !™9 v¨a¡yÑ0Ó1´2·9±9·>±>À&ÈÁ)ÈfÐUVÉiÑBWÓ3Xó	
ó€Nô
 ÜÜ�I‰I�N‰N˜6 !™9 v¨a¡yÑ0Ó1´2·9±9·>±>À&ÈÁ)ÈfÐUVÉiÑBWÓ3Xó	
ó€Oô
 �j‰jà�ˆFØ˜QÐØ˜_Ð-Ø�Ð ð		
ó€Gô 	×#Ñ# F¨GÓ4€AÜ×!Ñ!ØØ	Ø	˜Ð)Ü×'Ñ'Ü�o‰oô€Gð %,§M¡M°!°AÐ$6Ñ!€N�MØ˜Ñ˜mÑ+¨sÒ2Ü—(‘(˜7Ó#ˆØ€Nr   c                 ó¼  — t        j                  t        j                  |«      j	                  t        j
                  «      «      }t        t        t        j                  |«      «      d„ ¬«      }d\  }}}}|d   d   |d   d   kD  rd}d}nd}d}|d   d   |d   d   kD  rd}d}nd}d}||   ||   ||   ||   g}t        | t        j                  |«      «      }|S )Nc                 ó   — | d   S )Nr   © )Úxs    r   Ú<lambda>z'get_minarea_rect_crop.<locals>.<lambda>ª  s   € ÀQÀqÂTr   )Ú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ß   € Ü—?‘?¤2§8¡8¨FÓ#3×#:Ñ#:¼2¿8¹8Ó#DÓE€LÜ”DœŸ™ |Ó4Ó5¹>ÔJ€Fà)3Ñ&€GˆW�g˜wØˆa�y��|�f˜Q‘i ‘lÒ"ØˆØ‰àˆØˆØˆa�y��|�f˜Q‘i ‘lÒ"ØˆØ‰àˆØˆà�'‰?˜F 7™O¨V°G©_¸fÀW¹oÐ
N€CÜ$ S¬"¯(©(°3«-Ó8€HØ€Or   c              #   ó�  K  — t        | t        j                  «      st        j                  | «      } | j                  d d \  }}||z   dz
  |z  }||z   dz
  |z  }|dkD  sJ d|› d�«       ‚|dkD  sJ d|› d�«       ‚||k\  r!t        d||z  «      dz   }	 J d|› d|› d	�«       ‚||k\  r!t        d||z  «      dz   }		 J d|› d
|	› d	�«       ‚t        |«      D ]q  }
t        d|
|z  «      }t        |
dz   |z  |«      }| ||…d d …f   }t        |«      D ]5  }t        d||z  «      }t        |dz   |z  |«      }|d d …||…f   }|||f–— Œ7 Œs y ­w)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  è ø€ Ü�eœRŸZ™ZÔ(Ü—‘˜“ˆà—{‘{ 2 A�Ñ€GˆWØ" _Ñ4°qÑ8¸_ÑLÐØ$Ð'8Ñ8¸1Ñ<ÐARÑRÐð 	˜aÒðDà	Ð-Ð.Ð.BÐCóDØð 	 Ò!ðHà	Ð/Ð0Ð0FÐGóHØ!ð ˜nÒ,Ü&)¨!¨W¸Ñ-FÓ&GÈ!Ñ&KÐ#àð	aà0Ð1DÐ0Eð  FBð  C^ð  B_ð  _`ð  aó	aØð  Ò.Ü(+¨A¨w¸.Ñ/HÓ(IÈAÑ(MÐ%àð	gà0Ð1FÐ0Gð  HFð  Gdð  Feð  efð  gó	gØô Ð0Ö1ˆÜ�a˜+¨Ñ7Ó9ˆÜ�k A‘o¨Ñ8¸7ÓCˆØ˜w u˜}ªaÐ/Ñ0ˆÜ Ð!6Ö7ˆKÜ˜!˜kÐ,=Ñ=Ó?ˆGÜ˜+¨™/Ð->Ñ>ÀÓIˆEØ-ªa°¸°Ð.>Ñ?Ðà# W¨gÐ6Ó6ñ 8ñ	 2ùs   ‚EEc                 óN   — | d   d   }| d   d   }| d   d   }| d   d   }||||fS )Nr   r)   rÉ   r�  )rá   Úmin_xÚmax_xÚmin_yÚmax_ys        r   Úcalculate_box_extentsr·  ç  sE   € Ø�‰F�1‰I€EØ�‰F�1‰I€EØ�‰F�1‰I€EØ�‰F�1‰I€EØ�%˜ Ð%Ð%r   c                 ó&  — t        | «      \  }}}}t        |«      \  }}	}
}t        ||
z
  «      |k  r`t        ||z
  «      |k  rOt        ||z
  «      |k  r>t        ||«      }t        ||	«      }t        ||
«      }t        ||«      }||g||g||g||ggS y rA   )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Ó%@Ñ"€FˆF�F˜FÜ%:¸4Ó%@Ñ"€FˆF�F˜Fô 	ˆF�V‰OÓ Ò+Ü�˜‘Ó  KÒ/Ü�˜‘Ó  KÒ/ä�v˜vÓ&ˆÜ�v˜vÓ&ˆÜ�v˜vÓ&ˆÜ�v˜vÓ&ˆà�xÐ Ø�xÐ Ø�xÐ Ø�xÐ ð	
ð 	
ð r   c                 óœ  — g }t        «       }t        | «      D ]u  \  }}||v rŒ|D �cg c]  }|d d  ‘Œ	 }}t        | |dz   d  |dz   ¬«      D ]/  \  }	}
|	|vsŒt        ||
||¬«      }|sŒ|}|j                  |	«       Œ1 |j	                  |«       Œw t        |«      t        | «      k(  rt        j                  |«      S t        |||«      S c c}w )Nr)   )Ústart)r¼  r½  )	Úsetr  rÊ  Úaddrš   rÂ   r×   rä   Úmerge_fragmented)r  r¼  r½  Úmerged_boxesÚvisitedr   rº  ÚpointÚ
merged_boxÚjr»  Úmerged_results               r   rÏ  rÏ    sÜ   € Ø€LÜ‹e€Gä˜UÖ#‰ˆˆ4Ø�‰<Øá,0Ó1©D 5�e™A’h¨Dˆ
Ð1ä   q¨1¡u w °q¸1±u×=‰GˆAˆtØ˜ÒÜ +Ø °+È;ô!�ò !Ø!.�JØ—K‘K •Nð >ð 	×Ñ˜JÕ'ð $ô" ˆ<ÓœC ›JÒ&Ü�x‰x˜Ó%Ð%ä ¨k¸;ÓGÐGùò! 2s   §C	c                 óx   — | r7t        j                  «       r!t         j                  j                  «       dk(  rd} | S )NÚcpuF)r½   Úis_compiled_with_cudar¾   Ú
get_device)ru   s    r   Ú	check_gpurÚ  !  s/   € ÙÜ×(Ñ(Ô*¬f¯m©m×.FÑ.FÓ.HÈEÒ.QàˆØ€Nr   Ú__main__)ró   )NNr'   r1   )r1   )i�  ró   g        z./doc/simfang.ttf)Nr'   )r    )r%   r%   ),r7   rq   rm   r»   rÓ   Únumpyr×   r½   rI  r   r   r   rû   r   Útimer  Úppocr.utils.loggingr   r   r   r?   rB   r˜   rœ   r€   râ   ræ   rð   r  r*  r  r2  r]  rþ   ry  r|  rŠ  rš  r±  r·  rÊ  rÏ  rÚ  Ú__name__r�  r   r   Ú<module>rà     sò   ðó Û 	Û 
Û Û 
Û Û Û 
ß +Ñ +Û Ý Û Û Ý *ò7ò9òzòzò
Q?òhò$ò"ò"ó	ð 
ØØØ'ó(ð\ 
ØØØ'óó@%óPò.ð4 CVóGòTóò)òXó.%7òP&òó.Hò6ð ˆzÒØð r   