VGGFace implementation with Keras Framework
Switch branches/tags
Clone or download
Latest commit 1d1ad39 Mar 26, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github add issue template Dec 7, 2017
image new version Dec 7, 2017
keras_vggface Update utils.py Jan 15, 2018
visualize add network visualizations Dec 7, 2017
.gitignore add network visualizations Dec 7, 2017
.travis.yml fix setup travis Dec 7, 2017
LICENSE.txt add licence Oct 17, 2016
README.md Update README.md Jan 15, 2018
setup.py Make tensorflow be optional to allow using tensorflow-gpu Feb 6, 2018
test.py Update test.py Mar 26, 2018

README.md

keras-vggface Build Status

Oxford VGGFace Implementation using Keras Functional Framework v2+

  • Models are converted from original caffe networks.
  • It supports only Tensorflow backend.
  • You can also load only feature extraction layers with VGGFace(include_top=False) initiation.
  • When you use it for the first time , weights are downloaded and stored in ~/.keras/models/vggface folder.
pip install keras_vggface

News

  • Models that mentioned in the new paper are added. SENET50 is not working for now.

  • Label names are available now (Check the prediction code).

Library Versions

  • Keras v2.1.1
  • Tensorflow v1.4
  • Warning: Theano backend is not supported/tested for now.

Example Usage

Available Models

from keras_vggface.vggface import VGGFace

# Based on VGG16 architecture -> old paper(2015)
vggface = VGGFace(model='vgg16') # or VGGFace() as default

# Based on RESNET50 architecture -> new paper(2017)
vggface = VGGFace(model='resnet50')

# Based on SENET50 architecture -> new paper(2017)
vggface = VGGFace(model='senet50')

Feature Extraction

  • Convolution Features

    from keras.engine import  Model
    from keras.layers import Input
    from keras_vggface.vggface import VGGFace
    
    # Convolution Features
    vgg_features = VGGFace(include_top=False, input_shape=(224, 224, 3), pooling='avg') # pooling: None, avg or max
    
    # After this point you can use your model to predict.
    # ...
    
  • Specific Layer Features

    from keras.engine import  Model
    from keras.layers import Input
    from keras_vggface.vggface import VGGFace
    
    # Layer Features
    layer_name = 'layer_name' # edit this line
    vgg_model = VGGFace() # pooling: None, avg or max
    out = vgg_model.get_layer(layer_name).output
    vgg_model_new = Model(vgg_model.input, out)
    
    # After this point you can use your model to predict.
    # ...
    

Finetuning

  • VGG16

    from keras.engine import  Model
    from keras.layers import Flatten, Dense, Input
    from keras_vggface.vggface import VGGFace
    
    #custom parameters
    nb_class = 2
    hidden_dim = 512
    
    vgg_model = VGGFace(include_top=False, input_shape=(224, 224, 3))
    last_layer = vgg_model.get_layer('pool5').output
    x = Flatten(name='flatten')(last_layer)
    x = Dense(hidden_dim, activation='relu', name='fc6')(x)
    x = Dense(hidden_dim, activation='relu', name='fc7')(x)
    out = Dense(nb_class, activation='softmax', name='fc8')(x)
    custom_vgg_model = Model(vgg_model.input, out)
    
    # Train your model as usual.
    # ...
  • RESNET50 or SENET50

    from keras.engine import  Model
    from keras.layers import Flatten, Dense, Input
    from keras_vggface.vggface import VGGFace
    
    #custom parameters
    nb_class = 2
    
    vgg_model = VGGFace(include_top=False, input_shape=(224, 224, 3))
    last_layer = vgg_model.get_layer('avg_pool').output
    x = Flatten(name='flatten')(last_layer)
    out = Dense(nb_class, activation='softmax', name='classifier')(x)
    custom_vgg_model = Model(vgg_model.input, out)
    
    # Train your model as usual.
    # ...

Prediction

  • Use utils.preprocess_input(x, version=1) for VGG16

  • Use utils.preprocess_input(x, version=2) for RESNET50 or SENET50

    import numpy as np
    from keras.preprocessing import image
    from keras_vggface.vggface import VGGFace
    from keras_vggface import utils
    
    # tensorflow
    model = VGGFace() # default : VGG16 , you can use model='resnet50' or 'senet50'
    
    # Change the image path with yours.
    img = image.load_img('../image/ajb.jpg', target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = utils.preprocess_input(x, version=1) # or version=2
    preds = model.predict(x)
    print('Predicted:', utils.decode_predictions(preds))

References

Licence

  • Check Oxford Webpage for the license of the original models.

  • The code that provided in this project is under MIT License.

Projects

  • If you find this project useful, please include reference link in your work.

  • You can create PR's to this document with your project/blog link.