Bilder, die von einer künstlichen Intelligenz wie DALL-E oder DeepAI „gemalt“ werden, sind in aller Munde. In diesem Tutorial erfährst du, wie du KI Bilder mithilfe eines Python Scripts erzeugst.
Du lädst dir hierfür die aktuelle Schlagzeile der BBC-Nachrichten von einer API und schickst diese an die künstliche Intelligenz von deepai.org – von dort erhältst du eine Illustration der Schlagzeile zurück auf deinen Computer, gemalt in einem Stil deiner Wahl.
Diese APIs benötigst du
In diesem Projekt kommen zwei Services zum Einsatz, die du über deren APIs ansteuerst: NewsAPI und DeepAI. Von ersterer fragst die aktuelle Schlagzeile der BBC ab. Hierfür benötigst du einen API Key, den du nach deiner kostenlosen Registrierung erhältst. Wie das geht, und wo du deinen API Key findest, haben wir in diesem Projekt beschrieben.
Mit DeepAI erzeugst du dann KI Bilder, indem du die Schlagzeile an deren API weiterleitest und als sogenannten Prompt verwendest. Das ist so etwas wie die „Malanweisung“, die du der künstlichen Intelligenz gibst. Hierfür kommt ein Diffusionsmodell zum Einsatz, das der Deutschlandfunk Kultur in diesem Beitrag anschaulich erklärt. Erstaunlich hierbei ist, dass die KI eigentlich kein Bild auf Basis deiner Anweisung erzeugt, sondern vielmehr aus einem großen Rauschen „freilegt“.
Aber zurück zur API von DeepAI. Auch um diese nutzen zu können, benötigst du einen kostenlosen Account dort. Du erhältst anschließend einige Gratis-Credits, die du bei Bedarf auch günstig aufstocken kannst. Nachdem du dein kostenloses Kontingent verbraucht hast, kostet dich ein Bild 5 Cent – ein Betrag, der den Spaß Wert ist, wie wir finden.
Deinen API Key von DeepAI findest du übrigens oben in deinem Profil. Auch diesen wirst du demnächst in deinem Python Script benötigen.
Bibliotheken installieren
Für dein Script benötigst du einige Bibliotheken, die du vielleicht noch nicht installiert hast: requests, newsapi und PIL. Du kannst sie mit diesen Befehlen installieren:
pip install requests
pip install newsapi-python
pip install Pillow
Du benötigst diese drei Bibliotheken für die API-Abfrage bei DeepAI und NewsAPI und um das Bild, das du zurück erhältst zu bearbeiten. Insgesamt importierst du zu Beginn des Scripts folgende Bibliotheken:
import requests
import webbrowser
import json
from newsapi import NewsApiClient
from PIL import Image
import os
import sys
import shutil
import random
Schlagzeilen von newsapi abrufen
Als nächstes besorgst du dir die neuesten Nachrichten von der BBC. Hier kommt die NewsAPI-Bibliothek zum Einsatz, die du gerade importiert hast. (Natürlich kannst du den Request auch anders gestalten.)
# NewsAPI
newsapi = NewsApiClient(api_key='DEIN API-Key von NewsAPI')
# Top-Schlagzeilen der BBC abrufen
headlines = newsapi.get_everything(sources='bbc-news',
language='en',
sort_by='publishedAt')
x = headlines.get('articles')
y = x[0]
# Die längere 'description' der Schlagzeile der Variable prompt zuweisen
print('Ich empfange die neueste BBC-Schlagzeile...')
prompt = y.get('description')
KI Bilder erzeugen
Danach kommt die künstliche Intelligenz ins Spiel. Um etwas Abwechslung ins Spiel zu bringen, bindest du vier verschiedene Stilrichtungen ein (galleries): „Old Style“, Pop Art, Renaissance, Abstrakt. Welcher Stil bei deiner Anfrage zum Einsatz kommt, bestimmst du mit einer Zufallszahl.
Je nachdem, welche Zahl gewürfelt wurde, steuerst du eine andere URL der API an:
# Zufällig eine von vier Stilrichtungen festlegen
randomGallery = random.randint(0,3)
if randomGallery == 0:
galleryURL = 'https://api.deepai.org/api/old-style-generator'
elif randomGallery == 1:
galleryURL = 'https://api.deepai.org/api/pop-art-generator'
elif randomGallery == 2:
galleryURL = 'https://api.deepai.org/api/renaissance-painting-generator'
else:
galleryURL = 'https://api.deepai.org/api/abstract-painting-generator'
print('Ich verwende den Stil von: ' + galleryURL)
r = requests.post(
galleryURL,
data={
'text': prompt,
},
headers={'api-key': 'DEIN API-Key von DeepAI'}
)
url = r.json()
print(url['output_url'])
Wie du im Code oben siehst, dient die Description der BBC-Schlagzeile als prompt, den du in deinem Request an die API übermittelst. Ein mögliches Ergebnis im sogenannten „Old Style“ sieht dann so aus:
DeepAI liefert dir über die API immer eine Collage aus vier quadratischen Bildern zurück. In diesem Python Script schneiden wir das Bild oben links aus und speichern es ab – mit dem Prompt als Dateinamen. Natürlich kannst du es auch unverändert ausschneiden, oder jedes einzelne Quadrat ausschneiden und separat speichern.
# Bild herunterladen
def download_image(url, file_name, headers):
response = requests.get(url, headers=headers)
if response.status_code == 200:
with open(file_name, "wb") as f:
f.write(response.content)
else:
print(response.status_code)
headers = {
"User-Agent": "Chrome/51.0.2704.103",
}
url = url['output_url']
# Dateinamen = Prompt festlegen
file_name = "{}.jpg".format(prompt)
download_image(url, file_name, headers)
# Bild zuschneiden
print('Ich schneide das Bild zu...')
img = Image.open('{}'.format(file_name))
box = (0, 0, 512, 512)
img = img.crop(box)
img.save('{}'.format(file_name))
Zuletzt bleibt nur noch eins: Das neue Bild zu öffnen und zu präsentieren:
img.show()
Das vollständige Python Script
Hier nun das vollständige Script. Vergiss nicht, deine API Keys von NewsAPI und DeepAi einzutragen, bevor du loslegst.
# Copyright 2023, Pollux Labs
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
# documentation files (the "Software"), to deal in the Software without restriction, including without
# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all copies or substantial portions
# of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
# TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
# https://polluxlabs.net/python/so-erzeugst-du-ki-bilder-mit-python-und-deepai/
import requests
import webbrowser
import json
from newsapi import NewsApiClient
from PIL import Image
import os
import sys
import shutil
import random
# NewsAPI
newsapi = NewsApiClient(api_key='DEIN API-Key von NewsAPI')
# Top-Schlagzeilen der BBC abrufen
headlines = newsapi.get_everything(sources='bbc-news',
language='en',
sort_by='publishedAt')
x = headlines.get('articles')
y = x[0]
# Die längere 'description' der Schlagzeile der Variable prompt zuweisen
print('Ich empfange die neueste BBC-Schlagzeile...')
prompt = y.get('description')
# Bild von DeepAI empfangen
# Zufällig eine von vier Stilrichtungen festlegen
randomGallery = random.randint(0,3)
if randomGallery == 0:
galleryURL = 'https://api.deepai.org/api/old-style-generator'
elif randomGallery == 1:
galleryURL = 'https://api.deepai.org/api/pop-art-generator'
elif randomGallery == 2:
galleryURL = 'https://api.deepai.org/api/renaissance-painting-generator'
else:
galleryURL = 'https://api.deepai.org/api/abstract-painting-generator'
print('Ich verwende den Stil von: ' + galleryURL)
r = requests.post(
galleryURL,
data={
'text': prompt,
},
headers={'api-key': 'DEIN API-Key von DeepAI'}
)
url = r.json()
print(url['output_url'])
print('Ich male dein Bild...')
# Bild herunterladen
def download_image(url, file_name, headers):
response = requests.get(url, headers=headers)
if response.status_code == 200:
with open(file_name, "wb") as f:
f.write(response.content)
else:
print(response.status_code)
headers = {
"User-Agent": "Chrome/51.0.2704.103",
}
url = url['output_url']
# Dateinamen = Prompt festlegen
file_name = "{}.jpg".format(prompt)
download_image(url, file_name, headers)
# Bild zuschneiden
print('Ich schneide das Bild zu...')
img = Image.open('{}'.format(file_name))
box = (0, 0, 512, 512)
img = img.crop(box)
img.save('{}'.format(file_name))
# Bild anzeigen
img.show()
Bringe das Projekt in dein Wohnzimmer
Zum Schluss noch eine Idee für ein Raspberry Pi Projekt: Verbinde ein quadratisches Display, z.B. das HyperPixel 4.0 Square, mit deinem Raspberry Pi. Beides kannst du in einen Bilderrahmen stecken und das Python Script automatisch bei jedem Boot laufen lassen.
Damit jedoch nicht immer das gleiche Bild im Bilderrahmen steckt, könntest du noch dafür sorgen, dass es z.B. jede Stunde ausgetauscht wird.
Zusammengebaut könnte das Ganze dann so ausschauen: