import cv2 import numpy as np import pytesseract import tensorflow as tf from tensorflow.keras.preprocessing.image import img_to_array, load_img from process import preprocess_image from PIL import Image from codecs import encode, decode import requests def infer_text(im): im.save("converted.png") url = "https://ajax.thehive.ai/api/demo/classify?endpoint=text_recognition" files = { "image": ("converted.png", open("converted.png", "rb"), "image/png"), "model_type": (None, "detection"), "media_type": (None, "photo"), } headers = {"referer": "https://thehive.ai/"} res = requests.post(url, headers=headers, files=files) text = "" for output in res.json()["response"]["output"]: text += output["block_text"] text = decode(encode(text, "latin-1", "backslashreplace"), "unicode-escape") return text def find_order_id(uploaded_file, input_file, model, ocre): if ocre == 'Hive': uploaded_image = Image.open(uploaded_file) text = infer_text(uploaded_image) else: rotated = preprocess_image(uploaded_file) text = pytesseract.image_to_string(rotated) with input_file as file: file_contents = file.read().decode() lines = file_contents.split('\n') found = False possible_order_ids = [] for line in lines: order_id, name, font = line.strip().split(',') if name.strip() in text: image = load_img(uploaded_file, target_size=(64, 64)) image = img_to_array(image) image = np.expand_dims(image, axis=0) image = image / 255.0 prediction = model.predict(image) font_type = 'Pacifico' if prediction[0, 0] > prediction[0, 1] else 'OpenSans-Light' if font_type == font.strip(): result = { 'status': 'success', 'message': f'Detected Text: {text.strip()}\n, Order ID: {order_id}, Predicted Font Type: {font_type}' } found = True break else: possible_order_ids.append(order_id) if not found: image = load_img(uploaded_file, target_size=(64, 64)) image = img_to_array(image) image = np.expand_dims(image, axis=0) image = image / 255.0 prediction = model.predict(image) font_type = 'Pacifico' if prediction[0, 0] > prediction[0, 1] else 'OpenSans-Light' for line in lines: order_id, name, font = line.strip().split(',') if font.strip() == font_type: possible_order_ids.append(order_id) if len(possible_order_ids) > 0: result = { 'status': 'warning', 'message': f'Detected Text: {text.strip()}\n, Possible Order IDs: {",".join(possible_order_ids)}, Predicted Font Type: {font_type}' } else: result = { 'status': 'error', 'message': f'Detected Text: {text.strip()}\n, Could not find the Order ID and possible font matches.' } return result def jaccard_similarity(s1, s2): set1 = set(s1.split()) set2 = set(s2.split()) intersection = len(set1.intersection(set2)) union = len(set1.union(set2)) return intersection / union def find_order_id_similarity(uploaded_file, input_file, similarity_method, ocre): if ocre == 'Hive': uploaded_image = Image.open(uploaded_file) text = infer_text(uploaded_image) else: rotated = preprocess_image(uploaded_file) text = pytesseract.image_to_string(rotated) with input_file as file: file_contents = file.read().decode() lines = file_contents.split('\n') if similarity_method == 'exact_match': for line in lines: order_id, name, font = line.strip().split(',') if name.strip() == text.strip(): result = { 'status': 'success', 'message': f'Detected Text: {text.strip()}\n, Order ID: {order_id}' } return result message = f'Detected Text: {text.strip()}\n, Could not find the Order ID.' result = {'status': 'error', 'message': message} return result elif similarity_method == 'jaccard_similarity': possible_order_ids = [] for line in lines: order_id, name, font = line.strip().split(',') jaccard_score = jaccard_similarity(name.strip(), text.strip()) if jaccard_score >= 0.8: result = { 'status': 'success', 'message': f'Detected Text: {text.strip()}\n, Order ID: {order_id}' } return result elif jaccard_score >= 0.5: possible_order_ids.append(order_id) if len(possible_order_ids) > 0: message = f'Detected Text: {text.strip()}\n, Possible Order IDs: {",".join(possible_order_ids)}' result = {'status': 'warning', 'message': message} return result else: message = f'Detected Text: {text.strip()}\n, Could not find the Order ID.' result = {'status': 'error', 'message': message} return result def find_order_id_2(uploaded_file, input_file, model, ocre): if ocre == 'Hive': uploaded_image = Image.open(uploaded_file) text = infer_text(uploaded_image) else: rotated = preprocess_image(uploaded_file) text = pytesseract.image_to_string(rotated) with input_file as file: file_contents = file.read().decode() lines = file_contents.split('\n') found = False possible_order_ids = [] for line in lines: order_id, name, font = line.strip().split(',') if name.strip() in text: image = load_img(uploaded_file, target_size=(64, 64)) image = img_to_array(image) image = np.expand_dims(image, axis=0) image = image / 255.0 prediction = model.predict(image) class_names = ['Allibretto1.8.otf', 'Bella1.1.otf', 'Buffalo Nickel1.2.otf', 'Cervanttis1.18.otf', 'Claster1.6.otf', 'Fairy4.5.otf', 'Mon-Amour-April1.7.otf', 'Mon-Amour-Aug1.1.otf', 'Mon-Amour-Dec1.2.otf', 'Mon-Amour-Feb1.1.otf', 'Mon-Amour-January1.2.otf', 'Mon-Amour-July1.1.otf', 'Mon-Amour-June1.1.otf', 'Mon-Amour-Mar1.2.otf', 'Mon-Amour-May1.1.otf', 'Mon-Amour-Nov1.1.otf', 'Mon-Amour-Oct1.1.otf', 'Mon-Amour-Sept1.1.otf', 'Mon-Amour2.3.otf', 'Shelby1.3.otf', 'UKIJJ-Quill1.7.otf'] predicted_class_index = np.argmax(prediction[0]) predicted_class_name = class_names[predicted_class_index] if predicted_class_name.strip() == font.strip(): result = { 'status': 'success', 'message': f'Detected Text: {text.strip()}\n, Order ID: {order_id}, Predicted Font Type: {predicted_class_name.strip()}' } found = True break else: possible_order_ids.append(order_id) if not found: image = load_img(uploaded_file, target_size=(64, 64)) image = img_to_array(image) image = np.expand_dims(image, axis=0) image = image / 255.0 prediction = model.predict(image) class_names = ['Allibretto1.8.otf', 'Bella1.1.otf', 'Buffalo Nickel1.2.otf', 'Cervanttis1.18.otf', 'Claster1.6.otf', 'Fairy4.5.otf', 'Mon-Amour-April1.7.otf', 'Mon-Amour-Aug1.1.otf', 'Mon-Amour-Dec1.2.otf', 'Mon-Amour-Feb1.1.otf', 'Mon-Amour-January1.2.otf', 'Mon-Amour-July1.1.otf', 'Mon-Amour-June1.1.otf', 'Mon-Amour-Mar1.2.otf', 'Mon-Amour-May1.1.otf', 'Mon-Amour-Nov1.1.otf', 'Mon-Amour-Oct1.1.otf', 'Mon-Amour-Sept1.1.otf', 'Mon-Amour2.3.otf', 'Shelby1.3.otf', 'UKIJJ-Quill1.7.otf'] predicted_class_index = np.argmax(prediction[0]) predicted_class_name = class_names[predicted_class_index] for line in lines: order_id, name, font = line.strip().split(',') if font.strip() == predicted_class_name.strip(): possible_order_ids.append(order_id) if len(possible_order_ids) > 0: result = { 'status': 'warning', 'message': f'Detected Text: {text.strip()}\n, Possible Order IDs: {",".join(possible_order_ids)}, Predicted Font Type: {predicted_class_name.strip()}' } else: result = { 'status': 'error', 'message': f'Detected Text: {text.strip()}\n, Could not find the Order ID and possible font matches.' } return result