Files
boc/iom/visual_geolocation/__pycache__/ocr_pipeline.cpython-39.pyc
T

82 lines
7.4 KiB
Plaintext
Raw Normal View History

a
§—>j4&ã@sjdZddlmZmZmZmZddlmZddlZ eGdddƒƒZ
GdddƒZ d d
Z e
d krfe ƒdS) zD
OCR Pipeline
Extract all text from images for semantic geolocation
é)ÚDictÚListÚOptionalÚTuple)Ú dataclassNc@sNeZdZUdZeed<eed<eeed<dZ e
eed<dZ e
eed<dS)Ú OCRResultzOCR detection resultÚtextÚ
confidenceÚbboxNÚlanguageÚ text_type) Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚstrÚ__annotations__ÚfloatrÚintr rr ©rrúF/home/bernt/.openclaw/workspace/iom/visual_geolocation/ocr_pipeline.pyr s
 rc@s¸eZdZdZdedœddZddZedœd d
Zedœd d Z ee
e d
œddZ ee
e d
œddZ
ee
e d
œddZee
e d
œddZeeedœddZeed
œddZdS)Ú OCRPipelineuÙ
Multi-engine OCR pipeline
Supports:
- Tesseract (local) — requires tesseract binary
- EasyOCR (local) — requires easyocr package
- Simulated (demo) — for testing without OCR engine
Úauto©ÚenginecCs||_d|_| ¡dS)NF)rÚ availableÚ _init_engine)ÚselfrrrrÚ__init__szOCRPipeline.__init__cCs„|jdkrD| ¡r d|_d|_q€| ¡r6d|_d|_q€d|_d|_n<|jdkrZ| ¡|_n&|jdkrp| ¡|_n|jdkr€d|_dS)zInitialize OCR enginerÚ tesseractTÚeasyocrÚ simulatedN)rÚ_check_tesseractrÚ_check_easyocr)rrrrr$s

 
 
zOCRPipeline._init_engine)ÚreturncCs0zddl}| ¡||_WdSYdS0dS)zCheck if Tesseract is availablerNTF)Ú pytesseractZget_tesseract_versionr)rr%rrrr"=szOCRPipeline._check_tesseractcCs2zddl}| gd¢¡|_WdSYdS0dS)zCheck if EasyOCR is availablerN)ÚenZsvZthTF)r ÚReaderÚreader)rr rrrr#Hs zOCRPipeline._check_easyocr)Ú
image_pathr$cCsJ|js
gS|jdkr| |¡S|jdkr2| |¡S|jdkrF| |¡SgS)zExtract all text from imagerr r!)rrÚ_extract_tesseractÚ_extract_easyocrÚ_extract_simulated)rr)rrrÚ extract_textQs





zOCRPipeline.extract_textc Cddlm}| |¡}|jj||jjjd}g}t|dƒ}t|ƒD]š}t |d|ƒ}|dkrD|d| 
¡} | rD|d||d||d ||d
|f\}
} } }
t | |d |
| |
| | |
gd |  | ¡d
}| 
|¡qD|S)zExtract text using Tesseractr©ÚImage)Ú output_typerÚconféÚleftÚtopÚwidthÚheightgY@N©rr r
r r )ÚPILr/ÚopenrÚ
image_to_dataÚOutputÚDICTÚlenÚrangerÚstriprÚ_classify_textÚappend)rr)r/ÚimgÚdataÚresultsÚn_boxesÚir1rÚresultrrrr*_s( 
  4û zOCRPipeline._extract_tesseractc Cs|j |¡}g}|D]x\}}}t|ddƒt|ddƒ}}t|ddƒt|ddƒ} }
t||||| |
gd| |¡d} | | ¡q|S)zExtract text using EasyOCRrééNr7)r(Zreadtextrrr@rA) rr)rDZ ocr_resultsr
rr1Úx1Zy1Úx2Zy2rKrrrr+}s ""
û zOCRPipeline._extract_easyocrc Cddlm}ddl}| |¡}|j\}}gd¢}g}|D]f\} }
} | d|d¡} | d|d¡}
t| ƒd}d }t| | | |
| ||
|gd
|
d }| |¡q8|S) zSimulated OCR for demo purposesrr.N))úSukhumvit RoadÚ street_namegq=
×£pí?)ÚBangkokZ city_nameg)\Âõ(ì?)Z10110Ú postal_codegffffffî?)Z
RestaurantÚ
business_namegè?)ZMASSAGErTg=
×£p=ê?é2éÈédér2r&r7) r8r/Úrandomr9ÚsizeZrandintr=rrA)rr)r/rYrBr5r6Zsimulated_textsrDrr r1rGrHrIrJrKrrrr,s( 

 û zOCRPipeline._extract_simulated)rr$c| ¡gd¢}tfdd|Dƒƒr*dSgd¢}tfdd|DƒƒrLdSt|ƒdkr€td d|Dƒƒr€td
d|Dƒƒr€d S| ¡r˜t|ƒd kr˜d
Stdd|Dƒƒrºt|ƒdkrºdS| ¡rÒt|ƒdkrÒdSdS)z0Classify text type (street name, business, etc.)) ZstreetÚstZavenueZaveZroadZrdZ boulevardZblvdZlaneZlnZgatanuvägenc3s|]}|ˆvVqdS©Nr©Ú.0Úkw©Ú
text_lowerrrÚ <genexpr>Áóz-OCRPipeline._classify_text.<locals>.<genexpr>rQ) Z
restaurantZcafeZshopZstoreZhotelZmassageZspaZbarZpubc3s|]}|ˆvVqdSr\rr]r`rrrbÇrcrTé
css|]}| ¡VqdSr\©Úisdigit©r^ÚcrrrrbËrccss|]}| ¡VqdSr\)ÚisalphargrrrrbËrcÚ
license_plateéÚ house_numbercss|]}| ¡VqdSr\rergrrrrbÓrcéÚ phone_numberérSÚunknown)ÚlowerÚanyr=rf)rrZstreet_keywordsZbusiness_keywordsrr`rr@ºs 0zOCRPipeline._classify_textcC| |¡}gggggggdœ}|D]¼}|jdkrB|d |j¡q"|jdkr^|d |j¡q"|jdkrz|d |j¡q"|jdkr|d  |j¡q"|jd
kr²|d  |j¡q"|jd krÎ|d
 |j¡q"|d |j¡q"|S)z'Extract structured data from image text)Ú street_namesÚbusiness_namesÚlicense_platesÚ
house_numbersÚ
phone_numbersÚ postal_codesÚ
other_textrQrsrTrtrjrurlrvrnrwrSrxry)r-r rAr)rr)rDÚ