Bu projeyi 5-6 ay önce bir boş vaktimde kurcalamıştım. Yazmaya ancak fırsat buluyorum.
Spectrum ZX ekranda her 8x8 piksellik blok için 15 renklik sabit bir paletten sadece 2 renk seçebiliyor. Gerçek renkli bir resmi bu moda çevirebilmek için dithering vb gibi teknikler kullanılıyor. Ben böyle bir çevrimin deep learning teknikleriyle otomatik olarak yapılıp yapılamayacağına bir baktım.
Deep learning için bol miktarda örnek gerekiyor. Bu konuda ZXart.ee çok faydalı bir kaynak, bir sürü ZX imajı var (SCR formatında) ve en önemlisi çoğu imajın orijinal renkli resmi de png/jpg olarak eklenmiş.
Yapmak istediğim şey basit bit 8x8 -> 8x8 mapping değildi, resmin tamamının işlenmesini istiyordum. Ayrıca ZXart resimleri bire bire çevrimler değildi, objelerin yerleri, bazen şekilleri arasında ufak farklar vardı.
Bu konuda en başarılı model CycleGAN oldu. Burada iki farklı resim ortamından öbürüne çeviren iki adet neural network var. İki diğer network de bunların çıktılarının hedef ortama ait olup olmadığına dair bir sonuç üretiyor. Bu kontrol networklerini her ortamın doğal imajları ile train ediyoruz. Çevrim networkleri de kontrol networklerinin çıktısı yanında bir ortamdan diğerine, sonra da önceki ortama geri çevrimin orijinal imajı ne kadar bozduğu oranı ile train ediliyor. İki ortamın resimlerinin eşleştirilmesine gerek yok, dolayısıyla elde farklı sayılarda imajlar olsa da sonuç başarılı oluyor.
Özellikle resimleri bir stilden diğerine çevirmek konusunda çok başarılı. Orijinal makalede resimlerdeki atları zebralara çevirmek için kullanılıyordu.
Kodlar
https://github.com/meduketto/retrogfx adresinde bulunabilir. Model dosyaları çeyrek GB boyutunda olduğu için koymadım. fetchzxartee.py scriptiyle resimleri çektikten sonra, standart bir Jupyter+keras+tensorflow ile notebook'u açıp deneyebilirsiniz. Minimum 1040 4GB GPU şart.
Bazı örnekler:
Windows arkaplanı -> Spectrum -> Geriye (RGB) çevrim
Görüldüğü gibi Spectrum versiyonu hatasız değil, tam bir SCR olması için son bir filtreden geçirmek gerekli.
Ama asıl ilginç olan Spectrum'dan RGB oluşturmak. Şu örnek Dizzy oyunundan bir kareyi RGB resme çeviriyor:
Dizzy orijinal:
Dizzy renklendirilmiş:
CycleGAN network leri çok büyük oluyor, o yüzden elimdeki HW ideal sonuç için yeterli olmadı. Öğrenme parametreleri üzerinde oynayarak çok daha iyi sonuçlar alınabilir.
Düşünürseniz, 4GB ram + kim bilir kaç yüz tane çekirdekli bir GPU ile ZX gibi bir makineye resim oluşturmak çok ironik bir durum
Öbür yönde çevrimin faydalı uygulamaları olabilir, bir emulatore display driver olarak mesela.