2016-08-11 3 views
2

Ich bin relativ neu in der Verwendung von Caffe und versuche, minimale Arbeitsbeispiele zu erstellen, die ich (später) optimieren kann. Ich hatte keine Schwierigkeiten, Caffe's Beispiele mit MNIST-Daten zu verwenden. Ich heruntergeladene Bild-net Daten (ILSVRC12) und verwendet caffe des Werkzeugs es zu einer LMDB Datenbank zu konvertieren mit:Lesen von codierten Bilddaten aus der Datenbank lmdb in caffe

$CAFFE_ROOT/build/install/bin/convert_imageset -shuffle -encoded=true top_level_data_dir/ fileNames.txt lmdb_name 

Um eine LMDB enthält codiert (jpeg) Bilddaten zu erstellen. Der Grund dafür ist, dass codiert, die lmdb ist etwa 64 GB im Vergleich zu uncodierten etwa 240 GB.

Meine .prototxt-Datei, die das Netz beschreibt, ist minimal (ein Paar innerer Produktschichten, meist aus dem MNIST-Beispiel entlehnt - geht hier nicht auf Genauigkeit, ich will nur, dass etwas funktioniert).

name: "example" 
layer { 
    name: "imagenet" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    scale: 0.00390625 
    } 
    data_param { 
    source: "train-lmdb" 
    batch_size: 100 
    backend: LMDB 
    } 
} 
layer { 
    name: "imagenet" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
    transform_param { 
    scale: 0.00390625 
    } 
    data_param { 
    source: "test-lmdb" 
    batch_size: 100 
    backend: LMDB 
    } 
} 
layer { 
    name: "ip1" 
    type: "InnerProduct" 
    bottom: "data" 
    top: "ip1" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    inner_product_param { 
    num_output: 1000 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "ip1" 
    top: "ip1" 
} 
layer { 
    name: "ip2" 
    type: "InnerProduct" 
    bottom: "ip1" 
    top: "ip2" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    inner_product_param { 
    num_output: 1000 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "ip2" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "ip2" 
    bottom: "label" 
    top: "loss" 
} 

Wenn Zug-LMDB unverschlüsselte ist, diese .prototxt Datei funktioniert gut (Genauigkeit miserabel, aber caffe nicht abstürzt). wenn Zug-LMDB codiert wird jedoch dann bekomme ich folgende Fehlermeldung:

data_transformer.cpp:239] Check failed: channels == img_channels (3 vs. 1) 

Frage: Gibt es eine „Fahne“ ich in der .prototxt-Datei festgelegt ist, dass der Zug-LMDB anzeigt, kodierte Bilder? (Die gleiche Flagge würde wahrscheinlich für die Datentestschicht, Test-LMDB gegeben werden.)

Eine wenig Forschung:

Stochern mit google mir ein resolved issue gefunden, die vielversprechend schienen. Die Einstellung 'force_encoded_color' auf true hat mein Problem jedoch nicht gelöst.

Ich fand auch this Antwort sehr hilfreich bei der Erstellung der LMDB (insbesondere mit Anweisungen für die Enkodierung zu aktivieren), jedoch wurde nicht erwähnt, was getan werden sollte, so dass Caffe ist sich bewusst, dass die Bilder codiert sind.

Antwort

2

Die Fehlermeldung Sie bekommen:

data_transformer.cpp:239] Check failed: channels == img_channels (3 vs. 1) 

bedeutet caffe Datenwandler-Eingang erwartet mit 3 channels (dh Farbbild), ist aber mit nur 1 img_channels ein Bild bekommen (dh Graustufenbild) .

sucht ar caffe.proto wäre es scheint, wie Sie die Parameter am transformation_param setzen sollen

layer { 
    name: "imagenet" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    scale: 0.00390625 
    force_color: true ## try this 
    } 
    data_param { 
    source: "train-lmdb" 
    batch_size: 100 
    backend: LMDB 
    force_encoded_color: true ## cannot hurt... 
    } 
} 
+0

Dies scheint zu funktionieren! Bedeutet dies, dass einige Graustufenbilder in die Daten eingemischt sind? Ich dachte/nahm an, dass sie alle farbig waren (die Handvoll, die ich ansah, war sicherlich in Farbe). Vielleicht hätte ich das erwischt, wenn ich beim Erstellen der LMDB die Option --check_size verwendet hätte? Ich hatte zuvor alle Bilder auf 256x256 skaliert, so dass ich mich nicht um den Scheck kümmerte. – TravisJ

+0

@TravisJ Ich bin mir nicht sicher, 'check_size' überprüft die Anzahl der Kanäle, AFAIK prüft nur die Breite und Höhe, aber ich könnte mich irren. – Shai

+0

Ich nahm an, die Größe wäre Breite x Höhe x Tiefe (d. H. Anzahl der Kanäle) ... aber ich könnte falsch liegen ... sehr neu zu caffe. – TravisJ

Verwandte Themen