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 ou . 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_logtostderr indicateur GLOG_logtostderr est défini sur 1 avant d' appeler convert_imageset indique le mécanisme de journalisation pour rediriger les messages de journal vers stderr.
  • --resize_height et --resize_width redimensionnent toutes les images d'entrée de la même taille 200x200 .
  • --shuffle change 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_imageset sinon vous aurez un message d'erreur effrayant.

Autres indicateurs pouvant être utiles:

  • --backend - vous permet de choisir entre un lmdb données levelDB ou levelDB .
  • --gray - convertit toutes les images en --gray de gris.
  • --encoded et --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 .
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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow