在 CAFFE 中使用 HDF5 进行视频分类?

Posted

技术标签:

【中文标题】在 CAFFE 中使用 HDF5 进行视频分类?【英文标题】:Video classification using HDF5 in CAFFE? 【发布时间】:2018-02-27 01:53:21 【问题描述】:

我正在使用 hdf5 层进行视频分类 (C3D)。这是我生成 hdf5 文件的代码

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

现在,data.h5 保存在文件 video.list 中。我根据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"

但是,我得到了错误

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)

更新:当我将代码更改为f['label'] = 1 时,我也收到错误F0918 23:04:39.884270 2138 hdf5.cpp:21] Check failed: ndims &gt;= min_dim (0 vs. 1) 我应该如何解决它?我猜 hdf5 生成部分在标签字段中有一些错误。谢谢大家

【问题讨论】:

【参考方案1】:

    仔细阅读你的答案linked: 您的 label 应该是一个整数,并且不是一个 1-hot 向量。

    您的data 似乎是整数类型。我想你想把它转换成np.float32。当你在做的时候,考虑减去平均值。

    由于您的 HDF5 文件只有一个样本,因此您不能将 label 作为标量(“0 dim array”)。您需要将label 设为np.ones((1,1), dtype=np.float32)。 使用h5ls ./data.h5 验证label 确实是一个数组而不是一个标量。

【讨论】:

谢谢,谢。当然,我之前检查标签为label=1,我得到了错误Check failed: ndims &gt;= min_dim (0 vs. 1) 。让我们看看我的更新问题 你是对的。它现在起作用了。非常感谢。如果我有 6 个标签会发生什么。比如视频1->标签1、视频2->标签2等等

以上是关于在 CAFFE 中使用 HDF5 进行视频分类?的主要内容,如果未能解决你的问题,请参考以下文章

计算用于咖啡分类的HDF5数据集的平均值

使用 Caffe 训练数据集时多次加载 HDF5 文件

使用 hdf5 作为 caffe 输入,错误:HDF5Data 不转换数据

Caffe:将 CSV 文件转换为 HDF5

使用caffe的HDF5数据完成回归任务

Caffe 编译时没有看到 hdf5.h