
    wi9                        d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlZd dlZd dlmZ ddlmZ ddlmZmZ ddlmZmZ dd	lmZmZmZ dd
lmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/  ee0          1                                j2        Z3e3dz  Z4 G d d          Z5 G d de6          Z7ddeee8                  fdZ9ddeee8                  fdZ:e;dk    r e:             dS dS )    N)Path)AnyDictListOptionalTupleUnion)
DictConfig   )CalRecBoxes)TextClassifierTextClsOutput)TextDetectorTextDetOutput)TextRecInputTextRecognizerTextRecOutput)check_installgenerate_cfg)	LoadImage)logger)RapidOCROutput)ParseParams)apply_vertical_paddingget_rotate_crop_imagemap_boxes_to_originalresize_image_within_bounds)LangRec)VisReszconfig.yamlc                      e Zd Z	 d,dee         deeeef                  fdZdee         deeeef                  defdZ	defdZ
	 	 	 	 	 	 	 	 d-deeej        eef         dee         dee         dee         dedededededeeeeef         fdZdej        deeef         fdZdej        dedededeej                 deeef         deeeeef         fdZdeej                 dej        dedeeef         d ed!edefd"Z	 	 	 	 	 	 	 	 d-dee         dee         dee         dededededefd#Zdej        deej        eeef         f         fd$Zdej        deeef         deeej                 ef         fd%Zdej        d&ej        deej                 fd'Z deej                 deeej                 ef         fd(Z!deej                 defd)Z"d*edefd+Z#dS ).RapidOCRNconfig_pathparamsc                     |                      ||          }t          j        |j        j                                                   |                     |           d S N)_load_configr   setLevelGlobal	log_levelupper_initializeselfr"   r#   cfgs       e/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/rapidocr/main.py__init__zRapidOCR.__init__$   sT     V44
,2244555    returnc                     |6t          |                                          rt          j        |          }nt          j        t                    }|rt          j        ||          }|S r%   )r   existsr   loadDEFAULT_CFG_PATHupdate_batchr,   s       r/   r&   zRapidOCR._load_config-   se     "tK'8'8'?'?'A'A"";//CC"#344C 	8*377C
r1   r.   c                 Z   |j         j        | _        |j         j        | _        |j         j        | _        |j         j        | _        |j        |j        j        j                 |j        _	        t          |j                  | _        |j         j        | _        |j        |j        j        j                 |j        _	        t          |j                  | _        |j         j        | _        |j        |j        j        j                 |j        _	        |j         j        |j        _        t'          |j                  | _        t+                      | _        |j         j        | _        |j         j        | _        t3                      | _        |j         j        | _        |j         j        | _        || _        d S r%   )r(   
text_score
min_heightwidth_height_ratiouse_detEngineConfigDetengine_typevalue
engine_cfgr   text_detuse_clsClsr   text_clsuse_recRec	font_pathr   text_recr   load_imgmax_side_lenmin_side_lenr   cal_rec_boxesreturn_word_boxreturn_single_char_boxr.   )r-   r.   s     r/   r+   zRapidOCR._initialize9   s1   */*/"%*"?z) -cg.A.GH$SW--z) -cg.A.GH&sw//z) -cg.A.GHJ0&sw//!J3J3(]]"z9&)j&G#r1   F      ?皙?img_contentr<   rC   rF   rN   rO   r9   
box_threshunclip_ratioc
           
          |                      ||||||||	           |                     |          }
|                     |
          \  }}|                     ||          \  }}}}|                     |
|||||          S r%   )update_paramsrJ   preprocess_imgrun_ocr_stepsbuild_final_output)r-   rR   r<   rC   rF   rN   rO   r9   rS   rT   ori_imgimg	op_recorddet_rescls_resrec_rescropped_img_lists                    r/   __call__zRapidOCR.__call__V   s     	"		
 		
 		
 --,,,,W55Y6:6H6Hi6X6X3'#3&&Wgw0@)
 
 	
r1   r[   r\   c                    t                      t                      t                      }}}| j        rp	 |                     ||          \  }}nX# t
          $ rH}t          j        |           t                      t                      t                      g fcY d }~S d }~ww xY w|g}| j        rc	 | 	                    |          \  }}nK# t
          $ r<}t          j        |           |t                      t                      g fcY d }~S d }~ww xY w|}| j
        rT	 |                     |          }n=# t
          $ r0}t          j        |           ||t                      g fcY d }~S d }~ww xY w||||fS r%   )r   r   r   r<   detect_and_cropRapidOCRErrorr   warningrC   cls_and_rotaterF   recognize_txt)	r-   r[   r\   r]   r^   r_   r`   ecls_img_lists	            r/   rX   zRapidOCR.run_ocr_stepst   s   $1OO]__moo'< 	%M,0,@,@i,P,P) ''  M M Mq!!!$"LLLLLLLM !$u< 	,E(,(;(;<L(M(M%gg  E E Eq!!!"DDDDDDDE ,L< 	==,,\::  = = =q!!!"<<<<<<<= *:::sY   A 
B=BBB-C 
D1DDDD/ /
E)9%E$E)$E)rZ   r]   r^   r_   r`   c                   
 |j         d d         \  }}|j        t          |j        |||          |_        |j        |j        |j        d t          |j                  D             
t          j        
fdt          |j                  D                       |_        
fdt          |j                  D             |_        
fdt          |j                  D             |_        
fdt          |j                  D             |_        |j        |j        	|j	        |S |j        |j        t                      S |j        	|j        |S |j        	|j        |S | j        r?|j        8t          |j                  r$|                     ||j        ||||          |_        t          ||j        |j        |j        |j        |j        |j        |j        gt          | j        j        j        | j        j        j        | j        j        j                            }	|                     |	          }	t/          |	          d	k    r|	nt                      S )
N   c                 @    h | ]\  }}|                                 |S  )strip).0ivs      r/   	<setcomp>z.RapidOCR.build_final_output.<locals>.<setcomp>   s)    PPPtq!aggiiPPPPr1   c                 "    g | ]\  }}|v	|S rm   rm   ro   rp   rq   	empty_idss      r/   
<listcomp>z/RapidOCR.build_final_output.<locals>.<listcomp>   s'    NNNtq!1I;M;M;M;M;Mr1   c                 "    g | ]\  }}|v	|S rm   rm   rt   s      r/   rv   z/RapidOCR.build_final_output.<locals>.<listcomp>   s.       a1I;M;M;M;M;Mr1   c                 "    g | ]\  }}|v	|S rm   rm   rt   s      r/   rv   z/RapidOCR.build_final_output.<locals>.<listcomp>   s'    XXX$!QQiEWEWAEWEWEWr1   c                 "    g | ]\  }}|v	|S rm   rm   rt   s      r/   rv   z/RapidOCR.build_final_output.<locals>.<listcomp>   s.     $ $ $a)ASASASASASr1   )r9   	lang_typerH   )r[   boxestxtsscoresword_resultselapse_listviserr   )shaper{   r   r|   r}   	enumeratenparrayr~   r^   r   rN   allcalc_word_boxeselapser   r.   r(   r9   rG   rz   rH   filter_by_text_scorelen)r-   rZ   r]   r^   r_   r`   r\   ori_hori_wocr_resru   s             @r/   rY   zRapidOCR.build_final_output   s    }RaR(u=$1y% GM L$)*PPy'>'>PPPIHNNNNy77NNN GM   '77  GN YXXX)GL*A*AXXXGL$ $ $ $'(<==$ $ $G  M!$+N = W\%9!### = W\%=N =$)=N  	)G()) * $(#7#7 '-)UE$ $G  !-> - H8?5(,0(/3  
 
 
 ++G44g,,**ww0@0@@r1   dt_boxesraw_hraw_wc                    |                      |||| j                  }g }|j        D ]}g }	|D ]\  }
}}|	t          t	          j        |g                              t          j                  |||          }|                    t          j                  	                                d         }|	
                    |
||f           |	r"|
                    t          |	                     t          |          S )Nr   )rM   rO   r~   r   r   r   astypefloat64int32tolistappendtuple)r-   r[   r   r_   r\   r   r   origin_words	word_lineorigin_words_itemtxtscorebboxorigin_words_pointss                 r/   r   zRapidOCR.calc_word_boxes   s    $$7D$?
 
  - 	> 	>I "$- L L UD<&;HdV$$++BJ77E5' '# ':&@&@&J&J&Q&Q&S&STU&V#!((#u6I)JKKKK  >##E*;$<$<===\"""r1   c	                     || j         n|| _         || j        n|| _        || j        n|| _        || _        || _        || _        || j        j        _        || j        j        _	        d S r%   )
r<   rC   rF   rN   rO   r9   rB   postprocess_oprS   rT   )	r-   r<   rC   rF   rN   rO   r9   rS   rT   s	            r/   rV   zRapidOCR.update_params  sn     (/t||G'.t||G'.t||G.&<#$2<$/4@$111r1   c                 \    i }t          || j        | j                  \  }}}||d|d<   ||fS )N)ratio_hratio_w
preprocess)r   rL   rK   )r-   rZ   r\   r[   r   r   s         r/   rW   zRapidOCR.preprocess_img  sH    	 :T&(9!
 !
Wg /6'"J"J	,I~r1   c                     t          ||| j        | j                  \  }}|                     |          }|j        t          d          |                     ||j                  }||fS )Nz"The text detection result is empty)r   r;   r:   rB   r{   rd   crop_text_regions)r-   r[   r\   r]   img_crop_lists        r/   rc   zRapidOCR.detect_and_crop  sq     0D3T_
 
Y --$$=  DEEE..sGMBBg%%r1   	det_boxesc                     g }|D ]9}t          |t          j        |                    }|                    |           :|S r%   )r   copydeepcopyr   )r-   r[   r   r   boximg_crops         r/   r   zRapidOCR.crop_text_regions-  sN      	+ 	+C,S$-2D2DEEH  ****r1   c                 j    |                      |          }|j        t          d          |j        |fS )NzThe text classifier is empty)rE   img_listrd   )r-   r[   r^   s      r/   rf   zRapidOCR.cls_and_rotate6  s;     --$$# >???((r1   c                     t          || j                  }|                     |          }|j        t	          d          |S )N)r[   rN   z"The text recognize result is empty)r   rN   rI   r|   rd   )r-   r[   	rec_inputr_   s       r/   rg   zRapidOCR.recognize_txt>  sD     S$:NOOO	--	**< DEEEr1   r   c                 $   g g g g f\  }}}}t          t          |j        |j        |j                            D ]\  }\  }}}	|	| j        k     r|j        |         r |                    |j        |                    |                    |           |                    |           |                    |	           t          j	        |          |_        t          |          |_        t          |          |_        t          |          |_        |S r%   )r   zipr{   r|   r}   r9   r~   r   r   r   r   )
r-   r   filter_boxesfilter_txtsfilter_scoresfilter_wordsrp   r   r   r   s
             r/   r   zRapidOCR.filter_by_text_scoreG  s   ACRR>k=,$-w|W^<<%
 %
 	( 	( A S% t&&#A& =##G$8$;<<<$$$s###  ''''..[))}--$\22r1   )NN)NNNFFrP   rP   rQ   )$__name__
__module____qualname__r   strr   r   r0   r
   r&   r+   r	   r   ndarraybytesr   boolfloatr   r   r   r   ra   rX   r   rY   intr   rV   r   rW   rc   r   rf   rg   r   rm   r1   r/   r!   r!   #   se       TX #C=9A$sCx.9Q   
#C=
2:4S>2J
	
 
 
 
z    @ #'"&"& %',!
 
3
E478
 $
 $	

 $
 
 !%
 
 
 
 
}m]NJ	K
 
 
 
<; ;S#X ; ; ; ;<PAPA PA 	PA
 PA rz*PA S>PA 
}m]NJ	KPA PA PA PAd#"*# *# 	#
 S># # # 
# # # #@ #'"&"& %',!A A$A $A $	A
 A !%A A A A A A A*bj U2:tCQTH~;U5V    &:&*.sCx.&	tBJ.	/& & & &:*,*	bj	   )
#)	tBJ.	/) ) ) )bj!1 m    N ~      r1   r!   c                       e Zd ZdS )rd   N)r   r   r   rm   r1   r/   rd   rd   ]  s        Dr1   rd   arg_listc           	      H   t          j                    }|                    ddt          d            |                    dt          d           |                    dt          dt          d t          D                       	           |                    d
ddd           |                    dt          d           |                    dt          d            |                    dddd           |                    dd          }|	                    dd          }|                    dt          d            |
                    t                     |	                    dd          }|
                    t                     |                    |           }|S )Nz-imgz
--img_path)typedefaultz--text_scorerP   z--lang_typechc              3   $   K   | ]}|j         V  d S r%   )r@   )ro   rq   s     r/   	<genexpr>zparse_args.<locals>.<genexpr>i  s$      ..QW......r1   )r   r   choicesz-visz	--vis_res
store_trueF)actionr   z--vis_save_dir.z--font_pathz-wordz--return_word_boxcommandzSub-command help)desthelpconfigzGenerate config file)r   z--save_cfg_file)funccheckz#Check if it is installed correctly )argparseArgumentParseradd_argumentr   r   listr   r   add_subparsers
add_parserset_defaultsr   r   
parse_args)r   parser	subparser
parser_cfgparser_checkargss         r/   r   r   a  s   $&&F
3EEE
UC@@@
..g.....	     L%PPP
(tSAAA
C>>>
$\5     %%9;M%NNI%%h5K%LLJ-D$GGG...''; (  L =111X&&DKr1   c                    t          |           }|j        dk    rt          |           d S |j        |j        d}t          |          }|j        dk    rt          |           d S |j        t          d          |j        r ||j        |j                  }n ||j                  }t          |           |j
        rJt          |j        |j        t          |j                            }|j        }|j        rt!          |j        d          }t%          t'          |           \  }}	}
 ||j        |
||	          }|t)          |j                  j         d	z  }t-          j        t1          |          |           t          d
|            d S |t)          |j                  j         dz  } ||j        |j        |j        |j                  }t-          j        t1          |          |           t          d|            d S d S )Nr   )zGlobal.text_scorezGlobal.return_word_box)r#   r   zPlease input the image path)rN   )r9   rH   rz   rm   z_vis_single.pngz#The vis single result has saved in z_vis.pngzThe vis result has saved in )r   r   r   r9   rN   r!   r   img_path
ValueErrorprintvis_resr   rH   r   rz   vis_save_dirsumr~   r   r   r   stemcv2imwriter   r{   r|   r}   )r   r   r#   
ocr_engineresultviscur_dirwords_resultswordswords_scoreswords_boxesvis_img	save_paths                r/   mainr     s/   hD|xT "_"&"6 F (((J|wj!!!}6777 +DM4;OPPPDM**	&MMM| :ndn--
 
 

 # 	 3R88M/3C4G/H/H,E<c$-e\JJGT$-%8%8%="N"N"NNIKI000C	CCDDDFdm!4!4!9CCCC	#dmV\6;NNC	NNG,,,8Y8899999): :r1   __main__r%   )<r   r   pathlibr   typingr   r   r   r   r   r	   r   numpyr   	omegaconfr
   rM   r   ch_ppocr_clsr   r   ch_ppocr_detr   r   ch_ppocr_recr   r   r   clir   r   utils.load_imager   	utils.logr   utils.outputr   utils.parse_parametersr   utils.process_imgr   r   r   r   utils.typingsr   utils.vis_resr   __file__resolveparentroot_dirr6   r!   	Exceptionrd   r   r   r   r   rm   r1   r/   <module>r	     s           : : : : : : : : : : : : : : : : 



                 & & & & & & 7 7 7 7 7 7 7 7 5 5 5 5 5 5 5 5 E E E E E E E E E E , , , , , , , , ' ' ' ' ' '       ( ( ( ( ( ( / / / / / /            # " " " " " ! ! ! ! ! !4>>!!##*m+ w w w w w w w wt		 	 	 	 	I 	 	 	 $s),    >/: /:8DI& /: /: /: /:d zDFFFFF r1   