Üretici Yapay Sinir Ağı ile Sanat

Yaptığım resimleri geliştirmek için yeni bir teknik öğrendim. Bu teknik ile çizdiğim bir resim aşağıdaki gibi:

Bu çizim tekniğinin adı Loomis Metodu. Kafa yapısının formunu anlamayı gerektiriyor.

0. Amaç

Karakalem ile pratik yaparken, bir yandan da üretici yapay sinir ağlarını kullaranak bir portre fotoğrafından bu formu çıkarmak istedim ve bir takım araştıramalardan sonra şu iki muhteşem çalışmayı buldum:pix2pix ve cyclegan.

1. pix2pix

pix2pix imaj dönüşümü yapan bir yapay sinir ağı. Bu ağı eğitmek için bire bir eşlenmiş imaj veri seti gerekiyor. Örneğin, bir manzaranın hem gündüz hem de gece çekilmiş fotoğrafı bir ikili olabilir. Ya da bir mekanın siyah beyaz fotoğrafı ile renkli fotoğrafı bir ikili oluşturabilir.

Benim yapmak istediğim şey ise bir portre fotoğrafını bahsettiğim teknik ile çizilmiş bir imaja dönüştürmek.

Bunun için aşağıdaki gibi ikililerden oluşan 100 e yakın bir veri seti oluşturdum.


Peki pix2pix bunu nasıl yapıyor? Bu fikri ilk defa bu blogda okuyorsanız biraz kafa karıştırıcı gelebilir ama olabildiğince yalınlaştırarak şu şekilde açıklamaya çalışabilirim:

Bu mimarinin içinde iki tane yapay sinir ağı var. Biri üretici (generator), diğeri ayrıştırıcı (discriminator).

Üreticinin görevi portre fotoğrafını girdi olarak alıp çizim olarak çıkarmak. Hiç optimize edilmemiş bir yapay sinir ağı öncelikle rassal pikseller çıkaracak. Ama zaman içinde iyilerini üretecek, bir süre sonra bir insan gözünün ayırt edemeyeceği kalitede görseller çıkaracak. (En azından beklentim bu).

Ayrıştırıcının görevi ise üreticinin ürettiği çizimler ile gerçek çizimleri girdi olarak alıp, hangisinin gerçek, hangisinin sahte olduğunu tahmin etmek. Diğer bir ifade ile, bu mimaride ayrıştırıcı sadece ikili bir sınıflandırma yapan yapay sinir ağı olarak yer alıyor (Binary classification). Hiç eğitilmemiş bir ayrıştırıcı ise%50 ihtimal ile hangi çizimlerin gerçek, hangi çizimlerin ise üretici tarafından üretildiğini tahmin edebildiğini bekleyebiliriz.

Bu iki ağı birleştiren şöyle bir amacı var: üreticinin çıkardığı imajlar, ayrıştırıcı tarafından ayırt edilemeyecek kalitede olmalı. Diğer bir deyişle; üretici, ayrıştırıcıyı kandırmaya çalışacak.

1.1 Optimizasyon

Bu modeli optimize etmek, yani portre fotoğrafını, çizime dönüştürebilecek ağın doğru parametrelerini bulmak ciddi bir işlem gücü istiyor. Bir kişisel bilgisayarda yaklaşık bir gün sürebilir. İyi bir grafik kartı ile çok daha hızlı optimize edilebilir. Dolayısıyla ben bu modeli optimize etmek için AWS kullandım, çıkan modeli kendi bilgisayarıma indirerek test ettim.

1.2 Sonuçlar

Sonuçlar mükemmel değil olmasa d çok başarısız da sayılmaz. Daha çok veri ile daha iyi sonuçlar elde edilebileceğini umuyorum.

Bir kaç örnek:

Daha çok veri elde etmek çok zahmetli olduğu için bu modeli geliştirmek için daha fazla çaba göstermedim.

Neyse ki, bire bir eşlenmiş ikili imaj verisi gerektirmeyen başka bir model daha var: CycleGAN.

2. CycleGAN

Bu kez ihtiyacım olan şey, bir grup portre fotoğrafı ve bahsettiğim portre tekniği ile oluşturulmuş bir grup çizim. İkili imaj gerektirmemesi veri oluşturmayı oldukça kolaylaştırıyor.

Peki bu nasıl mümkün olabiliyor? Bu model biraz daha karmaşık ama anlaması imkansız değil.

Öncelikle iki üretici, iki tane de ayrıştırıcı var. Bunun sebebi üreticinin üreteceği imajların, girdi olarak kullanılan imajlarla bir bağlantısının olması. Aksi takdirde ayrıştırıcı direkt olarak hedef imajlara (çizimlere) bakıp onları oluşturmaya çalışıyor. Yani, girdi olarak aldığı fotoğrafa benzemesini önemsemiyor.

Daha iyi izah etmek için şu örneği verebilirim. Kış fotoğrafını yaz fotoğrafına dönüştürmek için bir model geliştirdiğimizi düşünelim. Karlı İstanbul fotoğrafını girdi olarak verip, güneşli Antalya fotoğrafı istemeyiz. Aynı İstanbul'un güneşli fotoğrafını isteriz. Dolayısı ile bir sınırlandırmaya ihtiyacımız var.

Üreticiye şu kısıtlama eklendiğinde girdi ile çıktının arasında bir anlam bulunabiliyor: İkinci bir üretici, ilk üreticinin ürettiği çizimi kullanarak orijinal portre fotoğrafı elde edilmeye çalışılacak. Bunu ikinci bir üretici yapacak ve CycleGAN optimize edilirken bu şart da göz önünde bulundurulacak.

Evet, biraz karmaşık. Çalışma prensibine bu blog postunun konusu değil, dolayısı ile daha fazla detaya girmiyorum.

2.1 Veri Seti

Lisans konusunda sıkıntı yaşamamak için StyleGAN ile üretilmiş insan fotoğraflarını kullandım. Creative Commons lisansı ile paylaşılan bu fotoğraflardan 600 tane seçtim. Verideki çeşitliği azaltmak için yumuşak arka planlı, gülümsemeyen insan fotoğrafları seçtim.

2.3 Sonuçlar

Fotoğrafı çizime dönüştürme konusunda çok kötüydü.

CycleGAN geometrik dönüşüm gibi konularda iyi değil. Renk ve desen konusunda ise gayet iyi.

Makaleye yeniden göz gezdirdim ve bu sonucu desteleyen bir ifade buldum:

On translation tasks that involve color and texture changes, like many of those reported above, the method often succeeds. We have also explored tasks that require geometric changes, with little success.

Test sonuçlarından bir örnek:


Canlı olarak nasıl tahmin ettiğini göstermek için şu vidyoyu oluşturdum:


Son olarak, veri seti içindeki çeşitliliği azaltmak için sonsuz fonda stüdyo ışığı ile çekilmiş fotoğraflarla yeniden optimizasyon yaptım. Biraz daha iyi sonuç verdi. İki örnek:


3. Özet

Bu proje, portre fotoğrafını boyutsal olarak kavramayı gerektiren zor bir işti.

pix2pix bunu yapabiliyor gibi ama çok fazla veri istediği için pek zahmetli bir iş. Hem portrenin hem de çizimin üç boyutlu versiyonlarını oluşturarak pek çok açıdan oluşturulmuş ikili imajlar üretebilirdim ama çok vakit ayırmadım.

CycleGAN için veri oluşturmak kolay ama o da renk ve desen dönüşümü için iyi. Dolayısıyla çizimden fotoğraf elde etme konusunda iyiydi.

Ben yine de hem pix2pix i hem de CycleGAN'ı çok yaratıcı projeler buldum.

Bu blog yazısını zaman içinde güncelleyebilirim. Gözünüze çarpan hatalı bir ifade için lütfen yorum belirtin. Ayrıca pek çok terimi ben daha doğru bulduğum şekilde Türkçe'ye çevirdim. (Örneğin: training için optimizasyon kullanmak gibi) Kulak tırmalayıcı gelen ifadeler varsa kusura bakmayın.

4. Referanslar

  • Loomis, Andrew. (1956). Drawing the Head and Hands. Retrieved from http://books.google.com
  • Quickly Draw Heads with the Loomis Method - Part 1
  • Phillip Isola, Jun-Yan Zhu, Tinghui Zhou, Alexei A. Efros. (2018). Image-to-Image Translation with Conditional Adversarial Networks
  • Jun-Yan Zhu, Taesung Park, Phillip Isola, Alexei A. Efros. (2018). Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
  • stylegan GitHub Repo

  • Deep Learning