{ "cells": [ { "cell_type": "markdown", "id": "a2220df6", "metadata": {}, "source": [ "# Import Libraries" ] }, { "cell_type": "code", "execution_count": 1, "id": "7249bea4", "metadata": {}, "outputs": [], "source": [ "import gradio as gr\n", "import torch\n", "import torch.nn.functional as F\n", "from facenet_pytorch import MTCNN, InceptionResnetV1\n", "import numpy as np\n", "from PIL import Image\n", "import cv2\n", "from pytorch_grad_cam import GradCAM\n", "from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget\n", "from pytorch_grad_cam.utils.image import show_cam_on_image\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "id": "d25e1c5d", "metadata": {}, "source": [ "# Download and Load Model" ] }, { "cell_type": "code", "execution_count": 2, "id": "237fbf44", "metadata": {}, "outputs": [], "source": [ "DEVICE = 'cuda:0' if torch.cuda.is_available() else 'cpu'\n", "\n", "mtcnn = MTCNN(\n", " select_largest=False,\n", " post_process=False,\n", " device=DEVICE\n", ").to(DEVICE).eval()" ] }, { "cell_type": "code", "execution_count": 3, "id": "f3ef2b4f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "InceptionResnetV1(\n", " (conv2d_1a): BasicConv2d(\n", " (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (conv2d_2a): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (conv2d_2b): BasicConv2d(\n", " (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (maxpool_3a): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " (conv2d_3b): BasicConv2d(\n", " (conv): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(80, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (conv2d_4a): BasicConv2d(\n", " (conv): Conv2d(80, 192, kernel_size=(3, 3), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (conv2d_4b): BasicConv2d(\n", " (conv): Conv2d(192, 256, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (repeat_1): Sequential(\n", " (0): Block35(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch2): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(96, 256, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (1): Block35(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch2): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(96, 256, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (2): Block35(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch2): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(96, 256, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (3): Block35(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch2): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(96, 256, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (4): Block35(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch2): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(96, 256, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " )\n", " (mixed_6a): Mixed_6a(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(256, 384, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(256, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(192, 256, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " )\n", " (repeat_2): Sequential(\n", " (0): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (1): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (2): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (3): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (4): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (5): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (6): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (7): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (8): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (9): Block17(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)\n", " (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(256, 896, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " )\n", " (mixed_7a): Mixed_7a(\n", " (branch0): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(256, 384, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", " (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch2): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(896, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), bias=False)\n", " (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (branch3): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " )\n", " (repeat_3): Sequential(\n", " (0): Block8(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(384, 1792, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (1): Block8(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(384, 1792, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (2): Block8(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(384, 1792, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (3): Block8(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(384, 1792, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " (4): Block8(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(384, 1792, kernel_size=(1, 1), stride=(1, 1))\n", " (relu): ReLU()\n", " )\n", " )\n", " (block8): Block8(\n", " (branch0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (branch1): Sequential(\n", " (0): BasicConv2d(\n", " (conv): Conv2d(1792, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (1): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " (2): BasicConv2d(\n", " (conv): Conv2d(192, 192, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)\n", " (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (relu): ReLU()\n", " )\n", " )\n", " (conv2d): Conv2d(384, 1792, kernel_size=(1, 1), stride=(1, 1))\n", " )\n", " (avgpool_1a): AdaptiveAvgPool2d(output_size=1)\n", " (dropout): Dropout(p=0.6, inplace=False)\n", " (last_linear): Linear(in_features=1792, out_features=512, bias=False)\n", " (last_bn): BatchNorm1d(512, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)\n", " (logits): Linear(in_features=512, out_features=1, bias=True)\n", ")" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = InceptionResnetV1(\n", " pretrained=\"vggface2\",\n", " classify=True,\n", " num_classes=1,\n", " device=DEVICE\n", ")\n", "\n", "checkpoint = torch.load(\"resnetinceptionv1_epoch_32.pth\", map_location=torch.device('cpu'))\n", "model.load_state_dict(checkpoint['model_state_dict'])\n", "model.to(DEVICE)\n", "model.eval()" ] }, { "cell_type": "markdown", "id": "a499194a", "metadata": {}, "source": [ "# Model Inference " ] }, { "cell_type": "code", "execution_count": 4, "id": "376e6cd6", "metadata": {}, "outputs": [], "source": [ "def predict(input_image:Image.Image):\n", " \"\"\"Predict the label of the input_image\"\"\"\n", " face = mtcnn(input_image)\n", " if face is None:\n", " raise Exception('No face detected')\n", " face = face.unsqueeze(0) # add the batch dimension\n", " face = F.interpolate(face, size=(256, 256), mode='bilinear', align_corners=False)\n", " \n", " # convert the face into a numpy array to be able to plot it\n", " prev_face = face.squeeze(0).permute(1, 2, 0).cpu().detach().int().numpy()\n", " prev_face = prev_face.astype('uint8')\n", "\n", " face = face.to(DEVICE)\n", " face = face.to(torch.float32)\n", " face = face / 255.0\n", " face_image_to_plot = face.squeeze(0).permute(1, 2, 0).cpu().detach().int().numpy()\n", "\n", " target_layers=[model.block8.branch1[-1]]\n", " use_cuda = True if torch.cuda.is_available() else False\n", " cam = GradCAM(model=model, target_layers=target_layers, use_cuda=use_cuda)\n", " targets = [ClassifierOutputTarget(0)]\n", "\n", " grayscale_cam = cam(input_tensor=face, targets=targets, eigen_smooth=True)\n", " grayscale_cam = grayscale_cam[0, :]\n", " visualization = show_cam_on_image(face_image_to_plot, grayscale_cam, use_rgb=True)\n", " face_with_mask = cv2.addWeighted(prev_face, 1, visualization, 0.5, 0)\n", "\n", " with torch.no_grad():\n", " output = torch.sigmoid(model(face).squeeze(0))\n", " prediction = \"real\" if output.item() < 0.5 else \"fake\"\n", " \n", " real_prediction = 1 - output.item()\n", " fake_prediction = output.item()\n", " \n", " confidences = {\n", " 'real': real_prediction,\n", " 'fake': fake_prediction\n", " }\n", " return confidences, face_with_mask\n" ] }, { "cell_type": "markdown", "id": "14f47b5a", "metadata": {}, "source": [ "# Gradio Interface" ] }, { "cell_type": "code", "execution_count": 5, "id": "d62177b5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interface = gr.Interface(\n", " fn=predict,\n", " inputs=[\n", " gr.inputs.Image(label=\"Input Image\", type=\"pil\")\n", " ],\n", " outputs=[\n", " gr.outputs.Label(label=\"Class\"),\n", " gr.outputs.Image(label=\"Face with Explainability\", type=\"pil\")\n", " ],\n", ").launch()" ] }, { "cell_type": "code", "execution_count": null, "id": "0c0b293c", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.8" } }, "nbformat": 4, "nbformat_minor": 5 }