该存储库包含用于创建给定图像的马赛克艺术版本的代码(和其他文件)。给定一个图像(称为原始图像),主要思想是将原始图像的(方形)补丁替换为给定图像集中最相似的图像(称为图块图像或简称为图块) 。
该实现使用 Keras 的 KerasCV 子模块提供的稳定扩散模型来创建图块。它通过使用通过更改模型参数和不同文本提示创建的不同图块来创建同一图像的马赛克艺术,从而实现无限的创造力。
在下面的示例中,每行显示一个(原始)图像和两个根据该图像创建的马赛克艺术图像。最左边的图像是原始图像,中间的图像是使用 2,500 个瓷砖创建的马赛克艺术,最右边的图像是使用 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 GPU 和 CUDA 11.6 的计算机上进行了测试。
打开使用 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 许可证的许可。