
    f>                        d dl mZmZm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 d dlZd dlZd dlmZmZ d dlmZ d dlZd dlmZ d dlmZmZ d dlZd dlmZ d dlmZ  ee          Z d	d
 ej!        d          fdZ"d Z#d Z$d Z%d dZ&dZ' e&            a(dZ)dZ*dZ+d!dZ,e -                    ddg          d             Z.e -                    ddg          d             Z/edk    re 0                    dd           dS dS )"    )FlaskrequestjsonifyN)Image)AutoTokenizerAutoModelForTokenClassification)pipeline)deeplabv3_resnet50deeplabv3_mobilenet_v3_large)StanfordCoreNLP)colored   mbv3cpuc                    |dk    rCt          | d          }t          j                            t          j                    d          }nBt          | d          }t          j                            t          j                    d          }|                    |           t          j        ||          }|	                    |d           |
                                  |t          j        d	                    }|S )
Nr   T)num_classesaux_losszmodel_mbv3_iou_mix_2C049.pthzmodel_r50_iou_mix_2C020.pth)map_locationF)strict)        r   )r   ospathjoingetcwdr
   totorchloadload_state_dictevalrandn)r   
model_namedevicemodelcheckpoint_pathcheckpoints_s          //code/scan-research-backend/flask_vcard/main.py
load_modelr*      s    V,tTTT',,ry{{4RSS"{TJJJ',,ry{{4QRR	HHV*_6BBBK	+e444	JJLLLek*++,,AL    c                    t          j        dd          }t          j        |           } |                     d          }| t          j        |                   |d<   | t          j        |                   |d<   t          j        | d          }| t          j        |                   |d<   | t          j        |                   |d<   |                    d	                                          S )
zRRearrange coordinates to order:
    top-left, top-right, bottom-right, bottom-left)   r   float32dtyper   axisr   r   r   int)	npzerosarraysumargminargmaxdiffastypetolist)ptsrectsr:   s       r)   order_pointsr@   )   s     8F),,,D
(3--CQA")A,,DG")A,,DG73QD")D//"DG")D//"DG;;u$$&&&r+   c                    | \  }}}}t          j        |d         |d         z
  dz  |d         |d         z
  dz  z             }t          j        |d         |d         z
  dz  |d         |d         z
  dz  z             }t          t          |          t          |                    }t          j        |d         |d         z
  dz  |d         |d         z
  dz  z             }t          j        |d         |d         z
  dz  |d         |d         z
  dz  z             }	t          t          |          t          |	                    }
ddg|dg||
gd|
gg}t	          |          S )Nr   r   r   )r4   sqrtmaxr3   r@   )r=   tltrbrblwidthAwidthBmaxWidthheightAheightB	maxHeightdestination_cornerss               r)   	find_destrO   9   sO   RRWr!ur!u}*11!/CDEEFWr!ur!u}*11!/CDEEF3v;;F,,H g11!+AA10DEFFGg11!+AA10DEFFGCLL#g,,//Iq6Ha=8Y2G!YX+,,,r+   c                     t          j                    }|                     |d           t          j        |                                                                          }t          d|           |S )NJPEG)formatz
img_str-->)ioBytesIOsavebase64	b64encodegetvaluedecodeprint)imgfilenametextbufferedimg_strs        r)   get_image_download_linkr`   J   s`    z||HHHXfH%%%x002233::<<G	,wNr+   g?g?gˡE?gn?gQ?g\m?c                 z    t          j        t          j                    t          j        | |          g          }|S )N)torchvision_TComposeToTensor	Normalize)meanstdcommon_transformss      r)   image_preprocess_transformsrk   S   s>    %-"$$#D#..	
  r+   r   
   c                    |}|dz  }| j         \  }}}t          j        | ||ft          j                  }	||z  }
||z  }t	          |	          }	t          j        |	d          }	t          j                    5   ||	          d                                         }d d d            n# 1 swxY w Y   ~	t          j
                     t          j        |dd                              ddd	d          d                                                                                             t           j                  }|j         \  }}t!          j        ||z   ||z   f|j        
          }|dz  ||||z   |||z   f<   |                                }~t          j
                     t          j        |                    t           j                  dd          }t          j        |t          j        t          j        d                    }t          j        |t          j        t          j                  \  }}t;          |t          j        d          d         }dt          j        |d          z  }t          j         ||d          }t!          j!        |                              t           j"                  }|d d dfxx         |z  cc<   |d d dfxx         |z  cc<   |d d dfxx         |
z  cc<   |d d dfxx         |z  cc<   t!          j#        |$                    d          dk              r/t!          j#        |%                    d          ||fk              sd\  }}}}t          j&        |'                    d                    }t          j(        |          }t!          j        |          }t!          j$        |d d df                   }t!          j%        |d d df                   }t!          j$        |d d df                   }t!          j%        |d d df                   } |dk    rtS          |          |z   }||k    r||z
  |z   }|dk    rtS          |          |z   }| |k    r| |z
  |z   }t!          j        ||z   |z   ||z   |z   |f| j        
          }!| |!|||z   |||z   d d f<   |!                    t           j"                  }!|d d dfxx         |z  cc<   |d d dfxx         |z  cc<   |}|!} t;          |*                                          }tW          |          }tY          |          }"t          j-        t!          j"        |          t!          j"        |"                    }#t          j.        | |#|"d         d         |"d         d         ft          j/                  }$t!          j0        |$dd          }$|$                    t           j                  }$|$S )Nr   )interpolationr   )dimoutr   T)ro   keepdimsr   r/         )   rt   )keyreverseg{Gz?r1   )r   r   )r   r   r   r   )r   r   )flags)a_mina_max)1shapecv2resizeINTER_NEARESTpreprocess_transformsr   	unsqueezeno_gradr   gccollectr9   permutenumpysqueezer;   r4   int32r5   r0   copyCannyuint8dilategetStructuringElementMORPH_ELLIPSEfindContours	RETR_LISTCHAIN_APPROX_NONEsortedcontourArea	arcLengthapproxPolyDPconcatenater.   allminrC   minAreaRectreshape	boxPointsabsr<   r@   rO   getPerspectiveTransformwarpPerspectiveINTER_LANCZOS4clip)%
image_truetrained_model
image_sizeBUFFER
IMAGE_SIZEhalfimHimWCimage_modelscale_xscale_yrp   r_Hr_W_out_extendedcannycontoursr(   pageepsiloncornersleft_padtop_pad	right_pad
bottom_padr>   boxbox_corners	box_x_min	box_x_max	box_y_min	box_y_maximage_extendedrN   Mfinals%                                        r)   scanr   d   s    J?D"KCa*Z*j)AQTQbcccKJGJG'44K/+1555K	 6 6mK((/33556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 	JLLL
,sD
1
1
1
9
9!Q1
E
Ea
H
N
N
P
P
X
X
Z
Z
a
abdbj
k
kCyHCHj3.
S0@ASSSMHKc	M$
**D4*3D,DDE




CJLLL Icjj**C55EJuc78I6RRSSE"5#-9NOOKHa(>>>qAD S]4...GtWd33GnW%%,,RZ88GAAAqDMMMTMMMAAAqDMMMTMMMAAAqDMMMWMMMAAAqDMMMWMMM F7;;A;&&&011 )$bfW[[a[=P=PUXZ]T^=^6_6_ )$3=0'9jwz::;;mD!!hsmm F;qqq!t,--	F;qqq!t,--	F;qqq!t,--	F;qqq!t,--	
 >>9~~.H"SF2I>>)nnv-G#c/V3J 7Z#7##=x)?SVY?Y[\"]eoeuvvv Q[w3.8c>0I111LM'..rz:: 	AAAqDX%AAAqDW$#
W^^%%&&G7##G#G,,#BJw$7$7DW9X9XYYA
A0CA0Fq0IK^_`KabcKd/empm  A  A  AEGE#...ELL""ELs   8$B((B,/B,z/v1/user/vCardPOST)methodsc                     	 t           j        d         } | j        }| rt          j        t          |                                           t          j                  }t          j	        |d          }t          d          }t          ||t                    }t          j        |d d d d d d df                   }|                    d|z              t          j        d|z             }t#          j        |          }|                    d	          }t)          j        d
          }	t-          j        d
          }g }
i }d}d}d}g }g }g }g }t/          d||	          }|D ].}|dk    s|dk    r ||          }|g k    rnf|d         d         }|dk    r&||d         d         d}|
                    |           |dk    r&||d         d         d}|
                    |           t3          j        ||          }|g k    rn|                    |d                    t3          j        ||          }|g k    rn|                    |d                    t3          j        ||          }|g k    r|                    |d                    0d}d}d }d }|
D ]6}||v rd|v r|d         } || |k    r| }||v rd|v r|d         } || |k    r| }7|
D ]}!d|!                                v r3|!d         |k    r|!d         |d<   n|                    |!d                    d|!                                v r3|!d         |k    r|!d         |d<   y|                    |!d                    d|vrd|d<   d|vrd|d<   d                    |          }"||d<   ||d<   ||d <   |"|d!<   d|d"<   t;          |          dk    r_t;          |          dk    rLt;          |          dk    r9|d         dk    r-|d         dk    r!|d"         dk    rd#dd$d%}t=          |          S d|z   |d&<   t=          d#|d'          S t=          d#d(d)          S #  t=          d#d*dd+          cY S xY w),Nimager/   r   r50r#   r   r   r   rw   	./static/
zdslim/bert-base-NERz\+?[\d\s()-]{11,15}\S+@\S+ \b(?:https?://|www\.)[^\s<>"\']+ner)r%   	tokenizer r   entityzB-PERscore)namer   zB-ORG)organizationr   r   r   
personNameorganizationName,MobileEmailWebsiteaddresspersonDesignation   'Card Not Scanned Please try recapturingstatusdatamessageimageUrlr   r   No image uploadedr   r   Something went wrongr   r   r   )r   filesr\   r4   asarray	bytearrayreadr   r|   imdecoder*   r   r   r   	fromarrayrU   openpytesseractimage_to_stringsplitr   from_pretrainedr   r	   appendrefindallkeysr   lenr   )#uploaded_filer\   
file_bytesr   r%   r   resultr]   xr   	finalListdetailsphone_patternemail_patternwebsite_pattern
mobileList	emailListwebsiteListaddressListnlp	textFinalner_resultsentitiesr   	mobNumberemailwebsite
target_keytarget_key_name	max_scoremax_score_nameitemr   i
strAddresss#                                      r)   scan_documentr     s   FUg.( A	KIm.@.@.B.B$C$C28TTTJLQ//E%000EE:VVVE_U111aaa2:%677FKKH,--- J{8344E.u55D

4  A%56KLLI3CDYZZEIG2M&MBOJIKK5CCCC (7 (7	??i4&7&7"%#i..K"b((#.q>(#;#w..'0(3Aw(?$ $D &,,T222#w../8(3Aw(?$ $D &,,T222 "
=) D DI B")))A,777J}i@@E{{!((q222 j)DDG"}}#**71:6666'J$OI!N! 
3 
3%%$ $W$,	0A0A(-I"d**$ $W)1U^5K5K-2N > >QVVXX%%z^33./i--#**1V9555 "QVVXX--zY..45n4E 233#**1^+<===7**(*%!00.0*+--J *GH'GG +GI!+GI+-G'(:!##I!(;(;GPQ@Q@QV]^jVkoqVqVqv}  Q  wR  VX  wX  wX  ]d  ex  ]y  }  ]  ]!H 
 v&&1(&:
##g>>???c5HIIJJJU0FPRSSTTTTTs   PQ	 Q	 7Q	 	Q z/v2/user/vCardc                     	 t           j        d         } | j        }| rt          j        t          |                                           t          j                  }t          j	        |d          }t          d          }t          ||t                    }t          j        |d d d d d d df                   }|                    d|z              d	d l}|                    d
g          }|                    d|z   d	          }t'          |           i }	d}
d}d}g }g }g }g }g }g }g }|D ]}d}ddi}t)          ||          } ||          }t'          d|           t'          d|j                   |j        D ]}|j        dk    r"|                    t1          |                     |j        dk    r"|                    t1          |                     |j        dk    r|                    |           |j        dk    r|                    |           |j        g k    r|                    |           t3          j        |
|          }|r|                    |d	                    t3          j        ||          }|r|                    |           t3          j        ||          }|r|                    |d	                    d                    |          }d                    |          }d                    |          }d                    |          } ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   ||	d<   | |	d <   t'          d!|	           t9          |          d	k    r_t9          |          d	k    rLt9          |          d	k    r9|	d         d"k    r-|	d         d"k    r!|	d          d"k    rd#d"d$d%}t;          |          S d|z   |	d&<   t;          d#|	d'          S t;          d#d(d)          S #  t;          d#d*d"d+          cY S xY w),Nr   r/   r   r   r   r   rw   r   r   en)detailz\+?[\d\s()-]{11,20}r   r   r   zopenie.resolve_corefT)
annotatorsoptionszdocument---->zdocument type---->PERSONORGANIZATIONTITLELOCATIONr   r   r   r   r   r   r   r   zdetails---->r   r   r   r   r   r   r   r   r   r   )r   r   r\   r4   r   r   r   r   r|   r   r*   r   r   r   r   rU   easyocrReaderreadtextrZ   r   r	  typer   strr   r   r   r   r   )!r   r\   r   r   r%   r   r   r  readerr   r   r   r  r  r  r  r  personr   designationr]   r  r  r  documentr   r
  r  r  r  	strPersonstrorganizationstrDesignations!                                    r)   scan_documentV2r*  ]  s   bVg.( \	KIm.@.@.B.B$C$C28TTTJLQ//E%000EE:VVVE_U111aaa2:%677FKKH,---NNN^^TF++F__[%9A_FFF&MMMG2M&MBOJIKKFLK #3 #3"
148%WMMM3t99oh///*8+<===&/ 1 1F{h..c&kk222{n44$++CKK888{g--#**4000{j00#**4000$**&&t,,,J}d;;	 4%%il333
=$77 +$$T****_d;; 3&&wqz222 --Jxx''I XXl33O XXk22N *GH'GG +GI$-GL!*9G&'!+GI+9G'( .))):!##I!(;(;GPQ@Q@QV]^jVkoqVqVqv}  Q  wR  VX  wX  wX  ]d  ex  ]y  }  ]  ]!H 
 v&&1(&:
##g>>???c5HIIJJJV#1GQSTTUUUUUs   OO5 	O5 #O5 5P__main__z0.0.0.0i  )hostport)ra   rb   )NNr   rl   )1flaskr   r   r   r   r   rS   r|   rV   pathlibr   r4   PILr   r   transformersr   r   r	   r   torchvision.transforms
transformsrd   torchvision.models.segmentationr
   r   r   pynlpr   	termcolorr   __name__appr$   r*   r@   rO   r`   rk   r   r   r   r   r   r   router  r*  run r+   r)   <module>r<     sh   ) ) ) ) ) ) ) ) ) ) 				 				 				 



             



     G G G G G G G G ! ! ! ! ! !  . . . . . . \ \ \ \ \ \ \ \ 				 ! ! ! ! ! !      eHoo U8K8K    "' ' ' - - -"      
3355 	j j j j\ fX..GU GU /.GUT fX..cV cV /.cVN zGGG&&&&& r+   