Lei Feng Net Not: Bu makalenin yazarı Zhiyuan He, Fudan Üniversitesi'nde bilgisayar bilimi alanında yüksek lisans eğitimi alıyor ve yapay zeka bilgisayar vizyonunun yönünü çalışıyor. Bu makale Leifeng.com tarafından düzenlenmiş ve yazarın Zhihu sütunundan derlenmiştir ve yayınlama yetkisine sahiptir.
1. Stil aktarımına giriş
Stil Aktarımı, derin öğrenmenin birçok uygulamasından çok ilginç bir tanesidir. Şekilde gösterildiği gibi, bu yöntemi bir resmin stilini diğerine "aktarmak" için kullanabiliriz:
Ancak, orijinal stil aktarımı (kağıdı görüntülemek için tıklayın) çok yavaştır. GPU'da bir resim oluşturmak yaklaşık 10 dakika sürer ve programı çalıştırmak için yalnızca CPU'yu GPU'suz kullanırsanız, birkaç saat bile sürebilir. Resmin boyutu büyüdükçe bu süre de hızla artacaktır.
Bunun nedeni şudur: Özgün stil aktarım sürecinde, resim üretme süreci bir "eğitim" süreci olarak kabul edilir. Bir resim her oluşturulduğunda, yüz binlerce kez yinelenebilen bir model eğitmeye eşdeğerdir. Makine öğrenimi hakkında biraz bilginiz varsa, sıfırdan bir model eğitmenin, halihazırda eğitilmiş bir modeli yürütmekten çok daha fazla zaman aldığını bilirsiniz. Orijinal stil aktarımının yavaş olmasının nedeni budur.
2. Hızlı Stil Aktarımına Giriş
Resim üretmeyi bir "eğitim" süreci olarak değil, bir "yürütme" süreci olarak düşünmenin bir yolu var mı? Cevap Evet. Hızlı nöral stil aktarımını görün: Gerçek Zamanlı Stil Aktarımı ve Süper Çözünürlük için Algısal Kayıplar
Hızlı stil aktarımının ağ yapısı iki bölümden oluşur. Biri "Generation Network" (Orijinal metindeki Transformation Network) ve diğeri "Loss Network" (Loss Network). Üretim ağı, girdi olarak bir resim alır ve çıktı da bir resimdir (yani, stil aktarımının sonucudur). Aşağıdaki şekilde gösterildiği gibi, sol taraf üretim ağı ve sağ taraf kayıp ağıdır:
Eğitim aşaması: Önce bir stil resmi seçin. Eğitimin amacı, üretim ağının etkili bir şekilde resim oluşturmasına izin vermektir. Hedef, kayıp ağı tarafından tanımlanır.
Yürütme aşaması: Bir resim verildiğinde, onu üreten ağa girin ve bu resmin stil aktarımının sonucunu çıkarın.
bulabiliriz Modelin "icra" aşamasında stil resimlerin üretimini tamamlayabiliriz. Bu nedenle, bir resim oluşturma hızı çok büyüktür, genellikle GPU'da 1 saniyeden azdır ve CPU'da çalıştırmak yalnızca birkaç saniye sürer.
3. Hızlı stil geçişinin Tensorflow uygulaması
Söyleyecek fazla bir şey yok, sadece kodumun Github adresine git (görmek için tıkla)
Aşağıdaki gibi dönüşüm etkileri de vardır.
Orijinal Resim:
Stil aktarımından sonra resim:
Yukarıdaki resmin GPU (Titan Black) altında oluşturulması yaklaşık 0,8 saniye, CPU (i7-6850K) altında oluşturulması ise yaklaşık 2,9 saniye sürer.
Hızlı stil geçişiyle ilgili olarak, aslında Github'da Tensorflow'un iki uygulaması vardır:
junrushao1994 / fast-neural-style.tf
OlavHN / hızlı sinir tarzı
Ancak ilk proje yalnızca birkaç eğitimli model sağladı, eğitim kodu ve belirli bir ağ yapısı yoktu. Bu yüzden gerçekten kullanışlı değil.
İkinci model tam olarak uygulandı ve eğitilebilir, ancak eğitim etkisi çok iyi değil. Yazarın kendi blogunda bir örnek verilmiştir. Oluşturulan görüntünün birçok gürültü noktasına sahip olduğunu görebilirsiniz:
Projem, birçok değişiklik ve ayarlamayla OlavHN / hızlı nöral tarzı temel alıyor.
Dört, bazı uygulama ayrıntıları
1. Tensorflow Slim ile birleştirin
Orijinal uygulamada yazar, kayıp ağı olarak VGG19 modelini kullandı. Orijinal kağıtta VGG16 kullanıldı. Tutarlılığı korumak için, kayıp ağını yeniden paketlemek için Tensorflow Slim kullandım.
Slim, görüntü sınıflandırmasıyla ilgili birçok işlevi sağlayan genişletilmiş bir Tensorflow kitaplığıdır ve birçok model eğitilmiştir (VGG, Inception serisi ve ResNet serisi gibi).
Aşağıdaki şekil, Slim tarafından desteklenen modeldir:
Orijinal ağı Slim ile değiştirdikten sonra, Kayıp fonksiyonunda sadece VGG16'yı değil, aynı zamanda VGG19, ResNet ve diğer ağ yapılarını da rahatlıkla kullanabiliyoruz. . Lütfen özel uygulama için kaynak koduna bakın.
2. Yer değiştirmiş evrişimi iyileştirmek için iki numara
Başlangıçta görüntüleri oluşturmak için ağı kullanmamız gerektiğinde, genellikle görüntüyü doğrudan örneklemek için dönüştürülmüş evrişim kullandık.
Bu makale, transpoze konvolüsyonlarla ilgili bazı problemlere işaret ediyor. Transpoze konvolüsyonların mantıksız üst üste binmesi nedeniyle, oluşturulan resimlerin her zaman "dama tahtası benzeri gürültü noktalarına" sahip olduğuna inanılıyor. Resmi büyütmek için ilkini kullanmayı ve ardından hacmi yapmayı önerir. Yukarı örnekleme için aktarılmış evrişim yerine ürün yöntemi, oluşturulan görüntünün kalitesini artırabilir.Aşağıdaki şekil iki yöntemin karşılaştırmasını gösterir:
Karşılık gelen Tensorflow uygulaması:
Yukarıdaki ilk numara.
İkinci numara Örnek Normalleştirme: Hızlı Stilizasyon için Eksik Bileşen makalesinde belirtilmiştir Normal Toplu Normalleştirme yerine Örnek Normalleştirme kullanmak stil aktarımının kalitesini artırabilir.
3. Optimizer ve Saver kullanımına dikkat edin
Bu, Tensorflow'un uygulanmasıyla ilgili küçük bir ayrıntıdır.
Tensorflow'da, Optimizer ve Saver varsayılan olarak modeldeki tüm değişkenleri eğitir ve kaydeder. Ancak bu projede, tüm ağ iki bölüme ayrılmıştır: üretim ağı ve kayıp ağı. Amacımız üretici ağı eğitmektir, bu nedenle üretici ağdaki değişkenleri eğitip kaydetmemiz yeterlidir. Optimizer ve Saver'ı oluştururken, yalnızca üretim ağındaki değişkenleri aktarmaya dikkat edin.
Eğitilmesi gereken değişkenleri bulun ve bunları Doktora iletin:
Beş, özet
Kısacası oldukça ilginç bir proje yaptım. Kod çok fazla değil. Görüntü oluşturmak için yalnızca eğitimli modeli kullanırsanız, bir GPU ortamı oluşturmanıza gerek kalmadan sonuçları birkaç saniye içinde çalıştırmak için CPU'yu kullanabilirsiniz. İlgilenen öğrencilerin kendi başlarına oynayabilmeleri tavsiye edilir.
Eğitimle ilgili olarak, parametrelerin ayarlanmasında aslında nispeten bir dan ve teng deneyimi var. Bunu bir dahaki sefere zamanım olduğunda paylaşacağım, bugün bunun hakkında yazacağım. hepinize teşekkür ederim!