Güzel fotoğraflar üretmek için sinirsel stil aktarımı kullanın, bir sonraki Van Gogh sizsiniz!

Tam metin 3318 kelime ve beklenen öğrenme süresi 12 dakikadır.

Kaynak: unsplash

Sinir tarzı transfer iyidir, herkes Van Gogh olabilir ama aslında bu teknik bir iştir. Nöral stil aktarımı NST'nin kavramsal olarak anlaşılması kolay olsa da, yüksek kaliteli resimler oluşturmak kolay değildir. İyi sonuçlar elde etmek için karmaşık detayların ve gizli tekniklerin birçoğunun doğru bir şekilde uygulanması gerekir.

Bu makale sinirsel stil aktarımının ilkelerini inceleyecek ve bu teknikleri ayrıntılı olarak tartışacaktır.

NST'nin tanıtımı burada tekrar edilmeyecek, resmi PyTorch eğitimiyle NST hakkında bilgi edinebilirsiniz. Bununla birlikte, diğer giriş makaleleri gibi, uygulama sonuçları nispeten sıradan (aşağıda gösterildiği gibi). Yazar, geçişin kalitesini artırabilecek bir kodlama öğreticisi gösterecek, ancak bazı konunun dışına çıkmama izin verin.

(Yukarıdaki görüntü, iki farklı yöntemle elde edilen sinir stili aktarım kalitesinin bir karşılaştırmasıdır. Sol üst görüntü, içeriğiyle eşleşen görüntüdür. Sol alt görüntü, tarzına uygun görüntüdür. Ortadaki görüntü, PyTorch eğiticisi tarafından uygulanan aktarım sonucudur ve sağdaki görüntü Bu makalede açıklanan adımlarla elde edilen geçiş sonucu. Açıkçası, sağ görüntünün görsel kalitesi daha yüksek ve sol üst görüntünün stiline daha sadık.)

S: Gram matrisi neden stili ölçebilir?

Gatys ve diğerlerinin makaleleri (nöral stil aktarımını tanıtan) çoğunlukla basit ve anlaşılması kolaydır. Ancak şu soruyu cevaplamadılar: Stili (yani dokuyu) ifade etmek için neden Gram matrisi kullanılıyor?

Üst katmanda, Gram matrisi aynı katmandaki farklı özellik haritaları arasındaki korelasyonu ölçebilir. Özellik haritası, evrişimli katmanın etkinleştirilmesinden sonraki çıktıdır. Örneğin, bir evrişimli katmanda 64 filtre varsa, 64 özellik haritası üretilecektir. Gram matrisi, piksellerin tam konumunu dikkate almak zorunda kalmadan bir katmandaki farklı özellik haritaları arasındaki korelasyonu (benzerliği) ölçebilir.

Gram matrisinin neden dokuyu ölçebildiğini açıklığa kavuşturmak için, biri mavi şeyleri tespit etmek ve diğeri spiralleri tespit etmek için iki filtre olduğunu varsayalım. Bu iki filtre, iki filtrelenmiş görüntü oluşturmak için giriş görüntüsüne uygulanır ve bunların korelasyonları ölçülür. Filtrelenmiş iki görüntü yüksek oranda korelasyonluysa, temel olarak görüntüdeki tüm spirallerin mavi olduğu belirlenebilir. Bu, görüntü dokusunun kırmızı, yeşil veya sarı spiraller yerine mavi spirallerden oluştuğu anlamına gelir.

Kaynak: unsplash

Bu açıklama yazarı hala şaşırtsa da, Gram matrisinin stili ölçme yeteneği, doku sentezi topluluğu tarafından tanınan bir gerçek gibi görünüyor. Ayrıca Gram tarafından elde edilen sonuçların gerçekten etkileyici olduğu da inkar edilemez.

PyTorch yürütmesini düzeltin

Geçişin kalitesini iyileştirmenin ilk adımı, PyTorch öğretici uygulamasını düzeltmektir. Bu öğreticinin içeriği Gatys ve diğerleri tarafından yazılan makaleye sadık kalmaya çalışmaktadır, ancak bazı ayrıntılar atlanmıştır. Bir yandan, makalenin yazarları MaxPool2d'yi AvgPool2d ile değiştirdi çünkü AvgPool2d'nin daha yüksek kaliteli sonuçlar üretebileceğini gördüler.

Diğer bir ayrıntı, bu öğreticinin ReLu etkinleştirme işlevi yerine evrişim çıktısının İçerik Kaybını (içerik kaybı) ve Stil Kaybını (stil kaybı) hesaplamasıdır. Bu biraz sinir bozucu, çünkü yazar deneyde evrişim ve ReLu kullanmak arasında büyük bir fark gözlemlemedi.

VGG19 ağı ve katmanları

Bu eğitim ile makale arasındaki en büyük fark, sırasıyla ContentLoss ve StyleLoss için "yanlış" katmanı kullanmasıdır. Yazarın hata kelimesine tırnak işareti koymasının nedeni, katman seçiminin daha öznel olması ve büyük ölçüde favori stile bağlı olmasıdır.

Başka bir deyişle, karar vermeye rehberlik etmek için bazı pratik kurallar kullanılabilir. İçerik benzerliğini ölçerken, content_img ve input_img arasında mükemmel bir piksel eşleşmesi varsa, alt katmanlar en yüksek düzeyde aktivasyona sahip olma eğilimindedir. Ağ ne kadar derin olursa, katman eşleşmenin doğru olup olmadığı ile o kadar az ilgilenir, aksine özellik doğru konumda olduğunda katman yüksek oranda etkinleştirilir.

Her katmanın içeriğini görsel olarak görüntülemek için style_weight = 0 ayarlayabilir, content_layer olarak farklı katmanlar kullanabilir ve rastgele input_img temelinde eğitim sürecini çalıştırabilirsiniz.

VGG19 ağının her katmanının yanıt içeriği görselleştirilir. Resim sağa doğru ne kadar ileri giderse, ağdaki katmanın konumu o kadar derin olur.

İşlem, içerik katmanı olarak katman 4 evrişimi kullanır. Yukarıdaki şekilde gösterildiği gibi, katman sayısı içerik için çok düşük olabilir, çünkü bu derinlikteki ağ hala piksel eşleşmesinin doğruluğuyla ilgilenmektedir. Gatys ve diğerleri, conv2_2 yerine conv4_2 kullandı çünkü conv4_2, tek bir pikselden ziyade genel özellik dağıtımıyla daha fazla ilgilenir.

Stil için, daha düşük katmanlar daha küçük tekrarlayan özellikleri yakalar ve daha yüksek katmanlar daha soyut genel özellikleri yakalar. Bu nedenle, genel style_img stilini (düşük seviyeli ayrıntılardan genel desenlere) taşımak için, ağdaki tüm derinlik katmanları dahil edilmelidir.

Bu eğitici ilk 5 evrişimli katmanı kullanır, ancak ağdaki konumları genel özellikleri yakalamak için çok düşüktür. Gaty ve diğerleri, tüm ağ sisteminde iyi bir katman dağıtımı oluşturmak için conv1_1, conv2_1, conv3_1, conv4_1 ve conv5_1'i kullandı. Her katman için en iyileştirilecek stili görselleştirmek için içerik katmanıyla aynı yöntemi kullanabilirsiniz.

Bunu başarmak için, content_weight = 0 olarak ayarlayın, kullanmak istediğiniz stil katmanlarını belirtin ve ardından rastgele input_img temelinde eğitim sürecini çalıştırın.

PyTorch eğitiminde (solda) seçilen katman oluşturma stili; Gatys ve diğerleri tarafından makalede seçilen katman oluşturma stili (sağda)

Beklendiği gibi, eğitimde seçilen seviye için optimize edilmiş stil, düşük seviyeli tekrarlayan özellikleri yakalar, ancak yüksek seviyeli genel özellikleri yakalayamaz.

Taşıma kalitesini iyileştirin

Şimdiye kadar, elde ettiğimiz restorasyonun kalitesi, Gatys ve diğerleri tarafından makalede görülen kaliteye oldukça yakın olmalıdır. Şimdi daha ileri gidip daha iyi görüntüler oluşturmak için aşağıdaki önlemleri alacağız.

Makalede yaptığım ilk değişiklik, optimizasyon programını L-BFGS'den Adam'a dönüştürmekti. Makale, L-BFGS'nin daha kaliteli göç üretebileceğini belirtti.

Ancak yazar, deneyde ikisinin etkilerinde herhangi bir fark bulamadı.Ayrıca, Adam'ın kararlılığı, özellikle çok sayıda adım çalıştırırken veya çok büyük bir stil_ağırlığı olduğunda daha iyi görünüyor. Bu durumlarda, L-BFGS, muhtemelen gradyan patlaması nedeniyle bir hata bildirebilir (yazar bunu derinlemesine incelememiştir).

Kaynak: unsplash

Diğer bir küçük ayarlama, mse_loss'u (yani L2loss) l1_loss'a dönüştürmektir. Stil aktarımı için L2_loss'un herhangi bir faydasını düşünemiyorum (0'da farklılaşabilirliği dışında), çünkü kare değeri aykırı değerlere ciddi şekilde müdahale edecek.

Önceki bölümde bahsedildiği gibi, piksel eşleştirmesinin doğruluğunu önemsemiyoruz ve oluşturulan görüntüde bazı aykırı değerleri tolere edebiliriz. Aslında stil özellikleri ve içerik özellikleri karıştırıldığında aykırı değerler görsel efekti daha iyi hale getirebilir. Son olarak, Özellik Görselleştirme'nin (ilgili konularla iletişim kurulduğunda okunması gereken bir makale) yazarı, benzer nedenlerle görevinde l1_loss kullanmış olabilir.

Aslında, yüksek kaliteli özellik görselleştirme (FV) oluşturmak için kullanılan tekniklerin çoğu, zarif bir şekilde sinir stili aktarımına geçiş yapar.

FV ve NST, kavram olarak çok benzer, yalnızca input_img oluşturma biçiminde farklıdır. NST'de optimizasyondan sonra input_img, content_img ve style_img ile aynı şekilde ağdaki farklı katmanları etkinleştirebilir. FV, content_img veya style_img kullanmaz, ancak farklı katmanlardaki nöronların uyarılmasını en üst düzeye çıkarmak için input_img üretir.

Aktif veri geliştirme, oluşturulan görüntünün sağ üst köşesinde döndürme kusurlarına neden olur

Yazar, FV'den input_img üzerinde veri geliştirmeyi kullanmak için küçük bir numara ödünç aldı. Bu, normal bir sınıflandırma görevinin çalışma prensibi ile tamamen aynıdır: input_img her adımda geliştirilmelidir (döndürme, kırpma, ölçekleme vb.) Ve ardından model çalıştırılır ve kayıp hesaplanır.

Her geliştirme adımında, input_img'yi küçük rahatsızlıklara karşı sağlam özellikler oluşturmaya zorlarız. Bu özellikler daha az yüksek frekanslı yapı içermeli ve görsel olarak daha çekici olmalıdır. Ancak, Özellik Görselleştirme makalesinde kullanılan geliştirmelerin çok büyük olduğunu ve uygun şekilde küçültülmesi gerektiğini buldum. Öyle olsa bile, oluşturulan görüntünün (yukarıda) kenarlarında hala bazı döndürme kusurları vardır. Bu kusurları ortadan kaldırmanın en kolay yolu, kenardaki bazı pikselleri kesmektir.

Yaptığım son değişiklik, Gatys ve diğerleri tarafından kullanılan conv4_2 yerine content_layer'ı conv3_2'ye dönüştürmekti. Okuduğum makalelerin çoğunun da conv4_2 kullanması öneriliyor, ancak conv4_2 kullanımının bazı ayrıntıları göz ardı edeceğini ve oluşturulan görüntünün stilinin içeriği kapsayacağını öğrendim.

Öte yandan, conv3_2 bu ayrıntıları piksel mükemmelliği için aşırı bir ceza olmadan koruyabilir.

Daha fazla kalite iyileştirme

Şimdi yazarın nöral stil transfer kodunda uygulanan tüm teknikleri tartıştım. Orijinal PyTorch eğitimine dayanarak, taşıma kalitesi büyük ölçüde iyileştirildi. Ek olarak, content_weight ve style_weight, belirli görüntü seçimlerine göre daha sağlamdır.

Örneğin yazar, PyTorch öğreticisi doğru şekilde ayarlanmadıysa, bir görüntü kümesinin stil_ağırlığının başka bir görüntü kümesine kolayca aktarılmasının zor olduğunu buldu.

Diğer bir deyişle, oluşturulan görüntüdeki yüksek frekanslı gürültünün giderilmesi daha iyi sonuçlar sağlayabilir. "Differentiable Image Parameterization" (Farklılaştırılabilir Görüntü Parametrelendirme, ilgili konularla iletişime geçildiğinde okunması gereken başka bir makale) makalesi çok ilginç bir yöntem önermektedir.

Kaynak: unsplash

Bu makalede, yazar ilk olarak input_img'yi (gürültü) piksel alanı yerine (gürültüyü azaltarak) Fourier uzayında parametreleştirir. İnput_img gradyan iniş yöntemi tarafından oluşturulduğundan, girdinin ilintisizliği bir ön koşullandırıcıya eşdeğerdir ve minimum değer, optimizasyonu kolaylaştıran gradyan iniş yöntemi ile daha hızlı bulunabilir (denetimli öğrenme görevlerinde ilgili özelliklerin kaldırılmasına benzer). İlişkilendirme alanında bulunan daha geniş ve daha sağlam minimumlar gibi benzer kısa açıklamaların yanı sıra, bunun neden göçün kalitesini iyileştirdiğini bilmiyorum.

Daha basit bir yöntem, yüksek frekanslı gürültüyü doğrudan veya dolaylı cezalandırma yoluyla bastırmaktır. Optimizasyon nesnesine input_img'nin toplam varyasyon kaybını ekleyerek doğrudan ceza elde edilebilir. Tersine, her gradyan iniş adımından sonra input_img'yi bulanıklaştırarak veya input_img'ye gürültü uygulamadan önce gradyanı bulanıklaştırarak dolaylı ceza elde edilebilir.

Bu iki yöntemle ilgili sorun, bunların gerçek yüksek frekans özelliklerini de olumsuz etkilemesidir. Eğitim sırasında toplam değişim kaybını veya bulanıklık miktarını azaltarak belirli bir iyileştirme yapılabilir.

Kaynak: unsplash

Yazarın ilk hedefi, medya görüntüsü görüntüleri oluşturmak için makine öğrenimini kullanmaktır. Fakat tekrarlanan deneylerde, yanlışlıkla bazı şaşırtıcı şeyler keşfettim. Yazar için, tüm sürecin en ilginç kısmı sinir ağlarının uçtan uca farklılaşabilirliğidir. Orijinal olarak kedi ve köpekleri birbirinden ayırmak için kullanılan bir modeli kolayca "ters çevirebilir" ve onu sayısız farklı görüntü stili oluşturmak için kullanabiliriz. Ayrıca rastgele bir orman modeli ile çalışmayı deneyebilirsiniz.

Güzel resimler oluşturmak için sinirsel stil aktarımını kullanan bu işlem kulağa basit geliyor, ancak gerçekten yüksek kaliteli sonuçlar elde etmek için teknik bir iş.

Yorum Beğen Takip Et

Yapay zeka öğrenme ve geliştirmenin kuru mallarını paylaşalım

Yeniden yazdırıyorsanız, lütfen arka planda bir mesaj bırakın ve yeniden yazdırma şartnamelerine uyun

Kimse bu şeylerle uğraşmak istemez! Size yardımcı olması için dekoratörü tekrar deneyin
önceki
sen benim gözümsin AI, engelli insanlar için engelsiz İnternet erişim kanalları açar
Sonraki
Anlatılmamış hikaye - ana akım şifrelemenin arkasındaki adam
Slack neden bu kadar popüler? Daha hızlı, daha güvenilir ve daha güvenli
Bugünün Temel Sesi | Yüksek bir yeri işgal etmek için akıllı arabanın "giriş savaşı" daha yeni başladı
Veri yapısı bir kabus mu? Röportajı geçmek için ustalaşmalısınız
Sıfır yuan ile başladığımda uygulamayı ücretsiz olarak nasıl çalıştırırım?
Tuzaklara dikkat edin! Java'da 10 yaygın hata
Kod yazmak, roman yazmak gibi mi? Jupyter edebi programlamayı gerçeğe dönüştürüyor
Gelişmeye devam edin! Python projenizi otomasyondan nasıl yararlanabilirsiniz?
Yetkili Tanıma | Jitai Test Merkezi, CNAS tarafından akredite edilmiştir
Birden fazla bloğun yıkılmasını içeren Beiyuan Caddesi'ndeki 100 günlük zorlu projelerin listesi burada
Xinxiang Kuzey Bölgesi havalanmak üzere! Yeni bir hastane ve büyük bir spor ve eğlence vadisi inşa etmek için toplam 846 milyonun üzerinde yatırım planlanıyor
Niu Tail Chong, Paiya Dağı, Jingzhou: İlkel ormanda kalan bir masal dünyası
To Top