このリポジトリには、特定の画像のモザイク アート バージョンを作成するためのコード (およびその他のファイル) が含まれています。画像 (元の画像と呼ばれます) が与えられた場合、主なアイデアは、元の画像の (正方形の) パッチを、指定された画像セット (タイル画像または単にタイルと呼ばれます) からの最も類似した画像に置き換えることです。 。
この実装では、Keras の KerasCV サブモジュールから利用可能な安定拡散モデルを使用してタイルを作成します。モデルのパラメータを変更し、異なるテキスト プロンプトを使用して作成された異なるタイルを使用して、同じ画像のモザイク アートを作成することで、無限の創造性を実現できます。
以下の例では、各行に 1 つの (元の) 画像と、そこから作成された 2 つのモザイク アート イメージが表示されます。一番左の画像がオリジナル画像、中央の画像が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 を実行するコンピューターでテストされています。
「Making Mosaic Art using KerasCV+StableDiffusion」ノートブックを開いてコードを確認します。
さらに、main 関数 (以下を参照) の変数とパラメーターを変更して、指定された画像の独自のモザイク アート バージョンを作成できます。モザイク アート バージョンを作成したい場合は、画像を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 ライセンスの条件に基づいてライセンスされています。詳細については、「ライセンス」を参照してください。画像/キャンバス内の画像ファイルは Web からダウンロードされたものであり、このリポジトリの作成者が所有するものではないことに注意してください。したがって、Apache 2.0 ライセンスに基づいてライセンスが付与されない可能性があります。