使用 AutoMM 进行图像到图像语义匹配

Open In Colab Open In SageMaker Studio Lab

计算两幅图像之间的相似度是计算机视觉中的常见任务,有多种实际应用,例如检测相同或不同的产品等。一般来说,图像相似度模型会将两幅图像作为输入并将其转换为向量,然后使用余弦相似度、点积或欧氏距离计算相似度得分来衡量两幅图像的相似或不同程度。

import os
import pandas as pd
import warnings
from IPython.display import Image, display
warnings.filterwarnings('ignore')

准备数据

在本教程中,我们将演示如何使用 AutoMM 对简化的 Stanford Online Products 数据集 (SOP) 进行图像到图像语义匹配。

Stanford Online Products 数据集被用于度量学习。此数据集中有 12 个产品类别:自行车、橱柜、椅子、咖啡机、风扇、水壶、台灯、马克杯、沙发、订书机、桌子和烤面包机。每个类别包含一些产品,每个产品都有从不同视角拍摄的几张图像。在这里,我们将同一产品的不同视角图像视为正样本对(标记为 1),将来自不同产品的图像视为负样本对(标记为 0)。

以下代码下载数据集并解压图像和标注文件。

download_dir = './ag_automm_tutorial_img2img'
zip_file = 'https://automl-mm-bench.s3.amazonaws.com/Stanford_Online_Products.zip'
from autogluon.core.utils.loaders import load_zip
load_zip.unzip(zip_file, unzip_dir=download_dir)
Downloading ./ag_automm_tutorial_img2img/file.zip from https://automl-mm-bench.s3.amazonaws.com/Stanford_Online_Products.zip...
  0%|          | 0.00/3.08G [00:00<?, ?iB/s]
  0%|          | 8.38M/3.08G [00:00<00:52, 58.6MiB/s]
  0%|          | 15.0M/3.08G [00:00<01:20, 38.0MiB/s]
  1%|          | 19.1M/3.08G [00:00<01:44, 29.3MiB/s]
  1%|          | 23.8M/3.08G [00:00<01:39, 30.7MiB/s]
  1%|          | 27.0M/3.08G [00:00<01:56, 26.3MiB/s]
  1%|          | 32.2M/3.08G [00:01<01:40, 30.4MiB/s]
  1%|          | 35.4M/3.08G [00:01<02:09, 23.5MiB/s]
  1%|▏         | 41.9M/3.08G [00:01<01:41, 29.8MiB/s]
  2%|▏         | 50.3M/3.08G [00:01<01:25, 35.3MiB/s]
  2%|▏         | 57.0M/3.08G [00:01<01:32, 32.7MiB/s]
  2%|▏         | 60.4M/3.08G [00:01<01:41, 29.7MiB/s]
  2%|▏         | 67.1M/3.08G [00:02<01:31, 33.0MiB/s]
  2%|▏         | 75.5M/3.08G [00:02<01:17, 39.0MiB/s]
  3%|▎         | 82.5M/3.08G [00:02<01:37, 30.7MiB/s]
  3%|▎         | 86.0M/3.08G [00:02<01:49, 27.5MiB/s]
  3%|▎         | 91.3M/3.08G [00:02<01:33, 31.9MiB/s]
  3%|▎         | 95.0M/3.08G [00:03<01:38, 30.3MiB/s]
  3%|▎         | 101M/3.08G [00:03<01:36, 31.0MiB/s]
  3%|▎         | 105M/3.08G [00:03<01:33, 31.7MiB/s]
  4%|▎         | 109M/3.08G [00:03<01:31, 32.5MiB/s]
  4%|▍         | 116M/3.08G [00:03<01:14, 39.7MiB/s]
  4%|▍         | 120M/3.08G [00:03<01:24, 35.0MiB/s]
  4%|▍         | 124M/3.08G [00:03<01:21, 36.3MiB/s]
  4%|▍         | 128M/3.08G [00:03<01:29, 33.2MiB/s]
  4%|▍         | 132M/3.08G [00:04<01:30, 32.5MiB/s]
  4%|▍         | 136M/3.08G [00:04<01:43, 28.5MiB/s]
  5%|▍         | 143M/3.08G [00:04<01:44, 28.2MiB/s]
  5%|▍         | 149M/3.08G [00:04<01:25, 34.4MiB/s]
  5%|▍         | 153M/3.08G [00:04<01:27, 33.7MiB/s]
  5%|▌         | 159M/3.08G [00:04<01:18, 37.1MiB/s]
  5%|▌         | 166M/3.08G [00:05<01:13, 39.5MiB/s]
  6%|▌         | 170M/3.08G [00:05<01:20, 36.0MiB/s]
  6%|▌         | 176M/3.08G [00:05<01:29, 32.4MiB/s]
  6%|▌         | 185M/3.08G [00:05<01:14, 38.8MiB/s]
  6%|▌         | 191M/3.08G [00:05<01:06, 43.4MiB/s]
  6%|▋         | 196M/3.08G [00:05<01:14, 38.8MiB/s]
  7%|▋         | 201M/3.08G [00:05<01:09, 41.7MiB/s]
  7%|▋         | 208M/3.08G [00:06<01:09, 41.5MiB/s]
  7%|▋         | 212M/3.08G [00:06<01:48, 26.6MiB/s]
  7%|▋         | 218M/3.08G [00:06<01:38, 29.2MiB/s]
  7%|▋         | 225M/3.08G [00:06<01:22, 34.8MiB/s]
  7%|▋         | 229M/3.08G [00:06<01:33, 30.4MiB/s]
  8%|▊         | 233M/3.08G [00:07<01:35, 29.7MiB/s]
  8%|▊         | 236M/3.08G [00:07<01:48, 26.3MiB/s]
  8%|▊         | 242M/3.08G [00:07<02:02, 23.1MiB/s]
  8%|▊         | 244M/3.08G [00:07<02:00, 23.5MiB/s]
  8%|▊         | 252M/3.08G [00:07<01:36, 29.3MiB/s]
  8%|▊         | 259M/3.08G [00:07<01:14, 38.0MiB/s]
  9%|▊         | 263M/3.08G [00:08<01:26, 32.6MiB/s]
  9%|▊         | 268M/3.08G [00:08<01:39, 28.2MiB/s]
  9%|▉         | 275M/3.08G [00:08<01:25, 33.0MiB/s]
  9%|▉         | 279M/3.08G [00:08<01:28, 31.8MiB/s]
  9%|▉         | 285M/3.08G [00:08<01:20, 34.6MiB/s]
  9%|▉         | 292M/3.08G [00:08<01:05, 42.5MiB/s]
 10%|▉         | 297M/3.08G [00:09<01:11, 39.1MiB/s]
 10%|▉         | 302M/3.08G [00:09<01:18, 35.2MiB/s]
 10%|█         | 310M/3.08G [00:09<01:11, 38.6MiB/s]
 10%|█         | 314M/3.08G [00:09<01:19, 34.7MiB/s]
 10%|█         | 319M/3.08G [00:09<01:31, 30.2MiB/s]
 11%|█         | 325M/3.08G [00:09<01:24, 32.7MiB/s]
 11%|█         | 329M/3.08G [00:10<01:30, 30.5MiB/s]
 11%|█         | 336M/3.08G [00:10<01:17, 35.6MiB/s]
 11%|█         | 342M/3.08G [00:10<01:22, 33.1MiB/s]
 11%|█         | 346M/3.08G [00:10<01:26, 31.6MiB/s]
 11%|█▏        | 352M/3.08G [00:10<01:14, 36.4MiB/s]
 12%|█▏        | 359M/3.08G [00:10<01:16, 35.8MiB/s]
 12%|█▏        | 363M/3.08G [00:11<01:24, 32.2MiB/s]
 12%|█▏        | 368M/3.08G [00:11<01:35, 28.6MiB/s]
 12%|█▏        | 371M/3.08G [00:11<01:49, 24.9MiB/s]
 12%|█▏        | 377M/3.08G [00:11<01:40, 26.8MiB/s]
 13%|█▎        | 386M/3.08G [00:11<01:21, 33.0MiB/s]
 13%|█▎        | 394M/3.08G [00:11<01:03, 42.1MiB/s]
 13%|█▎        | 399M/3.08G [00:12<01:13, 36.7MiB/s]
 13%|█▎        | 403M/3.08G [00:12<01:17, 34.8MiB/s]
 13%|█▎        | 411M/3.08G [00:12<01:02, 42.7MiB/s]
 14%|█▎        | 418M/3.08G [00:12<01:29, 29.8MiB/s]
 14%|█▎        | 421M/3.08G [00:12<01:29, 29.7MiB/s]
 14%|█▍        | 426M/3.08G [00:13<01:25, 31.0MiB/s]
 14%|█▍        | 430M/3.08G [00:13<01:29, 29.6MiB/s]
 14%|█▍        | 434M/3.08G [00:13<01:20, 32.7MiB/s]
 14%|█▍        | 438M/3.08G [00:13<01:22, 32.1MiB/s]
 14%|█▍        | 445M/3.08G [00:13<01:08, 38.5MiB/s]
 15%|█▍        | 449M/3.08G [00:13<01:17, 34.0MiB/s]
 15%|█▍        | 453M/3.08G [00:13<01:25, 30.8MiB/s]
 15%|█▍        | 461M/3.08G [00:14<01:14, 35.4MiB/s]
 15%|█▌        | 468M/3.08G [00:14<01:06, 39.4MiB/s]
 15%|█▌        | 472M/3.08G [00:14<01:11, 36.4MiB/s]
 16%|█▌        | 478M/3.08G [00:14<01:13, 35.6MiB/s]
 16%|█▌        | 485M/3.08G [00:14<01:31, 28.3MiB/s]
 16%|█▌        | 488M/3.08G [00:14<01:33, 27.7MiB/s]
 16%|█▌        | 495M/3.08G [00:15<01:22, 31.5MiB/s]
 16%|█▋        | 503M/3.08G [00:15<01:11, 36.0MiB/s]
 17%|█▋        | 509M/3.08G [00:15<01:03, 40.7MiB/s]
 17%|█▋        | 514M/3.08G [00:15<01:12, 35.4MiB/s]
 17%|█▋        | 518M/3.08G [00:15<01:08, 37.5MiB/s]
 17%|█▋        | 522M/3.08G [00:15<01:22, 31.1MiB/s]
 17%|█▋        | 528M/3.08G [00:16<02:03, 20.6MiB/s]
 17%|█▋        | 535M/3.08G [00:16<02:28, 17.1MiB/s]
 17%|█▋        | 538M/3.08G [00:17<02:36, 16.3MiB/s]
 18%|█▊        | 544M/3.08G [00:17<02:01, 20.8MiB/s]
 18%|█▊        | 547M/3.08G [00:17<01:52, 22.6MiB/s]
 18%|█▊        | 552M/3.08G [00:17<01:39, 25.6MiB/s]
 18%|█▊        | 555M/3.08G [00:17<01:44, 24.1MiB/s]
 18%|█▊        | 562M/3.08G [00:17<01:26, 29.2MiB/s]
 18%|█▊        | 569M/3.08G [00:17<01:22, 30.4MiB/s]
 19%|█▊        | 572M/3.08G [00:18<01:31, 27.5MiB/s]
 19%|█▊        | 577M/3.08G [00:18<01:17, 32.2MiB/s]
 19%|█▉        | 581M/3.08G [00:18<01:28, 28.2MiB/s]
 19%|█▉        | 586M/3.08G [00:18<01:21, 30.8MiB/s]
 19%|█▉        | 589M/3.08G [00:18<01:26, 28.9MiB/s]
 19%|█▉        | 594M/3.08G [00:18<01:34, 26.3MiB/s]
 19%|█▉        | 597M/3.08G [00:19<01:44, 23.8MiB/s]
 20%|█▉        | 602M/3.08G [00:19<01:42, 24.1MiB/s]
 20%|█▉        | 605M/3.08G [00:19<02:10, 19.0MiB/s]
 20%|█▉        | 611M/3.08G [00:19<01:33, 26.3MiB/s]
 20%|█▉        | 614M/3.08G [00:19<01:33, 26.4MiB/s]
 20%|██        | 619M/3.08G [00:19<01:33, 26.3MiB/s]
 20%|██        | 622M/3.08G [00:20<01:51, 22.0MiB/s]
 20%|██        | 627M/3.08G [00:20<01:29, 27.4MiB/s]
 20%|██        | 631M/3.08G [00:20<01:36, 25.4MiB/s]
 21%|██        | 638M/3.08G [00:20<01:16, 32.0MiB/s]
 21%|██        | 645M/3.08G [00:20<01:14, 32.9MiB/s]
 21%|██        | 648M/3.08G [00:20<01:18, 30.9MiB/s]
 21%|██        | 652M/3.08G [00:20<01:14, 32.4MiB/s]
 21%|██        | 655M/3.08G [00:21<01:20, 30.1MiB/s]
 21%|██▏       | 663M/3.08G [00:21<01:21, 29.9MiB/s]
 22%|██▏       | 669M/3.08G [00:21<01:05, 37.0MiB/s]
 22%|██▏       | 673M/3.08G [00:21<01:14, 32.2MiB/s]
 22%|██▏       | 679M/3.08G [00:21<01:04, 37.1MiB/s]
 22%|██▏       | 688M/3.08G [00:21<00:59, 40.1MiB/s]
 23%|██▎       | 696M/3.08G [00:22<00:49, 48.5MiB/s]
 23%|██▎       | 703M/3.08G [00:22<01:02, 37.9MiB/s]
 23%|██▎       | 707M/3.08G [00:22<01:08, 34.7MiB/s]
 23%|██▎       | 713M/3.08G [00:22<01:12, 32.9MiB/s]
 23%|██▎       | 720M/3.08G [00:22<01:01, 38.4MiB/s]
 23%|██▎       | 724M/3.08G [00:23<01:22, 28.8MiB/s]
 24%|██▎       | 728M/3.08G [00:23<01:17, 30.5MiB/s]
 24%|██▎       | 732M/3.08G [00:23<01:18, 30.2MiB/s]
 24%|██▍       | 738M/3.08G [00:23<01:06, 35.5MiB/s]
 24%|██▍       | 745M/3.08G [00:23<00:55, 41.9MiB/s]
 24%|██▍       | 749M/3.08G [00:23<00:55, 42.4MiB/s]
 24%|██▍       | 755M/3.08G [00:23<00:53, 43.6MiB/s]
 25%|██▍       | 762M/3.08G [00:23<00:58, 39.7MiB/s]
 25%|██▍       | 766M/3.08G [00:24<01:22, 28.0MiB/s]
 25%|██▍       | 770M/3.08G [00:24<01:22, 28.0MiB/s]
 25%|██▌       | 773M/3.08G [00:24<01:33, 24.7MiB/s]
 25%|██▌       | 780M/3.08G [00:24<01:25, 27.1MiB/s]
 26%|██▌       | 789M/3.08G [00:25<01:12, 31.8MiB/s]
 26%|██▌       | 797M/3.08G [00:25<01:05, 34.7MiB/s]
 26%|██▌       | 804M/3.08G [00:25<00:59, 38.2MiB/s]
 26%|██▌       | 808M/3.08G [00:25<01:05, 34.9MiB/s]
 26%|██▋       | 814M/3.08G [00:25<00:56, 40.3MiB/s]
 27%|██▋       | 822M/3.08G [00:25<00:45, 49.8MiB/s]
 27%|██▋       | 827M/3.08G [00:25<00:51, 44.2MiB/s]
 27%|██▋       | 832M/3.08G [00:26<00:56, 39.7MiB/s]
 27%|██▋       | 839M/3.08G [00:26<00:52, 43.0MiB/s]
 27%|██▋       | 846M/3.08G [00:26<00:46, 48.4MiB/s]
 28%|██▊       | 851M/3.08G [00:26<00:52, 42.3MiB/s]
 28%|██▊       | 856M/3.08G [00:26<01:02, 35.7MiB/s]
 28%|██▊       | 862M/3.08G [00:26<01:07, 32.7MiB/s]
 28%|██▊       | 866M/3.08G [00:27<01:13, 30.4MiB/s]
 28%|██▊       | 872M/3.08G [00:27<01:13, 30.1MiB/s]
 29%|██▊       | 881M/3.08G [00:27<00:55, 39.6MiB/s]
 29%|██▊       | 885M/3.08G [00:27<00:54, 40.4MiB/s]
 29%|██▉       | 890M/3.08G [00:27<01:01, 35.5MiB/s]
 29%|██▉       | 898M/3.08G [00:27<00:52, 41.4MiB/s]
 29%|██▉       | 906M/3.08G [00:27<00:50, 42.9MiB/s]
 30%|██▉       | 913M/3.08G [00:28<00:45, 47.6MiB/s]
 30%|██▉       | 918M/3.08G [00:28<00:47, 45.6MiB/s]
 30%|██▉       | 922M/3.08G [00:28<01:06, 32.6MiB/s]
 30%|███       | 926M/3.08G [00:28<01:07, 32.0MiB/s]
 30%|███       | 931M/3.08G [00:28<01:03, 34.1MiB/s]
 30%|███       | 934M/3.08G [00:28<01:08, 31.2MiB/s]
 30%|███       | 940M/3.08G [00:29<01:20, 26.7MiB/s]
 31%|███       | 946M/3.08G [00:29<01:09, 30.8MiB/s]
 31%|███       | 949M/3.08G [00:29<01:27, 24.3MiB/s]
 31%|███       | 955M/3.08G [00:29<01:35, 22.4MiB/s]
 31%|███       | 957M/3.08G [00:29<01:57, 18.2MiB/s]
 31%|███▏      | 965M/3.08G [00:30<01:31, 23.2MiB/s]
 31%|███▏      | 971M/3.08G [00:30<01:20, 26.2MiB/s]
 32%|███▏      | 974M/3.08G [00:30<01:31, 23.0MiB/s]
 32%|███▏      | 981M/3.08G [00:30<01:06, 31.5MiB/s]
 32%|███▏      | 985M/3.08G [00:30<01:12, 29.0MiB/s]
 32%|███▏      | 989M/3.08G [00:31<01:25, 24.6MiB/s]
 32%|███▏      | 991M/3.08G [00:31<01:30, 23.1MiB/s]
 32%|███▏      | 994M/3.08G [00:31<01:46, 19.6MiB/s]
 32%|███▏      | 996M/3.08G [00:31<01:43, 20.1MiB/s]
 32%|███▏      | 999M/3.08G [00:31<01:49, 19.0MiB/s]
 33%|███▎      | 1.01G/3.08G [00:31<01:21, 25.5MiB/s]
 33%|███▎      | 1.02G/3.08G [00:32<01:02, 33.1MiB/s]
 33%|███▎      | 1.02G/3.08G [00:32<01:02, 32.9MiB/s]
 33%|███▎      | 1.02G/3.08G [00:32<01:11, 28.6MiB/s]
 33%|███▎      | 1.03G/3.08G [00:32<01:07, 30.3MiB/s]
 34%|███▎      | 1.04G/3.08G [00:32<00:57, 35.5MiB/s]
 34%|███▍      | 1.04G/3.08G [00:32<01:02, 32.8MiB/s]
 34%|███▍      | 1.05G/3.08G [00:33<01:02, 32.4MiB/s]
 34%|███▍      | 1.06G/3.08G [00:33<00:57, 35.4MiB/s]
 34%|███▍      | 1.06G/3.08G [00:33<00:51, 39.0MiB/s]
 35%|███▍      | 1.07G/3.08G [00:33<00:52, 38.7MiB/s]
 35%|███▍      | 1.07G/3.08G [00:33<00:59, 33.9MiB/s]
 35%|███▍      | 1.08G/3.08G [00:33<01:04, 31.0MiB/s]
 35%|███▌      | 1.08G/3.08G [00:33<01:00, 33.2MiB/s]
 35%|███▌      | 1.08G/3.08G [00:34<01:06, 30.3MiB/s]
 35%|███▌      | 1.09G/3.08G [00:34<01:05, 30.4MiB/s]
 35%|███▌      | 1.09G/3.08G [00:34<01:29, 22.3MiB/s]
 36%|███▌      | 1.10G/3.08G [00:34<01:09, 28.5MiB/s]
 36%|███▌      | 1.11G/3.08G [00:34<00:50, 39.2MiB/s]
 36%|███▌      | 1.11G/3.08G [00:35<00:57, 34.4MiB/s]
 36%|███▌      | 1.12G/3.08G [00:35<01:15, 26.0MiB/s]
 36%|███▋      | 1.12G/3.08G [00:35<01:05, 29.9MiB/s]
 37%|███▋      | 1.13G/3.08G [00:35<00:52, 37.4MiB/s]
 37%|███▋      | 1.14G/3.08G [00:35<01:05, 29.6MiB/s]
 37%|███▋      | 1.14G/3.08G [00:35<00:59, 32.9MiB/s]
 37%|███▋      | 1.14G/3.08G [00:36<01:10, 27.7MiB/s]
 37%|███▋      | 1.15G/3.08G [00:36<01:12, 26.8MiB/s]
 37%|███▋      | 1.16G/3.08G [00:36<01:02, 30.9MiB/s]
 38%|███▊      | 1.16G/3.08G [00:36<01:07, 28.5MiB/s]
 38%|███▊      | 1.16G/3.08G [00:36<01:21, 23.7MiB/s]
 38%|███▊      | 1.17G/3.08G [00:37<01:25, 22.3MiB/s]
 38%|███▊      | 1.17G/3.08G [00:37<01:18, 24.4MiB/s]
 38%|███▊      | 1.18G/3.08G [00:37<01:27, 21.7MiB/s]
 38%|███▊      | 1.18G/3.08G [00:37<01:09, 27.5MiB/s]
 39%|███▊      | 1.19G/3.08G [00:37<00:57, 32.7MiB/s]
 39%|███▉      | 1.20G/3.08G [00:37<00:49, 38.3MiB/s]
 39%|███▉      | 1.20G/3.08G [00:38<00:49, 37.7MiB/s]
 39%|███▉      | 1.21G/3.08G [00:38<00:46, 40.5MiB/s]
 39%|███▉      | 1.21G/3.08G [00:38<00:59, 31.4MiB/s]
 39%|███▉      | 1.22G/3.08G [00:38<01:03, 29.2MiB/s]
 40%|███▉      | 1.22G/3.08G [00:38<00:53, 35.0MiB/s]
 40%|███▉      | 1.23G/3.08G [00:38<00:46, 39.9MiB/s]
 40%|████      | 1.24G/3.08G [00:39<00:42, 43.1MiB/s]
 40%|████      | 1.25G/3.08G [00:39<00:48, 37.8MiB/s]
 41%|████      | 1.25G/3.08G [00:39<00:55, 33.0MiB/s]
 41%|████      | 1.26G/3.08G [00:39<00:53, 34.1MiB/s]
 41%|████      | 1.27G/3.08G [00:39<00:44, 40.9MiB/s]
 41%|████      | 1.27G/3.08G [00:39<00:51, 35.2MiB/s]
 41%|████▏     | 1.27G/3.08G [00:40<00:52, 34.6MiB/s]
 41%|████▏     | 1.28G/3.08G [00:40<00:53, 34.1MiB/s]
 42%|████▏     | 1.28G/3.08G [00:40<00:51, 34.7MiB/s]
 42%|████▏     | 1.29G/3.08G [00:40<00:50, 35.7MiB/s]
 42%|████▏     | 1.30G/3.08G [00:40<00:48, 36.8MiB/s]
 42%|████▏     | 1.31G/3.08G [00:40<00:42, 41.9MiB/s]
 43%|████▎     | 1.31G/3.08G [00:41<00:48, 36.9MiB/s]
 43%|████▎     | 1.32G/3.08G [00:41<00:52, 33.4MiB/s]
 43%|████▎     | 1.33G/3.08G [00:41<00:47, 36.9MiB/s]
 43%|████▎     | 1.33G/3.08G [00:41<00:46, 37.3MiB/s]
 43%|████▎     | 1.34G/3.08G [00:41<00:52, 33.5MiB/s]
 44%|████▎     | 1.34G/3.08G [00:42<00:58, 29.7MiB/s]
 44%|████▍     | 1.35G/3.08G [00:42<00:53, 32.1MiB/s]
 44%|████▍     | 1.36G/3.08G [00:42<00:49, 35.1MiB/s]
 44%|████▍     | 1.36G/3.08G [00:42<00:54, 31.8MiB/s]
 44%|████▍     | 1.37G/3.08G [00:42<00:44, 38.3MiB/s]
 44%|████▍     | 1.37G/3.08G [00:42<00:54, 31.4MiB/s]
 45%|████▍     | 1.38G/3.08G [00:43<00:51, 33.4MiB/s]
 45%|████▍     | 1.38G/3.08G [00:43<00:44, 37.8MiB/s]
 45%|████▌     | 1.39G/3.08G [00:43<00:48, 34.7MiB/s]
 45%|████▌     | 1.39G/3.08G [00:43<00:51, 32.7MiB/s]
 45%|████▌     | 1.40G/3.08G [00:43<00:56, 30.0MiB/s]
 45%|████▌     | 1.40G/3.08G [00:43<01:08, 24.5MiB/s]
 46%|████▌     | 1.41G/3.08G [00:44<00:56, 29.4MiB/s]
 46%|████▌     | 1.41G/3.08G [00:44<01:00, 27.8MiB/s]
 46%|████▌     | 1.42G/3.08G [00:44<00:50, 32.8MiB/s]
 46%|████▌     | 1.43G/3.08G [00:44<00:45, 36.1MiB/s]
 46%|████▋     | 1.43G/3.08G [00:44<00:43, 38.2MiB/s]
 47%|████▋     | 1.44G/3.08G [00:44<00:47, 34.9MiB/s]
 47%|████▋     | 1.44G/3.08G [00:45<00:46, 35.3MiB/s]
 47%|████▋     | 1.45G/3.08G [00:45<00:44, 37.0MiB/s]
 47%|████▋     | 1.45G/3.08G [00:45<00:53, 30.8MiB/s]
 47%|████▋     | 1.46G/3.08G [00:45<00:57, 28.1MiB/s]
 47%|████▋     | 1.46G/3.08G [00:45<00:58, 27.6MiB/s]
 48%|████▊     | 1.47G/3.08G [00:45<00:54, 29.9MiB/s]
 48%|████▊     | 1.47G/3.08G [00:46<01:01, 26.2MiB/s]
 48%|████▊     | 1.48G/3.08G [00:46<00:46, 34.6MiB/s]
 48%|████▊     | 1.48G/3.08G [00:46<00:52, 30.4MiB/s]
 48%|████▊     | 1.48G/3.08G [00:46<00:52, 30.7MiB/s]
 48%|████▊     | 1.49G/3.08G [00:46<00:54, 29.4MiB/s]
 48%|████▊     | 1.49G/3.08G [00:46<00:53, 29.6MiB/s]
 48%|████▊     | 1.49G/3.08G [00:46<01:08, 23.2MiB/s]
 49%|████▊     | 1.50G/3.08G [00:47<00:45, 35.2MiB/s]
 49%|████▉     | 1.51G/3.08G [00:47<00:56, 28.2MiB/s]
 49%|████▉     | 1.51G/3.08G [00:47<01:01, 25.6MiB/s]
 49%|████▉     | 1.52G/3.08G [00:47<00:49, 31.6MiB/s]
 49%|████▉     | 1.52G/3.08G [00:47<00:58, 26.6MiB/s]
 49%|████▉     | 1.52G/3.08G [00:47<00:52, 29.4MiB/s]
 50%|████▉     | 1.53G/3.08G [00:48<00:54, 28.7MiB/s]
 50%|████▉     | 1.53G/3.08G [00:48<00:46, 33.4MiB/s]
 50%|████▉     | 1.54G/3.08G [00:48<00:51, 30.0MiB/s]
 50%|█████     | 1.54G/3.08G [00:48<00:49, 31.4MiB/s]
 50%|█████     | 1.55G/3.08G [00:48<00:43, 35.4MiB/s]
 50%|█████     | 1.55G/3.08G [00:48<00:49, 30.8MiB/s]
 51%|█████     | 1.56G/3.08G [00:48<00:44, 34.4MiB/s]
 51%|█████     | 1.57G/3.08G [00:49<00:37, 40.7MiB/s]
 51%|█████     | 1.58G/3.08G [00:49<00:32, 46.6MiB/s]
 51%|█████▏    | 1.58G/3.08G [00:49<00:34, 43.3MiB/s]
 51%|█████▏    | 1.59G/3.08G [00:49<00:36, 40.5MiB/s]
 52%|█████▏    | 1.59G/3.08G [00:49<00:35, 41.7MiB/s]
 52%|█████▏    | 1.60G/3.08G [00:49<00:43, 34.0MiB/s]
 52%|█████▏    | 1.60G/3.08G [00:49<00:40, 36.2MiB/s]
 52%|█████▏    | 1.60G/3.08G [00:50<00:46, 31.9MiB/s]
 52%|█████▏    | 1.61G/3.08G [00:50<00:55, 26.6MiB/s]
 52%|█████▏    | 1.61G/3.08G [00:50<00:56, 26.2MiB/s]
 52%|█████▏    | 1.62G/3.08G [00:50<00:47, 31.0MiB/s]
 53%|█████▎    | 1.63G/3.08G [00:50<00:43, 33.8MiB/s]
 53%|█████▎    | 1.63G/3.08G [00:50<00:36, 39.5MiB/s]
 53%|█████▎    | 1.64G/3.08G [00:51<00:38, 37.9MiB/s]
 53%|█████▎    | 1.64G/3.08G [00:51<00:34, 41.7MiB/s]
 54%|█████▎    | 1.65G/3.08G [00:51<00:33, 42.4MiB/s]
 54%|█████▍    | 1.66G/3.08G [00:51<00:33, 41.9MiB/s]
 54%|█████▍    | 1.67G/3.08G [00:51<00:31, 44.9MiB/s]
 54%|█████▍    | 1.67G/3.08G [00:51<00:32, 43.6MiB/s]
 54%|█████▍    | 1.68G/3.08G [00:51<00:33, 41.6MiB/s]
 55%|█████▍    | 1.69G/3.08G [00:52<00:32, 43.3MiB/s]
 55%|█████▍    | 1.69G/3.08G [00:52<00:31, 43.8MiB/s]
 55%|█████▌    | 1.70G/3.08G [00:52<00:35, 38.7MiB/s]
 55%|█████▌    | 1.70G/3.08G [00:52<00:36, 38.3MiB/s]
 55%|█████▌    | 1.71G/3.08G [00:52<00:31, 43.7MiB/s]
 56%|█████▌    | 1.71G/3.08G [00:52<00:41, 33.3MiB/s]
 56%|█████▌    | 1.72G/3.08G [00:53<00:43, 31.6MiB/s]
 56%|█████▌    | 1.72G/3.08G [00:53<00:48, 27.9MiB/s]
 56%|█████▌    | 1.73G/3.08G [00:53<00:42, 31.8MiB/s]
 56%|█████▌    | 1.73G/3.08G [00:53<00:51, 26.1MiB/s]
 56%|█████▋    | 1.74G/3.08G [00:53<00:46, 29.1MiB/s]
 57%|█████▋    | 1.74G/3.08G [00:53<00:35, 37.6MiB/s]
 57%|█████▋    | 1.75G/3.08G [00:54<00:35, 37.4MiB/s]
 57%|█████▋    | 1.75G/3.08G [00:54<00:37, 35.2MiB/s]
 57%|█████▋    | 1.76G/3.08G [00:54<00:30, 42.9MiB/s]
 57%|█████▋    | 1.76G/3.08G [00:54<00:32, 40.5MiB/s]
 57%|█████▋    | 1.77G/3.08G [00:54<00:39, 33.0MiB/s]
 57%|█████▋    | 1.77G/3.08G [00:54<00:45, 29.1MiB/s]
 58%|█████▊    | 1.78G/3.08G [00:54<00:44, 29.6MiB/s]
 58%|█████▊    | 1.79G/3.08G [00:55<00:35, 36.3MiB/s]
 58%|█████▊    | 1.79G/3.08G [00:55<00:42, 30.2MiB/s]
 58%|█████▊    | 1.80G/3.08G [00:55<00:46, 27.9MiB/s]
 58%|█████▊    | 1.80G/3.08G [00:55<00:42, 29.9MiB/s]
 59%|█████▊    | 1.80G/3.08G [00:55<00:43, 29.1MiB/s]
 59%|█████▉    | 1.81G/3.08G [00:56<00:42, 29.9MiB/s]
 59%|█████▉    | 1.82G/3.08G [00:56<00:39, 31.6MiB/s]
 59%|█████▉    | 1.83G/3.08G [00:56<00:36, 34.5MiB/s]
 60%|█████▉    | 1.84G/3.08G [00:56<00:34, 35.7MiB/s]
 60%|█████▉    | 1.84G/3.08G [00:56<00:33, 37.0MiB/s]
 60%|█████▉    | 1.85G/3.08G [00:57<00:34, 36.1MiB/s]
 60%|██████    | 1.85G/3.08G [00:57<00:35, 34.2MiB/s]
 60%|██████    | 1.86G/3.08G [00:57<00:31, 38.3MiB/s]
 60%|██████    | 1.86G/3.08G [00:57<00:32, 37.0MiB/s]
 61%|██████    | 1.87G/3.08G [00:57<00:35, 34.2MiB/s]
 61%|██████    | 1.87G/3.08G [00:57<00:43, 28.2MiB/s]
 61%|██████    | 1.88G/3.08G [00:57<00:36, 33.0MiB/s]
 61%|██████    | 1.89G/3.08G [00:58<00:33, 36.3MiB/s]
 61%|██████▏   | 1.89G/3.08G [00:58<00:37, 31.8MiB/s]
 61%|██████▏   | 1.89G/3.08G [00:58<00:36, 32.5MiB/s]
 62%|██████▏   | 1.90G/3.08G [00:58<00:38, 30.7MiB/s]
 62%|██████▏   | 1.90G/3.08G [00:58<00:34, 33.9MiB/s]
 62%|██████▏   | 1.91G/3.08G [00:58<00:38, 30.6MiB/s]
 62%|██████▏   | 1.91G/3.08G [00:59<00:38, 30.2MiB/s]
 62%|██████▏   | 1.92G/3.08G [00:59<00:30, 38.3MiB/s]
 63%|██████▎   | 1.93G/3.08G [00:59<00:26, 44.2MiB/s]
 63%|██████▎   | 1.93G/3.08G [00:59<00:34, 33.7MiB/s]
 63%|██████▎   | 1.94G/3.08G [00:59<00:34, 32.8MiB/s]
 63%|██████▎   | 1.94G/3.08G [00:59<00:33, 34.4MiB/s]
 63%|██████▎   | 1.95G/3.08G [01:00<00:38, 29.6MiB/s]
 63%|██████▎   | 1.95G/3.08G [01:00<00:35, 32.2MiB/s]
 64%|██████▎   | 1.96G/3.08G [01:00<00:29, 37.8MiB/s]
 64%|██████▎   | 1.97G/3.08G [01:00<00:33, 33.0MiB/s]
 64%|██████▍   | 1.97G/3.08G [01:00<00:37, 29.9MiB/s]
 64%|██████▍   | 1.97G/3.08G [01:00<00:41, 26.6MiB/s]
 64%|██████▍   | 1.98G/3.08G [01:00<00:34, 31.6MiB/s]
 64%|██████▍   | 1.98G/3.08G [01:01<00:37, 29.6MiB/s]
 64%|██████▍   | 1.99G/3.08G [01:01<00:35, 31.2MiB/s]
 65%|██████▍   | 2.00G/3.08G [01:01<00:26, 41.0MiB/s]
 65%|██████▍   | 2.00G/3.08G [01:01<00:35, 30.8MiB/s]
 65%|██████▍   | 2.00G/3.08G [01:01<00:43, 24.7MiB/s]
 65%|██████▌   | 2.01G/3.08G [01:02<00:42, 25.4MiB/s]
 65%|██████▌   | 2.01G/3.08G [01:02<00:41, 26.1MiB/s]
 65%|██████▌   | 2.01G/3.08G [01:02<00:43, 24.5MiB/s]
 65%|██████▌   | 2.02G/3.08G [01:02<00:35, 29.7MiB/s]
 66%|██████▌   | 2.02G/3.08G [01:02<00:35, 29.8MiB/s]
 66%|██████▌   | 2.03G/3.08G [01:02<00:37, 28.3MiB/s]
 66%|██████▌   | 2.03G/3.08G [01:02<00:39, 26.9MiB/s]
 66%|██████▌   | 2.03G/3.08G [01:02<00:42, 24.6MiB/s]
 66%|██████▌   | 2.04G/3.08G [01:03<00:31, 32.7MiB/s]
 66%|██████▋   | 2.05G/3.08G [01:03<00:23, 44.1MiB/s]
 67%|██████▋   | 2.05G/3.08G [01:03<00:27, 37.0MiB/s]
 67%|██████▋   | 2.06G/3.08G [01:03<00:29, 34.4MiB/s]
 67%|██████▋   | 2.06G/3.08G [01:03<00:33, 31.0MiB/s]
 67%|██████▋   | 2.06G/3.08G [01:03<00:32, 31.1MiB/s]
 67%|██████▋   | 2.07G/3.08G [01:03<00:39, 26.0MiB/s]
 67%|██████▋   | 2.07G/3.08G [01:04<00:35, 28.7MiB/s]
 67%|██████▋   | 2.07G/3.08G [01:04<00:36, 27.3MiB/s]
 67%|██████▋   | 2.08G/3.08G [01:04<00:27, 36.4MiB/s]
 68%|██████▊   | 2.09G/3.08G [01:04<00:30, 32.9MiB/s]
 68%|██████▊   | 2.09G/3.08G [01:04<00:30, 32.4MiB/s]
 68%|██████▊   | 2.10G/3.08G [01:04<00:29, 33.1MiB/s]
 68%|██████▊   | 2.10G/3.08G [01:04<00:31, 30.9MiB/s]
 68%|██████▊   | 2.10G/3.08G [01:05<00:31, 31.3MiB/s]
 68%|██████▊   | 2.11G/3.08G [01:05<00:33, 29.3MiB/s]
 68%|██████▊   | 2.11G/3.08G [01:05<00:36, 26.3MiB/s]
 69%|██████▊   | 2.11G/3.08G [01:05<00:38, 25.2MiB/s]
 69%|██████▉   | 2.12G/3.08G [01:05<00:34, 28.1MiB/s]
 69%|██████▉   | 2.13G/3.08G [01:05<00:25, 38.1MiB/s]
 69%|██████▉   | 2.13G/3.08G [01:06<00:26, 35.4MiB/s]
 69%|██████▉   | 2.14G/3.08G [01:06<00:32, 29.5MiB/s]
 69%|██████▉   | 2.14G/3.08G [01:06<00:33, 28.3MiB/s]
 70%|██████▉   | 2.15G/3.08G [01:06<00:30, 30.6MiB/s]
 70%|██████▉   | 2.15G/3.08G [01:06<00:25, 36.2MiB/s]
 70%|██████▉   | 2.16G/3.08G [01:06<00:30, 30.8MiB/s]
 70%|███████   | 2.16G/3.08G [01:07<00:28, 32.1MiB/s]
 70%|███████   | 2.17G/3.08G [01:07<00:27, 32.7MiB/s]
 71%|███████   | 2.17G/3.08G [01:07<00:30, 29.4MiB/s]
 71%|███████   | 2.18G/3.08G [01:07<00:29, 31.1MiB/s]
 71%|███████   | 2.18G/3.08G [01:07<00:34, 25.9MiB/s]
 71%|███████   | 2.19G/3.08G [01:07<00:30, 29.8MiB/s]
 71%|███████   | 2.19G/3.08G [01:08<00:39, 22.7MiB/s]
 71%|███████   | 2.20G/3.08G [01:08<00:31, 28.1MiB/s]
 71%|███████▏  | 2.20G/3.08G [01:08<00:34, 25.5MiB/s]
 72%|███████▏  | 2.21G/3.08G [01:08<00:28, 30.4MiB/s]
 72%|███████▏  | 2.21G/3.08G [01:08<00:22, 37.9MiB/s]
 72%|███████▏  | 2.22G/3.08G [01:08<00:20, 42.5MiB/s]
 72%|███████▏  | 2.23G/3.08G [01:09<00:24, 35.3MiB/s]
 72%|███████▏  | 2.23G/3.08G [01:09<00:23, 36.8MiB/s]
 73%|███████▎  | 2.24G/3.08G [01:09<00:19, 43.1MiB/s]
 73%|███████▎  | 2.24G/3.08G [01:09<00:20, 40.1MiB/s]
 73%|███████▎  | 2.25G/3.08G [01:09<00:22, 37.3MiB/s]
 73%|███████▎  | 2.25G/3.08G [01:09<00:22, 36.4MiB/s]
 73%|███████▎  | 2.26G/3.08G [01:09<00:28, 29.3MiB/s]
 73%|███████▎  | 2.26G/3.08G [01:10<00:27, 29.7MiB/s]
 73%|███████▎  | 2.27G/3.08G [01:10<00:30, 26.5MiB/s]
 74%|███████▎  | 2.27G/3.08G [01:10<00:27, 29.1MiB/s]
 74%|███████▎  | 2.27G/3.08G [01:10<00:29, 27.3MiB/s]
 74%|███████▍  | 2.28G/3.08G [01:10<00:25, 31.2MiB/s]
 74%|███████▍  | 2.28G/3.08G [01:10<00:27, 29.1MiB/s]
 74%|███████▍  | 2.29G/3.08G [01:10<00:25, 31.2MiB/s]
 74%|███████▍  | 2.29G/3.08G [01:11<00:27, 29.0MiB/s]
 75%|███████▍  | 2.30G/3.08G [01:11<00:20, 37.5MiB/s]
 75%|███████▍  | 2.30G/3.08G [01:11<00:22, 35.0MiB/s]
 75%|███████▍  | 2.31G/3.08G [01:11<00:25, 30.3MiB/s]
 75%|███████▍  | 2.31G/3.08G [01:11<00:26, 29.1MiB/s]
 75%|███████▌  | 2.31G/3.08G [01:11<00:21, 35.4MiB/s]
 75%|███████▌  | 2.32G/3.08G [01:11<00:25, 29.6MiB/s]
 75%|███████▌  | 2.32G/3.08G [01:12<00:25, 30.5MiB/s]
 75%|███████▌  | 2.33G/3.08G [01:12<00:27, 27.2MiB/s]
 76%|███████▌  | 2.33G/3.08G [01:12<00:25, 29.8MiB/s]
 76%|███████▌  | 2.34G/3.08G [01:12<00:22, 33.5MiB/s]
 76%|███████▌  | 2.35G/3.08G [01:12<00:18, 39.8MiB/s]
 76%|███████▋  | 2.36G/3.08G [01:12<00:18, 38.6MiB/s]
 77%|███████▋  | 2.36G/3.08G [01:13<00:19, 36.9MiB/s]
 77%|███████▋  | 2.37G/3.08G [01:13<00:20, 35.7MiB/s]
 77%|███████▋  | 2.37G/3.08G [01:13<00:17, 41.0MiB/s]
 77%|███████▋  | 2.38G/3.08G [01:13<00:18, 39.1MiB/s]
 77%|███████▋  | 2.38G/3.08G [01:13<00:21, 32.2MiB/s]
 77%|███████▋  | 2.39G/3.08G [01:13<00:22, 31.5MiB/s]
 78%|███████▊  | 2.39G/3.08G [01:14<00:23, 29.3MiB/s]
 78%|███████▊  | 2.40G/3.08G [01:14<00:19, 35.9MiB/s]
 78%|███████▊  | 2.41G/3.08G [01:14<00:16, 41.6MiB/s]
 78%|███████▊  | 2.41G/3.08G [01:14<00:17, 38.3MiB/s]
 78%|███████▊  | 2.42G/3.08G [01:14<00:24, 27.2MiB/s]
 79%|███████▊  | 2.42G/3.08G [01:15<00:20, 31.5MiB/s]
 79%|███████▉  | 2.43G/3.08G [01:15<00:16, 38.5MiB/s]
 79%|███████▉  | 2.44G/3.08G [01:15<00:15, 41.2MiB/s]
 79%|███████▉  | 2.45G/3.08G [01:15<00:15, 41.4MiB/s]
 80%|███████▉  | 2.45G/3.08G [01:15<00:19, 33.2MiB/s]
 80%|███████▉  | 2.46G/3.08G [01:15<00:19, 31.8MiB/s]
 80%|███████▉  | 2.46G/3.08G [01:16<00:16, 38.3MiB/s]
 80%|████████  | 2.47G/3.08G [01:16<00:17, 34.9MiB/s]
 80%|████████  | 2.47G/3.08G [01:16<00:18, 33.8MiB/s]
 81%|████████  | 2.48G/3.08G [01:16<00:14, 41.2MiB/s]
 81%|████████  | 2.49G/3.08G [01:16<00:13, 45.1MiB/s]
 81%|████████  | 2.49G/3.08G [01:16<00:14, 40.5MiB/s]
 81%|████████  | 2.50G/3.08G [01:16<00:16, 35.6MiB/s]
 81%|████████▏ | 2.51G/3.08G [01:17<00:14, 40.6MiB/s]
 81%|████████▏ | 2.51G/3.08G [01:17<00:14, 38.3MiB/s]
 82%|████████▏ | 2.52G/3.08G [01:17<00:15, 37.6MiB/s]
 82%|████████▏ | 2.52G/3.08G [01:17<00:16, 34.6MiB/s]
 82%|████████▏ | 2.52G/3.08G [01:17<00:14, 38.2MiB/s]
 82%|████████▏ | 2.53G/3.08G [01:17<00:17, 31.9MiB/s]
 82%|████████▏ | 2.53G/3.08G [01:17<00:16, 34.0MiB/s]
 82%|████████▏ | 2.54G/3.08G [01:18<00:12, 42.0MiB/s]
 83%|████████▎ | 2.54G/3.08G [01:18<00:17, 31.0MiB/s]
 83%|████████▎ | 2.55G/3.08G [01:18<00:16, 31.5MiB/s]
 83%|████████▎ | 2.56G/3.08G [01:18<00:14, 37.5MiB/s]
 83%|████████▎ | 2.56G/3.08G [01:18<00:23, 22.6MiB/s]
 83%|████████▎ | 2.57G/3.08G [01:19<00:18, 27.5MiB/s]
 83%|████████▎ | 2.57G/3.08G [01:19<00:18, 27.2MiB/s]
 84%|████████▎ | 2.58G/3.08G [01:19<00:19, 26.5MiB/s]
 84%|████████▎ | 2.58G/3.08G [01:19<00:15, 32.1MiB/s]
 84%|████████▍ | 2.59G/3.08G [01:19<00:19, 25.4MiB/s]
 84%|████████▍ | 2.59G/3.08G [01:19<00:17, 27.9MiB/s]
 84%|████████▍ | 2.59G/3.08G [01:20<00:19, 25.3MiB/s]
 84%|████████▍ | 2.60G/3.08G [01:20<00:16, 29.3MiB/s]
 84%|████████▍ | 2.60G/3.08G [01:20<00:23, 20.9MiB/s]
 85%|████████▍ | 2.61G/3.08G [01:20<00:18, 26.4MiB/s]
 85%|████████▍ | 2.61G/3.08G [01:20<00:18, 26.2MiB/s]
 85%|████████▍ | 2.62G/3.08G [01:20<00:16, 29.2MiB/s]
 85%|████████▍ | 2.62G/3.08G [01:21<00:17, 27.0MiB/s]
 85%|████████▌ | 2.62G/3.08G [01:21<00:14, 30.7MiB/s]
 85%|████████▌ | 2.63G/3.08G [01:21<00:15, 29.7MiB/s]
 85%|████████▌ | 2.63G/3.08G [01:21<00:11, 38.7MiB/s]
 86%|████████▌ | 2.64G/3.08G [01:21<00:13, 33.9MiB/s]
 86%|████████▌ | 2.64G/3.08G [01:21<00:14, 29.5MiB/s]
 86%|████████▌ | 2.65G/3.08G [01:21<00:12, 35.7MiB/s]
 86%|████████▌ | 2.65G/3.08G [01:22<00:14, 30.6MiB/s]
 86%|████████▌ | 2.66G/3.08G [01:22<00:14, 29.1MiB/s]
 86%|████████▋ | 2.67G/3.08G [01:22<00:10, 39.2MiB/s]
 87%|████████▋ | 2.67G/3.08G [01:22<00:09, 42.3MiB/s]
 87%|████████▋ | 2.68G/3.08G [01:22<00:13, 29.3MiB/s]
 87%|████████▋ | 2.68G/3.08G [01:22<00:12, 31.9MiB/s]
 87%|████████▋ | 2.69G/3.08G [01:23<00:12, 31.7MiB/s]
 87%|████████▋ | 2.69G/3.08G [01:23<00:12, 30.0MiB/s]
 88%|████████▊ | 2.70G/3.08G [01:23<00:12, 30.9MiB/s]
 88%|████████▊ | 2.70G/3.08G [01:23<00:12, 30.5MiB/s]
 88%|████████▊ | 2.71G/3.08G [01:23<00:12, 31.3MiB/s]
 88%|████████▊ | 2.71G/3.08G [01:23<00:15, 24.5MiB/s]
 88%|████████▊ | 2.72G/3.08G [01:24<00:13, 27.5MiB/s]
 88%|████████▊ | 2.72G/3.08G [01:24<00:15, 23.7MiB/s]
 88%|████████▊ | 2.72G/3.08G [01:24<00:12, 28.2MiB/s]
 88%|████████▊ | 2.73G/3.08G [01:24<00:11, 29.9MiB/s]
 89%|████████▊ | 2.73G/3.08G [01:24<00:11, 29.7MiB/s]
 89%|████████▉ | 2.74G/3.08G [01:24<00:08, 40.4MiB/s]
 89%|████████▉ | 2.75G/3.08G [01:25<00:09, 36.3MiB/s]
 89%|████████▉ | 2.75G/3.08G [01:25<00:10, 32.6MiB/s]
 90%|████████▉ | 2.76G/3.08G [01:25<00:07, 41.5MiB/s]
 90%|████████▉ | 2.77G/3.08G [01:25<00:08, 36.8MiB/s]
 90%|████████▉ | 2.77G/3.08G [01:25<00:10, 30.1MiB/s]
 90%|█████████ | 2.78G/3.08G [01:25<00:09, 31.3MiB/s]
 90%|█████████ | 2.78G/3.08G [01:26<00:09, 33.3MiB/s]
 90%|█████████ | 2.79G/3.08G [01:26<00:10, 29.0MiB/s]
 91%|█████████ | 2.79G/3.08G [01:26<00:09, 30.7MiB/s]
 91%|█████████ | 2.80G/3.08G [01:26<00:09, 29.7MiB/s]
 91%|█████████ | 2.80G/3.08G [01:26<00:08, 33.9MiB/s]
 91%|█████████ | 2.81G/3.08G [01:26<00:06, 39.9MiB/s]
 91%|█████████▏| 2.82G/3.08G [01:27<00:07, 34.9MiB/s]
 91%|█████████▏| 2.82G/3.08G [01:27<00:08, 30.5MiB/s]
 92%|█████████▏| 2.83G/3.08G [01:27<00:08, 30.9MiB/s]
 92%|█████████▏| 2.83G/3.08G [01:27<00:07, 32.0MiB/s]
 92%|█████████▏| 2.84G/3.08G [01:27<00:08, 30.1MiB/s]
 92%|█████████▏| 2.84G/3.08G [01:27<00:06, 34.9MiB/s]
 92%|█████████▏| 2.85G/3.08G [01:28<00:07, 31.2MiB/s]
 92%|█████████▏| 2.85G/3.08G [01:28<00:07, 30.8MiB/s]
 93%|█████████▎| 2.86G/3.08G [01:28<00:06, 36.7MiB/s]
 93%|█████████▎| 2.86G/3.08G [01:28<00:06, 34.6MiB/s]
 93%|█████████▎| 2.87G/3.08G [01:28<00:05, 36.2MiB/s]
 93%|█████████▎| 2.88G/3.08G [01:28<00:05, 36.1MiB/s]
 93%|█████████▎| 2.88G/3.08G [01:28<00:05, 35.8MiB/s]
 94%|█████████▎| 2.89G/3.08G [01:29<00:05, 33.4MiB/s]
 94%|█████████▍| 2.89G/3.08G [01:29<00:05, 37.0MiB/s]
 94%|█████████▍| 2.90G/3.08G [01:29<00:04, 38.1MiB/s]
 94%|█████████▍| 2.90G/3.08G [01:29<00:04, 37.7MiB/s]
 94%|█████████▍| 2.91G/3.08G [01:29<00:04, 43.4MiB/s]
 94%|█████████▍| 2.91G/3.08G [01:29<00:04, 38.8MiB/s]
 95%|█████████▍| 2.92G/3.08G [01:29<00:04, 37.2MiB/s]
 95%|█████████▍| 2.92G/3.08G [01:30<00:04, 33.0MiB/s]
 95%|█████████▍| 2.93G/3.08G [01:30<00:04, 38.8MiB/s]
 95%|█████████▌| 2.94G/3.08G [01:30<00:03, 39.5MiB/s]
 95%|█████████▌| 2.94G/3.08G [01:30<00:03, 46.3MiB/s]
 96%|█████████▌| 2.95G/3.08G [01:30<00:02, 47.6MiB/s]
 96%|█████████▌| 2.96G/3.08G [01:30<00:02, 50.6MiB/s]
 96%|█████████▌| 2.96G/3.08G [01:31<00:02, 39.9MiB/s]
 96%|█████████▋| 2.97G/3.08G [01:31<00:03, 37.2MiB/s]
 96%|█████████▋| 2.97G/3.08G [01:31<00:03, 35.7MiB/s]
 97%|█████████▋| 2.98G/3.08G [01:31<00:03, 33.7MiB/s]
 97%|█████████▋| 2.98G/3.08G [01:31<00:03, 30.1MiB/s]
 97%|█████████▋| 2.99G/3.08G [01:31<00:03, 27.3MiB/s]
 97%|█████████▋| 2.99G/3.08G [01:32<00:03, 28.8MiB/s]
 97%|█████████▋| 3.00G/3.08G [01:32<00:03, 24.8MiB/s]
 97%|█████████▋| 3.00G/3.08G [01:32<00:02, 27.7MiB/s]
 98%|█████████▊| 3.01G/3.08G [01:32<00:02, 34.2MiB/s]
 98%|█████████▊| 3.02G/3.08G [01:32<00:01, 33.2MiB/s]
 98%|█████████▊| 3.02G/3.08G [01:33<00:02, 29.5MiB/s]
 98%|█████████▊| 3.03G/3.08G [01:33<00:01, 31.2MiB/s]
 98%|█████████▊| 3.04G/3.08G [01:33<00:01, 32.5MiB/s]
 99%|█████████▊| 3.05G/3.08G [01:33<00:00, 40.4MiB/s]
 99%|█████████▉| 3.05G/3.08G [01:33<00:00, 46.9MiB/s]
 99%|█████████▉| 3.06G/3.08G [01:33<00:00, 42.0MiB/s]
 99%|█████████▉| 3.06G/3.08G [01:34<00:00, 35.2MiB/s]
100%|█████████▉| 3.07G/3.08G [01:34<00:00, 40.7MiB/s]
100%|█████████▉| 3.07G/3.08G [01:34<00:00, 40.1MiB/s]
100%|█████████▉| 3.08G/3.08G [01:34<00:00, 37.3MiB/s]
100%|██████████| 3.08G/3.08G [01:34<00:00, 32.6MiB/s]

然后我们可以将标注加载到数据框中。

dataset_path = os.path.join(download_dir, 'Stanford_Online_Products')
train_data = pd.read_csv(f'{dataset_path}/train.csv', index_col=0)
test_data = pd.read_csv(f'{dataset_path}/test.csv', index_col=0)
image_col_1 = "Image1"
image_col_2 = "Image2"
label_col = "Label"
match_label = 1

在这里,您需要指定 match_label,即代表图像对语义匹配的标签类别。在此演示数据集中,我们使用 1,因为我们将同一产品的图像对标记为 1。您可以根据您的任务上下文来指定 match_label

接下来,我们扩展图像路径,因为原始路径是相对路径。

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])

for image_col in [image_col_1, image_col_2]:
    train_data[image_col] = train_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))

标注只包含图像路径对及其二分类标签(1 和 0 分别表示图像对匹配或不匹配)。

train_data.head()
图像 1 图像 2 标签
0 /home/ci/autogluon/docs/tutorials/multimodal/s... /home/ci/autogluon/docs/tutorials/multimodal/s... 0
1 /home/ci/autogluon/docs/tutorials/multimodal/s... /home/ci/autogluon/docs/tutorials/multimodal/s... 1
2 /home/ci/autogluon/docs/tutorials/multimodal/s... /home/ci/autogluon/docs/tutorials/multimodal/s... 0
3 /home/ci/autogluon/docs/tutorials/multimodal/s... /home/ci/autogluon/docs/tutorials/multimodal/s... 1
4 /home/ci/autogluon/docs/tutorials/multimodal/s... /home/ci/autogluon/docs/tutorials/multimodal/s... 1

让我们可视化一个匹配的图像对。

pil_img = Image(filename=train_data[image_col_1][5])
display(pil_img)
../../../_images/bb974c2313e407da07bd3116bd05a9f54177e56ad4db7abbe4b12d942b61e690.jpg
pil_img = Image(filename=train_data[image_col_2][5])
display(pil_img)
../../../_images/29306ce239dcc133e203844dabb5d4f6c857cbad01629c1417af70cc0e4439f1.jpg

这是两个不匹配的图像。

pil_img = Image(filename=train_data[image_col_1][0])
display(pil_img)
../../../_images/a621da214cd4da90f23e426b98e022f230dcb85c28ff02781f0b86601b9217df.jpg
pil_img = Image(filename=train_data[image_col_2][0])
display(pil_img)
../../../_images/484a72df3a82256b4fba32a375140456070318d11cc975367038fe1f0e746dee.jpg

训练模型

理想情况下,我们希望获得一个能够为正样本对/负样本对返回高分/低分的模型。使用 AutoMM,我们可以轻松训练一个捕获图像之间语义关系的模型。基本上,它使用 Swin Transformer 将每张图像投影到高维向量,并计算特征向量的余弦相似度。

使用 AutoMM,您只需指定 queryresponselabel 列名,然后在训练数据集上拟合模型,无需担心实现细节。

from autogluon.multimodal import MultiModalPredictor
predictor = MultiModalPredictor(
        problem_type="image_similarity",
        query=image_col_1, # the column name of the first image
        response=image_col_2, # the column name of the second image
        label=label_col, # the label column name
        match_label=match_label, # the label indicating that query and response have the same semantic meanings.
        eval_metric='auc', # the evaluation metric
    )
    
# Fit the model
predictor.fit(
    train_data=train_data,
    time_limit=180,
)
No path specified. Models will be saved in: "AutogluonModels/ag-20250508_205823"
=================== System Info ===================
AutoGluon Version:  1.3.1b20250508
Python Version:     3.11.9
Operating System:   Linux
Platform Machine:   x86_64
Platform Version:   #1 SMP Wed Mar 12 14:53:59 UTC 2025
CPU Count:          8
Pytorch Version:    2.6.0+cu124
CUDA Version:       12.4
Memory Avail:       28.20 GB / 30.95 GB (91.1%)
Disk Space Avail:   178.56 GB / 255.99 GB (69.8%)
===================================================
AutoGluon infers your prediction problem is: 'binary' (because only two unique label-values observed).
	2 unique label values:  [np.int64(0), np.int64(1)]
	If 'binary' is not the correct problem_type, please manually specify the problem_type parameter during Predictor init (You may specify problem_type as one of: ['binary', 'multiclass', 'regression', 'quantile'])

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-20250508_205823
    ```
INFO: Seed set to 0
WARNING:timm.models._builder:Unexpected keys (head.fc.fc1.bias, head.fc.fc1.weight, head.fc.norm.bias, head.fc.norm.weight) found while loading pretrained weights. This may be expected if model is being adapted.
GPU Count: 1
GPU Count to be Used: 1
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       | TimmAutoModelForImagePrediction | 93.3 M | train
1 | response_model    | TimmAutoModelForImagePrediction | 93.3 M | train
2 | validation_metric | BinaryAUROC                     | 0      | train
3 | loss_func         | ContrastiveLoss                 | 0      | train
4 | miner_func        | PairMarginMiner                 | 0      | train
------------------------------------------------------------------------------
93.3 M    Trainable params
0         Non-trainable params
93.3 M    Total params
373.248   Total estimated model params size (MB)
866       Modules in train mode
0         Modules in eval mode
INFO: Epoch 0, global step 15: 'val_roc_auc' reached 0.82784 (best 0.82784), saving model to '/home/ci/autogluon/docs/tutorials/multimodal/semantic_matching/AutogluonModels/ag-20250508_205823/epoch=0-step=15.ckpt' as top 3
INFO: Time limit reached. Elapsed time is 0:03:00. Signaling Trainer to stop.
INFO: Epoch 0, global step 23: 'val_roc_auc' reached 0.89310 (best 0.89310), saving model to '/home/ci/autogluon/docs/tutorials/multimodal/semantic_matching/AutogluonModels/ag-20250508_205823/epoch=0-step=23.ckpt' as top 3
Start to fuse 2 checkpoints via the greedy soup algorithm.
INFO: Using default `ModelCheckpoint`. Consider installing `litmodels` package to enable `LitModelCheckpoint` for automatic upload to the Lightning model registry.
INFO: Using default `ModelCheckpoint`. Consider installing `litmodels` package to enable `LitModelCheckpoint` for automatic upload to the Lightning model registry.
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-20250508_205823")
    ```

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

在测试数据集上评估

您可以在测试数据集上评估预测器,查看其在 roc_auc 分数上的表现。

score = predictor.evaluate(test_data)
print("evaluation score: ", score)
evaluation score:  {'roc_auc': np.float64(0.8946748085592974)}
INFO: Using default `ModelCheckpoint`. Consider installing `litmodels` package to enable `LitModelCheckpoint` for automatic upload to the Lightning model registry.

对图像对进行预测

给出新的图像对,我们可以预测它们是否匹配。

pred = predictor.predict(test_data.head(3))
print(pred)
0    1
1    1
2    1
Name: Label, dtype: int64
INFO: Using default `ModelCheckpoint`. Consider installing `litmodels` package to enable `LitModelCheckpoint` for automatic upload to the Lightning model registry.

预测使用朴素的概率阈值 0.5。也就是说,我们选择概率大于 0.5 的标签。

预测匹配概率

然而,您可以通过获取概率来进行更自定义的阈值处理。

proba = predictor.predict_proba(test_data.head(3))
print(proba)
          0         1
0  0.322680  0.677320
1  0.051566  0.948434
2  0.073345  0.926655
INFO: Using default `ModelCheckpoint`. Consider installing `litmodels` package to enable `LitModelCheckpoint` for automatic upload to the Lightning model registry.

提取嵌入

您还可以提取图像对中每张图像的嵌入。

embeddings_1 = predictor.extract_embedding({image_col_1: test_data[image_col_1][:5].tolist()})
print(embeddings_1.shape)
embeddings_2 = predictor.extract_embedding({image_col_2: test_data[image_col_2][:5].tolist()})
print(embeddings_2.shape)
(5, 768)
(5, 768)
INFO: Using default `ModelCheckpoint`. Consider installing `litmodels` package to enable `LitModelCheckpoint` for automatic upload to the Lightning model registry.
INFO: Using default `ModelCheckpoint`. Consider installing `litmodels` package to enable `LitModelCheckpoint` for automatic upload to the Lightning model registry.

其他示例

您可以前往 AutoMM Examples 探索关于 AutoMM 的其他示例。

自定义

要了解如何自定义 AutoMM,请参考 自定义 AutoMM