Ce référentiel comprend le code (et d'autres fichiers) permettant de créer des versions artistiques en mosaïque d'une image donnée. Étant donné une image (appelée image d'origine), l'idée principale est de remplacer les zones (de forme carrée) de l'image d'origine par l'image la plus similaire à partir d'un ensemble d'images donné (appelées images de tuiles ou simplement tuiles). .
L'implémentation utilise le modèle de diffusion stable disponible dans le sous-module KerasCV de Keras pour créer les tuiles. Il permet une créativité illimitée en créant une mosaïque de la même image en utilisant différentes tuiles créées en modifiant les paramètres du modèle et en utilisant différentes invites de texte.
Dans les exemples ci-dessous, chaque ligne montre une image (originale) et deux images d'art en mosaïque créées à partir de celle-ci. L'image la plus à gauche est l'image originale, celle du milieu est l'art de la mosaïque créé à l'aide de 2 500 carreaux, et l'image la plus à droite est l'art de la mosaïque créé à l'aide de 90 000 carreaux.
Les principaux fichiers et dossiers inclus dans ce référentiel sont :
images/tiles
.images/canvases
ainsi que le code pour créer les images de tuiles. Les principales dépendances sont TensorFlow/Keras
(au moins la version 2.9), Pillow
et Scipy
. Si vous utilisez Pip, vous pouvez les installer en exécutant la commande suivante :
pip install -r requirements.txt
De plus, le code est écrit en Python 3.9 et est testé sur un ordinateur exécutant Ubuntu 22.04 LTS avec Keras 2.9 (et KerasCV 0.3.4) sur un GPU NVIDIA RTX 3090 avec CUDA 11.6.
Ouvrez Making Mosaic Art à l’aide du bloc-notes KerasCV + StableDiffusion pour voir le code.
De plus, vous pouvez modifier les variables et les paramètres dans la fonction principale (illustré ci-dessous) pour créer vos propres versions artistiques en mosaïque des images données. Vous pouvez placer vos images dans le dossier images/canvases
si vous souhaitez en créer des versions artistiques en mosaïque.
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" ))
Exécutez la fonction principale pour exécuter le code. Si vous souhaitez recréer les images de tuiles, définissez le paramètre remake_tiles
sur True
. Notez que la création d'un nouvel ensemble d'images de tuiles peut prendre un certain temps, il est donc recommandé d'utiliser les images de tuiles actuelles au début en définissant remake_tiles
sur False
.
main ( remake_tiles = False )
Le cahier est maintenant disponible sur Kaggle. Vous pouvez l'ouvrir en utilisant ce lien.
- [ ] Utiliser des formes différentes au lieu de carrés (de même taille) pour les carreaux. Par exemple, des trapèzes ou des triangles.
- [ ] Utilisation de différentes images de tuiles pour différentes parties de l'image originale. Par exemple, utiliser un ensemble d'images contenant des visages pour les visages de l'image d'origine et utiliser un ensemble d'images contenant des paysages pour l'arrière-plan de l'image d'origine.
- [ ] Utilisation de meilleures métriques de similarité pour comparer les tuiles avec un patch de l'image originale. Par exemple, en utilisant la métrique SSIM au lieu de la distance euclidienne.
Ce projet est sous licence selon les termes de la licence Apache 2.0. Voir LICENCE pour plus de détails. Veuillez noter que les fichiers image dans les images/toiles ont été téléchargés à partir du Web et n'appartiennent pas au créateur de ce référentiel. Par conséquent, ils ne peuvent pas être sous licence Apache 2.0.