2017-09-18 7 views
-1

J'utilise la couche hdf5 pour la classification vidéo (C3D). Ceci est mon code pour générer un fichier hdf5Classification vidéo utilisant HDF5 dans CAFFE?

import h5py 
import numpy as np 
import skvideo.datasets 
import skvideo.io 

videodata = skvideo.io.vread('./v_ApplyEyeMakeup_g01_c01.avi') 
videodata=videodata.transpose(3,0,1,2) # To chanelxdepthxhxw 
videodata=videodata[None,:,:,:] 

with h5py.File('./data.h5','w') as f: 
    f['data'] = videodata 
    f['label'] = 1 

Maintenant, le data.h5 est enregistré dans le fichier video.list. J'effectue la classification en fonction de la prototxt

layer { 
    name: "data" 
    type: "HDF5Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    hdf5_data_param { 
    source: "./video.list" 
    batch_size: 1 
    shuffle: true 
    } 
} 
layer { 
    name: "conv1a" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1a" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 32 
    pad: 1 
    kernel_size: 3 
    stride: 1 
    weight_filler { 
     type: "msra" 
    } 
    bias_filler { 
     type: "constant" 
     value: -0.1 
    } 
    axis: 1 
    } 
} 
layer { 
    name: "fc8" 
    type: "InnerProduct" 
    bottom: "conv1a" 
    top: "fc8" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 101 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "fc8" 
    bottom: "label" 
    top: "loss" 
} 

Cependant, je suis l'erreur comme

I0918 22:29:37.163431 32197 hdf5.cpp:35] Datatype class: H5T_INTEGER 
F0918 22:29:37.164500 32197 blob.hpp:122] Check failed: axis_index < num_axes() (1 vs. 1) axis 1 out of range for 1-D Blob with shape 6 (6) 

Mise à jour: Quand je change le code comme f['label'] = 1, j'ai aussi eu l'erreur F0918 23:04:39.884270 2138 hdf5.cpp:21] Check failed: ndims >= min_dim (0 vs. 1) Comment dois-je fixer il? Je suppose que la partie génératrice hdf5 a une erreur dans le champ label. Merci à tous

Répondre

0
  1. S'il vous plaît lire attentivement la réponse que vous linked:
    Votre label doit être un entier et non un vecteur 1-chaud.

  2. Il semble que votre data soit de type entier. Je suppose que vous souhaitez le convertir en np.float32. Et pendant que vous y êtes, pensez à soustraire la moyenne.

  3. Étant donné que votre fichier HDF5 n'a qu'un seul échantillon, vous ne pouvez pas avoir label en tant que scalaire ("0 dim array"). Vous devez créer label en tant que np.ones((1,1), dtype=np.float32).
    Utilisez h5ls ./data.h5 pour vérifier que label est en effet un tableau et non un scalaire.

+0

Merci, Shai. Bien sûr, je vérifie l'étiquette comme 'label = 1' avant et j'ai l'erreur' Check failed: ndims> = min_dim (0 vs. 1) '. Laissez voir ma question de mise à jour – user8264

+0

@ user8264 s'il vous plaît voir mon edit. – Shai

+1

Vous avez raison. Cela a fonctionné maintenant. Merci beaucoup. Qu'est-ce qui se passe si j'ai 6 étiquettes. Par exemple, vidéo 1-> label 1, video2-> label 2 et ainsi de suite – user8264