resimlerin boyutları farklı olduğunda eğitim / tahmin için resim verileri nasıl biçimlendirilir?


90

Görüntüleri sınıflandıran modelimi eğitmeye çalışıyorum. Benim sorunum farklı boyutlara sahip olmaları. resimlerimi / veya model mimarimi nasıl biçimlendirmeliyim?


2
Lütfen şu ana kadar neyi denediğinizi ve sizin için neyin işe yaramadığını gösterin.
Keith John Hutchison

16
Ve bam, Inception v4'ün kodu gider. Bu kullanıma hazır yoruma katılmıyorum. Ne tür bir ağdan bahsettiğimiz gibi - biraz daha fazla girdi güzel olurdu, ancak olumsuz oylar hiç de haklı değil. Yani bir orada gerçek bir sorun.
sunside

4
Soru, ImageNet'in resim verilerini eğitim için yararlı olacak şekilde nasıl biçimlendirdiğidir?
mskw

Yanıtlar:


148

Hangi mimariden bahsettiğini söylemedin. Resimleri sınıflandırmak istediğinizi söylediğiniz için, bunun AlexNet, GoogLeNet gibi kısmen evrişimli, kısmen tamamen bağlantılı bir ağ olduğunu varsayıyorum. Genel olarak, sorunuzun cevabı birlikte çalıştığınız ağ türüne bağlıdır.

Örneğin, ağınız yalnızca evrişimli birimler içeriyorsa - yani tamamen bağlı katmanlar içermiyorsa - giriş görüntüsünün boyutuyla değişmez olabilir . Böyle bir ağ olabilir girdi görüntüleri işlemek ve sırayla başka bir görüntü ( "konvolusyanla tüm yol") return; Elbette bir şekilde kaybı belirlemeniz gerektiğinden çıktının beklediğinizle eşleştiğinden emin olmanız gerekir.

Yine de tamamen bağlı üniteler kullanıyorsanız, sorun yaşarsınız: Burada, ağınızın üzerinde çalışması gereken sabit sayıda öğrenilmiş ağırlığa sahipsiniz, bu nedenle değişen girişler, değişen sayıda ağırlık gerektirecektir - ve bu mümkün değildir.

Eğer sorununuz buysa, yapabileceğiniz bazı şeyler şunlardır:

  • Resimleri ezmeyi umursamayın. Bir ağ, yine de içeriği anlamayı öğrenebilir; Ölçek ve perspektif içerik açısından bir şey ifade ediyor mu?
  • Görüntüleri belirli bir boyutta ortadan kırpın. Veri kaybetmekten korkuyorsanız, birden fazla kırpma yapın ve bunları giriş verilerinizi artırmak için kullanın, böylece orijinal görüntü bölünür.N doğru boyutta farklı görüntülere .
  • Görüntüleri tek renkle kare boyutuna doldurun, ardından yeniden boyutlandırın.
  • Bunun bir kombinasyonunu yapın.

Dolgu seçeneği, ağın böyle bir dolgulu kenarlık içeren görüntülere eğilimli olabileceğinden (okuyun: büyük olasılıkla olacaktır) ağın tahminine ek bir hata kaynağı getirebilir. Bazı fikirlere ihtiyacınız varsa , TensorFlow belgelerinin Görseller bölümüne bir göz atın.resize_image_with_crop_or_pad daha büyük işi ortadan .

Ezmeyi umursamamaya gelince, işte ünlü Inception ağının ön işleme hattından bir parça:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Tamamen farkındalar ve yine de yapıyorlar.

Ne kadar ileri gitmek istediğinize veya gitmeniz gerektiğine bağlı olarak, aslında burada Görsel Tanıma için Derin Evrişim Ağlarında Uzamsal Piramit Havuzlaması adlı , rastgele boyutlardaki girdileri çok özel bir şekilde işleyerek işleyen bir kağıt var .


11
Bu konu, nesne algılama ve örnek bölümleme ile uğraşırken çok daha karmaşık görünüyor, çünkü görüntü boyutlarında yüksek varyanslı bir veri kümeniz varsa, hiperparametreler olan bağlantı kutusu boyutlarının da ayarlanması gerekir.
CMCDragonkai

En boy oranları, daireler ve elipsler arasında ayrım yapmak olan bir ağ için oldukça önemli bir rol oynar.
HelloGoodbye

1
Diğer bir genel gözlem, partilerin aynı boyutlara sahip olmak zorunda olmadıklarıdır; yoğun katmanlar halledildiği sürece birinci grup 4: 3 görüntü, ikincisi 16: 9 vb.
sunside

1
@Tobitor, her zaman ağın girişlerini gerçek (test veya çıkarım zamanı) verilere olabildiğince yakın yapın. Tüm görselleriniz yüksekten çok daha geniş oluyorsa, ağınızı da görüntülerinizi bu şekilde işleyecek şekilde modellemelisiniz. Bununla birlikte, "kullanım" verilerinizin nasıl görüneceğini söyleyemiyorsanız, eğitim sırasında bazı fedakarlıklar yapmanız gerekir. Ve bu durumda, bir görüntünün 1000x200'den 256x256'ya yeniden boyutlandırılması genellikle uygundur (bu plakaya 60 derecelik bir açıyla baktığınızı hayal edin - şimdi kabaca kare şeklinde).
sunside

2
@Tobitor Görüntülerin kare olması için hiçbir gereklilik yoktur, çıkarım sırasında gerçek görüntü boyutlarını bilmiyorsanız, bu en az kötü değiş tokuş olur. : ^) Boyuta gelince, ne kadar küçük olursa o kadar iyidir, ancak yine de gerekli olan en ince ayrıntıları yakalamak için görüntülerin yeterince büyük olması gerekir - genel olarak konuşursak, bir insan uzman olarak, içinde ne olduğunu belirleyemeyeceğinizi unutmayın. görüntü, ağ da mümkün olmayacak.
2020

11

Uzamsal bir piramit havuz katmanı oluşturmayı deneyin. Sonra onu son evrişim katmanınızın arkasına koyun, böylece FC katmanları her zaman girdi olarak sabit boyutlu vektörler alır. Eğitim sırasında, bir dönem için belirli bir görüntü boyutunu kullanarak tüm veri kümesindeki görüntüleri eğitin. Ardından bir sonraki dönem için farklı bir görüntü boyutuna geçin ve eğitime devam edin.


Normal havuzlamaya kıyasla "uzamsal piramit havuzunun" ne olduğu konusunda biraz ayrıntı verebilir misiniz?
Matthieu

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.