caffe
Préparer des données pour la formation
Recherche…
Préparer un dataset d'image pour une tâche de classification d'image
Caffe possède une couche d’entrée intégrée adaptée aux tâches de classification des images (c.-à-d. Une seule étiquette entière par image d’entrée). Cette couche d'entrée "Data" est construite sur une structure de données lmdb ou leveldb . Pour utiliser "Data" couche "Data" , il faut construire la structure de données avec toutes les données de formation.
Un guide rapide de convert_imageset de Caffe
Construire
La première chose à faire est de créer les outils de caffe et de caffe (convert_imageset est l’un de ces outils). Après avoir installé caffe et
make ing - il que vous avez exécuté make tools des make tools aussi bien. Vérifiez qu'un fichier binaire
convert_imageset est créé dans $CAFFE_ROOT/build/tools . Préparez vos données
Images: placez toutes les images dans un dossier (je l'appellerai ici/path/to/jpegs/ ). Étiquettes: créez un fichier texte (par exemple,
/path/to/labels/train.txt ) avec une ligne par image d'entrée <path / to / file>. Par exemple: img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0
Dans cet exemple, la première image est étiquetée 1 tandis que les deux autres sont étiquetées 0 .
Convertir le jeu de données
Exécuter le binaire en shell~$ GLOG_logtostderr=1 $CAFFE_ROOT/build/tools/convert_imageset \
--resize_height=200 --resize_width=200 --shuffle \
/path/to/jpegs/ \
/path/to/labels/train.txt \
/path/to/lmdb/train_lmdb
Ligne de commande expliquée:
-
GLOG_logtostderrindicateurGLOG_logtostderrest défini sur 1 avant d' appelerconvert_imagesetindique le mécanisme de journalisation pour rediriger les messages de journal vers stderr. -
--resize_heightet--resize_widthredimensionnent toutes les images d'entrée de la même taille200x200. -
--shufflechange aléatoirement l'ordre des images et ne conserve pas la commande dans le fichier/path/to/labels/train.txt. - Vous trouverez ci-dessous le chemin d'accès au dossier images, au fichier texte des étiquettes et au nom de la sortie. Notez que le nom de sortie ne doit pas exister avant d'appeler
convert_imagesetsinon vous aurez un message d'erreur effrayant.
Autres indicateurs pouvant être utiles:
-
--backend- vous permet de choisir entre unlmdbdonnéeslevelDBoulevelDB. -
--gray- convertit toutes les images en--grayde gris. -
--encodedet--encoded_type- conservent les données d'image sous forme compressée (jpg / png) compressée dans la base de données. -
--help- affiche de l'aide, voir tous les indicateurs pertinents sous Drapeaux à partir d'outils / convert_imageset.cpp
Vous pouvez consulter $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh pour un exemple d'utilisation de convert_imageset .
voir ce fil pour plus d'informations.
Préparer des données arbitraires au format HDF5
En plus des jeux de données de classification des images , Caffe possède également une couche "HDF5Data" pour les entrées arbitraires. Cette couche nécessite que toutes les données de formation / validation soient stockées dans des fichiers au format hdf5 .
Cet exemple montre comment utiliser le module python h5py pour construire un tel fichier hdf5 et comment configurer la couche "HDF5Data" caffe pour lire ce fichier.
Construisez le fichier binaire hdf5
En supposant que vous avez un fichier texte'train.txt' avec chaque ligne avec un nom de fichier image et un seul nombre à virgule flottante à utiliser comme cible de régression. import h5py, os
import caffe
import numpy as np
SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' )
y = np.zeros( (1,len(lines)), dtype='f4' )
for i,l in enumerate(lines):
sp = l.split(' ')
img = caffe.io.load_image( sp[0] )
img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
# you may apply other input transformations here...
# Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
X[i] = img
y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
L.write( 'train.h5' ) # list all h5 files you are going to use
Configuration de la couche "HDF5Data"
Une fois que vous avez tous les fichiers h5 et les fichiers de test correspondants, vous pouvez ajouter une couche d'entrée HDF5 à votre train_val.prototxt : layer {
type: "HDF5Data"
top: "X" # same name as given in create_dataset!
top: "y"
hdf5_data_param {
source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
batch_size: 32
}
include { phase:TRAIN }
}
Vous pouvez trouver plus d'informations ici et ici .
Comme indiqué ci-dessus, nous transmettons à Caffe une liste de fichiers HDF5. En effet, dans la version actuelle, il existe une limite de taille de 2 Go pour un seul fichier de données HDF5. Donc, si les données d'entraînement dépassent 2 Go, nous devrons les diviser en fichiers séparés.
Si un seul fichier de données HDF5 dépasse 2 Go, nous recevrons un message d'erreur tel que
Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX
Si la quantité totale de données est inférieure à 2 Go, devons-nous diviser les données en fichiers séparés ou non?
Selon un commentaire du code source de Caffe , un seul fichier serait préférable,
Si shuffle == true, l'ordre des fichiers HDF5 est mélangé et l'ordre des données dans un fichier HDF5 donné est mélangé, mais les données entre différents fichiers ne sont pas entrelacées.