o
    e"a                     @   sT  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d Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zd4ddZ				d5ddZ				d5ddZd6ddZd6d d!Zd"d# Z	$		%	&d7d'd(Z d)d* Z!d8d+d,Z"d-d. Z#d/d0 Z$d1d2 Z%e&d3kr	 dS dS )9    N)Image	ImageDraw	ImageFont)	inference)
get_loggerc                 C   s   |   dv S )N)truet1)lower)v r   MD:\Projects\ConvertPro\env\Lib\site-packages\paddleocr/tools/infer/utility.pystr2bool   s   r   c                  C   s  t  } | jdtdd | jdtdd | jdtdd | jdtdd | jdtdd | jd	td
d | jdtdd | jdtdd | jdtd | jdtdd | jdtdd | jdtd | jdtdd | jdtdd | jdtdd | jdtdd | jdtdd | jd td!d | jd"td#d | jd$tdd | jd%td&d | jd'td(d | jd)td*d | jd+td,d | jd-td.d | jd/td,d | jd0tdd | jd1td2d | jd3td4d | jd5td6d | jd7tg d8d | jd9td:d | jd;td:d | jd<td=d | jd>td?d | jd@td | jdAtdd | jdBtdCd | jdDtdEd | jdFtdGd | jdHtdId | jdJtdd | jdKtdLd | jdMtd.d | jdNtdOd | jdPtd | jdQtdRd | jdStdd | jdTtd.d | jdUtdVd | jdWtdXd | jdYtd&d | jdZtdd | jd[td | jd\td]d | jd^td_d`gd | jdatdEd | jdbtdcd | jddtdd | jdetd#d | jdftdd | jdgtdd | jdhtd | jditdjd | jdktd6d | jdltdmd | jdntdd | jdotdpd | jdqtdd | jdrtd6d | jdstdd | jdttdd | jdutdvd | jdwtdd | jdxtdd | S )yNz	--use_gpuT)typedefaultz	--use_xpuFz	--use_npuz
--ir_optimz--use_tensorrtz--min_subgraph_size   z--precisionZfp32z	--gpu_memi  z--image_dir)r   z
--page_numr   z--det_algorithmZ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_algorithmZ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_setZ	totaltextz--e2e_pgnet_modez--use_angle_clsz--cls_model_dirz--cls_image_shapez
3, 48, 192z--label_list0Z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_onnx)argparseArgumentParseradd_argumentr   intstrfloatlistparserr   r   r   	init_args"   s   r,   c                  C   s   t  } |  S )N)r,   
parse_argsr*   r   r   r   r-      s   r-   c              
   C   s  |dkr| j }n;|dkr| j}n3|dkr| j}n+|dkr | j}n#|dkr(| j}n|dkr0| j}n|dkr8| j}n|dkr@| j}n| j}|d u rU|	d	
|| td
 | jrzd
d l}|}tj|sktd
|||}|| d
 d d fS ddg}|D ]}d
||}d
||}	tj|rtj|	r nqtj|std
|tj|	std
|t||	}
t| dr| jdkr| jrtjj}n| jdkrtjj}n	tjj}ntjj}| jrNt }|d u r| d |
!| j"d
 | jrM|
j#d|| j$| j%dd tj&|| d}tj|s'|
'| |	d|  z|
(|d W n^ t)yL } z|	| |	d W Y d }~nFd }~ww n@| j*rW|
+  n7| j,ra|
-d n-|
.  | j/r|
0d |
/  | jdkr||
1  t| dr|
2| j3 n|
2d |
4  |
5  |
6d  |
6d! |dkr|
6d" |dkr|
6d# |
7d |
8d t9|
}|: }|d$v rg }|D ]}|;|<| qn|D ]}|<|}qt=| ||}||||
fS )%NZdetclsrectableserresrZlayoutznot find {} model file path {}r   znot find model file path {}modelr   z{}/{}.pdmodelz{}/{}.pdiparamsz1not find model.pdmodel or inference.pdmodel in {}z5not find model.pdiparams or inference.pdiparams in {}	precisionZfp16int8ziGPU is not found in current device by nvidia-smi. Please check your device or ignore it if run on jetson.i   @F)Zworkspace_sizeZprecision_modemax_batch_sizemin_subgraph_sizeZuse_calib_modez_trt_dynamic_shape.txtz"collect dynamic shape info into : Tz+Please keep your paddlepaddle-gpu >= 2.3.0!i   r   cpu_threadsZ&conv_transpose_eltwiseadd_bn_fuse_passZ"matmul_transpose_reshape_fuse_passZsimplify_with_basic_ops_passZfc_fuse_pass)r1   r2   )>Zdet_model_dirZcls_model_dirZrec_model_dirZtable_model_dirZser_model_dirZre_model_dirZsr_model_dirZlayout_model_dirZe2e_model_dirinfoformatsysexitZuse_onnxZonnxruntimeospathexists
ValueErrorZInferenceSessionZ
get_inputsr   ZConfighasattrr5   Zuse_tensorrtZPrecisionTypeZHalfZInt8ZFloat32use_gpuget_infer_gpuidwarningZenable_use_gpuZgpu_memZenable_tensorrt_enginer7   r8   joinZcollect_shape_range_infoZ#enable_tuned_tensorrt_dynamic_shape	ExceptionZuse_npuZ
enable_npuZuse_xpuZ
enable_xpuZdisable_gpuZenable_mkldnnZset_mkldnn_cache_capacityZenable_mkldnn_bfloat16Z set_cpu_math_library_num_threadsr9   Zenable_memory_optimZdisable_glog_infoZdelete_passZswitch_use_feed_fetch_opsZswitch_ir_optimcreate_predictorZget_input_namesappendZget_input_handleget_output_tensors)argsmodeloggerZ	model_dirZortZmodel_file_pathsessZ
file_names	file_nameZparams_file_pathconfigr5   gpu_idZtrt_shape_fE	predictorZinput_namesZinput_tensornameoutput_tensorsr   r   r   rH      s   






	














rH   c                 C   sz   |  }g }|dkr,| jdv r,d}||v r||gS |D ]}||}|| q|S |D ]}||}|| q.|S )Nr/   )ZCRNNr   zsoftmax_0.tmp_0)Zget_output_namesZrec_algorithmZget_output_handlerI   )rK   rL   rS   Zoutput_namesrU   Zoutput_nameZoutput_tensorr   r   r   rJ   "  s   

rJ   c                  C   sj   t  } | dkr
dS tjj sd}nd}t| }t	|dkr$dS |d 
 dd }t|d S )NWindowsr   zenv | grep CUDA_VISIBLE_DEVICESzenv | grep HIP_VISIBLE_DEVICES=r   )platformsystempaddleZfluidcoreZis_compiled_with_rocmr>   popen	readlineslenstripsplitr&   )ZsysstrcmdZenv_cudarQ   r   r   r   rD   4  s   rD   c              
   C   sx   t |}t| |D ]/\}}|tjd}t j||gdddd t j||t	|d t	|d ft j
dd	d
d q
|S )Nr      T   rf   r   rd   color	thicknessr   r   r   )r   r   r   gffffff?)r   rf   r   r   )orgZfontFaceZ	fontScalerh   ri   )cv2Zimreadzipastypenpint32reshape	polylinesZputTextr&   ZFONT_HERSHEY_COMPLEX)dt_boxesstrsZimg_pathZsrc_imboxr'   r   r   r   draw_e2e_resE  s   
rv   c                 C   s>   | D ]}t |t jdd}tj||gdddd q|S )Nrc   rd   Tre   rg   )ro   arrayrn   rp   rq   rl   rr   )rs   imgru   r   r   r   draw_text_det_resU  s   ry   X  c                 C   sJ   t | } | j}t |dd }t|t| }tj| dd||d} | S )zJ
    resize img and limit the longest side of the image to input_size
    r   rd   N)Zfxfy)ro   rw   shaper   r(   rl   resize)rx   
input_sizeZim_shapeZim_size_maxZim_scaler   r   r   
resize_img\  s   
r   r   r!   c                 C   s   |du rdgt | }t |}t|D ]2}|dur'|| |k s&t|| r'qtt|| g dtj}t	
t| |gddd} q|durqtt| dd}	t|||	jd	 d||d
}
tjt|	t|
gd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
    Nr   rb   Trf   r   r   rd   rz   )r~   r   )img_himg_w	threshold	font_pathZaxis)r^   rangemathisnanro   rq   rw   rn   int64rl   rr   r   text_visualr|   concatenate)imageboxestxtsscores
drop_scorer   Zbox_numiru   rx   Ztxt_imgr   r   r   draw_ocrh  s.   "r   c                 C   sr  | j | j}}|  }tj||dftjdd }	td t	|}
|d u s.t
|t
|kr5d gt
| }tt||D ]L\}\}}|d urM|| |k rMq<tddtddtddf}|
j||d t||f|||}t|tjd}t||gd|d t|	|}	q<t| |d	}td
|d |fd}||dd||f |t|	|d|d |f t|S )N   dtyperf   r   )fillrb   Tr   r   RGBrd   rf   rf   rf   )heightwidthcopyro   onesuint8randomseedr   Drawr^   	enumeraterm   randintZpolygondraw_box_txt_finerw   rp   rq   rl   rr   Zbitwise_andr   blendnewZpaste	fromarray)r   r   r   r   r   r   hwZimg_leftZ	img_rightZ	draw_leftidxru   txtrh   img_right_textZptsZimg_showr   r   r   draw_ocr_box_txt  s.   



r   c                 C   s  t t|d d |d d  d |d d |d d  d  }t t|d d |d d  d |d d |d d  d  }|d| krv|dkrvtd||fd}t|}|rot|||f|}|jddg|d|d	 |	tj
}n#td||fd}t|}|rt|||f|}|jddg|d|d	 tddg|dg||gd|gg}	tj|tjd
}
t|	|
}tj|tjd
}tj||| tjtjdd}|S )Nr   r   rd   r      r   r   rj   )r   fontr   )flags
borderModeZborderValue)r&   r   sqrtr   r   r   r   create_fonttextZ	transposeZ
ROTATE_270ro   float32rw   rl   getPerspectiveTransformr   warpPerspectiveZINTER_NEARESTZBORDER_CONSTANT)Zimg_sizeru   r   r   Z
box_heightZ	box_widthZimg_textZ	draw_textr   Zpts1Zpts2Mr   r   r   r   r     sB   <<

r   c                 C   sb   t |d d }tj||dd}|| d }||d kr/t ||d  | }tj||dd}|S )Nr   gGz?utf-8encodingr   )r&   r   truetypegetsize)r   szr   	font_sizer   lengthr   r   r   r     s   r   c                 C   sv   ddl }d }}t| }d}| D ]!}||jv s| s| r$|d7 }q| r-|d7 }q|d7 }q|t|d  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   rd   )stringr^   ascii_lettersisdigitisspaceisalphar   ceil)sr   Zcount_zhZcount_puZs_lenZen_dg_countcr   r   r   	str_count  s   



r             ./doc/simfang.ttfc                    sT  |durt | t |ksJ d fdd}| \}}d}	d}
tj||	dd}|	d	 }g }d
\}}t| D ]\}}|d7 }|| |k sKt|| rP|d8 }q6d}t||	 d kr|}|d|	 d  }|rut|d | }d}nd| }|jd|| f||
|d ||	 d d }| | d kr|	t
| | \}}d}|d7 }t||	 d ks\|rt|d | d d||   }nd| d d||   }|jd|| f||
|d | | d kr|d t | k r|	t
| | \}}d}|d7 }q6|	t
| t |dkrt
|d }nt
j|dd}t
|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                     sR   t j gt jdd } d| d d d d f< t| d} t| }| |fS )N)r|   r   rf   r   r   r   )ro   r   r6   r   r   convertr   r   )	blank_imgdraw_txtr   r   r   r   create_blank_img
  s
   
z%text_visual.<locals>.create_blank_img   rj   r   r   r   )r   r   r   T   z: Fz    r   )r   z   z%.3fz  r   )r^   r   r   r   r   r   r   r'   r   rI   ro   rw   r   )Ztextsr   r   r   r   r   r   r   r   r   Z	txt_colorr   gapZtxt_img_listcountindexr   r   
first_linetmpZnew_txtr   r   r   r     sb   

"$


r   c                 C   s8   dd l }|| d}t|tj}t|tj}|S )Nr   utf8)	base64	b64decodeencodero   Z
frombufferr   rl   ZimdecodeZIMREAD_COLOR)Zb64strr   datar   r   r   base64_to_cv2B  s
   r   c                 C   sp   |d u rdgt | }t||D ]%\}}||k rqtt|g dtj}tt| |gddd} q| S )Nr   rb   Tr   rd   )	r^   rm   ro   rq   rw   rn   r   rl   rr   )r   r   r   r   ru   Zscorer   r   r   
draw_boxesJ  s   r   c           	      C   s   t |dks
J dtttj|d |d  tj|d |d  }tttj|d |d  tj|d |d  }tddg|dg||gd|gg}t||}tj	| |||ftj
tjd}|jdd \}}|d | d	kr{t|}|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
    r   zshape of points must be 4*2r   r   rd   r   )r   r   r   r   )r^   r&   r   ro   ZlinalgZnormr   rl   r   r   ZBORDER_REPLICATEZINTER_CUBICr|   Zrot90)	rx   pointsZimg_crop_widthZimg_crop_heightZpts_stdr   Zdst_imgZdst_img_heightZdst_img_widthr   r   r   get_rotate_crop_imageU  s8   
r   c           	      C   s   t t|tj}ttt |dd d}d\}}}}|d d |d d kr0d}d}nd}d}|d d |d d krEd}d}nd}d}|| || || || g}t	| t|}|S )	Nc                 S   s   | d S )Nr   r   )xr   r   r   <lambda>z  s    z'get_minarea_rect_crop.<locals>.<lambda>)key)r   r   rd   r   r   r   r   rd   )
rl   ZminAreaRectro   rw   rn   rp   sortedr)   Z	boxPointsr   )	rx   r   Zbounding_boxZindex_aZindex_bZindex_cZindex_dru   Zcrop_imgr   r   r   get_minarea_rect_cropx  s    r   c                 C   s   | rt  sd} | S )NF)rZ   Zis_compiled_with_cuda)rC   r   r   r   	check_gpu  s   r   __main__)rz   )NNr   r!   )r!   )r   rz   r   r   )Nr   )'r#   r>   r<   rX   rl   numpyro   rZ   ZPILr   r   r   r   r   timer   Zppocr.utils.loggingr   r   r,   r-   rH   rJ   rD   rv   ry   r   r   r   r   r   r   r   r   r   r   r   r   __name__r   r   r   r   <module>   sb   t 

+


$

L
#