2017-07-24 6 views
1

Ich versuche, einige Bilder von GoogleNet mit Pycaffe alles in seinem Standardzustand zu klassifizieren ist , das deploy.prototxt und auch das vortrainierte Modell. Allerdings, wenn ich den Code ausführen möchten, erhalte ich folgende Fehlermeldung:Valueerror: konnte nicht Eingabearray übertragen von Form (1,3,256,256) in Form (1,3,224,224) auftritt, während mittlere Datei in caffe Subtrahieren

ValueError: could not broadcast input array from shape (1,3,256,256) into shape (1,3,224,224) 

das passiert, wenn ich mein Bild von der Mittelwert-Datei subtrahieren wollen! Dies ist der Code Ich verwende:

# Extract mean from the mean image file 
    mean_blobproto_new = caffe.proto.caffe_pb2.BlobProto() 
    f = open(args.mean, 'rb') 
    mean_blobproto_new.ParseFromString(f.read()) 
    mean_image = caffe.io.blobproto_to_array(mean_blobproto_new) 

for i, image, label in reader: 
    image_caffe = image.reshape(1, *image.shape) 

    out = net.forward(data=np.asarray([ image_caffe ])- mean_image) 
    plabel = int(out['pred'][0].argmax(axis=0)) 

und dies ist die deploy.prototxt Datei (das Netzwerk als auch auf 256x256 Bilder abgeschnitten bei 224x224 wie GoogleNet und GoogleNet bedeuten-Datei wird verwendet, ausgebildet wurde): https://pastebin.com/2QEtEeHW

was ist hier falsch?
Sollte nicht Caffe zuerst das Bild subtrahieren und dann ernten, damit dieser Fehler nicht passieren würde? Was soll ich tun?

+0

subtrahiert googelnet nicht einen Mittelwert pro Kanal (ein 3-Vektor, anstatt eines "Durchschnittsbildes")? – Shai

+0

Ich habe die Dateien aus diesem Zweig: https://github.com/mrgloom/kaggle-dogs-vs-cats-solution und habe alle Dateien + Meanfile von ihrem Zweig! Der Caffe-Zweig, auf den der vorherige Link verweist und von dem sie wissen, dass sie ihre GoogleNet-Implementierung verwendet haben, verwendet den Durchschnitt pro Kanal. – Breeze

+1

Es tut es nicht. Sie können https://stackoverflow.com/questions/44119176/caffe-model-gives-same-output-for-e-every-image nachsehen, wie ich es mache. – Harjatin

Antwort

0

Damit dies funktioniert habe ich 3 Auswahlmöglichkeiten!

  1. Verwenden Sie transformer.preprocess() Methode, die extrem langsam war!
  2. Bildgröße und Mittelwert-Datei auf die Crop-Größe ändern und dann die mittlere Datei verwenden
  3. centre crop genau wie Caffe und weitermachen!

Hier ist der Code, den ich dafür geschrieben habe, beachte, dass ich eine lmdb-Datenbank gelesen habe, also wurden die Samples bereits transponiert und der Kanal getauscht! :

ims=[]    
for x in range(len(batch)): 
    img = batch[x][1] 
    #img has c,h,w shape! its already gone through transpose and channel swap when it was being saved into lmdb! 
    #method I: crop the both the image and mean file 
    #ims.append(img[:,0:224,0:224] - mean_image[0][:,0:224,0:224]) 
    #Method II : resize the image to the desired size(crop size) 
    #img = caffe.io.resize_image(img.transpose(2,1,0), (224, 224)) 
    #Method III : use center crop just like caffe does in test time 
    #center crop 
    c,h,w = img.shape 
    startx = h//2 - cropx//2 
    starty = w//2 - cropy//2 
    img = img[:, startx:startx + cropx, starty:starty + cropy]     
    #transpose the image so we can subtract from mean, and in the meanwhile, change it to float! 
    img = np.array(img.transpose(2,1,0),dtype=np.float32) 
    img -= mean_image[0].mean(1).mean(1) 
    #transpose back to the original state 
    img = img.transpose(2,1,0) 
    ims.append(img)   

net1.blobs['data'].data[...] = ims[:] 
Verwandte Themen