2023-01-16 09:35:16 +01:00
{
2023-01-30 13:54:58 +01:00
"cells": [
{
"cell_type": "code",
"execution_count": 16,
"id": "nMai_g_dwTOS",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "nMai_g_dwTOS",
"outputId": "6a94ccca-7390-459d-e5a6-7cc5c98e6364"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cloning into 'wko'...\n",
"remote: Enumerating objects: 102, done.\u001b[K\n",
"remote: Counting objects: 100% (102/102), done.\u001b[K\n",
"remote: Compressing objects: 100% (100/100), done.\u001b[K\n",
"remote: Total 102 (delta 2), reused 102 (delta 2)\u001b[K\n",
"Receiving objects: 100% (102/102), 126.67 MiB | 734.00 KiB/s, done.\n",
"Resolving deltas: 100% (2/2), done.\n"
]
}
],
"source": [
"!git clone https://git.wmi.amu.edu.pl/s444417/wko"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "EuRiyPQMw0RP",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "EuRiyPQMw0RP",
"outputId": "a6afa182-1b77-4915-baae-56938b01d14a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/content/wko\n"
]
}
],
"source": [
"%cd /content/wko"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "XeRQ_YVew3g2",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XeRQ_YVew3g2",
"outputId": "4488091a-21ef-456a-9288-27d82963f928"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/content/wko\n"
]
}
],
"source": [
"!pwd"
]
},
{
"cell_type": "markdown",
"id": "3c8a4b52",
"metadata": {
"id": "3c8a4b52"
},
"source": [
"![Logo 1](img/aitech-logotyp-1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Widzenie komputerowe </h1>\n",
"<h2> 10. <i>Metody głębokiego uczenia (2)</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": "783d6d64",
"metadata": {
"id": "783d6d64"
},
"source": [
"W poniższym materiale zobaczymy w jaki sposób korzystać z wytrenowanych modeli sieci neuronowych w zagadnieniach związanych z wykrywaniem wielu obiektów, szacowaniem pozy człowieka, wykrywaniem i rozpoznawaniem tekstu oraz super rozdzielczością.\n",
"\n",
"Uwaga: realizacja poniższych treści będzie wymagała pobrania ok. 700 MB danych.\n",
"\n",
"Na początku załadujmy niezbędne biblioteki:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "ef18510f",
"metadata": {
"id": "ef18510f"
},
"outputs": [],
"source": [
"import cv2 as cv\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"id": "e45afc56",
"metadata": {
"id": "e45afc56"
},
"source": [
"Pobrane pliki będziemy zapisywać w katalogu `dnn`:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "7aac31ef",
"metadata": {
"id": "7aac31ef"
},
"outputs": [],
"source": [
"!mkdir -p dnn"
]
},
{
"cell_type": "markdown",
"id": "f792eb4f",
"metadata": {
"id": "f792eb4f"
},
"source": [
"# Wykrywanie obiektów\n",
"\n",
"## SSD\n",
"\n",
"W poprzednich materiałach korzystaliśmy z [SSD](https://arxiv.org/pdf/1512.02325.pdf) do wykrywania wielu twarzy na zdjęciu. W poniższym przykładzie możemy zobaczyć użycie do wykrywania wielu obiektów - sieć została wytrenowana na zbiorze [Common Objects in Context](https://cocodataset.org/) (COCO). Użyjemy modelu dostępnego dla frameworku [Tensorflow](https://github.com/tensorflow/models/tree/master/research/object_detection) (inne modele możemy znaleźć w [Detection Model Zoo](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md)):"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "aa10b6fa",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "aa10b6fa",
"outputId": "0277eb03-d371-4993-fd11-2bd3c4b275f3"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dnn/ssd_mobilenet_v 100%[===================>] 179.22M 252MB/s in 0.7s \n"
]
}
],
"source": [
"!wget -q --show-progress -O dnn/ssd_mobilenet_v2_coco_2018_03_29.tar.gz http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz\n",
"!cd dnn && tar xzf ssd_mobilenet_v2_coco_2018_03_29.tar.gz && rm ssd_mobilenet_v2_coco_2018_03_29.tar.gz"
]
},
{
"cell_type": "markdown",
"id": "99ec1efa",
"metadata": {
"id": "99ec1efa"
},
"source": [
"Pobraliśmy model i generujemy konfigurację:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "eac9a8da",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "eac9a8da",
"outputId": "f0fe207f-d984-4ca2-c7c4-af60c082994c"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dnn/ssd_mobilenet_v 100%[===================>] 17.88K --.-KB/s in 0.001s \n",
"dnn/ssd_mobilenet_v 100%[===================>] 9.82K --.-KB/s in 0s \n",
"tf_text_graph_ssd.py:273: SyntaxWarning: \"is\" with a literal. Did you mean \"==\"?\n",
" for label in ['ClassPredictor', 'BoxEncodingPredictor' if box_predictor is 'convolutional' else 'BoxPredictor']:\n",
"tf_text_graph_ssd.py:278: SyntaxWarning: \"is\" with a literal. Did you mean \"==\"?\n",
" if box_predictor is 'convolutional':\n",
"tf_text_graph_ssd.py:311: SyntaxWarning: \"is\" with a literal. Did you mean \"==\"?\n",
" if box_predictor is 'convolutional':\n",
"Scale: [0.200000-0.950000]\n",
"Aspect ratios: [1.0, 2.0, 0.5, 3.0, 0.333299994469]\n",
"Reduce boxes in the lowest layer: True\n",
"Number of classes: 90\n",
"Number of layers: 6\n",
"box predictor: convolutional\n",
"Input image size: 300x300\n"
]
}
],
"source": [
"!wget -q --show-progress -O dnn/ssd_mobilenet_v2_coco_2018_03_29/tf_text_graph_ssd.py https://raw.githubusercontent.com/opencv/opencv/4.5.3/samples/dnn/tf_text_graph_ssd.py\n",
"!wget -q --show-progress -O dnn/ssd_mobilenet_v2_coco_2018_03_29/tf_text_graph_common.py https://raw.githubusercontent.com/opencv/opencv/4.5.3/samples/dnn/tf_text_graph_common.py\n",
"!cd dnn/ssd_mobilenet_v2_coco_2018_03_29 && python3 tf_text_graph_ssd.py --input frozen_inference_graph.pb --output net.pbtxt --config pipeline.config"
]
},
{
"cell_type": "markdown",
"id": "232e2987",
"metadata": {
"id": "232e2987"
},
"source": [
"Wczytujemy model:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "9b4180e5",
"metadata": {
"id": "9b4180e5"
},
"outputs": [],
"source": [
"model = cv.dnn.readNetFromTensorflow(\"dnn/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb\",\n",
" \"dnn/ssd_mobilenet_v2_coco_2018_03_29/net.pbtxt\")"
]
},
{
"cell_type": "markdown",
"id": "0bbfd2a4",
"metadata": {
"id": "0bbfd2a4"
},
"source": [
"Pobieramy i wczytujemy etykiety klas obiektów:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "17335a42",
"metadata": {
"id": "17335a42"
},
"outputs": [],
"source": [
"!wget -q -O - https://raw.githubusercontent.com/tensorflow/models/master/research/object_detection/data/mscoco_complete_label_map.pbtxt | grep display_name | grep -o '\".*\"' | tr -d '\"' > dnn/ssd_mobilenet_v2_coco_2018_03_29/coco-labels.txt"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "662e1a33",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "662e1a33",
"outputId": "e8749ad7-6f3f-4d79-a98f-418d4121159a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"91 ['background', 'person', 'bicycle', 'car', 'motorcycle']\n"
]
}
],
"source": [
"with open('dnn/ssd_mobilenet_v2_coco_2018_03_29/coco-labels.txt', 'r') as f_fd:\n",
" classes = f_fd.read().splitlines()\n",
" \n",
"print(len(classes), classes[:5])"
]
},
{
"cell_type": "markdown",
"id": "94cace8a",
"metadata": {
"id": "94cace8a"
},
"source": [
"Spróbujemy sprawdzić jakie obiekty znajdują się na poniższym zdjęciu:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "91834aba",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"id": "91834aba",
"outputId": "d1b3927e-9842-4462-db61-a3d004817e1e"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 504x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image = cv.imread('img/messi5.jpg')\n",
"plt.figure(figsize=[7,7])\n",
"plt.imshow(image[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "43774ae3",
"metadata": {
"id": "43774ae3"
},
"source": [
"Sieć zwraca nam listę obiektów z oznaczeniem współrzędnych na zdjęciu oraz identyfikatorem obiektu (ustawiliśmy próg odcięcia na 0.5):"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "84652c91",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 417
},
"id": "84652c91",
"outputId": "8035b80f-5621-4b02-e3af-63f918a8730e"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 864x864 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"height, width, _ = image.shape\n",
"\n",
"image_blob = cv.dnn.blobFromImage(image=image, scalefactor=1, size=(300, 300), mean=(0,0,0), \n",
" swapRB=True, crop=False)\n",
"\n",
"model.setInput(image_blob)\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",
" class_id = int(detections[0, 0, i, 1])\n",
"\n",
" cv.rectangle(image_out, (x1, y1), (x2, y2), (0, 255, 0), 6)\n",
" label = '{:} ({:.3f})'.format(classes[class_id], confidence)\n",
" label_size, base_line = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.65, 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, 0.65, (0, 0, 0))\n",
" \n",
"plt.figure(figsize=[12,12])\n",
"plt.imshow(image_out[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "3fa16e91",
"metadata": {
"id": "3fa16e91"
},
"source": [
"## YOLOv4"
]
},
{
"cell_type": "markdown",
"id": "27ce3522",
"metadata": {
"id": "27ce3522"
},
"source": [
"Innym popularnym modelem do wykrywania obiektów jest [You Only Look Once](https://github.com/AlexeyAB/darknet) (YOLO). Porównując YOLO do innych sieci, model ten nie analizuje poszczególnych regionów, ale patrzy na obraz całościowo, co w pewien sposób stanowi balans między szybkością a precyzją. Ze względu na tę cechę model ten dobrze nadaje się do wykrywania obiektów w czasie rzeczywistym. Model powinien dobrze sobie radzić gdy zostanie mu przedstawiona nieznana wcześniej reprezentacja obiektu (np. zacieniony) lub gdy obiekt znajduje się w otoczeniu innych nieoczekiwanych obiektów.\n",
"\n",
"YOLO jest dostępne w kilku wersjach, natomiast my sprawdzimy jak sobie radzi wersja kompaktowa:"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "4c3e7fb1",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4c3e7fb1",
"outputId": "828fa7fa-e873-44d0-e424-299c041bc039"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dnn/yolo_v4_tiny/yo 100%[===================>] 23.13M 154MB/s in 0.2s \n",
"dnn/yolo_v4_tiny/yo 100%[===================>] 3.16K --.-KB/s in 0s \n",
"dnn/yolo_v4_tiny/co 100%[===================>] 625 --.-KB/s in 0s \n"
]
}
],
"source": [
"!mkdir -p dnn/yolo_v4_tiny\n",
"!wget -q --show-progress -O dnn/yolo_v4_tiny/yolov4-tiny.weights https://github.com/AlexeyAB/darknet/releases/download/yolov4/yolov4-tiny.weights\n",
"!wget -q --show-progress -O dnn/yolo_v4_tiny/yolov4-tiny.cfg https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4-tiny.cfg\n",
"!wget -q --show-progress -O dnn/yolo_v4_tiny/coco.names https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/coco.names"
]
},
{
"cell_type": "markdown",
"id": "9497b09c",
"metadata": {
"id": "9497b09c"
},
"source": [
"Wczytujemy model:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "e8cc6a3a",
"metadata": {
"id": "e8cc6a3a"
},
"outputs": [],
"source": [
"model = cv.dnn.readNetFromDarknet(\"dnn/yolo_v4_tiny/yolov4-tiny.cfg\", \n",
" \"dnn/yolo_v4_tiny/yolov4-tiny.weights\")"
]
},
{
"cell_type": "markdown",
"id": "df331450",
"metadata": {
"id": "df331450"
},
"source": [
"Wczytujemy etykiety obiektów:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "8f01d354",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "8f01d354",
"outputId": "a15a642c-3de2-47a6-8446-f44c7fd86fa2"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"80 ['person', 'bicycle', 'car', 'motorbike', 'aeroplane']\n"
]
}
],
"source": [
"with open('dnn/yolo_v4_tiny/coco.names', 'r') as f_fd:\n",
" classes = f_fd.read().splitlines()\n",
" \n",
"print(len(classes), classes[:5])"
]
},
{
"cell_type": "markdown",
"id": "3fc5e3fc",
"metadata": {
"id": "3fc5e3fc"
},
"source": [
"Przetestujemy działanie na poniższym zdjęciu:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "df65dee0",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 432
},
"id": "df65dee0",
"outputId": "60720513-7cb9-47b1-961d-7db9a4757774"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 504x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image = cv.imread('img/pedestrians.jpg')\n",
"plt.figure(figsize=[7,7])\n",
"plt.imshow(image[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "9fbb6325",
"metadata": {
"id": "9fbb6325"
},
"source": [
"Podczas korzystania z tego modelu musimy się zmierzyć z kilkoma subtelnościami. Model wykorzystuje framework Darknet, więc musimy wskazać, że chodzi nam o predykcje pochodzące z ostatniej warstwy. Dodatkowo mamy kilka progów odcięcia do zdefiniowania, tj. miarę obiektowości (*objectness*), pewności (*confidence*) oraz tłumienia niemaksymalnego aby ograniczyć występowanie nakładających się na siebie ramek z wykrytymi obiektami (por. [`cv.dnn.NMSBoxes()`](https://docs.opencv.org/4.5.3/d6/d0f/group__dnn.html#ga9d118d70a1659af729d01b10233213ee)). Poniżej mamy wynik działania:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "d8450888",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 391
},
"id": "d8450888",
"outputId": "510a045e-0a2f-4c6c-bc8f-a201065cdbaa"
},
"outputs": [
{
"ename": "IndexError",
"evalue": "ignored",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-32-9712370d1845>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetInput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimage_blob\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mdetections\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetLayerNames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetUnconnectedOutLayers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\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 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mimage_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\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[0;32m<ipython-input-32-9712370d1845>\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetInput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimage_blob\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mdetections\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetLayerNames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetUnconnectedOutLayers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\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 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mimage_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mimage\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\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[0;31mIndexError\u001b[0m: invalid index to scalar variable."
]
}
],
"source": [
"height, width, _ = image.shape\n",
"\n",
"image_blob = cv.dnn.blobFromImage(image=image, scalefactor=1/255, size=(416, 416), mean=(0,0,0), \n",
" swapRB=True, crop=False)\n",
"\n",
"model.setInput(image_blob)\n",
"detections = model.forward([model.getLayerNames()[i[0] - 1] for i in model.getUnconnectedOutLayers()])\n",
"\n",
"image_out = image.copy()\n",
"\n",
"class_ids = []\n",
"confidences = []\n",
"boxes = []\n",
"\n",
"for out in detections:\n",
" for detection in out:\n",
" if detection[4] > 0.5: # objectness thr.\n",
" scores = detection[5:]\n",
" class_id = np.argmax(scores)\n",
" confidence = scores[class_id]\n",
" if confidence > 0.5: # confidence thr.\n",
" center_x = int(detection[0] * width)\n",
" center_y = int(detection[1] * height)\n",
" b_width = int(detection[2] * width)\n",
" b_height = int(detection[3] * height)\n",
"\n",
" b_left = int(center_x - b_width / 2)\n",
" b_top = int(center_y - b_height / 2)\n",
" class_ids.append(class_id)\n",
" confidences.append(float(confidence))\n",
" boxes.append([b_left, b_top, b_width, b_height])\n",
"\n",
"indices = cv.dnn.NMSBoxes(boxes, confidences, score_threshold=0.5, nms_threshold=0.5)\n",
"for i in indices:\n",
" idx = i[0]\n",
" box = boxes[idx]\n",
" x1 = box[0]\n",
" y1 = box[1]\n",
" x2 = box[0] + box[2]\n",
" y2 = box[1] + box[3]\n",
" cv.rectangle(image_out, (x1, y1), (x2, y2), (0, 255, 0), 6)\n",
" label = '{:} ({:.3f})'.format(classes[class_ids[idx]], confidences[idx])\n",
" \n",
" label_size, base_line = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.65, 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, 0.65, (0, 0, 0))\n",
" \n",
"plt.figure(figsize=[12,12])\n",
"plt.imshow(image_out[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "41e32b8e",
"metadata": {
"id": "41e32b8e"
},
"source": [
"# Szacowanie pozy człowieka\n",
"\n",
"Kolejnym interesującym zagadnieniem jest szacowanie pozy człowieka (ang. *human pose estimation*) na podstawie zdjęcia. Celem jest tutaj wykrycie charakterystycznych punktów orientacyjnych, które mogą potem zostać wykorzystane np. treningu sportowego, kontroli gestów, korekcji postawy, itp. W tym celu wykorzystamy [OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)."
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "6a3fedf2",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6a3fedf2",
"outputId": "85c361b2-32df-4922-f7ba-009c8399a70c"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dnn/openpose/pose_i 100%[===================>] 196.41M 61.1MB/s in 3.7s \n",
"dnn/openpose/pose_d 100%[===================>] 31.46K --.-KB/s in 0.002s \n"
]
}
],
"source": [
"!mkdir -p dnn/openpose\n",
"!wget -q --show-progress -O dnn/openpose/pose_iter_160000.caffemodel http://posefs1.perception.cs.cmu.edu/Users/tsimon/Projects/coco/data/models/mpi/pose_iter_160000.caffemodel\n",
"!wget -q --show-progress -O dnn/openpose/pose_deploy_linevec_faster_4_stages.prototxt https://raw.githubusercontent.com/CMU-Perceptual-Computing-Lab/openpose/master/models/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
]
},
{
"cell_type": "markdown",
"id": "851c965b",
"metadata": {
"id": "851c965b"
},
"source": [
"Wczytujemy model:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "d55edcb8",
"metadata": {
"id": "d55edcb8"
},
"outputs": [],
"source": [
"model = cv.dnn.readNetFromCaffe(\"dnn/openpose/pose_deploy_linevec_faster_4_stages.prototxt\",\n",
" \"dnn/openpose/pose_iter_160000.caffemodel\")"
]
},
{
"cell_type": "markdown",
"id": "c2c701c3",
"metadata": {
"id": "c2c701c3"
},
"source": [
"Będziemy chcieli przeanalizować poniższe zdjęcie:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "aeaed6eb",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"id": "aeaed6eb",
"outputId": "19e5b8f8-a816-4e26-c0e1-83d3cb1482a7"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 504x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image = cv.imread(\"img/messi5.jpg\")\n",
"plt.figure(figsize=[7,7])\n",
"plt.imshow(image[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "00a42dd5",
"metadata": {
"id": "00a42dd5"
},
"source": [
"Zdefinujemy poniżej połączenia pomiędzy 15 punktami orientacyjnymi:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "894acae5",
"metadata": {
"id": "894acae5"
},
"outputs": [],
"source": [
"pose_points_n = 15\n",
"pose_pairs = [[0,1], [1,2], [2,3], [3,4], [1,5], [5,6], [6,7], [1,14], [14,8], [8,9], [9,10], [14,11], [11,12], [12,13]]"
]
},
{
"cell_type": "markdown",
"id": "5a8a5028",
"metadata": {
"id": "5a8a5028"
},
"source": [
"W wyniku otrzymujemy mapy prawodpodobieństwa występowania danego punktu orientacyjnego:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "24ca95c6",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 115
},
"id": "24ca95c6",
"outputId": "54ab09e1-4ae2-49c2-8133-5b879e1277ef"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x216 with 15 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"height, width, _ = image.shape\n",
"\n",
"image_blob = cv.dnn.blobFromImage(image, 1.0/255, (368, 368), (0, 0, 0), swapRB=False, crop=False)\n",
"model.setInput(image_blob)\n",
"\n",
"output = model.forward()\n",
"\n",
"plt.figure(figsize=(20,3))\n",
"for i in range(pose_points_n):\n",
" prob_map = output[0, i, :, :]\n",
" disp_map = cv.resize(prob_map, (width, height), cv.INTER_LINEAR)\n",
" plt.subplot(2, 8, i+1)\n",
" plt.axis('off')\n",
" plt.imshow(disp_map, cmap='jet', vmin=0, vmax=1)"
]
},
{
"cell_type": "markdown",
"id": "c8be6dc1",
"metadata": {
"id": "c8be6dc1"
},
"source": [
"Przeskalowujemy wyniki do rozmiarów obrazu wejściowego i przy pomocy [`cv.minMaxLoc()`](https://docs.opencv.org/4.5.3/d2/de8/group__core__array.html#gab473bf2eb6d14ff97e89b355dac20707) znajdujemy wartość maksymalną (dodatkowo sprawdzamy czy wartość prawdopodobieństwa jest odpowiednio duża):"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "a3163987",
"metadata": {
"id": "a3163987"
},
"outputs": [],
"source": [
"scale_x = width / output.shape[3]\n",
"scale_y = height / output.shape[2]\n",
"\n",
"points = []\n",
"\n",
"for i in range(pose_points_n):\n",
" prob_map = output[0, i, :, :]\n",
" \n",
" _, prob, _, point = cv.minMaxLoc(prob_map)\n",
" \n",
" x = scale_x * point[0]\n",
" y = scale_y * point[1]\n",
"\n",
" if prob > 0.1: # thr.\n",
" points.append((int(x), int(y)))\n",
" else:\n",
" points.append(None)"
]
},
{
"cell_type": "markdown",
"id": "f1f8cac3",
"metadata": {
"id": "f1f8cac3"
},
"source": [
"Możemy teraz nanieść punkty na obraz i połączyć je w szkielet"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "fcbda6c6",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 208
},
"id": "fcbda6c6",
"outputId": "2a53717b-290a-4633-9667-10216e49e99e"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x1440 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image_points = image.copy()\n",
"image_skeleton = image.copy()\n",
"\n",
"for i, p in enumerate(points):\n",
" cv.circle(image_points, p, 8, (255, 255, 0), thickness=-1, lineType=cv.FILLED)\n",
" cv.putText(image_points, \"{}\".format(i), p, cv.FONT_HERSHEY_SIMPLEX, 1, (0,255,255), 2, lineType=cv.LINE_AA)\n",
"\n",
"\n",
"for pair in pose_pairs:\n",
" part_a = pair[0]\n",
" part_b = pair[1]\n",
"\n",
" if points[part_a] and points[part_b]:\n",
" cv.line(image_skeleton, points[part_a], points[part_b], (0, 255, 255), 4)\n",
" cv.circle(image_skeleton, points[part_a], 7, (255, 255, 0), thickness=-1, lineType=cv.FILLED)\n",
"\n",
"plt.figure(figsize=(20,20))\n",
"plt.subplot(121)\n",
"plt.imshow(image_points[:,:,::-1])\n",
"plt.subplot(122)\n",
"plt.imshow(image_skeleton[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "ea3421fd",
"metadata": {
"id": "ea3421fd"
},
"source": [
"# Wykrywanie i rozpoznawanie tekstu\n",
"\n",
"W kolejnym przykładzie zobaczymy jak możemy wykryć na zdjęciu tekst przy pomocy [DB](https://github.com/MhLiao/DB) oraz rozpoznać go przy pomocy [CRNN](https://arxiv.org/pdf/1507.05717.pdf)."
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "5ef81ed2",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "5ef81ed2",
"outputId": "9e5e74ea-366d-48ba-e59f-2147ac9a057f"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Downloading...\n",
"From: https://drive.google.com/uc?export=dowload&id=19YWhArrNccaoSza0CfkXlA8im4-lAGsR\n",
"To: /content/wko/dnn/DB_TD500_resnet50.onnx\n",
"100%|██████████| 101M/101M [00:01<00:00, 79.4MB/s] \n",
"Downloading...\n",
"From: https://drive.google.com/uc?export=dowload&id=12diBsVJrS9ZEl6BNUiRp9s0xPALBS7kt\n",
"To: /content/wko/dnn/crnn_cs.onnx\n",
"100%|██████████| 64.9M/64.9M [00:00<00:00, 67.7MB/s]\n",
"Downloading...\n",
"From: https://drive.google.com/uc?export=dowload&id=1oKXxXKusquimp7XY1mFvj9nwLzldVgBR\n",
"To: /content/wko/dnn/alphabet_94.txt\n",
"100%|██████████| 188/188 [00:00<00:00, 260kB/s]\n"
]
}
],
"source": [
"import gdown\n",
"\n",
"for url, output in [('https://drive.google.com/uc?export=dowload&id=19YWhArrNccaoSza0CfkXlA8im4-lAGsR', 'dnn/DB_TD500_resnet50.onnx'), \n",
" ('https://drive.google.com/uc?export=dowload&id=12diBsVJrS9ZEl6BNUiRp9s0xPALBS7kt', 'dnn/crnn_cs.onnx'),\n",
" ('https://drive.google.com/uc?export=dowload&id=1oKXxXKusquimp7XY1mFvj9nwLzldVgBR', 'dnn/alphabet_94.txt')]:\n",
" gdown.download(url, output, quiet=False)"
]
},
{
"cell_type": "markdown",
"id": "72721bc5",
"metadata": {
"id": "72721bc5"
},
"source": [
"Będziemy pracować na poniższym zdjęciu:"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "86e3f889",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 432
},
"id": "86e3f889",
"outputId": "92443850-051f-4798-882f-de73be17cb07"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image = cv.imread('img/road-sign.jpg')\n",
"\n",
"plt.figure(figsize=(5,7))\n",
"plt.imshow(image[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "ec7d3ce4",
"metadata": {
"id": "ec7d3ce4"
},
"source": [
"Wczytujemy obsługiwany alfabet:"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "5d27f129",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "5d27f129",
"outputId": "a7668afc-97ca-4b2c-8565-f3b20782e613"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"94 ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e']\n"
]
}
],
"source": [
"with open('dnn/alphabet_94.txt', 'r') as f_fd:\n",
" alphabet = f_fd.read().splitlines()\n",
" \n",
"print(len(alphabet), alphabet[:15])"
]
},
{
"cell_type": "markdown",
"id": "d3373c60",
"metadata": {
"id": "d3373c60"
},
"source": [
"OpenCV posiada gotowe API dla sieci DB poprzez [`cv.dnn_TextDetectionModel_DB()`](https://docs.opencv.org/4.5.3/db/d0f/classcv_1_1dnn_1_1TextDetectionModel__DB.html):"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "b3c3bfc2",
"metadata": {
"id": "b3c3bfc2"
},
"outputs": [],
"source": [
"text_detector = cv.dnn_TextDetectionModel_DB(\"dnn/DB_TD500_resnet50.onnx\")\n",
"\n",
"text_detector.setBinaryThreshold(0.4).setPolygonThreshold(0.5)\n",
"text_detector.setInputParams(scale=1.0/255, size=(640, 640), \n",
" mean=(122.67891434, 116.66876762, 104.00698793), swapRB=True)"
]
},
{
"cell_type": "markdown",
"id": "31300a5f",
"metadata": {
"id": "31300a5f"
},
"source": [
"W wyniku otrzymujemy ramki, na których występuje tekst (choć jak widzimy, są też wyniki fałszywie pozytywne):"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "d14502d4",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 432
},
"id": "d14502d4",
"outputId": "b2605c56-9228-4b1c-e775-8e2b6b4017b8"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"boxes, confs = text_detector.detect(image)\n",
"\n",
"image_out = image.copy()\n",
"\n",
"cv.polylines(image_out, boxes, True, (255, 0, 255), 4)\n",
"\n",
"plt.figure(figsize=(5,7))\n",
"plt.imshow(image_out[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "3c3eae71",
"metadata": {
"id": "3c3eae71"
},
"source": [
"W kolejnym kroku przygotowujemy model do rozpoznawania tekstu przy pomocy [`cv.dnn_TextRecognitionModel()`](https://docs.opencv.org/4.5.3/de/dee/classcv_1_1dnn_1_1TextRecognitionModel.html):"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "d6b29f6a",
"metadata": {
"id": "d6b29f6a"
},
"outputs": [],
"source": [
"text_recognizer = cv.dnn_TextRecognitionModel(\"dnn/crnn_cs.onnx\")\n",
"text_recognizer.setDecodeType(\"CTC-greedy\")\n",
"text_recognizer.setVocabulary(alphabet)\n",
"text_recognizer.setInputParams(scale=1/127.5, size=(100, 32), mean=(127.5, 127.5, 127.5), swapRB=True)"
]
},
{
"cell_type": "markdown",
"id": "a17f6437",
"metadata": {
"id": "a17f6437"
},
"source": [
"Każdą wykrytą ramkę rzutujemy na rozmiar 100x32 i wykrywamy tekst:"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "d6909f83",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "d6909f83",
"outputId": "a42e5f2f-610d-4165-f056-aa78e3b4e77b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SIGNAL\n",
"RED\n",
"you\n",
"HEREON\n",
"STOP\n",
"Fe\n",
"a\n",
"a\n"
]
}
],
"source": [
"for box in boxes:\n",
" vertices = np.asarray(box).astype(np.float32)\n",
" output_size = (100, 32)\n",
" target_vertices = np.array([\n",
" [0, output_size[1] - 1],\n",
" [0, 0],\n",
" [output_size[0] - 1, 0],\n",
" [output_size[0] - 1, output_size[1] - 1]],\n",
" dtype=\"float32\")\n",
" rotation_matrix = cv.getPerspectiveTransform(vertices, target_vertices)\n",
" cropped_roi = cv.warpPerspective(image, rotation_matrix, output_size)\n",
" \n",
" result = text_recognizer.recognize(cropped_roi)\n",
" print(result)"
]
},
{
"cell_type": "markdown",
"id": "e0b4b3c0",
"metadata": {
"id": "e0b4b3c0"
},
"source": [
"# Super rozdzielczość\n",
"\n",
"Podczas zwiększania rozdzielczości brakujące piksele muszą być w jakiś sposób interpolowane. Przy niewielkich powiększeniach zwykle wystarczą nam tradycyjne metody, jednak jeśli pracujemy z obrazem w niskiej rozdzielczości i chcemy go znacząco powiększyć, to chcielibyśmy również uzyskać wysoką jakość np. poprzez uwzględnienie informacji z otoczenia pikseli. Problematyka ta dotyczy zagadnienia super rozdzielczości (ang. *super-resolution*).\n",
"\n",
"W [artykule](https://arxiv.org/pdf/1902.06068.pdf) z 2020 r. możemy znaleźć porównanie dostępnych w tamtym czasie modeli (zob. wykres na str. 15); np. możemy zobaczyć, że model [EDSR](https://github.com/Saafke/EDSR_Tensorflow) radzi sobie całkiem nieźle, aczkolwiek kosztem sporego narzutu obliczeniowego (por. również benchmarki [OpenCV](https://github.com/opencv/opencv_contrib/blob/master/modules/dnn_superres/README.md)). Przetestujemy EDSR na powiększeniu 4-krotnym:"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "6b9f6be9",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6b9f6be9",
"outputId": "50afd240-7700-49aa-c5ad-ad29e31abc54"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dnn/EDSR_x4.pb 100%[===================>] 36.79M 182MB/s in 0.2s \n"
]
}
],
"source": [
"!wget -q --show-progress -O dnn/EDSR_x4.pb https://raw.githubusercontent.com/Saafke/EDSR_Tensorflow/master/models/EDSR_x4.pb"
]
},
{
"cell_type": "markdown",
"id": "92f09e43",
"metadata": {
"id": "92f09e43"
},
"source": [
"Przy pomocy [`cv.dnn_superres.DnnSuperResImpl_create()`](https://docs.opencv.org/4.5.3/d8/d11/classcv_1_1dnn__superres_1_1DnnSuperResImpl.html) przygotowujemy model:"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "368ca179",
"metadata": {
"id": "368ca179"
},
"outputs": [],
"source": [
"sr = cv.dnn_superres.DnnSuperResImpl_create()\n",
"sr.readModel('dnn/EDSR_x4.pb')\n",
"sr.setModel('edsr', 4)"
]
},
{
"cell_type": "markdown",
"id": "9e0169f3",
"metadata": {
"id": "9e0169f3"
},
"source": [
"Następnie zwiększy rozdzielczość zadanego obrazu (operacja może zająć trochę czasu):"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "45c89529",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "45c89529",
"outputId": "f4b99d64-f525-433f-9a24-7c91e3a8fee9"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1800x1800 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image = cv.imread('img/parrot.jpg')\n",
"\n",
"image_EDSR = sr.upsample(image)\n",
"\n",
"plt.figure(figsize=(25,25))\n",
"plt.subplot(211)\n",
"plt.imshow(image[:,:,::-1])\n",
"plt.subplot(212)\n",
"plt.imshow(image_EDSR[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "3c157587",
"metadata": {
"id": "3c157587"
},
"source": [
"# Zadanie 1\n",
"\n",
"Przy pomocy biblioteki [MediaPipe](https://google.github.io/mediapipe/solutions/selfie_segmentation.html) dokonaj podmień tło w selfie `img/selfie-man.jpg` na `img/selfie-background.jpg` (możesz również odbić obraz w poziomie)."
]
},
{
"cell_type": "markdown",
"id": "d6116f61",
"metadata": {
"id": "d6116f61"
},
"source": [
"![Wynik działania programu](img/selfie-out.png)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "HOfeBql1xwLx",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "HOfeBql1xwLx",
"outputId": "63cb837e-a42e-4ac6-a1d1-013abd74df46"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
"Collecting mediapipe\n",
" Downloading mediapipe-0.9.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (33.0 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m33.0/33.0 MB\u001b[0m \u001b[31m20.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.8/dist-packages (from mediapipe) (1.21.6)\n",
"Requirement already satisfied: opencv-contrib-python in /usr/local/lib/python3.8/dist-packages (from mediapipe) (4.6.0.66)\n",
"Requirement already satisfied: absl-py in /usr/local/lib/python3.8/dist-packages (from mediapipe) (1.3.0)\n",
"Collecting flatbuffers>=2.0\n",
" Downloading flatbuffers-23.1.4-py2.py3-none-any.whl (26 kB)\n",
"Requirement already satisfied: protobuf<4,>=3.11 in /usr/local/lib/python3.8/dist-packages (from mediapipe) (3.19.6)\n",
"Requirement already satisfied: attrs>=19.1.0 in /usr/local/lib/python3.8/dist-packages (from mediapipe) (22.2.0)\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.8/dist-packages (from mediapipe) (3.2.2)\n",
"Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->mediapipe) (2.8.2)\n",
"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->mediapipe) (3.0.9)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.8/dist-packages (from matplotlib->mediapipe) (0.11.0)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->mediapipe) (1.4.4)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.8/dist-packages (from python-dateutil>=2.1->matplotlib->mediapipe) (1.15.0)\n",
"Installing collected packages: flatbuffers, mediapipe\n",
" Attempting uninstall: flatbuffers\n",
" Found existing installation: flatbuffers 1.12\n",
" Uninstalling flatbuffers-1.12:\n",
" Successfully uninstalled flatbuffers-1.12\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",
"tensorflow 2.9.2 requires flatbuffers<2,>=1.12, but you have flatbuffers 23.1.4 which is incompatible.\u001b[0m\u001b[31m\n",
"\u001b[0mSuccessfully installed flatbuffers-23.1.4 mediapipe-0.9.0.1\n"
]
}
],
"source": [
"!pip3 install mediapipe"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "jguEGbukxzH5",
"metadata": {
"id": "jguEGbukxzH5"
},
"outputs": [],
"source": [
"import cv2\n",
"import numpy as np\n",
"import mediapipe as mp\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "WdQbZcfyx0oB",
"metadata": {
"id": "WdQbZcfyx0oB"
},
"outputs": [],
"source": [
"tmp = mp.solutions.selfie_segmentation\n",
"\n",
"tmp1 = tmp.SelfieSegmentation()"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "nstJpwD5x2G5",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 419
},
"id": "nstJpwD5x2G5",
"outputId": "474c9ec6-587d-42e2-e6e8-be247d0c7222"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"man = cv2.imread('img/selfie-man.jpg')\n",
"\n",
"plt.figure(figsize=[10, 10])\n",
"\n",
"plt.title(\"Man's selfie before\")\n",
"plt.axis('off')\n",
"plt.imshow(man[:,:,::-1])\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "w6WJV2nXx2v9",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 238
},
"id": "w6WJV2nXx2v9",
"outputId": "e65923df-a38f-47e4-f453-e979681b40d7"
},
"outputs": [
{
"data": {
"text/plain": [
"(-0.5, 749.5, 499.5, -0.5)"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1584x1584 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"man_in_rgb = cv2.cvtColor(man, cv2.COLOR_BGR2RGB)\n",
"\n",
"prob = tmp1.process(man_in_rgb)\n",
"\n",
"plt.figure(figsize=[22,22])\n",
"\n",
"plt.subplot(121);plt.imshow(man[:,:,::-1])\n",
"plt.title(\"Original Image\")\n",
"plt.axis('off')\n",
"plt.subplot(122)\n",
"plt.imshow(prob.segmentation_mask, cmap='gray')\n",
"plt.title(\"Probability Map\")\n",
"plt.axis('off')"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "kNTBzXv4x5Ds",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 238
},
"id": "kNTBzXv4x5Ds",
"outputId": "604f6ced-bab9-4a69-c7c1-81a44f9f1b09"
},
"outputs": [
{
"data": {
"text/plain": [
"(-0.5, 749.5, 499.5, -0.5)"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1584x1584 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"binary_mask = prob.segmentation_mask > 0.9\n",
"\n",
"plt.figure(figsize=[22,22])\n",
"plt.subplot(121)\n",
"plt.imshow(man[:,:,::-1])\n",
"plt.title(\"Man's selfie before\")\n",
"plt.axis('off')\n",
"plt.subplot(122);plt.imshow(binary_mask, cmap='gray')\n",
"plt.title(\"Binary Mask\")\n",
"plt.axis('off')"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "3ObKOunIx-aG",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 238
},
"id": "3ObKOunIx-aG",
"outputId": "bb5e4872-c442-4612-9d22-229d1803f24e"
},
"outputs": [
{
"data": {
"text/plain": [
"(-0.5, 749.5, 499.5, -0.5)"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1584x1584 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"binary_mask_2 = np.dstack((binary_mask,binary_mask,binary_mask))\n",
"\n",
"without_bck = np.where(binary_mask_2, man, 255) \n",
"\n",
"plt.figure(figsize=[22,22])\n",
"plt.subplot(121)\n",
"plt.imshow(man[:,:,::-1])\n",
"plt.title(\"Man's selfie before\")\n",
"plt.axis('off')\n",
"plt.subplot(122)\n",
"plt.imshow(without_bck[:,:,::-1])\n",
"plt.title(\"Man without background\")\n",
"plt.axis('off')"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "8NjvRPqjyAI2",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 171
},
"id": "8NjvRPqjyAI2",
"outputId": "cd33968c-b874-4155-bccf-a4282db16d56"
},
"outputs": [
{
"data": {
"text/plain": [
"(-0.5, 749.5, 499.5, -0.5)"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1584x1584 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"new_background = cv2.imread('img/selfie-background.jpg')\n",
"\n",
"fin = np.where(binary_mask_2, man, new_background) \n",
"fin = cv2.flip(fin, 1)\n",
"\n",
"\n",
"plt.figure(figsize=[22,22])\n",
"plt.subplot(131);plt.imshow(man[:,:,::-1])\n",
"plt.title(\"Man's selfie before\")\n",
"plt.axis('off')\n",
"plt.subplot(132)\n",
"plt.imshow(binary_mask, cmap='gray')\n",
"plt.title(\"Binary Mask\")\n",
"plt.axis('off')\n",
"plt.subplot(133)\n",
"plt.imshow(fin[:,:,::-1])\n",
"plt.title(\"Man's selfie after\")\n",
"plt.axis('off')"
]
}
],
"metadata": {
"author": "Andrzej Wójtowicz",
"colab": {
"provenance": []
},
"email": "andre@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3",
"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.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]"
},
"subtitle": "10. Metody głębokiego uczenia w widzeniu komputerowym [laboratoria]",
"title": "Widzenie komputerowe",
"vscode": {
"interpreter": {
"hash": "369f2c481f4da34e4445cda3fffd2e751bd1c4d706f27375911949ba6bb62e1c"
}
},
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 5
2023-01-16 09:35:16 +01:00
}