2014-12-12 21 views
14

İki giriş görüntüsü ve bir etiket (daha sonra belki diğer veriler) kabul eden ve bunu yapmak için prototxt dosyasında doğru sözdiziminin farkında olan bir merak olup olmadığını merak eden bir Caffe CNN uygulamasına bakıyorum. Eklentileri olan bir IMAGE_DATA katmanı mı? Ya da her biri için ayrı IMAGE_DATA katmanları kullanmalı mıyım?Caffe Çoklu Giriş Görüntüleri

sayesinde James

+1

Eğer bu bir anlayabildin mi? Eğer öyleyse, lütfen bir cevap gönderin. – Shai

+0

2 adet görüntüyü ikiye katlanmış kanal olarak değerlendirdiniz mi? – Frazer

+0

@ james-sergeant Belki bir cevabı kabul edebilir misiniz? RusellStewart'un cevabı harika görünüyor. – Jonathan

cevap

12

Düzenleme: Bunun için son zamanlarda HDF5_DATA katmanını kullanıyorum ve kesinlikle gitmek için bir yoldur.

HDF5, her anahtarın bir dize olduğu ve her değerin çok boyutlu bir dizidir. Böylece, HDF5_DATA katmanını kullanmak için, kullanmak istediğiniz her üst kısım için yeni bir anahtar ekleyin ve kullanmak istediğiniz görüntüyü saklamak için bu tuşun değerini ayarlayın. piton bu HDF5 dosyaları Yazma kolaydır:

import h5py 
import numpy as np 

filelist = [] 
for i in range(100): 
    image1 = get_some_image(i) 
    image2 = get_another_image(i) 
    filename = '/tmp/my_hdf5%d.h5' % i 
    with hypy.File(filename, 'w') as f: 
     f['data1'] = np.transpose(image1, (2, 0, 1)) 
     f['data2'] = np.transpose(image2, (2, 0, 1)) 
    filelist.append(filename) 
with open('/tmp/filelist.txt', 'w') as f: 
    for filename in filelist: 
     f.write(filename + '\n') 

Sonra basitçe '/tmp/filelist.txt' olacak ve "veri1" ve "veri2" olarak tepelerini ayarlamak için HDF5_DATA param kaynağını ayarlayın. =================================

:

aşağıda orijinal yanıtı terk ediyorum

Bunu yapmanın iki iyi yolu vardır. En kolayı, biri ilk resim ve etikete sahip iki ayrı IMAGE_DATA katmanı ve ikinci görüntü ile bir saniye kullanmaktır. Caffe, anahtar değer depoları olan LMDB veya LEVELDB'den görüntüleri alır ve aynı tamsayı kimlik anahtarına sahip olan ilgili resimleri içeren iki veritabanınızı oluşturduğunuzu varsayarsak, Caffe gerçekte görüntüleri doğru şekilde yükler ve siz de ağınızı oluşturmaya devam edebilirsiniz. her iki katmanın verileri/etiketleri.

Bu yaklaşımdaki sorun, iki veri katmanına sahip olmanın gerçekten çok tatmin edici olmaması ve sınırlayıcı kutular, vb. Gibi şeyler için tamsayı olmayan etiketler gibi daha gelişmiş şeyler yapmak istiyorsanız çok iyi ölçeklenmemesidir. Eğer buna bir zaman yatırımı yapmaya hazırsanız, kanalları veya görüntüleri diğer kanallar arasında yığmak için araçları/convert_imageset.cpp dosyasını değiştirerek daha iyi bir iş yapabilirsiniz. Örneğin, 6 kanallı bir sıfır noktası oluşturabilirsiniz - ilk görüntünüzün RGB'si için ilk 3, ikinci görüntünüzün RGB'si için ikinci 3. Bunu IMAGE_DATA katmanını kullanarak okuduktan sonra, slice_dim = 1 boyutu boyunca dizin 3'te bir slice_point olan bir SLICE katmanını kullanarak akışı iki görüntüye bölebilirsiniz. Daha ileride, daha karmaşık veri çeşitlerini yüklemek istediğinize karar verirsiniz, kodlama şemasını anlarsınız ve tam kontrol elde etmek için src/caffe/katman/data_layer.cpp ile kendi kod çözme katmanınızı yazabilirsiniz. boru hattının

+0

Teşekkürler! Yaklaşımlara katılıyorum. İkincisi için farklı boyutta görüntülerim var mı? Ve bu yüzden onları farklı bir kanala yerleştiremem, doğru mu? – RockTheStar

+0

2 GB'den büyük boyutlu hdf5 verileri yüklenemiyor! – curio1729

2

Ayrıca Birden fazla "top" lar HDF5_DATA katmanını kullanmayı düşünebilirsiniz