Resimleri denoise etmek için evrişimli otomatik kodlayıcı nasıl kullanılır?

Eser sahibi: rain millet

Qubit, düzenleme ve yayınlama yetkisine sahiptir

Önsöz

Bu hafta işte çok meşguldüm. Başlangıçta Dikkat ekini yazmak istedim, ama zaman ayıramadım. Daha sonra zamanım olduğunda yazacağım, herkes için biraz ot ekeceğim.

Bu hafta basit bir gerçek otomatik kodlayıcı koduna bir göz atalım. Otomatik kodlayıcı teorisini ayrıntılı olarak tanıtmayacağım. İnternette çok araştırma yaptım.

En basit kendi kendine kodlayıcı, girişi bir kodlayıcı ve kod çözücü aracılığıyla yeniden oluşturmaktır.Örneğin, bir ağa bir resim giriyoruz ve kendi kendini kodlayıcının kodlayıcısı sıkıştırılmış bilgiyi almak için resmi sıkıştırıyor ve ardından kod çözücü Bu bilginin kodu, orijinal görüntüyü yeniden oluşturmak için çözülür.

Çizim aracı: OmniGraffle

Kendi kendine kodlayıcı aslında hedef ve girdi arasındaki farkı en aza indirerek, yani çıktı katmanının orijinal bilgileri olabildiğince yeniden üretmesine izin vererek optimize edilir. Otomatik kodlayıcının temel biçimi nispeten basit olduğu için, bunun DAE, SDAE, VAE vb. Dahil birçok çeşidi vardır. İlgileniyorsanız, İnternette diğer ilgili bilgileri arayabilirsiniz.

Bu makale iki demo uygulayacaktır: İlk bölüm basit bir giriş-gizli-çıkış bağlantı otomatik kodlayıcı uygulamaktır ve ikinci kısım, görüntü gürültüsünü azaltmak için birinci kısım temelinde bir evrişimli otomatik kodlayıcı uygulayacaktır.

Araç açıklaması

TensorFlow1.0

jupyter defter

Veri: MNIST el yazısı veri seti

Tam kod adresi: NELSONZHAO / zhihu

ilk kısım

İlk olarak, yukarıda gösterilen yapı ile en basit AutoEncoder'ı uygulayacağız.

Verileri İndir

Burada, deneyler için MNIST el yazısı veri setini kullanıyoruz. Her şeyden önce, verileri içe aktarmamız gerekiyor.TensorFlow bu deneysel veri kümesini zaten kapsülledi, bu nedenle kullanımı çok basit.

Verilerin gri tonlamalı resimleri göstermesini istiyorsanız, plt.imshow (img.reshape ((28,28)), cmap = Greys_r) kodunu kullanın.

Veri setimizi input_data aracılığıyla yükleyebiliriz. Küçük ortak zaten yerel olarak MNIST veri kümesine (dört sıkıştırılmış paket) sahipse, bu dört sıkıştırılmış paketi MNIST_data dizini altına koyabilirsiniz, böylece TensorFlow verileri tekrar indirmeden doğrudan çıkarır. Imshow aracılığıyla bir görüntüyü istediğimiz zaman görebiliriz.

Yüklediğimiz veriler 784 boyutlu bir vektöre işlendiğinden, yeniden görüntülenirken yeniden şekillendirilmesi gerekiyor.

Model oluştur

Verileri yükledikten sonra en basit modellemeyi gerçekleştirebiliriz. Bundan önce, önce girdi verisinin boyutunu alalım.Yüklediğimiz görüntü 28x28 piksellik bir blok ve TensorFlow bunu bizim için 784 boyutlu bir vektör haline getirdi. Aynı zamanda gizli katmanın boyutunu da belirlememiz gerekiyor.

Burada 64 belirledim. Hidden_units ne kadar küçükse o kadar fazla bilgi kaybedilir.Arkadaş sonuçları görmek için başka boyutları da deneyebilirler.

AutoEncoder, üç kat girdi, gizli ve çıktı içerir.

Gizli katmanda, aktivasyon işlevi olarak ReLU kullanıyoruz.

Bu noktada, basit bir AutoEncoder oluşturulur ve ardından eğitim için TensorFlow grafiğini başlatabiliriz.

Eğitim sonuçlarını görselleştirin

Yukarıdaki adımlardan sonra basit bir AutoEncoder oluşturduk, aşağıda performansını görmek için sonuçları görselleştireceğiz.

Burada görselleştirme için test veri setinden 5 örnek seçtim.Aynı şekilde gri tonlamalı görüntüleri gözlemlemek istiyorsanız cmap parametresini 'Greys_r' olarak belirtin. Yukarıdaki çizgi, test veri setindeki orijinal görüntüdür ve ikinci satır, AutoEncoder tarafından çoğaltılan görüntüdür ve piksel bilgilerindeki kayıp açıkça görülebilir.

Benzer şekilde gizli katmanda sıkıştırılmış verileri de görselleştirebiliriz ve sonuçlar şu şekildedir:

Bu beş resim, testteki beş resmin sıkıştırılmış resimlerine karşılık gelir.

Yukarıdaki basit örnekle, AutoEncoder'ın temel çalışma prensibini anlıyoruz, aşağıda modelimizi daha da geliştireceğiz, gizli katmanı görüntü parazitini azaltmak için evrişimli bir katmana dönüştüreceğiz.

Yukarıdaki işlemde kodun bir kısmı atlanmıştır. Lütfen GitHub'ımdaki kodun tamamını kontrol edin.

ikinci kısım

Yukarıdaki AutoEncoder çalışma prensibini anlamak temelinde, görüntü paraziti azaltma işlemini gerçekleştirmek için bu bölümde AutoEncoder'a birden çok evrişimli katman ekleyeceğiz.

Evrişimsel sinir ağı konusunda net olmayan küçük bir ortak varsa, öğrenmek için Zhihu'ya gidip büyük tanrıların makalelerini okuyabilirsiniz.

Benzer şekilde, deneyler yapmak için hala MNIST veri setini kullanıyoruz. Veri içe aktarma adımları tekrar edilmeyecektir, lütfen görüntülemek için kodu indirin. Başlamadan önce model yapımızın tamamına bir resim üzerinden bakalım:

Çizim aracı: OmniGraffle

Modele gürültülü bir resim giriyoruz ve modele çıkış ucunda gürültüsüz bir resim veriyoruz ve modelin evrişimli otomatik kodlayıcı aracılığıyla gürültü azaltma sürecini öğrenmesine izin veriyoruz.

Giriş katmanı

Buradaki giriş katmanı, önceki bölümümüzün giriş katmanından farklıdır, çünkü evrişim işlemini kullanacağız.Bu nedenle, giriş katmanı, yükseklik x genişlik x derinlik görüntüsü olmalıdır. Genel görüntü derinliği RGB formatında üç katmandır. MNIST veri setimizin derinliği yalnızca 1'dir.

Enkoder evrişimli katman

Kodlayıcı evrişimli katman, görüntüyü işlemek için üç katmanlı bir evrişim ve havuz katmanı oluşturur.

İlk evrişim katmanında, 3 x 3 boyutunda 64 filtre kullanıyoruz, varsayılan adım sayısı 1'dir ve yüksekliğimiz ve genişliğimiz dolgu aynı ayarlandıktan sonra değişmeyecektir, bu nedenle ilk hacim katmanından sonra Üründen sonra aldığımız veriler orijinal 28 x 28 x 1'den 28 x 28 x 64'e değişir.

Ardından, evrişim sonucu üzerinde maksimum havuzlama gerçekleştirin. Burada boyutu ayarlıyorum ve 2 x 2 adım atıyorum. Havuzlama işlemi evrişim sonucunun derinliğini değiştirmez, bu nedenle havuzlamadan sonraki boyut 14 x 14'tür. x 64.

Diğer evrişimli katmanlar için onları tekrar etmeyeceğim. Tüm evrişimli katmanların aktivasyon fonksiyonları ReLU kullanır.

Üç kat evrişim ve havuzlama işleminden sonra, elde ettiğimiz conv3 aslında önceki bölümdeki gizli AutoEncoder katmanına eşdeğerdir.Bu katmanın verileri 4 x 4 x 32 boyutuna sıkıştırılmıştır.

Bu noktada Enkoder tarafında evrişim işlemini tamamladık ve veri boyutu 28 x 28 x 1'den 4 x 4 x 32'ye değişti.

Dekoder evrişimli katman

Daha sonra Dekoder tarafında evrişime başlayacağız. Bundan önce, bazı arkadaşlar sormak zorunda kalabilir, çünkü Kodlayıcı resimleri zaten 4 x 4 x 32 boyutuna çevirdi, eğer Kod Çözücü üzerinde kıvrılmaya devam edersek, veri boyutu küçülmez mi?

Bu nedenle, kod çözücü tarafında, sadece evrişim işlemlerini gerçekleştirmiyoruz, aynı zamanda Üstörnek (Çince çeviri üst örnekleme olabilir) + evrişim kombinasyonunu kullanıyoruz.

Evrişim işleminin resimdeki her yamayı bir filtre aracılığıyla taradığını ve ardından yamadaki piksel bloklarının ağırlıklı toplamından sonra doğrusal olmayan işlem gerçekleştirdiğini biliyoruz.

Örneğin, orijinal görüntüdeki yamamızın boyutu 3 x 3 ise (popüler olan nokta, bir resimdeki 3 x 3 piksel bloklarından birini almamızdır) ve sonra 3 x 3 filtre kullanıyoruz Bu yamayı işleyin, ardından bu yama evrişimden sonra 1 piksel blok haline gelir.

Ters evrişimde (veya ters çevrilmiş evrişimde), bu işlem tersine çevrilir. 1 piksel bloğu 3 x 3 piksel bloğuna genişletilecektir.

Ancak Ters Evrişimin bazı dezavantajları vardır, resimde dama tahtası modellerine neden olur, çünkü Ters Evrişim sürecinde filtrede çok fazla örtüşme olacaktır. Bu sorunu çözmek için, birisi Upsample artı bir evrişimli katman kullanmayı önerdi.

Upsample ile ilgili iki yaygın yol vardır, biri en yakın komşu enterpolasyonudur ve diğeri çift doğrusal enterpolasyondur.

Bu makale ayrıca kod çözücü tarafını işlemek için Upsample artı evrişimi kullanacaktır.

Upsample işlemi de TensorFlow içinde kapsüllenir Encoder evrişim sonucunu yeniden boyutlandırmak için resize_nearest_neighbor'ı kullanırız ve ardından evrişim işlemi gerçekleştiririz.

Üç Upsample işleminden sonra, 28 x 28 x 64 veri boyutuna sahibiz. Son olarak, bu sonucu tekrar dönüştürmemiz ve orijinal resmimizin boyutuna getirmemiz gerekiyor.

Son adım, kayıp ve optimize edici tanımlamaktır.

Kayıp fonksiyonunu hesaplamak için çapraz entropi kullanıyoruz ve optimizasyon fonksiyonu öğrenme oranı 0.001'dir.

Gürültü verilerini oluşturun

Yukarıdaki adımlarla, tüm evrişimli otomatik kodlayıcı modelini oluşturduk. Görüntüyü denoize etmek için bu modeli kullanmak istediğimizden, eğitimden önce gürültü verilerimizi de orijinal verilere dayanarak oluşturmamız gerekiyor.

Nasıl gürültü ekleneceğini görmek için yukarıdaki basit bir örneği ele alalım: Bir resmin (784 boyutunda) data imajını elde ederiz ve resimdeki pikselleri değiştirecek olan rastgele bir sayı ile çarpılan parazit faktörünü ekleriz. .

Ardından, MNIST verilerinin her piksel verisi 0-1 arasında bir sayıya işlendiğinden, her piksel verisinin hala 0-1 arasında olmasını sağlamak için görüntüyü gürültüyle kırpmak için numpy.clip kullanırız. .

Np.random.randn (* img.shape) işleminin çalışması np.random.randn'a (img.shape, img.shape) eşittir

Gürültü eklemeden önce ve sonra görüntü karşılaştırmasına bir göz atalım.

Eğitim modeli

Model yapımı ve gürültü işlemeyi tanıttıktan sonra, modelimizi bir sonraki adımda eğitebiliriz.

Modeli eğitirken, girdimiz gürültü eklenmiş veriler haline geldi ve çıktı bizim orijinal gürültüsüz verilerimizdir. Asıl önemli olan, orijinal verileri girdilerle aynı biçimde yeniden şekillendirmektir_. Evrişim işleminin derinliği nedeniyle model eğitimi biraz yavaştır.Çalışmak için GPU kullanılması önerilir.

En son oturumu kapatmayı unutmayın.

Sonuçların görselleştirilmesi

Yukarıdaki uzun eğitimin ardından modelimiz nihayet eğitildi.Ardından modelin görselleştirme yoluyla nasıl çalıştığını görelim.

Evrişimli otomatik kodlayıcı aracılığıyla gürültü azaltma etkimizin hala çok iyi olduğu, oluşturulan son görüntünün çok düzgün göründüğü ve gürültünün neredeyse görünmez olduğu görülebilir.

Bazı arkadaşlar, gürültü azaltmayı sağlamak için AutoEncoder'ın gizli girdi-çıktı yapısının temel sürümünü de kullanabileceğimizi düşünebilir. Bu nedenle, modelin gürültü azaltma eğitimi için en basit girdi-gizli-çıktı yapısını kullanan bir sürümünü de uyguladım (kod GitHub'ımda). Sonuçlarına bir göz atalım:

Evrişimli otomatik kodlayıcı ile karşılaştırıldığında, gürültü azaltma etkisinin daha kötü olduğu ve yeniden şekillendirilen görüntüde bazı gürültü gölgelerinin görülebildiği görülebilir.

son

Bu noktada, AutoEncoder modelinin temel sürümünü tamamladık ve görüntü gürültüsünü azaltmak için bu temelde bir evrişimli katman ekledik. Arkadaşlarımın da AntoEncoder hakkında bir ön anlayışa sahip olduğuna inanıyorum.

Kodun tamamı GitHub'ıma yerleştirildi, bağlantı burada: https://github.com/NELSONZHAO/zhihu/tree/master/denoise_auto_encoder

İçeren Altı dosya :

AutoEncoder'ın temel sürümü olan BasicAE (iki dosya içerir: jupyter not defteri ve html)

EasyDAE, gürültü azaltma AutoEncoder'ın temel sürümü (iki dosya içerir: jupyter dizüstü bilgisayar ve html)

ConvDAE, Evrişimli Gürültü Azaltma Otomatik Kodlayıcı (iki dosya içerir: jupyter not defteri ve html)

Kendinizi iyi hissediyorsanız, GitHub'da bana bir yıldız verebilirsiniz, daha da iyisi!

Bitiş

"Baowo Akıllı İmalat" büyük bir başlangıç yaptı, ürünler Endüstri 4.0 altında nasıl vasat olabilir?
önceki
Schmidt Pekin'e dönmek mi istiyor? Li Xiaopeng, eyalet halkına geri vermek istiyor! Lu Media: Tashen başlamaya kararlı
Sonraki
28 galibiyet ve 1 mağlubiyet,% 97 galibiyet oranı, Paul şampiyonaya koşma yeteneği için bir zorunluluktur, hatta Harden bile ikna etti!
PlayerUnknown's Battlegrounds yağmur ormanı haritası, bu 2 bina her yerde görülebilir, Yin halkına bir servet kazandırmanıza izin verin!
Yaygara yapmayın, ileride sınır hattında sık sık Haval H9 askeri araçları göreceksiniz.
Sahada 5 puan kaybeder ve sonunda 10 puan kazanırsınız Warriors'ın en büyük düşmanı Rockets değil, o!
Haritadan teslim edilen bir klasik! Warcraft 3 kaç oyun yaratıcılık sunuyor?
Şarj yarısı -pil ömrü 300 kilometreyi aşıyor.
Schuster'ın hayatı zor! Dalian Yifang seviyeyi korumak için mücadele ediyor, patronun son gönderisi takımda kalacağını mı söylüyor?
Üç sayı aralığında 0'a 17, 2 istatistik, Raptors alttan 1. sırada, Jeremy Lin yine bir nimettir fırsatını boşa harcıyor mu?
İkinci ve üçüncü hat takımları hayatta kalamaz mı? DOTA2 profesyonel oyuncuları açıkça rekabet ortamının "çöp" olduğunu söylediler!
Maserati'nin duygularını görmek için güneydeki Çin stilini kucaklayın
Playofflarda Lakers için umut zayıf, Zhan Huang'ın herhangi bir sorumluluğu var mı? 4Detay gösterimi gerçekten sorumludur!
Real Madrid'i neden terk ettin? Zidane: Çin'e koçluk yapmak için uygun olduğunda geri adım atmak mı? Asla Hayır deme
To Top