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 = "

Informatiounen iwwert den Projet

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.

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.

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).

Als Basis benotzen ech den AI-Model Xception deen 2017 vum franséischen Google Ingenieur François Chollet entwéckelt gouf. Dëse Model gouf mat dem Datensaz ImageNet 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.

Ech hun dëse vir-trainéierten (pretrained) Xception Model mam Flickr-8K Datensaz 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 (Meng Huggingface Demo : Mir iwwersetzen vun an op Lëtzebuergesch !) an dono mat dem Christoph Purschke senger Applikatioun Spellux verbessert.

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.

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.

" # 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 == '': 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()