{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "toCy3v03Dwx7" }, "source": [ "##### Copyright 2021 The TensorFlow Hub Authors.\n", "\n", "Licensed under the Apache License, Version 2.0 (the \"License\");" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:54:37.294201Z", "iopub.status.busy": "2022-12-14T21:54:37.293750Z", "iopub.status.idle": "2022-12-14T21:54:37.298133Z", "shell.execute_reply": "2022-12-14T21:54:37.297520Z" }, "id": "QKe-ubNcDvgv" }, "outputs": [], "source": [ "# Copyright 2021 The TensorFlow Hub Authors. All Rights Reserved.\n", "#\n", "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# http://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License.\n", "# ==============================================================================" ] }, { "cell_type": "markdown", "metadata": { "id": "qFdPvlXBOdUN" }, "source": [ "# 스트리밍 동작 인식을 위한 MoViNet" ] }, { "cell_type": "markdown", "metadata": { "id": "MfBg1C5NB3X0" }, "source": [ "\n", " \n", " \n", " \n", " \n", " \n", "
TensorFlow.org에서 보기Google Colab에서 실행GitHub에서보기노트북 다운로드TF Hub 모델 보기
" ] }, { "cell_type": "markdown", "metadata": { "id": "-vxk2Kbc_KSP" }, "source": [ "이 튜토리얼은 사전 훈련된 비디오 분류 모델을 실행하여 주어진 비디오에서 활동(댄스, 수영, 자전거 타기 등)을 분류합니다.\n", "\n", "이 튜토리얼에서 사용된 모델 아키텍처는 [MoViNet](https://arxiv.org/pdf/2103.11511.pdf)(Mobile Video Networks)이라고 합니다. MoVieNets는 거대한 데이터세트([Kinetics 600](https://deepmind.com/research/open-source/kinetics))에서 훈련된 효율적인 비디오 분류 모델 집합입니다.\n", "\n", "TF Hub에서 사용 가능한 [i3d 모델](https://tfhub.dev/s?q=i3d-kinetics)과 달리 MoViNet은 스트리밍 비디오에서 프레임별 추론도 지원합니다.\n", "\n", "사전 훈련된 모델은 [TF Hub](https://tfhub.dev/google/collections/movinet/1)에서 사용할 수 있습니다. TF Hub 컬렉션에는 [TFLite](https://tensorflow.org/lite)에 최적화된 양자화된 모델도 포함되어 있습니다.\n", "\n", "이러한 모델의 소스는 [TensorFlow Model Garden](https://github.com/tensorflow/models/tree/master/official/projects/movinet)에서 얻을 수 있습니다. 여기에는 MoViNet 모델의 구축 및 미세 조정도 포함하는 [이 튜토리얼의 상세 버전](https://colab.sandbox.google.com/github/tensorflow/models/blob/master/official/projects/movinet/movinet_tutorial.ipynb)이 포함됩니다.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "3E96e1UKQ8uR" }, "source": [ "![jumping jacks plot](https://storage.googleapis.com/tf_model_garden/vision/movinet/artifacts/jumpingjacks_plot.gif)" ] }, { "cell_type": "markdown", "metadata": { "id": "8_oLnvJy7kz5" }, "source": [ "## 설정\n", "\n", "더 작은 모델(A0-A2)에 대한 추론의 경우, 이 Colab에 대한 CPU가 충분합니다." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:54:37.301953Z", "iopub.status.busy": "2022-12-14T21:54:37.301377Z", "iopub.status.idle": "2022-12-14T21:54:55.017797Z", "shell.execute_reply": "2022-12-14T21:54:55.016663Z" }, "id": "GUgUMGmY1yq-" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\r", "Reading package lists... 0%\r", "\r", "Reading package lists... 100%\r", "\r", "Reading package lists... Done\r", "\r\n", "\r", "Building dependency tree... 0%\r", "\r", "Building dependency tree... 0%\r" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", "Building dependency tree... 50%\r", "\r", "Building dependency tree... 50%\r" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", "Building dependency tree \r", "\r\n", "\r", "Reading state information... 0%\r", "\r", "Reading state information... 0%\r", "\r", "Reading state information... Done\r", "\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The following packages were automatically installed and are no longer required:\r\n", " libatasmart4 libblockdev-fs2 libblockdev-loop2 libblockdev-part-err2\r\n", " libblockdev-part2 libblockdev-swap2 libblockdev-utils2 libblockdev2\r\n", " libparted-fs-resize0\r\n", "Use 'sudo apt autoremove' to remove them.\r\n", "The following additional packages will be installed:\r\n", " i965-va-driver intel-media-va-driver libaacs0 libaom0 libass9 libavcodec58\r\n", " libavdevice58 libavfilter7 libavformat58 libavresample4 libavutil56\r\n", " libbdplus0 libbluray2 libbs2b0 libcdio-cdda2 libcdio-paranoia2 libcdio18\r\n", " libchromaprint1 libcodec2-0.9 libdc1394-22 libfftw3-double3 libflite1\r\n", " libgme0 libgsm1 libigdgmm11 liblilv-0-0 libmysofa1 libopenal-data libopenal1\r\n", " libopenmpt0 libpostproc55 librubberband2 libsdl2-2.0-0 libserd-0-0 libshine3\r\n", " libsnappy1v5 libsndio7.0 libsord-0-0 libsratom-0-0 libssh-gcrypt-4\r\n", " libswresample3 libswscale5 libva-drm2 libva-x11-2 libva2 libvidstab1.1\r\n", " libwebpmux3 libx264-155 libx265-179 libxvidcore4 libzvbi-common libzvbi0\r\n", " mesa-va-drivers ocl-icd-libopencl1 va-driver-all\r\n", "Suggested packages:\r\n", " ffmpeg-doc i965-va-driver-shaders libbluray-bdj libfftw3-bin libfftw3-dev\r\n", " libportaudio2 serdi sndiod sordi\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The following NEW packages will be installed:\r\n", " ffmpeg i965-va-driver intel-media-va-driver libaacs0 libaom0 libass9\r\n", " libavcodec58 libavdevice58 libavfilter7 libavformat58 libavresample4\r\n", " libavutil56 libbdplus0 libbluray2 libbs2b0 libcdio-cdda2 libcdio-paranoia2\r\n", " libcdio18 libchromaprint1 libcodec2-0.9 libdc1394-22 libfftw3-double3\r\n", " libflite1 libgme0 libgsm1 libigdgmm11 liblilv-0-0 libmysofa1 libopenal-data\r\n", " libopenal1 libopenmpt0 libpostproc55 librubberband2 libsdl2-2.0-0\r\n", " libserd-0-0 libshine3 libsnappy1v5 libsndio7.0 libsord-0-0 libsratom-0-0\r\n", " libssh-gcrypt-4 libswresample3 libswscale5 libva-drm2 libva-x11-2 libva2\r\n", " libvidstab1.1 libwebpmux3 libx264-155 libx265-179 libxvidcore4\r\n", " libzvbi-common libzvbi0 mesa-va-drivers ocl-icd-libopencl1 va-driver-all\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0 upgraded, 56 newly installed, 0 to remove and 169 not upgraded.\r\n", "Need to get 42.5 MB of archives.\r\n", "After this operation, 156 MB of additional disk space will be used.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m\r", "0% [Working]\u001b[0m\r", " \r", "Get:1 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libaom0 amd64 1.0.0.errata1-3build1 [1160 kB]\r\n", "\u001b[33m\r", "0% [1 libaom0 13.7 kB/1160 kB 1%]\u001b[0m\u001b[33m\r", " \r", "3% [Working]\u001b[0m\r", " \r", "Get:2 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libva2 amd64 2.7.0-2 [53.5 kB]\r\n", "\u001b[33m\r", "3% [2 libva2 13.7 kB/53.5 kB 26%]\u001b[0m\u001b[33m\r", " \r", "3% [Waiting for headers]\u001b[0m\r", " \r", "Get:3 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libva-drm2 amd64 2.7.0-2 [7044 B]\r\n", "\u001b[33m\r", "3% [3 libva-drm2 7044 B/7044 B 100%]\u001b[0m\u001b[33m\r", " \r", "3% [Waiting for headers]\u001b[0m\r", " \r", "Get:4 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libva-x11-2 amd64 2.7.0-2 [11.9 kB]\r\n", "\u001b[33m\r", "3% [4 libva-x11-2 11.9 kB/11.9 kB 100%]\u001b[0m\u001b[33m\r", " \r", "4% [Waiting for headers]\u001b[0m\r", " \r", "Get:5 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/main amd64 ocl-icd-libopencl1 amd64 2.2.11-1ubuntu1 [30.3 kB]\r\n", "\u001b[33m\r", "4% [5 ocl-icd-libopencl1 16.5 kB/30.3 kB 54%]\u001b[0m\u001b[33m\r", " \r", "4% [Waiting for headers]\u001b[0m\r", " \r", "Get:6 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libavutil56 amd64 7:4.2.7-0ubuntu0.1 [241 kB]\r\n", "\u001b[33m\r", "4% [6 libavutil56 13.7 kB/241 kB 6%]\u001b[0m\u001b[33m\r", " \r", "5% [Waiting for headers]\u001b[0m\r", " \r", "Get:7 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libcodec2-0.9 amd64 0.9.2-2 [7886 kB]\r\n", "\u001b[33m\r", "5% [7 libcodec2-0.9 6632 B/7886 kB 0%]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m\r", " \r", "20% [Waiting for headers]\u001b[0m\r", " \r", "Get:8 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libgsm1 amd64 1.0.18-2 [24.4 kB]\r\n", "\u001b[33m\r", "20% [8 libgsm1 24.4 kB/24.4 kB 100%]\u001b[0m\u001b[33m\r", " \r", "21% [Working]\u001b[0m\r", " \r", "Get:9 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libshine3 amd64 3.1.1-2 [23.2 kB]\r\n", "\u001b[33m\r", "21% [9 libshine3 18.7 kB/23.2 kB 81%]\u001b[0m\u001b[33m\r", " \r", "21% [Working]\u001b[0m\r", " \r", "Get:10 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/main amd64 libsnappy1v5 amd64 1.1.8-1build1 [16.7 kB]\r\n", "\u001b[33m\r", "21% [10 libsnappy1v5 8192 B/16.7 kB 49%]\u001b[0m\u001b[33m\r", " \r", "21% [Waiting for headers]\u001b[0m\r", " \r", "Get:11 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libswresample3 amd64 7:4.2.7-0ubuntu0.1 [57.1 kB]\r\n", "\u001b[33m\r", "21% [11 libswresample3 43.6 kB/57.1 kB 76%]\u001b[0m\u001b[33m\r", " \r", "22% [Working]\u001b[0m\r", " \r", "Get:12 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/main amd64 libwebpmux3 amd64 0.6.1-2ubuntu0.20.04.1 [19.5 kB]\r\n", "\u001b[33m\r", "22% [12 libwebpmux3 0 B/19.5 kB 0%]\u001b[0m\u001b[33m\r", " \r", "22% [Waiting for headers]\u001b[0m\r", " \r", "Get:13 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libx264-155 amd64 2:0.155.2917+git0a84d98-2 [521 kB]\r\n", "\u001b[33m\r", "22% [13 libx264-155 31.8 kB/521 kB 6%]\u001b[0m\u001b[33m\r", " \r", "24% [Waiting for headers]\u001b[0m\r", " \r", "Get:14 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libx265-179 amd64 3.2.1-1build1 [1060 kB]\r\n", "\u001b[33m\r", "24% [14 libx265-179 14.9 kB/1060 kB 1%]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m\r", " \r", "26% [Waiting for headers]\u001b[0m\r", " \r", "Get:15 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libxvidcore4 amd64 2:1.3.7-1 [201 kB]\r\n", "\u001b[33m\r", "26% [15 libxvidcore4 22.9 kB/201 kB 11%]\u001b[0m\u001b[33m\r", " \r", "27% [Waiting for headers]\u001b[0m\r", " \r", "Get:16 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libzvbi-common all 0.2.35-17 [32.5 kB]\r\n", "\u001b[33m\r", "27% [16 libzvbi-common 17.8 kB/32.5 kB 55%]\u001b[0m\u001b[33m\r", " \r", "27% [Waiting for headers]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " \r", "Get:17 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libzvbi0 amd64 0.2.35-17 [237 kB]\r\n", "\u001b[33m\r", "27% [17 libzvbi0 6634 B/237 kB 3%]\u001b[0m\u001b[33m\r", " \r", "28% [Waiting for headers]\u001b[0m\r", " \r", "Get:18 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libavcodec58 amd64 7:4.2.7-0ubuntu0.1 [4878 kB]\r\n", "\u001b[33m\r", "28% [18 libavcodec58 9367 B/4878 kB 0%]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m\r", " \r", "37% [Waiting for headers]\u001b[0m\r", " \r", "Get:19 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libass9 amd64 1:0.14.0-2 [88.0 kB]\r\n", "\u001b[33m\r", "37% [19 libass9 13.7 kB/88.0 kB 16%]\u001b[0m\u001b[33m\r", " \r", "38% [Waiting for headers]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " \r", "Get:20 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libbluray2 amd64 1:1.2.0-1 [138 kB]\r\n", "\u001b[33m\r", "38% [20 libbluray2 23.3 kB/138 kB 17%]\u001b[0m\u001b[33m\r", " \r", "39% [Waiting for headers]\u001b[0m\r", " \r", "Get:21 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libchromaprint1 amd64 1.4.3-3build1 [37.6 kB]\r\n", "\u001b[33m\r", "39% [21 libchromaprint1 10.9 kB/37.6 kB 29%]\u001b[0m\u001b[33m\r", " \r", "39% [Waiting for headers]\u001b[0m\r", " \r", "Get:22 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libgme0 amd64 0.6.2-1build1 [123 kB]\r\n", "\u001b[33m\r", "39% [22 libgme0 13.7 kB/123 kB 11%]\u001b[0m\u001b[33m\r", " \r", "40% [Waiting for headers]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " \r", "Get:23 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libopenmpt0 amd64 0.4.11-1build1 [599 kB]\r\n", "\u001b[33m\r", "40% [23 libopenmpt0 13.7 kB/599 kB 2%]\u001b[0m\u001b[33m\r", " \r", "41% [Waiting for headers]\u001b[0m\r", " \r", "Get:24 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/main amd64 libssh-gcrypt-4 amd64 0.9.3-2ubuntu2.2 [202 kB]\r\n", "\u001b[33m\r", "41% [24 libssh-gcrypt-4 41.9 kB/202 kB 21%]\u001b[0m\u001b[33m\r", " \r", "42% [Waiting for headers]\u001b[0m\r", " \r", "Get:25 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libavformat58 amd64 7:4.2.7-0ubuntu0.1 [985 kB]\r\n", "\u001b[33m\r", "42% [25 libavformat58 13.7 kB/985 kB 1%]\u001b[0m\u001b[33m\r", " \r", "44% [Waiting for headers]\u001b[0m\r", " \r", "Get:26 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libbs2b0 amd64 3.1.0+dfsg-2.2build1 [10.2 kB]\r\n", "\u001b[33m\r", "44% [26 libbs2b0 10.2 kB/10.2 kB 100%]\u001b[0m\u001b[33m\r", " \r", "44% [Working]\u001b[0m\r", " \r", "Get:27 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libflite1 amd64 2.1-release-3 [12.8 MB]\r\n", "\u001b[33m\r", "44% [27 libflite1 4096 B/12.8 MB 0%]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m\r", " \r", "69% [Waiting for headers]\u001b[0m\r", " \r", "Get:28 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libserd-0-0 amd64 0.30.2-1 [46.6 kB]\r\n", "\u001b[33m\r", "69% [28 libserd-0-0 13.7 kB/46.6 kB 29%]\u001b[0m\u001b[33m\r", " \r", "69% [Waiting for headers]\u001b[0m\r", " \r", "Get:29 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libsord-0-0 amd64 0.16.4-1 [19.5 kB]\r\n", "\u001b[33m\r", "69% [29 libsord-0-0 13.9 kB/19.5 kB 71%]\u001b[0m\u001b[33m\r", " \r", "70% [Waiting for headers]\u001b[0m\r", " \r", "Get:30 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libsratom-0-0 amd64 0.6.4-1 [16.9 kB]\r\n", "\u001b[33m\r", "70% [30 libsratom-0-0 16.9 kB/16.9 kB 100%]\u001b[0m\u001b[33m\r", " \r", "70% [Waiting for headers]\u001b[0m\r", " \r", "Get:31 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 liblilv-0-0 amd64 0.24.6-1ubuntu0.1 [40.6 kB]\r\n", "\u001b[33m\r", "70% [31 liblilv-0-0 6639 B/40.6 kB 16%]\u001b[0m\u001b[33m\r", " \r", "71% [Waiting for headers]\u001b[0m\r", " \r", "Get:32 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libmysofa1 amd64 1.0~dfsg0-1 [39.2 kB]\r\n", "\u001b[33m\r", "71% [32 libmysofa1 9452 B/39.2 kB 24%]\u001b[0m\u001b[33m\r", " \r", "71% [Waiting for headers]\u001b[0m\r", " \r", "Get:33 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libpostproc55 amd64 7:4.2.7-0ubuntu0.1 [55.0 kB]\r\n", "\u001b[33m\r", "71% [33 libpostproc55 13.7 kB/55.0 kB 25%]\u001b[0m\u001b[33m\r", " \r", "71% [Waiting for headers]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " \r", "Get:34 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/main amd64 libfftw3-double3 amd64 3.3.8-2ubuntu1 [728 kB]\r\n", "\u001b[33m\r", "71% [34 libfftw3-double3 13.7 kB/728 kB 2%]\u001b[0m\u001b[33m\r", " \r", "73% [Waiting for headers]\u001b[0m\r", " \r", "Get:35 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 librubberband2 amd64 1.8.2-1build1 [89.4 kB]\r\n", "\u001b[33m\r", "73% [35 librubberband2 2411 B/89.4 kB 3%]\u001b[0m\u001b[33m\r", " \r", "74% [Waiting for headers]\u001b[0m\r", " \r", "Get:36 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libswscale5 amd64 7:4.2.7-0ubuntu0.1 [157 kB]\r\n", "\u001b[33m\r", "74% [36 libswscale5 5829 B/157 kB 4%]\u001b[0m\u001b[33m\r", " \r", "74% [Waiting for headers]\u001b[0m\r", " \r", "Get:37 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libvidstab1.1 amd64 1.1.0-2 [35.0 kB]\r\n", "\u001b[33m\r", "74% [37 libvidstab1.1 10.9 kB/35.0 kB 31%]\u001b[0m\u001b[33m\r", " \r", "75% [Waiting for headers]\u001b[0m\r", " \r", "Get:38 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libavfilter7 amd64 7:4.2.7-0ubuntu0.1 [1085 kB]\r\n", "\u001b[33m\r", "75% [38 libavfilter7 9261 B/1085 kB 1%]\u001b[0m\r", " \r", "Get:39 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/main amd64 libcdio18 amd64 2.0.0-2 [58.6 kB]\r\n", "\u001b[33m\r", " \r", "77% [39 libcdio18 38.4 kB/58.6 kB 66%]\u001b[0m\u001b[33m\r", " \r", "78% [Working]\u001b[0m\r", " \r", "Get:40 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/main amd64 libcdio-cdda2 amd64 10.2+2.0.0-1 [17.6 kB]\r\n", "\u001b[33m\r", "78% [40 libcdio-cdda2 4096 B/17.6 kB 23%]\u001b[0m\u001b[33m\r", " \r", "78% [Waiting for headers]\u001b[0m\r", " \r", "Get:41 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/main amd64 libcdio-paranoia2 amd64 10.2+2.0.0-1 [16.2 kB]\r\n", "\u001b[33m\r", "78% [41 libcdio-paranoia2 16.2 kB/16.2 kB 100%]\u001b[0m\u001b[33m\r", " \r", "78% [Working]\u001b[0m\r", " \r", "Get:42 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libdc1394-22 amd64 2.2.5-2.1 [79.6 kB]\r\n", "\u001b[33m\r", "78% [42 libdc1394-22 4096 B/79.6 kB 5%]\u001b[0m\u001b[33m\r", " \r", "79% [Waiting for headers]\u001b[0m\r", " \r", "Get:43 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libopenal-data all 1:1.19.1-1 [162 kB]\r\n", "\u001b[33m\r", "79% [43 libopenal-data 13.7 kB/162 kB 8%]\u001b[0m\u001b[33m\r", " \r", "80% [Waiting for headers]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " \r", "Get:44 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libsndio7.0 amd64 1.5.0-3 [24.5 kB]\r\n", "\u001b[33m\r", "80% [44 libsndio7.0 2416 B/24.5 kB 10%]\u001b[0m\u001b[33m\r", " \r", "80% [Waiting for headers]\u001b[0m\r", " \r", "Get:45 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libopenal1 amd64 1:1.19.1-1 [492 kB]\r\n", "\u001b[33m\r", "80% [45 libopenal1 12.3 kB/492 kB 2%]\u001b[0m\u001b[33m\r", " \r", "81% [Waiting for headers]\u001b[0m\r", " \r", "Get:46 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libsdl2-2.0-0 amd64 2.0.10+dfsg1-3 [407 kB]\r\n", "\u001b[33m\r", "81% [46 libsdl2-2.0-0 13.7 kB/407 kB 3%]\u001b[0m\u001b[33m\r", " \r", "82% [Waiting for headers]\u001b[0m\r", " \r", "Get:47 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libavdevice58 amd64 7:4.2.7-0ubuntu0.1 [74.3 kB]\r\n", "\u001b[33m\r", "82% [47 libavdevice58 13.7 kB/74.3 kB 18%]\u001b[0m\u001b[33m\r", " \r", "83% [Waiting for headers]\u001b[0m\r", " \r", "Get:48 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libavresample4 amd64 7:4.2.7-0ubuntu0.1 [54.2 kB]\r\n", "\u001b[33m\r", "83% [48 libavresample4 12.3 kB/54.2 kB 23%]\u001b[0m\u001b[33m\r", " \r", "83% [Waiting for headers]\u001b[0m\r", " \r", "Get:49 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 ffmpeg amd64 7:4.2.7-0ubuntu0.1 [1453 kB]\r\n", "\u001b[33m\r", "83% [49 ffmpeg 2411 B/1453 kB 0%]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m\r", " \r", "86% [Waiting for headers]\u001b[0m\r", " \r", "Get:50 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libigdgmm11 amd64 20.1.1+ds1-1 [111 kB]\r\n", "\u001b[33m\r", "86% [50 libigdgmm11 13.7 kB/111 kB 12%]\u001b[0m\u001b[33m\r", " \r", "87% [Waiting for headers]\u001b[0m\r", " \r", "Get:51 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 intel-media-va-driver amd64 20.1.1+dfsg1-1 [1764 kB]\r\n", "\u001b[33m\r", "87% [51 intel-media-va-driver 24.6 kB/1764 kB 1%]\u001b[0m\u001b[33m\r", " \r", "91% [Waiting for headers]\u001b[0m\r", " \r", "Get:52 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libaacs0 amd64 0.9.0-2 [50.1 kB]\r\n", "\u001b[33m\r", "91% [52 libaacs0 2415 B/50.1 kB 5%]\u001b[0m\u001b[33m\r", " \r", "91% [Waiting for headers]\u001b[0m\r", " \r", "Get:53 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 libbdplus0 amd64 0.1.2-3 [47.3 kB]\r\n", "\u001b[33m\r", "91% [53 libbdplus0 13.7 kB/47.3 kB 29%]\u001b[0m\u001b[33m\r", " \r", "92% [Waiting for headers]\u001b[0m\r", " \r", "Get:54 http://us-central1.gce.archive.ubuntu.com/ubuntu focal-updates/universe amd64 mesa-va-drivers amd64 21.2.6-0ubuntu0.1~20.04.2 [2970 kB]\r\n", "\u001b[33m\r", "92% [54 mesa-va-drivers 2408 B/2970 kB 0%]\u001b[0m" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33m\r", " \r", "98% [Waiting for headers]\u001b[0m\r", " \r", "Get:55 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 i965-va-driver amd64 2.4.0-0ubuntu1 [924 kB]\r\n", "\u001b[33m\r", "98% [55 i965-va-driver 13.7 kB/924 kB 1%]\u001b[0m\r", " \r", "Get:56 http://us-central1.gce.archive.ubuntu.com/ubuntu focal/universe amd64 va-driver-all amd64 2.7.0-2 [4020 B]\r\n", "\u001b[33m\r", "100% [56 va-driver-all 4020 B/4020 B 100%]\u001b[0m\u001b[33m\r", " \r", "100% [Working]\u001b[0m\r", " \r", "Fetched 42.5 MB in 2s (26.4 MB/s)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", "Extracting templates from packages: 53%" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", "Extracting templates from packages: 100%\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\u001b7\u001b[0;23r\u001b8\u001b[1A" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libaom0:amd64.\r\n", "(Reading database ... \r", "(Reading database ... 5%\r", "(Reading database ... 10%\r", "(Reading database ... 15%\r", "(Reading database ... 20%\r", "(Reading database ... 25%\r", "(Reading database ... 30%\r", "(Reading database ... 35%\r", "(Reading database ... 40%\r", "(Reading database ... 45%\r", "(Reading database ... 50%\r", "(Reading database ... 55%\r", "(Reading database ... 60%\r", "(Reading database ... 65%\r", "(Reading database ... 70%\r" ] }, { "name": "stdout", "output_type": "stream", "text": [ "(Reading database ... 75%\r", "(Reading database ... 80%\r", "(Reading database ... 85%\r", "(Reading database ... 90%\r", "(Reading database ... 95%\r", "(Reading database ... 100%\r", "(Reading database ... 140796 files and directories currently installed.)\r\n", "Preparing to unpack .../00-libaom0_1.0.0.errata1-3build1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 0%]\u001b[49m\u001b[39m [..........................................................] \u001b8Unpacking libaom0:amd64 (1.0.0.errata1-3build1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libva2:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../01-libva2_2.7.0-2_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 1%]\u001b[49m\u001b[39m [..........................................................] \u001b8Unpacking libva2:amd64 (2.7.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libva-drm2:amd64.\r\n", "Preparing to unpack .../02-libva-drm2_2.7.0-2_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 2%]\u001b[49m\u001b[39m [#.........................................................] \u001b8Unpacking libva-drm2:amd64 (2.7.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libva-x11-2:amd64.\r\n", "Preparing to unpack .../03-libva-x11-2_2.7.0-2_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 3%]\u001b[49m\u001b[39m [#.........................................................] \u001b8Unpacking libva-x11-2:amd64 (2.7.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package ocl-icd-libopencl1:amd64.\r\n", "Preparing to unpack .../04-ocl-icd-libopencl1_2.2.11-1ubuntu1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 4%]\u001b[49m\u001b[39m [##........................................................] \u001b8Unpacking ocl-icd-libopencl1:amd64 (2.2.11-1ubuntu1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libavutil56:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../05-libavutil56_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "Unpacking libavutil56:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 5%]\u001b[49m\u001b[39m [###.......................................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libcodec2-0.9:amd64.\r\n", "Preparing to unpack .../06-libcodec2-0.9_0.9.2-2_amd64.deb ...\r\n", "Unpacking libcodec2-0.9:amd64 (0.9.2-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 6%]\u001b[49m\u001b[39m [###.......................................................] \u001b8Selecting previously unselected package libgsm1:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../07-libgsm1_1.0.18-2_amd64.deb ...\r\n", "Unpacking libgsm1:amd64 (1.0.18-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 7%]\u001b[49m\u001b[39m [####......................................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libshine3:amd64.\r\n", "Preparing to unpack .../08-libshine3_3.1.1-2_amd64.deb ...\r\n", "Unpacking libshine3:amd64 (3.1.1-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 8%]\u001b[49m\u001b[39m [####......................................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libsnappy1v5:amd64.\r\n", "Preparing to unpack .../09-libsnappy1v5_1.1.8-1build1_amd64.deb ...\r\n", "Unpacking libsnappy1v5:amd64 (1.1.8-1build1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libswresample3:amd64.\r\n", "Preparing to unpack .../10-libswresample3_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 9%]\u001b[49m\u001b[39m [#####.....................................................] \u001b8Unpacking libswresample3:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libwebpmux3:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../11-libwebpmux3_0.6.1-2ubuntu0.20.04.1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 10%]\u001b[49m\u001b[39m [#####.....................................................] \u001b8Unpacking libwebpmux3:amd64 (0.6.1-2ubuntu0.20.04.1) ...\r\n", "Selecting previously unselected package libx264-155:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../12-libx264-155_2%3a0.155.2917+git0a84d98-2_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 11%]\u001b[49m\u001b[39m [######....................................................] \u001b8Unpacking libx264-155:amd64 (2:0.155.2917+git0a84d98-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libx265-179:amd64.\r\n", "Preparing to unpack .../13-libx265-179_3.2.1-1build1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 12%]\u001b[49m\u001b[39m [######....................................................] \u001b8Unpacking libx265-179:amd64 (3.2.1-1build1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libxvidcore4:amd64.\r\n", "Preparing to unpack .../14-libxvidcore4_2%3a1.3.7-1_amd64.deb ...\r\n", "Unpacking libxvidcore4:amd64 (2:1.3.7-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 13%]\u001b[49m\u001b[39m [#######...................................................] \u001b8Selecting previously unselected package libzvbi-common.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../15-libzvbi-common_0.2.35-17_all.deb ...\r\n", "Unpacking libzvbi-common (0.2.35-17) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 14%]\u001b[49m\u001b[39m [########..................................................] \u001b8Selecting previously unselected package libzvbi0:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../16-libzvbi0_0.2.35-17_amd64.deb ...\r\n", "Unpacking libzvbi0:amd64 (0.2.35-17) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 15%]\u001b[49m\u001b[39m [########..................................................] \u001b8Selecting previously unselected package libavcodec58:amd64.\r\n", "Preparing to unpack .../17-libavcodec58_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "Unpacking libavcodec58:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 16%]\u001b[49m\u001b[39m [#########.................................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libass9:amd64.\r\n", "Preparing to unpack .../18-libass9_1%3a0.14.0-2_amd64.deb ...\r\n", "Unpacking libass9:amd64 (1:0.14.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libbluray2:amd64.\r\n", "Preparing to unpack .../19-libbluray2_1%3a1.2.0-1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 17%]\u001b[49m\u001b[39m [##########................................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Unpacking libbluray2:amd64 (1:1.2.0-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libchromaprint1:amd64.\r\n", "Preparing to unpack .../20-libchromaprint1_1.4.3-3build1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 18%]\u001b[49m\u001b[39m [##########................................................] \u001b8Unpacking libchromaprint1:amd64 (1.4.3-3build1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libgme0:amd64.\r\n", "Preparing to unpack .../21-libgme0_0.6.2-1build1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 19%]\u001b[49m\u001b[39m [###########...............................................] \u001b8Unpacking libgme0:amd64 (0.6.2-1build1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libopenmpt0:amd64.\r\n", "Preparing to unpack .../22-libopenmpt0_0.4.11-1build1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 20%]\u001b[49m\u001b[39m [###########...............................................] \u001b8Unpacking libopenmpt0:amd64 (0.4.11-1build1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libssh-gcrypt-4:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../23-libssh-gcrypt-4_0.9.3-2ubuntu2.2_amd64.deb ...\r\n", "Unpacking libssh-gcrypt-4:amd64 (0.9.3-2ubuntu2.2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 21%]\u001b[49m\u001b[39m [############..............................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libavformat58:amd64.\r\n", "Preparing to unpack .../24-libavformat58_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "Unpacking libavformat58:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 22%]\u001b[49m\u001b[39m [############..............................................] \u001b8Selecting previously unselected package libbs2b0:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../25-libbs2b0_3.1.0+dfsg-2.2build1_amd64.deb ...\r\n", "Unpacking libbs2b0:amd64 (3.1.0+dfsg-2.2build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 23%]\u001b[49m\u001b[39m [#############.............................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libflite1:amd64.\r\n", "Preparing to unpack .../26-libflite1_2.1-release-3_amd64.deb ...\r\n", "Unpacking libflite1:amd64 (2.1-release-3) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 24%]\u001b[49m\u001b[39m [#############.............................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libserd-0-0:amd64.\r\n", "Preparing to unpack .../27-libserd-0-0_0.30.2-1_amd64.deb ...\r\n", "Unpacking libserd-0-0:amd64 (0.30.2-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libsord-0-0:amd64.\r\n", "Preparing to unpack .../28-libsord-0-0_0.16.4-1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 25%]\u001b[49m\u001b[39m [##############............................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Unpacking libsord-0-0:amd64 (0.16.4-1) ...\r\n", "Selecting previously unselected package libsratom-0-0:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../29-libsratom-0-0_0.6.4-1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 26%]\u001b[49m\u001b[39m [###############...........................................] \u001b8Unpacking libsratom-0-0:amd64 (0.6.4-1) ...\r\n", "Selecting previously unselected package liblilv-0-0:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../30-liblilv-0-0_0.24.6-1ubuntu0.1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 27%]\u001b[49m\u001b[39m [###############...........................................] \u001b8Unpacking liblilv-0-0:amd64 (0.24.6-1ubuntu0.1) ...\r\n", "Selecting previously unselected package libmysofa1:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../31-libmysofa1_1.0~dfsg0-1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 28%]\u001b[49m\u001b[39m [################..........................................] \u001b8Unpacking libmysofa1:amd64 (1.0~dfsg0-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libpostproc55:amd64.\r\n", "Preparing to unpack .../32-libpostproc55_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "Unpacking libpostproc55:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 29%]\u001b[49m\u001b[39m [#################.........................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libfftw3-double3:amd64.\r\n", "Preparing to unpack .../33-libfftw3-double3_3.3.8-2ubuntu1_amd64.deb ...\r\n", "Unpacking libfftw3-double3:amd64 (3.3.8-2ubuntu1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 30%]\u001b[49m\u001b[39m [#################.........................................] \u001b8Selecting previously unselected package librubberband2:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../34-librubberband2_1.8.2-1build1_amd64.deb ...\r\n", "Unpacking librubberband2:amd64 (1.8.2-1build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 31%]\u001b[49m\u001b[39m [##################........................................] \u001b8Selecting previously unselected package libswscale5:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../35-libswscale5_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "Unpacking libswscale5:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 32%]\u001b[49m\u001b[39m [##################........................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libvidstab1.1:amd64.\r\n", "Preparing to unpack .../36-libvidstab1.1_1.1.0-2_amd64.deb ...\r\n", "Unpacking libvidstab1.1:amd64 (1.1.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libavfilter7:amd64.\r\n", "Preparing to unpack .../37-libavfilter7_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 33%]\u001b[49m\u001b[39m [###################.......................................] \u001b8Unpacking libavfilter7:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libcdio18:amd64.\r\n", "Preparing to unpack .../38-libcdio18_2.0.0-2_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 34%]\u001b[49m\u001b[39m [###################.......................................] \u001b8Unpacking libcdio18:amd64 (2.0.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libcdio-cdda2:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../39-libcdio-cdda2_10.2+2.0.0-1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 35%]\u001b[49m\u001b[39m [####################......................................] \u001b8Unpacking libcdio-cdda2:amd64 (10.2+2.0.0-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libcdio-paranoia2:amd64.\r\n", "Preparing to unpack .../40-libcdio-paranoia2_10.2+2.0.0-1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 36%]\u001b[49m\u001b[39m [####################......................................] \u001b8Unpacking libcdio-paranoia2:amd64 (10.2+2.0.0-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libdc1394-22:amd64.\r\n", "Preparing to unpack .../41-libdc1394-22_2.2.5-2.1_amd64.deb ...\r\n", "Unpacking libdc1394-22:amd64 (2.2.5-2.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 37%]\u001b[49m\u001b[39m [#####################.....................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libopenal-data.\r\n", "Preparing to unpack .../42-libopenal-data_1%3a1.19.1-1_all.deb ...\r\n", "Unpacking libopenal-data (1:1.19.1-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 38%]\u001b[49m\u001b[39m [######################....................................] \u001b8Selecting previously unselected package libsndio7.0:amd64.\r\n", "Preparing to unpack .../43-libsndio7.0_1.5.0-3_amd64.deb ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Unpacking libsndio7.0:amd64 (1.5.0-3) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 39%]\u001b[49m\u001b[39m [######################....................................] \u001b8Selecting previously unselected package libopenal1:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../44-libopenal1_1%3a1.19.1-1_amd64.deb ...\r\n", "Unpacking libopenal1:amd64 (1:1.19.1-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 40%]\u001b[49m\u001b[39m [#######################...................................] \u001b8Selecting previously unselected package libsdl2-2.0-0:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../45-libsdl2-2.0-0_2.0.10+dfsg1-3_amd64.deb ...\r\n", "Unpacking libsdl2-2.0-0:amd64 (2.0.10+dfsg1-3) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libavdevice58:amd64.\r\n", "Preparing to unpack .../46-libavdevice58_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 41%]\u001b[49m\u001b[39m [#######################...................................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Unpacking libavdevice58:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "Selecting previously unselected package libavresample4:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../47-libavresample4_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 42%]\u001b[49m\u001b[39m [########################..................................] \u001b8Unpacking libavresample4:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package ffmpeg.\r\n", "Preparing to unpack .../48-ffmpeg_7%3a4.2.7-0ubuntu0.1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 43%]\u001b[49m\u001b[39m [#########################.................................] \u001b8Unpacking ffmpeg (7:4.2.7-0ubuntu0.1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package libigdgmm11:amd64.\r\n", "Preparing to unpack .../49-libigdgmm11_20.1.1+ds1-1_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 44%]\u001b[49m\u001b[39m [#########################.................................] \u001b8Unpacking libigdgmm11:amd64 (20.1.1+ds1-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package intel-media-va-driver:amd64.\r\n", "Preparing to unpack .../50-intel-media-va-driver_20.1.1+dfsg1-1_amd64.deb ...\r\n", "Unpacking intel-media-va-driver:amd64 (20.1.1+dfsg1-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 45%]\u001b[49m\u001b[39m [##########################................................] \u001b8Selecting previously unselected package libaacs0:amd64.\r\n", "Preparing to unpack .../51-libaacs0_0.9.0-2_amd64.deb ...\r\n", "Unpacking libaacs0:amd64 (0.9.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 46%]\u001b[49m\u001b[39m [##########################................................] \u001b8Selecting previously unselected package libbdplus0:amd64.\r\n", "Preparing to unpack .../52-libbdplus0_0.1.2-3_amd64.deb ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Unpacking libbdplus0:amd64 (0.1.2-3) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 47%]\u001b[49m\u001b[39m [###########################...............................] \u001b8Selecting previously unselected package mesa-va-drivers:amd64.\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Preparing to unpack .../53-mesa-va-drivers_21.2.6-0ubuntu0.1~20.04.2_amd64.deb ...\r\n", "Unpacking mesa-va-drivers:amd64 (21.2.6-0ubuntu0.1~20.04.2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 48%]\u001b[49m\u001b[39m [###########################...............................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package i965-va-driver:amd64.\r\n", "Preparing to unpack .../54-i965-va-driver_2.4.0-0ubuntu1_amd64.deb ...\r\n", "Unpacking i965-va-driver:amd64 (2.4.0-0ubuntu1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Selecting previously unselected package va-driver-all:amd64.\r\n", "Preparing to unpack .../55-va-driver-all_2.7.0-2_amd64.deb ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 49%]\u001b[49m\u001b[39m [############################..............................] \u001b8Unpacking va-driver-all:amd64 (2.7.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Setting up libgme0:amd64 (0.6.2-1build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 50%]\u001b[49m\u001b[39m [#############################.............................] \u001b8Setting up libssh-gcrypt-4:amd64 (0.9.3-2ubuntu2.2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 51%]\u001b[49m\u001b[39m [#############################.............................] \u001b8Setting up libshine3:amd64 (3.1.1-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 52%]\u001b[49m\u001b[39m [##############################............................] \u001b8Setting up libgsm1:amd64 (1.0.18-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 53%]\u001b[49m\u001b[39m [##############################............................] \u001b8Setting up libx264-155:amd64 (2:0.155.2917+git0a84d98-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 54%]\u001b[49m\u001b[39m [###############################...........................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Setting up libx265-179:amd64 (3.2.1-1build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 55%]\u001b[49m\u001b[39m [###############################...........................] \u001b8Setting up libaom0:amd64 (1.0.0.errata1-3build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 56%]\u001b[49m\u001b[39m [################################..........................] \u001b8Setting up libmysofa1:amd64 (1.0~dfsg0-1) ...\r\n", "Setting up libdc1394-22:amd64 (2.2.5-2.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 57%]\u001b[49m\u001b[39m [#################################.........................] \u001b8Setting up libcdio18:amd64 (2.0.0-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 58%]\u001b[49m\u001b[39m [#################################.........................] \u001b8Setting up libxvidcore4:amd64 (2:1.3.7-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 59%]\u001b[49m\u001b[39m [##################################........................] \u001b8Setting up libsnappy1v5:amd64 (1.1.8-1build1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 60%]\u001b[49m\u001b[39m [##################################........................] \u001b8Setting up libass9:amd64 (1:0.14.0-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 61%]\u001b[49m\u001b[39m [###################################.......................] \u001b8Setting up libva2:amd64 (2.7.0-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 62%]\u001b[49m\u001b[39m [####################################......................] \u001b8Setting up libigdgmm11:amd64 (20.1.1+ds1-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 63%]\u001b[49m\u001b[39m [####################################......................] \u001b8Setting up libcodec2-0.9:amd64 (0.9.2-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 64%]\u001b[49m\u001b[39m [#####################################.....................] \u001b8Setting up intel-media-va-driver:amd64 (20.1.1+dfsg1-1) ...\r\n", "Setting up libaacs0:amd64 (0.9.0-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 65%]\u001b[49m\u001b[39m [#####################################.....................] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Setting up libfftw3-double3:amd64 (3.3.8-2ubuntu1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 66%]\u001b[49m\u001b[39m [######################################....................] \u001b8Setting up librubberband2:amd64 (1.8.2-1build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 67%]\u001b[49m\u001b[39m [######################################....................] \u001b8Setting up libsndio7.0:amd64 (1.5.0-3) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 68%]\u001b[49m\u001b[39m [#######################################...................] \u001b8Setting up libbdplus0:amd64 (0.1.2-3) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 69%]\u001b[49m\u001b[39m [########################################..................] \u001b8Setting up libvidstab1.1:amd64 (1.1.0-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 70%]\u001b[49m\u001b[39m [########################################..................] \u001b8Setting up libflite1:amd64 (2.1-release-3) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 71%]\u001b[49m\u001b[39m [#########################################.................] \u001b8Setting up libva-drm2:amd64 (2.7.0-2) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 72%]\u001b[49m\u001b[39m [#########################################.................] \u001b8Setting up ocl-icd-libopencl1:amd64 (2.2.11-1ubuntu1) ...\r\n", "Setting up libbs2b0:amd64 (3.1.0+dfsg-2.2build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 73%]\u001b[49m\u001b[39m [##########################################................] \u001b8Setting up libopenal-data (1:1.19.1-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 74%]\u001b[49m\u001b[39m [###########################################...............] \u001b8Setting up mesa-va-drivers:amd64 (21.2.6-0ubuntu0.1~20.04.2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 75%]\u001b[49m\u001b[39m [###########################################...............] \u001b8Setting up libbluray2:amd64 (1:1.2.0-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 76%]\u001b[49m\u001b[39m [############################################..............] \u001b8Setting up libsdl2-2.0-0:amd64 (2.0.10+dfsg1-3) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 77%]\u001b[49m\u001b[39m [############################################..............] \u001b8Setting up libva-x11-2:amd64 (2.7.0-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 78%]\u001b[49m\u001b[39m [#############################################.............] \u001b8Setting up libwebpmux3:amd64 (0.6.1-2ubuntu0.20.04.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 79%]\u001b[49m\u001b[39m [#############################################.............] \u001b8Setting up libopenmpt0:amd64 (0.4.11-1build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 80%]\u001b[49m\u001b[39m [##############################################............] \u001b8Setting up libzvbi-common (0.2.35-17) ...\r\n", "Setting up i965-va-driver:amd64 (2.4.0-0ubuntu1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 81%]\u001b[49m\u001b[39m [###############################################...........] \u001b8Setting up libserd-0-0:amd64 (0.30.2-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 82%]\u001b[49m\u001b[39m [###############################################...........] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Setting up libzvbi0:amd64 (0.2.35-17) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 83%]\u001b[49m\u001b[39m [################################################..........] \u001b8Setting up libcdio-cdda2:amd64 (10.2+2.0.0-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 84%]\u001b[49m\u001b[39m [################################################..........] \u001b8Setting up libcdio-paranoia2:amd64 (10.2+2.0.0-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 85%]\u001b[49m\u001b[39m [#################################################.........] \u001b8Setting up libopenal1:amd64 (1:1.19.1-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 86%]\u001b[49m\u001b[39m [##################################################........] \u001b8Setting up libavutil56:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 87%]\u001b[49m\u001b[39m [##################################################........] \u001b8Setting up va-driver-all:amd64 (2.7.0-2) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 88%]\u001b[49m\u001b[39m [###################################################.......] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Setting up libpostproc55:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "Setting up libsord-0-0:amd64 (0.16.4-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 89%]\u001b[49m\u001b[39m [###################################################.......] \u001b8Setting up libsratom-0-0:amd64 (0.6.4-1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 90%]\u001b[49m\u001b[39m [####################################################......] \u001b8Setting up libswscale5:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 91%]\u001b[49m\u001b[39m [####################################################......] \u001b8Setting up liblilv-0-0:amd64 (0.24.6-1ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 92%]\u001b[49m\u001b[39m [#####################################################.....] \u001b8Setting up libswresample3:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 93%]\u001b[49m\u001b[39m [######################################################....] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Setting up libavresample4:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 94%]\u001b[49m\u001b[39m [######################################################....] \u001b8Setting up libavcodec58:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 95%]\u001b[49m\u001b[39m [#######################################################...] \u001b8Setting up libchromaprint1:amd64 (1.4.3-3build1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 96%]\u001b[49m\u001b[39m [#######################################################...] \u001b8Setting up libavformat58:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "Setting up libavfilter7:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 97%]\u001b[49m\u001b[39m [########################################################..] \u001b8Setting up libavdevice58:amd64 (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 98%]\u001b[49m\u001b[39m [########################################################..] \u001b8Setting up ffmpeg (7:4.2.7-0ubuntu0.1) ...\r\n", "\u001b7\u001b[24;0f\u001b[42m\u001b[30mProgress: [ 99%]\u001b[49m\u001b[39m [#########################################################.] \u001b8" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Processing triggers for man-db (2.9.1-1) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Processing triggers for libc-bin (2.31-0ubuntu9.9) ...\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r\n", "\u001b7\u001b[0;24r\u001b8\u001b[1A\u001b[J" ] } ], "source": [ "!sudo apt install -y ffmpeg\n", "!pip install -q mediapy" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:54:55.022075Z", "iopub.status.busy": "2022-12-14T21:54:55.021818Z", "iopub.status.idle": "2022-12-14T21:54:59.047445Z", "shell.execute_reply": "2022-12-14T21:54:59.046350Z" }, "id": "s3khsunT7kWa" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33mWARNING: Skipping opencv-python-headless as it is not installed.\u001b[0m\u001b[33m\r\n", "\u001b[0m" ] } ], "source": [ "!pip uninstall -q -y opencv-python-headless\n", "!pip install -q \"opencv-python-headless<4.3\"" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:54:59.052076Z", "iopub.status.busy": "2022-12-14T21:54:59.051294Z", "iopub.status.idle": "2022-12-14T21:55:01.498882Z", "shell.execute_reply": "2022-12-14T21:55:01.498168Z" }, "id": "dI_1csl6Q-gH" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-12-14 21:55:00.393078: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 21:55:00.393186: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 21:55:00.393197: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n" ] } ], "source": [ "# Import libraries\n", "import pathlib\n", "\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import mediapy as media\n", "import numpy as np\n", "import PIL\n", "\n", "import tensorflow as tf\n", "import tensorflow_hub as hub\n", "import tqdm\n", "\n", "mpl.rcParams.update({\n", " 'font.size': 10,\n", "})" ] }, { "cell_type": "markdown", "metadata": { "id": "Pn8K9oWbmREi" }, "source": [ "kinetics 600 레이블 목록을 가져오고 처음 몇 개의 레이블을 인쇄합니다." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:55:01.503301Z", "iopub.status.busy": "2022-12-14T21:55:01.502639Z", "iopub.status.idle": "2022-12-14T21:55:01.511867Z", "shell.execute_reply": "2022-12-14T21:55:01.511205Z" }, "id": "2VJUAcjhkfb3" }, "outputs": [ { "data": { "text/plain": [ "array(['background', 'tench', 'goldfish', 'great white shark',\n", " 'tiger shark', 'hammerhead', 'electric ray', 'stingray', 'cock',\n", " 'hen', 'ostrich', 'brambling', 'goldfinch', 'house finch', 'junco',\n", " 'indigo bunting', 'robin', 'bulbul', 'jay', 'magpie'], dtype='}\n", " <1>: float32 Tensor, shape=(None, 600)\n" ] } ], "source": [ "sig = model.signatures['serving_default']\n", "print(sig.pretty_printed_signature())" ] }, { "cell_type": "markdown", "metadata": { "id": "M4Xny1ANomi4" }, "source": [ "비디오에서 이 서명을 실행하려면 먼저 비디오에 외부 `batch` 차원을 추가해야 합니다." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:55:21.558378Z", "iopub.status.busy": "2022-12-14T21:55:21.557867Z", "iopub.status.idle": "2022-12-14T21:55:32.526171Z", "shell.execute_reply": "2022-12-14T21:55:32.525440Z" }, "id": "LBOFEDG1XvZE" }, "outputs": [], "source": [ "#warmup\n", "sig(image = jumpingjack[tf.newaxis, :1]);" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:55:32.530375Z", "iopub.status.busy": "2022-12-14T21:55:32.530091Z", "iopub.status.idle": "2022-12-14T21:55:39.061046Z", "shell.execute_reply": "2022-12-14T21:55:39.060273Z" }, "id": "jCeW3KycVbGn" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(600,)\n", "\n", "CPU times: user 4.13 s, sys: 50.3 ms, total: 4.18 s\n", "Wall time: 6.53 s\n" ] } ], "source": [ "%%time\n", "logits = sig(image = jumpingjack[tf.newaxis, ...])\n", "logits = logits['classifier_head'][0]\n", "\n", "print(logits.shape)\n", "print()" ] }, { "cell_type": "markdown", "metadata": { "id": "AE8doqkPpxED" }, "source": [ "위의 출력 처리를 나중에 패키징하는 `get_top_k` 함수를 정의합니다." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:55:39.064960Z", "iopub.status.busy": "2022-12-14T21:55:39.064264Z", "iopub.status.idle": "2022-12-14T21:55:39.069363Z", "shell.execute_reply": "2022-12-14T21:55:39.068783Z" }, "id": "OozPNO6LvZ00" }, "outputs": [], "source": [ "#@title\n", "# Get top_k labels and probabilities\n", "def get_top_k(probs, k=5, label_map=KINETICS_600_LABELS):\n", " \"\"\"Outputs the top k model labels and probabilities on the given video.\n", "\n", " Args:\n", " probs: probability tensor of shape (num_frames, num_classes) that represents\n", " the probability of each class on each frame.\n", " k: the number of top predictions to select.\n", " label_map: a list of labels to map logit indices to label strings.\n", "\n", " Returns:\n", " a tuple of the top-k labels and probabilities.\n", " \"\"\"\n", " # Sort predictions to find top_k\n", " top_predictions = tf.argsort(probs, axis=-1, direction='DESCENDING')[:k]\n", " # collect the labels of top_k predictions\n", " top_labels = tf.gather(label_map, top_predictions, axis=-1)\n", " # decode lablels\n", " top_labels = [label.decode('utf8') for label in top_labels.numpy()]\n", " # top_k probabilities of the predictions\n", " top_probs = tf.gather(probs, top_predictions, axis=-1).numpy()\n", " return tuple(zip(top_labels, top_probs))" ] }, { "cell_type": "markdown", "metadata": { "id": "kTfKMT29pP_Z" }, "source": [ "`logits`을 확률로 변환하고 비디오의 상위 5개 클래스를 찾습니다. 모델은 비디오가 `jumping jacks`일 가능성이 있음을 확인합니다." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:55:39.072893Z", "iopub.status.busy": "2022-12-14T21:55:39.072462Z", "iopub.status.idle": "2022-12-14T21:55:39.087757Z", "shell.execute_reply": "2022-12-14T21:55:39.087073Z" }, "id": "Z-SrNGsGV5Mt" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "EntleBucher : 0.834\n", "home theater : 0.008\n", "miniature poodle : 0.003\n", "redshank : 0.003\n", "spider monkey : 0.002\n" ] } ], "source": [ "probs = tf.nn.softmax(logits, axis=-1)\n", "for label, p in get_top_k(probs):\n", " print(f'{label:20s}: {p:.3f}')" ] }, { "cell_type": "markdown", "metadata": { "id": "ltdijoQpqjxZ" }, "source": [ "### 스트리밍 모델" ] }, { "cell_type": "markdown", "metadata": { "id": "9dqdUPQXq45b" }, "source": [ "이전 섹션에서는 전체 비디오를 실행하는 모델을 사용했습니다. 종종 비디오를 처리할 때 마지막에 하나의 예측을 원하지 않고 프레임별로 예측을 업데이트하고 싶을 수 있습니다. 모델의 `stream` 버전을 사용하면 가능합니다.\n", "\n", "모델의 `stream` 버전을 로드합니다." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:55:39.091220Z", "iopub.status.busy": "2022-12-14T21:55:39.090624Z", "iopub.status.idle": "2022-12-14T21:56:25.037394Z", "shell.execute_reply": "2022-12-14T21:56:25.036612Z" }, "id": "mxt0hRXFZkAM" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 43.8 s, sys: 2.19 s, total: 46 s\n", "Wall time: 45.9 s\n" ] } ], "source": [ "%%time\n", "id = 'a2'\n", "mode = 'stream'\n", "version = '3'\n", "hub_url = f'https://tfhub.dev/tensorflow/movinet/{id}/{mode}/kinetics-600/classification/{version}'\n", "model = hub.load(hub_url)" ] }, { "cell_type": "markdown", "metadata": { "id": "pDswtsGgsYGS" }, "source": [ "이 모델을 사용하는 것은 `base` 모델보다 약간 더 복잡합니다. 모델의 RNN에 대한 내부 상태를 추적해야 합니다." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:25.041343Z", "iopub.status.busy": "2022-12-14T21:56:25.040799Z", "iopub.status.idle": "2022-12-14T21:56:25.045633Z", "shell.execute_reply": "2022-12-14T21:56:25.045003Z" }, "id": "0fM_Vb1VsbDm" }, "outputs": [ { "data": { "text/plain": [ "['call', 'init_states']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(model.signatures.keys())" ] }, { "cell_type": "markdown", "metadata": { "id": "ojr1_iYCtPvp" }, "source": [ "`init_states` 서명은 비디오의 **형상** `(batch, frames, height, width, colors)`를 입력으로 사용하고 초기 RNN 상태를 포함하는 텐서의 방대한 사전을 반환합니다. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:25.049240Z", "iopub.status.busy": "2022-12-14T21:56:25.048704Z", "iopub.status.idle": "2022-12-14T21:56:25.053641Z", "shell.execute_reply": "2022-12-14T21:56:25.053014Z" }, "id": "67loYFGpo_RP" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "signature_wrapper(*, input_shape).\n", " Args:.\n", " input_shape: int32 Tensor, shape=(5,).\n", " Returns:.\n", " {'state/b0/l0/pool_buffer': <1>, 'state/b0/l0/pool_frame_count': <2>, 'state/b0/l1/pool_buffer': <3>, 'state/b0/l1/pool_frame_count': <4>, 'state/b0/l1/stream_buffer': <5>, 'state/b0/l2/pool_buffer': <6>, 'state/b0/l2/pool_frame_count': <7>, 'state/b0/l2/stream_buffer': <8>, 'state/b1/l0/pool_buffer': <9>, 'state/b1/l0/pool_frame_count': <10>, 'state/b1/l0/stream_buffer': <11>, 'state/b1/l1/pool_buffer': <12>, 'state/b1/l1/pool_frame_count': <13>, 'state/b1/l1/stream_buffer': <14>, 'state/b1/l2/pool_buffer': <15>, 'state/b1/l2/pool_frame_count': <16>, 'state/b1/l2/stream_buffer': <17>, 'state/b1/l3/pool_buffer': <18>, 'state/b1/l3/pool_frame_count': <19>, 'state/b1/l3/stream_buffer': <20>, 'state/b1/l4/pool_buffer': <21>, 'state/b1/l4/pool_frame_count': <22>, 'state/b1/l4/stream_buffer': <23>, 'state/b2/l0/pool_buffer': <24>, 'state/b2/l0/pool_frame_count': <25>, 'state/b2/l0/stream_buffer': <26>, 'state/b2/l1/pool_buffer': <27>, 'state/b2/l1/pool_frame_count': <28>, 'state/b2/l1/stream_buffer': <29>, 'state/b2/l2/pool_buffer': <30>, 'state/b2/l2/pool_frame_count': <31>, 'state/b2/l2/stream_buffer': <32>, 'state/b2/l3/pool_buffer': <33>, 'state/b2/l3/pool_frame_count': <34>, 'state/b2/l3/stream_buffer': <35>, 'state/b2/l4/pool_buffer': <36>, 'state/b2/l4/pool_frame_count': <37>, 'state/b2/l4/stream_buffer': <38>, 'state/b3/l0/pool_buffer': <39>, 'state/b3/l0/pool_frame_count': <40>, 'state/b3/l0/stream_buffer': <41>, 'state/b3/l1/pool_buffer': <42>, 'state/b3/l1/pool_frame_count': <43>, 'state/b3/l1/stream_buffer': <44>, 'state/b3/l2/pool_buffer': <45>, 'state/b3/l2/pool_frame_count': <46>, 'state/b3/l2/stream_buffer': <47>, 'state/b3/l3/pool_buffer': <48>, 'state/b3/l3/pool_frame_count': <49>, 'state/b3/l3/stream_buffer': <50>, 'state/b3/l4/pool_buffer': <51>, 'state/b3/l4/pool_frame_count': <52>, 'state/b3/l5/pool_buffer': <53>, 'state/b3/l5/pool_frame_count': <54>, 'state/b3/l5/stream_buffer': <55>, 'state/b4/l0/pool_buffer': <56>, 'state/b4/l0/pool_frame_count': <57>, 'state/b4/l0/stream_buffer': <58>, 'state/b4/l1/pool_buffer': <59>, 'state/b4/l1/pool_frame_count': <60>, 'state/b4/l2/pool_buffer': <61>, 'state/b4/l2/pool_frame_count': <62>, 'state/b4/l3/pool_buffer': <63>, 'state/b4/l3/pool_frame_count': <64>, 'state/b4/l4/pool_buffer': <65>, 'state/b4/l4/pool_frame_count': <66>, 'state/b4/l5/pool_buffer': <67>, 'state/b4/l5/pool_frame_count': <68>, 'state/b4/l5/stream_buffer': <69>, 'state/b4/l6/pool_buffer': <70>, 'state/b4/l6/pool_frame_count': <71>, 'state/head/pool_buffer': <72>, 'state/head/pool_frame_count': <73>}.\n", " <1>: float32 Tensor, shape=(None, 1, 1, 1, 40).\n", " <2>: int32 Tensor, shape=(1,).\n", " <3>: float32 Tensor, shape=(None, 1, 1, 1, 40).\n", " <4>: int32 Tensor, shape=(1,).\n", " <5>: float32 Tensor, shape=(None, 2, None, None, 40).\n", " ...\n" ] } ], "source": [ "lines = model.signatures['init_states'].pretty_printed_signature().splitlines()\n", "lines = lines[:10]\n", "lines.append(' ...')\n", "print('.\\n'.join(lines))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:25.057146Z", "iopub.status.busy": "2022-12-14T21:56:25.056553Z", "iopub.status.idle": "2022-12-14T21:56:25.290533Z", "shell.execute_reply": "2022-12-14T21:56:25.289787Z" }, "id": "v5lG3vejn5df" }, "outputs": [], "source": [ "initial_state = model.init_states(jumpingjack[tf.newaxis, ...].shape)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:25.294575Z", "iopub.status.busy": "2022-12-14T21:56:25.294300Z", "iopub.status.idle": "2022-12-14T21:56:25.298810Z", "shell.execute_reply": "2022-12-14T21:56:25.298222Z" }, "id": "J3DwmyHnuhH_" }, "outputs": [ { "data": { "text/plain": [ "dict" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(initial_state)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:25.302115Z", "iopub.status.busy": "2022-12-14T21:56:25.301497Z", "iopub.status.idle": "2022-12-14T21:56:25.306011Z", "shell.execute_reply": "2022-12-14T21:56:25.305464Z" }, "id": "K8SyiEU6tB-e" }, "outputs": [ { "data": { "text/plain": [ "['state/b0/l0/pool_buffer',\n", " 'state/b0/l0/pool_frame_count',\n", " 'state/b0/l1/pool_buffer',\n", " 'state/b0/l1/pool_frame_count',\n", " 'state/b0/l1/stream_buffer']" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(sorted(initial_state.keys()))[:5]" ] }, { "cell_type": "markdown", "metadata": { "id": "xeMCzJMBvwRF" }, "source": [ "RNN의 초기 상태가 확보되면 상태와 비디오 프레임을 입력으로 전달할 수 있습니다(비디오 프레임의 `(batch, frames, height, width, colors)` 형상 유지). 모델은 `(logits, state)` 쌍을 반환합니다.\n", "\n", "첫 번째 프레임을 본 후 모델은 비디오가 \"팔 벌려 뛰기\"인지 확신하지 못합니다." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:25.309109Z", "iopub.status.busy": "2022-12-14T21:56:25.308877Z", "iopub.status.idle": "2022-12-14T21:56:25.314347Z", "shell.execute_reply": "2022-12-14T21:56:25.313689Z" }, "id": "McSLdIgtsI3d" }, "outputs": [], "source": [ "inputs = initial_state.copy()\n", "\n", "# Add the batch axis, take the first frme, but keep the frame-axis.\n", "inputs['image'] = jumpingjack[tf.newaxis, 0:1, ...] " ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:25.317715Z", "iopub.status.busy": "2022-12-14T21:56:25.317193Z", "iopub.status.idle": "2022-12-14T21:56:32.462447Z", "shell.execute_reply": "2022-12-14T21:56:32.461704Z" }, "id": "WlH7PqLPX664" }, "outputs": [], "source": [ "# warmup\n", "model(inputs);" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:32.466758Z", "iopub.status.busy": "2022-12-14T21:56:32.466149Z", "iopub.status.idle": "2022-12-14T21:56:32.512728Z", "shell.execute_reply": "2022-12-14T21:56:32.512068Z" }, "id": "7uzNXtu7X5sr" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "miniature schnauzer : 0.427\n", "corkscrew : 0.134\n", "miniature poodle : 0.056\n", "church : 0.053\n", "fly : 0.039\n", "\n" ] } ], "source": [ "logits, new_state = model(inputs)\n", "logits = logits[0]\n", "probs = tf.nn.softmax(logits, axis=-1)\n", "\n", "for label, p in get_top_k(probs):\n", " print(f'{label:20s}: {p:.3f}')\n", "\n", "print()" ] }, { "cell_type": "markdown", "metadata": { "id": "oLU644FQwXSb" }, "source": [ "루프에서 모델을 실행하여 각 프레임과 함께 업데이트된 상태를 전달하면 모델이 올바른 결과로 빠르게 수렴됩니다." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:32.516190Z", "iopub.status.busy": "2022-12-14T21:56:32.515550Z", "iopub.status.idle": "2022-12-14T21:56:33.029414Z", "shell.execute_reply": "2022-12-14T21:56:33.028651Z" }, "id": "Fzm7T4ImmIEg" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 552 ms, sys: 17.7 ms, total: 570 ms\n", "Wall time: 509 ms\n" ] } ], "source": [ "%%time\n", "state = initial_state.copy()\n", "all_logits = []\n", "\n", "for n in range(len(jumpingjack)):\n", " inputs = state\n", " inputs['image'] = jumpingjack[tf.newaxis, n:n+1, ...]\n", " result, state = model(inputs)\n", " all_logits.append(logits)\n", "\n", "probabilities = tf.nn.softmax(all_logits, axis=-1)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:33.033116Z", "iopub.status.busy": "2022-12-14T21:56:33.032478Z", "iopub.status.idle": "2022-12-14T21:56:33.039179Z", "shell.execute_reply": "2022-12-14T21:56:33.038502Z" }, "id": "B7UtHoSWcOT2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "miniature schnauzer : 0.427\n", "corkscrew : 0.134\n", "miniature poodle : 0.056\n", "church : 0.053\n", "fly : 0.039\n" ] } ], "source": [ "for label, p in get_top_k(probabilities[-1]):\n", " print(f'{label:20s}: {p:.3f}')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:33.042393Z", "iopub.status.busy": "2022-12-14T21:56:33.041863Z", "iopub.status.idle": "2022-12-14T21:56:33.198798Z", "shell.execute_reply": "2022-12-14T21:56:33.198060Z" }, "id": "6ffV3NhZcsrv" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwXUlEQVR4nO3df1RUdcLH8c8AAooKCgGiKP6oyB8pSpKapkcKrUez3cpcQzNr233UVLLSfTZNd4tsn3XNZHUlM2st7YdZa62bkpqWpUGU1vobxDRANAFREWfu80fHeXYCbW7OMEP3/TpnznG+c++dz9xTzOfc+517bYZhGAIAALCQAF8HAAAAqG8UIAAAYDkUIAAAYDkUIAAAYDkUIAAAYDkUIAAAYDkUIAAAYDlBvg7gjxwOh44ePapmzZrJZrP5Og4AAHCDYRiqrKxUXFycAgIufYyHAlSHo0ePKj4+3tcxAADAT3D48GG1adPmkstQgOrQrFkzSd/vwObNm/s4DQAAcEdFRYXi4+Od3+OXQgGqw4XTXs2bN6cAAQDQwLgzfYVJ0AAAwHL8ogBlZWUpISFBoaGhSklJ0fbt291ab+XKlbLZbBoxYoTL+L333iubzebyGDJkiBeSAwCAhsjnBWjVqlXKyMjQrFmzlJeXp+7duystLU2lpaWXXK+wsFDTpk1T//7963x9yJAh+vbbb52PV1991RvxAQBAA+TzAjRv3jw98MADGjdunDp37qzFixerSZMmeuGFFy66jt1u1+jRozV79mx16NChzmVCQkIUGxvrfLRo0cJbHwEAADQwPi1A586dU25urlJTU51jAQEBSk1N1bZt2y663pw5cxQdHa3x48dfdJlNmzYpOjpaV199tX7729/q+PHjF122urpaFRUVLg8AAPDz5dMCVFZWJrvdrpiYGJfxmJgYFRcX17nO1q1btXTpUmVnZ190u0OGDNFLL72knJwczZ07V5s3b9bQoUNlt9vrXD4zM1Ph4eHOB9cAAgDg561B/Qy+srJS6enpys7OVlRU1EWXu/vuu53/7tatm6699lp17NhRmzZt0uDBg2stP2PGDGVkZDifX7iOAAAA+HnyaQGKiopSYGCgSkpKXMZLSkoUGxtba/kDBw6osLBQw4YNc445HA5JUlBQkPbs2aOOHTvWWq9Dhw6KiorS/v376yxAISEhCgkJudyPAwAAGgifngILDg5Wr169lJOT4xxzOBzKyclRnz59ai2fmJionTt3Kj8/3/kYPny4Bg0apPz8/Isetfnmm290/PhxtWrVymufBQAANBw+PwWWkZGhsWPHKjk5Wb1799b8+fNVVVWlcePGSZLGjBmj1q1bKzMzU6GhoeratavL+hEREZLkHD916pRmz56tX/7yl4qNjdWBAwf06KOPqlOnTkpLS6vXzwYAAPyTzwvQyJEjdezYMc2cOVPFxcXq0aOH1q1b55wYXVRU9KN3dP1PgYGB+vLLL7V8+XKdPHlScXFxuvnmm/WHP/yB01wAAECSZDMMw/B1CH9TUVGh8PBwlZeXcy8wAAAaCDPf3z6/ECIAAEB9owABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADLoQABAADL8YsClJWVpYSEBIWGhiolJUXbt293a72VK1fKZrNpxIgRF13mN7/5jWw2m+bPn++ZsAAAoMHzeQFatWqVMjIyNGvWLOXl5al79+5KS0tTaWnpJdcrLCzUtGnT1L9//4su89Zbb+mTTz5RXFycp2MDAIAGzOcFaN68eXrggQc0btw4de7cWYsXL1aTJk30wgsvXHQdu92u0aNHa/bs2erQoUOdyxw5ckSTJk3SihUr1KhRI2/FBwAADZBPC9C5c+eUm5ur1NRU51hAQIBSU1O1bdu2i643Z84cRUdHa/z4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JUuWaPTo0R4JBQAA4E2m5wBJ30+Cfv/993X99ddLkj799FMVFRVpzJgxysjIcC43b948z6QEAADwINMFaNeuXerZs6ck6cCBA5KkqKgoRUVFadeuXc7lbDabhyICAAB4lukCtHHjRm/kAAAAqDeXdSFEAACAhogCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALIcCBAAALMfnBSgrK0sJCQkKDQ1VSkqKtm/f7tZ6K1eulM1m04gRI1zGV69erZtvvlmRkZGy2WzKz8/3fGgAANCg+bQArVq1ShkZGZo1a5by8vLUvXt3paWlqbS09JLrFRYWatq0aerfv3+t16qqqnTDDTdo7ty53ooNAAAaOJthGIav3jwlJUXXXXedFi5cKElyOByKj4/XpEmTNH369DrXsdvtGjBggO677z5t2bJFJ0+e1Jo1a2otV1hYqPbt2+vzzz9Xjx49Lpmjurpa1dXVzucVFRWKj49XeXm5mjdv/pM/HwAAqD8VFRUKDw936/vbZ0eAzp07p9zcXKWmpv5/mIAApaamatu2bRddb86cOYqOjtb48eM9liUzM1Ph4eHOR3x8vMe2DQAA/I/PClBZWZnsdrtiYmJcxmNiYlRcXFznOlu3btXSpUuVnZ3t0SwzZsxQeXm583H48GGPbh8AAPiXIF8HcFdlZaXS09OVnZ2tqKgoj247JCREISEhHt0mAADwXz4rQFFRUQoMDFRJSYnLeElJiWJjY2stf+DAARUWFmrYsGHOMYfDIUkKCgrSnj171LFjR++GBgAAPws+OwUWHBysXr16KScnxznmcDiUk5OjPn361Fo+MTFRO3fuVH5+vvMxfPhwDRo0SPn5+czbAQAAbvPpKbCMjAyN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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "id = tf.argmax(probabilities[-1])\n", "plt.plot(probabilities[:, id])\n", "plt.xlabel('Frame #')\n", "plt.ylabel(f\"p('{KINETICS_600_LABELS[id]}')\");" ] }, { "cell_type": "markdown", "metadata": { "id": "d7MZ_AfRW845" }, "source": [ "`base` 모델을 실행한 이전 섹션보다 최종 확률이 훨씬 더 확실하다는 것을 알 수 있습니다. `base` 모델은 전체 프레임에 대한 예측의 평균을 반환합니다." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:33.202770Z", "iopub.status.busy": "2022-12-14T21:56:33.202131Z", "iopub.status.idle": "2022-12-14T21:56:33.210450Z", "shell.execute_reply": "2022-12-14T21:56:33.209733Z" }, "id": "0Wij4tsyW8dR" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "miniature schnauzer : 0.427\n", "corkscrew : 0.134\n", "miniature poodle : 0.056\n", "church : 0.053\n", "fly : 0.039\n" ] } ], "source": [ "for label, p in get_top_k(tf.reduce_mean(probabilities, axis=0)):\n", " print(f'{label:20s}: {p:.3f}')" ] }, { "cell_type": "markdown", "metadata": { "id": "qLUoC9ejggGo" }, "source": [ "## 시간 경과에 따른 예측 애니메이션\n", "\n", "이전 섹션에서는 이러한 모델을 사용하는 방법에 대해 자세히 설명했습니다. 이 섹션은 이를 바탕으로 멋진 추론 애니메이션을 생성합니다. " ] }, { "cell_type": "markdown", "metadata": { "id": "OnFqOXazoWgy" }, "source": [ "아래의 숨겨진 셀은 이 섹션에서 사용되는 도우미 함수를 정의합니다." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-14T21:56:33.214428Z", "iopub.status.busy": "2022-12-14T21:56:33.213970Z", "iopub.status.idle": "2022-12-14T21:56:33.231787Z", "shell.execute_reply": "2022-12-14T21:56:33.231114Z" }, "id": "dx55NK3ZoZeh" }, "outputs": [], "source": [ "#@title\n", "# Get top_k labels and probabilities predicted using MoViNets streaming model\n", "def get_top_k_streaming_labels(probs, k=5, label_map=KINETICS_600_LABELS):\n", " \"\"\"Returns the top-k labels over an entire video sequence.\n", "\n", " Args:\n", " probs: probability tensor of shape (num_frames, num_classes) that represents\n", " the probability of each class on each frame.\n", " k: the number of top predictions to select.\n", " label_map: a list of labels to map logit indices to label strings.\n", "\n", " Returns:\n", " a tuple of the top-k probabilities, labels, and logit indices\n", " \"\"\"\n", " top_categories_last = tf.argsort(probs, -1, 'DESCENDING')[-1, :1]\n", " # Sort predictions to find top_k\n", " categories = tf.argsort(probs, -1, 'DESCENDING')[:, :k]\n", " categories = tf.reshape(categories, [-1])\n", "\n", " counts = sorted([\n", " (i.numpy(), tf.reduce_sum(tf.cast(categories == i, tf.int32)).numpy())\n", " for i in tf.unique(categories)[0]\n", " ], key=lambda x: x[1], reverse=True)\n", "\n", " top_probs_idx = tf.constant([i for i, _ in counts[:k]])\n", " top_probs_idx = tf.concat([top_categories_last, top_probs_idx], 0)\n", " # find unique indices of categories\n", " top_probs_idx = tf.unique(top_probs_idx)[0][:k+1]\n", " # top_k probabilities of the predictions\n", " top_probs = tf.gather(probs, top_probs_idx, axis=-1)\n", " top_probs = tf.transpose(top_probs, perm=(1, 0))\n", " # collect the labels of top_k predictions\n", " top_labels = tf.gather(label_map, top_probs_idx, axis=0)\n", " # decode the top_k labels\n", " top_labels = [label.decode('utf8') for label in top_labels.numpy()]\n", "\n", " return top_probs, top_labels, top_probs_idx\n", "\n", "# Plot top_k predictions at a given time step\n", "def plot_streaming_top_preds_at_step(\n", " top_probs,\n", " top_labels,\n", " step=None,\n", " image=None,\n", " legend_loc='lower left',\n", " duration_seconds=10,\n", " figure_height=500,\n", " playhead_scale=0.8,\n", " grid_alpha=0.3):\n", " \"\"\"Generates a plot of the top video model predictions at a given time step.\n", "\n", " Args:\n", " top_probs: a tensor of shape (k, num_frames) representing the top-k\n", " probabilities over all frames.\n", " top_labels: a list of length k that represents the top-k label strings.\n", " step: the current time step in the range [0, num_frames].\n", " image: the image frame to display at the current time step.\n", " legend_loc: the placement location of the legend.\n", " duration_seconds: the total duration of the video.\n", " figure_height: the output figure height.\n", " playhead_scale: scale value for the playhead.\n", " grid_alpha: alpha value for the gridlines.\n", "\n", " Returns:\n", " A tuple of the output numpy image, figure, and axes.\n", " \"\"\"\n", " # find number of top_k labels and frames in the video\n", " num_labels, num_frames = top_probs.shape\n", " if step is None:\n", " step = num_frames\n", " # Visualize frames and top_k probabilities of streaming video\n", " fig = plt.figure(figsize=(6.5, 7), dpi=300)\n", " gs = mpl.gridspec.GridSpec(8, 1)\n", " ax2 = plt.subplot(gs[:-3, :])\n", " ax = plt.subplot(gs[-3:, :])\n", " # display the frame\n", " if image is not None:\n", " ax2.imshow(image, interpolation='nearest')\n", " ax2.axis('off')\n", " # x-axis (frame number)\n", " preview_line_x = tf.linspace(0., duration_seconds, num_frames)\n", " # y-axis (top_k probabilities)\n", " preview_line_y = top_probs\n", "\n", " line_x = preview_line_x[:step+1]\n", " line_y = preview_line_y[:, :step+1]\n", "\n", " for i in range(num_labels):\n", " ax.plot(preview_line_x, preview_line_y[i], label=None, linewidth='1.5',\n", " linestyle=':', color='gray')\n", " ax.plot(line_x, line_y[i], label=top_labels[i], linewidth='2.0')\n", "\n", "\n", " ax.grid(which='major', linestyle=':', linewidth='1.0', alpha=grid_alpha)\n", " ax.grid(which='minor', linestyle=':', linewidth='0.5', alpha=grid_alpha)\n", "\n", " min_height = tf.reduce_min(top_probs) * playhead_scale\n", " max_height = tf.reduce_max(top_probs)\n", " ax.vlines(preview_line_x[step], min_height, max_height, colors='red')\n", " ax.scatter(preview_line_x[step], max_height, color='red')\n", "\n", " ax.legend(loc=legend_loc)\n", "\n", " plt.xlim(0, duration_seconds)\n", " plt.ylabel('Probability')\n", " plt.xlabel('Time (s)')\n", " plt.yscale('log')\n", "\n", " fig.tight_layout()\n", " fig.canvas.draw()\n", "\n", " data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)\n", " data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))\n", " plt.close()\n", "\n", " figure_width = int(figure_height * data.shape[1] / data.shape[0])\n", " image = PIL.Image.fromarray(data).resize([figure_width, figure_height])\n", " image = np.array(image)\n", "\n", " return image\n", "\n", "# Plotting top_k predictions from MoViNets streaming model\n", "def plot_streaming_top_preds(\n", " probs,\n", " video,\n", " top_k=5,\n", " video_fps=25.,\n", " figure_height=500,\n", " use_progbar=True):\n", " \"\"\"Generates a video plot of the top video model predictions.\n", "\n", " Args:\n", " probs: probability tensor of shape (num_frames, num_classes) that represents\n", " the probability of each class on each frame.\n", " video: the video to display in the plot.\n", " top_k: the number of top predictions to select.\n", " video_fps: the input video fps.\n", " figure_fps: the output video fps.\n", " figure_height: the height of the output video.\n", " use_progbar: display a progress bar.\n", "\n", " Returns:\n", " A numpy array representing the output video.\n", " \"\"\"\n", " # select number of frames per second\n", " video_fps = 8.\n", " # select height of the image\n", " figure_height = 500\n", " # number of time steps of the given video\n", " steps = video.shape[0]\n", " # estimate duration of the video (in seconds)\n", " duration = steps / video_fps\n", " # estiamte top_k probabilities and corresponding labels\n", " top_probs, top_labels, _ = get_top_k_streaming_labels(probs, k=top_k)\n", "\n", " images = []\n", " step_generator = tqdm.trange(steps) if use_progbar else range(steps)\n", " for i in step_generator:\n", " image = plot_streaming_top_preds_at_step(\n", " top_probs=top_probs,\n", " top_labels=top_labels,\n", " step=i,\n", " image=video[i],\n", " duration_seconds=duration,\n", " figure_height=figure_height,\n", " )\n", " images.append(image)\n", "\n", " return np.array(images)" ] }, { "cell_type": "markdown", "metadata": { "id": "eLgFBslcZOQO" }, "source": [ "비디오 프레임에서 스트리밍 모델을 실행하고 로짓을 수집하여 시작합니다." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:33.235232Z", "iopub.status.busy": "2022-12-14T21:56:33.234772Z", "iopub.status.idle": "2022-12-14T21:56:33.491851Z", "shell.execute_reply": "2022-12-14T21:56:33.490928Z" }, "id": "tXWR13wthnK5" }, "outputs": [], "source": [ "init_states = model.init_states(jumpingjack[tf.newaxis].shape)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:56:33.495901Z", "iopub.status.busy": "2022-12-14T21:56:33.495617Z", "iopub.status.idle": "2022-12-14T21:56:34.014083Z", "shell.execute_reply": "2022-12-14T21:56:34.013379Z" }, "id": "YqSkt7l8ltwt" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\r", " 0%| | 0/13 [00:00" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# For gif format, set codec='gif'\n", "media.show_video(plot_video, fps=3)" ] }, { "cell_type": "markdown", "metadata": { "id": "LCImgZ3OdJw7" }, "source": [ "## 리소스\n", "\n", "사전 훈련된 모델은 [TF Hub](https://tfhub.dev/google/collections/movinet/1)에서 사용할 수 있습니다. TF Hub 컬렉션에는 [TFLite](https://tensorflow.org/lite)에 최적화된 양자화된 모델도 포함되어 있습니다.\n", "\n", "이러한 모델의 소스는 [TensorFlow Model Garden](https://github.com/tensorflow/models/tree/master/official/projects/movinet)에서 제공합니다. 여기에는 MoViNet 모델 구축 및 미세 조정에 대한 내용도 담긴 [이 튜토리얼의 상세 버전](https://colab.sandbox.google.com/github/tensorflow/models/blob/master/official/projects/movinet/movinet_tutorial.ipynb)이 포함됩니다. " ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "movinet.ipynb", "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "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.9.16" } }, "nbformat": 4, "nbformat_minor": 0 }