Garfield
YZF Admin
Görüntü stil aktarımı, bir içerik görüntüsünün nesne ve düzenini korurken başka bir görüntünün renk, doku ve fırça darbesi özelliklerini birleştirir. TensorFlow ile yaygın yöntem, önceden eğitilmiş bir görüntü sınıflandırma ağının ara katmanlarını kullanarak iki kaybı aynı anda azaltmaktır: içerik kaybı içerik görüntüsüne benzerliği, stil kaybı ise stil görüntüsünün dokusal özelliklerini ölçer. Sonuçta ağ yeni bir görüntü üretmez; pikselleri doğrudan optimize ederek seçilen iki görüntünün özelliklerini taşıyan bir çıktı oluşturur.
TensorFlow uygulamasında genellikle VGG19 gibi önceden eğitilmiş bir ağın sınıflandırma katmanları yerine ara özellik katmanları kullanılır. Daha sığ katmanlar kenar, renk ve küçük dokuları; daha derin katmanlar ise nesnelerin genel düzenini temsil eder.
İçerik görüntüsü, örneğin bir şehir fotoğrafıdır. Stil görüntüsü ise bir yağlı boya tablosudur. Ağ, içerik katmanlarında iki görüntünün özellik farkını ölçer. Stil içinse her katmandaki özellik haritalarının birlikte ne kadar etkinleştiğini gösteren Gram matrisi hesaplanır. Gram matrisi, nesnelerin konumundan çok renklerin ve dokuların birlikte görülme biçimini temsil eder.
Optimizasyon sırasında değiştirilen şey ağın ağırlıkları değil, üretilecek görüntünün pikselleridir. Bu ayrım önemlidir: Stil aktarımı modeli yeniden eğitmekten ziyade, sabit bir ağın ölçtüğü kayıpları azaltan bir görüntü arama işlemidir.
Toplam kayıp genellikle şu biçimde düşünülür:
İçerik ağırlığını artırırsanız özgün fotoğrafın şekilleri ve yerleşimi daha fazla korunur. Stil ağırlığını artırırsanız renk paleti, doku ve fırça etkisi güçlenir; ancak nesnelerin görünümü içerik görüntüsünden daha fazla uzaklaşabilir. Bu nedenle tek bir “doğru” stil aktarımı sonucu yoktur; sonuç, katman seçimine, ağırlıklara, başlangıç görüntüsüne ve optimizasyon adım sayısına bağlıdır.
Örneğin içerik görüntüsünde bir kedi, stil görüntüsünde ise yoğun mavi ve sarı fırça dokuları varsa başarılı bir aktarımda kedinin genel silueti ve konumu korunurken yüzeydeki renk dağılımı ve doku stil görüntüsüne yaklaşır. Bu işlem kediyi tanıyan yeni bir model oluşturmaz ve görüntüdeki nesnelerin gerçeğe uygunluğunu garanti etmez.
Uygulama için Python, TensorFlow ve görüntü işleme yardımcıları gerekir. Kodda kullanılan önceden eğitilmiş ağ ağırlıkları ilk çalıştırmada indirilebilir; bu nedenle çevrim dışı ortamda ağırlık dosyalarının önceden hazır bulunması gerekir.
Aşağıdaki örnek, işlem sırasını gösteren bir iskelettir; görüntü yükleme ve özellik çıkarıcıların kurulumu ayrıca yapılmalıdır.
Gerçek uygulamada
Sonuç görüntüsü sürekli aşırı gürültülü kalıyorsa stil kaybı fazla baskın olabilir, öğrenme oranı yüksek olabilir veya stil katmanları uygun seçilmemiş olabilir. İçerik neredeyse tamamen kayboluyorsa içerik ağırlığını artırmak ya da stil ağırlığını azaltmak gerekir. Çıktı fazla bulanıksa daha fazla optimizasyon adımı tek başına yeterli olmayabilir; seçilen özellik katmanlarının ve görüntü ön işleme adımlarının da tutarlı olması gerekir.
Aynı görüntüler ve aynı ağ kullanılsa bile ağırlıkların değiştirilmesi farklı sonuçlar üretir. Karar verirken şu ayrım kullanılabilir:
Tablo yalnızca genel eğilimi gösterir; sonuç, görüntü boyutuna, seçilen katmanlara ve ön işleme yöntemine göre değişebilir. Bu nedenle tek bir ayarı bütün fotoğraflar için doğru kabul etmek yerine birkaç ağırlık oranını aynı içerik ve stil çifti üzerinde karşılaştırmak daha güvenlidir.
İyi bir sonuçta içerik görüntüsündeki ana şekiller seçilebilir kalır, stil görüntüsünün renk ve doku ilişkileri ise çıktı boyunca tutarlı biçimde görülür. Kayıpların azalması tek başına görüntünün sanatsal olarak başarılı olduğunu kanıtlamaz; görsel görünüm de kaybın ölçüldüğünü veya azaldığını kanıtlamaz. Bir çıktı teknik olarak düşük kayıplı olsa bile insan gözüne yapay, bulanık veya aşırı gürültülü görünebilir.
İlk denemede içerik görüntüsüyle başlamak, orta boyutlu görseller kullanmak ve içerik ile stil kayıplarını ayrı ayrı izlemek daha anlaşılır sonuç verir. Stil aktarımı beklenenden farklıysa önce görüntülerin aynı normalleştirme aralığında işlendiğini, ardından içerik ve stil katmanlarının gerçekten beklenen özellikleri ürettiğini kontrol edin. Sorun devam ederse ağırlıkları ve öğrenme oranını tek tek değiştirin; aynı anda birçok ayarı değiştirmek hangi değişikliğin sonucu etkilediğini belirsizleştirir.
Yöntemin temel işleyişi
TensorFlow uygulamasında genellikle VGG19 gibi önceden eğitilmiş bir ağın sınıflandırma katmanları yerine ara özellik katmanları kullanılır. Daha sığ katmanlar kenar, renk ve küçük dokuları; daha derin katmanlar ise nesnelerin genel düzenini temsil eder.
İçerik görüntüsü, örneğin bir şehir fotoğrafıdır. Stil görüntüsü ise bir yağlı boya tablosudur. Ağ, içerik katmanlarında iki görüntünün özellik farkını ölçer. Stil içinse her katmandaki özellik haritalarının birlikte ne kadar etkinleştiğini gösteren Gram matrisi hesaplanır. Gram matrisi, nesnelerin konumundan çok renklerin ve dokuların birlikte görülme biçimini temsil eder.
Optimizasyon sırasında değiştirilen şey ağın ağırlıkları değil, üretilecek görüntünün pikselleridir. Bu ayrım önemlidir: Stil aktarımı modeli yeniden eğitmekten ziyade, sabit bir ağın ölçtüğü kayıpları azaltan bir görüntü arama işlemidir.
İçerik ve stil kaybı nasıl birleşir?
Toplam kayıp genellikle şu biçimde düşünülür:
toplam_kayıp = içerik_ağırlığı × içerik_kaybı + stil_ağırlığı × stil_kaybıİçerik ağırlığını artırırsanız özgün fotoğrafın şekilleri ve yerleşimi daha fazla korunur. Stil ağırlığını artırırsanız renk paleti, doku ve fırça etkisi güçlenir; ancak nesnelerin görünümü içerik görüntüsünden daha fazla uzaklaşabilir. Bu nedenle tek bir “doğru” stil aktarımı sonucu yoktur; sonuç, katman seçimine, ağırlıklara, başlangıç görüntüsüne ve optimizasyon adım sayısına bağlıdır.
Örneğin içerik görüntüsünde bir kedi, stil görüntüsünde ise yoğun mavi ve sarı fırça dokuları varsa başarılı bir aktarımda kedinin genel silueti ve konumu korunurken yüzeydeki renk dağılımı ve doku stil görüntüsüne yaklaşır. Bu işlem kediyi tanıyan yeni bir model oluşturmaz ve görüntüdeki nesnelerin gerçeğe uygunluğunu garanti etmez.
TensorFlow'da en küçük uygulama mantığı
Uygulama için Python, TensorFlow ve görüntü işleme yardımcıları gerekir. Kodda kullanılan önceden eğitilmiş ağ ağırlıkları ilk çalıştırmada indirilebilir; bu nedenle çevrim dışı ortamda ağırlık dosyalarının önceden hazır bulunması gerekir.
Aşağıdaki örnek, işlem sırasını gösteren bir iskelettir; görüntü yükleme ve özellik çıkarıcıların kurulumu ayrıca yapılmalıdır.
content_image tek görüntülü, (1, yükseklik, genişlik, 3) biçiminde ve 0–1 aralığında RGB tensörüdür. content_model seçilen tek içerik katmanının tensörünü, style_model ise seçilen stil katmanlarının Gram matrislerinden oluşan listeyi döndürmelidir. content_features ve style_features ilgili hedef tensör ve hedef Gram matrisleridir; ham stil özellikleri doğrudan karşılaştırılmaz. Her iki özellik çıkarıcı VGG19’a aynı uygun ön işlemi uygulamalı ve ağın ağırlıkları sabit tutulmalıdır:
Python:
import tensorflow as tf
# Üretilecek görüntü, içerik görüntüsünün kopyasıyla başlatılır.
image = tf.Variable(content_image, dtype=tf.float32)
optimizer = tf.keras.optimizers.Adam(learning_rate=0.02)
for step in range(1000):
with tf.GradientTape() as tape:
current_content = content_model(image)
current_style = style_model(image)
content_loss = tf.reduce_mean(
tf.square(current_content - content_features)
)
style_loss = tf.add_n([
tf.reduce_mean(tf.square(a - b))
for a, b in zip(current_style, style_features)
])
total_loss = (
content_weight * content_loss
+ style_weight * style_loss
)
gradients = tape.gradient(total_loss, image)
optimizer.apply_gradients([(gradients, image)])
# Piksel değerlerini geçerli görüntü aralığında tut.
image.assign(tf.clip_by_value(image, 0.0, 1.0))
Gerçek uygulamada
content_model içerik katmanlarının, style_model ise Gram matrisleri hesaplanan stil katmanlarının çıktısını üretir. content_features ve style_features bir kez hesaplanıp sabit tutulur. Her döngüde yalnızca image güncellenir.Sonuç görüntüsü sürekli aşırı gürültülü kalıyorsa stil kaybı fazla baskın olabilir, öğrenme oranı yüksek olabilir veya stil katmanları uygun seçilmemiş olabilir. İçerik neredeyse tamamen kayboluyorsa içerik ağırlığını artırmak ya da stil ağırlığını azaltmak gerekir. Çıktı fazla bulanıksa daha fazla optimizasyon adımı tek başına yeterli olmayabilir; seçilen özellik katmanlarının ve görüntü ön işleme adımlarının da tutarlı olması gerekir.
Ağırlıklar sonucu nasıl değiştirir?
Aynı görüntüler ve aynı ağ kullanılsa bile ağırlıkların değiştirilmesi farklı sonuçlar üretir. Karar verirken şu ayrım kullanılabilir:
| Tercih | Görüntüde beklenen etki | Sorun görülürse |
|---|---|---|
| Yüksek içerik ağırlığı | Nesne biçimi ve yerleşimi daha iyi korunur | Stil dokusu zayıf kalıyorsa stil ağırlığını artırın |
| Yüksek stil ağırlığı | Renk ve doku etkisi güçlenir | İçerik bozuluyorsa içerik ağırlığını artırın |
| Başlangıç görüntüsü olarak içerik resmi | Sonuç genellikle özgün fotoğrafa daha yakın olur | Değişim azsa optimizasyon adımı ve stil etkisini kontrol edin |
| Başlangıç görüntüsü olarak rastgele gürültü | Stil etkisi daha baskın ve yapı daha serbest olabilir | Nesne yapısı kayboluyorsa içerik kaybını güçlendirin |
Sonucu nasıl değerlendirmelisiniz?
İyi bir sonuçta içerik görüntüsündeki ana şekiller seçilebilir kalır, stil görüntüsünün renk ve doku ilişkileri ise çıktı boyunca tutarlı biçimde görülür. Kayıpların azalması tek başına görüntünün sanatsal olarak başarılı olduğunu kanıtlamaz; görsel görünüm de kaybın ölçüldüğünü veya azaldığını kanıtlamaz. Bir çıktı teknik olarak düşük kayıplı olsa bile insan gözüne yapay, bulanık veya aşırı gürültülü görünebilir.
İlk denemede içerik görüntüsüyle başlamak, orta boyutlu görseller kullanmak ve içerik ile stil kayıplarını ayrı ayrı izlemek daha anlaşılır sonuç verir. Stil aktarımı beklenenden farklıysa önce görüntülerin aynı normalleştirme aralığında işlendiğini, ardından içerik ve stil katmanlarının gerçekten beklenen özellikleri ürettiğini kontrol edin. Sorun devam ederse ağırlıkları ve öğrenme oranını tek tek değiştirin; aynı anda birçok ayarı değiştirmek hangi değişikliğin sonucu etkilediğini belirsizleştirir.
Son düzenleme: