kai-sheng's picture
Update main.py
6ad868c verified
import io
from flask import Flask, request, jsonify
import base64
import pytesseract
import numpy as np
from pickle import load
from PIL import Image
from keras.applications.xception import Xception # to get pre-trained model Xception
from keras.models import load_model
from keras.preprocessing.sequence import pad_sequences
app = Flask(__name__)
MAX_LENGTH = 34
def format_tesseract_output(output_text):
formatted_text = ""
lines = output_text.strip().split("\n")
for line in lines:
line = line.strip()
if line:
formatted_text += line + "\n"
return formatted_text
def extract_features(image_data, model):
try:
image = Image.open(io.BytesIO(image_data))
except Exception as e:
return None
image = image.resize((299,299))
image = np.array(image)
# convert 4 channels image into 3 channels
if image.shape[2] == 4:
image = image[..., :3]
image = np.expand_dims(image, axis=0)
image = image/127.5
image = image - 1.0
feature = model.predict(image)
return feature
def word_for_id(integer, tokenizer):
for word, index in tokenizer.word_index.items():
if index == integer:
return word
return None
def generate_desc(model, tokenizer, photo, max_length):
in_text = 'start'
for i in range(max_length):
sequence = tokenizer.texts_to_sequences([in_text])[0]
sequence = pad_sequences([sequence], maxlen=max_length)
pred = model.predict([photo,sequence], verbose=0)
pred = np.argmax(pred)
word = word_for_id(pred, tokenizer)
if word is None or word == 'end':
break
in_text += ' ' + word
return in_text.replace('start ', '')
# API endpoint to receive image and generate caption
@app.route('/api', methods=['POST'])
def generate_caption():
try:
base64_image_data = request.form['image']
# Decode the Base64 string into binary image data
image_data = base64.b64decode(base64_image_data)
# Convert the image data to a PIL image object
pil_image = Image.open(io.BytesIO(image_data))
extracted_text = pytesseract.image_to_string(pil_image, lang="eng+chi_sim+msa")
hasText = bool(extracted_text.strip())
if hasText:
result = format_tesseract_output(extracted_text)
else:
tokenizer = load(open("tokenizer.p","rb"))
model = load_model('model.keras')
xception_model = Xception(include_top=False, pooling="avg")
photo = extract_features(image_data, xception_model)
if photo is None:
return jsonify({'error': 'Failed to extract features from the image'}), 400
result = generate_desc(model, tokenizer, photo, MAX_LENGTH)
return jsonify({'hasText': hasText, 'result': result}), 200
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run()