o
    'ja                     @   s\  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dd Zd6ddZ				d7ddZ				d7ddZd8d d!Zd8d"d#Zd$d% Z 	&		'	(d9d)d*Z!d+d, Z"d:d-d.Z#d/d0 Z$d1d2 Z%d3d4 Z&e'd5kr	 dS dS );    N)Image	ImageDraw	ImageFont)	inference)
get_loggerc                 C   s   |   dv S )N)trueyesty1)lowerv r   ^/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddleocr/tools/infer/utility.pystr2bool   s   r   c                 C   s   t dd | dD S )Nc                 S   s   g | ]}t | qS r   )intstrip).0ir   r   r   
<listcomp>"   s    z!str2int_tuple.<locals>.<listcomp>,)tuplesplitr   r   r   r   str2int_tuple!   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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d0td-d | jd1tdd | jd2td3d | jd4td5d | jd6td7d | jd8tg d9d | jd:td;d | jd<td;d | jd=td>d | jd?td@d | jdAtd | jdBtdd | jdCtdDd | jdEtdFd | jdGtdHd | jdItdJd | jdKtdd | jdLtdMd | jdNtd/d | jdOtdPd | jdQtd | jdRtdSd | jdTtdd | jdUtd/d | jdVtdWd | jdXtdYd | jdZtd'd | jd[tdd | jd\td | jd]td^d | jd_td`dagd | jdbtdFd | jdctddd | jdetdd | jdftd$d | jdgtdd | jdhtdd | jditd | jdjtdkd | jdltd7d | jdmtdnd | jdotdd | jdptdqd | jdrtdd | jdstd7d | jdttdd | jdutdd | jdvtdwd | jdxtdd | jdytdd | S )zNz	--use_gpuT)typedefaultz	--use_xpuFz	--use_npuz
--ir_optimz--use_tensorrtz--min_subgraph_size   z--precisionZfp32z	--gpu_memi  z--gpu_idr   z--image_dir)r   z
--page_numz--det_algorithmZDBz--det_model_dirz--det_limit_side_leni  z--det_limit_typemaxz--det_box_typeZ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   r   strfloatlistparserr   r   r   	init_args$   s   r6   c                  C   s   t  } |  S )N)r6   
parse_argsr4   r   r   r   r7      s   r7   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rOt }|d u r| d |
!| j"| j# | jrN|
j$d|| j%| j&dd tj'|| d}tj|s(|
(| |	d|  z|
)|d W n_ t*yM } z|	| |	d W Y d }~nGd }~ww nA| j+rY|
,d n7| j-rc|
.d n-|
/  | j0r|
1d |
0  | jdkr~|
2  t| d r|
3| j4 n|
3d |
5  |
6  |
7d! |
7d" |dkr|
7d# |dkr|
7d$ |
8d |
9d t:|
}|; }|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!Znpui   r    cpu_threadsZ&conv_transpose_eltwiseadd_bn_fuse_passZ"matmul_transpose_reshape_fuse_passZsimplify_with_basic_ops_passZfc_fuse_pass)r;   r<   )?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hasattrr?   Zuse_tensorrtZPrecisionTypeZHalfZInt8ZFloat32use_gpuget_infer_gpuidwarningZenable_use_gpuZgpu_memgpu_idZenable_tensorrt_enginerA   rB   joinZcollect_shape_range_infoZ#enable_tuned_tensorrt_dynamic_shape	ExceptionZuse_npuZenable_custom_deviceZuse_xpuZ
enable_xpuZdisable_gpuZenable_mkldnnZset_mkldnn_cache_capacityZenable_mkldnn_bfloat16Z set_cpu_math_library_num_threadsrC   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configr?   rP   Ztrt_shape_fE	predictorZinput_namesZinput_tensornameoutput_tensorsr   r   r   rS      s   






	













rS   c                 C   sz   |  }g }|dkr,| jdv r,d}||v r||gS |D ]}||}|| q|S |D ]}||}|| q.|S )Nr9   )ZCRNNr)   Z
SVTR_HGNetzsoftmax_0.tmp_0)Zget_output_namesZrec_algorithmZget_output_handlerT   )rV   rW   r]   Zoutput_namesr_   Zoutput_nameZoutput_tensorr   r   r   rU   %  s   

rU   c                  C   sf   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deviceZis_compiled_with_rocmrH   popen	readlineslenr   r   r   )ZsysstrcmdZenv_cudarP   r   r   r   rN   9  s   rN   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   rm   r   rk   color	thicknessr   r   r   )r   r   r$   gffffff?)r   rm   r   r$   )orgZfontFaceZ	fontScalero   rp   )cv2Zimreadzipastypenpint32reshape	polylinesZputTextr   ZFONT_HERSHEY_COMPLEX)dt_boxesstrsZimg_pathZsrc_imboxr1   r   r   r   draw_e2e_resJ  s   
r}   c                 C   s>   | D ]}t |t jdd}tj||gdddd q|S )Nrj   rk   Trl   rn   )rv   arrayru   rw   rx   rs   ry   )rz   imgr|   r   r   r   draw_text_det_resZ  s   r   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   rk   N)Zfxfy)rv   r~   shaper   r2   rs   resize)r   
input_sizeZim_shapeZim_size_maxZim_scaler   r   r   
resize_imga  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$   ri   Trm   r   r   rk   r   )r   r   )img_himg_w	threshold	font_pathZaxis)rg   rangemathisnanrv   rx   r~   ru   int64rs   ry   r   text_visualr   concatenate)imageboxestxtsscores
drop_scorer   Zbox_numr   r|   r   Ztxt_imgr   r   r   draw_ocrm  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   dtyperm   r   )fillri   Tr$   r"   RGBrk   rm   rm   rm   )heightwidthcopyrv   onesuint8randomseedr   Drawrg   	enumeratert   randintZpolygondraw_box_txt_finer~   rw   rx   rs   ry   Zbitwise_andr   blendnewZpaste	fromarray)r   r   r   r   r   r   hwZimg_leftZ	img_rightZ	draw_leftidxr|   txtro   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   rk   r$      r   r   rq   )r   fontr   )flags
borderModeZborderValue)r   r   sqrtr   r   r   r   create_fonttextZ	transposeZ
ROTATE_270rv   float32r~   rs   getPerspectiveTransformr   warpPerspectiveZINTER_NEARESTZBORDER_CONSTANT)Zimg_sizer|   r   r   Z
box_heightZ	box_widthZimg_textZ	draw_textr   Zpts1Zpts2Mr   r   r   r   r     sB   <<

r   c                 C   s^   t |d d }tj||dd}|| }||d kr-t ||d  | }tj||dd}|S )Nr$   gGz?utf-8encodingr   )r   r   truetypeZ	getlength)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$   rk   )stringrg   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   rm   r   r$   r   )rv   r   r@   r   r   convertr   r   )	blank_imgdraw_txtr   r   r   r   create_blank_img  s
   
z%text_visual.<locals>.create_blank_img   rq   r   r   r(   )r$   r   r$   T   z: Fz    r   )r   z   z%.3fz  r   )rg   r   r   r   r   r   r   r1   r   rT   rv   r~   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encoderv   Z
frombufferr   rs   ZimdecodeZIMREAD_COLOR)Zb64strr   datar   r   r   base64_to_cv2G  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$   ri   Tr   rk   )	rg   rt   rv   rx   r~   ru   r   rs   ry   )r   r   r   r   r|   Zscorer   r   r   
draw_boxesO  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$   rk   r   )r   r   r'   r   )rg   r   r   rv   ZlinalgZnormr   rs   r   r   ZBORDER_REPLICATEZINTER_CUBICr   Zrot90)	r   pointsZimg_crop_widthZimg_crop_heightZpts_stdr   Zdst_imgZdst_img_heightZdst_img_widthr   r   r   get_rotate_crop_imageZ  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>  s    z'get_minarea_rect_crop.<locals>.<lambda>)key)r   r$   rk   r   r$   r   r   rk   )
rs   ZminAreaRectrv   r~   ru   rw   sortedr3   Z	boxPointsr   )	r   r   Zbounding_boxZindex_aZindex_bZindex_cZindex_dr|   Zcrop_imgr   r   r   get_minarea_rect_crop}  s    r   c                 C   s   | rt  sd} | S )NF)rd   Zis_compiled_with_cuda)rM   r   r   r   	check_gpu  s   r   __main__)r   )NNr"   r,   )r,   )r   r   r   r   )Nr"   )(r.   rH   rF   rb   rs   numpyrv   rd   ZPILr   r   r   r   r   timer   Zppocr.utils.loggingr   r   r   r6   r7   rS   rU   rN   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   __name__r   r   r   r   <module>   sd   u 

+

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