2

我正在根据这里的开源进行年龄分类 python 代码有

age_net_pretrained='./age_net.caffemodel'
age_net_model_file='./deploy_age.prototxt'
age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
       channel_swap=(2,1,0),
       raw_scale=255,
       image_dims=(256, 256))

其中.prototxt文件如下所示。我保留一个文件,即".caffemodel". 作为源代码,他之前提供过。但是,我想根据我的人脸数据库再次创建它。你能有任何教程或一些方法来创建它吗?我假设我有一个文件夹图像,其中包含 100 个图像并划分属于每个年龄组(1 到 1),例如

image1.png 1
image2.png 1
..
image10.png 1
image11.png 2
image12.png 2
...
image100.png 10

这是 prototxt 文件。提前致谢

name: "CaffeNet"
input: "data"
input_dim: 1
input_dim: 3
input_dim: 227
input_dim: 227
layers {
  name: "conv1"
  type: CONVOLUTION
  bottom: "data"
  top: "conv1"
  convolution_param {
    num_output: 96
    kernel_size: 7
    stride: 4
  }
}
layers {
  name: "relu1"
  type: RELU
  bottom: "conv1"
  top: "conv1"
}
layers {
  name: "pool1"
  type: POOLING
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layers {
  name: "norm1"
  type: LRN
  bottom: "pool1"
  top: "norm1"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layers {
  name: "conv2"
  type: CONVOLUTION
  bottom: "norm1"
  top: "conv2"
  convolution_param {
    num_output: 256
    pad: 2
    kernel_size: 5
  }
}
layers {
  name: "relu2"
  type: RELU
  bottom: "conv2"
  top: "conv2"
}
layers {
  name: "pool2"
  type: POOLING
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layers {
  name: "norm2"
  type: LRN
  bottom: "pool2"
  top: "norm2"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layers {
  name: "conv3"
  type: CONVOLUTION
  bottom: "norm2"
  top: "conv3"
  convolution_param {
    num_output: 384
    pad: 1
    kernel_size: 3
  }
}
layers{
  name: "relu3" 
  type: RELU
  bottom: "conv3"
  top: "conv3"
}
layers {
  name: "pool5"
  type: POOLING
  bottom: "conv3"
  top: "pool5"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layers {
  name: "fc6"
  type: INNER_PRODUCT
  bottom: "pool5"
  top: "fc6"
  inner_product_param {
    num_output: 512
  }
}
layers {
  name: "relu6"
  type: RELU
  bottom: "fc6"
  top: "fc6"
}
layers {
  name: "drop6"
  type: DROPOUT
  bottom: "fc6"
  top: "fc6"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layers {
  name: "fc7"
  type: INNER_PRODUCT
  bottom: "fc6"
  top: "fc7"
  inner_product_param {
    num_output: 512
  }
}
layers {
  name: "relu7"
  type: RELU
  bottom: "fc7"
  top: "fc7"
}
layers {
  name: "drop7"
  type: DROPOUT
  bottom: "fc7"
  top: "fc7"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layers {
  name: "fc8"
  type: INNER_PRODUCT
  bottom: "fc7"
  top: "fc8"
  inner_product_param {
    num_output: 8
  }
}
layers {
  name: "prob"
  type: SOFTMAX
  bottom: "fc8"
  top: "prob"
}
4

1 回答 1

5

要获得 caffemodel,您需要训练网络。该 prototxt 文件仅用于部署模型,不能用于训练它。

您需要添加一个指向数据库的数据层。要使用您提到的文件列表,图层的来源应该是 HDF5。您可能想要添加一个带有平均值的 transform_param。为了提高效率,图像文件可以替换为 LMDB 或 LevelDB 数据库。

在网络的末端,您将不得不用“损失”层替换“概率”层。像这样的东西:

层{名称:“损失”类型:SoftmaxWithLoss底部:“fc8”顶部:“损失”}

图层目录可以在这里找到:

http://caffe.berkeleyvision.org/tutorial/layers.html

或者,由于您的网络是众所周知的……只需查看本教程:P。

http://caffe.berkeleyvision.org/gathered/examples/imagenet.html

用于训练的正确 prototxt 文件包含在 caffe ('train_val.prototxt') 中。

于 2015-06-21T16:23:48.903 回答