Этот репозиторий включает в себя код (и другие файлы) для создания мозаичных версий данного изображения. Учитывая изображение (называемое исходным изображением), основная идея состоит в том, чтобы заменить (квадратные) участки исходного изображения наиболее похожим изображением из заданного набора изображений (называемых мозаичными изображениями или просто плитками). .
Реализация использует модель Stable Diffusion, доступную из подмодуля KerasCV Keras, для создания плиток. Он открывает безграничные возможности для творчества, создавая мозаику из одного и того же изображения, используя разные плитки, созданные путем изменения параметров модели и использования разных текстовых подсказок.
В примерах ниже в каждой строке показано (исходное) изображение и два изображения мозаики, созданные на его основе. Крайнее левое изображение — это исходное изображение, среднее изображение — это мозаика, созданная с использованием 2500 плиток, а самое правое изображение — это мозаика, созданная с использованием 90 000 плиток.
Основные файлы и папки, включенные в этот репозиторий:
images/tiles
.images/canvases
, а также код для создания мозаичных изображений. Основными зависимостями являются TensorFlow/Keras
(по крайней мере версия 2.9), Pillow
и Scipy
. Если вы используете Pip, вы можете установить их, выполнив следующую команду:
pip install -r requirements.txt
Более того, код написан на Python 3.9 и протестирован на компьютере под управлением Ubuntu 22.04 LTS с Keras 2.9 (и KerasCV 0.3.4) на графическом процессоре NVIDIA RTX 3090 с CUDA 11.6.
Откройте Making Mosaic Art с помощью блокнота KerasCV+StableDiffusion, чтобы увидеть код.
Кроме того, вы можете изменять переменные и параметры в основной функции (показанной ниже), чтобы создавать свои собственные версии мозаики данных изображений. Вы можете поместить свои изображения в папку images/canvases
, если хотите создать их мозаичные версии.
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" ))
Запустите функцию main для выполнения кода. Если вы хотите переделать изображения плиток, установите для параметра remake_tiles
значение True
. Обратите внимание, что создание нового набора изображений плиток может занять некоторое время, поэтому вначале рекомендуется использовать текущие изображения плиток, установив для remake_tiles
значение False
.
main ( remake_tiles = False )
Блокнот уже доступен на Kaggle. Открыть его можно по этой ссылке.
- [ ] Использование плиток разной формы вместо квадратов (одного и того же размера). Например, трапеции или треугольники.
- [ ] Использование разных изображений плиток для разных частей исходного изображения. Например, используя набор изображений, содержащих лица, в качестве лиц в исходном изображении и используя набор изображений, содержащих пейзажи, в качестве фона в исходном изображении.
- [ ] Использование лучших показателей сходства для сравнения фрагментов с патчем исходного изображения. Например, используя метрику SSIM вместо евклидова расстояния.
Этот проект лицензируется на условиях лицензии Apache 2.0. Более подробную информацию см. в разделе ЛИЦЕНЗИЯ. Обратите внимание, что файлы изображений в изображениях/холстах были загружены из Интернета и не принадлежат создателю этого репозитория. Следовательно, они не могут лицензироваться по лицензии Apache 2.0.