face_verification.recognition package

Submodules

face_verification.recognition.recognition module

Contains the code related for face recognition/verification.

class face_verification.recognition.recognition.DefaultMTCNN[source]

Bases: facenet_pytorch.models.mtcnn.MTCNN

Default MTCNN with predefined parameters, not meant to be called directly.

face_verification.recognition.recognition.display_image(img: Union[PIL.Image.Image, numpy.ndarray], ax: Optional = None) → None[source]

Displays PIL image, optionally can be used to stack images together

Parameters
  • img (PIL Image) – Image to be displayed.

  • ax ([Axes], optional) – Axes from the previous plt call to stack together. Defaults to None.

face_verification.recognition.recognition.extract_face(img: Union[numpy.ndarray, PIL.Image.Image], mtcnn=DefaultMTCNN( (pnet): PNet( (conv1): Conv2d(3, 10, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=10) (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(10, 16, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=16) (conv3): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1)) (prelu3): PReLU(num_parameters=32) (conv4_1): Conv2d(32, 2, kernel_size=(1, 1), stride=(1, 1)) (softmax4_1): Softmax(dim=1) (conv4_2): Conv2d(32, 4, kernel_size=(1, 1), stride=(1, 1)) ) (rnet): RNet( (conv1): Conv2d(3, 28, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=28) (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(28, 48, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=48) (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv3): Conv2d(48, 64, kernel_size=(2, 2), stride=(1, 1)) (prelu3): PReLU(num_parameters=64) (dense4): Linear(in_features=576, out_features=128, bias=True) (prelu4): PReLU(num_parameters=128) (dense5_1): Linear(in_features=128, out_features=2, bias=True) (softmax5_1): Softmax(dim=1) (dense5_2): Linear(in_features=128, out_features=4, bias=True) ) (onet): ONet( (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=32) (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=64) (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1)) (prelu3): PReLU(num_parameters=64) (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True) (conv4): Conv2d(64, 128, kernel_size=(2, 2), stride=(1, 1)) (prelu4): PReLU(num_parameters=128) (dense5): Linear(in_features=1152, out_features=256, bias=True) (prelu5): PReLU(num_parameters=256) (dense6_1): Linear(in_features=256, out_features=2, bias=True) (softmax6_1): Softmax(dim=1) (dense6_2): Linear(in_features=256, out_features=4, bias=True) (dense6_3): Linear(in_features=256, out_features=10, bias=True) ) )) → PIL.Image.Image[source]

Extracts the bounding box containing only the first face and return a crop of only that face.

Returns

shape 160,160,3

Return type

PIL Image

face_verification.recognition.recognition.get_embedding(image: Union[numpy.ndarray, PIL.Image.Image], model, mtcnn=DefaultMTCNN( (pnet): PNet( (conv1): Conv2d(3, 10, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=10) (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(10, 16, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=16) (conv3): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1)) (prelu3): PReLU(num_parameters=32) (conv4_1): Conv2d(32, 2, kernel_size=(1, 1), stride=(1, 1)) (softmax4_1): Softmax(dim=1) (conv4_2): Conv2d(32, 4, kernel_size=(1, 1), stride=(1, 1)) ) (rnet): RNet( (conv1): Conv2d(3, 28, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=28) (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(28, 48, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=48) (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv3): Conv2d(48, 64, kernel_size=(2, 2), stride=(1, 1)) (prelu3): PReLU(num_parameters=64) (dense4): Linear(in_features=576, out_features=128, bias=True) (prelu4): PReLU(num_parameters=128) (dense5_1): Linear(in_features=128, out_features=2, bias=True) (softmax5_1): Softmax(dim=1) (dense5_2): Linear(in_features=128, out_features=4, bias=True) ) (onet): ONet( (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=32) (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=64) (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1)) (prelu3): PReLU(num_parameters=64) (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True) (conv4): Conv2d(64, 128, kernel_size=(2, 2), stride=(1, 1)) (prelu4): PReLU(num_parameters=128) (dense5): Linear(in_features=1152, out_features=256, bias=True) (prelu5): PReLU(num_parameters=256) (dense6_1): Linear(in_features=256, out_features=2, bias=True) (softmax6_1): Softmax(dim=1) (dense6_2): Linear(in_features=256, out_features=4, bias=True) (dense6_3): Linear(in_features=256, out_features=10, bias=True) ) )) → torch.Tensor[source]

Runs the PIL image though the model after preprocessing

Parameters
  • image (Image.Image) – PIL image

  • model (nn.Module) – Pytorch model

  • mtcnn (optional) – Defaults to None.

Returns

[description]

Return type

[type]

face_verification.recognition.recognition.get_model(model_name: str = 'vgg') → torch.nn.modules.module.Module[source]

Return the most up to date model

Returns

Pytorch model set to eval

Return type

nn.Module

face_verification.recognition.recognition.load_image(image: Union[str, numpy.ndarray, PIL.Image.Image]) → numpy.ndarray[source]
face_verification.recognition.recognition.torch_to_np(array: torch.Tensor) → numpy.ndarray[source]
Coverts torch tensor to numpy array, handles the case when torch tensor is

stuck in cuda.

Parameters

array (torch.Tensor) – Pytorch Tensor

Returns

np.ndarray

face_verification.recognition.recognition.verify(img1: Union[PIL.Image.Image, str], img2: Union[PIL.Image.Image, str], model: torch.nn.modules.module.Module, mtcnn: facenet_pytorch.models.mtcnn.MTCNN = DefaultMTCNN( (pnet): PNet( (conv1): Conv2d(3, 10, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=10) (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(10, 16, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=16) (conv3): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1)) (prelu3): PReLU(num_parameters=32) (conv4_1): Conv2d(32, 2, kernel_size=(1, 1), stride=(1, 1)) (softmax4_1): Softmax(dim=1) (conv4_2): Conv2d(32, 4, kernel_size=(1, 1), stride=(1, 1)) ) (rnet): RNet( (conv1): Conv2d(3, 28, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=28) (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(28, 48, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=48) (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv3): Conv2d(48, 64, kernel_size=(2, 2), stride=(1, 1)) (prelu3): PReLU(num_parameters=64) (dense4): Linear(in_features=576, out_features=128, bias=True) (prelu4): PReLU(num_parameters=128) (dense5_1): Linear(in_features=128, out_features=2, bias=True) (softmax5_1): Softmax(dim=1) (dense5_2): Linear(in_features=128, out_features=4, bias=True) ) (onet): ONet( (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1)) (prelu1): PReLU(num_parameters=32) (pool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1)) (prelu2): PReLU(num_parameters=64) (pool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True) (conv3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1)) (prelu3): PReLU(num_parameters=64) (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True) (conv4): Conv2d(64, 128, kernel_size=(2, 2), stride=(1, 1)) (prelu4): PReLU(num_parameters=128) (dense5): Linear(in_features=1152, out_features=256, bias=True) (prelu5): PReLU(num_parameters=256) (dense6_1): Linear(in_features=256, out_features=2, bias=True) (softmax6_1): Softmax(dim=1) (dense6_2): Linear(in_features=256, out_features=4, bias=True) (dense6_3): Linear(in_features=256, out_features=10, bias=True) ) ), dist_fn: str = 'euclidean', plot: bool = True, decision: bool = True) → Union[Tuple[bool, float], float][source]

Compares two images by the distance between their embeddings

Parameters
  • img1 (Union[Image.Image, str]) – Either PIL or path

  • img2 (Union[Image.Image, str]) – Either PIL or path

  • model (nn.Module) – A pytorch model.

  • mtcnn (MTCNN, optional) – User defined MTCNN. Defaults to None.

  • dist_fn (str, optional) – Current opetions are euclidean or cosine. Defaults to “euclidean”.

  • plot (bool, optional) – Matplotlib plot. Defaults to True.

  • decision (bool, optional) – [description]. Defaults to True.

Returns

Distance between the embeddings

Return type

Union[Tuple[bool, float]]

face_verification.recognition.utils module

This module contains helpful utilities for recognition package.

face_verification.recognition.utils.check_image_channels(img: Union[numpy.ndarray, PIL.Image.Image], num_channels=3) → None[source]

Checks image channels to be equal to num_channels

face_verification.recognition.utils.type_check(argument, types: tuple) → None[source]

Used to assert right types are passes to the function

face_verification.recognition.vgg module

Taken from https://github.com/prlz77/vgg-face.pytorch/blob/master/models/vgg_face.py

class face_verification.recognition.vgg.VGG_16[source]

Bases: torch.nn.modules.module.Module

Main Class

forward(x)[source]

Pytorch forward :param x: input image (224x224)

Returns: class logits

load_weights(path='pretrained/vgg-face.pt')[source]

Module contents