AutoMM Detection - 在小型 COCO 格式数据集上的快速入门

Open In Colab Open In SageMaker Studio Lab

在本节中,我们的目标是在一个小型 COCO 格式数据集上快速微调预训练模型,并在其测试集上进行评估。训练集和测试集都采用 COCO 格式。有关如何将其他数据集转换为 COCO 格式的信息,请参阅将数据转换为 COCO 格式

设置导入

首先,确保已安装 mmcvmmdet注意:MMDet 已不再积极维护,仅兼容 MMCV 2.1.0 版本。安装可能因 CUDA 版本兼容性问题而出现问题。为获得最佳结果

  1. 使用 CUDA 12.4 和 PyTorch 2.5

  2. 安装前,运行

    pip install -U pip setuptools wheel
    sudo apt-get install -y ninja-build gcc g++
    

    这有助于防止 MMCV 在构建轮子时卡住。

  3. 在 Jupyter notebook 中安装后,请重启内核以使更改生效。

# Update package tools and install build dependencies
!pip install -U pip setuptools wheel
!sudo apt-get install -y ninja-build gcc g++

# Install MMCV
!python3 -m mim install "mmcv==2.1.0"

# For Google Colab users: If the above fails, use this alternative MMCV installation
# pip install "mmcv==2.1.0" -f https://download.openmmlab.com/mmcv/dist/cu121/torch2.1.0/index.html

# Install MMDet
!python3 -m pip install "mmdet==3.2.0"

# Install MMEngine (version >=0.10.6 for PyTorch 2.5 compatibility)
!python3 -m pip install "mmengine>=0.10.6"
隐藏代码单元输出
Requirement already satisfied: pip in /home/ci/opt/venv/lib/python3.11/site-packages (25.1.1)
Requirement already satisfied: setuptools in /home/ci/opt/venv/lib/python3.11/site-packages (80.3.1)
Requirement already satisfied: wheel in /home/ci/opt/venv/lib/python3.11/site-packages (0.45.1)
/usr/bin/sh: 1: sudo: not found
Looking in links: https://download.openmmlab.com/mmcv/dist/cu124/torch2.6.0/index.html
Requirement already satisfied: mmcv==2.1.0 in /home/ci/opt/venv/lib/python3.11/site-packages (2.1.0)
Requirement already satisfied: addict in /home/ci/opt/venv/lib/python3.11/site-packages (from mmcv==2.1.0) (2.4.0)
Requirement already satisfied: mmengine>=0.3.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from mmcv==2.1.0) (0.10.7)
Requirement already satisfied: numpy in /home/ci/opt/venv/lib/python3.11/site-packages (from mmcv==2.1.0) (2.1.3)
Requirement already satisfied: packaging in /home/ci/opt/venv/lib/python3.11/site-packages (from mmcv==2.1.0) (24.2)
Requirement already satisfied: Pillow in /home/ci/opt/venv/lib/python3.11/site-packages (from mmcv==2.1.0) (11.2.1)
Requirement already satisfied: pyyaml in /home/ci/opt/venv/lib/python3.11/site-packages (from mmcv==2.1.0) (6.0.2)
Requirement already satisfied: yapf in /home/ci/opt/venv/lib/python3.11/site-packages (from mmcv==2.1.0) (0.43.0)
Requirement already satisfied: matplotlib in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.3.0->mmcv==2.1.0) (3.10.3)
Requirement already satisfied: rich in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.3.0->mmcv==2.1.0) (14.0.0)
Requirement already satisfied: termcolor in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.3.0->mmcv==2.1.0) (3.1.0)
Requirement already satisfied: opencv-python>=3 in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.3.0->mmcv==2.1.0) (4.11.0.86)
Requirement already satisfied: contourpy>=1.0.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.3.0->mmcv==2.1.0) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.3.0->mmcv==2.1.0) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.3.0->mmcv==2.1.0) (4.57.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.3.0->mmcv==2.1.0) (1.4.8)
Requirement already satisfied: pyparsing>=2.3.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.3.0->mmcv==2.1.0) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.3.0->mmcv==2.1.0) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /home/ci/opt/venv/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib->mmengine>=0.3.0->mmcv==2.1.0) (1.17.0)
Requirement already satisfied: markdown-it-py>=2.2.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from rich->mmengine>=0.3.0->mmcv==2.1.0) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from rich->mmengine>=0.3.0->mmcv==2.1.0) (2.19.1)
Requirement already satisfied: mdurl~=0.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from markdown-it-py>=2.2.0->rich->mmengine>=0.3.0->mmcv==2.1.0) (0.1.2)
Requirement already satisfied: platformdirs>=3.5.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from yapf->mmcv==2.1.0) (4.3.8)
Requirement already satisfied: mmdet==3.2.0 in /home/ci/opt/venv/lib/python3.11/site-packages (3.2.0)
Requirement already satisfied: matplotlib in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (3.10.3)
Requirement already satisfied: numpy in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (2.1.3)
Requirement already satisfied: pycocotools in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (2.0.8)
Requirement already satisfied: scipy in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (1.15.3)
Requirement already satisfied: shapely in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (2.1.0)
Requirement already satisfied: six in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (1.17.0)
Requirement already satisfied: terminaltables in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (3.1.10)
Requirement already satisfied: tqdm in /home/ci/opt/venv/lib/python3.11/site-packages (from mmdet==3.2.0) (4.67.1)
Requirement already satisfied: contourpy>=1.0.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (4.57.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (1.4.8)
Requirement already satisfied: packaging>=20.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (24.2)
Requirement already satisfied: pillow>=8 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (11.2.1)
Requirement already satisfied: pyparsing>=2.3.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmdet==3.2.0) (2.9.0.post0)
Requirement already satisfied: mmengine>=0.10.6 in /home/ci/opt/venv/lib/python3.11/site-packages (0.10.7)
Requirement already satisfied: addict in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (2.4.0)
Requirement already satisfied: matplotlib in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (3.10.3)
Requirement already satisfied: numpy in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (2.1.3)
Requirement already satisfied: pyyaml in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (6.0.2)
Requirement already satisfied: rich in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (14.0.0)
Requirement already satisfied: termcolor in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (3.1.0)
Requirement already satisfied: yapf in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (0.43.0)
Requirement already satisfied: opencv-python>=3 in /home/ci/opt/venv/lib/python3.11/site-packages (from mmengine>=0.10.6) (4.11.0.86)
Requirement already satisfied: contourpy>=1.0.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (4.57.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (1.4.8)
Requirement already satisfied: packaging>=20.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (24.2)
Requirement already satisfied: pillow>=8 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (11.2.1)
Requirement already satisfied: pyparsing>=2.3.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /home/ci/opt/venv/lib/python3.11/site-packages (from matplotlib->mmengine>=0.10.6) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /home/ci/opt/venv/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib->mmengine>=0.10.6) (1.17.0)
Requirement already satisfied: markdown-it-py>=2.2.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from rich->mmengine>=0.10.6) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /home/ci/opt/venv/lib/python3.11/site-packages (from rich->mmengine>=0.10.6) (2.19.1)
Requirement already satisfied: mdurl~=0.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from markdown-it-py>=2.2.0->rich->mmengine>=0.10.6) (0.1.2)
Requirement already satisfied: platformdirs>=3.5.1 in /home/ci/opt/venv/lib/python3.11/site-packages (from yapf->mmengine>=0.10.6) (4.3.8)

首先,让我们导入 MultiModalPredictor

from autogluon.multimodal import MultiModalPredictor

并导入本教程中将使用的其他一些包

import os
import time

from autogluon.core.utils.loaders import load_zip

下载数据

我们已在云中准备好了示例数据集。让我们下载它

zip_file = "https://automl-mm-bench.s3.amazonaws.com/object_detection_dataset/tiny_motorbike_coco.zip"
download_dir = "./tiny_motorbike_coco"

load_zip.unzip(zip_file, unzip_dir=download_dir)
data_dir = os.path.join(download_dir, "tiny_motorbike")
train_path = os.path.join(data_dir, "Annotations", "trainval_cocoformat.json")
test_path = os.path.join(data_dir, "Annotations", "test_cocoformat.json")
Downloading ./tiny_motorbike_coco/file.zip from https://automl-mm-bench.s3.amazonaws.com/object_detection_dataset/tiny_motorbike_coco.zip...
  0%|          | 0.00/21.8M [00:00<?, ?iB/s]
 52%|█████▏    | 11.3M/21.8M [00:00<00:00, 113MiB/s]
100%|██████████| 21.8M/21.8M [00:00<00:00, 105MiB/s]

数据集格式

对于 COCO 格式数据集,为每个分割提供 JSON 注解文件

  • trainval_cocoformat.json: 训练和验证数据

  • test_cocoformat.json: 测试数据

模型选择

我们使用 medium_quality 预设,其特点是

  • 基础模型:YOLOX-large(在 COCO 上预训练)

  • 优点:快速微调、快速推理、易于部署

可用的替代预设

  • high_quality: DINO-Resnet50 模型

  • best_quality: DINO-SwinL 模型

这两种替代方案都能提供更高的性能,但代价是处理速度较慢且 GPU 内存需求较高。

presets = "medium_quality"

创建 MultiModalPredictor 时,指定以下关键参数

  • problem_type="object_detection" 用于定义任务

  • presets="medium_quality" 用于选择预设

  • sample_data_path 指向任何数据集分割(通常是 train_path)以推断对象类别

  • path (可选) 用于设置自定义保存位置

如果未指定路径,模型将自动保存到 AutogluonModels/ 下的一个带时间戳的目录中。

# Init predictor
import uuid

model_path = f"./tmp/{uuid.uuid4().hex}-quick_start_tutorial_temp_save"

predictor = MultiModalPredictor(
    problem_type="object_detection",
    sample_data_path=train_path,
    presets=presets,
    path=model_path,
)

微调模型

模型使用针对学习率、周期和批量大小优化的预设配置。默认情况下,它采用两阶段学习率策略

模型头层使用 100 倍更高的学习率。这种方法加速收敛并通常提高性能,尤其适用于小型数据集(数百到数千张图像)。

下面的计时结果来自在 AWS g4.2xlarge EC2 实例上进行的测试运行

start = time.time()
predictor.fit(train_path)  # Fit
train_end = time.time()
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
Downloading yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth from https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_l_8x8_300e_coco/yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth...
Loads checkpoint by local backend from path: yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth
The model and loaded state dict do not match exactly

size mismatch for bbox_head.multi_level_conv_cls.0.weight: copying a param with shape torch.Size([80, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([10, 256, 1, 1]).
size mismatch for bbox_head.multi_level_conv_cls.0.bias: copying a param with shape torch.Size([80]) from checkpoint, the shape in current model is torch.Size([10]).
size mismatch for bbox_head.multi_level_conv_cls.1.weight: copying a param with shape torch.Size([80, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([10, 256, 1, 1]).
size mismatch for bbox_head.multi_level_conv_cls.1.bias: copying a param with shape torch.Size([80]) from checkpoint, the shape in current model is torch.Size([10]).
size mismatch for bbox_head.multi_level_conv_cls.2.weight: copying a param with shape torch.Size([80, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([10, 256, 1, 1]).
size mismatch for bbox_head.multi_level_conv_cls.2.bias: copying a param with shape torch.Size([80]) from checkpoint, the shape in current model is torch.Size([10]).
=================== 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.41 GB / 30.95 GB (91.8%)
Disk Space Avail:   WARNING, an exception (FileNotFoundError) occurred while attempting to get available disk space. Consider opening a GitHub Issue.
===================================================
Using default root folder: ./tiny_motorbike_coco/tiny_motorbike/Annotations/... Specify `model.mmdet_image.coco_root=...` in hyperparameters if you think it is wrong.

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/object_detection/quick_start/tmp/d91b34b2af624db583e124c991ea34d8-quick_start_tutorial_temp_save
    ```
Seed set to 0
  0%|          | 0.00/217M [00:00<?, ?iB/s]
  0%|          | 228k/217M [00:00<01:37, 2.23MiB/s]
  0%|          | 523k/217M [00:00<01:23, 2.58MiB/s]
  0%|          | 884k/217M [00:00<01:11, 3.04MiB/s]
  1%|          | 1.33M/217M [00:00<01:00, 3.58MiB/s]
  1%|          | 1.88M/217M [00:00<00:50, 4.27MiB/s]
  1%|          | 2.57M/217M [00:00<00:41, 5.13MiB/s]
  2%|▏         | 3.44M/217M [00:00<00:34, 6.27MiB/s]
  2%|▏         | 4.46M/217M [00:00<00:28, 7.50MiB/s]
  3%|▎         | 5.73M/217M [00:00<00:23, 9.14MiB/s]
  3%|▎         | 7.26M/217M [00:01<00:19, 11.0MiB/s]
  4%|▍         | 8.80M/217M [00:01<00:16, 12.3MiB/s]
  5%|▍         | 10.4M/217M [00:01<00:15, 13.3MiB/s]
  6%|▌         | 12.0M/217M [00:01<00:14, 14.2MiB/s]
  6%|▌         | 13.5M/217M [00:01<00:13, 14.6MiB/s]
  7%|▋         | 15.2M/217M [00:01<00:13, 15.1MiB/s]
  8%|▊         | 16.8M/217M [00:01<00:12, 15.5MiB/s]
  8%|▊         | 18.4M/217M [00:01<00:12, 15.7MiB/s]
  9%|▉         | 20.1M/217M [00:01<00:12, 15.9MiB/s]
 10%|█         | 21.7M/217M [00:01<00:12, 16.0MiB/s]
 11%|█         | 23.4M/217M [00:02<00:12, 16.1MiB/s]
 12%|█▏        | 25.1M/217M [00:02<00:11, 16.2MiB/s]
 12%|█▏        | 26.8M/217M [00:02<00:11, 16.3MiB/s]
 13%|█▎        | 28.4M/217M [00:02<00:11, 16.3MiB/s]
 14%|█▍        | 30.1M/217M [00:02<00:11, 16.4MiB/s]
 15%|█▍        | 31.7M/217M [00:02<00:11, 16.4MiB/s]
 15%|█▌        | 33.4M/217M [00:02<00:11, 16.3MiB/s]
 16%|█▌        | 35.0M/217M [00:02<00:11, 16.3MiB/s]
 17%|█▋        | 36.6M/217M [00:02<00:11, 16.3MiB/s]
 18%|█▊        | 38.3M/217M [00:02<00:10, 16.3MiB/s]
 18%|█▊        | 39.9M/217M [00:03<00:11, 16.1MiB/s]
 19%|█▉        | 41.5M/217M [00:03<00:10, 16.2MiB/s]
 20%|█▉        | 43.2M/217M [00:03<00:10, 16.2MiB/s]
 21%|██        | 44.8M/217M [00:03<00:10, 16.0MiB/s]
 21%|██▏       | 46.5M/217M [00:03<00:10, 16.2MiB/s]
 22%|██▏       | 48.1M/217M [00:03<00:10, 16.1MiB/s]
 23%|██▎       | 49.9M/217M [00:03<00:10, 16.2MiB/s]
 24%|██▎       | 51.5M/217M [00:03<00:10, 16.2MiB/s]
 24%|██▍       | 53.2M/217M [00:03<00:10, 16.2MiB/s]
 25%|██▌       | 54.9M/217M [00:03<00:10, 16.2MiB/s]
 26%|██▌       | 56.6M/217M [00:04<00:09, 16.3MiB/s]
 27%|██▋       | 58.2M/217M [00:04<00:09, 16.3MiB/s]
 28%|██▊       | 59.9M/217M [00:04<00:09, 16.4MiB/s]
 28%|██▊       | 61.6M/217M [00:04<00:09, 16.3MiB/s]
 29%|██▉       | 63.5M/217M [00:04<00:09, 17.1MiB/s]
 30%|██▉       | 65.2M/217M [00:04<00:08, 17.0MiB/s]
 31%|███       | 66.9M/217M [00:04<00:08, 17.0MiB/s]
 32%|███▏      | 68.6M/217M [00:04<00:08, 16.9MiB/s]
 32%|███▏      | 70.3M/217M [00:04<00:08, 16.8MiB/s]
 33%|███▎      | 71.9M/217M [00:04<00:08, 16.7MiB/s]
 34%|███▍      | 73.7M/217M [00:05<00:08, 16.8MiB/s]
 35%|███▍      | 75.4M/217M [00:05<00:08, 16.8MiB/s]
 36%|███▌      | 77.3M/217M [00:05<00:08, 17.2MiB/s]
 36%|███▋      | 79.1M/217M [00:05<00:07, 17.3MiB/s]
 37%|███▋      | 80.9M/217M [00:05<00:07, 17.1MiB/s]
 38%|███▊      | 82.8M/217M [00:05<00:07, 17.6MiB/s]
 39%|███▉      | 84.5M/217M [00:05<00:07, 17.4MiB/s]
 40%|███▉      | 86.3M/217M [00:05<00:07, 17.1MiB/s]
 41%|████      | 88.2M/217M [00:05<00:07, 17.2MiB/s]
 41%|████▏     | 90.1M/217M [00:06<00:07, 17.3MiB/s]
 42%|████▏     | 92.0M/217M [00:06<00:07, 17.9MiB/s]
 43%|████▎     | 93.8M/217M [00:06<00:06, 17.7MiB/s]
 44%|████▍     | 95.6M/217M [00:06<00:06, 17.6MiB/s]
 45%|████▍     | 97.4M/217M [00:06<00:06, 17.3MiB/s]
 46%|████▌     | 99.1M/217M [00:06<00:06, 17.4MiB/s]
 46%|████▋     | 101M/217M [00:06<00:06, 17.2MiB/s]
 47%|████▋     | 103M/217M [00:06<00:06, 17.2MiB/s]
 48%|████▊     | 104M/217M [00:06<00:06, 17.1MiB/s]
 49%|████▉     | 106M/217M [00:06<00:06, 17.5MiB/s]
 50%|████▉     | 108M/217M [00:07<00:06, 17.4MiB/s]
 50%|█████     | 110M/217M [00:07<00:06, 17.3MiB/s]
 51%|█████▏    | 112M/217M [00:07<00:06, 17.6MiB/s]
 52%|█████▏    | 113M/217M [00:07<00:05, 17.6MiB/s]
 53%|█████▎    | 115M/217M [00:07<00:05, 17.9MiB/s]
 54%|█████▍    | 117M/217M [00:07<00:05, 17.9MiB/s]
 55%|█████▍    | 119M/217M [00:07<00:05, 17.7MiB/s]
 56%|█████▌    | 121M/217M [00:07<00:05, 17.8MiB/s]
 56%|█████▋    | 122M/217M [00:07<00:05, 17.7MiB/s]
 57%|█████▋    | 124M/217M [00:07<00:05, 17.9MiB/s]
 58%|█████▊    | 126M/217M [00:08<00:05, 17.6MiB/s]
 59%|█████▉    | 128M/217M [00:08<00:05, 16.2MiB/s]
 60%|█████▉    | 130M/217M [00:08<00:05, 16.6MiB/s]
 61%|██████    | 132M/217M [00:08<00:04, 17.2MiB/s]
 61%|██████▏   | 133M/217M [00:08<00:04, 17.3MiB/s]
 62%|██████▏   | 135M/217M [00:08<00:04, 17.2MiB/s]
 63%|██████▎   | 137M/217M [00:08<00:04, 17.2MiB/s]
 64%|██████▍   | 139M/217M [00:08<00:04, 17.7MiB/s]
 65%|██████▍   | 141M/217M [00:08<00:04, 17.7MiB/s]
 66%|██████▌   | 142M/217M [00:09<00:04, 17.5MiB/s]
 66%|██████▋   | 144M/217M [00:09<00:04, 17.6MiB/s]
 67%|██████▋   | 146M/217M [00:09<00:04, 17.7MiB/s]
 68%|██████▊   | 148M/217M [00:09<00:03, 17.8MiB/s]
 69%|██████▉   | 150M/217M [00:09<00:03, 17.7MiB/s]
 70%|██████▉   | 152M/217M [00:09<00:03, 18.1MiB/s]
 71%|███████   | 153M/217M [00:09<00:03, 17.8MiB/s]
 71%|███████▏  | 155M/217M [00:09<00:03, 17.8MiB/s]
 72%|███████▏  | 157M/217M [00:09<00:03, 17.5MiB/s]
 73%|███████▎  | 159M/217M [00:09<00:03, 17.4MiB/s]
 74%|███████▍  | 161M/217M [00:10<00:03, 17.2MiB/s]
 75%|███████▍  | 163M/217M [00:10<00:03, 17.4MiB/s]
 76%|███████▌  | 165M/217M [00:10<00:02, 18.1MiB/s]
 77%|███████▋  | 166M/217M [00:10<00:02, 17.8MiB/s]
 77%|███████▋  | 168M/217M [00:10<00:02, 17.5MiB/s]
 78%|███████▊  | 170M/217M [00:10<00:02, 17.4MiB/s]
 79%|███████▉  | 172M/217M [00:10<00:02, 17.4MiB/s]
 80%|███████▉  | 173M/217M [00:10<00:02, 17.3MiB/s]
 81%|████████  | 175M/217M [00:10<00:02, 18.0MiB/s]
 82%|████████▏ | 177M/217M [00:10<00:02, 17.8MiB/s]
 82%|████████▏ | 179M/217M [00:11<00:02, 17.5MiB/s]
 83%|████████▎ | 181M/217M [00:11<00:02, 17.4MiB/s]
 84%|████████▍ | 183M/217M [00:11<00:02, 17.3MiB/s]
 85%|████████▍ | 184M/217M [00:11<00:01, 17.1MiB/s]
 86%|████████▌ | 186M/217M [00:11<00:01, 17.1MiB/s]
 86%|████████▋ | 188M/217M [00:11<00:01, 17.0MiB/s]
 87%|████████▋ | 189M/217M [00:11<00:01, 17.0MiB/s]
 88%|████████▊ | 191M/217M [00:11<00:01, 17.0MiB/s]
 89%|████████▉ | 193M/217M [00:11<00:01, 17.6MiB/s]
 90%|████████▉ | 195M/217M [00:12<00:01, 17.6MiB/s]
 91%|█████████ | 197M/217M [00:12<00:01, 17.4MiB/s]
 91%|█████████▏| 199M/217M [00:12<00:01, 17.5MiB/s]
 92%|█████████▏| 200M/217M [00:12<00:00, 17.5MiB/s]
 93%|█████████▎| 202M/217M [00:12<00:00, 17.4MiB/s]
 94%|█████████▍| 204M/217M [00:12<00:00, 17.5MiB/s]
 95%|█████████▍| 206M/217M [00:12<00:00, 17.5MiB/s]
 96%|█████████▌| 208M/217M [00:12<00:00, 17.1MiB/s]
 96%|█████████▋| 210M/217M [00:12<00:00, 17.0MiB/s]
 97%|█████████▋| 211M/217M [00:12<00:00, 16.9MiB/s]
 98%|█████████▊| 213M/217M [00:13<00:00, 17.7MiB/s]
 99%|█████████▉| 215M/217M [00:13<00:00, 17.6MiB/s]
100%|█████████▉| 217M/217M [00:13<00:00, 17.4MiB/s]
GPU Count: 1
GPU Count to be Used: 1
Using 16bit Automatic Mixed Precision (AMP)
GPU available: True (cuda), used: True
TPU available: False, using: 0 TPU cores
HPU available: False, using: 0 HPUs
`Trainer(val_check_interval=1.0)` was configured so validation will run at the end of the training epoch..
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]

  | Name              | Type                             | Params | Mode 
-------------------------------------------------------------------------------
0 | model             | MMDetAutoModelForObjectDetection | 54.2 M | train
1 | validation_metric | MeanAveragePrecision             | 0      | train
-------------------------------------------------------------------------------
54.2 M    Trainable params
0         Non-trainable params
54.2 M    Total params
216.620   Total estimated model params size (MB)
592       Modules in train mode
0         Modules in eval mode
/home/ci/opt/venv/lib/python3.11/site-packages/mmdet/models/backbones/csp_darknet.py:118: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead.
  with torch.cuda.amp.autocast(enabled=False):
/home/ci/opt/venv/lib/python3.11/site-packages/torch/functional.py:539: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at /pytorch/aten/src/ATen/native/TensorShape.cpp:3637.)
  return _VF.meshgrid(tensors, **kwargs)  # type: ignore[attr-defined]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[8], line 2
      1 start = time.time()
----> 2 predictor.fit(train_path)  # Fit
      3 train_end = time.time()

File ~/autogluon/multimodal/src/autogluon/multimodal/predictor.py:540, in MultiModalPredictor.fit(self, train_data, presets, tuning_data, max_num_tuning_data, id_mappings, time_limit, save_path, hyperparameters, column_types, holdout_frac, teacher_predictor, seed, standalone, hyperparameter_tune_kwargs, clean_ckpts, predictions, labels, predictors)
    537     assert isinstance(predictors, list)
    538     learners = [ele if isinstance(ele, str) else ele._learner for ele in predictors]
--> 540 self._learner.fit(
    541     train_data=train_data,
    542     presets=presets,
    543     tuning_data=tuning_data,
    544     max_num_tuning_data=max_num_tuning_data,
    545     time_limit=time_limit,
    546     save_path=save_path,
    547     hyperparameters=hyperparameters,
    548     column_types=column_types,
    549     holdout_frac=holdout_frac,
    550     teacher_learner=teacher_learner,
    551     seed=seed,
    552     standalone=standalone,
    553     hyperparameter_tune_kwargs=hyperparameter_tune_kwargs,
    554     clean_ckpts=clean_ckpts,
    555     id_mappings=id_mappings,
    556     predictions=predictions,
    557     labels=labels,
    558     learners=learners,
    559 )
    561 return self

File ~/autogluon/multimodal/src/autogluon/multimodal/learners/object_detection.py:243, in ObjectDetectionLearner.fit(self, train_data, presets, tuning_data, max_num_tuning_data, time_limit, save_path, hyperparameters, column_types, holdout_frac, seed, standalone, hyperparameter_tune_kwargs, clean_ckpts, **kwargs)
    236 self.fit_sanity_check()
    237 self.prepare_fit_args(
    238     time_limit=time_limit,
    239     seed=seed,
    240     standalone=standalone,
    241     clean_ckpts=clean_ckpts,
    242 )
--> 243 fit_returns = self.execute_fit()
    244 self.on_fit_end(
    245     training_start=training_start,
    246     strategy=fit_returns.get("strategy", None),
   (...)
    249     clean_ckpts=clean_ckpts,
    250 )
    252 return self

File ~/autogluon/multimodal/src/autogluon/multimodal/learners/base.py:577, in BaseLearner.execute_fit(self)
    575     return dict()
    576 else:
--> 577     attributes = self.fit_per_run(**self._fit_args)
    578     self.update_attributes(**attributes)  # only update attributes for non-HPO mode
    579     return attributes

File ~/autogluon/multimodal/src/autogluon/multimodal/learners/object_detection.py:438, in ObjectDetectionLearner.fit_per_run(self, max_time, save_path, ckpt_path, resume, enable_progress_bar, seed, hyperparameters, advanced_hyperparameters, config, df_preprocessor, data_processors, model, standalone, clean_ckpts)
    419 config = self.post_update_config_per_run(
    420     config=config,
    421     num_gpus=num_gpus,
    422     precision=precision,
    423     strategy=strategy,
    424 )
    425 trainer = self.init_trainer_per_run(
    426     num_gpus=num_gpus,
    427     config=config,
   (...)
    435     enable_progress_bar=enable_progress_bar,
    436 )
--> 438 self.run_trainer(
    439     trainer=trainer,
    440     litmodule=litmodule,
    441     datamodule=datamodule,
    442     ckpt_path=ckpt_path,
    443     resume=resume,
    444 )
    445 self.on_fit_per_run_end(
    446     save_path=save_path,
    447     standalone=standalone,
   (...)
    452     model=model,
    453 )
    455 return dict(
    456     config=config,
    457     df_preprocessor=df_preprocessor,
   (...)
    461     strategy=strategy,
    462 )

File ~/autogluon/multimodal/src/autogluon/multimodal/learners/base.py:1211, in BaseLearner.run_trainer(self, trainer, litmodule, datamodule, ckpt_path, resume, pred_writer, is_train)
   1209     warnings.filterwarnings("ignore", filter)
   1210 if is_train:
-> 1211     trainer.fit(
   1212         litmodule,
   1213         datamodule=datamodule,
   1214         ckpt_path=ckpt_path if resume else None,  # this is to resume training that was broken accidentally
   1215     )
   1216 else:
   1217     blacklist_msgs = []

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/trainer/trainer.py:561, in Trainer.fit(self, model, train_dataloaders, val_dataloaders, datamodule, ckpt_path)
    559 self.training = True
    560 self.should_stop = False
--> 561 call._call_and_handle_interrupt(
    562     self, self._fit_impl, model, train_dataloaders, val_dataloaders, datamodule, ckpt_path
    563 )

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/trainer/call.py:48, in _call_and_handle_interrupt(trainer, trainer_fn, *args, **kwargs)
     46     if trainer.strategy.launcher is not None:
     47         return trainer.strategy.launcher.launch(trainer_fn, *args, trainer=trainer, **kwargs)
---> 48     return trainer_fn(*args, **kwargs)
     50 except _TunerExitException:
     51     _call_teardown_hook(trainer)

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/trainer/trainer.py:599, in Trainer._fit_impl(self, model, train_dataloaders, val_dataloaders, datamodule, ckpt_path)
    592     download_model_from_registry(ckpt_path, self)
    593 ckpt_path = self._checkpoint_connector._select_ckpt_path(
    594     self.state.fn,
    595     ckpt_path,
    596     model_provided=True,
    597     model_connected=self.lightning_module is not None,
    598 )
--> 599 self._run(model, ckpt_path=ckpt_path)
    601 assert self.state.stopped
    602 self.training = False

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/trainer/trainer.py:1012, in Trainer._run(self, model, ckpt_path)
   1007 self._signal_connector.register_signal_handlers()
   1009 # ----------------------------
   1010 # RUN THE TRAINER
   1011 # ----------------------------
-> 1012 results = self._run_stage()
   1014 # ----------------------------
   1015 # POST-Training CLEAN UP
   1016 # ----------------------------
   1017 log.debug(f"{self.__class__.__name__}: trainer tearing down")

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/trainer/trainer.py:1056, in Trainer._run_stage(self)
   1054         self._run_sanity_check()
   1055     with torch.autograd.set_detect_anomaly(self._detect_anomaly):
-> 1056         self.fit_loop.run()
   1057     return None
   1058 raise RuntimeError(f"Unexpected state {self.state}")

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/loops/fit_loop.py:216, in _FitLoop.run(self)
    214 try:
    215     self.on_advance_start()
--> 216     self.advance()
    217     self.on_advance_end()
    218 except StopIteration:

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/loops/fit_loop.py:455, in _FitLoop.advance(self)
    453 with self.trainer.profiler.profile("run_training_epoch"):
    454     assert self._data_fetcher is not None
--> 455     self.epoch_loop.run(self._data_fetcher)

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/loops/training_epoch_loop.py:150, in _TrainingEpochLoop.run(self, data_fetcher)
    148 while not self.done:
    149     try:
--> 150         self.advance(data_fetcher)
    151         self.on_advance_end(data_fetcher)
    152     except StopIteration:

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/loops/training_epoch_loop.py:282, in _TrainingEpochLoop.advance(self, data_fetcher)
    280 else:
    281     dataloader_iter = None
--> 282     batch, _, __ = next(data_fetcher)
    283     # TODO: we should instead use the batch_idx returned by the fetcher, however, that will require saving the
    284     # fetcher state so that the batch_idx is correct after restarting
    285     batch_idx = self.batch_idx + 1

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/loops/fetchers.py:134, in _PrefetchDataFetcher.__next__(self)
    131         self.done = not self.batches
    132 elif not self.done:
    133     # this will run only when no pre-fetching was done.
--> 134     batch = super().__next__()
    135 else:
    136     # the iterator is empty
    137     raise StopIteration

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/loops/fetchers.py:61, in _DataFetcher.__next__(self)
     59 self._start_profiler()
     60 try:
---> 61     batch = next(self.iterator)
     62 except StopIteration:
     63     self.done = True

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/utilities/combined_loader.py:341, in CombinedLoader.__next__(self)
    339 def __next__(self) -> _ITERATOR_RETURN:
    340     assert self._iterator is not None
--> 341     out = next(self._iterator)
    342     if isinstance(self._iterator, _Sequential):
    343         return out

File ~/opt/venv/lib/python3.11/site-packages/lightning/pytorch/utilities/combined_loader.py:78, in _MaxSizeCycle.__next__(self)
     76 for i in range(n):
     77     try:
---> 78         out[i] = next(self.iterators[i])
     79     except StopIteration:
     80         self._consumed[i] = True

File ~/opt/venv/lib/python3.11/site-packages/torch/utils/data/dataloader.py:708, in _BaseDataLoaderIter.__next__(self)
    705 if self._sampler_iter is None:
    706     # TODO(https://github.com/pytorch/pytorch/issues/76750)
    707     self._reset()  # type: ignore[call-arg]
--> 708 data = self._next_data()
    709 self._num_yielded += 1
    710 if (
    711     self._dataset_kind == _DatasetKind.Iterable
    712     and self._IterableDataset_len_called is not None
    713     and self._num_yielded > self._IterableDataset_len_called
    714 ):

File ~/opt/venv/lib/python3.11/site-packages/torch/utils/data/dataloader.py:1480, in _MultiProcessingDataLoaderIter._next_data(self)
   1478 del self._task_info[idx]
   1479 self._rcvd_idx += 1
-> 1480 return self._process_data(data)

File ~/opt/venv/lib/python3.11/site-packages/torch/utils/data/dataloader.py:1505, in _MultiProcessingDataLoaderIter._process_data(self, data)
   1503 self._try_put_index()
   1504 if isinstance(data, ExceptionWrapper):
-> 1505     data.reraise()
   1506 return data

File ~/opt/venv/lib/python3.11/site-packages/torch/_utils.py:733, in ExceptionWrapper.reraise(self)
    729 except TypeError:
    730     # If the exception takes multiple arguments, don't try to
    731     # instantiate since we don't know how to
    732     raise RuntimeError(msg) from None
--> 733 raise exception

TypeError: Caught TypeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ci/opt/venv/lib/python3.11/site-packages/torch/utils/data/_utils/worker.py", line 349, in _worker_loop
    data = fetcher.fetch(index)  # type: ignore[possibly-undefined]
           ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/opt/venv/lib/python3.11/site-packages/torch/utils/data/_utils/fetch.py", line 52, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/opt/venv/lib/python3.11/site-packages/torch/utils/data/_utils/fetch.py", line 52, in <listcomp>
    data = [self.dataset[idx] for idx in possibly_batched_index]
            ~~~~~~~~~~~~^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 146, in _load_item
    return self.__getitem__((idx + 1) % self.__len__())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 167, in __getitem__
    results = copy.deepcopy(self._load_item(idx))
                            ^^^^^^^^^^^^^^^^^^^^
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 148, in _load_item
    raise e
  File "/home/ci/autogluon/multimodal/src/autogluon/multimodal/data/dataset_mmlab/multi_image_mix_dataset.py", line 134, in _load_item
    per_ret = apply_data_processor(
              ^^^^^^^^^^^^^^^^^^^^^
TypeError: apply_data_processor() got an unexpected keyword argument 'feature_modalities'

请注意,在每个进度条的末尾,如果当前阶段的检查点已保存,它将打印模型的保存路径。在本例中,它是 ./quick_start_tutorial_temp_save

打印出时间,我们可以看到它很快!

print("This finetuning takes %.2f seconds." % (train_end - start))

评估

要评估我们刚刚训练的模型,运行以下代码。

评估结果会显示在命令行输出中。第一行是 COCO 标准下的 mAP,第二行是 VOC 标准下的 mAP(或 mAP50)。有关这些指标的更多详细信息,请参阅COCO 的评估指南。请注意,为了展示快速微调,我们使用了“medium_quality”预设,您只需使用“high_quality”或“best_quality”预设,或自定义您的模型和超参数设置即可在此数据集上获得更好的结果:自定义,以及快速微调 Coco高性能微调 Coco 中的其他一些示例。

predictor.evaluate(test_path)
eval_end = time.time()

打印评估时间

print("The evaluation takes %.2f seconds." % (eval_end - train_end))

我们可以使用先前的保存路径加载新的预测器,如果不是所有设备都可用,我们还可以重置使用的 GPU 数量

# Load and reset num_gpus
new_predictor = MultiModalPredictor.load(model_path)
new_predictor.set_num_gpus(1)

评估新的预测器会得到完全相同的结果

# Evaluate new predictor
new_predictor.evaluate(test_path)

有关如何设置超参数并以更高性能微调模型的信息,请参阅AutoMM Detection - 在 COCO 格式数据集上进行高性能微调

推理

让我们使用微调后的模型执行预测。预测器可以通过单个命令处理整个测试集

pred = predictor.predict(test_path)
print(len(pred))  # Number of predictions
print(pred[:3])   # Sample of first 3 predictions

预测器以 pandas DataFrame 的形式返回预测结果,包含两列

  • image: 包含每张输入图像的路径

  • bboxes: 包含检测到的对象列表,每个对象是一个字典

    {
        "class": "predicted_class_name",
        "bbox": [x1, y1, x2, y2],  # Coordinates of Upper Left and Bottom Right corners
        "score": confidence_score
    }
    

默认情况下,预测结果被返回但不会保存。要保存检测结果,请在 predict 调用中使用 save 参数。

pred = predictor.predict(test_path, save_results=True, as_coco=False)

预测结果可以保存为两种格式

  • CSV 文件:与包含 image 和 bboxes 列的 DataFrame 结构一致

  • COCO JSON:标准的 COCO 格式注解文件

这适用于任何预测器配置(预训练或微调的模型)。

结果可视化

要运行可视化,请确保已安装 opencv。如果尚未安装,请通过运行以下命令安装 opencv

!pip install opencv-python

要可视化检测到的边界框,运行以下代码

from autogluon.multimodal.utils import ObjectDetectionVisualizer

conf_threshold = 0.4  # Specify a confidence threshold to filter out unwanted boxes
image_result = pred.iloc[30]

img_path = image_result.image  # Select an image to visualize

visualizer = ObjectDetectionVisualizer(img_path)  # Initialize the Visualizer
out = visualizer.draw_instance_predictions(image_result, conf_threshold=conf_threshold)  # Draw detections
visualized = out.get_image()  # Get the visualized image

from PIL import Image
from IPython.display import display
img = Image.fromarray(visualized, 'RGB')
display(img)

在您自己的数据上进行测试

您还可以使用各种输入格式在您自己的图像上进行预测。以下是一个示例

下载示例图像

from autogluon.multimodal import download
image_url = "https://raw.githubusercontent.com/dmlc/web-data/master/gluoncv/detection/street_small.jpg"
test_image = download(image_url)

对 COCO 格式的 json 文件中的数据运行推理(有关 COCO 格式的更多详细信息,请参阅将数据转换为 COCO 格式)。请注意,由于根目录默认是注解文件的父文件夹,因此我们将注解文件放在一个文件夹中

import json

# create a input file for demo
data = {"images": [{"id": 0, "width": -1, "height": -1, "file_name": test_image}], "categories": []}
os.mkdir("input_data_for_demo")
input_file = "input_data_for_demo/demo_annotation.json"
with open(input_file, "w+") as f:
    json.dump(data, f)

pred_test_image = predictor.predict(input_file)
print(pred_test_image)

对图像文件名列表中的数据运行推理

pred_test_image = predictor.predict([test_image])
print(pred_test_image)

其他示例

您可以访问AutoMM 示例来探索 AutoMM 的其他示例。

定制

要了解如何定制 AutoMM,请参阅定制 AutoMM

引用

@article{DBLP:journals/corr/abs-2107-08430,
  author    = {Zheng Ge and
               Songtao Liu and
               Feng Wang and
               Zeming Li and
               Jian Sun},
  title     = {{YOLOX:} Exceeding {YOLO} Series in 2021},
  journal   = {CoRR},
  volume    = {abs/2107.08430},
  year      = {2021},
  url       = {https://arxiv.org/abs/2107.08430},
  eprinttype = {arXiv},
  eprint    = {2107.08430},
  timestamp = {Tue, 05 Apr 2022 14:09:44 +0200},
  biburl    = {https://dblp.org/rec/journals/corr/abs-2107-08430.bib},
  bibsource = {dblp computer science bibliography, https://dblp.org},
}