이 저장소에는 특정 이미지의 모자이크 아트 버전을 생성하기 위한 코드(및 기타 파일)가 포함되어 있습니다. 이미지(원본 이미지라고 함)가 주어지면 주요 아이디어는 원본 이미지의 (사각형 모양) 패치를 주어진 이미지 세트(타일 이미지 또는 간단히 타일이라고 함)에서 가장 유사한 이미지로 바꾸는 것입니다. .
구현에서는 Keras의 KerasCV 하위 모듈에서 사용할 수 있는 Stable Diffusion 모델을 사용하여 타일을 생성합니다. 모델의 매개변수를 변경하고 다양한 텍스트 프롬프트를 사용하여 생성된 다양한 타일을 사용하여 동일한 이미지의 모자이크 아트를 생성함으로써 무한한 창의성을 허용합니다.
아래 예에서 각 행에는 (원본) 이미지와 이 이미지에서 생성된 두 개의 모자이크 아트 이미지가 표시됩니다. 가장 왼쪽 이미지가 원본 이미지이고, 가운데 이미지가 2,500개의 타일을 사용하여 만든 모자이크 아트이고, 가장 오른쪽의 이미지가 90,000개의 타일을 사용하여 만든 모자이크 아트입니다.
이 저장소에 포함된 주요 파일과 폴더는 다음과 같습니다.
images/tiles
폴더에 넣을 수 있습니다.images/canvases
폴더에 있는 이미지의 모자이크 아트 버전을 생성하기 위한 코드와 타일 이미지를 생성하기 위한 코드가 포함되어 있습니다. 주요 종속성은 TensorFlow/Keras
(버전 2.9 이상), Pillow
및 Scipy
입니다. Pip을 사용하는 경우 다음 명령을 실행하여 설치할 수 있습니다.
pip install -r requirements.txt
또한 코드는 Python 3.9로 작성되었으며 CUDA 11.6이 포함된 NVIDIA RTX 3090 GPU, Keras 2.9(및 KerasCV 0.3.4)가 포함된 Ubuntu 22.04 LTS를 실행하는 컴퓨터에서 테스트되었습니다.
코드를 보려면 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 라이센스에 따라 라이센스가 부여되지 않을 수 있습니다.