\n","\n","![Logo 2](img/aitech-logotyp-2.jpg)"]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')\n","%cd /content/drive/My Drive/aitech-wko-pub"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"gnrjIhVmeHQQ","executionInfo":{"status":"ok","timestamp":1673872019054,"user_tz":-60,"elapsed":2133,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"36f987aa-4863-43c5-84e2-c90d990d7cf6"},"id":"gnrjIhVmeHQQ","execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n","/content/drive/My Drive/aitech-wko-pub\n"]}]},{"cell_type":"markdown","id":"07159136","metadata":{"id":"07159136"},"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":11,"id":"b2e906f0","metadata":{"id":"b2e906f0","executionInfo":{"status":"ok","timestamp":1673872022072,"user_tz":-60,"elapsed":300,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}}},"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":{"id":"f4348bc5"},"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":3,"id":"42b85f55","metadata":{"id":"42b85f55","executionInfo":{"status":"ok","timestamp":1673870782396,"user_tz":-60,"elapsed":390,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}}},"outputs":[],"source":["!mkdir -p dnn"]},{"cell_type":"markdown","id":"ac09b098","metadata":{"id":"ac09b098"},"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":4,"id":"85b1b68c","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"85b1b68c","executionInfo":{"status":"ok","timestamp":1673870782915,"user_tz":-60,"elapsed":523,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"834910f4-0f40-40dd-a763-c7ea03bcdb0b"},"outputs":[{"output_type":"stream","name":"stdout","text":["\r dnn/class 0%[ ] 0 --.-KB/s \rdnn/classification_ 100%[===================>] 21.17K --.-KB/s in 0.002s \n"]}],"source":["!wget -q --show-progress -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":{"id":"fd0c577b"},"source":["Spójrzmy na pierwsze pięć klas w pliku:"]},{"cell_type":"code","execution_count":5,"id":"fb0d0546","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"fb0d0546","executionInfo":{"status":"ok","timestamp":1673870783220,"user_tz":-60,"elapsed":309,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"e4d6d029-a709-4db9-ba61-074dda0f0167"},"outputs":[{"output_type":"stream","name":"stdout","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":{"id":"5b0ee6ff"},"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":6,"id":"fb2bf2a1","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"fb2bf2a1","executionInfo":{"status":"ok","timestamp":1673870791676,"user_tz":-60,"elapsed":8460,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"8adc83f6-7f46-4d92-b781-8bdee129f9ea"},"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: gdown in /usr/local/lib/python3.8/dist-packages (4.4.0)\n","Requirement already satisfied: requests[socks] in /usr/local/lib/python3.8/dist-packages (from gdown) (2.25.1)\n","Requirement already satisfied: six in /usr/local/lib/python3.8/dist-packages (from gdown) (1.15.0)\n","Requirement already satisfied: tqdm in /usr/local/lib/python3.8/dist-packages (from gdown) (4.64.1)\n","Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.8/dist-packages (from gdown) (4.6.3)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.8/dist-packages (from gdown) (3.9.0)\n","Requirement already satisfied: chardet<5,>=3.0.2 in /usr/local/lib/python3.8/dist-packages (from requests[socks]->gdown) (4.0.0)\n","Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.8/dist-packages (from requests[socks]->gdown) (2.10)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.8/dist-packages (from requests[socks]->gdown) (1.24.3)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/dist-packages (from requests[socks]->gdown) (2022.12.7)\n","Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.8/dist-packages (from requests[socks]->gdown) (1.7.1)\n"]}],"source":["!pip3 install --user --disable-pip-version-check gdown"]},{"cell_type":"code","execution_count":7,"id":"27996509","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"27996509","executionInfo":{"status":"ok","timestamp":1673870822419,"user_tz":-60,"elapsed":30749,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"af15b1c7-5256-4687-c326-d184f9225bf1"},"outputs":[{"output_type":"stream","name":"stdout","text":["Access denied with the following error:\n"]},{"output_type":"stream","name":"stderr","text":["\n"," \tCannot retrieve the public link of the file. You may need to change\n","\tthe permission to 'Anyone with the link', or have had many accesses. \n","\n","You may still be able to access the file from the browser:\n","\n","\t https://drive.google.com/uc?id=0B7ubpZO7HnlCcHlfNmJkU2VPelE \n","\n"]}],"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":8,"id":"648ec9c9","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"648ec9c9","executionInfo":{"status":"ok","timestamp":1673870822421,"user_tz":-60,"elapsed":30,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"033c3cb3-cf27-4ee4-cddc-1f0fb914823c"},"outputs":[{"output_type":"stream","name":"stdout","text":["\r dnn/Dense 0%[ ] 0 --.-KB/s \rdnn/DenseNet_121.pr 100%[===================>] 74.68K --.-KB/s in 0.01s \n"]}],"source":["!wget -q --show-progress -O dnn/DenseNet_121.prototxt https://raw.githubusercontent.com/shicai/DenseNet-Caffe/master/DenseNet_121.prototxt"]},{"cell_type":"markdown","id":"f7294c54","metadata":{"id":"f7294c54"},"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":13,"id":"6fd2d6b3","metadata":{"id":"6fd2d6b3","executionInfo":{"status":"ok","timestamp":1673872037688,"user_tz":-60,"elapsed":253,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}}},"outputs":[],"source":["model = cv.dnn.readNet(model='dnn/DenseNet_121.prototxt', config='dnn/DenseNet_121.caffemodel', framework='Caffe')"]},{"cell_type":"markdown","id":"fe22fd6f","metadata":{"id":"fe22fd6f"},"source":["Spróbujemy sklasyfikować poniższy obraz:"]},{"cell_type":"code","execution_count":14,"id":"6ace4606","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":324},"id":"6ace4606","executionInfo":{"status":"ok","timestamp":1673872039753,"user_tz":-60,"elapsed":1774,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"d40ea7ed-a573-45d3-d222-3de0bfca6664"},"outputs":[{"output_type":"display_data","data":{"text/plain":["