【问题标题】:Python: pre-trained VGG-face model for face anti-spoofing problemPython:用于人脸反欺骗问题的预训练 VGG 人脸模型
【发布时间】:2019-03-31 08:33:23
【问题描述】:

我正在尝试通过使用预训练模型(例如,在 ImageNet 上训练的 VGG)来解决人脸反欺骗问题。我需要在哪里检索功能?在哪一层之后?更具体地说,将最后一个全连接层的输出从 2622 更改为 2 是否足以像面对反欺骗问题一样,我们有两个类(真/假)?

实际上,在人脸反欺骗问题中使用预训练的 VGG 人脸模型(在 ImageNet 上训练)是否有效?请任何教程或 GitHub 代码帮助我在 Python 中实现这一目标?

【问题讨论】:

    标签: python tensorflow keras pre-trained-model vgg-net


    【解决方案1】:

    回答可能为时已晚,但迟到总比没有好。

    样本太少或太多取决于您的数据集。通常,当您的数据量有限和/或希望在提取样本的大部分特征以获得更高准确性的同时避免过度拟合时,建议使用预训练模型。 如果您使用 Keras,请尝试使用 VGG16:

    conv_net = VGG16(weights="imagenet", 
                     include_top=False,
                     input_shape=(150, 150, 3)) # Change the shape accordingly
    

    它为您提供了这样的层堆栈:

    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_1 (InputLayer)         (None, 150, 150, 3)       0         
    _________________________________________________________________
    block1_conv1 (Conv2D)        (None, 150, 150, 64)      1792      
    _________________________________________________________________
    block1_conv2 (Conv2D)        (None, 150, 150, 64)      36928     
    _________________________________________________________________
    block1_pool (MaxPooling2D)   (None, 75, 75, 64)        0         
    _________________________________________________________________
    block2_conv1 (Conv2D)        (None, 75, 75, 128)       73856     
    _________________________________________________________________
    block2_conv2 (Conv2D)        (None, 75, 75, 128)       147584    
    _________________________________________________________________
    block2_pool (MaxPooling2D)   (None, 37, 37, 128)       0         
    _________________________________________________________________
    block3_conv1 (Conv2D)        (None, 37, 37, 256)       295168    
    _________________________________________________________________
    block3_conv2 (Conv2D)        (None, 37, 37, 256)       590080    
    _________________________________________________________________
    block3_conv3 (Conv2D)        (None, 37, 37, 256)       590080    
    _________________________________________________________________
    block3_pool (MaxPooling2D)   (None, 18, 18, 256)       0         
    _________________________________________________________________
    block4_conv1 (Conv2D)        (None, 18, 18, 512)       1180160   
    _________________________________________________________________
    block4_conv2 (Conv2D)        (None, 18, 18, 512)       2359808   
    _________________________________________________________________
    block4_conv3 (Conv2D)        (None, 18, 18, 512)       2359808   
    _________________________________________________________________
    block4_pool (MaxPooling2D)   (None, 9, 9, 512)         0         
    _________________________________________________________________
    block5_conv1 (Conv2D)        (None, 9, 9, 512)         2359808   
    _________________________________________________________________
    block5_conv2 (Conv2D)        (None, 9, 9, 512)         2359808   
    _________________________________________________________________
    block5_conv3 (Conv2D)        (None, 9, 9, 512)         2359808   
    _________________________________________________________________
    block5_pool (MaxPooling2D)   (None, 4, 4, 512)         0         
    =================================================================
    Total params: 14,714,688
    Trainable params: 14,714,688
    Non-trainable params: 0
    

    要使用此模型,您有两种选择,一种是仅使用此模型提取特征并将其保存在磁盘上,然后在下一步创建密集连接层并将上一步的输出提供给模型。这种方法比我要解释的下一个方法快得多,但唯一的缺点是你不能使用数据增强。这是使用conv_netpredict 方法提取特征的方法:

    features_batch = conv_base.predict(inputs_batch)
    # Save the features in a tensor and feed them to the Dense Layer after all has been extracted
    

    第二种选择是将密集连接模型附加到 VGG 模型的顶部,冻结conv_net 层并将数据正常输入网络,这样您就可以使用数据增强,但只有在您有权访问时才使用它到强大的 GPU 或云。下面是如何在 VGG 之上冻结和连接 Dense 层的代码:

    #codes adopted from "Deep Learning with Python" book
    from keras import models
    from keras import layers
    conv_base.trainable = False
    model = models.Sequential()
    model.add(conv_base)
    model.add(layers.Flatten())
    model.add(layers.Dense(256, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    

    您甚至可以通过解冻conv_net 的一层来微调模型以适应您的数据。以下是如何冻结除一层以外的所有层:

    conv_base.trainable = True
    set_trainable = False
    for layer in conv_base.layers:
        if layer.name == 'block5_conv1':
            set_trainable = True
        if set_trainable:
            layer.trainable = True
        else:
            layer.trainable = False
    # your model like before
    

    希望它可以帮助您入门。

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 1970-01-01
      • 2019-10-30
      • 2018-06-30
      • 2014-06-04
      • 2021-10-30
      • 2020-11-30
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多