يتضمن هذا المستودع الكود (والملفات الأخرى) لإنشاء إصدارات فنية من الفسيفساء لصورة معينة. عند إعطاء صورة (يشار إليها باسم الصورة الأصلية)، فإن الفكرة الرئيسية هي استبدال التصحيحات (المربعة الشكل) من الصورة الأصلية بالصورة الأكثر تشابهًا من مجموعة معينة من الصور (يشار إليها باسم صور البلاط أو ببساطة البلاط) .
يستخدم التنفيذ نموذج Stable Diffusion المتوفر من وحدة KerasCV الفرعية في Keras لإنشاء المربعات. فهو يسمح بإبداع لا حدود له من خلال إنشاء فن فسيفساء لنفس الصورة باستخدام مربعات مختلفة تم إنشاؤها عن طريق تغيير معلمات النموذج واستخدام مطالبات نصية مختلفة.
في الأمثلة أدناه، يعرض كل صف صورة (أصلية) وصورتين فنيتين من الفسيفساء تم إنشاؤها منها. الصورة في أقصى اليسار هي الصورة الأصلية، والصورة الوسطى هي فن الفسيفساء الذي تم إنشاؤه باستخدام 2500 بلاطة، والصورة في أقصى اليمين هي فن الفسيفساء الذي تم إنشاؤه باستخدام 90000 بلاطة.
الملفات والمجلدات الرئيسية المضمنة في هذا المستودع هي:
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.
افتح "صنع فن الفسيفساء" باستخدام دفتر ملاحظات 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" ))
قم بتشغيل الوظيفة الرئيسية لتنفيذ التعليمات البرمجية. إذا كنت تريد إعادة تشكيل صور التجانب، فاضبط معلمة remake_tiles
على True
. لاحظ أن إنشاء مجموعة جديدة من صور المربعات قد يستغرق بعض الوقت، لذا يوصى باستخدام صور المربعات الحالية في البداية عن طريق تعيين remake_tiles
على False
.
main ( remake_tiles = False )
دفتر الملاحظات متاح على Kaggle الآن. يمكنك فتحه باستخدام هذا الرابط.
- [ ] استخدام أشكال مختلفة بدلاً من المربعات (من نفس الحجم) للبلاط. على سبيل المثال، شبه منحرف أو مثلثات.
- [ ] استخدام صور متجانبة مختلفة لأجزاء مختلفة من الصورة الأصلية. على سبيل المثال، استخدام مجموعة صور تحتوي على وجوه للوجوه في الصورة الأصلية، واستخدام مجموعة صور تحتوي على مناظر طبيعية للخلفية في الصورة الأصلية.
- [ ] استخدام مقاييس تشابه أفضل لمقارنة المربعات مع رقعة من الصورة الأصلية. على سبيل المثال، استخدام مقياس SSIM بدلاً من المسافة الإقليدية.
تم ترخيص هذا المشروع بموجب شروط ترخيص Apache 2.0. راجع الترخيص لمزيد من التفاصيل. يرجى ملاحظة أن ملفات الصور الموجودة في الصور/اللوحات القماشية تم تنزيلها من الويب وليست مملوكة لمنشئ هذا المستودع. وبالتالي، قد لا يتم ترخيصهم بموجب ترخيص Apache 2.0.