Dieses Repository enthält den Code (und andere Dateien) zum Erstellen von Mosaikkunstversionen eines bestimmten Bildes. Bei einem gegebenen Bild (als Originalbild bezeichnet) besteht die Hauptidee darin, (quadratische) Ausschnitte des Originalbilds durch das ähnlichste Bild aus einem bestimmten Satz von Bildern (als Kachelbilder oder einfach Kacheln bezeichnet) zu ersetzen. .
Die Implementierung verwendet das Stable Diffusion-Modell, das im KerasCV-Submodul von Keras verfügbar ist, um die Kacheln zu erstellen. Es ermöglicht grenzenlose Kreativität durch die Erstellung von Mosaikkunstwerken desselben Bildes unter Verwendung verschiedener Kacheln, die durch Ändern der Modellparameter und Verwendung unterschiedlicher Textaufforderungen erstellt wurden.
In den folgenden Beispielen zeigt jede Zeile ein (Original-)Bild und zwei daraus erstellte Mosaikkunstbilder. Das Bild ganz links ist das Originalbild, das mittlere Bild ist die Mosaikkunst, die aus 2.500 Kacheln erstellt wurde, und das Bild ganz rechts ist die Mosaikkunst, die aus 90.000 Kacheln erstellt wurde.
Die wichtigsten in diesem Repository enthaltenen Dateien und Ordner sind:
images/tiles
abzulegen.images/canvases
sowie den Code zum Erstellen der Kachelbilder. Die Hauptabhängigkeiten sind TensorFlow/Keras
(mindestens Version 2.9), Pillow
und Scipy
. Wenn Sie Pip verwenden, können Sie sie installieren, indem Sie den folgenden Befehl ausführen:
pip install -r requirements.txt
Darüber hinaus ist der Code in Python 3.9 geschrieben und wird auf einem Computer mit Ubuntu 22.04 LTS mit Keras 2.9 (und KerasCV 0.3.4) auf einer NVIDIA RTX 3090 GPU mit CUDA 11.6 getestet.
Öffnen Sie das Notizbuch „Mosaikkunst mit KerasCV+StableDiffusion erstellen“, um den Code anzuzeigen.
Darüber hinaus können Sie die Variablen und Parameter in der Hauptfunktion (siehe unten) ändern, um Ihre eigenen Mosaikkunstversionen der angegebenen Bilder zu erstellen. Sie können Ihre Bilder im Ordner images/canvases
ablegen, wenn Sie davon Mosaikkunstversionen erstellen möchten.
def main ( remake_tiles : bool ) -> None :
"""Main function to pack everything together and run it"""
# Extension to use for saving and loading the tile images
tile_file_extension = "jpeg"
# (Re)-make the tile images if the user wants to do so
if remake_tiles :
# Create a MosaicMaker object to make the tile images
image_maker = MosaicMaker ( img_width = 400 , img_height = 400 , jit_compile = False , seed = 33 )
# The text prompts to be used to make the tile images
prompt_seq = (( "A laughing woman" , ( "realistic" , "white background" )),
( "A sad girl" , ( "realistic" , "white background" )),
( "An old man" , ( "realistic" , "white background" )),
( "Face of a sad man" , ( "realistic" , "white background" )),
( "Drawing of rings of Saturn" , ( "abstract" , "white background" )),
( "A watercolor painting of a puppy" , ( "detailed" ,)),
( "Drawing of a red rose" , ( "elegant" , "detailed" , "white background" )),
( "View of a green forest with mountains in the background" , ( "elegant" , "lush" , "nature" )),
( "A painting of four oranges in a bowl" , ( "elegant" , "detailed" , "white background" )),
( "A ninja shuriken" , ( "realistic" , "metal" , "white background" )),)
# Make the tile images and save them
for index , prompt_data in enumerate ( prompt_seq ):
image_seq = image_maker . make_images ( prompt_data [ 0 ], prompt_data [ 1 ], num_images = 40 )
image_maker . save_images ( img_seq = image_seq , path = 'images/tiles' , prefix = f'p { index } ' ,
extension = tile_file_extension )
# Use the images in the images/canvases and images/tiles directories to make mosaic arts
for canvas_image_path in pathlib . Path ( "images/canvases" ). glob ( "*.png" ):
# Create a MosaicArtMaker object with about sqrt_num_tiles*sqrt_num_tiles tiles!
art_maker = MosaicArtMaker ( original_image_path = canvas_image_path , sqrt_num_tiles = 300 ,
tile_file_extension = tile_file_extension )
# Make the mosaic art and save it in the images/outputs directory
output_image = art_maker . make_mosaic_art ( k = 40 )
print ( f"Created a mosaic art version of ' { art_maker . original_image_path } ' using "
f" { art_maker . sqrt_num_tiles * art_maker . sqrt_num_tiles } smaller images created by a Stable Diffusion model" )
art_maker . save_images (( output_image ,), path = 'images/outputs' ,
prefix = f' { art_maker . original_image_name } _mosaic_art' )
# Display each original image and its mosaic art version
art_maker . display_images (( art_maker . original_image , output_image ),
( art_maker . original_image_name , art_maker . original_image_name + "_mosaic_art" ))
Führen Sie die Hauptfunktion aus, um den Code auszuführen. Wenn Sie die Kachelbilder neu erstellen möchten, setzen Sie den Parameter remake_tiles
auf True
. Beachten Sie, dass das Erstellen eines neuen Satzes von Kachelbildern eine Weile dauern kann. Daher wird empfohlen, zu Beginn die aktuellen Kachelbilder zu verwenden, indem Sie remake_tiles
auf False
setzen.
main ( remake_tiles = False )
Das Notebook ist ab sofort bei Kaggle erhältlich. Sie können es über diesen Link öffnen.
- [ ] Verwendung verschiedener Formen anstelle von Quadraten (gleicher Größe) für die Kacheln. Zum Beispiel Trapeze oder Dreiecke.
- [ ] Verwendung verschiedener Kachelbilder für verschiedene Teile des Originalbilds. Verwenden Sie beispielsweise eine Reihe von Bildern mit Gesichtern für die Gesichter im Originalbild und eine Reihe von Bildern mit Landschaften für den Hintergrund im Originalbild.
- [ ] Verwendung besserer Ähnlichkeitsmetriken zum Vergleich der Kacheln mit einem Patch aus dem Originalbild. Verwenden Sie beispielsweise die SSIM-Metrik anstelle der euklidischen Distanz.
Dieses Projekt ist unter den Bedingungen der Apache 2.0-Lizenz lizenziert. Weitere Einzelheiten finden Sie unter LIZENZ. Bitte beachten Sie, dass die Bilddateien in Bildern/Leinwänden aus dem Internet heruntergeladen wurden und nicht Eigentum des Erstellers dieses Repositorys sind. Daher dürfen sie nicht unter der Apache 2.0-Lizenz lizenziert werden.