人脸识别中的假阳性问题

3
我有一个针对Mark Ruffalo的图像(裁剪后的脸部)进行训练的CNN。我有大约200张正面图像和200个随机脸部的负数据点。
该模型具有很高的召回率,但精度非常低。我该如何提高精度?此外,我的正面图像数量受到限制。在这种权衡中,我愿意牺牲召回率。
我尝试增加负样本数,但这会引入一种偏见,使模型开始将所有内容分类为负以达到局部最优解。
我基于overfeat构建了我的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个回答

1
尝试使用CNN的原始输出而不是对输出节点进行sign()运算(因为它是正负类,我假设只有一个输出在范围[-1,1]内)。
例如,对于一个样本,输出可能是[0.9],表示应选择正类。但是,如果您调整这些值,您可以找到一个特定的threshold值,希望它能给您所需的精度。换句话说,如果您发现任何大于[-0.35]的东西实际上应该被选择为正类,因为它给出了更好的精度,则-0.35应该是您的threshold值。
这就是 ROC分析派上用场的地方。
请告诉我这是否有所帮助。

我确实有一个连续范围的输出。问题在于这种理想情况并没有得到遵循。无论如何,无法区分假阳性和真阳性(就每个类别的功能值而言)。 - midi
在这种情况下,似乎是特征提取的问题。您需要更好的面部图像表示。做PCA很容易,并且有很多文档可以参考。如果图像中有受控照明并且姿势和面部表情变化很小,则它是一个很好的选择。您尝试过吗?用于人脸识别的PCA也称为“特征脸”。您目前正在进行任何特征提取/表示吗? - Pablo Rivas
我尝试了Fisherfaces和LBP。如果不对齐面部,它们会失败得很惨。但是,在对齐之后,同样存在误报的问题! - midi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接