Source code for face_verification.recognition.vgg

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

# -*- coding: utf-8 -*-

__author__ = "Pau Rodríguez López, ISELAB, CVC-UAB"
__email__ = "pau.rodri1@gmail.com"

import torch
import torch.nn as nn
import torch.nn.functional as F
import os


[docs]class VGG_16(nn.Module): """ Main Class """ def __init__(self): """ Constructor """ super().__init__() self.block_size = [2, 2, 3, 3, 3] self.conv_1_1 = nn.Conv2d(3, 64, 3, stride=1, padding=1) self.conv_1_2 = nn.Conv2d(64, 64, 3, stride=1, padding=1) self.conv_2_1 = nn.Conv2d(64, 128, 3, stride=1, padding=1) self.conv_2_2 = nn.Conv2d(128, 128, 3, stride=1, padding=1) self.conv_3_1 = nn.Conv2d(128, 256, 3, stride=1, padding=1) self.conv_3_2 = nn.Conv2d(256, 256, 3, stride=1, padding=1) self.conv_3_3 = nn.Conv2d(256, 256, 3, stride=1, padding=1) self.conv_4_1 = nn.Conv2d(256, 512, 3, stride=1, padding=1) self.conv_4_2 = nn.Conv2d(512, 512, 3, stride=1, padding=1) self.conv_4_3 = nn.Conv2d(512, 512, 3, stride=1, padding=1) self.conv_5_1 = nn.Conv2d(512, 512, 3, stride=1, padding=1) self.conv_5_2 = nn.Conv2d(512, 512, 3, stride=1, padding=1) self.conv_5_3 = nn.Conv2d(512, 512, 3, stride=1, padding=1) self.fc6 = nn.Linear(512 * 7 * 7, 4096) self.fc7 = nn.Linear(4096, 4096) self.fc8 = nn.Linear(4096, 2622) def _load_weights(self, path): state = torch.load(path) self.load_state_dict(state) return self
[docs] def load_weights(self, path="pretrained/vgg-face.pt"): if os.path.isfile(path): return self._load_weights(path) else: os.mkdir("pretrained") import gdown gdown.download( "https://drive.google.com/uc?id=1XqCsFKqeHA69jOA_L-w-tx0ryc_lIaIm", output=path) return self._load_weights(path)
[docs] def forward(self, x): """ Pytorch forward Args: x: input image (224x224) Returns: class logits """ x = F.relu(self.conv_1_1(x)) x = F.relu(self.conv_1_2(x)) x = F.max_pool2d(x, 2, 2) x = F.relu(self.conv_2_1(x)) x = F.relu(self.conv_2_2(x)) x = F.max_pool2d(x, 2, 2) x = F.relu(self.conv_3_1(x)) x = F.relu(self.conv_3_2(x)) x = F.relu(self.conv_3_3(x)) x = F.max_pool2d(x, 2, 2) x = F.relu(self.conv_4_1(x)) x = F.relu(self.conv_4_2(x)) x = F.relu(self.conv_4_3(x)) x = F.max_pool2d(x, 2, 2) x = F.relu(self.conv_5_1(x)) x = F.relu(self.conv_5_2(x)) x = F.relu(self.conv_5_3(x)) x = F.max_pool2d(x, 2, 2) x = x.view(x.size(0), -1) x = F.relu(self.fc6(x)) x = F.dropout(x, 0.5, self.training) x = F.relu(self.fc7(x)) x = F.dropout(x, 0.5, self.training) return self.fc8(x)