Image-Text Semantic Matching with AutoMM

Open In Colab Open In SageMaker Studio Lab

Vision and language are two important aspects of human intelligence to understand the real world. Image-text semantic matching, measuring the visual-semantic similarity between image and text, plays a critical role in bridging the vision and language. Learning a joint space where text and image feature vectors are aligned is a typical solution for image-text matching. It is becoming increasingly significant for various vision-and-language tasks, such as cross-modal retrieval, image captioning, text-to-image synthesis, and multimodal neural machine translation. This tutorial will introduce how to apply AutoMM to the image-text matching task.

import os
import warnings
from IPython.display import Image, display
import numpy as np
warnings.filterwarnings('ignore')
np.random.seed(123)

Dataset

In this tutorial, we will use the Flickr30K dataset to demonstrate the image-text matching. The Flickr30k dataset is a popular benchmark for sentence-based picture portrayal. The dataset is comprised of 31,783 images that capture people engaged in everyday activities and events. Each image has a descriptive caption. We organized the dataset using pandas dataframe. To get started, Let’s download the dataset.

from autogluon.core.utils.loaders import load_pd
import pandas as pd
download_dir = './ag_automm_tutorial_imgtxt'
zip_file = 'https://automl-mm-bench.s3.amazonaws.com/flickr30k.zip'
from autogluon.core.utils.loaders import load_zip
load_zip.unzip(zip_file, unzip_dir=download_dir)
Downloading ./ag_automm_tutorial_imgtxt/file.zip from https://automl-mm-bench.s3.amazonaws.com/flickr30k.zip...
  0%|          | 0.00/4.38G [00:00<?, ?iB/s]
  0%|          | 6.63M/4.38G [00:00<01:27, 49.9MiB/s]
  0%|          | 11.6M/4.38G [00:00<02:05, 34.7MiB/s]
  0%|          | 15.4M/4.38G [00:00<02:58, 24.5MiB/s]
  0%|          | 18.1M/4.38G [00:00<03:09, 23.0MiB/s]
  1%|          | 23.4M/4.38G [00:00<02:45, 26.3MiB/s]
  1%|          | 26.1M/4.38G [00:00<02:48, 25.9MiB/s]
  1%|          | 33.5M/4.38G [00:01<02:33, 28.3MiB/s]
  1%|          | 41.9M/4.38G [00:01<02:17, 31.5MiB/s]
  1%|          | 45.9M/4.38G [00:01<02:11, 33.0MiB/s]
  1%|          | 49.2M/4.38G [00:01<02:17, 31.6MiB/s]
  1%|          | 52.4M/4.38G [00:01<02:26, 29.5MiB/s]
  1%|▏         | 57.0M/4.38G [00:01<02:22, 30.4MiB/s]
  1%|▏         | 60.0M/4.38G [00:02<02:23, 30.0MiB/s]
  2%|▏         | 67.1M/4.38G [00:02<02:02, 35.2MiB/s]
  2%|▏         | 74.1M/4.38G [00:02<01:38, 43.6MiB/s]
  2%|▏         | 78.7M/4.38G [00:02<02:00, 35.8MiB/s]
  2%|▏         | 82.6M/4.38G [00:02<02:04, 34.6MiB/s]
  2%|▏         | 86.2M/4.38G [00:02<02:20, 30.5MiB/s]
  2%|▏         | 92.3M/4.38G [00:02<02:26, 29.3MiB/s]
  2%|▏         | 98.9M/4.38G [00:03<02:19, 30.6MiB/s]
  2%|▏         | 102M/4.38G [00:03<02:20, 30.5MiB/s]
  2%|▏         | 107M/4.38G [00:03<02:19, 30.6MiB/s]
  3%|▎         | 110M/4.38G [00:03<02:26, 29.2MiB/s]
  3%|▎         | 117M/4.38G [00:03<01:57, 36.4MiB/s]
  3%|▎         | 124M/4.38G [00:03<01:54, 37.2MiB/s]
  3%|▎         | 128M/4.38G [00:04<02:12, 32.1MiB/s]
  3%|▎         | 132M/4.38G [00:04<02:34, 27.5MiB/s]
  3%|▎         | 135M/4.38G [00:04<02:41, 26.3MiB/s]
  3%|▎         | 143M/4.38G [00:04<02:55, 24.1MiB/s]
  3%|▎         | 151M/4.38G [00:04<02:21, 29.9MiB/s]
  4%|▎         | 158M/4.38G [00:05<02:10, 32.5MiB/s]
  4%|▎         | 161M/4.38G [00:05<02:31, 27.9MiB/s]
  4%|▍         | 166M/4.38G [00:05<02:24, 29.1MiB/s]
  4%|▍         | 169M/4.38G [00:05<02:46, 25.2MiB/s]
  4%|▍         | 174M/4.38G [00:05<02:28, 28.3MiB/s]
  4%|▍         | 177M/4.38G [00:05<02:37, 26.7MiB/s]
  4%|▍         | 180M/4.38G [00:06<03:36, 19.4MiB/s]
  4%|▍         | 183M/4.38G [00:06<03:40, 19.0MiB/s]
  4%|▍         | 185M/4.38G [00:06<04:14, 16.5MiB/s]
  4%|▍         | 191M/4.38G [00:06<03:25, 20.4MiB/s]
  4%|▍         | 193M/4.38G [00:06<03:42, 18.8MiB/s]
  5%|▍         | 201M/4.38G [00:07<02:49, 24.7MiB/s]
  5%|▍         | 208M/4.38G [00:07<03:18, 21.0MiB/s]
  5%|▍         | 212M/4.38G [00:07<02:56, 23.6MiB/s]
  5%|▍         | 218M/4.38G [00:07<02:36, 26.7MiB/s]
  5%|▌         | 226M/4.38G [00:07<01:56, 35.8MiB/s]
  5%|▌         | 230M/4.38G [00:08<02:00, 34.5MiB/s]
  5%|▌         | 235M/4.38G [00:08<02:09, 32.0MiB/s]
  6%|▌         | 242M/4.38G [00:08<01:57, 35.2MiB/s]
  6%|▌         | 246M/4.38G [00:08<02:11, 31.4MiB/s]
  6%|▌         | 252M/4.38G [00:08<02:03, 33.4MiB/s]
  6%|▌         | 258M/4.38G [00:08<01:42, 40.2MiB/s]
  6%|▌         | 263M/4.38G [00:09<02:09, 31.9MiB/s]
  6%|▌         | 268M/4.38G [00:09<01:55, 35.6MiB/s]
  6%|▌         | 272M/4.38G [00:09<02:00, 34.1MiB/s]
  6%|▋         | 276M/4.38G [00:09<02:25, 28.1MiB/s]
  6%|▋         | 279M/4.38G [00:09<02:30, 27.2MiB/s]
  7%|▋         | 285M/4.38G [00:09<02:08, 32.0MiB/s]
  7%|▋         | 288M/4.38G [00:09<02:15, 30.2MiB/s]
  7%|▋         | 294M/4.38G [00:10<02:14, 30.5MiB/s]
  7%|▋         | 300M/4.38G [00:10<02:05, 32.6MiB/s]
  7%|▋         | 304M/4.38G [00:10<02:21, 28.9MiB/s]
  7%|▋         | 309M/4.38G [00:10<02:32, 26.7MiB/s]
  7%|▋         | 311M/4.38G [00:10<02:49, 23.9MiB/s]
  7%|▋         | 317M/4.38G [00:10<02:13, 30.5MiB/s]
  7%|▋         | 320M/4.38G [00:11<02:34, 26.2MiB/s]
  7%|▋         | 325M/4.38G [00:11<02:11, 30.8MiB/s]
  8%|▊         | 329M/4.38G [00:11<02:18, 29.2MiB/s]
  8%|▊         | 334M/4.38G [00:11<02:27, 27.5MiB/s]
  8%|▊         | 337M/4.38G [00:11<02:41, 25.0MiB/s]
  8%|▊         | 344M/4.38G [00:11<02:24, 28.0MiB/s]
  8%|▊         | 351M/4.38G [00:11<01:56, 34.5MiB/s]
  8%|▊         | 354M/4.38G [00:12<02:08, 31.4MiB/s]
  8%|▊         | 359M/4.38G [00:12<02:05, 32.1MiB/s]
  8%|▊         | 362M/4.38G [00:12<02:23, 28.1MiB/s]
  8%|▊         | 367M/4.38G [00:12<02:13, 30.0MiB/s]
  8%|▊         | 370M/4.38G [00:12<02:42, 24.7MiB/s]
  9%|▊         | 376M/4.38G [00:12<02:31, 26.4MiB/s]
  9%|▊         | 378M/4.38G [00:13<02:59, 22.3MiB/s]
  9%|▉         | 384M/4.38G [00:13<02:17, 29.1MiB/s]
  9%|▉         | 388M/4.38G [00:13<02:17, 29.0MiB/s]
  9%|▉         | 391M/4.38G [00:13<02:59, 22.3MiB/s]
  9%|▉         | 394M/4.38G [00:13<02:59, 22.2MiB/s]
  9%|▉         | 401M/4.38G [00:13<02:20, 28.4MiB/s]
  9%|▉         | 404M/4.38G [00:14<02:41, 24.6MiB/s]
  9%|▉         | 409M/4.38G [00:14<03:48, 17.4MiB/s]
  9%|▉         | 411M/4.38G [00:14<03:58, 16.6MiB/s]
 10%|▉         | 419M/4.38G [00:14<03:03, 21.6MiB/s]
 10%|▉         | 426M/4.38G [00:15<02:37, 25.1MiB/s]
 10%|▉         | 429M/4.38G [00:15<02:38, 24.9MiB/s]
 10%|▉         | 436M/4.38G [00:15<01:58, 33.4MiB/s]
 10%|█         | 443M/4.38G [00:15<01:53, 34.7MiB/s]
 10%|█         | 447M/4.38G [00:15<02:07, 30.8MiB/s]
 10%|█         | 451M/4.38G [00:15<02:06, 31.0MiB/s]
 10%|█         | 454M/4.38G [00:16<02:18, 28.3MiB/s]
 11%|█         | 461M/4.38G [00:16<02:03, 31.8MiB/s]
 11%|█         | 468M/4.38G [00:16<01:44, 37.5MiB/s]
 11%|█         | 472M/4.38G [00:16<02:01, 32.1MiB/s]
 11%|█         | 478M/4.38G [00:16<01:52, 34.8MiB/s]
 11%|█         | 487M/4.38G [00:16<01:35, 40.6MiB/s]
 11%|█▏        | 493M/4.38G [00:16<01:31, 42.4MiB/s]
 11%|█▏        | 498M/4.38G [00:17<01:43, 37.4MiB/s]
 11%|█▏        | 503M/4.38G [00:17<01:46, 36.3MiB/s]
 12%|█▏        | 510M/4.38G [00:17<01:42, 38.0MiB/s]
 12%|█▏        | 514M/4.38G [00:17<01:46, 36.2MiB/s]
 12%|█▏        | 519M/4.38G [00:17<01:49, 35.2MiB/s]
 12%|█▏        | 522M/4.38G [00:17<01:56, 33.2MiB/s]
 12%|█▏        | 528M/4.38G [00:18<02:06, 30.5MiB/s]
 12%|█▏        | 532M/4.38G [00:18<02:26, 26.2MiB/s]
 12%|█▏        | 537M/4.38G [00:18<02:17, 28.0MiB/s]
 12%|█▏        | 545M/4.38G [00:18<01:41, 37.9MiB/s]
 13%|█▎        | 549M/4.38G [00:18<01:47, 35.6MiB/s]
 13%|█▎        | 553M/4.38G [00:18<01:54, 33.5MiB/s]
 13%|█▎        | 556M/4.38G [00:18<02:01, 31.4MiB/s]
 13%|█▎        | 560M/4.38G [00:19<01:57, 32.4MiB/s]
 13%|█▎        | 564M/4.38G [00:19<01:59, 32.1MiB/s]
 13%|█▎        | 569M/4.38G [00:19<02:27, 25.9MiB/s]
 13%|█▎        | 572M/4.38G [00:19<02:30, 25.4MiB/s]
 13%|█▎        | 579M/4.38G [00:19<02:02, 31.1MiB/s]
 13%|█▎        | 585M/4.38G [00:19<01:44, 36.4MiB/s]
 13%|█▎        | 589M/4.38G [00:19<01:46, 35.5MiB/s]
 14%|█▎        | 594M/4.38G [00:20<01:55, 32.8MiB/s]
 14%|█▎        | 597M/4.38G [00:20<02:09, 29.2MiB/s]
 14%|█▍        | 603M/4.38G [00:20<01:54, 32.9MiB/s]
 14%|█▍        | 606M/4.38G [00:20<02:21, 26.7MiB/s]
 14%|█▍        | 611M/4.38G [00:20<02:29, 25.2MiB/s]
 14%|█▍        | 613M/4.38G [00:20<02:40, 23.5MiB/s]
 14%|█▍        | 619M/4.38G [00:21<02:09, 29.1MiB/s]
 14%|█▍        | 622M/4.38G [00:21<02:22, 26.5MiB/s]
 14%|█▍        | 629M/4.38G [00:21<02:10, 28.8MiB/s]
 15%|█▍        | 636M/4.38G [00:21<01:52, 33.3MiB/s]
 15%|█▍        | 640M/4.38G [00:21<02:00, 31.1MiB/s]
 15%|█▍        | 644M/4.38G [00:22<02:54, 21.4MiB/s]
 15%|█▍        | 647M/4.38G [00:22<02:44, 22.7MiB/s]
 15%|█▍        | 654M/4.38G [00:22<02:01, 30.7MiB/s]
 15%|█▌        | 658M/4.38G [00:22<02:05, 29.8MiB/s]
 15%|█▌        | 663M/4.38G [00:22<02:23, 26.0MiB/s]
 15%|█▌        | 671M/4.38G [00:22<01:40, 36.9MiB/s]
 15%|█▌        | 676M/4.38G [00:22<01:39, 37.3MiB/s]
 16%|█▌        | 680M/4.38G [00:23<01:55, 32.1MiB/s]
 16%|█▌        | 686M/4.38G [00:23<01:37, 37.9MiB/s]
 16%|█▌        | 691M/4.38G [00:23<01:39, 37.0MiB/s]
 16%|█▌        | 696M/4.38G [00:23<01:48, 34.0MiB/s]
 16%|█▌        | 704M/4.38G [00:23<01:24, 43.8MiB/s]
 16%|█▌        | 709M/4.38G [00:23<01:26, 42.3MiB/s]
 16%|█▋        | 714M/4.38G [00:24<02:10, 28.2MiB/s]
 16%|█▋        | 721M/4.38G [00:24<01:58, 30.9MiB/s]
 17%|█▋        | 728M/4.38G [00:24<01:44, 35.1MiB/s]
 17%|█▋        | 732M/4.38G [00:24<01:53, 32.2MiB/s]
 17%|█▋        | 738M/4.38G [00:24<01:39, 36.6MiB/s]
 17%|█▋        | 745M/4.38G [00:24<01:45, 34.4MiB/s]
 17%|█▋        | 749M/4.38G [00:25<01:52, 32.3MiB/s]
 17%|█▋        | 753M/4.38G [00:25<02:42, 22.3MiB/s]
 17%|█▋        | 756M/4.38G [00:25<02:59, 20.2MiB/s]
 17%|█▋        | 762M/4.38G [00:25<02:27, 24.5MiB/s]
 17%|█▋        | 764M/4.38G [00:25<02:42, 22.2MiB/s]
 18%|█▊        | 770M/4.38G [00:26<02:14, 26.9MiB/s]
 18%|█▊        | 773M/4.38G [00:26<02:24, 25.0MiB/s]
 18%|█▊        | 778M/4.38G [00:26<02:38, 22.8MiB/s]
 18%|█▊        | 781M/4.38G [00:26<02:45, 21.8MiB/s]
 18%|█▊        | 787M/4.38G [00:26<02:19, 25.7MiB/s]
 18%|█▊        | 789M/4.38G [00:26<02:23, 25.0MiB/s]
 18%|█▊        | 795M/4.38G [00:27<02:19, 25.8MiB/s]
 18%|█▊        | 798M/4.38G [00:27<02:26, 24.4MiB/s]
 18%|█▊        | 804M/4.38G [00:27<01:59, 30.1MiB/s]
 18%|█▊        | 807M/4.38G [00:27<02:18, 25.9MiB/s]
 19%|█▊        | 814M/4.38G [00:27<01:58, 30.0MiB/s]
 19%|█▊        | 821M/4.38G [00:27<01:41, 34.9MiB/s]
 19%|█▉        | 824M/4.38G [00:28<01:54, 30.9MiB/s]
 19%|█▉        | 830M/4.38G [00:28<01:44, 34.1MiB/s]
 19%|█▉        | 837M/4.38G [00:28<01:34, 37.6MiB/s]
 19%|█▉        | 841M/4.38G [00:28<01:39, 35.5MiB/s]
 19%|█▉        | 847M/4.38G [00:28<01:56, 30.4MiB/s]
 20%|█▉        | 856M/4.38G [00:28<01:35, 36.9MiB/s]
 20%|█▉        | 863M/4.38G [00:29<01:21, 43.3MiB/s]
 20%|█▉        | 867M/4.38G [00:29<01:31, 38.5MiB/s]
 20%|█▉        | 872M/4.38G [00:29<01:53, 30.9MiB/s]
 20%|█▉        | 875M/4.38G [00:29<02:44, 21.4MiB/s]
 20%|██        | 881M/4.38G [00:29<02:21, 24.7MiB/s]
 20%|██        | 887M/4.38G [00:30<01:52, 30.9MiB/s]
 20%|██        | 891M/4.38G [00:30<01:57, 29.7MiB/s]
 20%|██        | 896M/4.38G [00:30<02:02, 28.4MiB/s]
 21%|██        | 899M/4.38G [00:30<02:01, 28.6MiB/s]
 21%|██        | 904M/4.38G [00:30<02:36, 22.2MiB/s]
 21%|██        | 907M/4.38G [00:31<03:00, 19.2MiB/s]
 21%|██        | 913M/4.38G [00:31<02:32, 22.7MiB/s]
 21%|██        | 915M/4.38G [00:31<02:46, 20.8MiB/s]
 21%|██        | 921M/4.38G [00:31<02:05, 27.6MiB/s]
 21%|██        | 924M/4.38G [00:31<02:21, 24.4MiB/s]
 21%|██▏       | 931M/4.38G [00:31<01:57, 29.4MiB/s]
 21%|██▏       | 938M/4.38G [00:32<02:35, 22.1MiB/s]
 21%|██▏       | 940M/4.38G [00:32<02:44, 20.9MiB/s]
 22%|██▏       | 948M/4.38G [00:32<02:07, 26.9MiB/s]
 22%|██▏       | 956M/4.38G [00:32<01:38, 34.8MiB/s]
 22%|██▏       | 964M/4.38G [00:32<01:34, 36.0MiB/s]
 22%|██▏       | 968M/4.38G [00:33<01:48, 31.5MiB/s]
 22%|██▏       | 972M/4.38G [00:33<01:47, 31.6MiB/s]
 22%|██▏       | 975M/4.38G [00:33<02:16, 24.9MiB/s]
 22%|██▏       | 980M/4.38G [00:33<02:05, 27.0MiB/s]
 22%|██▏       | 983M/4.38G [00:33<02:06, 26.8MiB/s]
 23%|██▎       | 988M/4.38G [00:33<01:48, 31.4MiB/s]
 23%|██▎       | 992M/4.38G [00:34<02:08, 26.5MiB/s]
 23%|██▎       | 996M/4.38G [00:34<02:16, 24.8MiB/s]
 23%|██▎       | 999M/4.38G [00:34<02:27, 22.9MiB/s]
 23%|██▎       | 1.01G/4.38G [00:34<01:35, 35.1MiB/s]
 23%|██▎       | 1.01G/4.38G [00:34<01:47, 31.5MiB/s]
 23%|██▎       | 1.02G/4.38G [00:34<01:54, 29.5MiB/s]
 23%|██▎       | 1.02G/4.38G [00:34<01:27, 38.5MiB/s]
 23%|██▎       | 1.03G/4.38G [00:35<01:31, 36.8MiB/s]
 24%|██▎       | 1.03G/4.38G [00:35<01:37, 34.2MiB/s]
 24%|██▎       | 1.04G/4.38G [00:35<01:49, 30.5MiB/s]
 24%|██▎       | 1.04G/4.38G [00:35<01:43, 32.3MiB/s]
 24%|██▍       | 1.04G/4.38G [00:35<02:06, 26.4MiB/s]
 24%|██▍       | 1.05G/4.38G [00:35<01:54, 29.0MiB/s]
 24%|██▍       | 1.05G/4.38G [00:36<02:30, 22.2MiB/s]
 24%|██▍       | 1.06G/4.38G [00:36<02:01, 27.3MiB/s]
 24%|██▍       | 1.06G/4.38G [00:36<02:37, 21.0MiB/s]
 24%|██▍       | 1.07G/4.38G [00:36<02:47, 19.7MiB/s]
 24%|██▍       | 1.07G/4.38G [00:36<02:10, 25.4MiB/s]
 25%|██▍       | 1.08G/4.38G [00:37<02:11, 25.0MiB/s]
 25%|██▍       | 1.08G/4.38G [00:37<01:59, 27.6MiB/s]
 25%|██▍       | 1.09G/4.38G [00:37<01:54, 28.7MiB/s]
 25%|██▍       | 1.09G/4.38G [00:37<01:59, 27.6MiB/s]
 25%|██▌       | 1.10G/4.38G [00:37<02:24, 22.7MiB/s]
 25%|██▌       | 1.10G/4.38G [00:38<02:42, 20.1MiB/s]
 25%|██▌       | 1.11G/4.38G [00:38<02:09, 25.4MiB/s]
 25%|██▌       | 1.11G/4.38G [00:38<01:58, 27.5MiB/s]
 25%|██▌       | 1.12G/4.38G [00:38<01:50, 29.6MiB/s]
 26%|██▌       | 1.12G/4.38G [00:38<01:54, 28.6MiB/s]
 26%|██▌       | 1.12G/4.38G [00:38<01:57, 27.7MiB/s]
 26%|██▌       | 1.13G/4.38G [00:39<02:00, 27.1MiB/s]
 26%|██▌       | 1.13G/4.38G [00:39<01:57, 27.7MiB/s]
 26%|██▌       | 1.13G/4.38G [00:39<02:11, 24.7MiB/s]
 26%|██▌       | 1.14G/4.38G [00:39<01:54, 28.4MiB/s]
 26%|██▌       | 1.15G/4.38G [00:39<01:33, 34.7MiB/s]
 26%|██▋       | 1.15G/4.38G [00:39<01:44, 30.9MiB/s]
 26%|██▋       | 1.16G/4.38G [00:39<01:38, 32.7MiB/s]
 27%|██▋       | 1.16G/4.38G [00:40<01:45, 30.4MiB/s]
 27%|██▋       | 1.17G/4.38G [00:40<01:50, 29.2MiB/s]
 27%|██▋       | 1.17G/4.38G [00:40<01:44, 30.6MiB/s]
 27%|██▋       | 1.18G/4.38G [00:40<01:34, 33.9MiB/s]
 27%|██▋       | 1.18G/4.38G [00:40<01:34, 33.9MiB/s]
 27%|██▋       | 1.19G/4.38G [00:40<01:27, 36.7MiB/s]
 27%|██▋       | 1.20G/4.38G [00:41<01:17, 41.0MiB/s]
 28%|██▊       | 1.21G/4.38G [00:41<01:18, 40.6MiB/s]
 28%|██▊       | 1.21G/4.38G [00:41<01:21, 38.7MiB/s]
 28%|██▊       | 1.22G/4.38G [00:41<01:24, 37.5MiB/s]
 28%|██▊       | 1.22G/4.38G [00:41<01:32, 34.3MiB/s]
 28%|██▊       | 1.23G/4.38G [00:41<01:31, 34.5MiB/s]
 28%|██▊       | 1.23G/4.38G [00:41<01:17, 40.7MiB/s]
 28%|██▊       | 1.24G/4.38G [00:42<01:33, 33.8MiB/s]
 28%|██▊       | 1.24G/4.38G [00:42<01:55, 27.3MiB/s]
 28%|██▊       | 1.24G/4.38G [00:42<01:57, 26.7MiB/s]
 28%|██▊       | 1.25G/4.38G [00:42<02:11, 23.8MiB/s]
 29%|██▊       | 1.25G/4.38G [00:42<02:29, 20.9MiB/s]
 29%|██▊       | 1.26G/4.38G [00:43<02:03, 25.3MiB/s]
 29%|██▊       | 1.26G/4.38G [00:43<02:24, 21.6MiB/s]
 29%|██▉       | 1.26G/4.38G [00:43<02:04, 25.1MiB/s]
 29%|██▉       | 1.27G/4.38G [00:43<02:17, 22.6MiB/s]
 29%|██▉       | 1.27G/4.38G [00:43<01:42, 30.3MiB/s]
 29%|██▉       | 1.28G/4.38G [00:43<01:59, 26.0MiB/s]
 29%|██▉       | 1.28G/4.38G [00:44<01:43, 30.0MiB/s]
 29%|██▉       | 1.29G/4.38G [00:44<01:54, 26.9MiB/s]
 29%|██▉       | 1.29G/4.38G [00:44<01:42, 30.1MiB/s]
 30%|██▉       | 1.29G/4.38G [00:44<01:54, 27.0MiB/s]
 30%|██▉       | 1.30G/4.38G [00:44<01:26, 35.6MiB/s]
 30%|██▉       | 1.30G/4.38G [00:44<01:34, 32.6MiB/s]
 30%|██▉       | 1.31G/4.38G [00:44<02:01, 25.3MiB/s]
 30%|██▉       | 1.31G/4.38G [00:45<01:58, 26.0MiB/s]
 30%|███       | 1.32G/4.38G [00:45<01:46, 28.7MiB/s]
 30%|███       | 1.32G/4.38G [00:45<02:08, 23.8MiB/s]
 30%|███       | 1.32G/4.38G [00:45<01:53, 26.9MiB/s]
 30%|███       | 1.33G/4.38G [00:45<01:56, 26.3MiB/s]
 30%|███       | 1.33G/4.38G [00:45<01:30, 33.6MiB/s]
 31%|███       | 1.34G/4.38G [00:46<01:32, 32.9MiB/s]
 31%|███       | 1.34G/4.38G [00:46<02:02, 24.9MiB/s]
 31%|███       | 1.35G/4.38G [00:46<02:11, 23.1MiB/s]
 31%|███       | 1.35G/4.38G [00:46<02:13, 22.7MiB/s]
 31%|███       | 1.36G/4.38G [00:46<01:55, 26.2MiB/s]
 31%|███       | 1.36G/4.38G [00:46<02:03, 24.5MiB/s]
 31%|███       | 1.37G/4.38G [00:47<01:29, 33.5MiB/s]
 31%|███▏      | 1.37G/4.38G [00:47<01:31, 32.8MiB/s]
 31%|███▏      | 1.38G/4.38G [00:47<01:35, 31.4MiB/s]
 32%|███▏      | 1.38G/4.38G [00:47<01:18, 38.4MiB/s]
 32%|███▏      | 1.39G/4.38G [00:47<01:41, 29.5MiB/s]
 32%|███▏      | 1.39G/4.38G [00:47<01:27, 34.3MiB/s]
 32%|███▏      | 1.40G/4.38G [00:48<01:19, 37.3MiB/s]
 32%|███▏      | 1.41G/4.38G [00:48<01:18, 38.1MiB/s]
 32%|███▏      | 1.41G/4.38G [00:48<01:25, 34.9MiB/s]
 32%|███▏      | 1.42G/4.38G [00:48<01:27, 34.1MiB/s]
 32%|███▏      | 1.42G/4.38G [00:48<02:03, 23.9MiB/s]
 33%|███▎      | 1.42G/4.38G [00:48<01:50, 26.8MiB/s]
 33%|███▎      | 1.43G/4.38G [00:49<01:59, 24.8MiB/s]
 33%|███▎      | 1.43G/4.38G [00:49<02:03, 23.9MiB/s]
 33%|███▎      | 1.44G/4.38G [00:49<02:07, 23.1MiB/s]
 33%|███▎      | 1.44G/4.38G [00:49<01:59, 24.7MiB/s]
 33%|███▎      | 1.44G/4.38G [00:49<02:16, 21.5MiB/s]
 33%|███▎      | 1.45G/4.38G [00:49<01:33, 31.4MiB/s]
 33%|███▎      | 1.45G/4.38G [00:50<01:34, 31.1MiB/s]
 33%|███▎      | 1.46G/4.38G [00:50<01:24, 34.4MiB/s]
 33%|███▎      | 1.46G/4.38G [00:50<01:26, 33.6MiB/s]
 34%|███▎      | 1.47G/4.38G [00:50<01:26, 33.7MiB/s]
 34%|███▎      | 1.48G/4.38G [00:50<01:11, 40.7MiB/s]
 34%|███▍      | 1.48G/4.38G [00:50<01:18, 37.1MiB/s]
 34%|███▍      | 1.48G/4.38G [00:50<01:24, 34.1MiB/s]
 34%|███▍      | 1.49G/4.38G [00:51<01:17, 37.4MiB/s]
 34%|███▍      | 1.50G/4.38G [00:51<01:31, 31.7MiB/s]
 34%|███▍      | 1.50G/4.38G [00:51<01:26, 33.4MiB/s]
 34%|███▍      | 1.51G/4.38G [00:51<01:09, 41.2MiB/s]
 35%|███▍      | 1.52G/4.38G [00:51<00:58, 49.0MiB/s]
 35%|███▍      | 1.52G/4.38G [00:51<01:07, 42.2MiB/s]
 35%|███▍      | 1.53G/4.38G [00:51<01:14, 38.4MiB/s]
 35%|███▌      | 1.53G/4.38G [00:52<01:20, 35.4MiB/s]
 35%|███▌      | 1.54G/4.38G [00:52<01:27, 32.7MiB/s]
 35%|███▌      | 1.54G/4.38G [00:52<01:14, 38.3MiB/s]
 35%|███▌      | 1.55G/4.38G [00:52<01:18, 36.1MiB/s]
 35%|███▌      | 1.55G/4.38G [00:52<01:26, 32.8MiB/s]
 36%|███▌      | 1.56G/4.38G [00:52<01:07, 42.0MiB/s]
 36%|███▌      | 1.56G/4.38G [00:52<01:16, 36.6MiB/s]
 36%|███▌      | 1.57G/4.38G [00:53<01:17, 36.5MiB/s]
 36%|███▌      | 1.57G/4.38G [00:53<01:31, 30.7MiB/s]
 36%|███▌      | 1.58G/4.38G [00:53<01:59, 23.5MiB/s]
 36%|███▌      | 1.58G/4.38G [00:53<02:02, 22.9MiB/s]
 36%|███▌      | 1.58G/4.38G [00:53<01:34, 29.5MiB/s]
 36%|███▌      | 1.59G/4.38G [00:53<01:37, 28.8MiB/s]
 36%|███▋      | 1.59G/4.38G [00:54<01:29, 31.0MiB/s]
 36%|███▋      | 1.60G/4.38G [00:54<01:31, 30.5MiB/s]
 37%|███▋      | 1.60G/4.38G [00:54<01:33, 29.9MiB/s]
 37%|███▋      | 1.60G/4.38G [00:54<01:42, 27.1MiB/s]
 37%|███▋      | 1.61G/4.38G [00:54<01:34, 29.3MiB/s]
 37%|███▋      | 1.62G/4.38G [00:54<01:22, 33.7MiB/s]
 37%|███▋      | 1.62G/4.38G [00:55<01:40, 27.6MiB/s]
 37%|███▋      | 1.63G/4.38G [00:55<01:45, 26.2MiB/s]
 37%|███▋      | 1.63G/4.38G [00:55<01:59, 23.1MiB/s]
 37%|███▋      | 1.63G/4.38G [00:55<01:59, 23.0MiB/s]
 37%|███▋      | 1.64G/4.38G [00:55<02:11, 20.8MiB/s]
 38%|███▊      | 1.64G/4.38G [00:56<01:53, 24.0MiB/s]
 38%|███▊      | 1.65G/4.38G [00:56<02:06, 21.6MiB/s]
 38%|███▊      | 1.65G/4.38G [00:56<02:14, 20.3MiB/s]
 38%|███▊      | 1.66G/4.38G [00:56<01:50, 24.7MiB/s]
 38%|███▊      | 1.66G/4.38G [00:56<01:57, 23.2MiB/s]
 38%|███▊      | 1.67G/4.38G [00:57<01:36, 28.2MiB/s]
 38%|███▊      | 1.67G/4.38G [00:57<01:47, 25.1MiB/s]
 38%|███▊      | 1.68G/4.38G [00:57<01:34, 28.7MiB/s]
 38%|███▊      | 1.68G/4.38G [00:57<01:47, 25.2MiB/s]
 38%|███▊      | 1.68G/4.38G [00:57<01:39, 27.1MiB/s]
 39%|███▊      | 1.69G/4.38G [00:57<01:41, 26.4MiB/s]
 39%|███▊      | 1.69G/4.38G [00:57<01:25, 31.5MiB/s]
 39%|███▊      | 1.70G/4.38G [00:58<01:33, 28.8MiB/s]
 39%|███▉      | 1.70G/4.38G [00:58<01:42, 26.1MiB/s]
 39%|███▉      | 1.70G/4.38G [00:58<01:44, 25.6MiB/s]
 39%|███▉      | 1.71G/4.38G [00:58<01:40, 26.6MiB/s]
 39%|███▉      | 1.71G/4.38G [00:58<01:50, 24.2MiB/s]
 39%|███▉      | 1.72G/4.38G [00:58<01:16, 34.8MiB/s]
 39%|███▉      | 1.72G/4.38G [00:59<01:25, 31.1MiB/s]
 39%|███▉      | 1.73G/4.38G [00:59<01:33, 28.4MiB/s]
 39%|███▉      | 1.73G/4.38G [00:59<01:50, 23.9MiB/s]
 40%|███▉      | 1.73G/4.38G [00:59<01:31, 28.9MiB/s]
 40%|███▉      | 1.74G/4.38G [00:59<01:36, 27.4MiB/s]
 40%|███▉      | 1.74G/4.38G [00:59<01:29, 29.5MiB/s]
 40%|███▉      | 1.75G/4.38G [00:59<01:20, 32.6MiB/s]
 40%|████      | 1.76G/4.38G [01:00<01:20, 32.8MiB/s]
 40%|████      | 1.76G/4.38G [01:00<01:19, 32.9MiB/s]
 40%|████      | 1.77G/4.38G [01:00<01:12, 36.1MiB/s]
 40%|████      | 1.77G/4.38G [01:00<01:19, 32.7MiB/s]
 41%|████      | 1.78G/4.38G [01:00<01:48, 24.0MiB/s]
 41%|████      | 1.78G/4.38G [01:01<01:56, 22.4MiB/s]
 41%|████      | 1.79G/4.38G [01:01<01:41, 25.6MiB/s]
 41%|████      | 1.79G/4.38G [01:01<01:34, 27.3MiB/s]
 41%|████      | 1.80G/4.38G [01:01<01:39, 26.0MiB/s]
 41%|████      | 1.80G/4.38G [01:01<01:22, 31.2MiB/s]
 41%|████      | 1.81G/4.38G [01:01<01:20, 32.0MiB/s]
 41%|████▏     | 1.81G/4.38G [01:02<01:22, 31.3MiB/s]
 42%|████▏     | 1.82G/4.38G [01:02<01:23, 30.6MiB/s]
 42%|████▏     | 1.82G/4.38G [01:02<01:27, 29.1MiB/s]
 42%|████▏     | 1.83G/4.38G [01:02<01:15, 33.6MiB/s]
 42%|████▏     | 1.83G/4.38G [01:02<01:27, 29.1MiB/s]
 42%|████▏     | 1.84G/4.38G [01:02<01:25, 29.8MiB/s]
 42%|████▏     | 1.84G/4.38G [01:02<01:26, 29.3MiB/s]
 42%|████▏     | 1.85G/4.38G [01:03<01:25, 29.5MiB/s]
 42%|████▏     | 1.85G/4.38G [01:03<01:17, 32.5MiB/s]
 42%|████▏     | 1.86G/4.38G [01:03<01:23, 30.1MiB/s]
 42%|████▏     | 1.86G/4.38G [01:03<01:13, 34.1MiB/s]
 43%|████▎     | 1.86G/4.38G [01:03<01:20, 31.1MiB/s]
 43%|████▎     | 1.87G/4.38G [01:03<01:24, 29.6MiB/s]
 43%|████▎     | 1.87G/4.38G [01:04<01:36, 26.0MiB/s]
 43%|████▎     | 1.88G/4.38G [01:04<01:40, 24.9MiB/s]
 43%|████▎     | 1.88G/4.38G [01:04<01:49, 22.8MiB/s]
 43%|████▎     | 1.88G/4.38G [01:04<01:34, 26.3MiB/s]
 43%|████▎     | 1.89G/4.38G [01:04<01:37, 25.5MiB/s]
 43%|████▎     | 1.89G/4.38G [01:04<01:42, 24.2MiB/s]
 43%|████▎     | 1.90G/4.38G [01:05<01:24, 29.4MiB/s]
 43%|████▎     | 1.90G/4.38G [01:05<01:19, 31.1MiB/s]
 44%|████▎     | 1.91G/4.38G [01:05<01:22, 29.9MiB/s]
 44%|████▎     | 1.91G/4.38G [01:05<01:06, 36.9MiB/s]
 44%|████▎     | 1.92G/4.38G [01:05<01:22, 29.7MiB/s]
 44%|████▍     | 1.92G/4.38G [01:05<01:19, 30.8MiB/s]
 44%|████▍     | 1.93G/4.38G [01:05<01:13, 33.4MiB/s]
 44%|████▍     | 1.93G/4.38G [01:06<01:18, 31.0MiB/s]
 44%|████▍     | 1.94G/4.38G [01:06<01:22, 29.8MiB/s]
 44%|████▍     | 1.94G/4.38G [01:06<01:28, 27.5MiB/s]
 44%|████▍     | 1.94G/4.38G [01:06<01:21, 29.8MiB/s]
 44%|████▍     | 1.95G/4.38G [01:06<01:26, 28.1MiB/s]
 45%|████▍     | 1.95G/4.38G [01:06<01:27, 27.8MiB/s]
 45%|████▍     | 1.96G/4.38G [01:07<01:35, 25.5MiB/s]
 45%|████▍     | 1.96G/4.38G [01:07<01:19, 30.4MiB/s]
 45%|████▍     | 1.97G/4.38G [01:07<01:48, 22.3MiB/s]
 45%|████▌     | 1.97G/4.38G [01:07<01:50, 21.7MiB/s]
 45%|████▌     | 1.98G/4.38G [01:07<01:35, 25.1MiB/s]
 45%|████▌     | 1.98G/4.38G [01:08<01:48, 22.1MiB/s]
 45%|████▌     | 1.99G/4.38G [01:08<02:10, 18.3MiB/s]
 45%|████▌     | 1.99G/4.38G [01:08<02:22, 16.8MiB/s]
 46%|████▌     | 2.00G/4.38G [01:09<02:27, 16.1MiB/s]
 46%|████▌     | 2.00G/4.38G [01:09<02:31, 15.7MiB/s]
 46%|████▌     | 2.00G/4.38G [01:09<01:54, 20.8MiB/s]
 46%|████▌     | 2.01G/4.38G [01:09<02:05, 18.8MiB/s]
 46%|████▌     | 2.01G/4.38G [01:10<02:08, 18.5MiB/s]
 46%|████▌     | 2.02G/4.38G [01:10<01:27, 27.0MiB/s]
 46%|████▋     | 2.03G/4.38G [01:10<01:16, 30.8MiB/s]
 46%|████▋     | 2.03G/4.38G [01:10<01:26, 27.2MiB/s]
 46%|████▋     | 2.04G/4.38G [01:10<01:19, 29.6MiB/s]
 47%|████▋     | 2.04G/4.38G [01:10<01:27, 26.7MiB/s]
 47%|████▋     | 2.04G/4.38G [01:11<01:48, 21.5MiB/s]
 47%|████▋     | 2.05G/4.38G [01:11<01:48, 21.4MiB/s]
 47%|████▋     | 2.05G/4.38G [01:11<01:32, 25.1MiB/s]
 47%|████▋     | 2.06G/4.38G [01:11<01:41, 23.0MiB/s]
 47%|████▋     | 2.06G/4.38G [01:11<01:27, 26.6MiB/s]
 47%|████▋     | 2.06G/4.38G [01:11<01:31, 25.4MiB/s]
 47%|████▋     | 2.07G/4.38G [01:12<01:44, 22.0MiB/s]
 47%|████▋     | 2.07G/4.38G [01:12<01:45, 22.0MiB/s]
 47%|████▋     | 2.08G/4.38G [01:12<01:22, 27.9MiB/s]
 48%|████▊     | 2.08G/4.38G [01:12<01:31, 25.2MiB/s]
 48%|████▊     | 2.09G/4.38G [01:12<01:15, 30.4MiB/s]
 48%|████▊     | 2.09G/4.38G [01:12<01:19, 28.6MiB/s]
 48%|████▊     | 2.10G/4.38G [01:13<01:57, 19.5MiB/s]
 48%|████▊     | 2.10G/4.38G [01:13<02:00, 19.0MiB/s]
 48%|████▊     | 2.11G/4.38G [01:13<01:27, 26.0MiB/s]
 48%|████▊     | 2.11G/4.38G [01:13<01:15, 30.0MiB/s]
 48%|████▊     | 2.12G/4.38G [01:13<01:18, 28.9MiB/s]
 48%|████▊     | 2.12G/4.38G [01:14<01:12, 31.1MiB/s]
 49%|████▊     | 2.13G/4.38G [01:14<01:17, 29.2MiB/s]
 49%|████▊     | 2.13G/4.38G [01:14<01:22, 27.3MiB/s]
 49%|████▉     | 2.14G/4.38G [01:14<01:15, 29.5MiB/s]
 49%|████▉     | 2.14G/4.38G [01:14<01:25, 26.1MiB/s]
 49%|████▉     | 2.15G/4.38G [01:14<01:07, 33.3MiB/s]
 49%|████▉     | 2.15G/4.38G [01:15<01:06, 33.3MiB/s]
 49%|████▉     | 2.16G/4.38G [01:15<01:08, 32.6MiB/s]
 49%|████▉     | 2.16G/4.38G [01:15<01:15, 29.4MiB/s]
 49%|████▉     | 2.17G/4.38G [01:15<01:28, 25.0MiB/s]
 50%|████▉     | 2.17G/4.38G [01:15<01:15, 29.3MiB/s]
 50%|████▉     | 2.18G/4.38G [01:15<01:09, 31.7MiB/s]
 50%|████▉     | 2.18G/4.38G [01:16<01:13, 29.8MiB/s]
 50%|████▉     | 2.19G/4.38G [01:16<01:06, 32.8MiB/s]
 50%|█████     | 2.19G/4.38G [01:16<01:19, 27.6MiB/s]
 50%|█████     | 2.20G/4.38G [01:16<01:36, 22.6MiB/s]
 50%|█████     | 2.20G/4.38G [01:16<01:40, 21.8MiB/s]
 50%|█████     | 2.20G/4.38G [01:17<01:54, 19.0MiB/s]
 50%|█████     | 2.20G/4.38G [01:17<02:01, 17.9MiB/s]
 50%|█████     | 2.21G/4.38G [01:17<02:00, 18.0MiB/s]
 51%|█████     | 2.21G/4.38G [01:17<01:50, 19.6MiB/s]
 51%|█████     | 2.22G/4.38G [01:17<02:04, 17.4MiB/s]
 51%|█████     | 2.22G/4.38G [01:17<01:19, 27.2MiB/s]
 51%|█████     | 2.23G/4.38G [01:18<01:26, 24.8MiB/s]
 51%|█████     | 2.23G/4.38G [01:18<01:26, 24.9MiB/s]
 51%|█████     | 2.23G/4.38G [01:18<01:28, 24.2MiB/s]
 51%|█████     | 2.24G/4.38G [01:18<01:03, 33.6MiB/s]
 51%|█████     | 2.24G/4.38G [01:18<01:06, 32.3MiB/s]
 51%|█████▏    | 2.25G/4.38G [01:18<01:09, 30.7MiB/s]
 51%|█████▏    | 2.25G/4.38G [01:19<01:27, 24.3MiB/s]
 51%|█████▏    | 2.25G/4.38G [01:19<01:26, 24.7MiB/s]
 52%|█████▏    | 2.26G/4.38G [01:19<01:36, 22.0MiB/s]
 52%|█████▏    | 2.26G/4.38G [01:19<01:26, 24.5MiB/s]
 52%|█████▏    | 2.27G/4.38G [01:19<01:34, 22.4MiB/s]
 52%|█████▏    | 2.27G/4.38G [01:19<01:33, 22.6MiB/s]
 52%|█████▏    | 2.27G/4.38G [01:20<01:48, 19.4MiB/s]
 52%|█████▏    | 2.28G/4.38G [01:20<01:32, 22.8MiB/s]
 52%|█████▏    | 2.29G/4.38G [01:20<01:32, 22.6MiB/s]
 52%|█████▏    | 2.29G/4.38G [01:20<01:44, 20.0MiB/s]
 52%|█████▏    | 2.30G/4.38G [01:21<01:22, 25.2MiB/s]
 52%|█████▏    | 2.30G/4.38G [01:21<01:37, 21.3MiB/s]
 53%|█████▎    | 2.31G/4.38G [01:21<01:30, 22.8MiB/s]
 53%|█████▎    | 2.31G/4.38G [01:21<01:37, 21.2MiB/s]
 53%|█████▎    | 2.31G/4.38G [01:21<01:24, 24.6MiB/s]
 53%|█████▎    | 2.32G/4.38G [01:21<01:34, 21.8MiB/s]
 53%|█████▎    | 2.32G/4.38G [01:22<01:11, 28.9MiB/s]
 53%|█████▎    | 2.33G/4.38G [01:22<01:16, 27.0MiB/s]
 53%|█████▎    | 2.33G/4.38G [01:22<01:06, 31.0MiB/s]
 53%|█████▎    | 2.33G/4.38G [01:22<01:15, 27.1MiB/s]
 53%|█████▎    | 2.34G/4.38G [01:22<01:12, 28.1MiB/s]
 54%|█████▎    | 2.35G/4.38G [01:22<01:05, 30.9MiB/s]
 54%|█████▎    | 2.35G/4.38G [01:23<01:12, 28.2MiB/s]
 54%|█████▍    | 2.36G/4.38G [01:23<00:56, 35.9MiB/s]
 54%|█████▍    | 2.36G/4.38G [01:23<00:51, 39.4MiB/s]
 54%|█████▍    | 2.37G/4.38G [01:23<00:55, 36.2MiB/s]
 54%|█████▍    | 2.37G/4.38G [01:23<01:03, 31.5MiB/s]
 54%|█████▍    | 2.38G/4.38G [01:23<01:07, 29.8MiB/s]
 54%|█████▍    | 2.38G/4.38G [01:23<01:07, 29.5MiB/s]
 54%|█████▍    | 2.38G/4.38G [01:24<01:11, 28.1MiB/s]
 55%|█████▍    | 2.39G/4.38G [01:24<00:58, 33.9MiB/s]
 55%|█████▍    | 2.40G/4.38G [01:24<00:55, 35.6MiB/s]
 55%|█████▍    | 2.40G/4.38G [01:24<01:00, 32.9MiB/s]
 55%|█████▍    | 2.41G/4.38G [01:24<01:03, 31.3MiB/s]
 55%|█████▍    | 2.41G/4.38G [01:24<01:19, 24.8MiB/s]
 55%|█████▌    | 2.42G/4.38G [01:25<01:02, 31.2MiB/s]
 55%|█████▌    | 2.42G/4.38G [01:25<00:50, 38.5MiB/s]
 55%|█████▌    | 2.43G/4.38G [01:25<00:55, 35.5MiB/s]
 55%|█████▌    | 2.43G/4.38G [01:25<00:55, 35.3MiB/s]
 56%|█████▌    | 2.43G/4.38G [01:25<01:05, 29.6MiB/s]
 56%|█████▌    | 2.44G/4.38G [01:25<01:05, 29.6MiB/s]
 56%|█████▌    | 2.44G/4.38G [01:26<01:18, 24.7MiB/s]
 56%|█████▌    | 2.45G/4.38G [01:26<01:02, 30.9MiB/s]
 56%|█████▌    | 2.46G/4.38G [01:26<00:53, 36.3MiB/s]
 56%|█████▋    | 2.46G/4.38G [01:26<00:50, 38.3MiB/s]
 56%|█████▋    | 2.47G/4.38G [01:26<00:52, 36.3MiB/s]
 56%|█████▋    | 2.47G/4.38G [01:26<00:52, 36.2MiB/s]
 57%|█████▋    | 2.48G/4.38G [01:27<01:00, 31.3MiB/s]
 57%|█████▋    | 2.48G/4.38G [01:27<01:04, 29.4MiB/s]
 57%|█████▋    | 2.49G/4.38G [01:27<00:55, 33.8MiB/s]
 57%|█████▋    | 2.50G/4.38G [01:27<00:51, 36.3MiB/s]
 57%|█████▋    | 2.50G/4.38G [01:27<01:02, 30.2MiB/s]
 57%|█████▋    | 2.51G/4.38G [01:27<01:02, 30.0MiB/s]
 57%|█████▋    | 2.51G/4.38G [01:28<01:14, 25.2MiB/s]
 57%|█████▋    | 2.52G/4.38G [01:28<01:06, 27.9MiB/s]
 57%|█████▋    | 2.52G/4.38G [01:28<01:12, 25.8MiB/s]
 58%|█████▊    | 2.52G/4.38G [01:28<01:10, 26.3MiB/s]
 58%|█████▊    | 2.52G/4.38G [01:28<01:15, 24.7MiB/s]
 58%|█████▊    | 2.53G/4.38G [01:28<00:52, 35.0MiB/s]
 58%|█████▊    | 2.54G/4.38G [01:28<00:46, 39.2MiB/s]
 58%|█████▊    | 2.54G/4.38G [01:29<00:55, 33.1MiB/s]
 58%|█████▊    | 2.55G/4.38G [01:29<00:55, 33.3MiB/s]
 58%|█████▊    | 2.55G/4.38G [01:29<01:07, 27.1MiB/s]
 58%|█████▊    | 2.55G/4.38G [01:29<01:13, 24.8MiB/s]
 58%|█████▊    | 2.56G/4.38G [01:29<01:20, 22.7MiB/s]
 59%|█████▊    | 2.57G/4.38G [01:30<01:16, 23.8MiB/s]
 59%|█████▊    | 2.57G/4.38G [01:30<01:25, 21.2MiB/s]
 59%|█████▊    | 2.57G/4.38G [01:30<01:16, 23.8MiB/s]
 59%|█████▉    | 2.58G/4.38G [01:30<01:17, 23.3MiB/s]
 59%|█████▉    | 2.58G/4.38G [01:30<01:05, 27.4MiB/s]
 59%|█████▉    | 2.59G/4.38G [01:30<01:16, 23.3MiB/s]
 59%|█████▉    | 2.59G/4.38G [01:31<01:08, 26.0MiB/s]
 59%|█████▉    | 2.60G/4.38G [01:32<02:19, 12.8MiB/s]
 59%|█████▉    | 2.60G/4.38G [01:32<02:15, 13.2MiB/s]
 60%|█████▉    | 2.61G/4.38G [01:32<01:34, 18.8MiB/s]
 60%|█████▉    | 2.61G/4.38G [01:32<01:34, 18.7MiB/s]
 60%|█████▉    | 2.62G/4.38G [01:32<01:17, 22.8MiB/s]
 60%|█████▉    | 2.62G/4.38G [01:33<01:24, 20.7MiB/s]
 60%|█████▉    | 2.63G/4.38G [01:33<01:27, 20.1MiB/s]
 60%|██████    | 2.63G/4.38G [01:33<01:22, 21.1MiB/s]
 60%|██████    | 2.63G/4.38G [01:33<01:26, 20.3MiB/s]
 60%|██████    | 2.64G/4.38G [01:33<01:04, 27.0MiB/s]
 60%|██████    | 2.64G/4.38G [01:33<01:13, 23.7MiB/s]
 61%|██████    | 2.65G/4.38G [01:34<00:57, 30.1MiB/s]
 61%|██████    | 2.66G/4.38G [01:34<00:43, 39.7MiB/s]
 61%|██████    | 2.66G/4.38G [01:34<00:50, 34.3MiB/s]
 61%|██████    | 2.67G/4.38G [01:34<00:51, 33.2MiB/s]
 61%|██████    | 2.67G/4.38G [01:34<00:59, 28.9MiB/s]
 61%|██████    | 2.68G/4.38G [01:34<01:06, 25.5MiB/s]
 61%|██████    | 2.68G/4.38G [01:35<00:53, 31.6MiB/s]
 61%|██████▏   | 2.69G/4.38G [01:35<01:01, 27.5MiB/s]
 61%|██████▏   | 2.69G/4.38G [01:35<00:53, 31.7MiB/s]
 62%|██████▏   | 2.70G/4.38G [01:35<01:00, 27.6MiB/s]
 62%|██████▏   | 2.70G/4.38G [01:35<01:03, 26.4MiB/s]
 62%|██████▏   | 2.71G/4.38G [01:35<00:52, 32.0MiB/s]
 62%|██████▏   | 2.71G/4.38G [01:36<00:57, 28.9MiB/s]
 62%|██████▏   | 2.72G/4.38G [01:36<00:48, 34.5MiB/s]
 62%|██████▏   | 2.73G/4.38G [01:36<00:42, 39.1MiB/s]
 62%|██████▏   | 2.73G/4.38G [01:36<00:38, 42.8MiB/s]
 62%|██████▏   | 2.74G/4.38G [01:36<00:42, 38.9MiB/s]
 63%|██████▎   | 2.74G/4.38G [01:36<00:43, 37.7MiB/s]
 63%|██████▎   | 2.75G/4.38G [01:36<00:42, 38.0MiB/s]
 63%|██████▎   | 2.75G/4.38G [01:37<00:46, 34.7MiB/s]
 63%|██████▎   | 2.76G/4.38G [01:37<00:54, 29.9MiB/s]
 63%|██████▎   | 2.76G/4.38G [01:37<01:07, 23.9MiB/s]
 63%|██████▎   | 2.76G/4.38G [01:37<01:05, 24.9MiB/s]
 63%|██████▎   | 2.77G/4.38G [01:37<01:01, 26.2MiB/s]
 63%|██████▎   | 2.78G/4.38G [01:37<00:47, 33.9MiB/s]
 63%|██████▎   | 2.78G/4.38G [01:38<00:53, 30.2MiB/s]
 64%|██████▎   | 2.78G/4.38G [01:38<00:49, 32.2MiB/s]
 64%|██████▎   | 2.79G/4.38G [01:38<00:56, 28.4MiB/s]
 64%|██████▎   | 2.79G/4.38G [01:38<01:00, 26.1MiB/s]
 64%|██████▍   | 2.79G/4.38G [01:38<01:04, 24.7MiB/s]
 64%|██████▍   | 2.80G/4.38G [01:38<01:00, 26.1MiB/s]
 64%|██████▍   | 2.80G/4.38G [01:39<01:04, 24.5MiB/s]
 64%|██████▍   | 2.81G/4.38G [01:39<00:50, 31.0MiB/s]
 64%|██████▍   | 2.81G/4.38G [01:39<00:58, 26.9MiB/s]
 64%|██████▍   | 2.82G/4.38G [01:39<01:03, 24.7MiB/s]
 64%|██████▍   | 2.82G/4.38G [01:39<01:04, 24.3MiB/s]
 64%|██████▍   | 2.83G/4.38G [01:39<00:50, 30.7MiB/s]
 65%|██████▍   | 2.83G/4.38G [01:39<00:59, 26.0MiB/s]
 65%|██████▍   | 2.83G/4.38G [01:40<01:54, 13.5MiB/s]
 65%|██████▍   | 2.84G/4.38G [01:40<01:49, 14.1MiB/s]
 65%|██████▍   | 2.84G/4.38G [01:40<01:14, 20.6MiB/s]
 65%|██████▌   | 2.85G/4.38G [01:41<01:13, 20.9MiB/s]
 65%|██████▌   | 2.85G/4.38G [01:41<01:13, 20.8MiB/s]
 65%|██████▌   | 2.86G/4.38G [01:41<01:23, 18.3MiB/s]
 65%|██████▌   | 2.86G/4.38G [01:41<01:20, 18.8MiB/s]
 65%|██████▌   | 2.86G/4.38G [01:41<01:17, 19.6MiB/s]
 65%|██████▌   | 2.87G/4.38G [01:42<00:58, 25.8MiB/s]
 66%|██████▌   | 2.88G/4.38G [01:42<01:10, 21.5MiB/s]
 66%|██████▌   | 2.88G/4.38G [01:42<01:11, 20.9MiB/s]
 66%|██████▌   | 2.88G/4.38G [01:42<00:57, 25.9MiB/s]
 66%|██████▌   | 2.89G/4.38G [01:42<01:00, 24.7MiB/s]
 66%|██████▌   | 2.89G/4.38G [01:42<00:43, 33.9MiB/s]
 66%|██████▌   | 2.90G/4.38G [01:43<00:44, 33.3MiB/s]
 66%|██████▌   | 2.90G/4.38G [01:43<00:47, 31.2MiB/s]
 66%|██████▋   | 2.91G/4.38G [01:43<00:39, 37.7MiB/s]
 66%|██████▋   | 2.91G/4.38G [01:43<00:46, 31.5MiB/s]
 67%|██████▋   | 2.92G/4.38G [01:43<00:45, 32.2MiB/s]
 67%|██████▋   | 2.92G/4.38G [01:43<00:50, 28.7MiB/s]
 67%|██████▋   | 2.93G/4.38G [01:44<01:01, 23.7MiB/s]
 67%|██████▋   | 2.93G/4.38G [01:44<01:09, 20.8MiB/s]
 67%|██████▋   | 2.93G/4.38G [01:44<01:20, 18.0MiB/s]
 67%|██████▋   | 2.94G/4.38G [01:44<00:57, 25.3MiB/s]
 67%|██████▋   | 2.94G/4.38G [01:44<00:49, 28.8MiB/s]
 67%|██████▋   | 2.95G/4.38G [01:44<00:48, 29.6MiB/s]
 67%|██████▋   | 2.95G/4.38G [01:45<01:04, 22.2MiB/s]
 67%|██████▋   | 2.95G/4.38G [01:45<01:09, 20.4MiB/s]
 68%|██████▊   | 2.96G/4.38G [01:45<01:03, 22.5MiB/s]
 68%|██████▊   | 2.96G/4.38G [01:45<01:08, 20.6MiB/s]
 68%|██████▊   | 2.97G/4.38G [01:45<00:54, 25.9MiB/s]
 68%|██████▊   | 2.97G/4.38G [01:46<00:58, 24.2MiB/s]
 68%|██████▊   | 2.98G/4.38G [01:46<00:50, 27.9MiB/s]
 68%|██████▊   | 2.98G/4.38G [01:46<00:40, 34.6MiB/s]
 68%|██████▊   | 2.99G/4.38G [01:46<00:43, 32.1MiB/s]
 68%|██████▊   | 2.99G/4.38G [01:46<00:42, 32.7MiB/s]
 68%|██████▊   | 3.00G/4.38G [01:46<00:52, 26.2MiB/s]
 69%|██████▊   | 3.00G/4.38G [01:47<00:47, 29.0MiB/s]
 69%|██████▊   | 3.01G/4.38G [01:47<00:34, 39.2MiB/s]
 69%|██████▉   | 3.02G/4.38G [01:47<00:42, 32.2MiB/s]
 69%|██████▉   | 3.02G/4.38G [01:47<00:59, 23.0MiB/s]
 69%|██████▉   | 3.02G/4.38G [01:47<00:59, 22.7MiB/s]
 69%|██████▉   | 3.03G/4.38G [01:48<01:04, 20.9MiB/s]
 69%|██████▉   | 3.03G/4.38G [01:48<01:07, 20.1MiB/s]
 69%|██████▉   | 3.03G/4.38G [01:48<00:54, 24.6MiB/s]
 69%|██████▉   | 3.04G/4.38G [01:48<00:54, 24.7MiB/s]
 69%|██████▉   | 3.04G/4.38G [01:48<00:49, 26.8MiB/s]
 70%|██████▉   | 3.05G/4.38G [01:48<00:59, 22.5MiB/s]
 70%|██████▉   | 3.05G/4.38G [01:49<00:48, 27.6MiB/s]
 70%|██████▉   | 3.05G/4.38G [01:49<00:54, 24.1MiB/s]
 70%|██████▉   | 3.06G/4.38G [01:49<00:46, 28.6MiB/s]
 70%|██████▉   | 3.06G/4.38G [01:49<00:50, 26.3MiB/s]
 70%|███████   | 3.07G/4.38G [01:49<00:40, 32.3MiB/s]
 70%|███████   | 3.08G/4.38G [01:49<00:36, 36.0MiB/s]
 70%|███████   | 3.09G/4.38G [01:50<00:39, 32.8MiB/s]
 70%|███████   | 3.09G/4.38G [01:50<00:39, 32.4MiB/s]
 71%|███████   | 3.10G/4.38G [01:50<00:38, 33.5MiB/s]
 71%|███████   | 3.10G/4.38G [01:50<00:32, 39.5MiB/s]
 71%|███████   | 3.11G/4.38G [01:50<00:37, 34.3MiB/s]
 71%|███████   | 3.11G/4.38G [01:50<00:36, 34.3MiB/s]
 71%|███████   | 3.12G/4.38G [01:50<00:28, 44.4MiB/s]
 71%|███████▏  | 3.13G/4.38G [01:51<00:31, 39.8MiB/s]
 71%|███████▏  | 3.13G/4.38G [01:51<00:53, 23.4MiB/s]
 72%|███████▏  | 3.14G/4.38G [01:51<00:46, 27.0MiB/s]
 72%|███████▏  | 3.14G/4.38G [01:51<00:50, 24.5MiB/s]
 72%|███████▏  | 3.15G/4.38G [01:52<00:45, 27.3MiB/s]
 72%|███████▏  | 3.15G/4.38G [01:52<00:40, 30.2MiB/s]
 72%|███████▏  | 3.16G/4.38G [01:52<00:42, 28.7MiB/s]
 72%|███████▏  | 3.16G/4.38G [01:52<00:40, 29.9MiB/s]
 72%|███████▏  | 3.17G/4.38G [01:52<00:34, 35.0MiB/s]
 73%|███████▎  | 3.18G/4.38G [01:52<00:28, 42.2MiB/s]
 73%|███████▎  | 3.19G/4.38G [01:52<00:24, 47.8MiB/s]
 73%|███████▎  | 3.19G/4.38G [01:53<00:27, 42.7MiB/s]
 73%|███████▎  | 3.20G/4.38G [01:53<00:30, 39.1MiB/s]
 73%|███████▎  | 3.20G/4.38G [01:53<00:28, 41.1MiB/s]
 73%|███████▎  | 3.21G/4.38G [01:53<00:33, 35.1MiB/s]
 73%|███████▎  | 3.21G/4.38G [01:53<00:33, 35.4MiB/s]
 74%|███████▎  | 3.22G/4.38G [01:53<00:25, 45.0MiB/s]
 74%|███████▎  | 3.23G/4.38G [01:54<00:31, 36.5MiB/s]
 74%|███████▎  | 3.23G/4.38G [01:54<00:42, 27.4MiB/s]
 74%|███████▍  | 3.23G/4.38G [01:54<00:45, 25.2MiB/s]
 74%|███████▍  | 3.24G/4.38G [01:54<00:45, 24.9MiB/s]
 74%|███████▍  | 3.24G/4.38G [01:54<00:53, 21.3MiB/s]
 74%|███████▍  | 3.24G/4.38G [01:54<00:41, 27.3MiB/s]
 74%|███████▍  | 3.25G/4.38G [01:55<00:45, 24.8MiB/s]
 74%|███████▍  | 3.25G/4.38G [01:55<00:39, 28.4MiB/s]
 74%|███████▍  | 3.26G/4.38G [01:55<00:31, 35.5MiB/s]
 75%|███████▍  | 3.27G/4.38G [01:55<00:35, 31.3MiB/s]
 75%|███████▍  | 3.27G/4.38G [01:55<00:38, 28.8MiB/s]
 75%|███████▍  | 3.28G/4.38G [01:56<00:46, 23.9MiB/s]
 75%|███████▍  | 3.28G/4.38G [01:56<00:52, 21.1MiB/s]
 75%|███████▌  | 3.29G/4.38G [01:56<00:41, 26.3MiB/s]
 75%|███████▌  | 3.29G/4.38G [01:56<00:44, 24.4MiB/s]
 75%|███████▌  | 3.30G/4.38G [01:56<00:37, 28.6MiB/s]
 75%|███████▌  | 3.30G/4.38G [01:57<00:33, 32.6MiB/s]
 75%|███████▌  | 3.31G/4.38G [01:57<00:38, 27.9MiB/s]
 76%|███████▌  | 3.31G/4.38G [01:57<00:40, 26.3MiB/s]
 76%|███████▌  | 3.31G/4.38G [01:57<00:45, 23.6MiB/s]
 76%|███████▌  | 3.32G/4.38G [01:57<00:42, 24.9MiB/s]
 76%|███████▌  | 3.32G/4.38G [01:57<00:45, 23.1MiB/s]
 76%|███████▌  | 3.33G/4.38G [01:58<00:35, 29.7MiB/s]
 76%|███████▌  | 3.34G/4.38G [01:58<00:29, 35.4MiB/s]
 76%|███████▋  | 3.35G/4.38G [01:58<00:26, 39.6MiB/s]
 77%|███████▋  | 3.36G/4.38G [01:58<00:24, 42.1MiB/s]
 77%|███████▋  | 3.36G/4.38G [01:58<00:23, 44.0MiB/s]
 77%|███████▋  | 3.37G/4.38G [01:58<00:25, 40.6MiB/s]
 77%|███████▋  | 3.37G/4.38G [01:59<00:25, 39.0MiB/s]
 77%|███████▋  | 3.38G/4.38G [01:59<00:23, 42.2MiB/s]
 77%|███████▋  | 3.39G/4.38G [01:59<00:21, 46.1MiB/s]
 77%|███████▋  | 3.39G/4.38G [01:59<00:24, 40.6MiB/s]
 78%|███████▊  | 3.40G/4.38G [01:59<00:26, 37.7MiB/s]
 78%|███████▊  | 3.40G/4.38G [01:59<00:28, 34.3MiB/s]
 78%|███████▊  | 3.41G/4.38G [01:59<00:29, 33.3MiB/s]
 78%|███████▊  | 3.41G/4.38G [02:00<00:23, 41.0MiB/s]
 78%|███████▊  | 3.42G/4.38G [02:00<00:24, 40.0MiB/s]
 78%|███████▊  | 3.42G/4.38G [02:00<00:24, 39.2MiB/s]
 78%|███████▊  | 3.43G/4.38G [02:00<00:27, 34.6MiB/s]
 78%|███████▊  | 3.43G/4.38G [02:00<00:29, 32.1MiB/s]
 78%|███████▊  | 3.44G/4.38G [02:00<00:30, 30.5MiB/s]
 79%|███████▊  | 3.44G/4.38G [02:01<00:35, 26.3MiB/s]
 79%|███████▊  | 3.45G/4.38G [02:01<00:31, 29.9MiB/s]
 79%|███████▉  | 3.46G/4.38G [02:01<00:27, 34.1MiB/s]
 79%|███████▉  | 3.46G/4.38G [02:01<00:22, 41.4MiB/s]
 79%|███████▉  | 3.47G/4.38G [02:01<00:22, 40.3MiB/s]
 79%|███████▉  | 3.47G/4.38G [02:01<00:25, 35.2MiB/s]
 79%|███████▉  | 3.48G/4.38G [02:01<00:27, 33.5MiB/s]
 79%|███████▉  | 3.48G/4.38G [02:02<00:35, 25.2MiB/s]
 79%|███████▉  | 3.48G/4.38G [02:02<00:34, 26.3MiB/s]
 80%|███████▉  | 3.49G/4.38G [02:02<00:29, 29.9MiB/s]
 80%|███████▉  | 3.50G/4.38G [02:02<00:39, 22.7MiB/s]
 80%|███████▉  | 3.50G/4.38G [02:03<00:41, 21.1MiB/s]
 80%|████████  | 3.51G/4.38G [02:03<00:35, 24.9MiB/s]
 80%|████████  | 3.51G/4.38G [02:03<00:28, 30.4MiB/s]
 80%|████████  | 3.52G/4.38G [02:03<00:28, 29.9MiB/s]
 80%|████████  | 3.52G/4.38G [02:03<00:24, 34.5MiB/s]
 80%|████████  | 3.53G/4.38G [02:03<00:26, 32.0MiB/s]
 81%|████████  | 3.53G/4.38G [02:04<00:28, 29.5MiB/s]
 81%|████████  | 3.53G/4.38G [02:04<00:30, 27.6MiB/s]
 81%|████████  | 3.54G/4.38G [02:04<00:26, 32.2MiB/s]
 81%|████████  | 3.55G/4.38G [02:04<00:21, 38.3MiB/s]
 81%|████████  | 3.55G/4.38G [02:04<00:25, 32.5MiB/s]
 81%|████████  | 3.56G/4.38G [02:04<00:29, 27.8MiB/s]
 81%|████████  | 3.56G/4.38G [02:05<00:34, 23.8MiB/s]
 81%|████████▏ | 3.56G/4.38G [02:05<00:36, 22.5MiB/s]
 81%|████████▏ | 3.57G/4.38G [02:05<00:37, 21.6MiB/s]
 82%|████████▏ | 3.57G/4.38G [02:05<00:27, 29.4MiB/s]
 82%|████████▏ | 3.58G/4.38G [02:05<00:27, 29.3MiB/s]
 82%|████████▏ | 3.58G/4.38G [02:05<00:31, 25.0MiB/s]
 82%|████████▏ | 3.59G/4.38G [02:06<00:24, 32.0MiB/s]
 82%|████████▏ | 3.60G/4.38G [02:06<00:18, 41.8MiB/s]
 82%|████████▏ | 3.60G/4.38G [02:06<00:21, 36.1MiB/s]
 82%|████████▏ | 3.61G/4.38G [02:06<00:22, 34.6MiB/s]
 82%|████████▏ | 3.61G/4.38G [02:06<00:25, 29.9MiB/s]
 83%|████████▎ | 3.62G/4.38G [02:06<00:28, 27.1MiB/s]
 83%|████████▎ | 3.62G/4.38G [02:07<00:28, 26.6MiB/s]
 83%|████████▎ | 3.62G/4.38G [02:07<00:28, 26.6MiB/s]
 83%|████████▎ | 3.63G/4.38G [02:07<00:26, 28.8MiB/s]
 83%|████████▎ | 3.63G/4.38G [02:07<00:27, 26.8MiB/s]
 83%|████████▎ | 3.64G/4.38G [02:07<00:24, 30.4MiB/s]
 83%|████████▎ | 3.64G/4.38G [02:07<00:25, 29.1MiB/s]
 83%|████████▎ | 3.65G/4.38G [02:07<00:19, 38.5MiB/s]
 83%|████████▎ | 3.66G/4.38G [02:08<00:17, 42.0MiB/s]
 84%|████████▎ | 3.66G/4.38G [02:08<00:16, 43.7MiB/s]
 84%|████████▎ | 3.67G/4.38G [02:08<00:17, 40.0MiB/s]
 84%|████████▍ | 3.67G/4.38G [02:08<00:25, 27.4MiB/s]
 84%|████████▍ | 3.68G/4.38G [02:08<00:27, 26.0MiB/s]
 84%|████████▍ | 3.68G/4.38G [02:08<00:20, 33.5MiB/s]
 84%|████████▍ | 3.69G/4.38G [02:09<00:21, 32.1MiB/s]
 84%|████████▍ | 3.69G/4.38G [02:09<00:21, 32.0MiB/s]
 84%|████████▍ | 3.69G/4.38G [02:09<00:24, 28.1MiB/s]
 84%|████████▍ | 3.70G/4.38G [02:09<00:23, 29.1MiB/s]
 84%|████████▍ | 3.70G/4.38G [02:09<00:26, 25.9MiB/s]
 85%|████████▍ | 3.71G/4.38G [02:09<00:21, 31.1MiB/s]
 85%|████████▍ | 3.72G/4.38G [02:09<00:17, 38.8MiB/s]
 85%|████████▍ | 3.72G/4.38G [02:10<00:17, 37.4MiB/s]
 85%|████████▌ | 3.73G/4.38G [02:10<00:18, 36.1MiB/s]
 85%|████████▌ | 3.73G/4.38G [02:10<00:19, 34.1MiB/s]
 85%|████████▌ | 3.73G/4.38G [02:10<00:20, 31.9MiB/s]
 85%|████████▌ | 3.74G/4.38G [02:10<00:20, 31.8MiB/s]
 86%|████████▌ | 3.75G/4.38G [02:10<00:16, 38.6MiB/s]
 86%|████████▌ | 3.75G/4.38G [02:11<00:17, 36.2MiB/s]
 86%|████████▌ | 3.76G/4.38G [02:11<00:17, 34.8MiB/s]
 86%|████████▌ | 3.76G/4.38G [02:11<00:21, 28.5MiB/s]
 86%|████████▌ | 3.76G/4.38G [02:11<00:22, 27.1MiB/s]
 86%|████████▌ | 3.77G/4.38G [02:11<00:23, 26.1MiB/s]
 86%|████████▌ | 3.77G/4.38G [02:11<00:18, 32.3MiB/s]
 86%|████████▌ | 3.78G/4.38G [02:11<00:22, 26.9MiB/s]
 86%|████████▋ | 3.78G/4.38G [02:12<00:21, 27.8MiB/s]
 86%|████████▋ | 3.78G/4.38G [02:12<00:21, 28.0MiB/s]
 87%|████████▋ | 3.79G/4.38G [02:12<00:18, 31.8MiB/s]
 87%|████████▋ | 3.79G/4.38G [02:12<00:19, 30.0MiB/s]
 87%|████████▋ | 3.80G/4.38G [02:12<00:19, 30.3MiB/s]
 87%|████████▋ | 3.80G/4.38G [02:12<00:19, 29.1MiB/s]
 87%|████████▋ | 3.81G/4.38G [02:12<00:18, 31.6MiB/s]
 87%|████████▋ | 3.81G/4.38G [02:13<00:20, 28.2MiB/s]
 87%|████████▋ | 3.82G/4.38G [02:13<00:17, 33.0MiB/s]
 87%|████████▋ | 3.82G/4.38G [02:13<00:19, 28.7MiB/s]
 87%|████████▋ | 3.83G/4.38G [02:13<00:18, 29.6MiB/s]
 87%|████████▋ | 3.83G/4.38G [02:13<00:18, 30.2MiB/s]
 88%|████████▊ | 3.83G/4.38G [02:13<00:19, 27.5MiB/s]
 88%|████████▊ | 3.84G/4.38G [02:14<00:20, 26.9MiB/s]
 88%|████████▊ | 3.84G/4.38G [02:14<00:21, 25.4MiB/s]
 88%|████████▊ | 3.85G/4.38G [02:14<00:15, 34.2MiB/s]
 88%|████████▊ | 3.85G/4.38G [02:14<00:17, 29.3MiB/s]
 88%|████████▊ | 3.86G/4.38G [02:14<00:17, 29.8MiB/s]
 88%|████████▊ | 3.86G/4.38G [02:14<00:19, 27.4MiB/s]
 88%|████████▊ | 3.86G/4.38G [02:15<00:24, 21.1MiB/s]
 88%|████████▊ | 3.87G/4.38G [02:15<00:24, 21.1MiB/s]
 88%|████████▊ | 3.87G/4.38G [02:15<00:24, 20.5MiB/s]
 88%|████████▊ | 3.87G/4.38G [02:15<00:27, 18.6MiB/s]
 88%|████████▊ | 3.87G/4.38G [02:15<00:25, 19.6MiB/s]
 88%|████████▊ | 3.88G/4.38G [02:15<00:27, 18.1MiB/s]
 89%|████████▊ | 3.88G/4.38G [02:16<00:26, 18.8MiB/s]
 89%|████████▊ | 3.89G/4.38G [02:16<00:23, 21.1MiB/s]
 89%|████████▉ | 3.89G/4.38G [02:16<00:17, 28.2MiB/s]
 89%|████████▉ | 3.90G/4.38G [02:16<00:14, 32.5MiB/s]
 89%|████████▉ | 3.90G/4.38G [02:16<00:17, 27.7MiB/s]
 89%|████████▉ | 3.91G/4.38G [02:16<00:15, 30.5MiB/s]
 89%|████████▉ | 3.92G/4.38G [02:17<00:15, 30.3MiB/s]
 89%|████████▉ | 3.92G/4.38G [02:17<00:16, 27.9MiB/s]
 90%|████████▉ | 3.92G/4.38G [02:17<00:18, 25.0MiB/s]
 90%|████████▉ | 3.93G/4.38G [02:17<00:16, 27.4MiB/s]
 90%|████████▉ | 3.93G/4.38G [02:17<00:16, 26.8MiB/s]
 90%|████████▉ | 3.93G/4.38G [02:17<00:13, 32.1MiB/s]
 90%|████████▉ | 3.94G/4.38G [02:17<00:15, 28.7MiB/s]
 90%|████████▉ | 3.94G/4.38G [02:18<00:14, 30.4MiB/s]
 90%|█████████ | 3.94G/4.38G [02:18<00:17, 25.5MiB/s]
 90%|█████████ | 3.95G/4.38G [02:18<00:17, 25.0MiB/s]
 90%|█████████ | 3.95G/4.38G [02:18<00:18, 23.8MiB/s]
 90%|█████████ | 3.96G/4.38G [02:18<00:15, 28.2MiB/s]
 90%|█████████ | 3.96G/4.38G [02:18<00:16, 25.5MiB/s]
 91%|█████████ | 3.97G/4.38G [02:18<00:13, 30.4MiB/s]
 91%|█████████ | 3.97G/4.38G [02:19<00:16, 25.6MiB/s]
 91%|█████████ | 3.97G/4.38G [02:19<00:17, 22.7MiB/s]
 91%|█████████ | 3.98G/4.38G [02:19<00:20, 20.1MiB/s]
 91%|█████████ | 3.98G/4.38G [02:19<00:21, 18.4MiB/s]
 91%|█████████ | 3.98G/4.38G [02:20<00:22, 17.6MiB/s]
 91%|█████████ | 3.99G/4.38G [02:20<00:17, 22.7MiB/s]
 91%|█████████ | 3.99G/4.38G [02:20<00:17, 21.9MiB/s]
 91%|█████████▏| 4.00G/4.38G [02:20<00:14, 26.2MiB/s]
 91%|█████████▏| 4.00G/4.38G [02:20<00:15, 24.5MiB/s]
 91%|█████████▏| 4.01G/4.38G [02:20<00:13, 28.0MiB/s]
 92%|█████████▏| 4.01G/4.38G [02:20<00:13, 27.0MiB/s]
 92%|█████████▏| 4.02G/4.38G [02:21<00:10, 34.2MiB/s]
 92%|█████████▏| 4.03G/4.38G [02:21<00:08, 41.2MiB/s]
 92%|█████████▏| 4.03G/4.38G [02:21<00:07, 48.8MiB/s]
 92%|█████████▏| 4.04G/4.38G [02:21<00:08, 42.3MiB/s]
 92%|█████████▏| 4.04G/4.38G [02:21<00:11, 30.0MiB/s]
 92%|█████████▏| 4.05G/4.38G [02:22<00:14, 23.1MiB/s]
 93%|█████████▎| 4.05G/4.38G [02:22<00:14, 22.8MiB/s]
 93%|█████████▎| 4.06G/4.38G [02:22<00:12, 25.5MiB/s]
 93%|█████████▎| 4.06G/4.38G [02:22<00:12, 24.6MiB/s]
 93%|█████████▎| 4.07G/4.38G [02:22<00:11, 26.3MiB/s]
 93%|█████████▎| 4.07G/4.38G [02:22<00:12, 24.8MiB/s]
 93%|█████████▎| 4.08G/4.38G [02:23<00:15, 19.2MiB/s]
 93%|█████████▎| 4.08G/4.38G [02:23<00:15, 19.6MiB/s]
 93%|█████████▎| 4.08G/4.38G [02:23<00:12, 24.3MiB/s]
 93%|█████████▎| 4.09G/4.38G [02:23<00:12, 23.0MiB/s]
 93%|█████████▎| 4.09G/4.38G [02:23<00:11, 25.3MiB/s]
 93%|█████████▎| 4.09G/4.38G [02:24<00:11, 24.9MiB/s]
 94%|█████████▎| 4.10G/4.38G [02:24<00:09, 30.1MiB/s]
 94%|█████████▍| 4.11G/4.38G [02:24<00:07, 36.8MiB/s]
 94%|█████████▍| 4.11G/4.38G [02:24<00:08, 33.0MiB/s]
 94%|█████████▍| 4.12G/4.38G [02:24<00:08, 32.0MiB/s]
 94%|█████████▍| 4.12G/4.38G [02:24<00:09, 28.6MiB/s]
 94%|█████████▍| 4.13G/4.38G [02:25<00:09, 28.0MiB/s]
 94%|█████████▍| 4.13G/4.38G [02:25<00:10, 24.1MiB/s]
 94%|█████████▍| 4.13G/4.38G [02:25<00:10, 24.2MiB/s]
 94%|█████████▍| 4.14G/4.38G [02:25<00:11, 21.7MiB/s]
 95%|█████████▍| 4.14G/4.38G [02:25<00:08, 27.0MiB/s]
 95%|█████████▍| 4.15G/4.38G [02:25<00:07, 30.5MiB/s]
 95%|█████████▍| 4.15G/4.38G [02:26<00:07, 31.2MiB/s]
 95%|█████████▍| 4.16G/4.38G [02:26<00:06, 33.3MiB/s]
 95%|█████████▌| 4.17G/4.38G [02:26<00:05, 35.9MiB/s]
 95%|█████████▌| 4.18G/4.38G [02:26<00:06, 31.2MiB/s]
 95%|█████████▌| 4.18G/4.38G [02:26<00:07, 26.6MiB/s]
 96%|█████████▌| 4.18G/4.38G [02:27<00:07, 25.1MiB/s]
 96%|█████████▌| 4.19G/4.38G [02:27<00:08, 22.7MiB/s]
 96%|█████████▌| 4.19G/4.38G [02:27<00:06, 28.4MiB/s]
 96%|█████████▌| 4.20G/4.38G [02:27<00:06, 27.8MiB/s]
 96%|█████████▌| 4.20G/4.38G [02:27<00:05, 30.5MiB/s]
 96%|█████████▌| 4.20G/4.38G [02:27<00:06, 27.1MiB/s]
 96%|█████████▌| 4.21G/4.38G [02:28<00:06, 28.3MiB/s]
 96%|█████████▌| 4.21G/4.38G [02:28<00:07, 24.0MiB/s]
 96%|█████████▋| 4.22G/4.38G [02:28<00:06, 25.2MiB/s]
 96%|█████████▋| 4.22G/4.38G [02:28<00:06, 23.3MiB/s]
 97%|█████████▋| 4.23G/4.38G [02:28<00:05, 29.8MiB/s]
 97%|█████████▋| 4.23G/4.38G [02:29<00:05, 26.2MiB/s]
 97%|█████████▋| 4.24G/4.38G [02:29<00:05, 24.4MiB/s]
 97%|█████████▋| 4.24G/4.38G [02:29<00:05, 23.7MiB/s]
 97%|█████████▋| 4.25G/4.38G [02:29<00:05, 22.7MiB/s]
 97%|█████████▋| 4.25G/4.38G [02:29<00:05, 24.3MiB/s]
 97%|█████████▋| 4.25G/4.38G [02:29<00:05, 23.2MiB/s]
 97%|█████████▋| 4.26G/4.38G [02:30<00:06, 18.5MiB/s]
 97%|█████████▋| 4.26G/4.38G [02:30<00:06, 17.3MiB/s]
 97%|█████████▋| 4.27G/4.38G [02:30<00:06, 17.6MiB/s]
 97%|█████████▋| 4.27G/4.38G [02:30<00:06, 17.9MiB/s]
 98%|█████████▊| 4.27G/4.38G [02:31<00:06, 17.3MiB/s]
 98%|█████████▊| 4.28G/4.38G [02:31<00:04, 23.4MiB/s]
 98%|█████████▊| 4.28G/4.38G [02:31<00:03, 29.1MiB/s]
 98%|█████████▊| 4.29G/4.38G [02:31<00:03, 27.4MiB/s]
 98%|█████████▊| 4.29G/4.38G [02:31<00:03, 28.5MiB/s]
 98%|█████████▊| 4.30G/4.38G [02:31<00:03, 26.9MiB/s]
 98%|█████████▊| 4.30G/4.38G [02:31<00:02, 31.6MiB/s]
 98%|█████████▊| 4.31G/4.38G [02:32<00:02, 26.4MiB/s]
 98%|█████████▊| 4.31G/4.38G [02:32<00:02, 25.4MiB/s]
 99%|█████████▊| 4.32G/4.38G [02:32<00:02, 27.8MiB/s]
 99%|█████████▉| 4.33G/4.38G [02:32<00:01, 34.8MiB/s]
 99%|█████████▉| 4.33G/4.38G [02:32<00:01, 32.7MiB/s]
 99%|█████████▉| 4.34G/4.38G [02:33<00:01, 25.7MiB/s]
 99%|█████████▉| 4.34G/4.38G [02:33<00:01, 23.4MiB/s]
 99%|█████████▉| 4.35G/4.38G [02:33<00:01, 30.6MiB/s]
 99%|█████████▉| 4.35G/4.38G [02:33<00:00, 36.2MiB/s]
 99%|█████████▉| 4.36G/4.38G [02:33<00:00, 35.4MiB/s]
100%|█████████▉| 4.36G/4.38G [02:33<00:00, 35.5MiB/s]
100%|█████████▉| 4.36G/4.38G [02:34<00:00, 31.3MiB/s]
100%|█████████▉| 4.37G/4.38G [02:34<00:00, 34.5MiB/s]
100%|█████████▉| 4.37G/4.38G [02:34<00:00, 28.6MiB/s]
100%|█████████▉| 4.38G/4.38G [02:34<00:00, 20.5MiB/s]
100%|█████████▉| 4.38G/4.38G [02:34<00:00, 20.6MiB/s]
100%|██████████| 4.38G/4.38G [02:35<00:00, 28.3MiB/s]

Then we will load the csv files.

dataset_path = os.path.join(download_dir, 'flickr30k_processed')
train_data = pd.read_csv(f'{dataset_path}/train.csv', index_col=0)
val_data = pd.read_csv(f'{dataset_path}/val.csv', index_col=0)
test_data = pd.read_csv(f'{dataset_path}/test.csv', index_col=0)
image_col = "image"
text_col = "caption"

We also need to expand the relative image paths to use their absolute local paths.

def path_expander(path, base_folder):
    path_l = path.split(';')
    return ';'.join([os.path.abspath(os.path.join(base_folder, path)) for path in path_l])

train_data[image_col] = train_data[image_col].apply(lambda ele: path_expander(ele, base_folder=dataset_path))
val_data[image_col] = val_data[image_col].apply(lambda ele: path_expander(ele, base_folder=dataset_path))
test_data[image_col] = test_data[image_col].apply(lambda ele: path_expander(ele, base_folder=dataset_path))

Take train_data for example, let’s see how the data look like in the dataframe.

train_data.head()
caption image
0 Two young guys with shaggy hair look at their ... /home/ci/autogluon/docs/tutorials/multimodal/s...
1 Two young White males are outside near many bu... /home/ci/autogluon/docs/tutorials/multimodal/s...
2 Two men in green shirts are standing in a yard /home/ci/autogluon/docs/tutorials/multimodal/s...
3 A man in a blue shirt standing in a garden /home/ci/autogluon/docs/tutorials/multimodal/s...
4 Two friends enjoy time spent together /home/ci/autogluon/docs/tutorials/multimodal/s...

Each row is one image and text pair, implying that they match each other. Since one image corresponds to five captions in the dataset, we copy each image path five times to build the correspondences. We can visualize one image-text pair.

train_data[text_col][0]
'Two young guys with shaggy hair look at their hands while hanging out in the yard'
pil_img = Image(filename=train_data[image_col][0])
display(pil_img)
../../../_images/b012c7e966f6550874ccb85ef9602d483aa89b8623dff9ffcdb0faab8f2ca9ab.jpg

To perform evaluation or semantic search, we need to extract the unique image and text items from text_data and add one label column in the test_data.

test_image_data = pd.DataFrame({image_col: test_data[image_col].unique().tolist()})
test_text_data = pd.DataFrame({text_col: test_data[text_col].unique().tolist()})
test_data_with_label = test_data.copy()
test_label_col = "relevance"
test_data_with_label[test_label_col] = [1] * len(test_data)

Initialize Predictor

To initialize a predictor for image-text matching, we need to set problem_type as image_text_similarity. query and response refer to the two dataframe columns in which two items in one row should match each other. You can set query=text_col and response=image_col, or query=image_col and response=text_col. In image-text matching, query and response are equivalent.

from autogluon.multimodal import MultiModalPredictor
predictor = MultiModalPredictor(
            query=text_col,
            response=image_col,
            problem_type="image_text_similarity",
            eval_metric="recall",
        )
/home/ci/opt/venv/lib/python3.11/site-packages/mmengine/optim/optimizer/zero_optimizer.py:11: DeprecationWarning: `TorchScript` support for functional optimizers is deprecated and will be removed in a future PyTorch release. Consider using the `torch.compile` optimizer instead.
  from torch.distributed.optim import \

By initializing the predictor for image_text_similarity, you have loaded the pretrained CLIP backbone openai/clip-vit-base-patch32.

Directly Evaluate on Test Dataset (Zero-shot)

You may be interested in getting the pretrained model’s performance on your data. Let’s compute the text-to-image and image-to-text retrieval scores.

txt_to_img_scores = predictor.evaluate(
            data=test_data_with_label,
            query_data=test_text_data,
            response_data=test_image_data,
            label=test_label_col,
            cutoffs=[1, 5, 10],
        )
img_to_txt_scores = predictor.evaluate(
            data=test_data_with_label,
            query_data=test_image_data,
            response_data=test_text_data,
            label=test_label_col,
            cutoffs=[1, 5, 10],
        )
print(f"txt_to_img_scores: {txt_to_img_scores}")
print(f"img_to_txt_scores: {img_to_txt_scores}")
txt_to_img_scores: {'recall@1': 0.58964, 'recall@5': 0.83513, 'recall@10': 0.90156}
img_to_txt_scores: {'recall@1': 0.15505, 'recall@5': 0.5708, 'recall@10': 0.7172}

Here we report the recall, which is the eval_metric in initializing the predictor above. One cutoff value means using the top k retrieved items to calculate the score. You may find that the text-to-image recalls are much higher than the image-to-text recalls. This is because each image is paired with five texts. In image-to-text retrieval, the upper bound of recall@1 is 20%, which means that the top-1 text is correct, but there are totally five texts to retrieve.

Finetune Predictor

After measuring the pretrained performance, we can finetune the model on our dataset to see whether we can get improvements. For a quick demo, here we set the time limit to 180 seconds.

predictor.fit(
            train_data=train_data,
            tuning_data=val_data,
            time_limit=180,
        )
No path specified. Models will be saved in: "AutogluonModels/ag-20250215_070915"
=================== System Info ===================
AutoGluon Version:  1.2.1b20250215
Python Version:     3.11.9
Operating System:   Linux
Platform Machine:   x86_64
Platform Version:   #1 SMP Tue Sep 24 10:00:37 UTC 2024
CPU Count:          8
Pytorch Version:    2.5.1+cu124
CUDA Version:       12.4
Memory Avail:       26.96 GB / 30.95 GB (87.1%)
Disk Space Avail:   171.42 GB / 255.99 GB (67.0%)
===================================================

AutoMM starts to create your model. ✨✨✨

To track the learning progress, you can open a terminal and launch Tensorboard:
    ```shell
    # Assume you have installed tensorboard
    tensorboard --logdir /home/ci/autogluon/docs/tutorials/multimodal/semantic_matching/AutogluonModels/ag-20250215_070915
    ```
INFO: Seed set to 0
GPU Count: 1
GPU Count to be Used: 1
GPU 0 Name: Tesla T4
GPU 0 Memory: 0.56GB/15.0GB (Used/Total)
INFO: Using 16bit Automatic Mixed Precision (AMP)
INFO: GPU available: True (cuda), used: True
INFO: TPU available: False, using: 0 TPU cores
INFO: HPU available: False, using: 0 HPUs
INFO: LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]
INFO: 
  | Name              | Type                      | Params | Mode 
------------------------------------------------------------------------
0 | query_model       | CLIPForImageText          | 151 M  | train
1 | response_model    | CLIPForImageText          | 151 M  | train
2 | validation_metric | CustomHitRate             | 0      | train
3 | loss_func         | MultiNegativesSoftmaxLoss | 0      | train
------------------------------------------------------------------------
151 M     Trainable params
0         Non-trainable params
151 M     Total params
605.109   Total estimated model params size (MB)
5         Modules in train mode
306       Modules in eval mode
INFO: Time limit reached. Elapsed time is 0:03:00. Signaling Trainer to stop.
INFO: Epoch 0, global step 399: 'val_recall' reached 0.56351 (best 0.56351), saving model to '/home/ci/autogluon/docs/tutorials/multimodal/semantic_matching/AutogluonModels/ag-20250215_070915/epoch=0-step=399.ckpt' as top 3
Start to fuse 1 checkpoints via the greedy soup algorithm.
AutoMM has created your model. 🎉🎉🎉

To load the model, use the code below:
    ```python
    from autogluon.multimodal import MultiModalPredictor
    predictor = MultiModalPredictor.load("/home/ci/autogluon/docs/tutorials/multimodal/semantic_matching/AutogluonModels/ag-20250215_070915")
    ```

If you are not satisfied with the model, try to increase the training time, 
adjust the hyperparameters (https://auto.gluon.ai/stable/tutorials/multimodal/advanced_topics/customization.html),
or post issues on GitHub (https://github.com/autogluon/autogluon/issues).
<autogluon.multimodal.predictor.MultiModalPredictor at 0x7fc2cd559190>

Evaluate the Finetuned Model on the Test Dataset

Now Let’s evaluate the finetuned model. Similarly, we also compute the recalls of text-to-image and image-to-text retrievals.

txt_to_img_scores = predictor.evaluate(
            data=test_data_with_label,
            query_data=test_text_data,
            response_data=test_image_data,
            label=test_label_col,
            cutoffs=[1, 5, 10],
        )
img_to_txt_scores = predictor.evaluate(
            data=test_data_with_label,
            query_data=test_image_data,
            response_data=test_text_data,
            label=test_label_col,
            cutoffs=[1, 5, 10],
        )
print(f"txt_to_img_scores: {txt_to_img_scores}")
print(f"img_to_txt_scores: {img_to_txt_scores}")
txt_to_img_scores: {'recall@1': 0.70328, 'recall@5': 0.90936, 'recall@10': 0.95498}
img_to_txt_scores: {'recall@1': 0.16965, 'recall@5': 0.6702, 'recall@10': 0.8196}

We can observe large improvements over the zero-shot predictor. This means that finetuning CLIP on our customized data may help achieve better performance.

Predict Whether Image and Text Match

Whether finetuned or not, the predictor can predict whether image and text pairs match.

pred = predictor.predict(test_data.head(5))
print(pred)
0    1
1    1
2    1
3    1
4    1
dtype: int64

Predict Matching Probabilities

The predictor can also return to you the matching probabilities.

proba = predictor.predict_proba(test_data.head(5))
print(proba)
          0         1
0  0.342004  0.657996
1  0.325806  0.674194
2  0.347383  0.652617
3  0.343256  0.656744
4  0.329154  0.670846

The second column is the probability of being a match.

Extract Embeddings

Another common user case is to extract image and text embeddings.

image_embeddings = predictor.extract_embedding({image_col: test_image_data[image_col][:5].tolist()})
print(image_embeddings.shape) 
(5, 512)
text_embeddings = predictor.extract_embedding({text_col: test_text_data[text_col][:5].tolist()})
print(text_embeddings.shape)
(5, 512)

Other Examples

You may go to AutoMM Examples to explore other examples about AutoMM.

Customization

To learn how to customize AutoMM, please refer to Customize AutoMM.