{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Задание 1"
      ],
      "metadata": {
        "id": "aMpCPL8GvI_t"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Скачаем необходимые библиотеки и файлы"
      ],
      "metadata": {
        "id": "v232mtYOX0Cv"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OmZoKOSxuZ2O",
        "outputId": "ea457e9a-0aee-48ee-c10b-58cc37c732e4"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: gdown in /usr/local/lib/python3.11/dist-packages (5.2.0)\n",
            "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.11/dist-packages (from gdown) (4.12.3)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from gdown) (3.17.0)\n",
            "Requirement already satisfied: requests[socks] in /usr/local/lib/python3.11/dist-packages (from gdown) (2.32.3)\n",
            "Requirement already satisfied: tqdm in /usr/local/lib/python3.11/dist-packages (from gdown) (4.67.1)\n",
            "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.11/dist-packages (from beautifulsoup4->gdown) (2.6)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown) (3.4.1)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown) (3.10)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown) (2.3.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown) (2024.12.14)\n",
            "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown) (1.7.1)\n"
          ]
        }
      ],
      "source": [
        "!pip3 install gdown"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!python -m pip install opencv-python"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "xgMKtPmAus0b",
        "outputId": "22e7f415-85bc-435c-b594-e97fb3aaede1"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: opencv-python in /usr/local/lib/python3.11/dist-packages (4.10.0.84)\n",
            "Requirement already satisfied: numpy>=1.21.2 in /usr/local/lib/python3.11/dist-packages (from opencv-python) (1.26.4)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!wget https://github.com/opencv/opencv_zoo/raw/refs/heads/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx\n",
        "!wget https://github.com/opencv/opencv_zoo/raw/refs/heads/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hrsqu_jBwU5d",
        "outputId": "d6dcfed3-1fc0-4c85-cee6-32ac08b1b5db"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "--2025-01-23 15:23:14--  https://github.com/opencv/opencv_zoo/raw/refs/heads/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx\n",
            "Resolving github.com (github.com)... 140.82.121.3\n",
            "Connecting to github.com (github.com)|140.82.121.3|:443... connected.\n",
            "HTTP request sent, awaiting response... 302 Found\n",
            "Location: https://media.githubusercontent.com/media/opencv/opencv_zoo/refs/heads/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx [following]\n",
            "--2025-01-23 15:23:14--  https://media.githubusercontent.com/media/opencv/opencv_zoo/refs/heads/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx\n",
            "Resolving media.githubusercontent.com (media.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...\n",
            "Connecting to media.githubusercontent.com (media.githubusercontent.com)|185.199.111.133|:443... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 232589 (227K) [application/octet-stream]\n",
            "Saving to: ‘face_detection_yunet_2023mar.onnx.1’\n",
            "\n",
            "\r          face_dete   0%[                    ]       0  --.-KB/s               \rface_detection_yune 100%[===================>] 227.14K  --.-KB/s    in 0.01s   \n",
            "\n",
            "2025-01-23 15:23:14 (16.6 MB/s) - ‘face_detection_yunet_2023mar.onnx.1’ saved [232589/232589]\n",
            "\n",
            "--2025-01-23 15:23:14--  https://github.com/opencv/opencv_zoo/raw/refs/heads/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx\n",
            "Resolving github.com (github.com)... 140.82.121.4\n",
            "Connecting to github.com (github.com)|140.82.121.4|:443... connected.\n",
            "HTTP request sent, awaiting response... 302 Found\n",
            "Location: https://media.githubusercontent.com/media/opencv/opencv_zoo/refs/heads/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx [following]\n",
            "--2025-01-23 15:23:14--  https://media.githubusercontent.com/media/opencv/opencv_zoo/refs/heads/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx\n",
            "Resolving media.githubusercontent.com (media.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...\n",
            "Connecting to media.githubusercontent.com (media.githubusercontent.com)|185.199.111.133|:443... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 38696353 (37M) [application/octet-stream]\n",
            "Saving to: ‘face_recognition_sface_2021dec.onnx’\n",
            "\n",
            "face_recognition_sf 100%[===================>]  36.90M   240MB/s    in 0.2s    \n",
            "\n",
            "2025-01-23 15:23:16 (240 MB/s) - ‘face_recognition_sface_2021dec.onnx’ saved [38696353/38696353]\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!gdown 1YhoqObsQQz3j-6vj5pKWZzkbnWA3ZH9j"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "_YNqpQ54G51m",
        "outputId": "6c3c04c6-de06-46fc-f76f-b257b579f13f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From (original): https://drive.google.com/uc?id=1YhoqObsQQz3j-6vj5pKWZzkbnWA3ZH9j\n",
            "From (redirected): https://drive.google.com/uc?id=1YhoqObsQQz3j-6vj5pKWZzkbnWA3ZH9j&confirm=t&uuid=94066f52-9932-4b15-a7eb-608e49b53a32\n",
            "To: /content/vk_-227300194_456239052_1080p.mp4\n",
            "100% 279M/279M [00:02<00:00, 96.4MB/s]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!gdown 1Nt4xkOc7AuGPQ9R-jZwzRARCJrSR6cCD"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "G8vA3Ho8HVcQ",
        "outputId": "5e7c5f8f-be63-431e-9f00-de80773d9e01"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1Nt4xkOc7AuGPQ9R-jZwzRARCJrSR6cCD\n",
            "To: /content/IMG20250123202607.jpg\n",
            "\r  0% 0.00/3.03M [00:00<?, ?B/s]\r100% 3.03M/3.03M [00:00<00:00, 177MB/s]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Создадим функцию визуализации"
      ],
      "metadata": {
        "id": "FXcD_ouGX34M"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def visualize(\n",
        "    input,\n",
        "    faces,\n",
        "    target_face_feature,\n",
        "    cosine_similarity_threshold = 0.363,\n",
        "    thickness=2\n",
        "):\n",
        "    if faces[1] is not None:\n",
        "        for idx, face in enumerate(faces[1]):\n",
        "            face_align = recognizer.alignCrop(input, face)\n",
        "            face_feature = recognizer.feature(face_align)\n",
        "            cosine_score = recognizer.match(face_feature, target_face_feature, cv.FaceRecognizerSF_FR_COSINE)\n",
        "            coords = face[:-1].astype(np.int32)\n",
        "            if cosine_score > cosine_similarity_threshold:\n",
        "              color = (0, 255, 0)\n",
        "            else:\n",
        "              color = (0, 0, 255)\n",
        "            cv.rectangle(input, (coords[0], coords[1]), (coords[0]+coords[2], coords[1]+coords[3]), color, thickness)"
      ],
      "metadata": {
        "id": "02Blye-97rop"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Теперь задетектим и сохраним"
      ],
      "metadata": {
        "id": "uxjL5KY5X81G"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import cv2 as cv\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "detector = cv.FaceDetectorYN.create(\n",
        "        \"./face_detection_yunet_2023mar.onnx\",\n",
        "        \"\",\n",
        "        (320, 320),\n",
        "        0.6,\n",
        "        0.3,\n",
        "        5000\n",
        ")\n",
        "\n",
        "\n",
        "img_target = cv.imread(\"./IMG20250123202607.jpg\")\n",
        "h, w, c = img_target.shape\n",
        "detector.setInputSize((w, h))\n",
        "target_faces = detector.detect(img_target)\n",
        "\n",
        "print(target_faces)\n",
        "\n",
        "\n",
        "recognizer = cv.FaceRecognizerSF.create(\"./face_recognition_sface_2021dec.onnx\",\"\")\n",
        "\n",
        "\n",
        "target_face_align = recognizer.alignCrop(img_target, target_faces[1][0])\n",
        "target_face_feature = recognizer.feature(face2_align)\n",
        "\n",
        "\n",
        "cosine_similarity_threshold = 0.363\n",
        "\n",
        "\n",
        "#visualize(img1, faces1, target_face_feature, cosine_similarity_threshold, 5)\n",
        "\n",
        "#plt.imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))\n",
        "#plt.axis('off')\n",
        "#plt.show()\n",
        "\n",
        "cap = cv.VideoCapture('./vk_-227300194_456239052_1080p.mp4')\n",
        "cap.set(cv.CAP_PROP_POS_FRAMES, 2425)\n",
        "writer = cv.VideoWriter(\n",
        "    'result.mp4',\n",
        "    cv.VideoWriter_fourcc(*'MP4V'),\n",
        "    25,\n",
        "    (int(cap.get(3)),int(cap.get(4)))\n",
        ")\n",
        "\n",
        "\n",
        "counter = 0\n",
        "while cap.isOpened() and counter < 250:\n",
        "  ret, frame = cap.read()\n",
        "\n",
        "  print(counter)\n",
        "  counter += 1\n",
        "\n",
        "  if not ret:\n",
        "    break\n",
        "  h, w, c = frame.shape\n",
        "  detector.setInputSize((w, h))\n",
        "  faces = detector.detect(frame)\n",
        "  visualize(frame, faces, target_face_feature, cosine_similarity_threshold, 5)\n",
        "  writer.write(frame)\n",
        "\n",
        "cap.release()\n",
        "writer.release()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "nUrx1e8j1oCH",
        "outputId": "36f96c03-8477-4164-b05e-34f3fabdda17"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(1, array([[1.6651689e+03, 1.7341964e+03, 4.3388049e+02, 4.6886496e+02,\n",
            "        1.7518268e+03, 1.9946527e+03, 1.9662686e+03, 2.0082155e+03,\n",
            "        1.8432168e+03, 2.1470681e+03, 1.7367972e+03, 2.1815381e+03,\n",
            "        1.9444132e+03, 2.1959910e+03, 6.0096520e-01]], dtype=float32))\n",
            "0\n",
            "1\n",
            "2\n",
            "3\n",
            "4\n",
            "5\n",
            "6\n",
            "7\n",
            "8\n",
            "9\n",
            "10\n",
            "11\n",
            "12\n",
            "13\n",
            "14\n",
            "15\n",
            "16\n",
            "17\n",
            "18\n",
            "19\n",
            "20\n",
            "21\n",
            "22\n",
            "23\n",
            "24\n",
            "25\n",
            "26\n",
            "27\n",
            "28\n",
            "29\n",
            "30\n",
            "31\n",
            "32\n",
            "33\n",
            "34\n",
            "35\n",
            "36\n",
            "37\n",
            "38\n",
            "39\n",
            "40\n",
            "41\n",
            "42\n",
            "43\n",
            "44\n",
            "45\n",
            "46\n",
            "47\n",
            "48\n",
            "49\n",
            "50\n",
            "51\n",
            "52\n",
            "53\n",
            "54\n",
            "55\n",
            "56\n",
            "57\n",
            "58\n",
            "59\n",
            "60\n",
            "61\n",
            "62\n",
            "63\n",
            "64\n",
            "65\n",
            "66\n",
            "67\n",
            "68\n",
            "69\n",
            "70\n",
            "71\n",
            "72\n",
            "73\n",
            "74\n",
            "75\n",
            "76\n",
            "77\n",
            "78\n",
            "79\n",
            "80\n",
            "81\n",
            "82\n",
            "83\n",
            "84\n",
            "85\n",
            "86\n",
            "87\n",
            "88\n",
            "89\n",
            "90\n",
            "91\n",
            "92\n",
            "93\n",
            "94\n",
            "95\n",
            "96\n",
            "97\n",
            "98\n",
            "99\n",
            "100\n",
            "101\n",
            "102\n",
            "103\n",
            "104\n",
            "105\n",
            "106\n",
            "107\n",
            "108\n",
            "109\n",
            "110\n",
            "111\n",
            "112\n",
            "113\n",
            "114\n",
            "115\n",
            "116\n",
            "117\n",
            "118\n",
            "119\n",
            "120\n",
            "121\n",
            "122\n",
            "123\n",
            "124\n",
            "125\n",
            "126\n",
            "127\n",
            "128\n",
            "129\n",
            "130\n",
            "131\n",
            "132\n",
            "133\n",
            "134\n",
            "135\n",
            "136\n",
            "137\n",
            "138\n",
            "139\n",
            "140\n",
            "141\n",
            "142\n",
            "143\n",
            "144\n",
            "145\n",
            "146\n",
            "147\n",
            "148\n",
            "149\n",
            "150\n",
            "151\n",
            "152\n",
            "153\n",
            "154\n",
            "155\n",
            "156\n",
            "157\n",
            "158\n",
            "159\n",
            "160\n",
            "161\n",
            "162\n",
            "163\n",
            "164\n",
            "165\n",
            "166\n",
            "167\n",
            "168\n",
            "169\n",
            "170\n",
            "171\n",
            "172\n",
            "173\n",
            "174\n",
            "175\n",
            "176\n",
            "177\n",
            "178\n",
            "179\n",
            "180\n",
            "181\n",
            "182\n",
            "183\n",
            "184\n",
            "185\n",
            "186\n",
            "187\n",
            "188\n",
            "189\n",
            "190\n",
            "191\n",
            "192\n",
            "193\n",
            "194\n",
            "195\n",
            "196\n",
            "197\n",
            "198\n",
            "199\n",
            "200\n",
            "201\n",
            "202\n",
            "203\n",
            "204\n",
            "205\n",
            "206\n",
            "207\n",
            "208\n",
            "209\n",
            "210\n",
            "211\n",
            "212\n",
            "213\n",
            "214\n",
            "215\n",
            "216\n",
            "217\n",
            "218\n",
            "219\n",
            "220\n",
            "221\n",
            "222\n",
            "223\n",
            "224\n",
            "225\n",
            "226\n",
            "227\n",
            "228\n",
            "229\n",
            "230\n",
            "231\n",
            "232\n",
            "233\n",
            "234\n",
            "235\n",
            "236\n",
            "237\n",
            "238\n",
            "239\n",
            "240\n",
            "241\n",
            "242\n",
            "243\n",
            "244\n",
            "245\n",
            "246\n",
            "247\n",
            "248\n",
            "249\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Задача 2"
      ],
      "metadata": {
        "id": "ari9LmgrPkws"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Качаем файлы и либы"
      ],
      "metadata": {
        "id": "nV0op_RPYC7i"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!gdown 1gfu5WynF5ZMDBfcFiVWLuA2S_uVyVQZL"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "_KvBHSuOPnYu",
        "outputId": "f4aba0bc-cd4c-4de6-cd95-15546260d007"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1gfu5WynF5ZMDBfcFiVWLuA2S_uVyVQZL\n",
            "To: /content/photo_staff.rar\n",
            "100% 13.4M/13.4M [00:00<00:00, 28.9MB/s]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!gdown 1A6NivL1zPL6kLSLUOETaG_IWnJ-kg411"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "c_SrqHCgRIjT",
        "outputId": "798bdfcc-fc4b-4801-d56d-3d14555e0b65"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1A6NivL1zPL6kLSLUOETaG_IWnJ-kg411\n",
            "To: /content/staff_photo.csv\n",
            "\r  0% 0.00/58.4k [00:00<?, ?B/s]\r100% 58.4k/58.4k [00:00<00:00, 18.2MB/s]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!sudo apt install unar"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "BLI-zHV4Q9te",
        "outputId": "bfc4bcab-b3ec-4497-c416-629ab8d2e356"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Reading package lists... Done\n",
            "Building dependency tree... Done\n",
            "Reading state information... Done\n",
            "The following additional packages will be installed:\n",
            "  gnustep-base-common gnustep-base-runtime gnustep-common libgnustep-base1.28\n",
            "  libwavpack1\n",
            "The following NEW packages will be installed:\n",
            "  gnustep-base-common gnustep-base-runtime gnustep-common libgnustep-base1.28\n",
            "  libwavpack1 unar\n",
            "0 upgraded, 6 newly installed, 0 to remove and 49 not upgraded.\n",
            "Need to get 3,373 kB of archives.\n",
            "After this operation, 15.1 MB of additional disk space will be used.\n",
            "Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 gnustep-common amd64 2.9.0-3 [39.0 kB]\n",
            "Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 gnustep-base-common all 1.28.0-4build1 [81.2 kB]\n",
            "Get:3 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libgnustep-base1.28 amd64 1.28.0-4build1 [1,533 kB]\n",
            "Get:4 http://archive.ubuntu.com/ubuntu jammy/universe amd64 gnustep-base-runtime amd64 1.28.0-4build1 [239 kB]\n",
            "Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwavpack1 amd64 5.4.0-1build2 [83.7 kB]\n",
            "Get:6 http://archive.ubuntu.com/ubuntu jammy/universe amd64 unar amd64 1.10.1-2build11 [1,397 kB]\n",
            "Fetched 3,373 kB in 1s (3,105 kB/s)\n",
            "debconf: unable to initialize frontend: Dialog\n",
            "debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78, <> line 6.)\n",
            "debconf: falling back to frontend: Readline\n",
            "debconf: unable to initialize frontend: Readline\n",
            "debconf: (This frontend requires a controlling tty.)\n",
            "debconf: falling back to frontend: Teletype\n",
            "dpkg-preconfigure: unable to re-open stdin: \n",
            "Selecting previously unselected package gnustep-common.\n",
            "(Reading database ... 124574 files and directories currently installed.)\n",
            "Preparing to unpack .../0-gnustep-common_2.9.0-3_amd64.deb ...\n",
            "Unpacking gnustep-common (2.9.0-3) ...\n",
            "Selecting previously unselected package gnustep-base-common.\n",
            "Preparing to unpack .../1-gnustep-base-common_1.28.0-4build1_all.deb ...\n",
            "Unpacking gnustep-base-common (1.28.0-4build1) ...\n",
            "Selecting previously unselected package libgnustep-base1.28.\n",
            "Preparing to unpack .../2-libgnustep-base1.28_1.28.0-4build1_amd64.deb ...\n",
            "Unpacking libgnustep-base1.28 (1.28.0-4build1) ...\n",
            "Selecting previously unselected package gnustep-base-runtime.\n",
            "Preparing to unpack .../3-gnustep-base-runtime_1.28.0-4build1_amd64.deb ...\n",
            "Unpacking gnustep-base-runtime (1.28.0-4build1) ...\n",
            "Selecting previously unselected package libwavpack1:amd64.\n",
            "Preparing to unpack .../4-libwavpack1_5.4.0-1build2_amd64.deb ...\n",
            "Unpacking libwavpack1:amd64 (5.4.0-1build2) ...\n",
            "Selecting previously unselected package unar.\n",
            "Preparing to unpack .../5-unar_1.10.1-2build11_amd64.deb ...\n",
            "Unpacking unar (1.10.1-2build11) ...\n",
            "Setting up gnustep-common (2.9.0-3) ...\n",
            "Setting up gnustep-base-common (1.28.0-4build1) ...\n",
            "Setting up libwavpack1:amd64 (5.4.0-1build2) ...\n",
            "Setting up libgnustep-base1.28 (1.28.0-4build1) ...\n",
            "Setting up gnustep-base-runtime (1.28.0-4build1) ...\n",
            "Setting up unar (1.10.1-2build11) ...\n",
            "Processing triggers for man-db (2.10.2-1) ...\n",
            "Processing triggers for libc-bin (2.35-0ubuntu3.4) ...\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtcm.so.1 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libumf.so.0 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libhwloc.so.15 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libur_adapter_level_zero.so.0 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libur_loader.so.0 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libur_adapter_opencl.so.0 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtcm_debug.so.1 is not a symbolic link\n",
            "\n",
            "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "! unar photo_staff.rar"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "snBnPUJqQ24E",
        "outputId": "86684212-e1ff-47ee-b708-cab1c49ae300"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "photo_staff.rar: RAR 5\n",
            "  photo_staff/100_miem.jpeg  (5547 B)... OK.\n",
            "  photo_staff/101_miem.jpeg  (4923 B)... OK.\n",
            "  photo_staff/102_miem.jpeg  (6283 B)... OK.\n",
            "  photo_staff/103_miem.jpeg  (93406 B)... OK.\n",
            "  photo_staff/104_miem.jpeg  (7868 B)... OK.\n",
            "  photo_staff/105_miem.jpeg  (7608 B)... OK.\n",
            "  photo_staff/106_miem.jpeg  (8905 B)... OK.\n",
            "  photo_staff/107_miem.jpeg  (5512 B)... OK.\n",
            "  photo_staff/107_zulip.jpeg  (556460 B)... OK.\n",
            "  photo_staff/108_miem.jpeg  (4342 B)... OK.\n",
            "  photo_staff/109_miem.jpeg  (5991 B)... OK.\n",
            "  photo_staff/10_miem.jpeg  (6541 B)... OK.\n",
            "  photo_staff/110_miem.jpeg  (5093 B)... OK.\n",
            "  photo_staff/111_miem.jpeg  (13165 B)... OK.\n",
            "  photo_staff/112_miem.jpeg  (4611 B)... OK.\n",
            "  photo_staff/113_miem.jpeg  (5671 B)... OK.\n",
            "  photo_staff/114_miem.jpeg  (6140 B)... OK.\n",
            "  photo_staff/115_miem.jpeg  (4943 B)... OK.\n",
            "  photo_staff/116_miem.jpeg  (5863 B)... OK.\n",
            "  photo_staff/117_miem.jpeg  (2769 B)... OK.\n",
            "  photo_staff/118_miem.jpeg  (37432 B)... OK.\n",
            "  photo_staff/119_miem.jpeg  (5706 B)... OK.\n",
            "  photo_staff/120_miem.jpeg  (10863 B)... OK.\n",
            "  photo_staff/121_miem.jpeg  (7988 B)... OK.\n",
            "  photo_staff/122_miem.jpeg  (4026 B)... OK.\n",
            "  photo_staff/123_miem.jpeg  (5715 B)... OK.\n",
            "  photo_staff/126_miem.jpeg  (5618 B)... OK.\n",
            "  photo_staff/127_miem.jpeg  (4272 B)... OK.\n",
            "  photo_staff/128_miem.jpeg  (11726 B)... OK.\n",
            "  photo_staff/129_miem.jpeg  (5847 B)... OK.\n",
            "  photo_staff/12_miem.jpeg  (5464 B)... OK.\n",
            "  photo_staff/130_miem.jpeg  (5028 B)... OK.\n",
            "  photo_staff/131_miem.jpeg  (4901 B)... OK.\n",
            "  photo_staff/131_zulip.jpeg  (157191 B)... OK.\n",
            "  photo_staff/132_miem.jpeg  (6126 B)... OK.\n",
            "  photo_staff/133_miem.jpeg  (7007 B)... OK.\n",
            "  photo_staff/134_miem.jpeg  (6489 B)... OK.\n",
            "  photo_staff/134_zulip.jpeg  (359065 B)... OK.\n",
            "  photo_staff/135_miem.jpeg  (4959 B)... OK.\n",
            "  photo_staff/136_miem.jpeg  (5731 B)... OK.\n",
            "  photo_staff/137_miem.jpeg  (6969 B)... OK.\n",
            "  photo_staff/138_miem.jpeg  (5774 B)... OK.\n",
            "  photo_staff/139_miem.jpeg  (5795 B)... OK.\n",
            "  photo_staff/13_miem.jpeg  (7345 B)... OK.\n",
            "  photo_staff/140_miem.jpeg  (7152 B)... OK.\n",
            "  photo_staff/141_miem.jpeg  (7578 B)... OK.\n",
            "  photo_staff/142_miem.jpeg  (5949 B)... OK.\n",
            "  photo_staff/143_miem.jpeg  (6381 B)... OK.\n",
            "  photo_staff/144_miem.jpeg  (5514 B)... OK.\n",
            "  photo_staff/145_miem.jpeg  (8076 B)... OK.\n",
            "  photo_staff/146_miem.jpeg  (5929 B)... OK.\n",
            "  photo_staff/146_zulip.jpeg  (255650 B)... OK.\n",
            "  photo_staff/147_miem.jpeg  (5372 B)... OK.\n",
            "  photo_staff/148_miem.jpeg  (4990 B)... OK.\n",
            "  photo_staff/149_miem.jpeg  (5301 B)... OK.\n",
            "  photo_staff/150_miem.jpeg  (4423 B)... OK.\n",
            "  photo_staff/150_zulip.jpeg  (348138 B)... OK.\n",
            "  photo_staff/151_miem.jpeg  (5823 B)... OK.\n",
            "  photo_staff/152_miem.jpeg  (4988 B)... OK.\n",
            "  photo_staff/153_miem.jpeg  (6404 B)... OK.\n",
            "  photo_staff/154_miem.jpeg  (5840 B)... OK.\n",
            "  photo_staff/155_miem.jpeg  (4990 B)... OK.\n",
            "  photo_staff/156_miem.jpeg  (5335 B)... OK.\n",
            "  photo_staff/157_miem.jpeg  (6832 B)... OK.\n",
            "  photo_staff/158_miem.jpeg  (105963 B)... OK.\n",
            "  photo_staff/158_zulip.jpeg  (433072 B)... OK.\n",
            "  photo_staff/159_miem.jpeg  (4906 B)... OK.\n",
            "  photo_staff/159_zulip.jpeg  (187929 B)... OK.\n",
            "  photo_staff/15_miem.jpeg  (7346 B)... OK.\n",
            "  photo_staff/160_miem.jpeg  (7747 B)... OK.\n",
            "  photo_staff/160_zulip.jpeg  (408230 B)... OK.\n",
            "  photo_staff/161_miem.jpeg  (6415 B)... OK.\n",
            "  photo_staff/163_miem.jpeg  (11246 B)... OK.\n",
            "  photo_staff/164_miem.jpeg  (7570 B)... OK.\n",
            "  photo_staff/165_miem.jpeg  (7222 B)... OK.\n",
            "  photo_staff/166_miem.jpeg  (77186 B)... OK.\n",
            "  photo_staff/167_miem.jpeg  (6026 B)... OK.\n",
            "  photo_staff/168_miem.jpeg  (4622 B)... OK.\n",
            "  photo_staff/16_miem.jpeg  (5747 B)... OK.\n",
            "  photo_staff/170_miem.jpeg  (8923 B)... OK.\n",
            "  photo_staff/171_miem.jpeg  (5646 B)... OK.\n",
            "  photo_staff/173_miem.jpeg  (11602 B)... OK.\n",
            "  photo_staff/175_miem.jpeg  (10164 B)... OK.\n",
            "  photo_staff/176_miem.jpeg  (4013 B)... OK.\n",
            "  photo_staff/177_miem.jpeg  (8613 B)... OK.\n",
            "  photo_staff/177_zulip.jpeg  (335913 B)... OK.\n",
            "  photo_staff/178_miem.jpeg  (8379 B)... OK.\n",
            "  photo_staff/179_miem.jpeg  (4998 B)... OK.\n",
            "  photo_staff/17_miem.jpeg  (2296 B)... OK.\n",
            "  photo_staff/17_zulip.jpeg  (409851 B)... OK.\n",
            "  photo_staff/180_miem.jpeg  (9787 B)... OK.\n",
            "  photo_staff/181_miem.jpeg  (6188 B)... OK.\n",
            "  photo_staff/182_miem.jpeg  (5957 B)... OK.\n",
            "  photo_staff/182_zulip.jpeg  (170786 B)... OK.\n",
            "  photo_staff/183_miem.jpeg  (8114 B)... OK.\n",
            "  photo_staff/184_miem.jpeg  (5093 B)... OK.\n",
            "  photo_staff/184_zulip.jpeg  (390591 B)... OK.\n",
            "  photo_staff/185_miem.jpeg  (4361 B)... OK.\n",
            "  photo_staff/186_miem.jpeg  (8346 B)... OK.\n",
            "  photo_staff/187_miem.jpeg  (3954 B)... OK.\n",
            "  photo_staff/188_miem.jpeg  (6944 B)... OK.\n",
            "  photo_staff/189_miem.jpeg  (6041 B)... Failed! (Attempted to read more data than was available)\n",
            "  photo_staff/18_miem.jpeg  (1734 B)... OK.\n",
            "  photo_staff/190_miem.jpeg  (7301 B)... OK.\n",
            "  photo_staff/191_miem.jpeg  (8550 B)... OK.\n",
            "  photo_staff/192_miem.jpeg  (7137 B)... OK.\n",
            "  photo_staff/193_miem.jpeg  (8801 B)... OK.\n",
            "  photo_staff/194_miem.jpeg  (5685 B)... OK.\n",
            "  photo_staff/195_miem.jpeg  (7153 B)... OK.\n",
            "  photo_staff/196_miem.jpeg  (8836 B)... OK.\n",
            "  photo_staff/197_miem.jpeg  (7229 B)... OK.\n",
            "  photo_staff/199_miem.jpeg  (3561 B)... OK.\n",
            "  photo_staff/19_miem.jpeg  (5109 B)... OK.\n",
            "  photo_staff/19_zulip.jpeg  (326258 B)... OK.\n",
            "  photo_staff/1_miem.jpeg  (7874 B)... OK.\n",
            "  photo_staff/200_miem.jpeg  (6764 B)... OK.\n",
            "  photo_staff/201_miem.jpeg  (9962 B)... OK.\n",
            "  photo_staff/202_miem.jpeg  (7346 B)... OK.\n",
            "  photo_staff/203_miem.jpeg  (37674 B)... OK.\n",
            "  photo_staff/204_miem.jpeg  (87869 B)... OK.\n",
            "  photo_staff/205_miem.jpeg  (11143 B)... OK.\n",
            "  photo_staff/206_miem.jpeg  (3763 B)... OK.\n",
            "  photo_staff/207_miem.jpeg  (12024 B)... OK.\n",
            "  photo_staff/209_miem.jpeg  (7494 B)... OK.\n",
            "  photo_staff/20_miem.jpeg  (5060 B)... OK.\n",
            "  photo_staff/211_miem.jpeg  (7393 B)... OK.\n",
            "  photo_staff/212_miem.jpeg  (5133 B)... OK.\n",
            "  photo_staff/213_miem.jpeg  (5221 B)... OK.\n",
            "  photo_staff/214_miem.jpeg  (7296 B)... OK.\n",
            "  photo_staff/215_miem.jpeg  (7738 B)... OK.\n",
            "  photo_staff/216_miem.jpeg  (8534 B)... OK.\n",
            "  photo_staff/217_miem.jpeg  (8549 B)... OK.\n",
            "  photo_staff/218_miem.jpeg  (6714 B)... OK.\n",
            "  photo_staff/219_miem.jpeg  (5747 B)... OK.\n",
            "  photo_staff/21_miem.jpeg  (68745 B)... OK.\n",
            "  photo_staff/21_zulip.jpeg  (344675 B)... OK.\n",
            "  photo_staff/220_miem.jpeg  (5130 B)... OK.\n",
            "  photo_staff/221_miem.jpeg  (5740 B)... OK.\n",
            "  photo_staff/222_miem.jpeg  (8207 B)... OK.\n",
            "  photo_staff/223_miem.jpeg  (4738 B)... OK.\n",
            "  photo_staff/224_miem.jpeg  (4567 B)... OK.\n",
            "  photo_staff/225_miem.jpeg  (6015 B)... OK.\n",
            "  photo_staff/226_miem.jpeg  (5700 B)... OK.\n",
            "  photo_staff/227_miem.jpeg  (8199 B)... OK.\n",
            "  photo_staff/228_miem.jpeg  (7592 B)... OK.\n",
            "  photo_staff/229_miem.jpeg  (11527 B)... OK.\n",
            "  photo_staff/22_miem.jpeg  (7759 B)... OK.\n",
            "  photo_staff/230_miem.jpeg  (8042 B)... OK.\n",
            "  photo_staff/231_miem.jpeg  (5197 B)... OK.\n",
            "  photo_staff/232_miem.jpeg  (8379 B)... OK.\n",
            "  photo_staff/233_miem.jpeg  (6685 B)... OK.\n",
            "  photo_staff/234_miem.jpeg  (9516 B)... OK.\n",
            "  photo_staff/235_miem.jpeg  (6757 B)... OK.\n",
            "  photo_staff/236_miem.jpeg  (5077 B)... OK.\n",
            "  photo_staff/237_miem.jpeg  (14081 B)... OK.\n",
            "  photo_staff/238_miem.jpeg  (5861 B)... OK.\n",
            "  photo_staff/239_miem.jpeg  (67155 B)... OK.\n",
            "  photo_staff/23_miem.jpeg  (7113 B)... OK.\n",
            "  photo_staff/240_miem.jpeg  (7022 B)... OK.\n",
            "  photo_staff/241_miem.jpeg  (5754 B)... OK.\n",
            "  photo_staff/242_miem.jpeg  (7021 B)... OK.\n",
            "  photo_staff/243_miem.jpeg  (5185 B)... OK.\n",
            "  photo_staff/244_miem.jpeg  (9050 B)... OK.\n",
            "  photo_staff/245_miem.jpeg  (7247 B)... OK.\n",
            "  photo_staff/246_miem.jpeg  (5611 B)... OK.\n",
            "  photo_staff/247_miem.jpeg  (6788 B)... OK.\n",
            "  photo_staff/248_miem.jpeg  (6176 B)... OK.\n",
            "  photo_staff/249_miem.jpeg  (7335 B)... OK.\n",
            "  photo_staff/24_miem.jpeg  (6417 B)... OK.\n",
            "  photo_staff/250_miem.jpeg  (7420 B)... OK.\n",
            "  photo_staff/251_miem.jpeg  (7639 B)... OK.\n",
            "  photo_staff/252_miem.jpeg  (5139 B)... OK.\n",
            "  photo_staff/253_miem.jpeg  (3386 B)... OK.\n",
            "  photo_staff/254_miem.jpeg  (6013 B)... Failed! (Attempted to read more data than was available)\n",
            "  photo_staff/255_miem.jpeg  (6246 B)... OK.\n",
            "  photo_staff/256_miem.jpeg  (6914 B)... OK.\n",
            "  photo_staff/257_miem.jpeg  (5642 B)... OK.\n",
            "  photo_staff/259_miem.jpeg  (4774 B)... OK.\n",
            "  photo_staff/25_miem.jpeg  (10188 B)... OK.\n",
            "  photo_staff/261_miem.jpeg  (5115 B)... OK.\n",
            "  photo_staff/262_miem.jpeg  (5482 B)... OK.\n",
            "  photo_staff/263_miem.jpeg  (9484 B)... OK.\n",
            "  photo_staff/264_miem.jpeg  (5268 B)... OK.\n",
            "  photo_staff/265_miem.jpeg  (5507 B)... OK.\n",
            "  photo_staff/266_miem.jpeg  (5765 B)... OK.\n",
            "  photo_staff/267_miem.jpeg  (8041 B)... OK.\n",
            "  photo_staff/268_miem.jpeg  (5000 B)... OK.\n",
            "  photo_staff/269_miem.jpeg  (6094 B)... OK.\n",
            "  photo_staff/26_miem.jpeg  (5349 B)... OK.\n",
            "  photo_staff/270_miem.jpeg  (5215 B)... OK.\n",
            "  photo_staff/273_miem.jpeg  (5015 B)... OK.\n",
            "  photo_staff/274_miem.jpeg  (37696 B)... OK.\n",
            "  photo_staff/275_miem.jpeg  (6097 B)... OK.\n",
            "  photo_staff/276_miem.jpeg  (4876 B)... OK.\n",
            "  photo_staff/277_miem.jpeg  (6420 B)... OK.\n",
            "  photo_staff/278_miem.jpeg  (5860 B)... OK.\n",
            "  photo_staff/279_miem.jpeg  (5799 B)... OK.\n",
            "  photo_staff/280_miem.jpeg  (3263 B)... OK.\n",
            "  photo_staff/281_miem.jpeg  (6394 B)... OK.\n",
            "  photo_staff/282_miem.jpeg  (7071 B)... OK.\n",
            "  photo_staff/283_miem.jpeg  (5760 B)... OK.\n",
            "  photo_staff/284_miem.jpeg  (3888 B)... OK.\n",
            "  photo_staff/286_miem.jpeg  (4665 B)... OK.\n",
            "  photo_staff/287_miem.jpeg  (5000 B)... OK.\n",
            "  photo_staff/288_miem.jpeg  (5992 B)... OK.\n",
            "  photo_staff/290_miem.jpeg  (2425 B)... OK.\n",
            "  photo_staff/291_miem.jpeg  (4691 B)... OK.\n",
            "  photo_staff/292_miem.jpeg  (6110 B)... OK.\n",
            "  photo_staff/293_miem.jpeg  (7325 B)... OK.\n",
            "  photo_staff/294_miem.jpeg  (3047 B)... OK.\n",
            "  photo_staff/295_miem.jpeg  (6288 B)... OK.\n",
            "  photo_staff/296_miem.jpeg  (4684 B)... OK.\n",
            "  photo_staff/297_miem.jpeg  (6390 B)... OK.\n",
            "  photo_staff/298_miem.jpeg  (8162 B)... OK.\n",
            "  photo_staff/299_miem.jpeg  (6584 B)... OK.\n",
            "  photo_staff/2_miem.jpeg  (8984 B)... OK.\n",
            "  photo_staff/300_miem.jpeg  (5224 B)... OK.\n",
            "  photo_staff/301_miem.jpeg  (8130 B)... OK.\n",
            "  photo_staff/302_miem.jpeg  (5245 B)... OK.\n",
            "  photo_staff/303_miem.jpeg  (7583 B)... OK.\n",
            "  photo_staff/305_miem.jpeg  (6448 B)... OK.\n",
            "  photo_staff/306_miem.jpeg  (2986 B)... OK.\n",
            "  photo_staff/307_miem.jpeg  (5250 B)... OK.\n",
            "  photo_staff/308_miem.jpeg  (6689 B)... OK.\n",
            "  photo_staff/309_miem.jpeg  (8221 B)... OK.\n",
            "  photo_staff/30_miem.jpeg  (88767 B)... OK.\n",
            "  photo_staff/310_miem.jpeg  (4541 B)... OK.\n",
            "  photo_staff/311_miem.jpeg  (8891 B)... OK.\n",
            "  photo_staff/312_miem.jpeg  (6090 B)... OK.\n",
            "  photo_staff/313_miem.jpeg  (5846 B)... OK.\n",
            "  photo_staff/314_miem.jpeg  (64319 B)... OK.\n",
            "  photo_staff/315_miem.jpeg  (5008 B)... OK.\n",
            "  photo_staff/316_miem.jpeg  (6002 B)... OK.\n",
            "  photo_staff/317_miem.jpeg  (10584 B)... OK.\n",
            "  photo_staff/318_miem.jpeg  (4778 B)... OK.\n",
            "  photo_staff/319_miem.jpeg  (7057 B)... OK.\n",
            "  photo_staff/31_miem.jpeg  (5212 B)... OK.\n",
            "  photo_staff/320_miem.jpeg  (6827 B)... OK.\n",
            "  photo_staff/321_miem.jpeg  (6849 B)... OK.\n",
            "  photo_staff/323_miem.jpeg  (1653 B)... OK.\n",
            "  photo_staff/324_miem.jpeg  (7978 B)... OK.\n",
            "  photo_staff/325_miem.jpeg  (5971 B)... OK.\n",
            "  photo_staff/326_miem.jpeg  (3739 B)... OK.\n",
            "  photo_staff/327_zulip.jpeg  (285865 B)... OK.\n",
            "  photo_staff/328_miem.jpeg  (4336 B)... OK.\n",
            "  photo_staff/328_zulip.jpeg  (130017 B)... OK.\n",
            "  photo_staff/329_miem.jpeg  (5709 B)... OK.\n",
            "  photo_staff/32_miem.jpeg  (5607 B)... OK.\n",
            "  photo_staff/330_miem.jpeg  (3313 B)... OK.\n",
            "  photo_staff/332_miem.jpeg  (4803 B)... OK.\n",
            "  photo_staff/333_miem.jpeg  (2078 B)... OK.\n",
            "  photo_staff/334_miem.jpeg  (2752 B)... OK.\n",
            "  photo_staff/335_miem.jpeg  (5349 B)... OK.\n",
            "  photo_staff/337_miem.jpeg  (482 B)... OK.\n",
            "  photo_staff/339_miem.jpeg  (6481 B)... OK.\n",
            "  photo_staff/340_miem.jpeg  (4518 B)... OK.\n",
            "  photo_staff/341_miem.jpeg  (30297 B)... OK.\n",
            "  photo_staff/342_miem.jpeg  (6642 B)... OK.\n",
            "  photo_staff/343_miem.jpeg  (10297 B)... OK.\n",
            "  photo_staff/344_miem.jpeg  (27228 B)... OK.\n",
            "  photo_staff/345_miem.jpeg  (1022 B)... OK.\n",
            "  photo_staff/346_miem.jpeg  (6681 B)... OK.\n",
            "  photo_staff/347_miem.jpeg  (7196 B)... OK.\n",
            "  photo_staff/348_miem.jpeg  (4956 B)... OK.\n",
            "  photo_staff/349_miem.jpeg  (5729 B)... OK.\n",
            "  photo_staff/34_miem.jpeg  (4667 B)... OK.\n",
            "  photo_staff/350_miem.jpeg  (14687 B)... OK.\n",
            "  photo_staff/351_miem.jpeg  (6205 B)... OK.\n",
            "  photo_staff/352_miem.jpeg  (3573 B)... OK.\n",
            "  photo_staff/353_miem.jpeg  (3535 B)... OK.\n",
            "  photo_staff/354_miem.jpeg  (1753 B)... OK.\n",
            "  photo_staff/355_miem.jpeg  (7241 B)... OK.\n",
            "  photo_staff/356_miem.jpeg  (5511 B)... OK.\n",
            "  photo_staff/357_miem.jpeg  (7162 B)... OK.\n",
            "  photo_staff/358_miem.jpeg  (6611 B)... OK.\n",
            "  photo_staff/358_zulip.jpeg  (282267 B)... OK.\n",
            "  photo_staff/359_miem.jpeg  (6475 B)... OK.\n",
            "  photo_staff/360_miem.jpeg  (5955 B)... OK.\n",
            "  photo_staff/363_miem.jpeg  (67998 B)... OK.\n",
            "  photo_staff/364_miem.jpeg  (7526 B)... OK.\n",
            "  photo_staff/365_miem.jpeg  (6074 B)... OK.\n",
            "  photo_staff/366_miem.jpeg  (6962 B)... OK.\n",
            "  photo_staff/367_miem.jpeg  (6331 B)... OK.\n",
            "  photo_staff/368_miem.jpeg  (7540 B)... OK.\n",
            "  photo_staff/369_miem.jpeg  (3611 B)... OK.\n",
            "  photo_staff/36_miem.jpeg  (5357 B)... OK.\n",
            "  photo_staff/370_miem.jpeg  (6320 B)... OK.\n",
            "  photo_staff/371_miem.jpeg  (5508 B)... OK.\n",
            "  photo_staff/372_miem.jpeg  (7627 B)... OK.\n",
            "  photo_staff/374_miem.jpeg  (6726 B)... OK.\n",
            "  photo_staff/375_miem.jpeg  (7590 B)... OK.\n",
            "  photo_staff/376_miem.jpeg  (6616 B)... OK.\n",
            "  photo_staff/377_miem.jpeg  (9986 B)... OK.\n",
            "  photo_staff/378_miem.jpeg  (7323 B)... OK.\n",
            "  photo_staff/379_miem.jpeg  (7065 B)... OK.\n",
            "  photo_staff/37_miem.jpeg  (6361 B)... OK.\n",
            "  photo_staff/380_miem.jpeg  (5498 B)... Failed! (Attempted to read more data than was available)\n",
            "  photo_staff/381_miem.jpeg  (50338 B)... OK.\n",
            "  photo_staff/382_miem.jpeg  (5353 B)... OK.\n",
            "  photo_staff/383_miem.jpeg  (3807 B)... OK.\n",
            "  photo_staff/384_miem.jpeg  (5963 B)... OK.\n",
            "  photo_staff/385_miem.jpeg  (9280 B)... OK.\n",
            "  photo_staff/386_miem.jpeg  (99484 B)... OK.\n",
            "  photo_staff/387_miem.jpeg  (7618 B)... OK.\n",
            "  photo_staff/388_miem.jpeg  (87012 B)... OK.\n",
            "  photo_staff/389_miem.jpeg  (22658 B)... OK.\n",
            "  photo_staff/38_miem.jpeg  (6069 B)... OK.\n",
            "  photo_staff/390_miem.jpeg  (6993 B)... OK.\n",
            "  photo_staff/391_miem.jpeg  (7265 B)... OK.\n",
            "  photo_staff/391_zulip.jpeg  (206414 B)... OK.\n",
            "  photo_staff/392_miem.jpeg  (7541 B)... OK.\n",
            "  photo_staff/393_miem.jpeg  (5923 B)... OK.\n",
            "  photo_staff/394_miem.jpeg  (5633 B)... OK.\n",
            "  photo_staff/395_miem.jpeg  (8026 B)... OK.\n",
            "  photo_staff/396_miem.jpeg  (8011 B)... OK.\n",
            "  photo_staff/397_miem.jpeg  (104620 B)... OK.\n",
            "  photo_staff/399_miem.jpeg  (8620 B)... OK.\n",
            "  photo_staff/39_miem.jpeg  (4074 B)... OK.\n",
            "  photo_staff/3_miem.jpeg  (6106 B)... OK.\n",
            "  photo_staff/400_miem.jpeg  (5388 B)... OK.\n",
            "  photo_staff/401_miem.jpeg  (7966 B)... OK.\n",
            "  photo_staff/402_miem.jpeg  (8886 B)... OK.\n",
            "  photo_staff/403_miem.jpeg  (38009 B)... OK.\n",
            "  photo_staff/404_miem.jpeg  (5882 B)... OK.\n",
            "  photo_staff/405_miem.jpeg  (6919 B)... OK.\n",
            "  photo_staff/406_miem.jpeg  (5032 B)... OK.\n",
            "  photo_staff/407_miem.jpeg  (5997 B)... OK.\n",
            "  photo_staff/408_miem.jpeg  (4714 B)... OK.\n",
            "  photo_staff/40_miem.jpeg  (8492 B)... OK.\n",
            "  photo_staff/410_miem.jpeg  (5206 B)... OK.\n",
            "  photo_staff/411_miem.jpeg  (6095 B)... OK.\n",
            "  photo_staff/412_miem.jpeg  (7087 B)... OK.\n",
            "  photo_staff/413_miem.jpeg  (7260 B)... OK.\n",
            "  photo_staff/414_miem.jpeg  (5762 B)... OK.\n",
            "  photo_staff/415_miem.jpeg  (98846 B)... OK.\n",
            "  photo_staff/416_miem.jpeg  (5351 B)... OK.\n",
            "  photo_staff/417_miem.jpeg  (2836 B)... OK.\n",
            "  photo_staff/418_miem.jpeg  (5547 B)... OK.\n",
            "  photo_staff/419_miem.jpeg  (8907 B)... OK.\n",
            "  photo_staff/41_miem.jpeg  (5495 B)... OK.\n",
            "  photo_staff/420_miem.jpeg  (4811 B)... OK.\n",
            "  photo_staff/421_miem.jpeg  (8682 B)... OK.\n",
            "  photo_staff/422_miem.jpeg  (6724 B)... OK.\n",
            "  photo_staff/424_miem.jpeg  (4922 B)... OK.\n",
            "  photo_staff/425_miem.jpeg  (8094 B)... OK.\n",
            "  photo_staff/426_miem.jpeg  (5786 B)... OK.\n",
            "  photo_staff/427_miem.jpeg  (4122 B)... OK.\n",
            "  photo_staff/428_miem.jpeg  (7069 B)... OK.\n",
            "  photo_staff/429_miem.jpeg  (5789 B)... OK.\n",
            "  photo_staff/42_miem.jpeg  (5668 B)... OK.\n",
            "  photo_staff/430_miem.jpeg  (8605 B)... OK.\n",
            "  photo_staff/431_miem.jpeg  (5848 B)... OK.\n",
            "  photo_staff/432_miem.jpeg  (5138 B)... OK.\n",
            "  photo_staff/433_miem.jpeg  (6004 B)... OK.\n",
            "  photo_staff/434_miem.jpeg  (7309 B)... OK.\n",
            "  photo_staff/435_miem.jpeg  (69476 B)... OK.\n",
            "  photo_staff/436_miem.jpeg  (5368 B)... OK.\n",
            "  photo_staff/437_miem.jpeg  (79000 B)... OK.\n",
            "  photo_staff/438_miem.jpeg  (6011 B)... OK.\n",
            "  photo_staff/439_miem.jpeg  (5507 B)... OK.\n",
            "  photo_staff/43_miem.jpeg  (2807 B)... OK.\n",
            "  photo_staff/440_miem.jpeg  (6709 B)... OK.\n",
            "  photo_staff/441_miem.jpeg  (5569 B)... OK.\n",
            "  photo_staff/442_miem.jpeg  (5425 B)... OK.\n",
            "  photo_staff/443_miem.jpeg  (7289 B)... OK.\n",
            "  photo_staff/444_miem.jpeg  (8711 B)... OK.\n",
            "  photo_staff/445_miem.jpeg  (10421 B)... OK.\n",
            "  photo_staff/446_miem.jpeg  (5345 B)... OK.\n",
            "  photo_staff/447_miem.jpeg  (7814 B)... OK.\n",
            "  photo_staff/448_miem.jpeg  (6301 B)... OK.\n",
            "  photo_staff/449_miem.jpeg  (8809 B)... OK.\n",
            "  photo_staff/44_miem.jpeg  (3885 B)... OK.\n",
            "  photo_staff/450_miem.jpeg  (6154 B)... OK.\n",
            "  photo_staff/451_miem.jpeg  (57276 B)... OK.\n",
            "  photo_staff/452_miem.jpeg  (6910 B)... OK.\n",
            "  photo_staff/454_miem.jpeg  (5011 B)... OK.\n",
            "  photo_staff/455_miem.jpeg  (87724 B)... OK.\n",
            "  photo_staff/456_miem.jpeg  (4726 B)... OK.\n",
            "  photo_staff/457_zulip.jpeg  (364912 B)... OK.\n",
            "  photo_staff/458_miem.jpeg  (9256 B)... OK.\n",
            "  photo_staff/459_miem.jpeg  (5027 B)... OK.\n",
            "  photo_staff/461_miem.jpeg  (6618 B)... OK.\n",
            "  photo_staff/462_miem.jpeg  (5855 B)... OK.\n",
            "  photo_staff/463_miem.jpeg  (6668 B)... OK.\n",
            "  photo_staff/464_miem.jpeg  (55350 B)... OK.\n",
            "  photo_staff/465_miem.jpeg  (1748 B)... OK.\n",
            "  photo_staff/466_miem.jpeg  (6264 B)... OK.\n",
            "  photo_staff/467_miem.jpeg  (6385 B)... OK.\n",
            "  photo_staff/469_miem.jpeg  (6443 B)... OK.\n",
            "  photo_staff/470_miem.jpeg  (9962 B)... OK.\n",
            "  photo_staff/471_miem.jpeg  (5450 B)... OK.\n",
            "  photo_staff/472_miem.jpeg  (5751 B)... OK.\n",
            "  photo_staff/473_miem.jpeg  (5507 B)... OK.\n",
            "  photo_staff/474_miem.jpeg  (8639 B)... OK.\n",
            "  photo_staff/475_miem.jpeg  (9839 B)... OK.\n",
            "  photo_staff/476_miem.jpeg  (5692 B)... OK.\n",
            "  photo_staff/477_miem.jpeg  (6277 B)... OK.\n",
            "  photo_staff/478_miem.jpeg  (5974 B)... OK.\n",
            "  photo_staff/479_miem.jpeg  (6442 B)... OK.\n",
            "  photo_staff/47_miem.jpeg  (6839 B)... OK.\n",
            "  photo_staff/480_miem.jpeg  (6930 B)... OK.\n",
            "  photo_staff/482_miem.jpeg  (9626 B)... OK.\n",
            "  photo_staff/483_miem.jpeg  (4678 B)... OK.\n",
            "  photo_staff/484_miem.jpeg  (8470 B)... OK.\n",
            "  photo_staff/485_miem.jpeg  (6086 B)... OK.\n",
            "  photo_staff/486_miem.jpeg  (5477 B)... OK.\n",
            "  photo_staff/487_miem.jpeg  (4573 B)... OK.\n",
            "  photo_staff/488_miem.jpeg  (6125 B)... OK.\n",
            "  photo_staff/488_zulip.jpeg  (323328 B)... OK.\n",
            "  photo_staff/489_miem.jpeg  (5342 B)... OK.\n",
            "  photo_staff/48_miem.jpeg  (5870 B)... OK.\n",
            "  photo_staff/490_miem.jpeg  (7333 B)... OK.\n",
            "  photo_staff/491_miem.jpeg  (7150 B)... OK.\n",
            "  photo_staff/491_zulip.jpeg  (383342 B)... OK.\n",
            "  photo_staff/492_miem.jpeg  (7684 B)... OK.\n",
            "  photo_staff/492_zulip.jpeg  (273271 B)... OK.\n",
            "  photo_staff/4_miem.jpeg  (5779 B)... OK.\n",
            "  photo_staff/50_miem.jpeg  (8250 B)... OK.\n",
            "  photo_staff/50_zulip.jpeg  (294810 B)... OK.\n",
            "  photo_staff/51_miem.jpeg  (7543 B)... OK.\n",
            "  photo_staff/53_miem.jpeg  (5861 B)... OK.\n",
            "  photo_staff/54_miem.jpeg  (5298 B)... OK.\n",
            "  photo_staff/55_miem.jpeg  (5576 B)... OK.\n",
            "  photo_staff/56_miem.jpeg  (6335 B)... OK.\n",
            "  photo_staff/57_miem.jpeg  (5428 B)... OK.\n",
            "  photo_staff/5_miem.jpeg  (7677 B)... OK.\n",
            "  photo_staff/5_zulip.jpeg  (282302 B)... OK.\n",
            "  photo_staff/61_miem.jpeg  (5902 B)... OK.\n",
            "  photo_staff/63_zulip.jpeg  (203783 B)... OK.\n",
            "  photo_staff/64_miem.jpeg  (7461 B)... OK.\n",
            "  photo_staff/67_miem.jpeg  (12515 B)... OK.\n",
            "  photo_staff/69_miem.jpeg  (3092 B)... OK.\n",
            "  photo_staff/6_miem.jpeg  (7562 B)... OK.\n",
            "  photo_staff/70_miem.jpeg  (6885 B)... OK.\n",
            "  photo_staff/71_miem.jpeg  (7309 B)... OK.\n",
            "  photo_staff/72_miem.jpeg  (7020 B)... OK.\n",
            "  photo_staff/73_miem.jpeg  (100940 B)... OK.\n",
            "  photo_staff/74_miem.jpeg  (4864 B)... OK.\n",
            "  photo_staff/74_zulip.jpeg  (430367 B)... OK.\n",
            "  photo_staff/75_miem.jpeg  (8296 B)... OK.\n",
            "  photo_staff/76_miem.jpeg  (9258 B)... OK.\n",
            "  photo_staff/77_miem.jpeg  (8773 B)... OK.\n",
            "  photo_staff/78_miem.jpeg  (5525 B)... OK.\n",
            "  photo_staff/79_miem.jpeg  (5333 B)... OK.\n",
            "  photo_staff/7_miem.jpeg  (7660 B)... OK.\n",
            "  photo_staff/80_miem.jpeg  (5695 B)... OK.\n",
            "  photo_staff/81_miem.jpeg  (6421 B)... OK.\n",
            "  photo_staff/82_miem.jpeg  (6498 B)... OK.\n",
            "  photo_staff/83_miem.jpeg  (7871 B)... OK.\n",
            "  photo_staff/84_miem.jpeg  (2213 B)... OK.\n",
            "  photo_staff/85_miem.jpeg  (4937 B)... OK.\n",
            "  photo_staff/86_miem.jpeg  (6492 B)... OK.\n",
            "  photo_staff/87_miem.jpeg  (5516 B)... OK.\n",
            "  photo_staff/8_miem.jpeg  (5702 B)... OK.\n",
            "  photo_staff/8_zulip.jpeg  (479490 B)... OK.\n",
            "  photo_staff/90_miem.jpeg  (7971 B)... OK.\n",
            "  photo_staff/91_miem.jpeg  (6585 B)... OK.\n",
            "  photo_staff/92_miem.jpeg  (7503 B)... OK.\n",
            "  photo_staff/94_miem.jpeg  (7179 B)... OK.\n",
            "  photo_staff/95_miem.jpeg  (6602 B)... OK.\n",
            "  photo_staff/97_miem.jpeg  (8291 B)... OK.\n",
            "  photo_staff/98_miem.jpeg  (3954 B)... OK.\n",
            "  photo_staff/9_miem.jpeg  (5749 B)... OK.\n",
            "  photo_staff/9_zulip.jpeg  (421716 B)... OK.\n",
            "  photo_staff/  (dir)... OK.\n",
            "Extraction to current directory failed! (3 files failed.)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install deepface"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cyhE-ThTWUkN",
        "outputId": "dba9b831-9eab-438d-9108-ce2e02f13fa0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting deepface\n",
            "  Downloading deepface-0.0.93-py3-none-any.whl.metadata (30 kB)\n",
            "Requirement already satisfied: requests>=2.27.1 in /usr/local/lib/python3.11/dist-packages (from deepface) (2.32.3)\n",
            "Requirement already satisfied: numpy>=1.14.0 in /usr/local/lib/python3.11/dist-packages (from deepface) (1.26.4)\n",
            "Requirement already satisfied: pandas>=0.23.4 in /usr/local/lib/python3.11/dist-packages (from deepface) (2.2.2)\n",
            "Requirement already satisfied: gdown>=3.10.1 in /usr/local/lib/python3.11/dist-packages (from deepface) (5.2.0)\n",
            "Requirement already satisfied: tqdm>=4.30.0 in /usr/local/lib/python3.11/dist-packages (from deepface) (4.67.1)\n",
            "Requirement already satisfied: Pillow>=5.2.0 in /usr/local/lib/python3.11/dist-packages (from deepface) (11.1.0)\n",
            "Requirement already satisfied: opencv-python>=4.5.5.64 in /usr/local/lib/python3.11/dist-packages (from deepface) (4.10.0.84)\n",
            "Requirement already satisfied: tensorflow>=1.9.0 in /usr/local/lib/python3.11/dist-packages (from deepface) (2.17.1)\n",
            "Requirement already satisfied: keras>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from deepface) (3.5.0)\n",
            "Requirement already satisfied: Flask>=1.1.2 in /usr/local/lib/python3.11/dist-packages (from deepface) (3.1.0)\n",
            "Collecting flask-cors>=4.0.1 (from deepface)\n",
            "  Downloading Flask_Cors-5.0.0-py2.py3-none-any.whl.metadata (5.5 kB)\n",
            "Collecting mtcnn>=0.1.0 (from deepface)\n",
            "  Downloading mtcnn-1.0.0-py3-none-any.whl.metadata (5.8 kB)\n",
            "Collecting retina-face>=0.0.1 (from deepface)\n",
            "  Downloading retina_face-0.0.17-py3-none-any.whl.metadata (10 kB)\n",
            "Collecting fire>=0.4.0 (from deepface)\n",
            "  Downloading fire-0.7.0.tar.gz (87 kB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m87.2/87.2 kB\u001b[0m \u001b[31m6.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "Collecting gunicorn>=20.1.0 (from deepface)\n",
            "  Downloading gunicorn-23.0.0-py3-none-any.whl.metadata (4.4 kB)\n",
            "Requirement already satisfied: termcolor in /usr/local/lib/python3.11/dist-packages (from fire>=0.4.0->deepface) (2.5.0)\n",
            "Requirement already satisfied: Werkzeug>=3.1 in /usr/local/lib/python3.11/dist-packages (from Flask>=1.1.2->deepface) (3.1.3)\n",
            "Requirement already satisfied: Jinja2>=3.1.2 in /usr/local/lib/python3.11/dist-packages (from Flask>=1.1.2->deepface) (3.1.5)\n",
            "Requirement already satisfied: itsdangerous>=2.2 in /usr/local/lib/python3.11/dist-packages (from Flask>=1.1.2->deepface) (2.2.0)\n",
            "Requirement already satisfied: click>=8.1.3 in /usr/local/lib/python3.11/dist-packages (from Flask>=1.1.2->deepface) (8.1.8)\n",
            "Requirement already satisfied: blinker>=1.9 in /usr/local/lib/python3.11/dist-packages (from Flask>=1.1.2->deepface) (1.9.0)\n",
            "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.11/dist-packages (from gdown>=3.10.1->deepface) (4.12.3)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from gdown>=3.10.1->deepface) (3.17.0)\n",
            "Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from gunicorn>=20.1.0->deepface) (24.2)\n",
            "Requirement already satisfied: absl-py in /usr/local/lib/python3.11/dist-packages (from keras>=2.2.0->deepface) (1.4.0)\n",
            "Requirement already satisfied: rich in /usr/local/lib/python3.11/dist-packages (from keras>=2.2.0->deepface) (13.9.4)\n",
            "Requirement already satisfied: namex in /usr/local/lib/python3.11/dist-packages (from keras>=2.2.0->deepface) (0.0.8)\n",
            "Requirement already satisfied: h5py in /usr/local/lib/python3.11/dist-packages (from keras>=2.2.0->deepface) (3.12.1)\n",
            "Requirement already satisfied: optree in /usr/local/lib/python3.11/dist-packages (from keras>=2.2.0->deepface) (0.14.0)\n",
            "Requirement already satisfied: ml-dtypes in /usr/local/lib/python3.11/dist-packages (from keras>=2.2.0->deepface) (0.4.1)\n",
            "Requirement already satisfied: joblib>=1.4.2 in /usr/local/lib/python3.11/dist-packages (from mtcnn>=0.1.0->deepface) (1.4.2)\n",
            "Collecting lz4>=4.3.3 (from mtcnn>=0.1.0->deepface)\n",
            "  Downloading lz4-4.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.8 kB)\n",
            "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas>=0.23.4->deepface) (2.8.2)\n",
            "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=0.23.4->deepface) (2024.2)\n",
            "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=0.23.4->deepface) (2025.1)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests>=2.27.1->deepface) (3.4.1)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests>=2.27.1->deepface) (3.10)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests>=2.27.1->deepface) (2.3.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests>=2.27.1->deepface) (2024.12.14)\n",
            "Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (1.6.3)\n",
            "Requirement already satisfied: flatbuffers>=24.3.25 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (25.1.21)\n",
            "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (0.6.0)\n",
            "Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (0.2.0)\n",
            "Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (18.1.1)\n",
            "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (3.4.0)\n",
            "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (4.25.5)\n",
            "Requirement already satisfied: setuptools in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (75.1.0)\n",
            "Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (1.17.0)\n",
            "Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (4.12.2)\n",
            "Requirement already satisfied: wrapt>=1.11.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (1.17.2)\n",
            "Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (1.69.0)\n",
            "Requirement already satisfied: tensorboard<2.18,>=2.17 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (2.17.1)\n",
            "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow>=1.9.0->deepface) (0.37.1)\n",
            "Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from astunparse>=1.6.0->tensorflow>=1.9.0->deepface) (0.45.1)\n",
            "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from Jinja2>=3.1.2->Flask>=1.1.2->deepface) (3.0.2)\n",
            "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.18,>=2.17->tensorflow>=1.9.0->deepface) (3.7)\n",
            "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.18,>=2.17->tensorflow>=1.9.0->deepface) (0.7.2)\n",
            "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.11/dist-packages (from beautifulsoup4->gdown>=3.10.1->deepface) (2.6)\n",
            "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown>=3.10.1->deepface) (1.7.1)\n",
            "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich->keras>=2.2.0->deepface) (3.0.0)\n",
            "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.11/dist-packages (from rich->keras>=2.2.0->deepface) (2.18.0)\n",
            "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich->keras>=2.2.0->deepface) (0.1.2)\n",
            "Downloading deepface-0.0.93-py3-none-any.whl (108 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m108.6/108.6 kB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading Flask_Cors-5.0.0-py2.py3-none-any.whl (14 kB)\n",
            "Downloading gunicorn-23.0.0-py3-none-any.whl (85 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m85.0/85.0 kB\u001b[0m \u001b[31m9.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading mtcnn-1.0.0-py3-none-any.whl (1.9 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.9/1.9 MB\u001b[0m \u001b[31m58.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading retina_face-0.0.17-py3-none-any.whl (25 kB)\n",
            "Downloading lz4-4.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m51.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hBuilding wheels for collected packages: fire\n",
            "  Building wheel for fire (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "  Created wheel for fire: filename=fire-0.7.0-py3-none-any.whl size=114249 sha256=558ba068590f21df6e831fb038895903bae7cc63b30a3c0c5881d536bd7e9df4\n",
            "  Stored in directory: /root/.cache/pip/wheels/46/54/24/1624fd5b8674eb1188623f7e8e17cdf7c0f6c24b609dfb8a89\n",
            "Successfully built fire\n",
            "Installing collected packages: lz4, gunicorn, fire, mtcnn, flask-cors, retina-face, deepface\n",
            "Successfully installed deepface-0.0.93 fire-0.7.0 flask-cors-5.0.0 gunicorn-23.0.0 lz4-4.4.3 mtcnn-1.0.0 retina-face-0.0.17\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Удалим дубликаты"
      ],
      "metadata": {
        "id": "y_EqVsq8YGyy"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "\n",
        "df = pd.read_csv(\"staff_photo.csv\")\n",
        "df = df.drop_duplicates(\"id\", keep=\"first\")\n",
        "df"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 424
        },
        "id": "tL5Y6RkbWXDK",
        "outputId": "b19a1ace-066c-4b42-f603-b97b8f82da66"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "      id                             name source  \\\n",
              "0      1        Аксенов Сергей Алексеевич   miem   \n",
              "1      2           Крук Евгений Аврамович   miem   \n",
              "2      3     Крючкова Елена Александровна   miem   \n",
              "3      4           Седова Татьяна Львовна   miem   \n",
              "4      5  Тумковский Сергей Ростиславович   miem   \n",
              "..   ...                              ...    ...   \n",
              "456  488     Семичаснов Илья Владимирович   miem   \n",
              "458  489      Беланов Сергей Владимирович   miem   \n",
              "459  490        Крепкер Виктор Алексеевич   miem   \n",
              "460  491         Михеева Ольга Леонидовна   miem   \n",
              "462  492   Семион Александр Александрович   miem   \n",
              "\n",
              "                                           origin_url       filename  \n",
              "0     https://miem.hse.ru/org/persons/cimage/47634915    1_miem.jpeg  \n",
              "1    https://miem.hse.ru/org/persons/cimage/205587707    2_miem.jpeg  \n",
              "2     https://miem.hse.ru/org/persons/cimage/47632289    3_miem.jpeg  \n",
              "3     https://miem.hse.ru/org/persons/cimage/80597137    4_miem.jpeg  \n",
              "4     https://miem.hse.ru/org/persons/cimage/47632180    5_miem.jpeg  \n",
              "..                                                ...            ...  \n",
              "456  https://miem.hse.ru/org/persons/cimage/160996045  488_miem.jpeg  \n",
              "458  https://miem.hse.ru/org/persons/cimage/133641177  489_miem.jpeg  \n",
              "459  https://miem.hse.ru/org/persons/cimage/401613715  490_miem.jpeg  \n",
              "460  https://miem.hse.ru/org/persons/cimage/139815451  491_miem.jpeg  \n",
              "462   https://miem.hse.ru/org/persons/cimage/65848748  492_miem.jpeg  \n",
              "\n",
              "[439 rows x 5 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-7443c0b4-7be6-4a83-bf67-8b98cd25fa55\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>id</th>\n",
              "      <th>name</th>\n",
              "      <th>source</th>\n",
              "      <th>origin_url</th>\n",
              "      <th>filename</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>1</td>\n",
              "      <td>Аксенов Сергей Алексеевич</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/47634915</td>\n",
              "      <td>1_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2</td>\n",
              "      <td>Крук Евгений Аврамович</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/205587707</td>\n",
              "      <td>2_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>Крючкова Елена Александровна</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/47632289</td>\n",
              "      <td>3_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>4</td>\n",
              "      <td>Седова Татьяна Львовна</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/80597137</td>\n",
              "      <td>4_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>5</td>\n",
              "      <td>Тумковский Сергей Ростиславович</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/47632180</td>\n",
              "      <td>5_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>456</th>\n",
              "      <td>488</td>\n",
              "      <td>Семичаснов Илья Владимирович</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/160996045</td>\n",
              "      <td>488_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>458</th>\n",
              "      <td>489</td>\n",
              "      <td>Беланов Сергей Владимирович</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/133641177</td>\n",
              "      <td>489_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>459</th>\n",
              "      <td>490</td>\n",
              "      <td>Крепкер Виктор Алексеевич</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/401613715</td>\n",
              "      <td>490_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>460</th>\n",
              "      <td>491</td>\n",
              "      <td>Михеева Ольга Леонидовна</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/139815451</td>\n",
              "      <td>491_miem.jpeg</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>462</th>\n",
              "      <td>492</td>\n",
              "      <td>Семион Александр Александрович</td>\n",
              "      <td>miem</td>\n",
              "      <td>https://miem.hse.ru/org/persons/cimage/65848748</td>\n",
              "      <td>492_miem.jpeg</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>439 rows × 5 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-7443c0b4-7be6-4a83-bf67-8b98cd25fa55')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-7443c0b4-7be6-4a83-bf67-8b98cd25fa55 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-7443c0b4-7be6-4a83-bf67-8b98cd25fa55');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-8a653582-2d13-47a1-93fb-2c30595955fb\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-8a653582-2d13-47a1-93fb-2c30595955fb')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-8a653582-2d13-47a1-93fb-2c30595955fb button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 439,\n  \"fields\": [\n    {\n      \"column\": \"id\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 140,\n        \"min\": 1,\n        \"max\": 492,\n        \"num_unique_values\": 439,\n        \"samples\": [\n          305,\n          102,\n          394\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"name\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 439,\n        \"samples\": [\n          \"\\u0421\\u0442\\u0435\\u0433\\u0430\\u0439\\u043b\\u043e\\u0432 \\u0412\\u043b\\u0430\\u0434\\u0438\\u043c\\u0438\\u0440 \\u0412\\u043b\\u0430\\u0434\\u0438\\u043c\\u0438\\u0440\\u043e\\u0432\\u0438\\u0447\",\n          \"\\u0422\\u0438\\u0445\\u043e\\u043d\\u043e\\u0432\\u0430 \\u0418\\u0440\\u0438\\u043d\\u0430 \\u0410\\u0444\\u0430\\u043d\\u0430\\u0441\\u044c\\u0435\\u0432\\u043d\\u0430\",\n          \"\\u041a\\u0443\\u0433\\u0435\\u043b\\u044c \\u041a\\u043b\\u0438\\u043c\\u0435\\u043d\\u0442 \\u0418\\u043b\\u044c\\u0438\\u0447\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"source\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"zulip\",\n          \"miem\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"origin_url\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 439,\n        \"samples\": [\n          \"https://miem.hse.ru/org/persons/cimage/113170184\",\n          \"https://miem.hse.ru/org/persons/cimage/202085388\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"filename\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 439,\n        \"samples\": [\n          \"305_miem.jpeg\",\n          \"102_miem.jpeg\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Запускать будем на CPU, потому качаем либу для него"
      ],
      "metadata": {
        "id": "83zrFmslYKWP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install faiss-cpu"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "chifbNyvfHpX",
        "outputId": "89a7d456-f347-43aa-ceb5-0c87f0a74e14"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting faiss-cpu\n",
            "  Downloading faiss_cpu-1.9.0.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.4 kB)\n",
            "Requirement already satisfied: numpy<3.0,>=1.25.0 in /usr/local/lib/python3.11/dist-packages (from faiss-cpu) (1.26.4)\n",
            "Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from faiss-cpu) (24.2)\n",
            "Downloading faiss_cpu-1.9.0.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.5 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m27.5/27.5 MB\u001b[0m \u001b[31m63.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: faiss-cpu\n",
            "Successfully installed faiss-cpu-1.9.0.post1\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Получаем эмбединги и сохраняем их список"
      ],
      "metadata": {
        "id": "SFDs42IaYPnj"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from deepface import DeepFace\n",
        "import faiss\n",
        "\n",
        "\n",
        "files = df[\"filename\"].to_list()\n",
        "vectors = []\n",
        "\n",
        "\n",
        "for i in range(len(files)):\n",
        "  try:\n",
        "    embedding_objs = DeepFace.represent(\n",
        "      img_path = f\"./photo_staff/{files[i]}\",\n",
        "      model_name = \"Facenet\",\n",
        "    )\n",
        "    vectors.append(embedding_objs[0][\"embedding\"])\n",
        "  except ValueError:\n",
        "    vectors.append([10000 for _ in range(128)])\n"
      ],
      "metadata": {
        "id": "oTGNUsisW0yy"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Либо качаем файл с индексами"
      ],
      "metadata": {
        "id": "Iv5vZOm5YZnB"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!gdown 1j-HyJqJVsWUl_2GPp1wTbWwY5AGkAJnf"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "6B1p6N-9OI-B",
        "outputId": "fb569cf7-de15-4498-af0d-23e55bbc509c"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1j-HyJqJVsWUl_2GPp1wTbWwY5AGkAJnf\n",
            "To: /content/indexfile.index\n",
            "\r  0% 0.00/225k [00:00<?, ?B/s]\r100% 225k/225k [00:00<00:00, 99.1MB/s]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Создаём индексы либо читаем их из файла"
      ],
      "metadata": {
        "id": "FjRKXL39Yc_h"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import faiss\n",
        "\n",
        "#d = 128\n",
        "\n",
        "#index = faiss.IndexFlatL2(d)\n",
        "#print(index.is_trained)\n",
        "#print(vectors[0])\n",
        "#index.add(np.array(vectors))\n",
        "index = faiss.read_index(\"indexfile.index\")"
      ],
      "metadata": {
        "id": "Qu6ZTn8wfZzF"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Сохраняем индексы"
      ],
      "metadata": {
        "id": "WETUHqQ-Yirf"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "faiss.write_index(index, \"indexfile.index\")"
      ],
      "metadata": {
        "id": "hzr7b6zm4qmh"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Моё фото"
      ],
      "metadata": {
        "id": "cntf_dxsYnUI"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!gdown 1NemGnZVkEpKVa9wYX42FjjyuoNZQ0sw6"
      ],
      "metadata": {
        "id": "9ZXuhEnGpwBz",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "dc9c8de7-2a0d-499d-ff02-61a2a87152e2"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1NemGnZVkEpKVa9wYX42FjjyuoNZQ0sw6\n",
            "To: /content/IMG20231127133614.jpg\n",
            "\r  0% 0.00/2.06M [00:00<?, ?B/s]\r100% 2.06M/2.06M [00:00<00:00, 149MB/s]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Смотрим на кого я похож"
      ],
      "metadata": {
        "id": "9c3n6ER_Yo1j"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from deepface import DeepFace\n",
        "import numpy as np\n",
        "\n",
        "\n",
        "image = \"/content/IMG20231127133614.jpg\"\n",
        "\n",
        "embedding_objs = DeepFace.represent(\n",
        "      img_path = image,\n",
        "      model_name = \"Facenet\",\n",
        ")\n",
        "\n",
        "distance, index_person = index.search(np.array([embedding_objs[0][\"embedding\"]]), 1)\n",
        "\n",
        "\n",
        "print(f\"{df.loc[df['id'] == index_person[0][0]]['name'].values[0]}, расстояние: {distance[0][0]}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "YldIflnRoihL",
        "outputId": "34387f2f-8e05-4953-e1ff-19cf4a3c0981"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Крючкова Елена Александровна, расстояние: 124.78450012207031\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "..."
      ],
      "metadata": {
        "id": "BGhTO4KmYsKg"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Теперь запустим здесь приложение с веб-интерфейсом"
      ],
      "metadata": {
        "id": "qpXBMgFlYumO"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install streamlit"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "6BfB5RA6yEYx",
        "outputId": "7e346e3a-9533-4165-ca16-ac382b4c9345"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting streamlit\n",
            "  Downloading streamlit-1.41.1-py2.py3-none-any.whl.metadata (8.5 kB)\n",
            "Requirement already satisfied: altair<6,>=4.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (5.5.0)\n",
            "Requirement already satisfied: blinker<2,>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (1.9.0)\n",
            "Requirement already satisfied: cachetools<6,>=4.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (5.5.1)\n",
            "Requirement already satisfied: click<9,>=7.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (8.1.8)\n",
            "Requirement already satisfied: numpy<3,>=1.23 in /usr/local/lib/python3.11/dist-packages (from streamlit) (1.26.4)\n",
            "Requirement already satisfied: packaging<25,>=20 in /usr/local/lib/python3.11/dist-packages (from streamlit) (24.2)\n",
            "Requirement already satisfied: pandas<3,>=1.4.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (2.2.2)\n",
            "Requirement already satisfied: pillow<12,>=7.1.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (11.1.0)\n",
            "Requirement already satisfied: protobuf<6,>=3.20 in /usr/local/lib/python3.11/dist-packages (from streamlit) (4.25.5)\n",
            "Requirement already satisfied: pyarrow>=7.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (17.0.0)\n",
            "Requirement already satisfied: requests<3,>=2.27 in /usr/local/lib/python3.11/dist-packages (from streamlit) (2.32.3)\n",
            "Requirement already satisfied: rich<14,>=10.14.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (13.9.4)\n",
            "Requirement already satisfied: tenacity<10,>=8.1.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (9.0.0)\n",
            "Requirement already satisfied: toml<2,>=0.10.1 in /usr/local/lib/python3.11/dist-packages (from streamlit) (0.10.2)\n",
            "Requirement already satisfied: typing-extensions<5,>=4.3.0 in /usr/local/lib/python3.11/dist-packages (from streamlit) (4.12.2)\n",
            "Collecting watchdog<7,>=2.1.5 (from streamlit)\n",
            "  Downloading watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl.metadata (44 kB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.3/44.3 kB\u001b[0m \u001b[31m1.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hRequirement already satisfied: gitpython!=3.1.19,<4,>=3.0.7 in /usr/local/lib/python3.11/dist-packages (from streamlit) (3.1.44)\n",
            "Collecting pydeck<1,>=0.8.0b4 (from streamlit)\n",
            "  Downloading pydeck-0.9.1-py2.py3-none-any.whl.metadata (4.1 kB)\n",
            "Requirement already satisfied: tornado<7,>=6.0.3 in /usr/local/lib/python3.11/dist-packages (from streamlit) (6.3.3)\n",
            "Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from altair<6,>=4.0->streamlit) (3.1.5)\n",
            "Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.11/dist-packages (from altair<6,>=4.0->streamlit) (4.23.0)\n",
            "Requirement already satisfied: narwhals>=1.14.2 in /usr/local/lib/python3.11/dist-packages (from altair<6,>=4.0->streamlit) (1.23.0)\n",
            "Requirement already satisfied: gitdb<5,>=4.0.1 in /usr/local/lib/python3.11/dist-packages (from gitpython!=3.1.19,<4,>=3.0.7->streamlit) (4.0.12)\n",
            "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas<3,>=1.4.0->streamlit) (2.8.2)\n",
            "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas<3,>=1.4.0->streamlit) (2024.2)\n",
            "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas<3,>=1.4.0->streamlit) (2025.1)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.27->streamlit) (3.4.1)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.27->streamlit) (3.10)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.27->streamlit) (2.3.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.27->streamlit) (2024.12.14)\n",
            "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich<14,>=10.14.0->streamlit) (3.0.0)\n",
            "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.11/dist-packages (from rich<14,>=10.14.0->streamlit) (2.18.0)\n",
            "Requirement already satisfied: smmap<6,>=3.0.1 in /usr/local/lib/python3.11/dist-packages (from gitdb<5,>=4.0.1->gitpython!=3.1.19,<4,>=3.0.7->streamlit) (5.0.2)\n",
            "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->altair<6,>=4.0->streamlit) (3.0.2)\n",
            "Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit) (24.3.0)\n",
            "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit) (2024.10.1)\n",
            "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit) (0.36.1)\n",
            "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=3.0->altair<6,>=4.0->streamlit) (0.22.3)\n",
            "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich<14,>=10.14.0->streamlit) (0.1.2)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas<3,>=1.4.0->streamlit) (1.17.0)\n",
            "Downloading streamlit-1.41.1-py2.py3-none-any.whl (9.1 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.1/9.1 MB\u001b[0m \u001b[31m59.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading pydeck-0.9.1-py2.py3-none-any.whl (6.9 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.9/6.9 MB\u001b[0m \u001b[31m97.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl (79 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m79.1/79.1 kB\u001b[0m \u001b[31m5.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: watchdog, pydeck, streamlit\n",
            "Successfully installed pydeck-0.9.1 streamlit-1.41.1 watchdog-6.0.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Пора создавать туннель"
      ],
      "metadata": {
        "id": "rUv6xPlVYzfN"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!npm install localtunnel"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FlXMBL4ZyNSc",
        "outputId": "6dd12bfb-263e-420a-83ac-d028a3fad29f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1G\u001b[0K⠙\u001b[1G\u001b[0K⠹\u001b[1G\u001b[0K⠸\u001b[1G\u001b[0K⠼\u001b[1G\u001b[0K⠴\u001b[1G\u001b[0K⠦\u001b[1G\u001b[0K⠧\u001b[1G\u001b[0K⠇\u001b[1G\u001b[0K⠏\u001b[1G\u001b[0K⠋\u001b[1G\u001b[0K⠙\u001b[1G\u001b[0K⠹\u001b[1G\u001b[0K⠸\u001b[1G\u001b[0K⠼\u001b[1G\u001b[0K⠴\u001b[1G\u001b[0K⠦\u001b[1G\u001b[0K⠧\u001b[1G\u001b[0K⠇\u001b[1G\u001b[0K⠏\u001b[1G\u001b[0K⠋\u001b[1G\u001b[0K⠙\u001b[1G\u001b[0K⠹\u001b[1G\u001b[0K⠸\u001b[1G\u001b[0K\n",
            "added 22 packages in 3s\n",
            "\u001b[1G\u001b[0K⠸\u001b[1G\u001b[0K\n",
            "\u001b[1G\u001b[0K⠸\u001b[1G\u001b[0K3 packages are looking for funding\n",
            "\u001b[1G\u001b[0K⠸\u001b[1G\u001b[0K  run `npm fund` for details\n",
            "\u001b[1G\u001b[0K⠸\u001b[1G\u001b[0K"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Нужно создать файл питоновский"
      ],
      "metadata": {
        "id": "nEOnHT5CY2iS"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "%%writefile app.py\n",
        "\n",
        "import streamlit as st\n",
        "from deepface import DeepFace\n",
        "import numpy as np\n",
        "from PIL import Image\n",
        "import faiss\n",
        "import pandas as pd\n",
        "\n",
        "\n",
        "df = pd.read_csv(\"staff_photo.csv\")\n",
        "df = df.drop_duplicates(\"id\", keep=\"first\")\n",
        "st.title(\"Кто ты в МИЭМ?\")\n",
        "st.write('Загрузите фото')\n",
        "uploaded_file = st.file_uploader(\"Загрузите файл\", accept_multiple_files=False, type=[\"png\", \"jpeg\"])\n",
        "if uploaded_file is not None:\n",
        "  st.write(f\"Начали подготовку\")\n",
        "  st.image(uploaded_file)\n",
        "  st.caption(\"Ваше фото\")\n",
        "  pilimage = Image.open(uploaded_file).convert(\"RGB\")\n",
        "  data = np.asarray(pilimage)\n",
        "  st.write(f\"{data.shape}\")\n",
        "  try:\n",
        "    embedding_objs = DeepFace.represent(\n",
        "          img_path = data,\n",
        "          model_name = \"Facenet\",\n",
        "    )\n",
        "    index = faiss.read_index(\"indexfile.index\")\n",
        "    distance, index_person = index.search(np.array([embedding_objs[0][\"embedding\"]]), 1)\n",
        "    st.write(f\"{df.loc[df['id'] == index_person[0][0]]['name'].values[0]}, расстояние: {distance[0][0]}\")\n",
        "    st.image(f\"./photo_staff/{df.loc[df['id'] == index_person[0][0]]['filename'].values[0]}\")\n",
        "    st.caption(\"Фото наиболее похожего человека\")\n",
        "  except ValueError:\n",
        "    st.write(\"Не нашлось лица на фотографии!\")\n",
        "\n",
        "\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "YKRTcuxgyKMk",
        "outputId": "9ad62e60-e16d-4610-dfd2-791e8d7898c0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Overwriting app.py\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Запуск приложения"
      ],
      "metadata": {
        "id": "Ymh673niY5Pt"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!streamlit run app.py &>/content/logs.txt & curl ipv4.icanhazip.com"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ea1UQu8_0S9i",
        "outputId": "f2cfad25-9a79-4885-ecca-44b005f01d0f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "34.139.213.15\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "А вот и туннель к нему"
      ],
      "metadata": {
        "id": "Uc5j4yCuY7oZ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!npx localtunnel --port 8501"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1THsbJq60ZuL",
        "outputId": "a1f3a3c3-8195-4f47-c450-037ad9f09a0b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1G\u001b[0K⠙\u001b[1G\u001b[0Kyour url is: https://metal-taxes-shout.loca.lt\n",
            "^C\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Задача 3"
      ],
      "metadata": {
        "id": "baT6uGB4dz4G"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Часть 1"
      ],
      "metadata": {
        "id": "3Yt8pBS1QUGB"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Качаем видосы и списки людей на них"
      ],
      "metadata": {
        "id": "0RCoUl1QY_tb"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import gdown\n",
        "gdown.download_folder(\"https://drive.google.com/drive/folders/1RPORbeVv2n8FccviunYeqcM7n3akVvyz?usp=drive_link\", quiet=True)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "DIf2rvcnd6hZ",
        "outputId": "e22ce928-bd17-406a-ab30-a5c596a3a129"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['/content/videos/54_final.mp4',\n",
              " '/content/videos/74_final.mp4',\n",
              " '/content/videos/112_final.mp4',\n",
              " '/content/videos/116_final.mp4',\n",
              " '/content/videos/118_final.mp4',\n",
              " '/content/videos/125_final.mp4',\n",
              " '/content/videos/olmikheeva.mp4',\n",
              " '/content/videos/palmasizade.mp4',\n",
              " '/content/videos/saslastnikov.mp4',\n",
              " '/content/videos/vvromanov.mp4']"
            ]
          },
          "metadata": {},
          "execution_count": 58
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "gdown.download_folder(\"https://drive.google.com/drive/folders/1pGwlRFBt7mxaDNwIQpNJmkw0YdTeQlZi\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "L5VWBfepk6eJ",
        "outputId": "5a8939de-8c5d-42d5-969e-d8095425c74f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Retrieving folder contents\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Processing file 1lbwtrWIxtz4c2E_L7zOLojtMl6Nmxh-t 54_final.csv\n",
            "Processing file 1zuYhH4WajYzSLV3oVSHF6VWHIcnerR2l 74_final.csv\n",
            "Processing file 1ISYWB1Nf5xX3tGs0s1G_6jNTSwt-Zy-a 112_final.csv\n",
            "Processing file 1EjQ6vuyEvn9RHA1TlcT6uiXG9AjKOp5e 116_final.csv\n",
            "Processing file 1Q3c9XOvvbZ87FfJF70hkRlyw2I11oloM 118_final.csv\n",
            "Processing file 1_SvYu0ka1K9BeDZvOtGaWS_XYAbqFsMx 125_final.csv\n",
            "Processing file 1u8Sxwp71Z6QO3ojrO-RirGdkueYMtYJV olmikheeva_video.csv\n",
            "Processing file 1MfKnfqZpE-QV-wSf0UJl105IcysY9Gho palmasizade_video.csv\n",
            "Processing file 1AZlVuY0csXtbiSfCwXRihL-P3t0FiFEG saslastnikov_video.csv\n",
            "Processing file 18_Yh46ecx1775SOgE1MgWF2-URHH-2fj vvromanov_video.csv\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Retrieving folder contents completed\n",
            "Building directory structure\n",
            "Building directory structure completed\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1lbwtrWIxtz4c2E_L7zOLojtMl6Nmxh-t\n",
            "To: /content/labels/54_final.csv\n",
            "100%|██████████| 1.47k/1.47k [00:00<00:00, 4.11MB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1zuYhH4WajYzSLV3oVSHF6VWHIcnerR2l\n",
            "To: /content/labels/74_final.csv\n",
            "100%|██████████| 1.05k/1.05k [00:00<00:00, 3.06MB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1ISYWB1Nf5xX3tGs0s1G_6jNTSwt-Zy-a\n",
            "To: /content/labels/112_final.csv\n",
            "100%|██████████| 175/175 [00:00<00:00, 147kB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1EjQ6vuyEvn9RHA1TlcT6uiXG9AjKOp5e\n",
            "To: /content/labels/116_final.csv\n",
            "100%|██████████| 232/232 [00:00<00:00, 761kB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1Q3c9XOvvbZ87FfJF70hkRlyw2I11oloM\n",
            "To: /content/labels/118_final.csv\n",
            "100%|██████████| 350/350 [00:00<00:00, 1.06MB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1_SvYu0ka1K9BeDZvOtGaWS_XYAbqFsMx\n",
            "To: /content/labels/125_final.csv\n",
            "100%|██████████| 773/773 [00:00<00:00, 2.39MB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1u8Sxwp71Z6QO3ojrO-RirGdkueYMtYJV\n",
            "To: /content/labels/olmikheeva_video.csv\n",
            "100%|██████████| 128/128 [00:00<00:00, 406kB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1MfKnfqZpE-QV-wSf0UJl105IcysY9Gho\n",
            "To: /content/labels/palmasizade_video.csv\n",
            "100%|██████████| 118/118 [00:00<00:00, 378kB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1AZlVuY0csXtbiSfCwXRihL-P3t0FiFEG\n",
            "To: /content/labels/saslastnikov_video.csv\n",
            "100%|██████████| 481/481 [00:00<00:00, 1.80MB/s]\n",
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=18_Yh46ecx1775SOgE1MgWF2-URHH-2fj\n",
            "To: /content/labels/vvromanov_video.csv\n",
            "100%|██████████| 90.0/90.0 [00:00<00:00, 317kB/s]\n",
            "Download completed\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['/content/labels/54_final.csv',\n",
              " '/content/labels/74_final.csv',\n",
              " '/content/labels/112_final.csv',\n",
              " '/content/labels/116_final.csv',\n",
              " '/content/labels/118_final.csv',\n",
              " '/content/labels/125_final.csv',\n",
              " '/content/labels/olmikheeva_video.csv',\n",
              " '/content/labels/palmasizade_video.csv',\n",
              " '/content/labels/saslastnikov_video.csv',\n",
              " '/content/labels/vvromanov_video.csv']"
            ]
          },
          "metadata": {},
          "execution_count": 59
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Базы не было с лицами, потому берём старую\n",
        "Более того, файлы по несколько часов обрабатываться будут неприлично долго, потому обойдёмся видео длительностью 10 мин"
      ],
      "metadata": {
        "id": "d8ZkV9csZGD0"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "\n",
        "\n",
        "labels = pd.read_csv(\"./labels/olmikheeva_video.csv\")\n",
        "labels"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 143
        },
        "id": "F1waOKt_yhHP",
        "outputId": "c07b4c7a-7ad2-4a57-8ac4-5912461afafd"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "       from        to                persons\n",
              "0  00:00:00  00:05:03  olmikheeva, saaksenov\n",
              "1  00:05:04  00:05:10              saaksenov\n",
              "2  00:05:11  00:10:00  saaksenov, olmikheeva"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-0f789c19-7c27-4fa1-8316-0c29db4b7d98\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>from</th>\n",
              "      <th>to</th>\n",
              "      <th>persons</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>00:00:00</td>\n",
              "      <td>00:05:03</td>\n",
              "      <td>olmikheeva, saaksenov</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>00:05:04</td>\n",
              "      <td>00:05:10</td>\n",
              "      <td>saaksenov</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>00:05:11</td>\n",
              "      <td>00:10:00</td>\n",
              "      <td>saaksenov, olmikheeva</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-0f789c19-7c27-4fa1-8316-0c29db4b7d98')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-0f789c19-7c27-4fa1-8316-0c29db4b7d98 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-0f789c19-7c27-4fa1-8316-0c29db4b7d98');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-c8f50952-9f8b-42ea-becf-01042f584937\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-c8f50952-9f8b-42ea-becf-01042f584937')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-c8f50952-9f8b-42ea-becf-01042f584937 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "labels",
              "summary": "{\n  \"name\": \"labels\",\n  \"rows\": 3,\n  \"fields\": [\n    {\n      \"column\": \"from\",\n      \"properties\": {\n        \"dtype\": \"object\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"00:00:00\",\n          \"00:05:04\",\n          \"00:05:11\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"to\",\n      \"properties\": {\n        \"dtype\": \"object\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"00:05:03\",\n          \"00:05:10\",\n          \"00:10:00\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"persons\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"olmikheeva, saaksenov\",\n          \"saaksenov\",\n          \"saaksenov, olmikheeva\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 93
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Тут вполне простой подсчёт"
      ],
      "metadata": {
        "id": "y9U_5dWTZUEL"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from deepface import DeepFace\n",
        "import cv2 as cv\n",
        "from PIL import Image\n",
        "\n",
        "\n",
        "saaksenov = f'./photo_staff/{df.loc[df[\"name\"] == \"Аксенов Сергей Алексеевич\"][\"filename\"].values[0]}'\n",
        "olmikheeva = f'./photo_staff/{df.loc[df[\"name\"] == \"Михеева Ольга Леонидовна\"][\"filename\"].values[0]}'\n",
        "\n",
        "true_pos = 0\n",
        "false_pos = 0\n",
        "\n",
        "cap = cv.VideoCapture('/content/videos/olmikheeva.mp4')\n",
        "length = int(cap.get(cv.CAP_PROP_FRAME_COUNT))\n",
        "counter = 0\n",
        "\n",
        "while counter < length:\n",
        "  print(counter, true_pos, false_pos)\n",
        "\n",
        "  cap.set(cv.CAP_PROP_POS_FRAMES, counter)\n",
        "  ret, frame = cap.read()\n",
        "\n",
        "  try:\n",
        "    mas = DeepFace.extract_faces(frame)\n",
        "  except ValueError:\n",
        "    counter += 50\n",
        "    continue\n",
        "\n",
        "  for i in mas:\n",
        "    x = i[\"facial_area\"][\"x\"]\n",
        "    y = i[\"facial_area\"][\"y\"]\n",
        "    x2 = x + i[\"facial_area\"][\"w\"]\n",
        "    y2 = y + i[\"facial_area\"][\"h\"]\n",
        "    try:\n",
        "      verified = False\n",
        "      if 7600 <= counter <= 7750:\n",
        "        verified |= DeepFace.verify(saaksenov, frame[y:y2, x:x2])[\"verified\"]\n",
        "      else:\n",
        "        verified |= DeepFace.verify(saaksenov, frame[y:y2, x:x2])[\"verified\"]\n",
        "        verified |= DeepFace.verify(olmikheeva, frame[y:y2, x:x2])[\"verified\"]\n",
        "      if verified:\n",
        "        true_pos += 1\n",
        "      else:\n",
        "        false_pos += 1\n",
        "\n",
        "    except ValueError:\n",
        "      false_pos += 1\n",
        "\n",
        "  counter += 50\n",
        "\n",
        "cap.release()\n",
        "\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "lZ0aLzxTm4Zd",
        "outputId": "20b18b49-cc8e-46f8-92c3-cbf1a67820ec"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0 0 0\n",
            "50 0 3\n",
            "100 0 6\n",
            "150 0 7\n",
            "200 0 7\n",
            "250 0 9\n",
            "300 0 10\n",
            "350 0 11\n",
            "400 0 11\n",
            "450 0 11\n",
            "500 0 11\n",
            "550 0 12\n",
            "600 0 13\n",
            "650 1 14\n",
            "700 2 15\n",
            "750 3 16\n",
            "800 3 17\n",
            "850 3 19\n",
            "900 3 23\n",
            "950 3 24\n",
            "1000 3 26\n",
            "1050 3 27\n",
            "1100 3 28\n",
            "1150 3 30\n",
            "1200 3 32\n",
            "1250 4 34\n",
            "1300 4 36\n",
            "1350 4 38\n",
            "1400 4 39\n",
            "1450 4 40\n",
            "1500 4 41\n",
            "1550 4 44\n",
            "1600 4 45\n",
            "1650 4 46\n",
            "1700 4 47\n",
            "1750 4 48\n",
            "1800 4 49\n",
            "1850 5 50\n",
            "1900 5 52\n",
            "1950 5 53\n",
            "2000 5 54\n",
            "2050 5 55\n",
            "2100 5 55\n",
            "2150 5 55\n",
            "2200 5 55\n",
            "2250 5 55\n",
            "2300 5 55\n",
            "2350 5 55\n",
            "2400 5 55\n",
            "2450 5 55\n",
            "2500 5 55\n",
            "2550 5 56\n",
            "2600 5 56\n",
            "2650 5 56\n",
            "2700 5 57\n",
            "2750 5 57\n",
            "2800 5 58\n",
            "2850 5 59\n",
            "2900 5 60\n",
            "2950 5 62\n",
            "3000 5 64\n",
            "3050 5 65\n",
            "3100 5 66\n",
            "3150 5 68\n",
            "3200 5 69\n",
            "3250 5 70\n",
            "3300 5 71\n",
            "3350 5 72\n",
            "3400 5 73\n",
            "3450 5 74\n",
            "3500 5 75\n",
            "3550 5 77\n",
            "3600 5 78\n",
            "3650 5 79\n",
            "3700 5 80\n",
            "3750 5 81\n",
            "3800 5 82\n",
            "3850 5 83\n",
            "3900 5 83\n",
            "3950 5 83\n",
            "4000 5 83\n",
            "4050 5 84\n",
            "4100 5 84\n",
            "4150 5 85\n",
            "4200 5 86\n",
            "4250 5 86\n",
            "4300 5 86\n",
            "4350 5 86\n",
            "4400 5 87\n",
            "4450 5 88\n",
            "4500 5 89\n",
            "4550 5 89\n",
            "4600 5 90\n",
            "4650 5 92\n",
            "4700 5 94\n",
            "4750 5 95\n",
            "4800 5 96\n",
            "4850 5 97\n",
            "4900 5 98\n",
            "4950 5 99\n",
            "5000 5 100\n",
            "5050 5 100\n",
            "5100 5 101\n",
            "5150 5 102\n",
            "5200 5 103\n",
            "5250 5 104\n",
            "5300 5 104\n",
            "5350 5 104\n",
            "5400 5 104\n",
            "5450 5 104\n",
            "5500 5 104\n",
            "5550 5 104\n",
            "5600 5 104\n",
            "5650 5 104\n",
            "5700 5 104\n",
            "5750 5 104\n",
            "5800 5 104\n",
            "5850 5 104\n",
            "5900 5 104\n",
            "5950 5 105\n",
            "6000 5 105\n",
            "6050 5 105\n",
            "6100 5 105\n",
            "6150 6 105\n",
            "6200 6 105\n",
            "6250 6 105\n",
            "6300 6 106\n",
            "6350 6 106\n",
            "6400 6 106\n",
            "6450 6 106\n",
            "6500 6 106\n",
            "6550 6 106\n",
            "6600 6 106\n",
            "6650 6 106\n",
            "6700 6 106\n",
            "6750 6 106\n",
            "6800 6 107\n",
            "6850 6 108\n",
            "6900 6 109\n",
            "6950 6 109\n",
            "7000 7 110\n",
            "7050 8 111\n",
            "7100 9 111\n",
            "7150 9 112\n",
            "7200 9 113\n",
            "7250 9 113\n",
            "7300 9 113\n",
            "7350 9 113\n",
            "7400 9 114\n",
            "7450 9 114\n",
            "7500 9 115\n",
            "7550 9 115\n",
            "7600 9 116\n",
            "7650 9 117\n",
            "7700 9 117\n",
            "7750 9 117\n",
            "7800 9 117\n",
            "7850 9 117\n",
            "7900 9 117\n",
            "7950 9 117\n",
            "8000 9 117\n",
            "8050 9 117\n",
            "8100 9 117\n",
            "8150 9 117\n",
            "8200 9 118\n",
            "8250 9 118\n",
            "8300 9 118\n",
            "8350 9 118\n",
            "8400 9 118\n",
            "8450 9 118\n",
            "8500 9 118\n",
            "8550 9 118\n",
            "8600 9 118\n",
            "8650 9 118\n",
            "8700 9 119\n",
            "8750 9 120\n",
            "8800 9 120\n",
            "8850 9 120\n",
            "8900 10 121\n",
            "8950 11 124\n",
            "9000 12 126\n",
            "9050 13 129\n",
            "9100 13 130\n",
            "9150 13 131\n",
            "9200 13 133\n",
            "9250 13 134\n",
            "9300 13 136\n",
            "9350 13 137\n",
            "9400 13 139\n",
            "9450 13 140\n",
            "9500 13 140\n",
            "9550 13 141\n",
            "9600 13 143\n",
            "9650 13 146\n",
            "9700 13 147\n",
            "9750 13 149\n",
            "9800 13 151\n",
            "9850 13 153\n",
            "9900 13 154\n",
            "9950 13 156\n",
            "10000 13 157\n",
            "10050 13 158\n",
            "10100 13 159\n",
            "10150 13 160\n",
            "10200 13 161\n",
            "10250 13 163\n",
            "10300 13 165\n",
            "10350 13 168\n",
            "10400 13 169\n",
            "10450 13 171\n",
            "10500 13 172\n",
            "10550 13 173\n",
            "10600 13 174\n",
            "10650 13 176\n",
            "10700 14 178\n",
            "10750 15 180\n",
            "10800 16 181\n",
            "10850 17 182\n",
            "10900 17 183\n",
            "10950 18 185\n",
            "11000 19 187\n",
            "11050 19 190\n",
            "11100 19 191\n",
            "11150 20 192\n",
            "11200 20 195\n",
            "11250 21 196\n",
            "11300 21 198\n",
            "11350 21 200\n",
            "11400 21 203\n",
            "11450 21 204\n",
            "11500 22 204\n",
            "11550 22 205\n",
            "11600 22 205\n",
            "11650 22 207\n",
            "11700 22 207\n",
            "11750 22 207\n",
            "11800 22 208\n",
            "11850 22 209\n",
            "11900 22 210\n",
            "11950 22 210\n",
            "12000 23 212\n",
            "12050 24 213\n",
            "12100 24 214\n",
            "12150 24 216\n",
            "12200 24 217\n",
            "12250 24 218\n",
            "12300 25 220\n",
            "12350 25 223\n",
            "12400 25 225\n",
            "12450 25 226\n",
            "12500 25 227\n",
            "12550 25 228\n",
            "12600 25 229\n",
            "12650 25 229\n",
            "12700 25 229\n",
            "12750 25 229\n",
            "12800 25 229\n",
            "12850 25 229\n",
            "12900 25 230\n",
            "12950 25 230\n",
            "13000 25 233\n",
            "13050 25 234\n",
            "13100 25 234\n",
            "13150 25 234\n",
            "13200 25 234\n",
            "13250 25 234\n",
            "13300 25 234\n",
            "13350 25 235\n",
            "13400 25 236\n",
            "13450 25 236\n",
            "13500 25 237\n",
            "13550 25 238\n",
            "13600 25 239\n",
            "13650 25 239\n",
            "13700 25 241\n",
            "13750 25 241\n",
            "13800 25 241\n",
            "13850 25 242\n",
            "13900 25 243\n",
            "13950 26 243\n",
            "14000 27 243\n",
            "14050 27 243\n",
            "14100 27 243\n",
            "14150 27 243\n",
            "14200 27 243\n",
            "14250 27 244\n",
            "14300 27 244\n",
            "14350 27 244\n",
            "14400 27 244\n",
            "14450 27 244\n",
            "14500 27 244\n",
            "14550 27 244\n",
            "14600 27 244\n",
            "14650 28 244\n",
            "14700 29 245\n",
            "14750 29 246\n",
            "14800 29 246\n",
            "14850 29 247\n",
            "14900 29 247\n",
            "14950 29 248\n",
            "15000 29 248\n",
            "15050 29 248\n",
            "15100 29 249\n",
            "15150 29 250\n",
            "15200 29 252\n",
            "15250 29 253\n",
            "15300 29 253\n",
            "15350 29 254\n",
            "15400 29 255\n",
            "15450 29 256\n",
            "15500 29 257\n",
            "15550 29 258\n",
            "15600 29 258\n",
            "15650 29 258\n",
            "15700 29 258\n",
            "15750 29 259\n",
            "15800 29 259\n",
            "15850 29 261\n",
            "15900 29 263\n",
            "15950 29 264\n",
            "16000 29 267\n",
            "16050 30 269\n",
            "16100 30 271\n",
            "16150 32 272\n",
            "16200 32 274\n",
            "16250 33 276\n",
            "16300 34 277\n",
            "16350 35 278\n",
            "16400 35 279\n",
            "16450 35 280\n",
            "16500 35 281\n",
            "16550 35 283\n",
            "16600 35 284\n",
            "16650 35 286\n",
            "16700 35 287\n",
            "16750 35 289\n",
            "16800 35 291\n",
            "16850 35 293\n",
            "16900 35 296\n",
            "16950 35 299\n",
            "17000 35 301\n",
            "17050 35 303\n",
            "17100 35 305\n",
            "17150 35 305\n",
            "17200 35 306\n",
            "17250 35 307\n",
            "17300 35 308\n",
            "17350 35 310\n",
            "17400 35 311\n",
            "17450 35 314\n",
            "17500 35 316\n",
            "17550 35 316\n",
            "17600 35 316\n",
            "17650 35 316\n",
            "17700 35 316\n",
            "17750 35 316\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Значение маленькое, потому что разметка плохая (камон, какие два человека, когда их на видео не меньше 6)"
      ],
      "metadata": {
        "id": "jojko8M1ZX8M"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "print(float(true_pos) / (float(true_pos) + float(false_pos)))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jfnFHBGO5qjh",
        "outputId": "266ae23f-4e00-4d57-d4c4-b01fb460d16d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0.09971509971509972\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(false_pos)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "osqZ1cMs5sX5",
        "outputId": "2e877dc9-9af0-4c39-ba5d-7cc3898c993e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "316\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Часть 2"
      ],
      "metadata": {
        "id": "ixZakZGFQPR2"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Мой датасет"
      ],
      "metadata": {
        "id": "uU88WuEwZj-K"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import gdown\n",
        "gdown.download_folder(\"https://drive.google.com/drive/folders/1B0Zr3494E1FK7LBxtoxcwlYM3BfQh-sj?usp=sharing\", quiet=True)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "H_41zIPMQKaj",
        "outputId": "1e5bc1f4-6089-406b-d428-6abebcc45de0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['/content/dataset/1_Crk_C9tml2frNHUK1K8-sSk7AqIhEWvYLXaxZ21ugfJvBW0p7xzf1t_L23muJ8ZgvBPGxJLvXSFUbAL-UHOyQs.jpg',\n",
              " '/content/dataset/CG3H04m52OvPEkV37VJ53DHE3gBB3RA81aOLWIC4rUJ6SIOw3JHYNC4ac8aTkIqfgBlhas0PmXbpQNfmnaNb4oMq.jpg',\n",
              " '/content/dataset/di86ssmO5yE.jpg',\n",
              " '/content/dataset/DSC03901.png',\n",
              " '/content/dataset/DSC03905.png',\n",
              " '/content/dataset/IMG_20250127_215927_480.jpg',\n",
              " '/content/dataset/IMG_20250127_215939_530.jpg',\n",
              " '/content/dataset/IMG_20250127_220906.jpg',\n",
              " '/content/dataset/IMG_20250127_221431.jpg',\n",
              " '/content/dataset/IMG_20250127_222949.jpg',\n",
              " '/content/dataset/IMG_20250127_223000.jpg',\n",
              " '/content/dataset/IMG20230730011141.jpg',\n",
              " '/content/dataset/IMG20230830142428.jpg',\n",
              " '/content/dataset/IMG20230901065957.jpg',\n",
              " '/content/dataset/IMG20231127133614.jpg',\n",
              " '/content/dataset/IMG20240527203817.jpg',\n",
              " '/content/dataset/IMG20250123202607.jpg',\n",
              " '/content/dataset/IMG20250127221031.jpg',\n",
              " '/content/dataset/K_bnO4e9aFTNjCYkAi2EX685-QTrhv_FWMOsEjj6T_Z4aub2RrjqaicZYpKU-k3ZRbdKu3jzC-ZHrz-fRvIsa3AO.jpg',\n",
              " '/content/dataset/nhZWl7PitemlZvCwiVa2WEau_bxinA2IrHujEw8mevijk-4C1d5_yhgEYRh5YJjAnpU8zn5ylhP45KK6BEb-4y_P.jpg']"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "!gdown 1UMz5hZneYLiul7-t1bMo783ngGB4Mrd8"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "PqUwANnbRH8L",
        "outputId": "f405b79a-2516-4557-daa4-d0434a7293d5"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=1UMz5hZneYLiul7-t1bMo783ngGB4Mrd8\n",
            "To: /content/reference.jpg\n",
            "\r  0% 0.00/522k [00:00<?, ?B/s]\r100% 522k/522k [00:00<00:00, 7.65MB/s]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Уменьшаем версию tensirflow, иначе модели некоторые не запустятся"
      ],
      "metadata": {
        "id": "DsVf9Dw4ZmoC"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install tensorflow==2.12"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "XHUNTNetWMyy",
        "outputId": "e78390f6-d8a2-4746-bd69-fff6222466f0"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting tensorflow==2.12\n",
            "  Downloading tensorflow-2.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.4 kB)\n",
            "Requirement already satisfied: absl-py>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (1.4.0)\n",
            "Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (1.6.3)\n",
            "Requirement already satisfied: flatbuffers>=2.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (25.1.21)\n",
            "Collecting gast<=0.4.0,>=0.2.1 (from tensorflow==2.12)\n",
            "  Downloading gast-0.4.0-py3-none-any.whl.metadata (1.1 kB)\n",
            "Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (0.2.0)\n",
            "Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (1.69.0)\n",
            "Requirement already satisfied: h5py>=2.9.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (3.12.1)\n",
            "Requirement already satisfied: jax>=0.3.15 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (0.4.33)\n",
            "Collecting keras<2.13,>=2.12.0 (from tensorflow==2.12)\n",
            "  Downloading keras-2.12.0-py2.py3-none-any.whl.metadata (1.4 kB)\n",
            "Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (18.1.1)\n",
            "Collecting numpy<1.24,>=1.22 (from tensorflow==2.12)\n",
            "  Downloading numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.3 kB)\n",
            "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (3.4.0)\n",
            "Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (24.2)\n",
            "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (4.25.5)\n",
            "Requirement already satisfied: setuptools in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (75.1.0)\n",
            "Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (1.17.0)\n",
            "Collecting tensorboard<2.13,>=2.12 (from tensorflow==2.12)\n",
            "  Downloading tensorboard-2.12.3-py3-none-any.whl.metadata (1.8 kB)\n",
            "Collecting tensorflow-estimator<2.13,>=2.12.0 (from tensorflow==2.12)\n",
            "  Downloading tensorflow_estimator-2.12.0-py2.py3-none-any.whl.metadata (1.3 kB)\n",
            "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (2.5.0)\n",
            "Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (4.12.2)\n",
            "Collecting wrapt<1.15,>=1.11.0 (from tensorflow==2.12)\n",
            "  Downloading wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.7 kB)\n",
            "Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow==2.12) (0.37.1)\n",
            "Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from astunparse>=1.6.0->tensorflow==2.12) (0.45.1)\n",
            "Requirement already satisfied: jaxlib<=0.4.33,>=0.4.33 in /usr/local/lib/python3.11/dist-packages (from jax>=0.3.15->tensorflow==2.12) (0.4.33)\n",
            "Requirement already satisfied: ml-dtypes>=0.2.0 in /usr/local/lib/python3.11/dist-packages (from jax>=0.3.15->tensorflow==2.12) (0.4.1)\n",
            "INFO: pip is looking at multiple versions of jax to determine which version is compatible with other requirements. This could take a while.\n",
            "Collecting jax>=0.3.15 (from tensorflow==2.12)\n",
            "  Downloading jax-0.5.0-py3-none-any.whl.metadata (22 kB)\n",
            "Collecting jaxlib<=0.5.0,>=0.5.0 (from jax>=0.3.15->tensorflow==2.12)\n",
            "  Downloading jaxlib-0.5.0-cp311-cp311-manylinux2014_x86_64.whl.metadata (978 bytes)\n",
            "Collecting jax>=0.3.15 (from tensorflow==2.12)\n",
            "  Downloading jax-0.4.38-py3-none-any.whl.metadata (22 kB)\n",
            "Collecting jaxlib<=0.4.38,>=0.4.38 (from jax>=0.3.15->tensorflow==2.12)\n",
            "  Downloading jaxlib-0.4.38-cp311-cp311-manylinux2014_x86_64.whl.metadata (1.0 kB)\n",
            "Collecting jax>=0.3.15 (from tensorflow==2.12)\n",
            "  Downloading jax-0.4.37-py3-none-any.whl.metadata (22 kB)\n",
            "Collecting jaxlib<=0.4.37,>=0.4.36 (from jax>=0.3.15->tensorflow==2.12)\n",
            "  Downloading jaxlib-0.4.36-cp311-cp311-manylinux2014_x86_64.whl.metadata (1.0 kB)\n",
            "Collecting jax>=0.3.15 (from tensorflow==2.12)\n",
            "  Downloading jax-0.4.36-py3-none-any.whl.metadata (22 kB)\n",
            "  Downloading jax-0.4.35-py3-none-any.whl.metadata (22 kB)\n",
            "Collecting jaxlib<=0.4.35,>=0.4.34 (from jax>=0.3.15->tensorflow==2.12)\n",
            "  Downloading jaxlib-0.4.35-cp311-cp311-manylinux2014_x86_64.whl.metadata (983 bytes)\n",
            "Collecting jax>=0.3.15 (from tensorflow==2.12)\n",
            "  Downloading jax-0.4.34-py3-none-any.whl.metadata (22 kB)\n",
            "Collecting jaxlib<=0.4.34,>=0.4.34 (from jax>=0.3.15->tensorflow==2.12)\n",
            "  Downloading jaxlib-0.4.34-cp311-cp311-manylinux2014_x86_64.whl.metadata (983 bytes)\n",
            "Collecting jax>=0.3.15 (from tensorflow==2.12)\n",
            "  Downloading jax-0.4.31-py3-none-any.whl.metadata (22 kB)\n",
            "Collecting jaxlib<=0.4.31,>=0.4.30 (from jax>=0.3.15->tensorflow==2.12)\n",
            "  Downloading jaxlib-0.4.31-cp311-cp311-manylinux2014_x86_64.whl.metadata (983 bytes)\n",
            "INFO: pip is still looking at multiple versions of jax to determine which version is compatible with other requirements. This could take a while.\n",
            "Collecting jax>=0.3.15 (from tensorflow==2.12)\n",
            "  Downloading jax-0.4.30-py3-none-any.whl.metadata (22 kB)\n",
            "Collecting jaxlib<=0.4.30,>=0.4.27 (from jax>=0.3.15->tensorflow==2.12)\n",
            "  Downloading jaxlib-0.4.30-cp311-cp311-manylinux2014_x86_64.whl.metadata (1.0 kB)\n",
            "Requirement already satisfied: scipy>=1.9 in /usr/local/lib/python3.11/dist-packages (from jax>=0.3.15->tensorflow==2.12) (1.13.1)\n",
            "Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.13,>=2.12->tensorflow==2.12) (2.27.0)\n",
            "Collecting google-auth-oauthlib<1.1,>=0.5 (from tensorboard<2.13,>=2.12->tensorflow==2.12)\n",
            "  Downloading google_auth_oauthlib-1.0.0-py2.py3-none-any.whl.metadata (2.7 kB)\n",
            "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.13,>=2.12->tensorflow==2.12) (3.7)\n",
            "Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.13,>=2.12->tensorflow==2.12) (2.32.3)\n",
            "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.13,>=2.12->tensorflow==2.12) (0.7.2)\n",
            "Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.13,>=2.12->tensorflow==2.12) (3.1.3)\n",
            "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.13,>=2.12->tensorflow==2.12) (5.5.1)\n",
            "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.11/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.13,>=2.12->tensorflow==2.12) (0.4.1)\n",
            "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.11/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.13,>=2.12->tensorflow==2.12) (4.9)\n",
            "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.11/dist-packages (from google-auth-oauthlib<1.1,>=0.5->tensorboard<2.13,>=2.12->tensorflow==2.12) (1.3.1)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorboard<2.13,>=2.12->tensorflow==2.12) (3.4.1)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorboard<2.13,>=2.12->tensorflow==2.12) (3.10)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorboard<2.13,>=2.12->tensorflow==2.12) (2.3.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorboard<2.13,>=2.12->tensorflow==2.12) (2024.12.14)\n",
            "Requirement already satisfied: MarkupSafe>=2.1.1 in /usr/local/lib/python3.11/dist-packages (from werkzeug>=1.0.1->tensorboard<2.13,>=2.12->tensorflow==2.12) (3.0.2)\n",
            "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /usr/local/lib/python3.11/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.13,>=2.12->tensorflow==2.12) (0.6.1)\n",
            "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.11/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard<2.13,>=2.12->tensorflow==2.12) (3.2.2)\n",
            "Downloading tensorflow-2.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (586.0 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m586.0/586.0 MB\u001b[0m \u001b[31m1.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading gast-0.4.0-py3-none-any.whl (9.8 kB)\n",
            "Downloading jax-0.4.30-py3-none-any.whl (2.0 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m62.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading keras-2.12.0-py2.py3-none-any.whl (1.7 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m62.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.1 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m17.1/17.1 MB\u001b[0m \u001b[31m50.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading tensorboard-2.12.3-py3-none-any.whl (5.6 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.6/5.6 MB\u001b[0m \u001b[31m112.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading tensorflow_estimator-2.12.0-py2.py3-none-any.whl (440 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m440.7/440.7 kB\u001b[0m \u001b[31m30.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (78 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m78.4/78.4 kB\u001b[0m \u001b[31m8.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading google_auth_oauthlib-1.0.0-py2.py3-none-any.whl (18 kB)\n",
            "Downloading jaxlib-0.4.30-cp311-cp311-manylinux2014_x86_64.whl (79.6 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m79.6/79.6 MB\u001b[0m \u001b[31m11.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: wrapt, tensorflow-estimator, numpy, keras, gast, jaxlib, google-auth-oauthlib, tensorboard, jax, tensorflow\n",
            "  Attempting uninstall: wrapt\n",
            "    Found existing installation: wrapt 1.17.2\n",
            "    Uninstalling wrapt-1.17.2:\n",
            "      Successfully uninstalled wrapt-1.17.2\n",
            "  Attempting uninstall: numpy\n",
            "    Found existing installation: numpy 1.26.4\n",
            "    Uninstalling numpy-1.26.4:\n",
            "      Successfully uninstalled numpy-1.26.4\n",
            "  Attempting uninstall: keras\n",
            "    Found existing installation: keras 3.5.0\n",
            "    Uninstalling keras-3.5.0:\n",
            "      Successfully uninstalled keras-3.5.0\n",
            "  Attempting uninstall: gast\n",
            "    Found existing installation: gast 0.6.0\n",
            "    Uninstalling gast-0.6.0:\n",
            "      Successfully uninstalled gast-0.6.0\n",
            "  Attempting uninstall: jaxlib\n",
            "    Found existing installation: jaxlib 0.4.33\n",
            "    Uninstalling jaxlib-0.4.33:\n",
            "      Successfully uninstalled jaxlib-0.4.33\n",
            "  Attempting uninstall: google-auth-oauthlib\n",
            "    Found existing installation: google-auth-oauthlib 1.2.1\n",
            "    Uninstalling google-auth-oauthlib-1.2.1:\n",
            "      Successfully uninstalled google-auth-oauthlib-1.2.1\n",
            "  Attempting uninstall: tensorboard\n",
            "    Found existing installation: tensorboard 2.17.1\n",
            "    Uninstalling tensorboard-2.17.1:\n",
            "      Successfully uninstalled tensorboard-2.17.1\n",
            "  Attempting uninstall: jax\n",
            "    Found existing installation: jax 0.4.33\n",
            "    Uninstalling jax-0.4.33:\n",
            "      Successfully uninstalled jax-0.4.33\n",
            "  Attempting uninstall: tensorflow\n",
            "    Found existing installation: tensorflow 2.17.1\n",
            "    Uninstalling tensorflow-2.17.1:\n",
            "      Successfully uninstalled tensorflow-2.17.1\n",
            "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
            "albumentations 2.0.1 requires numpy>=1.24.4, but you have numpy 1.23.5 which is incompatible.\n",
            "albucore 0.0.23 requires numpy>=1.24.4, but you have numpy 1.23.5 which is incompatible.\n",
            "tf-keras 2.17.0 requires tensorflow<2.18,>=2.17, but you have tensorflow 2.12.0 which is incompatible.\n",
            "chex 0.1.88 requires numpy>=1.24.1, but you have numpy 1.23.5 which is incompatible.\n",
            "pymc 5.19.1 requires numpy>=1.25.0, but you have numpy 1.23.5 which is incompatible.\n",
            "xarray 2025.1.1 requires numpy>=1.24, but you have numpy 1.23.5 which is incompatible.\n",
            "bigframes 1.33.0 requires numpy>=1.24.0, but you have numpy 1.23.5 which is incompatible.\n",
            "scikit-image 0.25.0 requires numpy>=1.24, but you have numpy 1.23.5 which is incompatible.\n",
            "imbalanced-learn 0.13.0 requires numpy<3,>=1.24.3, but you have numpy 1.23.5 which is incompatible.\n",
            "blosc2 3.0.0 requires numpy>=1.25.0, but you have numpy 1.23.5 which is incompatible.\u001b[0m\u001b[31m\n",
            "\u001b[0mSuccessfully installed gast-0.4.0 google-auth-oauthlib-1.0.0 jax-0.4.30 jaxlib-0.4.30 keras-2.12.0 numpy-1.23.5 tensorboard-2.12.3 tensorflow-2.12.0 tensorflow-estimator-2.12.0 wrapt-1.14.1\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "application/vnd.colab-display-data+json": {
              "pip_warning": {
                "packages": [
                  "gast",
                  "jax",
                  "jaxlib",
                  "numpy",
                  "tensorflow",
                  "wrapt"
                ]
              },
              "id": "7b85ccad79ff4d36b384bc1e61e9bb8a"
            }
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Библиотека для аугментации"
      ],
      "metadata": {
        "id": "g9yxdEUOZuWy"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install -U albumentations"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UJdvtMeaaANX",
        "outputId": "3148bcfc-3397-468c-aa29-01fa9448454d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Requirement already satisfied: albumentations in /usr/local/lib/python3.11/dist-packages (1.4.20)\n",
            "Collecting albumentations\n",
            "  Downloading albumentations-2.0.1-py3-none-any.whl.metadata (38 kB)\n",
            "Requirement already satisfied: numpy>=1.24.4 in /usr/local/lib/python3.11/dist-packages (from albumentations) (1.26.4)\n",
            "Requirement already satisfied: scipy>=1.10.0 in /usr/local/lib/python3.11/dist-packages (from albumentations) (1.13.1)\n",
            "Requirement already satisfied: PyYAML in /usr/local/lib/python3.11/dist-packages (from albumentations) (6.0.2)\n",
            "Requirement already satisfied: pydantic>=2.9.2 in /usr/local/lib/python3.11/dist-packages (from albumentations) (2.10.5)\n",
            "Collecting albucore==0.0.23 (from albumentations)\n",
            "  Downloading albucore-0.0.23-py3-none-any.whl.metadata (5.3 kB)\n",
            "Requirement already satisfied: opencv-python-headless>=4.9.0.80 in /usr/local/lib/python3.11/dist-packages (from albumentations) (4.11.0.86)\n",
            "Requirement already satisfied: stringzilla>=3.10.4 in /usr/local/lib/python3.11/dist-packages (from albucore==0.0.23->albumentations) (3.11.3)\n",
            "Collecting simsimd>=5.9.2 (from albucore==0.0.23->albumentations)\n",
            "  Downloading simsimd-6.2.1-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (66 kB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.0/66.0 kB\u001b[0m \u001b[31m5.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hRequirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from pydantic>=2.9.2->albumentations) (0.7.0)\n",
            "Requirement already satisfied: pydantic-core==2.27.2 in /usr/local/lib/python3.11/dist-packages (from pydantic>=2.9.2->albumentations) (2.27.2)\n",
            "Requirement already satisfied: typing-extensions>=4.12.2 in /usr/local/lib/python3.11/dist-packages (from pydantic>=2.9.2->albumentations) (4.12.2)\n",
            "Downloading albumentations-2.0.1-py3-none-any.whl (276 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m276.8/276.8 kB\u001b[0m \u001b[31m17.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading albucore-0.0.23-py3-none-any.whl (14 kB)\n",
            "Downloading simsimd-6.2.1-cp311-cp311-manylinux_2_28_x86_64.whl (632 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m632.7/632.7 kB\u001b[0m \u001b[31m31.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: simsimd, albucore, albumentations\n",
            "  Attempting uninstall: albucore\n",
            "    Found existing installation: albucore 0.0.19\n",
            "    Uninstalling albucore-0.0.19:\n",
            "      Successfully uninstalled albucore-0.0.19\n",
            "  Attempting uninstall: albumentations\n",
            "    Found existing installation: albumentations 1.4.20\n",
            "    Uninstalling albumentations-1.4.20:\n",
            "      Successfully uninstalled albumentations-1.4.20\n",
            "Successfully installed albucore-0.0.23 albumentations-2.0.1 simsimd-6.2.1\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Далее жёстко аугментируем"
      ],
      "metadata": {
        "id": "Q1KKswV0Zxy7"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import albumentations as A\n",
        "from PIL import Image\n",
        "import numpy as np\n",
        "from os import listdir, mkdir\n",
        "import os\n",
        "\n",
        "transform = A.Compose([\n",
        "    A.RandomRotate90()\n",
        "])\n",
        "\n",
        "if not os.path.isdir(\"dataset90\"):\n",
        "  mkdir(\"dataset90\")\n",
        "\n",
        "for i in listdir(\"./dataset\"):\n",
        "  if i[-3:] in [\"png\", \"jpg\"]:\n",
        "    pillow_image = Image.open(f\"./dataset/{i}\")\n",
        "    image = np.array(pillow_image)\n",
        "    transformed_image = transform(image=image)[\"image\"]\n",
        "    im = Image.fromarray(transformed_image)\n",
        "    im.save(f\"./dataset90/{i}\")"
      ],
      "metadata": {
        "id": "bKbOqWYyaLqb"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "folder_name = \"dataset45\"\n",
        "\n",
        "transform = A.Compose([\n",
        "    A.Rotate(45)\n",
        "])\n",
        "\n",
        "if not os.path.isdir(folder_name):\n",
        "  mkdir(folder_name)\n",
        "\n",
        "for i in listdir(\"./dataset\"):\n",
        "  if i[-3:] in [\"png\", \"jpg\"]:\n",
        "    pillow_image = Image.open(f\"./dataset/{i}\")\n",
        "    image = np.array(pillow_image)\n",
        "    transformed_image = transform(image=image)[\"image\"]\n",
        "    im = Image.fromarray(transformed_image)\n",
        "    im.save(f\"./{folder_name}/{i}\")"
      ],
      "metadata": {
        "id": "2SmramhnckkX"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "folder_name = \"datasetnoise\"\n",
        "\n",
        "transform = A.Compose([\n",
        "    A.AdditiveNoise(\"gaussian\", spatial_mode=\"shared\")\n",
        "])\n",
        "\n",
        "if not os.path.isdir(folder_name):\n",
        "  mkdir(folder_name)\n",
        "\n",
        "for i in listdir(\"./dataset\"):\n",
        "  if i[-3:] in [\"png\", \"jpg\"]:\n",
        "    pillow_image = Image.open(f\"./dataset/{i}\")\n",
        "    image = np.array(pillow_image)\n",
        "    transformed_image = transform(image=image)[\"image\"]\n",
        "    im = Image.fromarray(transformed_image)\n",
        "    im.save(f\"./{folder_name}/{i}\")"
      ],
      "metadata": {
        "id": "_0ydw9lZc779"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "folder_name = \"datasetbrightness\"\n",
        "\n",
        "transform = A.Compose([\n",
        "    A.RandomBrightnessContrast(0.5, 0.5, True)\n",
        "])\n",
        "\n",
        "if not os.path.isdir(folder_name):\n",
        "  mkdir(folder_name)\n",
        "\n",
        "for i in listdir(\"./dataset\"):\n",
        "  if i[-3:] in [\"png\", \"jpg\"]:\n",
        "    pillow_image = Image.open(f\"./dataset/{i}\")\n",
        "    image = np.array(pillow_image)\n",
        "    transformed_image = transform(image=image)[\"image\"]\n",
        "    im = Image.fromarray(transformed_image)\n",
        "    im.save(f\"./{folder_name}/{i}\")"
      ],
      "metadata": {
        "id": "K9kJ463OfFtG"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "folder_name = \"datasetblur\"\n",
        "\n",
        "transform = A.Compose([\n",
        "    A.AdvancedBlur((90, 100), (10, 30), (10, 30))\n",
        "])\n",
        "\n",
        "if not os.path.isdir(folder_name):\n",
        "  mkdir(folder_name)\n",
        "\n",
        "for i in listdir(\"./dataset\"):\n",
        "  if i[-3:] in [\"png\", \"jpg\"]:\n",
        "    pillow_image = Image.open(f\"./dataset/{i}\")\n",
        "    image = np.array(pillow_image)\n",
        "    transformed_image = transform(image=image)[\"image\"]\n",
        "    im = Image.fromarray(transformed_image)\n",
        "    im.save(f\"./{folder_name}/{i}\")"
      ],
      "metadata": {
        "id": "jJu540DlfpXr",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 356
        },
        "outputId": "acdbc857-65b5-4fc9-94c9-733853027538"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "error",
          "ename": "KeyboardInterrupt",
          "evalue": "",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-34-16999e38f846>\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     11\u001b[0m   \u001b[0;32mif\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\"png\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"jpg\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m     \u001b[0mpillow_image\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"./dataset/{i}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m     \u001b[0mimage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpillow_image\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     14\u001b[0m     \u001b[0mtransformed_image\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimage\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mimage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"image\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     15\u001b[0m     \u001b[0mim\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfromarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtransformed_image\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.11/dist-packages/PIL/Image.py\u001b[0m in \u001b[0;36m__array_interface__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    745\u001b[0m             \u001b[0mnew\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"data\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtobytes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"raw\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"L\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    746\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 747\u001b[0;31m             \u001b[0mnew\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"data\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtobytes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    748\u001b[0m         \u001b[0mnew\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"shape\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"typestr\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_conv_type_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    749\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mnew\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.11/dist-packages/PIL/Image.py\u001b[0m in \u001b[0;36mtobytes\u001b[0;34m(self, encoder_name, *args)\u001b[0m\n\u001b[1;32m    815\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    816\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 817\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0;34mb\"\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    818\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    819\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mtobitmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"image\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "А теперь все модели на все папки (пару часов заняло)"
      ],
      "metadata": {
        "id": "mwEmEGL-Z1y_"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from deepface import DeepFace\n",
        "import pandas as pd\n",
        "models = [\n",
        "  \"VGG-Face\",\n",
        "  \"Facenet\",\n",
        "  \"Facenet512\",\n",
        "  \"OpenFace\",\n",
        "  \"DeepFace\",\n",
        "  \"DeepID\",\n",
        "  \"ArcFace\",\n",
        "  \"Dlib\",\n",
        "  \"SFace\",\n",
        "  \"GhostFaceNet\"\n",
        "]\n",
        "\n",
        "d = {\n",
        "    \"dataset\": [],\n",
        "    \"dataset45\": [],\n",
        "    \"dataset90\": [],\n",
        "    \"datasetblur\": [],\n",
        "    \"datasetbrightness\": [],\n",
        "    \"datasetnoise\": []\n",
        "}\n",
        "\n",
        "paths = [\"dataset\", \"dataset45\", \"dataset90\", \"datasetblur\", \"datasetbrightness\", \"datasetnoise\"]\n",
        "for i in models:\n",
        "  for path in paths:\n",
        "    dfs = DeepFace.find(\n",
        "      img_path = \"reference.jpg\",\n",
        "      db_path = f\"/content/{path}\",\n",
        "      model_name = i,\n",
        "      enforce_detection=False\n",
        "    )\n",
        "    d[path].append(float(len(dfs[0]))/20.0)\n",
        "\n",
        "    print(len(dfs[0]))\n",
        "\n",
        "\n",
        "table = pd.DataFrame(d)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "_x08LAJ_Rb_q",
        "outputId": "d7161344-99a0-47c6-d29a-68032565641e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 21:54:42 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 21:54:51 - find function duration 9.010088920593262 seconds\n",
            "7\n",
            "25-01-27 21:54:51 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 21:54:52 - find function duration 1.7811617851257324 seconds\n",
            "5\n",
            "25-01-27 21:54:52 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 21:54:54 - find function duration 1.77423095703125 seconds\n",
            "2\n",
            "25-01-27 21:54:54 - Found 0 newly added image(s), 0 removed image(s), 5 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 5/5 [00:29<00:00,  5.95s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 21:55:24 - There are now 20 representations in ds_model_vggface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 21:55:24 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 21:55:26 - find function duration 32.05909323692322 seconds\n",
            "6\n",
            "25-01-27 21:55:26 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 21:55:28 - find function duration 1.7820823192596436 seconds\n",
            "6\n",
            "25-01-27 21:55:28 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 21:55:30 - find function duration 1.78725266456604 seconds\n",
            "9\n",
            "25-01-27 21:55:30 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 21:55:35 - find function duration 4.998893737792969 seconds\n",
            "7\n",
            "25-01-27 21:55:35 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 21:55:37 - find function duration 2.6061832904815674 seconds\n",
            "5\n",
            "25-01-27 21:55:38 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 21:55:40 - find function duration 2.152153730392456 seconds\n",
            "2\n",
            "25-01-27 21:55:40 - Found 0 newly added image(s), 0 removed image(s), 5 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 5/5 [00:24<00:00,  4.86s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 21:56:04 - There are now 20 representations in ds_model_facenet_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 21:56:04 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 21:56:06 - find function duration 26.538808345794678 seconds\n",
            "3\n",
            "25-01-27 21:56:06 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 21:56:08 - find function duration 1.7167420387268066 seconds\n",
            "7\n",
            "25-01-27 21:56:08 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 21:56:10 - find function duration 1.9830145835876465 seconds\n",
            "8\n",
            "25-01-27 21:56:10 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 21:56:15 - find function duration 5.303847789764404 seconds\n",
            "7\n",
            "25-01-27 21:56:15 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 21:56:18 - find function duration 2.8663618564605713 seconds\n",
            "6\n",
            "25-01-27 21:56:18 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 21:56:20 - find function duration 1.74267578125 seconds\n",
            "1\n",
            "25-01-27 21:56:20 - Found 0 newly added image(s), 0 removed image(s), 5 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 5/5 [00:25<00:00,  5.04s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 21:56:45 - There are now 20 representations in ds_model_facenet512_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 21:56:45 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 21:56:47 - find function duration 26.922746181488037 seconds\n",
            "6\n",
            "25-01-27 21:56:47 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 21:56:48 - find function duration 1.7254095077514648 seconds\n",
            "5\n",
            "25-01-27 21:56:48 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 21:56:50 - find function duration 1.707338809967041 seconds\n",
            "9\n",
            "25-01-27 21:56:50 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 21:56:53 - find function duration 2.7877695560455322 seconds\n",
            "0\n",
            "25-01-27 21:56:53 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 21:56:55 - find function duration 1.6053578853607178 seconds\n",
            "0\n",
            "25-01-27 21:56:55 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 21:56:57 - find function duration 2.5733907222747803 seconds\n",
            "0\n",
            "25-01-27 21:56:57 - Found 0 newly added image(s), 0 removed image(s), 5 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 5/5 [00:22<00:00,  4.57s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 21:57:20 - There are now 20 representations in ds_model_openface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 21:57:20 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 21:57:22 - find function duration 24.953247785568237 seconds\n",
            "0\n",
            "25-01-27 21:57:22 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 21:57:24 - find function duration 2.211422920227051 seconds\n",
            "0\n",
            "25-01-27 21:57:24 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 21:57:26 - find function duration 1.5136909484863281 seconds\n",
            "0\n",
            "25-01-27 21:57:26 - Found 16 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\rFinding representations:   0%|          | 0/16 [00:00<?, ?it/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 21:57:49 - VGGFace2_DeepFace_weights_val-0.9034.h5 will be downloaded...\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Downloading...\n",
            "From: https://github.com/swghosh/DeepFace/releases/download/weights-vggface2-2d-aligned/VGGFace2_DeepFace_weights_val-0.9034.h5.zip\n",
            "To: /root/.deepface/weights/VGGFace2_DeepFace_weights_val-0.9034.h5.zip\n",
            "\n",
            "  0%|          | 0.00/511M [00:00<?, ?B/s]\u001b[A\n",
            "  2%|▏         | 8.91M/511M [00:00<00:05, 84.7MB/s]\u001b[A\n",
            "  3%|▎         | 17.8M/511M [00:00<00:08, 59.3MB/s]\u001b[A\n",
            "  5%|▍         | 24.6M/511M [00:00<00:08, 56.6MB/s]\u001b[A\n",
            "  6%|▌         | 30.9M/511M [00:00<00:08, 55.6MB/s]\u001b[A\n",
            "  7%|▋         | 36.7M/511M [00:00<00:15, 30.7MB/s]\u001b[A\n",
            "  8%|▊         | 42.5M/511M [00:01<00:13, 33.7MB/s]\u001b[A\n",
            " 10%|▉         | 50.9M/511M [00:01<00:10, 42.2MB/s]\u001b[A\n",
            " 11%|█         | 56.1M/511M [00:01<00:11, 40.4MB/s]\u001b[A\n",
            " 12%|█▏        | 62.4M/511M [00:01<00:09, 45.2MB/s]\u001b[A\n",
            " 13%|█▎        | 67.6M/511M [00:01<00:10, 44.0MB/s]\u001b[A\n",
            " 14%|█▍        | 73.9M/511M [00:01<00:09, 44.7MB/s]\u001b[A\n",
            " 16%|█▌        | 82.3M/511M [00:01<00:08, 51.0MB/s]\u001b[A\n",
            " 17%|█▋        | 88.1M/511M [00:01<00:09, 47.0MB/s]\u001b[A\n",
            " 19%|█▊        | 94.9M/511M [00:02<00:08, 47.8MB/s]\u001b[A\n",
            " 20%|█▉        | 100M/511M [00:02<00:12, 33.4MB/s] \u001b[A\n",
            " 21%|██        | 105M/511M [00:02<00:11, 35.1MB/s]\u001b[A\n",
            " 21%|██▏       | 110M/511M [00:02<00:17, 23.6MB/s]\u001b[A\n",
            " 23%|██▎       | 116M/511M [00:03<00:14, 26.8MB/s]\u001b[A\n",
            " 24%|██▍       | 123M/511M [00:03<00:11, 33.4MB/s]\u001b[A\n",
            " 25%|██▍       | 127M/511M [00:03<00:11, 34.2MB/s]\u001b[A\n",
            " 26%|██▋       | 135M/511M [00:03<00:08, 42.0MB/s]\u001b[A\n",
            " 27%|██▋       | 140M/511M [00:03<00:08, 41.8MB/s]\u001b[A\n",
            " 29%|██▉       | 147M/511M [00:03<00:08, 44.0MB/s]\u001b[A\n",
            " 30%|██▉       | 153M/511M [00:05<00:32, 11.0MB/s]\u001b[A\n",
            " 31%|███       | 156M/511M [00:06<00:59, 5.92MB/s]\u001b[A\n",
            " 35%|███▍      | 179M/511M [00:06<00:20, 15.9MB/s]\u001b[A\n",
            " 37%|███▋      | 187M/511M [00:07<00:16, 19.7MB/s]\u001b[A\n",
            " 38%|███▊      | 195M/511M [00:07<00:13, 23.8MB/s]\u001b[A\n",
            " 40%|███▉      | 202M/511M [00:07<00:11, 27.6MB/s]\u001b[A\n",
            " 41%|████      | 209M/511M [00:07<00:12, 24.5MB/s]\u001b[A\n",
            " 42%|████▏     | 214M/511M [00:07<00:11, 26.8MB/s]\u001b[A\n",
            " 43%|████▎     | 221M/511M [00:08<00:09, 30.1MB/s]\u001b[A\n",
            " 45%|████▍     | 228M/511M [00:08<00:07, 36.6MB/s]\u001b[A\n",
            " 46%|████▌     | 234M/511M [00:08<00:06, 39.9MB/s]\u001b[A\n",
            " 47%|████▋     | 240M/511M [00:08<00:06, 42.3MB/s]\u001b[A\n",
            " 48%|████▊     | 245M/511M [00:08<00:06, 39.7MB/s]\u001b[A\n",
            " 49%|████▉     | 252M/511M [00:08<00:06, 41.2MB/s]\u001b[A\n",
            " 51%|█████     | 261M/511M [00:08<00:05, 49.2MB/s]\u001b[A\n",
            " 52%|█████▏    | 266M/511M [00:08<00:04, 49.7MB/s]\u001b[A\n",
            " 53%|█████▎    | 273M/511M [00:09<00:05, 47.1MB/s]\u001b[A\n",
            " 55%|█████▍    | 280M/511M [00:09<00:04, 52.4MB/s]\u001b[A\n",
            " 56%|█████▌    | 286M/511M [00:09<00:04, 53.3MB/s]\u001b[A\n",
            " 57%|█████▋    | 292M/511M [00:09<00:05, 40.7MB/s]\u001b[A\n",
            " 58%|█████▊    | 297M/511M [00:09<00:05, 40.4MB/s]\u001b[A\n",
            " 59%|█████▉    | 304M/511M [00:09<00:04, 46.4MB/s]\u001b[A\n",
            " 60%|██████    | 309M/511M [00:10<00:06, 29.1MB/s]\u001b[A\n",
            " 62%|██████▏   | 315M/511M [00:10<00:06, 31.4MB/s]\u001b[A\n",
            " 63%|██████▎   | 323M/511M [00:10<00:04, 39.3MB/s]\u001b[A\n",
            " 64%|██████▍   | 330M/511M [00:10<00:06, 28.1MB/s]\u001b[A\n",
            " 66%|██████▌   | 336M/511M [00:10<00:05, 32.0MB/s]\u001b[A\n",
            " 67%|██████▋   | 344M/511M [00:10<00:04, 39.4MB/s]\u001b[A\n",
            " 69%|██████▊   | 351M/511M [00:11<00:03, 41.4MB/s]\u001b[A\n",
            " 70%|██████▉   | 357M/511M [00:11<00:03, 42.7MB/s]\u001b[A\n",
            " 71%|███████   | 364M/511M [00:11<00:03, 49.0MB/s]\u001b[A\n",
            " 72%|███████▏  | 370M/511M [00:11<00:02, 49.2MB/s]\u001b[A\n",
            " 73%|███████▎  | 376M/511M [00:11<00:02, 50.6MB/s]\u001b[A\n",
            " 75%|███████▍  | 382M/511M [00:11<00:03, 39.9MB/s]\u001b[A\n",
            " 76%|███████▌  | 388M/511M [00:11<00:02, 44.7MB/s]\u001b[A\n",
            " 77%|███████▋  | 393M/511M [00:12<00:02, 43.7MB/s]\u001b[A\n",
            " 78%|███████▊  | 399M/511M [00:12<00:02, 43.6MB/s]\u001b[A\n",
            " 80%|███████▉  | 407M/511M [00:12<00:02, 50.1MB/s]\u001b[A\n",
            " 81%|████████  | 413M/511M [00:12<00:02, 49.1MB/s]\u001b[A\n",
            " 82%|████████▏ | 420M/511M [00:12<00:01, 46.9MB/s]\u001b[A\n",
            " 83%|████████▎ | 425M/511M [00:12<00:02, 42.0MB/s]\u001b[A\n",
            " 84%|████████▍ | 430M/511M [00:12<00:01, 40.7MB/s]\u001b[A\n",
            " 86%|████████▌ | 439M/511M [00:12<00:01, 48.2MB/s]\u001b[A\n",
            " 87%|████████▋ | 444M/511M [00:13<00:02, 28.4MB/s]\u001b[A\n",
            " 88%|████████▊ | 449M/511M [00:13<00:02, 28.2MB/s]\u001b[A\n",
            " 89%|████████▊ | 453M/511M [00:15<00:06, 9.13MB/s]\u001b[A\n",
            " 91%|█████████▏| 467M/511M [00:15<00:02, 18.3MB/s]\u001b[A\n",
            " 93%|█████████▎| 477M/511M [00:15<00:01, 20.4MB/s]\u001b[A\n",
            " 94%|█████████▍| 483M/511M [00:15<00:01, 23.3MB/s]\u001b[A\n",
            " 95%|█████████▌| 488M/511M [00:16<00:01, 19.8MB/s]\u001b[A\n",
            " 96%|█████████▋| 493M/511M [00:16<00:00, 22.4MB/s]\u001b[A\n",
            " 98%|█████████▊| 501M/511M [00:16<00:00, 28.7MB/s]\u001b[A\n",
            " 99%|█████████▉| 506M/511M [00:16<00:00, 25.1MB/s]\u001b[A\n",
            "100%|██████████| 511M/511M [00:16<00:00, 30.3MB/s]\n",
            "Finding representations: 100%|██████████| 16/16 [03:15<00:00, 12.19s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:00:41 - There are now 17 representations in ds_model_deepface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:00:41 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 22:00:44 - find function duration 198.5066225528717 seconds\n",
            "3\n",
            "25-01-27 22:00:44 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:31<00:00,  7.59s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:03:16 - There are now 23 representations in ds_model_deepface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:03:16 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 22:03:20 - find function duration 155.23731803894043 seconds\n",
            "3\n",
            "25-01-27 22:03:20 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:36<00:00,  7.81s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:05:56 - There are now 28 representations in ds_model_deepface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:05:56 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 22:05:59 - find function duration 159.49115681648254 seconds\n",
            "1\n",
            "25-01-27 22:05:59 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:24<00:00,  7.21s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:08:23 - There are now 20 representations in ds_model_deepface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:08:23 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 22:08:27 - find function duration 147.82470226287842 seconds\n",
            "1\n",
            "25-01-27 22:08:27 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations:  70%|███████   | 14/20 [01:28<00:25,  4.20s/it]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:09:55 - 🔴 Exception while extracting faces from /content/datasetbrightness/DSC03905.png: Exception while loading /content/datasetbrightness/DSC03905.png\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:15<00:00,  6.77s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:10:42 - There are now 22 representations in ds_model_deepface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:10:42 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 22:10:46 - find function duration 138.82570624351501 seconds\n",
            "5\n",
            "25-01-27 22:10:46 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [03:28<00:00, 10.45s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:14:15 - There are now 21 representations in ds_model_deepface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:14:15 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 22:14:18 - find function duration 212.6379086971283 seconds\n",
            "4\n",
            "25-01-27 22:14:18 - Found 16 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\rFinding representations:   0%|          | 0/16 [00:00<?, ?it/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:14:29 - deepid_keras_weights.h5 will be downloaded...\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Downloading...\n",
            "From: https://github.com/serengil/deepface_models/releases/download/v1.0/deepid_keras_weights.h5\n",
            "To: /root/.deepface/weights/deepid_keras_weights.h5\n",
            "\n",
            "100%|██████████| 1.61M/1.61M [00:00<00:00, 33.0MB/s]\n",
            "Finding representations: 100%|██████████| 16/16 [01:51<00:00,  6.97s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:16:10 - There are now 17 representations in ds_model_deepid_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:16:10 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 22:16:11 - find function duration 112.96278667449951 seconds\n",
            "1\n",
            "25-01-27 22:16:11 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:43<00:00,  5.20s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:17:55 - There are now 23 representations in ds_model_deepid_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:17:55 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 22:17:57 - find function duration 105.37291693687439 seconds\n",
            "2\n",
            "25-01-27 22:17:57 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:36<00:00,  4.81s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:19:33 - There are now 28 representations in ds_model_deepid_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:19:33 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 22:19:34 - find function duration 97.59212064743042 seconds\n",
            "0\n",
            "25-01-27 22:19:34 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:44<00:00,  5.22s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:21:19 - There are now 20 representations in ds_model_deepid_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:21:19 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 22:21:20 - find function duration 105.79982423782349 seconds\n",
            "1\n",
            "25-01-27 22:21:20 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations:  70%|███████   | 14/20 [00:57<00:13,  2.29s/it]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:22:18 - 🔴 Exception while extracting faces from /content/datasetbrightness/DSC03905.png: Exception while loading /content/datasetbrightness/DSC03905.png\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:31<00:00,  4.59s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:22:52 - There are now 22 representations in ds_model_deepid_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:22:52 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 22:22:53 - find function duration 93.16907525062561 seconds\n",
            "1\n",
            "25-01-27 22:22:53 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:45<00:00,  8.29s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:25:39 - There are now 21 representations in ds_model_deepid_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:25:39 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 22:25:41 - find function duration 168.14829325675964 seconds\n",
            "1\n",
            "25-01-27 22:25:41 - Found 16 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\rFinding representations:   0%|          | 0/16 [00:00<?, ?it/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:25:54 - arcface_weights.h5 will be downloaded to /root/.deepface/weights/arcface_weights.h5\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Downloading...\n",
            "From: https://github.com/serengil/deepface_models/releases/download/v1.0/arcface_weights.h5\n",
            "To: /root/.deepface/weights/arcface_weights.h5\n",
            "\n",
            "  0%|          | 0.00/137M [00:00<?, ?B/s]\u001b[A\n",
            "  8%|▊         | 11.0M/137M [00:00<00:01, 81.1MB/s]\u001b[A\n",
            " 16%|█▌        | 21.5M/137M [00:00<00:01, 86.4MB/s]\u001b[A\n",
            " 23%|██▎       | 32.0M/137M [00:00<00:01, 93.8MB/s]\u001b[A\n",
            " 31%|███       | 42.5M/137M [00:00<00:00, 97.5MB/s]\u001b[A\n",
            " 44%|████▎     | 59.8M/137M [00:00<00:00, 123MB/s] \u001b[A\n",
            " 53%|█████▎    | 72.4M/137M [00:00<00:00, 124MB/s]\u001b[A\n",
            " 62%|██████▏   | 84.9M/137M [00:01<00:00, 62.9MB/s]\u001b[A\n",
            " 69%|██████▉   | 94.4M/137M [00:01<00:00, 49.5MB/s]\u001b[A\n",
            " 75%|███████▍  | 102M/137M [00:01<00:00, 50.5MB/s] \u001b[A\n",
            " 80%|███████▉  | 109M/137M [00:01<00:00, 50.5MB/s]\u001b[A\n",
            " 84%|████████▍ | 115M/137M [00:01<00:00, 52.4MB/s]\u001b[A\n",
            " 89%|████████▉ | 122M/137M [00:01<00:00, 55.3MB/s]\u001b[A\n",
            " 94%|█████████▎| 128M/137M [00:02<00:00, 49.2MB/s]\u001b[A\n",
            "100%|██████████| 137M/137M [00:04<00:00, 30.7MB/s]\n",
            "Finding representations: 100%|██████████| 16/16 [02:03<00:00,  7.72s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:27:45 - There are now 17 representations in ds_model_arcface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:27:45 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 22:27:47 - find function duration 125.21730089187622 seconds\n",
            "7\n",
            "25-01-27 22:27:47 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:47<00:00,  5.40s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:29:35 - There are now 23 representations in ds_model_arcface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:29:35 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 22:29:36 - find function duration 109.61075139045715 seconds\n",
            "5\n",
            "25-01-27 22:29:36 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:44<00:00,  5.22s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:31:21 - There are now 28 representations in ds_model_arcface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:31:21 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 22:31:22 - find function duration 106.01203632354736 seconds\n",
            "2\n",
            "25-01-27 22:31:22 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:49<00:00,  5.47s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:33:12 - There are now 20 representations in ds_model_arcface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:33:12 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 22:33:14 - find function duration 111.68055391311646 seconds\n",
            "4\n",
            "25-01-27 22:33:14 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations:  70%|███████   | 14/20 [00:59<00:14,  2.35s/it]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:34:13 - 🔴 Exception while extracting faces from /content/datasetbrightness/DSC03905.png: Exception while loading /content/datasetbrightness/DSC03905.png\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:35<00:00,  4.79s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:34:50 - There are now 22 representations in ds_model_arcface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:34:50 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 22:34:51 - find function duration 97.48927307128906 seconds\n",
            "7\n",
            "25-01-27 22:34:51 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:49<00:00,  8.48s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:37:41 - There are now 21 representations in ds_model_arcface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:37:41 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 22:37:44 - find function duration 172.12995672225952 seconds\n",
            "9\n",
            "25-01-27 22:37:44 - Found 16 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\rFinding representations:   0%|          | 0/16 [00:00<?, ?it/s]Downloading...\n",
            "From: http://dlib.net/files/dlib_face_recognition_resnet_model_v1.dat.bz2\n",
            "To: /root/.deepface/weights/dlib_face_recognition_resnet_model_v1.dat.bz2\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:37:54 - dlib_face_recognition_resnet_model_v1.dat is going to be downloaded\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\n",
            "  0%|          | 0.00/21.4M [00:00<?, ?B/s]\u001b[A\n",
            "100%|██████████| 21.4M/21.4M [00:00<00:00, 109MB/s] \n",
            "Finding representations: 100%|██████████| 16/16 [01:57<00:00,  7.33s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:39:41 - There are now 17 representations in ds_model_dlib_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:39:41 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 22:39:43 - find function duration 119.77086329460144 seconds\n",
            "6\n",
            "25-01-27 22:39:43 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:42<00:00,  5.11s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:41:26 - There are now 23 representations in ds_model_dlib_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:41:26 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 22:41:27 - find function duration 103.7457525730133 seconds\n",
            "6\n",
            "25-01-27 22:41:27 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:41<00:00,  5.06s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:43:08 - There are now 28 representations in ds_model_dlib_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:43:08 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 22:43:10 - find function duration 103.22090911865234 seconds\n",
            "2\n",
            "25-01-27 22:43:10 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:42<00:00,  5.10s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:44:52 - There are now 20 representations in ds_model_dlib_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:44:52 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 22:44:55 - find function duration 104.24903869628906 seconds\n",
            "7\n",
            "25-01-27 22:44:55 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations:  70%|███████   | 14/20 [00:58<00:13,  2.32s/it]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:45:53 - 🔴 Exception while extracting faces from /content/datasetbrightness/DSC03905.png: Exception while loading /content/datasetbrightness/DSC03905.png\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:33<00:00,  4.65s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:46:28 - There are now 22 representations in ds_model_dlib_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:46:28 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 22:46:30 - find function duration 95.01529717445374 seconds\n",
            "7\n",
            "25-01-27 22:46:30 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:44<00:00,  8.24s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:49:14 - There are now 21 representations in ds_model_dlib_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:49:14 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 22:49:16 - find function duration 166.30017113685608 seconds\n",
            "7\n",
            "25-01-27 22:49:16 - Found 16 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\rFinding representations:   0%|          | 0/16 [00:00<?, ?it/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:49:27 - face_recognition_sface_2021dec.onnx weights will be downloaded...\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Downloading...\n",
            "From: https://github.com/opencv/opencv_zoo/raw/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx\n",
            "To: /root/.deepface/weights/face_recognition_sface_2021dec.onnx\n",
            "\n",
            "  0%|          | 0.00/38.7M [00:00<?, ?B/s]\u001b[A\n",
            "100%|██████████| 38.7M/38.7M [00:00<00:00, 260MB/s]\n",
            "Finding representations: 100%|██████████| 16/16 [01:55<00:00,  7.21s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:51:11 - There are now 17 representations in ds_model_sface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:51:11 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 22:51:13 - find function duration 116.81755542755127 seconds\n",
            "5\n",
            "25-01-27 22:51:13 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:44<00:00,  5.24s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:52:58 - There are now 23 representations in ds_model_sface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:52:58 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 22:52:59 - find function duration 106.38031673431396 seconds\n",
            "4\n",
            "25-01-27 22:52:59 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:38<00:00,  4.91s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:54:37 - There are now 28 representations in ds_model_sface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:54:37 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 22:54:39 - find function duration 99.6357159614563 seconds\n",
            "1\n",
            "25-01-27 22:54:39 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:43<00:00,  5.20s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:56:23 - There are now 20 representations in ds_model_sface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:56:23 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 22:56:24 - find function duration 105.44175338745117 seconds\n",
            "4\n",
            "25-01-27 22:56:24 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations:  70%|███████   | 14/20 [00:57<00:13,  2.31s/it]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:57:22 - 🔴 Exception while extracting faces from /content/datasetbrightness/DSC03905.png: Exception while loading /content/datasetbrightness/DSC03905.png\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:33<00:00,  4.68s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 22:57:58 - There are now 22 representations in ds_model_sface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 22:57:58 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 22:57:59 - find function duration 95.11609745025635 seconds\n",
            "6\n",
            "25-01-27 22:57:59 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:46<00:00,  8.32s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:00:46 - There are now 21 representations in ds_model_sface_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 23:00:46 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 23:00:48 - find function duration 168.53424310684204 seconds\n",
            "8\n",
            "25-01-27 23:00:48 - Found 16 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\rFinding representations:   0%|          | 0/16 [00:00<?, ?it/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:01:02 - Pre-trained weights is downloaded from https://github.com/HamadYA/GhostFaceNets/releases/download/v1.2/GhostFaceNet_W1.3_S1_ArcFace.h5 to /root/.deepface/weights/ghostfacenet_v1.h5\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Downloading...\n",
            "From: https://github.com/HamadYA/GhostFaceNets/releases/download/v1.2/GhostFaceNet_W1.3_S1_ArcFace.h5\n",
            "To: /root/.deepface/weights/ghostfacenet_v1.h5\n",
            "\n",
            "  0%|          | 0.00/17.3M [00:00<?, ?B/s]\u001b[A\n",
            "100%|██████████| 17.3M/17.3M [00:00<00:00, 110MB/s] \n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:01:03 - Pre-trained weights is just downloaded to /root/.deepface/weights/ghostfacenet_v1.h5\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 16/16 [01:59<00:00,  7.48s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:02:48 - There are now 17 representations in ds_model_ghostfacenet_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 23:02:48 - Searching reference.jpg in 17 length datastore\n",
            "25-01-27 23:02:50 - find function duration 121.75941157341003 seconds\n",
            "6\n",
            "25-01-27 23:02:50 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:48<00:00,  5.44s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:04:38 - There are now 23 representations in ds_model_ghostfacenet_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 23:04:38 - Searching reference.jpg in 23 length datastore\n",
            "25-01-27 23:04:40 - find function duration 110.55695724487305 seconds\n",
            "5\n",
            "25-01-27 23:04:40 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:43<00:00,  5.20s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:06:24 - There are now 28 representations in ds_model_ghostfacenet_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 23:06:24 - Searching reference.jpg in 28 length datastore\n",
            "25-01-27 23:06:26 - find function duration 105.68679642677307 seconds\n",
            "2\n",
            "25-01-27 23:06:26 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:47<00:00,  5.37s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:08:13 - There are now 20 representations in ds_model_ghostfacenet_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 23:08:13 - Searching reference.jpg in 20 length datastore\n",
            "25-01-27 23:08:15 - find function duration 108.9493134021759 seconds\n",
            "4\n",
            "25-01-27 23:08:15 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations:  70%|███████   | 14/20 [01:01<00:15,  2.52s/it]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:09:17 - 🔴 Exception while extracting faces from /content/datasetbrightness/DSC03905.png: Exception while loading /content/datasetbrightness/DSC03905.png\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [01:37<00:00,  4.86s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:09:52 - There are now 22 representations in ds_model_ghostfacenet_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 23:09:52 - Searching reference.jpg in 22 length datastore\n",
            "25-01-27 23:09:55 - find function duration 99.83572912216187 seconds\n",
            "7\n",
            "25-01-27 23:09:55 - Found 20 newly added image(s), 0 removed image(s), 0 replaced image(s).\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Finding representations: 100%|██████████| 20/20 [02:50<00:00,  8.51s/it]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "25-01-27 23:12:45 - There are now 21 representations in ds_model_ghostfacenet_detector_opencv_aligned_normalization_base_expand_0.pkl\n",
            "25-01-27 23:12:45 - Searching reference.jpg in 21 length datastore\n",
            "25-01-27 23:12:46 - find function duration 171.7789134979248 seconds\n",
            "8\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Ура, таблица готова (в целом VGG показала один из лучших результатов, в чём я и не сомневался)"
      ],
      "metadata": {
        "id": "42Rx0Kq4Z7PS"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "table"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 363
        },
        "id": "IMnUWqbvDOt_",
        "outputId": "abf92af0-945f-4f1b-957c-0745b6eddbac"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "   dataset  dataset45  dataset90  datasetblur  datasetbrightness  datasetnoise\n",
              "0     0.35       0.25       0.10         0.30               0.30          0.45\n",
              "1     0.35       0.25       0.10         0.15               0.35          0.40\n",
              "2     0.35       0.30       0.05         0.30               0.25          0.45\n",
              "3     0.00       0.00       0.00         0.00               0.00          0.00\n",
              "4     0.15       0.15       0.05         0.05               0.25          0.20\n",
              "5     0.05       0.10       0.00         0.05               0.05          0.05\n",
              "6     0.35       0.25       0.10         0.20               0.35          0.45\n",
              "7     0.30       0.30       0.10         0.35               0.35          0.35\n",
              "8     0.25       0.20       0.05         0.20               0.30          0.40\n",
              "9     0.30       0.25       0.10         0.20               0.35          0.40"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-11a1b41a-c794-4926-9437-40f9b287c983\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>dataset</th>\n",
              "      <th>dataset45</th>\n",
              "      <th>dataset90</th>\n",
              "      <th>datasetblur</th>\n",
              "      <th>datasetbrightness</th>\n",
              "      <th>datasetnoise</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.35</td>\n",
              "      <td>0.25</td>\n",
              "      <td>0.10</td>\n",
              "      <td>0.30</td>\n",
              "      <td>0.30</td>\n",
              "      <td>0.45</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.35</td>\n",
              "      <td>0.25</td>\n",
              "      <td>0.10</td>\n",
              "      <td>0.15</td>\n",
              "      <td>0.35</td>\n",
              "      <td>0.40</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.35</td>\n",
              "      <td>0.30</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.30</td>\n",
              "      <td>0.25</td>\n",
              "      <td>0.45</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.00</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.15</td>\n",
              "      <td>0.15</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.25</td>\n",
              "      <td>0.20</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>0.05</td>\n",
              "      <td>0.10</td>\n",
              "      <td>0.00</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.05</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>0.35</td>\n",
              "      <td>0.25</td>\n",
              "      <td>0.10</td>\n",
              "      <td>0.20</td>\n",
              "      <td>0.35</td>\n",
              "      <td>0.45</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>0.30</td>\n",
              "      <td>0.30</td>\n",
              "      <td>0.10</td>\n",
              "      <td>0.35</td>\n",
              "      <td>0.35</td>\n",
              "      <td>0.35</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>0.25</td>\n",
              "      <td>0.20</td>\n",
              "      <td>0.05</td>\n",
              "      <td>0.20</td>\n",
              "      <td>0.30</td>\n",
              "      <td>0.40</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>0.30</td>\n",
              "      <td>0.25</td>\n",
              "      <td>0.10</td>\n",
              "      <td>0.20</td>\n",
              "      <td>0.35</td>\n",
              "      <td>0.40</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-11a1b41a-c794-4926-9437-40f9b287c983')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-11a1b41a-c794-4926-9437-40f9b287c983 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-11a1b41a-c794-4926-9437-40f9b287c983');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-ae83eea1-c4a7-4715-9c36-4d15ff952335\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-ae83eea1-c4a7-4715-9c36-4d15ff952335')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-ae83eea1-c4a7-4715-9c36-4d15ff952335 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "table",
              "summary": "{\n  \"name\": \"table\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"dataset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.132182533725989,\n        \"min\": 0.0,\n        \"max\": 0.35,\n        \"num_unique_values\": 6,\n        \"samples\": [\n          0.35,\n          0.0,\n          0.25\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"dataset45\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0955975359979999,\n        \"min\": 0.0,\n        \"max\": 0.3,\n        \"num_unique_values\": 6,\n        \"samples\": [\n          0.25,\n          0.3,\n          0.2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"dataset90\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.04116363011742823,\n        \"min\": 0.0,\n        \"max\": 0.1,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          0.1,\n          0.05,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"datasetblur\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.11832159566199232,\n        \"min\": 0.0,\n        \"max\": 0.35,\n        \"num_unique_values\": 6,\n        \"samples\": [\n          0.3,\n          0.15,\n          0.35\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"datasetbrightness\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.1279105590289993,\n        \"min\": 0.0,\n        \"max\": 0.35,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          0.35,\n          0.05,\n          0.25\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"datasetnoise\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.17004901254246277,\n        \"min\": 0.0,\n        \"max\": 0.45,\n        \"num_unique_values\": 6,\n        \"samples\": [\n          0.45,\n          0.4,\n          0.35\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 2
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [],
      "metadata": {
        "id": "vLfwj7zrDaGm"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "![image.png](data:image/png;base64,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AEqHJBcAAAClQ5ILAACA0iHJBQAAQOmQ5AIAAKB0SHIBAABQOvU/6wsAAACUBVdyAQAAUDokuQAAACgdklwAAACUDkkuAAAASockFwAAAKVDkgsAAIDSIckFAABA6ZDkAgAAoHRIcgEAAFA6hZPcTZs2ubPPPttNnTq1/rr55pvd/v37szl632uvvVb/7toWbVMz2i5tn82/ZMmSbMpheeURz1Nmu3btcrNnz65v+1NPPZVNaU37IC9utLytS+vV+quiXazF2pV9SpyjUWpct4rbeL/mzYPyST3+WsVQ1duZbkqtd1vtV471HqY/61vE8uXLa6eddlrDa968ebV9+/Zlc/S2jRs31mbNmuX/l7Vr19Yuvvji2s6dO/1wbPHixf4l2kZtq8rA6H04XCVxeagMVZYq01Y0PS9u4n2h9fZTbA1Vu1gLtSv71DjHEalx3S5utQ8WLlxYmThG+vHXLoY0bPGI4ZVS77bbrxzrvavwldxPP/3UjR492v3mN79x27Zt86+XXnrJjR07Npujtz333HP+zGrGjBl+eDBA3ZQpU9xgcPrhkM7Q1q9f726//XY/rG1ctGiRW7duXf0KpMrjrLPO8u+r5p133nHbt293c+fO9cMTJ050CxYscK+88oofjtnVsXvvvdf9+Mc/zsYepvJcsWKFX17rEa137969buvWrX64zIrEWqhd2afEORqlxHWRuB1sAN24ceP6po7E0KUcf0ViqMrtTDel1rvt9ivHeu8qlORqp+/YscMdPHjQXX/99f5SfN4t515l3//MM8/MxhwO6smTJ+c2YArYgYEBN2nSpGyM8+8///xzX/lofaqIli5dWr81UaVbSJ988ok/wMMDWhWxkoRmt2fuv/9+t2XLFnf++ednYw5TWSqxCCtyrVcVxttvv52NKa92sRZrVfY68UyJczRKiesicav1bd68mduXFZHazrSLoaq3M92UUu8W2a8c672rcJKrgzG0YcMG98///M9+Wr8IKxMJgzYWN3Y6ACZMmODfa5sV0LfddptPLPReB0GVKiAd4HH5jB8/PhtqpKsUN954YzZ0NC0XVjZWgVRFq1jL067sU+IcjVLiul3c6iqc5lH9oHpCV+zmzJlD41dyKcdfqxiinemu1Hq31X7lWO9dhZJcnfX86U9/cjNnzvQ7US+916X6vKtNZaekTbc67rrrLj+s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)"
      ],
      "metadata": {
        "id": "9buYQLZkDYeN"
      }
    }
  ]
}