Spaces:
Running
Running
phyloforfun
commited on
Commit
•
a1e2ec1
1
Parent(s):
01e6026
Major update. Support for 15 LLMs, World Flora Online taxonomy validation, geolocation, 2 OCR methods, significant UI changes, stability improvements, consistent JSON parsing
Browse files- app.py +43 -16
- demo/{demo_images/MICH_29667680_Hypericaceae_Hypericum_prolificum.jpg → demo_gallery/MICH_7574789_Cyperaceae_Carex_scoparia.jpg} +2 -2
- demo/demo_images/MICH_7574789_Cyperaceae_Carex_scoparia.jpg +3 -0
- vouchervision/API_validation.py +14 -13
- vouchervision/OCR_google_cloud_vision.py +29 -27
- vouchervision/VoucherVision_Config_Builder.py +1 -1
- vouchervision/utils_VoucherVision.py +1 -1
app.py
CHANGED
@@ -1395,24 +1395,41 @@ def load_api_status():
|
|
1395 |
except FileNotFoundError:
|
1396 |
return None, None, None
|
1397 |
|
1398 |
-
def display_api_key_status():
|
1399 |
if not st.session_state['API_checked']:
|
1400 |
present_keys, missing_keys, date_of_check = load_api_status()
|
1401 |
if present_keys is None and missing_keys is None:
|
1402 |
st.session_state['API_checked'] = False
|
1403 |
else:
|
1404 |
# Convert keys to annotations (similar to what you do in check_api_key_status)
|
1405 |
-
present_annotations = [
|
1406 |
-
missing_annotations = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1407 |
|
1408 |
st.session_state['present_annotations'] = present_annotations
|
1409 |
st.session_state['missing_annotations'] = missing_annotations
|
1410 |
st.session_state['date_of_check'] = date_of_check
|
1411 |
st.session_state['API_checked'] = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1412 |
|
1413 |
# Check if the API status has already been retrieved
|
1414 |
if 'API_checked' not in st.session_state or not st.session_state['API_checked'] or st.session_state['API_rechecked']:
|
1415 |
-
|
|
|
|
|
1416 |
st.session_state['API_checked'] = True
|
1417 |
st.session_state['API_rechecked'] = False
|
1418 |
|
@@ -1424,6 +1441,7 @@ def display_api_key_status():
|
|
1424 |
# Display missing keys horizontally
|
1425 |
if 'missing_annotations' in st.session_state and st.session_state['missing_annotations']:
|
1426 |
annotated_text(*st.session_state['missing_annotations'])
|
|
|
1427 |
|
1428 |
|
1429 |
def check_api_key_status():
|
@@ -1454,9 +1472,11 @@ def check_api_key_status():
|
|
1454 |
|
1455 |
# Save API key status
|
1456 |
save_api_status(present_keys, missing_keys, date_of_check)
|
|
|
|
|
|
|
|
|
1457 |
|
1458 |
-
return present_annotations, missing_annotations, date_of_check
|
1459 |
-
|
1460 |
|
1461 |
def convert_cost_dict_to_table(cost, name):
|
1462 |
# Convert the dictionary to a pandas DataFrame for nicer display
|
@@ -1507,7 +1527,10 @@ def get_all_cost_tables():
|
|
1507 |
|
1508 |
|
1509 |
def content_header():
|
1510 |
-
col_logo, col_run_1, col_run_2, col_run_3, col_run_4
|
|
|
|
|
|
|
1511 |
|
1512 |
|
1513 |
col_test = st.container()
|
@@ -1591,10 +1614,7 @@ def content_header():
|
|
1591 |
if st.session_state['formatted_json']:
|
1592 |
json_report.set_JSON(st.session_state['formatted_json'], st.session_state['formatted_json_WFO'], st.session_state['formatted_json_GEO'])
|
1593 |
|
1594 |
-
|
1595 |
-
with st.expander("View Messages and Updates"):
|
1596 |
-
st.info("***Note:*** If you use VoucherVision frequently, you can change the default values that are auto-populated in the form below. In a text editor or IDE, edit the first few rows in the file `../VoucherVision/vouchervision/VoucherVision_Config_Builder.py`")
|
1597 |
-
|
1598 |
|
1599 |
|
1600 |
with col_run_1:
|
@@ -1810,13 +1830,14 @@ def content_api_check():
|
|
1810 |
st.header('Available APIs')
|
1811 |
|
1812 |
# Display API key status
|
1813 |
-
display_api_key_status()
|
1814 |
|
1815 |
# Place the button in the second column, right-justified
|
1816 |
# with col_llm_2b:
|
1817 |
if st.button("Re-Check API Keys"):
|
1818 |
st.session_state['API_checked'] = False
|
1819 |
st.session_state['API_rechecked'] = True
|
|
|
1820 |
# with col_llm_2c:
|
1821 |
if st.button("Edit API Keys"):
|
1822 |
st.session_state.proceed_to_private = True
|
@@ -1861,7 +1882,7 @@ def content_collage_overlay():
|
|
1861 |
st.session_state["demo_collage"] = Image.open(ba)
|
1862 |
|
1863 |
# Display the image
|
1864 |
-
st.image(st.session_state["demo_collage"], caption='LeafMachine2 Collage', output_format="PNG")
|
1865 |
# st.image(st.session_state["demo_collage"], caption='LeafMachine2 Collage', output_format="JPEG")
|
1866 |
|
1867 |
|
@@ -1934,7 +1955,7 @@ def content_collage_overlay():
|
|
1934 |
ocr = os.path.join(st.session_state.dir_home,'demo', 'ba','ocr2_low.png')
|
1935 |
st.session_state["demo_overlay"] = Image.open(ocr)
|
1936 |
|
1937 |
-
st.image(st.session_state["demo_overlay"], caption='OCR Overlay Images', output_format = "PNG")
|
1938 |
# st.image(st.session_state["demo_overlay"], caption='OCR Overlay Images', output_format = "JPEG")
|
1939 |
|
1940 |
|
@@ -2242,8 +2263,14 @@ st.set_page_config(layout="wide", page_icon='img/icon.ico', page_title='VoucherV
|
|
2242 |
|
2243 |
# Parse the 'is_hf' argument and set it in session state
|
2244 |
if 'is_hf' not in st.session_state:
|
2245 |
-
st.session_state['is_hf'] =
|
2246 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2247 |
print(f"is_hf {st.session_state['is_hf']}")
|
2248 |
# Default YAML file path
|
2249 |
if 'config' not in st.session_state:
|
@@ -2266,7 +2293,7 @@ if st.session_state['is_hf']:
|
|
2266 |
|
2267 |
else:
|
2268 |
if 'proceed_to_main' not in st.session_state:
|
2269 |
-
st.session_state.proceed_to_main =
|
2270 |
print(f"proceed_to_main {st.session_state['proceed_to_main']}")
|
2271 |
if 'private_file' not in st.session_state:
|
2272 |
st.session_state.private_file = does_private_file_exist()
|
|
|
1395 |
except FileNotFoundError:
|
1396 |
return None, None, None
|
1397 |
|
1398 |
+
def display_api_key_status(ccol):
|
1399 |
if not st.session_state['API_checked']:
|
1400 |
present_keys, missing_keys, date_of_check = load_api_status()
|
1401 |
if present_keys is None and missing_keys is None:
|
1402 |
st.session_state['API_checked'] = False
|
1403 |
else:
|
1404 |
# Convert keys to annotations (similar to what you do in check_api_key_status)
|
1405 |
+
present_annotations = []
|
1406 |
+
missing_annotations = []
|
1407 |
+
for key in present_keys:
|
1408 |
+
if "Valid" in key:
|
1409 |
+
show_text = key.split('(')[0]
|
1410 |
+
present_annotations.append((show_text, "ready!", "#059c1b")) # Green for valid
|
1411 |
+
elif "Invalid" in key:
|
1412 |
+
show_text = key.split('(')[0]
|
1413 |
+
present_annotations.append((show_text, "error", "#870307")) # Red for invalid
|
1414 |
|
1415 |
st.session_state['present_annotations'] = present_annotations
|
1416 |
st.session_state['missing_annotations'] = missing_annotations
|
1417 |
st.session_state['date_of_check'] = date_of_check
|
1418 |
st.session_state['API_checked'] = True
|
1419 |
+
# print('for')
|
1420 |
+
# print(st.session_state['present_annotations'])
|
1421 |
+
# print(st.session_state['missing_annotations'])
|
1422 |
+
else:
|
1423 |
+
# print('else')
|
1424 |
+
# print(st.session_state['present_annotations'])
|
1425 |
+
# print(st.session_state['missing_annotations'])
|
1426 |
+
pass
|
1427 |
|
1428 |
# Check if the API status has already been retrieved
|
1429 |
if 'API_checked' not in st.session_state or not st.session_state['API_checked'] or st.session_state['API_rechecked']:
|
1430 |
+
with ccol:
|
1431 |
+
with st.spinner('Verifying APIs by sending short requests...'):
|
1432 |
+
check_api_key_status()
|
1433 |
st.session_state['API_checked'] = True
|
1434 |
st.session_state['API_rechecked'] = False
|
1435 |
|
|
|
1441 |
# Display missing keys horizontally
|
1442 |
if 'missing_annotations' in st.session_state and st.session_state['missing_annotations']:
|
1443 |
annotated_text(*st.session_state['missing_annotations'])
|
1444 |
+
|
1445 |
|
1446 |
|
1447 |
def check_api_key_status():
|
|
|
1472 |
|
1473 |
# Save API key status
|
1474 |
save_api_status(present_keys, missing_keys, date_of_check)
|
1475 |
+
|
1476 |
+
st.session_state['present_annotations'] = present_annotations
|
1477 |
+
st.session_state['missing_annotations'] = missing_annotations
|
1478 |
+
st.session_state['date_of_check'] = date_of_check
|
1479 |
|
|
|
|
|
1480 |
|
1481 |
def convert_cost_dict_to_table(cost, name):
|
1482 |
# Convert the dictionary to a pandas DataFrame for nicer display
|
|
|
1527 |
|
1528 |
|
1529 |
def content_header():
|
1530 |
+
col_logo, col_run_1, col_run_2, col_run_3, col_run_4 = st.columns([2,2,2,2,4])
|
1531 |
+
with col_run_4:
|
1532 |
+
with st.expander("View Messages and Updates"):
|
1533 |
+
st.info("***Note:*** If you use VoucherVision frequently, you can change the default values that are auto-populated in the form below. In a text editor or IDE, edit the first few rows in the file `../VoucherVision/vouchervision/VoucherVision_Config_Builder.py`")
|
1534 |
|
1535 |
|
1536 |
col_test = st.container()
|
|
|
1614 |
if st.session_state['formatted_json']:
|
1615 |
json_report.set_JSON(st.session_state['formatted_json'], st.session_state['formatted_json_WFO'], st.session_state['formatted_json_GEO'])
|
1616 |
|
1617 |
+
|
|
|
|
|
|
|
1618 |
|
1619 |
|
1620 |
with col_run_1:
|
|
|
1830 |
st.header('Available APIs')
|
1831 |
|
1832 |
# Display API key status
|
1833 |
+
display_api_key_status(col_llm_2a)
|
1834 |
|
1835 |
# Place the button in the second column, right-justified
|
1836 |
# with col_llm_2b:
|
1837 |
if st.button("Re-Check API Keys"):
|
1838 |
st.session_state['API_checked'] = False
|
1839 |
st.session_state['API_rechecked'] = True
|
1840 |
+
st.rerun()
|
1841 |
# with col_llm_2c:
|
1842 |
if st.button("Edit API Keys"):
|
1843 |
st.session_state.proceed_to_private = True
|
|
|
1882 |
st.session_state["demo_collage"] = Image.open(ba)
|
1883 |
|
1884 |
# Display the image
|
1885 |
+
st.image(st.session_state["demo_collage"], caption='LeafMachine2 Collage', output_format="PNG", width=500)
|
1886 |
# st.image(st.session_state["demo_collage"], caption='LeafMachine2 Collage', output_format="JPEG")
|
1887 |
|
1888 |
|
|
|
1955 |
ocr = os.path.join(st.session_state.dir_home,'demo', 'ba','ocr2_low.png')
|
1956 |
st.session_state["demo_overlay"] = Image.open(ocr)
|
1957 |
|
1958 |
+
st.image(st.session_state["demo_overlay"], caption='OCR Overlay Images', output_format = "PNG", width=500)
|
1959 |
# st.image(st.session_state["demo_overlay"], caption='OCR Overlay Images', output_format = "JPEG")
|
1960 |
|
1961 |
|
|
|
2263 |
|
2264 |
# Parse the 'is_hf' argument and set it in session state
|
2265 |
if 'is_hf' not in st.session_state:
|
2266 |
+
st.session_state['is_hf'] = False
|
2267 |
|
2268 |
+
|
2269 |
+
#################################################################################################################################################
|
2270 |
+
# Initializations ###############################################################################################################################
|
2271 |
+
#################################################################################################################################################
|
2272 |
+
|
2273 |
+
|
2274 |
print(f"is_hf {st.session_state['is_hf']}")
|
2275 |
# Default YAML file path
|
2276 |
if 'config' not in st.session_state:
|
|
|
2293 |
|
2294 |
else:
|
2295 |
if 'proceed_to_main' not in st.session_state:
|
2296 |
+
st.session_state.proceed_to_main = True # New state variable to control the flow
|
2297 |
print(f"proceed_to_main {st.session_state['proceed_to_main']}")
|
2298 |
if 'private_file' not in st.session_state:
|
2299 |
st.session_state.private_file = does_private_file_exist()
|
demo/{demo_images/MICH_29667680_Hypericaceae_Hypericum_prolificum.jpg → demo_gallery/MICH_7574789_Cyperaceae_Carex_scoparia.jpg}
RENAMED
File without changes
|
demo/demo_images/MICH_7574789_Cyperaceae_Carex_scoparia.jpg
ADDED
Git LFS Details
|
vouchervision/API_validation.py
CHANGED
@@ -77,6 +77,7 @@ class APIvalidation:
|
|
77 |
response = client.document_text_detection(image=image)
|
78 |
texts = response.text_annotations
|
79 |
normal_cleaned_text = texts[0].description if texts else None
|
|
|
80 |
else:
|
81 |
logo_path = os.path.join(self.dir_home, 'img','logo.png')
|
82 |
client = vision.ImageAnnotatorClient()
|
@@ -151,22 +152,22 @@ class APIvalidation:
|
|
151 |
client = MistralClient(api_key=os.getenv('MISTRAL_API_KEY'))
|
152 |
|
153 |
|
154 |
-
|
155 |
|
156 |
-
|
157 |
-
|
158 |
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
except Exception as e: # Replace with a more specific exception if possible
|
171 |
return False
|
172 |
|
|
|
77 |
response = client.document_text_detection(image=image)
|
78 |
texts = response.text_annotations
|
79 |
normal_cleaned_text = texts[0].description if texts else None
|
80 |
+
print(f"OCR TEST: {normal_cleaned_text}")
|
81 |
else:
|
82 |
logo_path = os.path.join(self.dir_home, 'img','logo.png')
|
83 |
client = vision.ImageAnnotatorClient()
|
|
|
152 |
client = MistralClient(api_key=os.getenv('MISTRAL_API_KEY'))
|
153 |
|
154 |
|
155 |
+
# Initialize the Mistral Client with the API key
|
156 |
|
157 |
+
# Create a simple message
|
158 |
+
messages = [ChatMessage(role="user", content="hello")]
|
159 |
|
160 |
+
# Send the message and get the response
|
161 |
+
chat_response = client.chat(
|
162 |
+
model="mistral-tiny",
|
163 |
+
messages=messages,
|
164 |
+
)
|
165 |
|
166 |
+
# Check if the response is valid (adjust this according to the actual response structure)
|
167 |
+
if chat_response and chat_response.choices:
|
168 |
+
return True
|
169 |
+
else:
|
170 |
+
return False
|
171 |
except Exception as e: # Replace with a more specific exception if possible
|
172 |
return False
|
173 |
|
vouchervision/OCR_google_cloud_vision.py
CHANGED
@@ -29,7 +29,9 @@ class OCRGoogle:
|
|
29 |
|
30 |
BBOX_COLOR = "black"
|
31 |
|
32 |
-
def __init__(self, path, cfg, trOCR_model_version, trOCR_model, trOCR_processor, device):
|
|
|
|
|
33 |
self.path = path
|
34 |
self.cfg = cfg
|
35 |
self.do_use_trOCR = self.cfg['leafmachine']['project']['do_use_trOCR']
|
@@ -67,6 +69,29 @@ class OCRGoogle:
|
|
67 |
self.trOCR_height = None
|
68 |
self.trOCR_confidences = None
|
69 |
self.trOCR_characters = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
|
71 |
def detect_text_with_trOCR_using_google_bboxes(self, do_use_trOCR, logger):
|
72 |
CONFIDENCES = 0.80
|
@@ -255,22 +280,11 @@ class OCRGoogle:
|
|
255 |
|
256 |
|
257 |
def detect_text(self):
|
258 |
-
|
259 |
-
if not service_account_json_str:
|
260 |
-
print("Service account JSON not found in environment variables.")
|
261 |
-
return False
|
262 |
-
|
263 |
-
# Convert JSON string to a dictionary
|
264 |
-
service_account_info = json.loads(service_account_json_str)
|
265 |
-
# Create credentials from the service account info
|
266 |
-
credentials = service_account.Credentials.from_service_account_info(service_account_info)
|
267 |
-
# Initialize the client with the credentials
|
268 |
-
client = vision.ImageAnnotatorClient(credentials=credentials)
|
269 |
-
# client = vision.ImageAnnotatorClient() #####################################################################################################################
|
270 |
with io.open(self.path, 'rb') as image_file:
|
271 |
content = image_file.read()
|
272 |
image = vision.Image(content=content)
|
273 |
-
response = client.document_text_detection(image=image)
|
274 |
texts = response.text_annotations
|
275 |
|
276 |
if response.error.message:
|
@@ -381,25 +395,13 @@ class OCRGoogle:
|
|
381 |
|
382 |
|
383 |
def detect_handwritten_ocr(self):
|
384 |
-
service_account_json_str = os.getenv('google_service_account_json')
|
385 |
-
if not service_account_json_str:
|
386 |
-
print("Service account JSON not found in environment variables.")
|
387 |
-
return False
|
388 |
-
|
389 |
-
# Convert JSON string to a dictionary
|
390 |
-
service_account_info = json.loads(service_account_json_str)
|
391 |
-
# Create credentials from the service account info
|
392 |
-
credentials = service_account.Credentials.from_service_account_info(service_account_info)
|
393 |
-
# Initialize the client with the credentials
|
394 |
-
client = vision.ImageAnnotatorClient(credentials=credentials)
|
395 |
-
# client = vision.ImageAnnotatorClient() #####################################################################################################################
|
396 |
|
397 |
with open(self.path, "rb") as image_file:
|
398 |
content = image_file.read()
|
399 |
|
400 |
image = vision_beta.Image(content=content)
|
401 |
image_context = vision_beta.ImageContext(language_hints=["en-t-i0-handwrit"])
|
402 |
-
response =
|
403 |
texts = response.text_annotations
|
404 |
|
405 |
if response.error.message:
|
|
|
29 |
|
30 |
BBOX_COLOR = "black"
|
31 |
|
32 |
+
def __init__(self, is_hf, path, cfg, trOCR_model_version, trOCR_model, trOCR_processor, device):
|
33 |
+
self.is_hf = is_hf
|
34 |
+
|
35 |
self.path = path
|
36 |
self.cfg = cfg
|
37 |
self.do_use_trOCR = self.cfg['leafmachine']['project']['do_use_trOCR']
|
|
|
69 |
self.trOCR_height = None
|
70 |
self.trOCR_confidences = None
|
71 |
self.trOCR_characters = None
|
72 |
+
self.set_client()
|
73 |
+
|
74 |
+
|
75 |
+
|
76 |
+
def set_client(self):
|
77 |
+
if self.is_hf:
|
78 |
+
service_account_json_str = os.getenv('google_service_account_json')
|
79 |
+
if not service_account_json_str:
|
80 |
+
print("Service account JSON not found in environment variables.")
|
81 |
+
return False
|
82 |
+
|
83 |
+
# Convert JSON string to a dictionary
|
84 |
+
service_account_info = json.loads(service_account_json_str)
|
85 |
+
# Create credentials from the service account info
|
86 |
+
credentials = service_account.Credentials.from_service_account_info(service_account_info)
|
87 |
+
# Initialize the client with the credentials
|
88 |
+
self.client_beta = vision_beta.ImageAnnotatorClient(credentials=credentials)
|
89 |
+
self.client = vision.ImageAnnotatorClient(credentials=credentials)
|
90 |
+
else:
|
91 |
+
self.client_beta = vision_beta.ImageAnnotatorClient()
|
92 |
+
self.client = vision.ImageAnnotatorClient()
|
93 |
+
|
94 |
+
|
95 |
|
96 |
def detect_text_with_trOCR_using_google_bboxes(self, do_use_trOCR, logger):
|
97 |
CONFIDENCES = 0.80
|
|
|
280 |
|
281 |
|
282 |
def detect_text(self):
|
283 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
284 |
with io.open(self.path, 'rb') as image_file:
|
285 |
content = image_file.read()
|
286 |
image = vision.Image(content=content)
|
287 |
+
response = self.client.document_text_detection(image=image)
|
288 |
texts = response.text_annotations
|
289 |
|
290 |
if response.error.message:
|
|
|
395 |
|
396 |
|
397 |
def detect_handwritten_ocr(self):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
398 |
|
399 |
with open(self.path, "rb") as image_file:
|
400 |
content = image_file.read()
|
401 |
|
402 |
image = vision_beta.Image(content=content)
|
403 |
image_context = vision_beta.ImageContext(language_hints=["en-t-i0-handwrit"])
|
404 |
+
response = self.client_beta.document_text_detection(image=image, image_context=image_context)
|
405 |
texts = response.text_annotations
|
406 |
|
407 |
if response.error.message:
|
vouchervision/VoucherVision_Config_Builder.py
CHANGED
@@ -39,7 +39,7 @@ def build_VV_config(loaded_cfg=None):
|
|
39 |
OCR_option = 'hand'
|
40 |
check_for_illegal_filenames = False
|
41 |
|
42 |
-
LLM_version_user = 'Azure GPT
|
43 |
prompt_version = 'version_5.yaml' # from ["Version 1", "Version 1 No Domain Knowledge", "Version 2"]
|
44 |
use_LeafMachine2_collage_images = True # Use LeafMachine2 collage images
|
45 |
do_create_OCR_helper_image = True
|
|
|
39 |
OCR_option = 'hand'
|
40 |
check_for_illegal_filenames = False
|
41 |
|
42 |
+
LLM_version_user = 'Azure GPT 3.5 Instruct' #'Azure GPT 4 Turbo 1106-preview'
|
43 |
prompt_version = 'version_5.yaml' # from ["Version 1", "Version 1 No Domain Knowledge", "Version 2"]
|
44 |
use_LeafMachine2_collage_images = True # Use LeafMachine2 collage images
|
45 |
do_create_OCR_helper_image = True
|
vouchervision/utils_VoucherVision.py
CHANGED
@@ -632,7 +632,7 @@ class VoucherVision():
|
|
632 |
# self.OCR - None
|
633 |
|
634 |
### Process_image() runs the OCR for text, handwriting, trOCR AND creates the overlay image
|
635 |
-
ocr_google = OCRGoogle(self.path_to_crop, self.cfg, self.trOCR_model_version, self.trOCR_model, self.trOCR_processor, self.device)
|
636 |
ocr_google.process_image(self.do_create_OCR_helper_image, self.logger)
|
637 |
self.OCR = ocr_google.OCR
|
638 |
|
|
|
632 |
# self.OCR - None
|
633 |
|
634 |
### Process_image() runs the OCR for text, handwriting, trOCR AND creates the overlay image
|
635 |
+
ocr_google = OCRGoogle(self.is_hf, self.path_to_crop, self.cfg, self.trOCR_model_version, self.trOCR_model, self.trOCR_processor, self.device)
|
636 |
ocr_google.process_image(self.do_create_OCR_helper_image, self.logger)
|
637 |
self.OCR = ocr_google.OCR
|
638 |
|