面部识别的误报

时间:2015-07-02 14:37:55

标签: image-processing face-recognition torch conv-neural-network

我在马克·鲁法洛(Mark Ruffalo)的图像(裁剪面孔)上训练了CNN。对于我的正面课,我有大约200张图像,对于负数据点,我已经采样了200个随机面。

该型号具有高召回率但精度非常低。我怎么能提高精度呢?我也受到我所拥有的正面图像数量的限制。我准备在这次权衡中妥协回忆。

我尝试增加负面样本的数量,但这引入了一种偏见,模型开始将所有内容归类为负面以获得局部最优。

我的CNN基于过度使用:

local features = nn.Sequential()

features:add(nn.SpatialConvolutionMM(3, 96, 11, 11))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

features:add(nn.SpatialConvolutionMM(96, 256, 5, 5))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

features:add(nn.SpatialConvolutionMM(256, 512, 3, 3))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

-- 24x24x512
features:add(nn.SpatialConvolutionMM(512, 1024, 3, 3))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

--11x11x1024
features:add(nn.SpatialConvolutionMM(1024, 1024, 3, 3))
features:add(nn.ReLU())
features:add(nn.SpatialMaxPooling(2, 2, 2, 2))

-- 1.3. Create Classifier (fully connected layers)
local classifier = nn.Sequential()
classifier:add(nn.View(1024*4*4))
classifier:add(nn.Dropout(0.5))
classifier:add(nn.Linear(1024*4*4, 3072))
classifier:add(nn.Threshold(0, 1e-6))

classifier:add(nn.Dropout(0.5))
classifier:add(nn.Linear(3072, 4096))
classifier:add(nn.Threshold(0, 1e-6))

classifier:add(nn.Linear(4096, noutputs))




model = nn.Sequential():add(features):add(classifier)

请帮助

1 个答案:

答案 0 :(得分:1)

尝试使用CNN的原始输出而不是取输出节点的sign()(因为它是正负类,我假设在[-1,1]范围内只有一个输出)。

例如,对于一个样本,输出可以是[0.9],表示应该选择正类。但是如果你使用这个值,你可以找到一个特定的threshold值,希望,它可以为你提供所需的精度。换句话说,如果您发现实际上应该选择大于[-0.35]的任何内容作为正类,因为它会给您更好的精确度,那么-0.35应该是您的threshold值。

这是ROC analysis派上用场的地方。

如果有帮助,请告诉我。