Spaces:
Runtime error
Runtime error
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() |