Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Computer vision 基于lmdb的caffe多标签人脸区域分类训练_Computer Vision_Neural Network_Deep Learning_Caffe_Conv Neural Network - Fatal编程技术网

Computer vision 基于lmdb的caffe多标签人脸区域分类训练

Computer vision 基于lmdb的caffe多标签人脸区域分类训练,computer-vision,neural-network,deep-learning,caffe,conv-neural-network,Computer Vision,Neural Network,Deep Learning,Caffe,Conv Neural Network,我使用两个lmdb输入来识别人脸的眼睛、鼻尖和嘴巴区域。数据lmdb的维度为Nx3xHxW,而标签lmdb的维度为Nx1xH/4xW/4。标签图像是通过在opencv Mat上使用数字1-4屏蔽区域创建的,opencv Mat已初始化为所有0(因此总共有5个标签,0为背景标签)。我将标签图像的宽度和高度缩小为相应图像的1/4,因为我的网络中有两个池层。这种降尺度确保标签图像尺寸与最后一个卷积层的输出相匹配 My train_val.txt: name: "facial_keypoints" la

我使用两个lmdb输入来识别人脸的眼睛、鼻尖和嘴巴区域。数据lmdb的维度为
N
x3x
H
x
W
,而标签lmdb的维度为
N
x1x
H
/4x
W
/4。标签图像是通过在opencv Mat上使用数字1-4屏蔽区域创建的,opencv Mat已初始化为所有0(因此总共有5个标签,0为背景标签)。我将标签图像的宽度和高度缩小为相应图像的1/4,因为我的网络中有两个池层。这种降尺度确保标签图像尺寸与最后一个卷积层的输出相匹配

My train_val.txt:

name: "facial_keypoints"
layer {
name: "images"
type: "Data"
top: "images"
include {
phase: TRAIN
}
transform_param {
mean_file: "../mean.binaryproto"
}
data_param {
source: "../train_lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "labels"
type: "Data"
top: "labels"
include {
phase: TRAIN
}
data_param {
source: "../train_label_lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "images"
type: "Data"
top: "images"
include {
phase: TEST
}
transform_param {
mean_file: "../mean.binaryproto"
}
data_param {
source: "../test_lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "labels"
type: "Data"
top: "labels"
include {
phase: TEST
}
data_param {
source: "../test_label_lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "images"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 32
pad: 2
kernel_size: 5
stride: 1
weight_filler {
type: "gaussian"
std: 0.0001
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "pool1"
top: "pool1"
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 64
pad: 2
kernel_size: 5
stride: 1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: AVE
kernel_size: 3
stride: 2
}
}
layer {
name: "conv_last"
type: "Convolution"
bottom: "pool2"
top: "conv_last"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 5
pad: 2
kernel_size: 5
stride: 1
weight_filler {
#type: "xavier"
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv_last"
top: "conv_last"
}

layer {
name: "accuracy"
type: "Accuracy"
bottom: "conv_last"
bottom: "labels"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "conv_last"
bottom: "labels"
top: "loss"
}
在最后一个卷积层中,我将输出大小设置为5,因为我有5个标签类。训练收敛,最终损失约为0.3,精度为0.9(尽管一些来源表明,对于多标签,该精度没有正确测量)。当使用经过训练的模型时,输出层正确地生成了一个尺寸为1x5x
H
/4x
W
/4的水滴,我设法将其可视化为5个单独的单通道图像。然而,虽然第一幅图像正确地高亮显示了背景像素,但其余4幅图像看起来几乎相同,所有4个区域都高亮显示

5个输出通道的可视化(强度从蓝色增加到红色):

原始图像(同心圆标记了每个通道的最高强度。一些通道更大,只是为了区别其他通道。正如您在背景之外看到的,其他通道在几乎相同的口腔区域具有最高的激活率,但不应如此。)

有人能帮我找出我犯的错误吗


谢谢。

看起来你正在面对:大多数标记的像素都标记为0(背景),因此,在训练过程中,网络学习预测背景,几乎不管它“看到”什么。由于预测背景在大多数情况下都是正确的,因此训练损失会减少,精确度会提高到某一点。
然而,当您实际尝试可视化输出预测时,它主要是背景,几乎没有关于其他稀缺标签的信息


在caffe中,解决类别不平衡的一种方法是使用调整了权重的图层,以抵消标签不平衡的影响。

看起来您面临的问题是:大多数标记的像素都标记为0(背景),因此,在训练期间,网络学习预测背景,几乎不管它“看到”什么。由于预测背景在大多数情况下都是正确的,因此训练损失会减少,精确度会提高到某一点。
然而,当您实际尝试可视化输出预测时,它主要是背景,几乎没有关于其他稀缺标签的信息


在caffe中,解决类别不平衡的一种方法是使用调整了权重的图层来抵消标签的不平衡。

在新人脸图像上运行训练模型时,您是否运行“Softmax”图层?您好@Shai,是的,我在运行训练模型时使用了Softmax,对吗?(1)如果您使用
Softmax WithLoss
进行训练,则部署协议中应包含
Softmax
。因此,在这方面你是正确的。(2) 但是,如果您查看的是softmax输出,那么为什么对于相同的像素,所有4个标签都“高亮显示”?潜在的可能性是什么?你的模特可能只学会分辨背景吗?你的训练图像中有90%的背景吗?在这种情况下,不断输出“背景”将给你90%的准确度…@Shai you是对的图像主要有背景,即脸的其他部分。但若我是正确的,精确度在训练中并没有发挥作用,它只在训练的测试阶段显示出来。这是神经网络试图通过考虑预测像素标签和地面真值标签之间的差异来最小化的损失。因此,大多数像素可能被标记为背景。尽管如此,我希望这4个标签的输出至少会有一些变化,但实际上它们看起来几乎一样。请查看最新发布的示例输出图片。@Shai很抱歉您是正确的。在我尝试将标签区域变大,使标签的总面积几乎等于背景面积之后,对于不同的通道,输出显示了不同的结果。谢谢!在新人脸图像上运行训练模型时,您是否运行“Softmax”层?您好@Shai,是的,我在运行训练模型时使用了Softmax,对吗?(1)如果您使用
SoftmaxWithLoss
进行训练,则部署协议中应包含
Softmax
。因此,在这方面你是正确的。(2) 但是,如果您查看的是softmax输出,那么为什么对于相同的像素,所有4个标签都“高亮显示”?潜在的可能性是什么?你的模特可能只学会分辨背景吗?你的训练图像中有90%的背景吗?在这种情况下,不断输出“背景”将给你90%的准确度…@Shai you是对的图像主要有背景,即脸的其他部分。但若我是正确的,精确度在训练中并没有发挥作用,它只在训练的测试阶段显示出来。这是神经网络试图通过考虑预测像素标签和地面真值标签之间的差异来最小化的损失。因此,大多数像素可能被标记为背景。尽管如此,我希望这4个标签的输出至少会有一些变化,但实际上它们看起来几乎一样。请查看最新发布的示例输出图片。@Shai很抱歉您是正确的。在我尝试将标签区域变大,使标签的总面积几乎等于背景面积之后,对于dif,输出显示了不同的结果