wko/wko-09.ipynb

791 lines
2.6 MiB
Plaintext
Raw Normal View History

2023-01-16 09:35:16 +01:00
{
"cells": [
{
"cell_type": "markdown",
"id": "80377b3b",
"metadata": {},
"source": [
"![Logo 1](img/aitech-logotyp-1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Widzenie komputerowe </h1>\n",
"<h2> 09. <i>Metody głębokiego uczenia (1)</i> [laboratoria]</h2> \n",
"<h3>Andrzej Wójtowicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](img/aitech-logotyp-2.jpg)"
]
},
{
"cell_type": "markdown",
"id": "07159136",
"metadata": {},
"source": [
"W poniższym materiale zobaczymy w jaki sposób korzystać z metod głębokiego uczenia sieci neuronowych w pakiecie OpenCV.\n",
"\n",
"Na początku załadujmy niezbędne biblioteki:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "b2e906f0",
"metadata": {},
"outputs": [],
"source": [
"import cv2 as cv\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"id": "f4348bc5",
"metadata": {},
"source": [
"OpenCV wspiera [wiele](https://github.com/opencv/opencv/wiki/Deep-Learning-in-OpenCV) bibliotek i modeli sieci neuronowych. Modele trenuje się poza OpenCV - bibliotekę wykorzystuje się tylko do predykcji, aczkolwiek sama w sobie ma całkiem sporo możliwych optymalizacji w porównaniu do źródłowych bibliotek neuronowych, więc predykcja może być tutaj faktycznie szybsza.\n",
"\n",
"Pliki z modelami i danymi pomocniczymi będziemy pobierali z sieci i będziemy je zapisywali w katalogu `dnn`:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "42b85f55",
"metadata": {},
"outputs": [],
"source": [
"!mkdir -p dnn"
]
},
{
"cell_type": "markdown",
"id": "ac09b098",
"metadata": {},
"source": [
"# Klasyfikacja obrazów\n",
"\n",
"Spróbujemy wykorzystać sieć do klasyfikacji obrazów wyuczonej na zbiorze [ImageNet](https://www.image-net.org/). Pobierzmy plik zawierający opis 1000 możliwych klas:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "85b1b68c",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\n",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
"100 21675 100 21675 0 0 63979 0 --:--:-- --:--:-- --:--:-- 64317\n"
]
}
],
"source": [
"!curl -o dnn/classification_classes_ILSVRC2012.txt https://raw.githubusercontent.com/opencv/opencv/master/samples/data/dnn/classification_classes_ILSVRC2012.txt "
]
},
{
"cell_type": "markdown",
"id": "fd0c577b",
"metadata": {},
"source": [
"Spójrzmy na pierwsze pięć klas w pliku:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "fb0d0546",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1000 ['tench, Tinca tinca', 'goldfish, Carassius auratus', 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', 'tiger shark, Galeocerdo cuvieri', 'hammerhead, hammerhead shark']\n"
]
}
],
"source": [
"with open('dnn/classification_classes_ILSVRC2012.txt', 'r') as f_fd:\n",
" classes = f_fd.read().splitlines()\n",
" \n",
"print(len(classes), classes[:5])"
]
},
{
"cell_type": "markdown",
"id": "5b0ee6ff",
"metadata": {},
"source": [
"Do klasyfikacji użyjemy sieci [DenseNet](https://arxiv.org/abs/1608.06993). Pobierzemy jedną z mniejszych [reimplementacji](https://github.com/shicai/DenseNet-Caffe), która jest hostowana m.in. na Google Drive (musimy doinstalować jeden pakiet):"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "fb2bf2a1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting gdown\n",
" Downloading gdown-4.6.0-py3-none-any.whl (14 kB)\n",
"Requirement already satisfied: six in c:\\users\\48516\\anaconda3\\envs\\widzenie_komputerowe\\lib\\site-packages (from gdown) (1.16.0)\n",
"Requirement already satisfied: requests[socks] in c:\\users\\48516\\anaconda3\\envs\\widzenie_komputerowe\\lib\\site-packages (from gdown) (2.28.1)\n",
"Collecting filelock\n",
" Downloading filelock-3.9.0-py3-none-any.whl (9.7 kB)\n",
"Collecting tqdm\n",
" Using cached tqdm-4.64.1-py2.py3-none-any.whl (78 kB)\n",
"Collecting beautifulsoup4\n",
" Using cached beautifulsoup4-4.11.1-py3-none-any.whl (128 kB)\n",
"Collecting soupsieve>1.2\n",
" Using cached soupsieve-2.3.2.post1-py3-none-any.whl (37 kB)\n",
"Requirement already satisfied: charset-normalizer<3,>=2 in c:\\users\\48516\\anaconda3\\envs\\widzenie_komputerowe\\lib\\site-packages (from requests[socks]->gdown) (2.1.1)\n",
"Requirement already satisfied: idna<4,>=2.5 in c:\\users\\48516\\anaconda3\\envs\\widzenie_komputerowe\\lib\\site-packages (from requests[socks]->gdown) (3.4)\n",
"Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\48516\\anaconda3\\envs\\widzenie_komputerowe\\lib\\site-packages (from requests[socks]->gdown) (1.26.13)\n",
"Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\48516\\anaconda3\\envs\\widzenie_komputerowe\\lib\\site-packages (from requests[socks]->gdown) (2022.12.7)\n",
"Collecting PySocks!=1.5.7,>=1.5.6\n",
" Using cached PySocks-1.7.1-py3-none-any.whl (16 kB)\n",
"Requirement already satisfied: colorama in c:\\users\\48516\\anaconda3\\envs\\widzenie_komputerowe\\lib\\site-packages (from tqdm->gdown) (0.4.5)\n",
"Installing collected packages: tqdm, soupsieve, PySocks, filelock, beautifulsoup4, gdown\n",
"Successfully installed PySocks-1.7.1 beautifulsoup4-4.11.1 filelock-3.9.0 gdown-4.6.0 soupsieve-2.3.2.post1 tqdm-4.64.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" WARNING: The script tqdm.exe is installed in 'C:\\Users\\48516\\AppData\\Roaming\\Python\\Python37\\Scripts' which is not on PATH.\n",
" Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\n",
" WARNING: The script gdown.exe is installed in 'C:\\Users\\48516\\AppData\\Roaming\\Python\\Python37\\Scripts' which is not on PATH.\n",
" Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.\n"
]
}
],
"source": [
"!pip3 install --user --disable-pip-version-check gdown"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "27996509",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Downloading...\n",
"From: https://drive.google.com/uc?id=0B7ubpZO7HnlCcHlfNmJkU2VPelE\n",
"To: c:\\Develop\\wmi\\AITECH\\sem2\\wko\\aitech-wko-pub\\dnn\\DenseNet_121.caffemodel\n",
"100%|██████████| 32.3M/32.3M [00:01<00:00, 18.9MB/s]\n"
]
},
{
"data": {
"text/plain": [
"'dnn/DenseNet_121.caffemodel'"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import gdown\n",
"\n",
"url = 'https://drive.google.com/uc?id=0B7ubpZO7HnlCcHlfNmJkU2VPelE'\n",
"output = 'dnn/DenseNet_121.caffemodel'\n",
"gdown.download(url, output, quiet=False)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "648ec9c9",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\n",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
" 7 76474 7 5484 0 0 16613 0 0:00:04 --:--:-- 0:00:04 16668\n",
"100 76474 100 76474 0 0 201k 0 --:--:-- --:--:-- --:--:-- 201k\n"
]
}
],
"source": [
"!curl -o dnn/DenseNet_121.prototxt https://raw.githubusercontent.com/shicai/DenseNet-Caffe/master/DenseNet_121.prototxt"
]
},
{
"cell_type": "markdown",
"id": "f7294c54",
"metadata": {},
"source": [
"Konkretne biblioteki neuronowe posiadają dedykowane funkcje do ładowania modeli, np. [`readNetFromCaffe()`](https://docs.opencv.org/4.5.3/d6/d0f/group__dnn.html#ga29d0ea5e52b1d1a6c2681e3f7d68473a) lub [`readNetFromTorch()`](https://docs.opencv.org/4.5.3/d6/d0f/group__dnn.html#ga65a1da76cb7d6852bdf7abbd96f19084), jednak można też użyć ogólnej [`readNet()`](https://docs.opencv.org/4.5.3/d6/d0f/group__dnn.html#ga3b34fe7a29494a6a4295c169a7d32422):"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "6fd2d6b3",
"metadata": {},
"outputs": [],
"source": [
"model = cv.dnn.readNet(model='dnn/DenseNet_121.prototxt', config='dnn/DenseNet_121.caffemodel', framework='Caffe')"
]
},
{
"cell_type": "markdown",
"id": "fe22fd6f",
"metadata": {},
"source": [
"Spróbujemy sklasyfikować poniższy obraz:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "6ace4606",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"image = cv.imread('img/flamingo.jpg')\n",
"plt.figure(figsize=[5,5])\n",
"plt.imshow(image[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "e51db3ac",
"metadata": {},
"source": [
"Aby móc przepuścić obraz przez sieć musimy zmienić jego formę reprezentacji poprzez funkcję [`blobFromImage()`](https://docs.opencv.org/4.5.3/d6/d0f/group__dnn.html#ga29f34df9376379a603acd8df581ac8d7). Aby uzyskać sensowne dane musimy ustawić parametry dotyczące preprocessingu (informacje o tym są zawarte na [stronie modelu](https://github.com/shicai/DenseNet-Caffe)):"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "d4e945ae",
"metadata": {},
"outputs": [],
"source": [
"image_blob = cv.dnn.blobFromImage(image=image, scalefactor=0.017, size=(224, 224), mean=(104, 117, 123), \n",
" swapRB=False, crop=False)"
]
},
{
"cell_type": "markdown",
"id": "625aebdd",
"metadata": {},
"source": [
"Ustawiamy dane wejściowe w naszej sieci i pobieramy obliczone wartości:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "753333a1",
"metadata": {},
"outputs": [],
"source": [
"model.setInput(image_blob)\n",
"outputs = model.forward()[0]"
]
},
{
"cell_type": "markdown",
"id": "34316ddb",
"metadata": {},
"source": [
"Wyliczamy która klasa jest najbardziej prawdopodobna:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "13423a6d",
"metadata": {},
"outputs": [],
"source": [
"outputs = outputs.reshape(1000, 1)\n",
"\n",
"label_id = np.argmax(outputs)\n",
"\n",
"probs = np.exp(outputs) / np.sum(np.exp(outputs))"
]
},
{
"cell_type": "markdown",
"id": "874c1b1d",
"metadata": {},
"source": [
"Wynik:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "ec75a3c5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"99.99 %\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(image[:,:,::-1])\n",
"plt.title(classes[label_id])\n",
"print(\"{:.2f} %\".format(np.max(probs) * 100.0))"
]
},
{
"cell_type": "markdown",
"id": "3808c42c",
"metadata": {},
"source": [
"# Wykrywanie twarzy\n",
"\n",
"Do wykrywania twarzy użyjemy sieci bazującej na [SSD](https://github.com/weiliu89/caffe/tree/ssd):"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "3c0df387",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\n",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
" 0 5225k 0 5484 0 0 7979 0 0:11:10 --:--:-- 0:11:10 7982\n",
"100 5225k 100 5225k 0 0 4114k 0 0:00:01 0:00:01 --:--:-- 4117k\n",
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\n",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
" 4 28104 4 1371 0 0 4689 0 0:00:05 --:--:-- 0:00:05 4695\n",
"100 28104 100 28104 0 0 93388 0 --:--:-- --:--:-- --:--:-- 93368\n"
]
}
],
"source": [
"!curl -o dnn/res10_300x300_ssd_iter_140000_fp16.caffemodel https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel\n",
"!curl -o dnn/res10_300x300_ssd_iter_140000_fp16.prototxt https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt"
]
},
{
"cell_type": "markdown",
"id": "c6142f6e",
"metadata": {},
"source": [
"Ładujemy model:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "60d41efb",
"metadata": {},
"outputs": [],
"source": [
"model = cv.dnn.readNet(model='dnn/res10_300x300_ssd_iter_140000_fp16.prototxt', config='dnn/res10_300x300_ssd_iter_140000_fp16.caffemodel', framework='Caffe')"
]
},
{
"cell_type": "markdown",
"id": "ad612cc6",
"metadata": {},
"source": [
"Będziemy chcieli wykryć twarze na poniższym obrazie:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "b404d8c4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"image = cv.imread('img/people.jpg')\n",
"plt.figure(figsize=[7,7])\n",
"plt.imshow(image[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "a77f8e64",
"metadata": {},
"source": [
"Znajdujemy twarze i oznaczamy je na zdjęciu (za próg przyjęliśmy 0.5; zob. informacje o [preprocessingu](https://github.com/opencv/opencv/tree/master/samples/dnn#face-detection)):"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "1d16f230",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+IAAAKdCAYAAACnGdPrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9S68ky5Iein3mHpGZa1XV3ufVT3Y3+0r33plAAnz0HyDAKWccEpw3Jz1iT0hQkwsBGnBA/gj+A056JoASAVKABBAUBUq67NvNc/q8du2qtVZmRLibBubmbu7hEZmravfpg7PTClkrM8LfDzP7zM3diZkZd7rTne50pzvd6U53utOd7nSnO93pF0Lur7oAd7rTne50pzvd6U53utOd7nSnO32b6A7E73SnO93pTne6053udKc73elOd/oF0h2I3+lOd7rTne50pzvd6U53utOd7vQLpDsQv9Od7nSnO93pTne6053udKc73ekXSHcgfqc73elOd7rTne50pzvd6U53utMvkO5A/E53utOd7nSnO93pTne6053udKdfIN2B+J3udKc73elOd7rTne50pzvd6U6/QLoD8Tvd6U53utOd7nSnO93pTne6051+gXQH4ne6053udKc73elOd7rTne50pzv9AukOxO90pzvd6U53utOd7nSnO93pTnf6BdIvNRD/1//6X+P3f//3cTqd8Ad/8Af49//+3/9VF+lOd7rTne50pzvd6U53utOd7nSnz6JfWiD+b/7Nv8Ef/dEf4Z//83+O//gf/yP+xt/4G/j7f//v4y/+4i/+qot2pzvd6U53utOd7nSnO93pTne60ycTMTP/VReiR3/wB3+Av/N3/g7+1b/6VwCAGCN+93d/F//kn/wT/NN/+k//ikt3pzvd6U53utOd7nSnO93pTne606fR8FddgB5N04T/8B/+A/74j/84P3PO4e/9vb+Hf/fv/l03zuVyweVyyb9jjPjZz36G73//+yCiv/Qy3+lOd7rTne50pzvd6U53utOdvt3EzPjw4QN++7d/G85tO6D/UgLxn/zkJwgh4Dd+4zeq57/xG7+B//yf/3M3zv/yv/wv+Bf/4l/8Iop3pzvd6U53utOd7nSnO93pTne60yb96Z/+KX7nd35n8/0vJRD/FPrjP/5j/NEf/VH+/f79e/ze7/0e/o//p/8zHt+8yavi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
"text/plain": [
"<Figure size 1200x1200 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"height, width, _ = image.shape\n",
"\n",
"image_blob = cv.dnn.blobFromImage(image, scalefactor=1.0, size=(300, 300), mean=[104, 177, 123], \n",
" swapRB=False, crop=False)\n",
"\n",
"model.setInput(image_blob)\n",
"\n",
"detections = model.forward()\n",
"\n",
"image_out = image.copy()\n",
"\n",
"for i in range(detections.shape[2]):\n",
" confidence = detections[0, 0, i, 2]\n",
" if confidence > 0.5:\n",
"\n",
" box = detections[0, 0, i, 3:7] * np.array([width, height, width, height])\n",
" (x1, y1, x2, y2) = box.astype('int')\n",
"\n",
" cv.rectangle(image_out, (x1, y1), (x2, y2), (0, 255, 0), 6)\n",
" label = '{:.3f}'.format(confidence)\n",
" label_size, base_line = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 3.0, 1)\n",
" cv.rectangle(image_out, (x1, y1 - label_size[1]), (x1 + label_size[0], y1 + base_line), \n",
" (255, 255, 255), cv.FILLED)\n",
" cv.putText(image_out, label, (x1, y1), cv.FONT_HERSHEY_SIMPLEX, 3.0, (0, 0, 0))\n",
" \n",
"plt.figure(figsize=[12,12])\n",
"plt.imshow(image_out[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "590841cd",
"metadata": {},
"source": [
"## Punkty charakterystyczne twarzy\n",
"\n",
"W OpenCV jest możliwość wykrywania punktów charakterystycznych twarzy (ang. *facial landmarks*). Użyjemy zaimplementowanego [modelu](http://www.jiansun.org/papers/CVPR14_FaceAlignment.pdf) podczas Google Summer of Code przy użyciu [`createFacemarkLBF()`](https://docs.opencv.org/4.5.3/d4/d48/namespacecv_1_1face.html#a0bec73a729ed878430c2feb9ce65bc2a):"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "8534a399",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\n",
" 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n",
" 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0\n",
" 0 53.7M 0 2742 0 0 1342 0 11:40:08 0:00:02 11:40:06 1343\n",
" 9 53.7M 9 5302k 0 0 2069k 0 0:00:26 0:00:02 0:00:24 2069k\n",
" 44 53.7M 44 24.1M 0 0 6946k 0 0:00:07 0:00:03 0:00:04 6945k\n",
" 79 53.7M 79 42.6M 0 0 9558k 0 0:00:05 0:00:04 0:00:01 9557k\n",
"100 53.7M 100 53.7M 0 0 10.4M 0 0:00:05 0:00:05 --:--:-- 13.6M\n"
]
}
],
"source": [
"!curl -o dnn/lbfmodel.yaml https://raw.githubusercontent.com/kurnianggoro/GSOC2017/master/data/lbfmodel.yaml"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "c2971f10",
"metadata": {},
"outputs": [],
"source": [
"landmark_detector = cv.face.createFacemarkLBF()\n",
"landmark_detector.loadModel('dnn/lbfmodel.yaml')"
]
},
{
"cell_type": "markdown",
"id": "761dbc15",
"metadata": {},
"source": [
"Ograniczamy nasze poszukiwania do twarzy:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "39215601",
"metadata": {},
"outputs": [],
"source": [
"faces = []\n",
"\n",
"for detection in detections[0][0]:\n",
" if detection[2] >= 0.5:\n",
" left = detection[3] * width\n",
" top = detection[4] * height\n",
" right = detection[5] * width\n",
" bottom = detection[6] * height\n",
"\n",
" face_w = right - left\n",
" face_h = bottom - top\n",
"\n",
" face_roi = (left, top, face_w, face_h)\n",
" faces.append(face_roi)\n",
"\n",
"faces = np.array(faces).astype(int)\n",
"\n",
"_, landmarks_list = landmark_detector.fit(image, faces)"
]
},
{
"cell_type": "markdown",
"id": "56aa90c9",
"metadata": {},
"source": [
"Model generuje 68 punktów charakterycznych, które możemy zwizualizować:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "6d3ab726",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x1000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"image_display = image.copy()\n",
"landmarks = landmarks_list[0][0].astype(int)\n",
"\n",
"for idx, landmark in enumerate(landmarks):\n",
" cv.circle(image_display, landmark, 2, (0,255,255), -1)\n",
" cv.putText(image_display, str(idx), landmark, cv.FONT_HERSHEY_SIMPLEX, 0.35, (0, 255, 0), 1, \n",
" cv.LINE_AA)\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image_display[700:1050,500:910,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "7cee8969",
"metadata": {},
"source": [
"Jeśli nie potrzebujemy numeracji, to możemy użyć prostszego podejścia, tj. funkcji [`drawFacemarks()`](https://docs.opencv.org/4.5.3/db/d7c/group__face.html#ga318d9669d5ed4dfc6ab9fae2715310f5):"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "1039e253",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1000x1000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"image_display = image.copy()\n",
"for landmarks_set in landmarks_list:\n",
" cv.face.drawFacemarks(image_display, landmarks_set, (0, 255, 0))\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image_display[500:1050,500:1610,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "db16a1bf",
"metadata": {},
"source": [
"# Zadanie 1\n",
"\n",
"W katalogu `vid` znajdują się filmy `blinking-*.mp4`. Napisz program do wykrywania mrugnięć. Opcjonalnie możesz użyć *eye aspect ratio* z [tego artykułu](http://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdf) lub zaproponować własne rozwiązanie."
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "7da9d29f",
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'dlib'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_21148\\2549845874.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mimutils\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mdlib\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mcv2\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'dlib'"
]
}
],
"source": [
"from scipy.spatial import distance as dist\n",
"from imutils.video import FileVideoStream\n",
"from imutils.video import VideoStream\n",
"from imutils import face_utils\n",
"import numpy as np\n",
"import argparse\n",
"import imutils\n",
"import time\n",
"import dlib\n",
"import cv2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "90ab8fb8",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Traceback (most recent call last):\n",
" File \"blink_detection_lab8.py\", line 10, in <module>\n",
" import dlib\n",
"ModuleNotFoundError: No module named 'dlib'\n"
]
}
],
"source": [
"!python3 blink_detection_lab8.py -v vid/blinking-man.mp4 -p shape_predictor_68_face_landmarks.dat "
]
},
{
"attachments": {
"image.png": {
"image/png": "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
}
},
"cell_type": "markdown",
"id": "33d496d2",
"metadata": {},
"source": [
"![image.png](attachment:image.png)"
]
}
],
"metadata": {
"author": "Andrzej Wójtowicz",
"email": "andre@amu.edu.pl",
"kernelspec": {
"display_name": "widzenie_komputerowe",
"language": "python",
"name": "python3"
},
"lang": "pl",
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.12 | packaged by conda-forge | (default, Oct 26 2021, 05:35:01) [MSC v.1916 64 bit (AMD64)]"
},
"subtitle": "09. Wykrywanie i rozpoznawanie tekstu [laboratoria]",
"title": "Widzenie komputerowe",
"vscode": {
"interpreter": {
"hash": "6ac7fc53e11b5e853f03d2492fedb08fce658edca143f79fa3d2748d3b63b777"
}
},
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 5
}