Wat_ass_um_Bild / app.py
mbarnig's picture
Update app.py
d8c494e
import gradio as gr
from pickle import dump, load
import numpy as np
from PIL import Image
from keras.models import load_model
from keras.applications.xception import Xception
from keras.utils import pad_sequences
# from huggingface_hub import hf_hub_url
# from huggingface_hub.keras_mixin import from_pretrained_keras
myTitle = "🖼 Wat ass um Bild ? 🇱🇺"
myDescription = "### Jidder Bild erzielt eng Geschicht 📖. Lued deng Foto 📷 erop a looss der op Lëtzebuergesch beschreiwen wat den AI-Model XCEPTION op dengem Bild gesäit. Oder klick op eng vun de Beispill's-Fotoen !"
myArticle = "<h3>Informatiounen iwwert den Projet</h3><p>Dëst ass mäin éischten Prototyp vun engem AI-Model (Kënstlech Intelligenz) deen op lëtzebuergesch Fotoen a Biller beschreift, déi e virdrun net gesinn huet.</p><p>De Model besteet aus zwee neuronalen Netzwierker. En éischt Netzwierk (CNN : Convolutional Neural Network) léiert vun engem digitale Bild 2048 verschidde Eegenschaften (features) ze identifizéieren an ze späicheren. En zweet Netzwierk (RNN : Recurrent Neural Network + LSTM : Long Short-Term Memory) léiert aus Beschreiwungen zu dem Bild sech typesch Wierder a Begrëffer ze mierken. Dono ginn d'Erkenntnisser vum CNN an RNN-LSTM mateneen verschmëlzt.</p><p>Wann een esou neuronal Netzer mat engem Datensaz vu ganz vill Biller a Beschreiwungen trainéiert, léiert den AI-Model den Kontext vun Biller ze verstoen. Well Beschreiwungen vun den Trainingsbiller vun verschiddenen Persounen erstallt goufen, bezeechent een den AI-Léierprozess dozou als iwwerwaacht (supervised).</p><p>Als Basis benotzen ech den <a href='https://openaccess.thecvf.com/content_cvpr_2017/papers/Chollet_Xception_Deep_Learning_CVPR_2017_paper.pdf'>AI-Model Xception</a> deen 2017 vum franséischen Google Ingenieur <a href='https://en.wikipedia.org/wiki/François_Chollet'>François Chollet</a> entwéckelt gouf. Dëse Model gouf mat dem Datensaz <a href='https://www.image-net.org'>ImageNet</a> mat méi wéi 14 Millioune Biller trainéiert. Dësen Datensaz kann Biller an 1000 verschidden Rubricken klasséieren, mee en enthält keng Bildbeschreiwungen.</p><p>Ech hun dëse vir-trainéierten (pretrained) Xception Model mam <a href='https://www.kaggle.com/datasets/adityajn105/flickr8'>Flickr-8K Datensaz</a> mat 8.092 Biller an 40.460 Bildbeschreiwungen no-trainéiert (transfer-learning). Déi meescht Motiver op den Trainings-Fotoen sinn Hënn, Sport an Kanner. Ech hunn déi original englesch Texter automatesch op Lëtzebuergesch iwwersat <a href='https://huggingface.co/spaces/mbarnig/translation-lb-en-with-3-models'>(Meng Huggingface Demo : Mir iwwersetzen vun an op Lëtzebuergesch !)</a> an dono mat dem <a href='https://wwwfr.uni.lu/research/fhse/dhum/people/christoph_purschke'>Christoph Purschke</a> senger Applikatioun <a href='https://github.com/questoph/spellux'>Spellux</a> verbessert.</p><p>An dëser Demo kann jiddereen eng Foto eroplueden fir ze probéieren wéi gutt (oder schlecht) den AI-Model dat Bild beschreiwen kann. Et ass nach holpereg, mee et get eng éischt Iddi wéi weit d'Kënstlech Intelligenz haut fortgeschratt ass.</p><p>En Zousaz-Training mat méi Biller (z.B. Flickr-30K = 30.000 ; MSCOCO = 330.000) an eng zousätzlech Korrektur vun de lëtzebuergeschen Bildbeschreiwungen kënnen Wonner bewierken fir de Model ze verbesseren. Deemnächst an dësem Theater.</p>"
# Load model
model = load_model("model_40_flickr8.h5")
# model = from_pretrained_keras("mbarnig/xception-flickr8k-lb")
# Load Tokenizer
tokenizer = load(open("tokenizer.p","rb"))
# model_url = hf_hub_url(repo_id="mbarnig/xception-flickr8k-lb", filename="model_40_flickr8.h5")
# print(model_url)
max_desc_length = 71
def extract_features(image, model):
# eventually convert 4 channels image into 3 channels
#if image.shape[2] == 4:
# image = image[..., :3]
image = image.resize((299,299))
testimage = image
image = np.expand_dims(image, axis=0)
image = image/127.5
image = image - 1.0
feature = model.predict(image)
return feature, testimage
def generate_desc(model, tokenizer, photo, max_length):
in_text = ''
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 = tokenizer.index_word[pred]
if word == '<end>':
break
in_text += ' ' + word
return in_text
def beschreiw(inp):
photo, image = extract_features(inp, Xception(include_top=False, pooling="avg"))
description = generate_desc(model, tokenizer, photo, max_desc_length)
# return description, image
return description
# return model_url
# shape=(299,299) in gr.Image crops the image
myInput = gr.Image(label="Lued däin Bild erop", type="pil")
myOutput = [
gr.Textbox(label="Bildbeschreiwung", lines=3),
# gr.Image(label="Test")
]
myExamples = [
'examples/image1.jpg',
'examples/image2.jpg',
'examples/image3.jpg',
'examples/image4.jpg',
'examples/image5.jpg',
'examples/image6.jpg',
'examples/image7.jpg',
'examples/image8.jpg',
'examples/image9.jpg',
'examples/image10.jpg',
'examples/image11.jpg',
'examples/image12.jpg',
'examples/image13.jpg',
'examples/image14.jpg',
'examples/image15.jpg',
'examples/image16.jpg',
'examples/image17.jpg'
]
demo = gr.Interface(
fn = beschreiw,
inputs = myInput,
outputs = myOutput,
title = myTitle,
description = myDescription,
article = myArticle,
examples = myExamples
)
demo.launch()