{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "gpuClass": "standard" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "source": [ "#Installing cv2" ], "metadata": { "id": "-_PD1JoY3dfz" } }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "VFoakAAaoznQ" }, "outputs": [], "source": [ "\n", "# These imports let you use opencv\n", "import cv2 #opencv itself\n", "#import common #some useful opencv functions\n", "import numpy as np # matrix manipulations\n", "\n", "#the following are to do with this interactive notebook code\n", "%matplotlib inline \n", "from matplotlib import pyplot as plt # this lets you draw inline pictures in the notebooks\n", "import pylab # this allows you to control figure size \n", "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # this controls figure size in the notebook\n", "\n" ] }, { "cell_type": "markdown", "source": [ "#Installing Darknet" ], "metadata": { "id": "vP4XKgL4ta7l" } }, { "cell_type": "code", "source": [ "!git clone https://github.com/pjreddie/darknet\n", "%cd darknet\n", "!make" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WxqaNezZrzFa", "outputId": "58354056-a6fc-41f7-a0d5-d3aae2682dad" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Cloning into 'darknet'...\n", "remote: Enumerating objects: 5955, done.\u001b[K\n", "remote: Total 5955 (delta 0), reused 0 (delta 0), pack-reused 5955\u001b[K\n", "Receiving objects: 100% (5955/5955), 6.37 MiB | 12.27 MiB/s, done.\n", "Resolving deltas: 100% (3931/3931), done.\n", "/content/darknet\n", "mkdir -p obj\n", "mkdir -p backup\n", "mkdir -p results\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/gemm.c -o obj/gemm.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/utils.c -o obj/utils.o\n", "In file included from \u001b[01m\u001b[K/usr/include/string.h:495\u001b[m\u001b[K,\n", " from \u001b[01m\u001b[K./src/utils.c:3\u001b[m\u001b[K:\n", "In function ‘\u001b[01m\u001b[Kstrncpy\u001b[m\u001b[K’,\n", " inlined from ‘\u001b[01m\u001b[Kcopy_string\u001b[m\u001b[K’ at \u001b[01m\u001b[K./src/utils.c:426:5\u001b[m\u001b[K:\n", "\u001b[01m\u001b[K/usr/include/x86_64-linux-gnu/bits/string_fortified.h:106:10:\u001b[m\u001b[K \u001b[01;35m\u001b[Kwarning: \u001b[m\u001b[K‘\u001b[01m\u001b[K__builtin_strncpy\u001b[m\u001b[K’ specified bound depends on the length of the source argument [\u001b[01;35m\u001b[K-Wstringop-overflow=\u001b[m\u001b[K]\n", " 106 | return \u001b[01;35m\u001b[K__builtin___strncpy_chk (__dest, __src, __len, __bos (__dest))\u001b[m\u001b[K;\n", " | \u001b[01;35m\u001b[K^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u001b[m\u001b[K\n", "\u001b[01m\u001b[K./src/utils.c:\u001b[m\u001b[K In function ‘\u001b[01m\u001b[Kcopy_string\u001b[m\u001b[K’:\n", "\u001b[01m\u001b[K./src/utils.c:426:22:\u001b[m\u001b[K \u001b[01;36m\u001b[Knote: \u001b[m\u001b[Klength computed here\n", " 426 | strncpy(copy, s, \u001b[01;36m\u001b[Kstrlen(s)\u001b[m\u001b[K+1);\n", " | \u001b[01;36m\u001b[K^~~~~~~~~\u001b[m\u001b[K\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/cuda.c -o obj/cuda.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/deconvolutional_layer.c -o obj/deconvolutional_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/convolutional_layer.c -o obj/convolutional_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/list.c -o obj/list.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/image.c -o obj/image.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/activations.c -o obj/activations.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/im2col.c -o obj/im2col.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/col2im.c -o obj/col2im.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/blas.c -o obj/blas.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/crop_layer.c -o obj/crop_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/dropout_layer.c -o obj/dropout_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/maxpool_layer.c -o obj/maxpool_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/softmax_layer.c -o obj/softmax_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/data.c -o obj/data.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/matrix.c -o obj/matrix.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/network.c -o obj/network.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/connected_layer.c -o obj/connected_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/cost_layer.c -o obj/cost_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/parser.c -o obj/parser.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/option_list.c -o obj/option_list.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/detection_layer.c -o obj/detection_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/route_layer.c -o obj/route_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/upsample_layer.c -o obj/upsample_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/box.c -o obj/box.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/normalization_layer.c -o obj/normalization_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/avgpool_layer.c -o obj/avgpool_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/layer.c -o obj/layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/local_layer.c -o obj/local_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/shortcut_layer.c -o obj/shortcut_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/logistic_layer.c -o obj/logistic_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/activation_layer.c -o obj/activation_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/rnn_layer.c -o obj/rnn_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/gru_layer.c -o obj/gru_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/crnn_layer.c -o obj/crnn_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/demo.c -o obj/demo.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/batchnorm_layer.c -o obj/batchnorm_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/region_layer.c -o obj/region_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/reorg_layer.c -o obj/reorg_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/tree.c -o obj/tree.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/lstm_layer.c -o obj/lstm_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/l2norm_layer.c -o obj/l2norm_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/yolo_layer.c -o obj/yolo_layer.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/iseg_layer.c -o obj/iseg_layer.o\n", "g++ -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/image_opencv.cpp -o obj/image_opencv.o\n", "gcc -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -shared obj/gemm.o obj/utils.o obj/cuda.o obj/deconvolutional_layer.o obj/convolutional_layer.o obj/list.o obj/image.o obj/activations.o obj/im2col.o obj/col2im.o obj/blas.o obj/crop_layer.o obj/dropout_layer.o obj/maxpool_layer.o obj/softmax_layer.o obj/data.o obj/matrix.o obj/network.o obj/connected_layer.o obj/cost_layer.o obj/parser.o obj/option_list.o obj/detection_layer.o obj/route_layer.o obj/upsample_layer.o obj/box.o obj/normalization_layer.o obj/avgpool_layer.o obj/layer.o obj/local_layer.o obj/shortcut_layer.o obj/logistic_layer.o obj/activation_layer.o obj/rnn_layer.o obj/gru_layer.o obj/crnn_layer.o obj/demo.o obj/batchnorm_layer.o obj/region_layer.o obj/reorg_layer.o obj/tree.o obj/lstm_layer.o obj/l2norm_layer.o obj/yolo_layer.o obj/iseg_layer.o obj/image_opencv.o -o libdarknet.so -lm -pthread \n", "ar rcs libdarknet.a obj/gemm.o obj/utils.o obj/cuda.o obj/deconvolutional_layer.o obj/convolutional_layer.o obj/list.o obj/image.o obj/activations.o obj/im2col.o obj/col2im.o obj/blas.o obj/crop_layer.o obj/dropout_layer.o obj/maxpool_layer.o obj/softmax_layer.o obj/data.o obj/matrix.o obj/network.o obj/connected_layer.o obj/cost_layer.o obj/parser.o obj/option_list.o obj/detection_layer.o obj/route_layer.o obj/upsample_layer.o obj/box.o obj/normalization_layer.o obj/avgpool_layer.o obj/layer.o obj/local_layer.o obj/shortcut_layer.o obj/logistic_layer.o obj/activation_layer.o obj/rnn_layer.o obj/gru_layer.o obj/crnn_layer.o obj/demo.o obj/batchnorm_layer.o obj/region_layer.o obj/reorg_layer.o obj/tree.o obj/lstm_layer.o obj/l2norm_layer.o obj/yolo_layer.o obj/iseg_layer.o obj/image_opencv.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/captcha.c -o obj/captcha.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/lsd.c -o obj/lsd.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/super.c -o obj/super.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/art.c -o obj/art.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/tag.c -o obj/tag.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/cifar.c -o obj/cifar.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/go.c -o obj/go.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/rnn.c -o obj/rnn.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/segmenter.c -o obj/segmenter.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/regressor.c -o obj/regressor.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/classifier.c -o obj/classifier.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/coco.c -o obj/coco.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/yolo.c -o obj/yolo.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/detector.c -o obj/detector.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/nightmare.c -o obj/nightmare.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/instance-segmenter.c -o obj/instance-segmenter.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/darknet.c -o obj/darknet.o\n", "gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast obj/captcha.o obj/lsd.o obj/super.o obj/art.o obj/tag.o obj/cifar.o obj/go.o obj/rnn.o obj/segmenter.o obj/regressor.o obj/classifier.o obj/coco.o obj/yolo.o obj/detector.o obj/nightmare.o obj/instance-segmenter.o obj/darknet.o libdarknet.a -o darknet -lm -pthread libdarknet.a\n" ] } ] }, { "cell_type": "code", "source": [ "!./darknet" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0QLUSw2YryTW", "outputId": "1b182aab-93fc-459b-8cb6-8eab4001b36c" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "usage: ./darknet \n" ] } ] }, { "cell_type": "code", "source": [ "!wget https://pjreddie.com/media/files/yolov3.weights" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gRutoyD8umbl", "outputId": "fe1a02cd-01a7-4d42-e809-0d8f4527b3e0" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "--2023-02-22 21:12:28-- https://pjreddie.com/media/files/yolov3.weights\n", "Resolving pjreddie.com (pjreddie.com)... 128.208.4.108\n", "Connecting to pjreddie.com (pjreddie.com)|128.208.4.108|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 248007048 (237M) [application/octet-stream]\n", "Saving to: ‘yolov3.weights’\n", "\n", "yolov3.weights 100%[===================>] 236.52M 104MB/s in 2.3s \n", "\n", "2023-02-22 21:12:30 (104 MB/s) - ‘yolov3.weights’ saved [248007048/248007048]\n", "\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "TlV9ipnvdiyb" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "#Multiple Images\n", "Instead of supplying an image on the command line, you can leave it blank to try multiple images in a row. Instead you will see a prompt when the config and weights are done loading:" ], "metadata": { "id": "bquwg6EOxDtK" } }, { "cell_type": "code", "source": [ "!./darknet detect cfg/yolov3.cfg yolov3.weights" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "orr3kxupxDSC", "outputId": "388d53c8-5ec1-4cb2-876a-03eb31fd4ea6" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "layer filters size input output\n", " 0 conv 32 3 x 3 / 1 608 x 608 x 3 -> 608 x 608 x 32 0.639 BFLOPs\n", " 1 conv 64 3 x 3 / 2 608 x 608 x 32 -> 304 x 304 x 64 3.407 BFLOPs\n", " 2 conv 32 1 x 1 / 1 304 x 304 x 64 -> 304 x 304 x 32 0.379 BFLOPs\n", " 3 conv 64 3 x 3 / 1 304 x 304 x 32 -> 304 x 304 x 64 3.407 BFLOPs\n", " 4 res 1 304 x 304 x 64 -> 304 x 304 x 64\n", " 5 conv 128 3 x 3 / 2 304 x 304 x 64 -> 152 x 152 x 128 3.407 BFLOPs\n", " 6 conv 64 1 x 1 / 1 152 x 152 x 128 -> 152 x 152 x 64 0.379 BFLOPs\n", " 7 conv 128 3 x 3 / 1 152 x 152 x 64 -> 152 x 152 x 128 3.407 BFLOPs\n", " 8 res 5 152 x 152 x 128 -> 152 x 152 x 128\n", " 9 conv 64 1 x 1 / 1 152 x 152 x 128 -> 152 x 152 x 64 0.379 BFLOPs\n", " 10 conv 128 3 x 3 / 1 152 x 152 x 64 -> 152 x 152 x 128 3.407 BFLOPs\n", " 11 res 8 152 x 152 x 128 -> 152 x 152 x 128\n", " 12 conv 256 3 x 3 / 2 152 x 152 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 13 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 14 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 15 res 12 76 x 76 x 256 -> 76 x 76 x 256\n", " 16 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 17 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 18 res 15 76 x 76 x 256 -> 76 x 76 x 256\n", " 19 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 20 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 21 res 18 76 x 76 x 256 -> 76 x 76 x 256\n", " 22 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 23 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 24 res 21 76 x 76 x 256 -> 76 x 76 x 256\n", " 25 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 26 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 27 res 24 76 x 76 x 256 -> 76 x 76 x 256\n", " 28 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 29 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 30 res 27 76 x 76 x 256 -> 76 x 76 x 256\n", " 31 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 32 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 33 res 30 76 x 76 x 256 -> 76 x 76 x 256\n", " 34 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 35 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 36 res 33 76 x 76 x 256 -> 76 x 76 x 256\n", " 37 conv 512 3 x 3 / 2 76 x 76 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 38 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 39 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 40 res 37 38 x 38 x 512 -> 38 x 38 x 512\n", " 41 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 42 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 43 res 40 38 x 38 x 512 -> 38 x 38 x 512\n", " 44 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 45 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 46 res 43 38 x 38 x 512 -> 38 x 38 x 512\n", " 47 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 48 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 49 res 46 38 x 38 x 512 -> 38 x 38 x 512\n", " 50 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 51 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 52 res 49 38 x 38 x 512 -> 38 x 38 x 512\n", " 53 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 54 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 55 res 52 38 x 38 x 512 -> 38 x 38 x 512\n", " 56 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 57 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 58 res 55 38 x 38 x 512 -> 38 x 38 x 512\n", " 59 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 60 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 61 res 58 38 x 38 x 512 -> 38 x 38 x 512\n", " 62 conv 1024 3 x 3 / 2 38 x 38 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 63 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 64 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 65 res 62 19 x 19 x1024 -> 19 x 19 x1024\n", " 66 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 67 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 68 res 65 19 x 19 x1024 -> 19 x 19 x1024\n", " 69 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 70 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 71 res 68 19 x 19 x1024 -> 19 x 19 x1024\n", " 72 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 73 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 74 res 71 19 x 19 x1024 -> 19 x 19 x1024\n", " 75 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 76 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 77 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 78 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 79 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 80 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 81 conv 255 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 255 0.189 BFLOPs\n", " 82 yolo\n", " 83 route 79\n", " 84 conv 256 1 x 1 / 1 19 x 19 x 512 -> 19 x 19 x 256 0.095 BFLOPs\n", " 85 upsample 2x 19 x 19 x 256 -> 38 x 38 x 256\n", " 86 route 85 61\n", " 87 conv 256 1 x 1 / 1 38 x 38 x 768 -> 38 x 38 x 256 0.568 BFLOPs\n", " 88 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 89 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 90 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 91 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 92 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 93 conv 255 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 255 0.377 BFLOPs\n", " 94 yolo\n", " 95 route 91\n", " 96 conv 128 1 x 1 / 1 38 x 38 x 256 -> 38 x 38 x 128 0.095 BFLOPs\n", " 97 upsample 2x 38 x 38 x 128 -> 76 x 76 x 128\n", " 98 route 97 36\n", " 99 conv 128 1 x 1 / 1 76 x 76 x 384 -> 76 x 76 x 128 0.568 BFLOPs\n", " 100 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 101 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 102 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 103 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 104 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 105 conv 255 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 255 0.754 BFLOPs\n", " 106 yolo\n", "Loading weights from yolov3.weights...Couldn't open file: yolov3.weights\n" ] } ] }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "import scipy.misc\n", "from zipfile import ZipFile\n", "from io import BytesIO\n", "\n", "# Image manipulation.\n", "import PIL.Image\n", "from IPython.display import display" ], "metadata": { "id": "MeoXCrdst5rr" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "def load_image_blackandwhite(DroneImage):\n", " #image = PIL.Image.open(filename)\n", "\n", " image = PIL.Image.open(DroneImage) # open colour image\n", " image = np.array(image)\n", " \n", " return np.float32(image)" ], "metadata": { "id": "l7TJRuYZt7tV" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "def plot_image(image):\n", " \n", " # Convert the pixel-values to the range between 0.0 and 1.0\n", " image = np.clip(image/255.0, 0.0, 1.0)\n", " \n", " # Plot using matplotlib.\n", " plt.imshow(image)\n", " plt.show()" ], "metadata": { "id": "SEWyHb2_uMNt" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "dronefiles = ZipFile(\"/content/DroneImages.zip\", 'r')\n", "dronefiles.namelist()[:]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "n_YxUOmTu0gj", "outputId": "afeb7000-6a36-4078-e221-bb002325a2b1" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['DroneImages/{0151DDD8-194C-46F0-9E2F-66BAFC8CCD1C}.png',\n", " 'DroneImages/{0E853267-90D6-448D-8253-24BA8BF04D69}.png',\n", " 'DroneImages/{29502739-BE5C-4563-8D46-68DCEDCDDEC7}.png',\n", " 'DroneImages/{304DEB55-B4EC-40D1-92B6-F6D21616831D}.png',\n", " 'DroneImages/{4230A839-C0C2-4A5C-A524-D4277D71449D}.png',\n", " 'DroneImages/{475E793A-77D6-4EC5-AC3D-6BFD9A3D5865}.png',\n", " 'DroneImages/{48F20CC7-DDB2-4B99-87FB-AC9B431701EF}.png',\n", " 'DroneImages/{60CCBFBC-83A7-4F0C-B6F6-DCCC2C788600}.png',\n", " 'DroneImages/{65F60F76-4688-4CCB-9044-DB73F8A3ECE0}.png',\n", " 'DroneImages/{708CE5CA-3190-43E4-8A91-45101D8685C4}.png',\n", " 'DroneImages/{722FB9BE-A980-4A9F-8505-DE9AE5324824}.png',\n", " 'DroneImages/{8E4DEB40-2EFE-4550-96BD-54E5CDEE120B}.png',\n", " 'DroneImages/{993B858F-10BB-40C9-BFC5-C3B225D946C1}.png',\n", " 'DroneImages/{AC7AE467-84D6-4565-9C65-4B50D4A2CB4D}.png',\n", " 'DroneImages/{BEAA746C-85D7-4F06-9DCC-35FDD8326E85}.png',\n", " 'DroneImages/{CC4C2956-D887-4426-94D7-58A74804AC8B}.png',\n", " 'DroneImages/{CE6382F5-6277-4B89-8573-F87A359381ED}.png',\n", " 'DroneImages/{D84D9370-A9C7-4F8B-85B2-47D5D1357548}.png',\n", " 'DroneImages/{E7181A71-808C-43DF-A09D-B447A373B900}.png']" ] }, "metadata": {}, "execution_count": 20 } ] }, { "cell_type": "code", "source": [ "!./darknet detect cfg/yolov3.cfg yolov3.weights /content/{29502739-BE5C-4563-8D46-68DCEDCDDEC7}.png" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-Qb0biBG1ZTm", "outputId": "9a853f3f-9200-483f-fb3e-0a241653f076" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "layer filters size input output\n", " 0 conv 32 3 x 3 / 1 608 x 608 x 3 -> 608 x 608 x 32 0.639 BFLOPs\n", " 1 conv 64 3 x 3 / 2 608 x 608 x 32 -> 304 x 304 x 64 3.407 BFLOPs\n", " 2 conv 32 1 x 1 / 1 304 x 304 x 64 -> 304 x 304 x 32 0.379 BFLOPs\n", " 3 conv 64 3 x 3 / 1 304 x 304 x 32 -> 304 x 304 x 64 3.407 BFLOPs\n", " 4 res 1 304 x 304 x 64 -> 304 x 304 x 64\n", " 5 conv 128 3 x 3 / 2 304 x 304 x 64 -> 152 x 152 x 128 3.407 BFLOPs\n", " 6 conv 64 1 x 1 / 1 152 x 152 x 128 -> 152 x 152 x 64 0.379 BFLOPs\n", " 7 conv 128 3 x 3 / 1 152 x 152 x 64 -> 152 x 152 x 128 3.407 BFLOPs\n", " 8 res 5 152 x 152 x 128 -> 152 x 152 x 128\n", " 9 conv 64 1 x 1 / 1 152 x 152 x 128 -> 152 x 152 x 64 0.379 BFLOPs\n", " 10 conv 128 3 x 3 / 1 152 x 152 x 64 -> 152 x 152 x 128 3.407 BFLOPs\n", " 11 res 8 152 x 152 x 128 -> 152 x 152 x 128\n", " 12 conv 256 3 x 3 / 2 152 x 152 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 13 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 14 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 15 res 12 76 x 76 x 256 -> 76 x 76 x 256\n", " 16 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 17 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 18 res 15 76 x 76 x 256 -> 76 x 76 x 256\n", " 19 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 20 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 21 res 18 76 x 76 x 256 -> 76 x 76 x 256\n", " 22 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 23 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 24 res 21 76 x 76 x 256 -> 76 x 76 x 256\n", " 25 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 26 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 27 res 24 76 x 76 x 256 -> 76 x 76 x 256\n", " 28 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 29 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 30 res 27 76 x 76 x 256 -> 76 x 76 x 256\n", " 31 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 32 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 33 res 30 76 x 76 x 256 -> 76 x 76 x 256\n", " 34 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 35 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 36 res 33 76 x 76 x 256 -> 76 x 76 x 256\n", " 37 conv 512 3 x 3 / 2 76 x 76 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 38 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 39 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 40 res 37 38 x 38 x 512 -> 38 x 38 x 512\n", " 41 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 42 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 43 res 40 38 x 38 x 512 -> 38 x 38 x 512\n", " 44 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 45 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 46 res 43 38 x 38 x 512 -> 38 x 38 x 512\n", " 47 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 48 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 49 res 46 38 x 38 x 512 -> 38 x 38 x 512\n", " 50 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 51 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 52 res 49 38 x 38 x 512 -> 38 x 38 x 512\n", " 53 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 54 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 55 res 52 38 x 38 x 512 -> 38 x 38 x 512\n", " 56 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 57 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 58 res 55 38 x 38 x 512 -> 38 x 38 x 512\n", " 59 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 60 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 61 res 58 38 x 38 x 512 -> 38 x 38 x 512\n", " 62 conv 1024 3 x 3 / 2 38 x 38 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 63 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 64 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 65 res 62 19 x 19 x1024 -> 19 x 19 x1024\n", " 66 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 67 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 68 res 65 19 x 19 x1024 -> 19 x 19 x1024\n", " 69 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 70 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 71 res 68 19 x 19 x1024 -> 19 x 19 x1024\n", " 72 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 73 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 74 res 71 19 x 19 x1024 -> 19 x 19 x1024\n", " 75 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 76 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 77 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 78 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 79 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs\n", " 80 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs\n", " 81 conv 255 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 255 0.189 BFLOPs\n", " 82 yolo\n", " 83 route 79\n", " 84 conv 256 1 x 1 / 1 19 x 19 x 512 -> 19 x 19 x 256 0.095 BFLOPs\n", " 85 upsample 2x 19 x 19 x 256 -> 38 x 38 x 256\n", " 86 route 85 61\n", " 87 conv 256 1 x 1 / 1 38 x 38 x 768 -> 38 x 38 x 256 0.568 BFLOPs\n", " 88 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 89 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 90 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 91 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs\n", " 92 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs\n", " 93 conv 255 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 255 0.377 BFLOPs\n", " 94 yolo\n", " 95 route 91\n", " 96 conv 128 1 x 1 / 1 38 x 38 x 256 -> 38 x 38 x 128 0.095 BFLOPs\n", " 97 upsample 2x 38 x 38 x 128 -> 76 x 76 x 128\n", " 98 route 97 36\n", " 99 conv 128 1 x 1 / 1 76 x 76 x 384 -> 76 x 76 x 128 0.568 BFLOPs\n", " 100 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 101 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 102 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 103 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs\n", " 104 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs\n", " 105 conv 255 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 255 0.754 BFLOPs\n", " 106 yolo\n", "Loading weights from yolov3.weights...Done!\n", "/content/{29502739-BE5C-4563-8D46-68DCEDCDDEC7}.png: Predicted in 26.692882 seconds.\n", "bird: 53%\n", "car: 71%\n", "person: 54%\n" ] } ] }, { "cell_type": "markdown", "source": [ "#Testing the webcam script" ], "metadata": { "id": "H-wpQQNbpqTN" } }, { "cell_type": "code", "source": [ "from IPython.display import display, Javascript\n", "from google.colab.output import eval_js\n", "from base64 import b64decode\n", "\n", "def take_photo(filename='photo.jpg', quality=0.8):\n", " js = Javascript('''\n", " async function takePhoto(quality) {\n", " const div = document.createElement('div');\n", " const capture = document.createElement('button');\n", " capture.textContent = 'Capture';\n", " div.appendChild(capture);\n", "\n", " const video = document.createElement('video');\n", " video.style.display = 'block';\n", " const stream = await navigator.mediaDevices.getUserMedia({video: true});\n", "\n", " document.body.appendChild(div);\n", " div.appendChild(video);\n", " video.srcObject = stream;\n", " await video.play();\n", "\n", " // Resize the output to fit the video element.\n", " google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true);\n", "\n", " // Wait for Capture to be clicked.\n", " await new Promise((resolve) => capture.onclick = resolve);\n", "\n", " const canvas = document.createElement('canvas');\n", " canvas.width = video.videoWidth;\n", " canvas.height = video.videoHeight;\n", " canvas.getContext('2d').drawImage(video, 0, 0);\n", " stream.getVideoTracks()[0].stop();\n", " div.remove();\n", " return canvas.toDataURL('image/jpeg', quality);\n", " }\n", " ''')\n", " display(js)\n", " data = eval_js('takePhoto({})'.format(quality))\n", " binary = b64decode(data.split(',')[1])\n", " with open(filename, 'wb') as f:\n", " f.write(binary)\n", " return filename" ], "metadata": { "id": "r_wRJ2gbp0IH" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "from IPython.display import Image\n", "try:\n", " filename = take_photo()\n", " print('Saved to {}'.format(filename))\n", " \n", " # Show the image which was just taken.\n", " display(Image(filename))\n", "except Exception as err:\n", " # Errors will be thrown if the user does not have a webcam or if they do not\n", " # grant the page permission to access it.\n", " print(str(err))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 515 }, "id": "ijLmw9ljp0II", "outputId": "8405141b-4bf6-406b-ed89-dbbf8757a188" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "application/javascript": [ "\n", " async function takePhoto(quality) {\n", " const div = document.createElement('div');\n", " const capture = document.createElement('button');\n", " capture.textContent = 'Capture';\n", " div.appendChild(capture);\n", "\n", " const video = document.createElement('video');\n", " video.style.display = 'block';\n", " const stream = await navigator.mediaDevices.getUserMedia({video: true});\n", "\n", " document.body.appendChild(div);\n", " div.appendChild(video);\n", " video.srcObject = stream;\n", " await video.play();\n", "\n", " // Resize the output to fit the video element.\n", " google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true);\n", "\n", " // Wait for Capture to be clicked.\n", " await new Promise((resolve) => capture.onclick = resolve);\n", "\n", " const canvas = document.createElement('canvas');\n", " canvas.width = video.videoWidth;\n", " canvas.height = video.videoHeight;\n", " canvas.getContext('2d').drawImage(video, 0, 0);\n", " stream.getVideoTracks()[0].stop();\n", " div.remove();\n", " return canvas.toDataURL('image/jpeg', quality);\n", " }\n", " " ] }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Saved to photo.jpg\n" ] }, { "output_type": "display_data", "data": { "image/jpeg": "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\n", "text/plain": [ "" ] }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "#Checking CUDA on colab\n", "First) Go to Menu > Runtime > Change runtime\n" ], "metadata": { "id": "n4wHQ9J_34Bi" } }, { "cell_type": "code", "source": [ "!nvidia-smi" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "guAU8GZT4Gpo", "outputId": "2a43efc4-4aa3-4262-bc38-4ada1c726da1" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Thu Feb 16 01:50:08 2023 \n", "+-----------------------------------------------------------------------------+\n", "| NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 |\n", "|-------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|===============================+======================+======================|\n", "| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n", "| N/A 76C P0 34W / 70W | 792MiB / 15360MiB | 0% Default |\n", "| | | N/A |\n", "+-------------------------------+----------------------+----------------------+\n", " \n", "+-----------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=============================================================================|\n", "| 0 N/A N/A 1920 C 789MiB |\n", "+-----------------------------------------------------------------------------+\n" ] } ] }, { "cell_type": "code", "source": [ "#Check if torch can use the GP\n", "import torch\n", "torch.cuda.is_available()\n", "#output - True" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Vq6Ru9y94V6h", "outputId": "e1683f31-5b47-49a2-d126-976e70e6adf7" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 14 } ] }, { "cell_type": "code", "source": [ "#Check if tensor can use gpu\n", "import tensorflow as tf\n", "tf.test.gpu_device_name()\n", "#output - /device:GPU:0" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 36 }, "id": "UTnNu2fW4bjS", "outputId": "7d147007-21a2-4f83-aaa0-c8c5af0542b8" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'/device:GPU:0'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 15 } ] }, { "cell_type": "code", "source": [ "!./darknet imtest data/eagle.jpg" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "daW2WTf_4-if", "outputId": "5ab814d3-142f-4580-d589-69bb35a397c5" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "L2 Norm: 371.979095\n", "Not compiled with OpenCV, saving to Original.png instead\n", "Not compiled with OpenCV, saving to Gray.png instead\n", "Not compiled with OpenCV, saving to C1.png instead\n", "Not compiled with OpenCV, saving to C2.png instead\n", "Not compiled with OpenCV, saving to C3.png instead\n", "Not compiled with OpenCV, saving to C4.png instead\n" ] } ] } ] }