Bir evrişimli sinir ağına girdi olarak değişken boyutlu görüntüler vermek mümkün müdür?


17

Değişken boyutlu görüntüler, nesne tespiti için evrişimli bir sinir ağına girdi olarak verebilir miyiz? Mümkünse bunu nasıl yapabiliriz?


Ancak görüntüyü kırpmaya çalışırsak, görüntünün bir kısmını kaybederiz ve yeniden boyutlandırmaya çalışırsak, görüntünün netliği kaybolur. Ana netlik konusu, ana nokta, görüntü netliği dikkate alındığında en iyisi olduğu anlamına mı geliyor?

Yanıtlar:


9

Bunu yapmanın birkaç yolu vardır. Bunların çoğu StackOverflow, Quora ve diğer içerik web siteleri üzerinde zaten bir dizi yayında ele alınmıştır.

Özetlemek gerekirse, listelenen tekniklerin çoğu iki çözüm sınıfında gruplandırılabilir:

  1. Dönüşümler
  2. Doğal Ağ Mülkü

Dönüşümlerde,

  • Bahsedilen tüm tekniklerin en basiti olan yeniden boyutlandırma
  • Mahsul bilgi kaybı olan bir kayan pencere veya bir defalık mahsul olarak yapılabilir,

Ayrıca, ağı oluşturan katman davranışı sayesinde girdinin büyüklüğüne bağışık olması için doğası gereği özelliği olan ağlara da bakılabilir. Bunun örnekleri,

  • Çekirdek ve adım boyutları açıklandıktan sonra, her katmandaki evrişim karşılık gelen girişlere göre uygun boyut çıktıları üretebileceğinden, giriş boyutu üzerinde hiçbir sınırlaması olmayan tamamen evrişim ağları (FCN) .

  • Uzamsal Piramit Havuzlaması (SPP) , FCN'lerin tam olarak bağlanmış yoğun bir katmanı yoktur ve bu nedenle görüntü boyutuna agnostiktir, ancak giriş dönüşümlerini düşünmeden yoğun bir katman kullanmak istiyorsa , katmanı açıklayan ilginç bir kağıt olduğunu söyleyin derin bir öğrenme ağı.

Referanslar:

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PS: Birkaç teknikten alıntı yapmayı kaçırmış olabilirim. Bunun ayrıntılı bir liste olduğunu iddia etmemek.


1
Bu teoride kulağa hoş geliyor, ancak Tensorflow'da çalışmıyor. Bunun için herhangi bir uygulaması var mı?
Hossein

1
@Hossein Ben de pratik uygulamada bazı sorunlarla karşılaştım, ama bugün bazı sınırlamalarla Tensorflow Keras 2.x'de çalışan değişken boyutlu bir CNN aldım. Bazı pratik detaylarla ilgili cevabımda yaklaşımın bir taslağını yayınladım. İyi şanslar!
J Trana

4

Evrişimli katmanlar ve havuzlama katmanlarının kendileri girdi boyutlarından bağımsızdır. Bununla birlikte, kıvrımlı katmanların çıktısı, farklı boyuttaki görüntüler için farklı uzamsal boyutlara sahip olacaktır ve daha sonra tamamen bağlı bir katmanımız varsa (tam olarak bağlanmış katmanımız sabit boyutlu bir girdi gerektirdiğinden) bu bir soruna neden olacaktır. Bunun birkaç çözümü var:

1. Global Pooling: Evrişimli katmanların sonunda tamamen bağlı katmanlardan kaçının ve bunun yerine özellik haritalarınızı (N, H, W, C) şeklinde (global havuzdan önce) azaltmak için havuzlama (Global Average Pooling gibi) kullanın ) şekil (genel havuzu sonra, N, 1,1, C) () için:

N = sayısı minibatch örneklerinin
H = özelliği harita mekansal yükseklik
= Alan genişliği özelliği, harita W
C = özelliği haritaları (kanallarının sayısı)

olarak görülebileceği gibi, çıktı boyutsallığı (N * C) artık özellik haritalarının uzamsal boyutundan (H, W) bağımsızdır. Sınıflandırma durumunda, sınıflarınızın günlüklerini almak için üstte tamamen bağlı bir katman kullanmaya devam edebilirsiniz.

2. Değişken boyutlu havuzlama:Farklı giriş boyutları için aynı özellik harita boyutunu elde etmek için değişken boyutlu havuz bölgeleri kullanın.

3. Kırpma / Yeniden Boyutlandırma / Pad giriş görüntüleri: Giriş görüntülerinizi aynı şekle sahip olacak şekilde yeniden ölçeklendirmeyi / kırpmayı / doldurmayı deneyebilirsiniz.


Transfer öğrenimi bağlamında, modelin eğitildiği orijinal girişlerden farklı boyutta girişler kullanmak isteyebilirsiniz. Bunu yapmak için bazı seçenekler şunlardır:

4. Yeni tamamen bağlı katmanlar oluşturun: Orijinal tamamen bağlı katmanları tamamen kapatabilir ve ihtiyacınız olan boyutta yeni bir tam bağlantılı katman başlatabilir ve sıfırdan eğitebilirsiniz.

5. Tam olarak bağlanmış katmanı bir kıvrım olarak işlemden geçirin: Normalde, özellik haritalarını (N, H, W, C) ile (N, H * W * C) arasında tam olarak bağlı katmana beslemeden önce yeniden şekillendiririz. Ancak tamamen bağlı katmanı (H, W) alıcı alanıyla bir evrişim olarak da ele alabilirsiniz. Ardından, bu çekirdeği boyutlarından bağımsız olarak özellik haritalarınızla birleştirebilirsiniz (gerekirse sıfır dolgu kullanın) [http://cs231n.github.io/transfer-learning/ ].


1

Bugün bu problem üzerinde çalışmak zorunda kaldım, bu yüzden işe yaradığını bulduğumu paylaşacağımı düşündüm. Web'de "bu teorik olarak işe yarayabilir" cevapları ve çerezleri olduğunu ancak pratikte "bunu somut bir şekilde nasıl uyguladığınızı" daha az bulduk.

Bunu Tensorflow Keras kullanarak uygulamak için aşağıdakileri yapmak zorundaydım. Belki başka biri bunlardan bazılarını değiştirebilir, rahatlayabilir veya düşebilir.

  1. Ağın girişini, input_shape öğesinde yer tutucu boyut olarak "None" kullanarak değişken boyutlu bir girişe izin verecek şekilde ayarlayın. Bkz burada Francois CHOLLET cevabını .
  2. Katlamalı katmanları yalnızca genel bir havuz oluşturma işlemi gerçekleşinceye kadar kullanın (örn. GlobalMaxPooling2D). Ardından, boyut artık sabit olduğundan Yoğun katmanlar vb. Kullanılabilir.
  3. Yalnızca 1 toplu iş boyutu kullanın. Bu, bir parti içindeki karışık boyutlarla uğraşmayı önler.
  4. Girişler listesinden 1 boyutlu gruplar oluşturan küçük bir özel Sıra yazın. Bunu tek bir Numpy dizisi içinde farklı boyutlarla uğraşmaktan kaçındım.
  5. Eğitim ve doğrulama için özel Dizinizde Model.fit_generator kullanın. (Model.fit'e karşı)
  6. Herhangi bir nedenden dolayı, yukarıdaki gibi Sıra kullanıldığında bile Model.predict_generator attı. Bireysel girdilerde Model.predict kullanarak başvurmak zorunda kaldım.

Model.predict'e yapılan çağrıların, çözümün verimsizliği göz önüne alındığında şaşırtıcı olmayan performanstan şikayet ettiğini unutmayın, ancak işe yarıyor!


-2

Evet, sadece belirli bir değer olması için giriş görüntüsünün boyutuna bağlı olmayan uygun bir omurga ağı seçin - çoğu ağ bu kriterleri karşılar.


3
Yanlış değilsiniz, ancak cevabınız çok bilgilendirici değil - en modern CNN'nin neden değişken boyutlu görüntülerle çalışabileceğini açıklamak için genişletmeye ne dersiniz ? Ayrıca, bu değişkenliğin sınırları nelerdir (örneğin, aynı mini partide farklı boyutlu görüntüleri karıştırmaya çalışmayın ...)? Eski moda MLP'lerden (giriş uzunluğu sabittir) veya eski moda CNN'lerden (AlexNet ve VGG-1X) gelen sinir bozucu Flattenkatmanlarıyla gelen çoğu insan , modern CNN'lerin prensipte herhangi bir boyutta nasıl görüntü alabileceğini anlamıyor.
DeltaIV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.