Image-Caption-Generator / processor.py
william-renaldy's picture
Upload 6 files
a163b6d
Raw History Blame Contribute Delete
2 kB
import pickle
import numpy as np
from PIL import Image
import tensorflow as tf
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.applications.xception import Xception
class GenerateDescription():
def __init__(self) -> None:
self.max_length = 39
self.model = load_model(r"Saved_model/model_1")
with open("tokenizer.pkl","rb") as tk:
self.tokenizer = pickle.load(tk)
def _load_test(self,img_path):
model = Xception( include_top=False,pooling="max")
print(f"[info] Loading image from {img_path}")
image = Image.open(img_path)
image = image.resize((299,299))
print(image.size)
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(self,integer):
for word, index in self.tokenizer.word_index.items():
if index == integer:
return word
return None
def _generate_desc(self, photo) -> str:
in_text = 'start'
for _ in range(self.max_length):
sequence = self.tokenizer.texts_to_sequences([in_text])[0]
sequence = pad_sequences([sequence], maxlen=self.max_length)
pred = self.model.predict([photo,sequence], verbose=0)
pred = np.argmax(pred)
word = self._word_for_id(pred)
if word is None:
break
in_text += ' ' + word
if word == 'end':
break
return in_text
def generate(self,img):
photo = self._load_test(img)
description = self._generate_desc(photo)
return description
if __name__ == "__main__":
g = GenerateDescription()
caption = g.generate(r"Sparks.png")
print(caption)