maskrcnn_benchmark 报错 target = target.resize(image.size)--->‘list‘ object has no attribute ‘resize‘

在maskrcnn_benchmark执行train_net.py时出现‘list’ object has no attribute ‘resize’错误,经定位是类COCODataset中声明的self.transforms覆盖父类的同名属性,推测是torchvision升级所致。解决方法是将类COCODataset中self.transforms重命名为self.transforms_,并修改__getitem__函数中的变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在maskrcnn_benchmark执行train_net.py的时候报了一个错误:‘list’ object has no attribute ‘resize’。
具体错误信息如下:

  File "/root/wh/PyCharm_Project/FCOS_PLUS-master/tools/train_net.py", line 182, in <module>
    main()
  File "/root/wh/PyCharm_Project/FCOS_PLUS-master/tools/train_net.py", line 173, in main
    model = train(cfg, args.local_rank, args.distributed)
  File "/root/wh/PyCharm_Project/FCOS_PLUS-master/tools/train_net.py", line 79, in train
    arguments,
  File "/root/wh/PyCharm_Project/FCOS_PLUS-master/maskrcnn_benchmark/engine/trainer.py", line 57, in do_train
    for iteration, (images, targets, _) in enumerate(data_loader, start_iter):
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 521, in __next__
    data = self._next_data()
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 1203, in _next_data
    return self._process_data(data)
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 1229, in _process_data
    data.reraise()
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torch/_utils.py", line 434, in reraise
    raise exception
AttributeError: Caught AttributeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torch/utils/data/_utils/worker.py", line 287, in _worker_loop
    data = fetcher.fetch(index)
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torch/utils/data/_utils/fetch.py", line 49, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torch/utils/data/_utils/fetch.py", line 49, in <listcomp>
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "/root/wh/PyCharm_Project/FCOS_PLUS-master/maskrcnn_benchmark/data/datasets/coco.py", line 67, in __getitem__
    img, anno = super(COCODataset, self).__getitem__(idx)
  File "/root/miniconda3/envs/OD_wh/lib/python3.6/site-packages/torchvision/datasets/coco.py", line 49, in __getitem__
    image, target = self.transforms(image, target)
  File "/root/wh/PyCharm_Project/FCOS_PLUS-master/maskrcnn_benchmark/data/transforms/transforms.py", line 15, in __call__
    image, target = t(image, target)
  File "/root/wh/PyCharm_Project/FCOS_PLUS-master/maskrcnn_benchmark/data/transforms/transforms.py", line 60, in __call__
    target = target.resize(image.size)
AttributeError: 'list' object has no attribute 'resize'

后经定位发现是

maskrcnn_benchmark/data/datasets/coco.py

中定义的类COCODataset中声明的self.transforms覆盖掉了父类torchvision.datasets.coco.CocoDetection中的self.transforms
PS:应该是torchvision升级导致的问题
**

解决方法:

**
将类COCODataset中声明的self.transforms重命名为self.transforms_即可(__getitem__函数中的变量也要修改)

原代码为:

class COCODataset(torchvision.datasets.coco.CocoDetection):
    def __init__(
        self, ann_file, root, remove_images_without_annotations, transforms=None
    ):
        super(COCODataset, self).__init__(root, ann_file)
        # sort indices for reproducible results
        self.ids = sorted(self.ids)

        # filter images without detection annotations
        if remove_images_without_annotations:
            ids = []
            for img_id in self.ids:
                ann_ids = self.coco.getAnnIds(imgIds=img_id, iscrowd=None)
                anno = self.coco.loadAnns(ann_ids)
                if has_valid_annotation(anno):
                    ids.append(img_id)
            self.ids = ids

        self.json_category_id_to_contiguous_id = {
            v: i + 1 for i, v in enumerate(self.coco.getCatIds())
        }
        self.contiguous_category_id_to_json_id = {
            v: k for k, v in self.json_category_id_to_contiguous_id.items()
        }
        self.id_to_img_map = {k: v for k, v in enumerate(self.ids)}
        self.transforms = transforms

    def __getitem__(self, idx):
        img, anno = super(COCODataset, self).__getitem__(idx)

        # filter crowd annotations
        # TODO might be better to add an extra field
        anno = [obj for obj in anno if obj["iscrowd"] == 0]

        boxes = [obj["bbox"] for obj in anno]
        boxes = torch.as_tensor(boxes).reshape(-1, 4)  # guard against no boxes
        target = BoxList(boxes, img.size, mode="xywh").convert("xyxy")

        classes = [obj["category_id"] for obj in anno]
        classes = [self.json_category_id_to_contiguous_id[c] for c in classes]
        classes = torch.tensor(classes)
        target.add_field("labels", classes)

        masks = [obj["segmentation"] for obj in anno]
        masks = SegmentationMask(masks, img.size, mode='poly')
        target.add_field("masks", masks)

        if anno and "keypoints" in anno[0]:
            keypoints = [obj["keypoints"] for obj in anno]
            keypoints = PersonKeypoints(keypoints, img.size)
            target.add_field("keypoints", keypoints)

        target = target.clip_to_image(remove_empty=True)
        if self.transforms is not None:
            img, target = self.transforms(img, target)

        return img, target, idx

    def get_img_info(self, index):
        img_id = self.id_to_img_map[index]
        img_data = self.coco.imgs[img_id]
        return img_data

修改后为:

class COCODataset(torchvision.datasets.coco.CocoDetection):
    def __init__(
        self, ann_file, root, remove_images_without_annotations, transforms=None
    ):
        super(COCODataset, self).__init__(root, ann_file)
        # sort indices for reproducible results
        self.ids = sorted(self.ids)

        # filter images without detection annotations
        if remove_images_without_annotations:
            ids = []
            for img_id in self.ids:
                ann_ids = self.coco.getAnnIds(imgIds=img_id, iscrowd=None)
                anno = self.coco.loadAnns(ann_ids)
                if has_valid_annotation(anno):
                    ids.append(img_id)
            self.ids = ids

        self.json_category_id_to_contiguous_id = {
            v: i + 1 for i, v in enumerate(self.coco.getCatIds())
        }
        self.contiguous_category_id_to_json_id = {
            v: k for k, v in self.json_category_id_to_contiguous_id.items()
        }
        self.id_to_img_map = {k: v for k, v in enumerate(self.ids)}
        self.transforms_ = transforms

    def __getitem__(self, idx):
        img, anno = super(COCODataset, self).__getitem__(idx)

        # filter crowd annotations
        # TODO might be better to add an extra field
        anno = [obj for obj in anno if obj["iscrowd"] == 0]

        boxes = [obj["bbox"] for obj in anno]
        boxes = torch.as_tensor(boxes).reshape(-1, 4)  # guard against no boxes
        target = BoxList(boxes, img.size, mode="xywh").convert("xyxy")

        classes = [obj["category_id"] for obj in anno]
        classes = [self.json_category_id_to_contiguous_id[c] for c in classes]
        classes = torch.tensor(classes)
        target.add_field("labels", classes)

        masks = [obj["segmentation"] for obj in anno]
        masks = SegmentationMask(masks, img.size, mode='poly')
        target.add_field("masks", masks)

        if anno and "keypoints" in anno[0]:
            keypoints = [obj["keypoints"] for obj in anno]
            keypoints = PersonKeypoints(keypoints, img.size)
            target.add_field("keypoints", keypoints)

        target = target.clip_to_image(remove_empty=True)
        if self.transforms_ is not None:
            img, target = self.transforms_(img, target)

        return img, target, idx

    def get_img_info(self, index):
        img_id = self.id_to_img_map[index]
        img_data = self.coco.imgs[img_id]
        return img_data
好的,以下是一个基于PyTorch的DeepFashion分类和属性预测的示例代码: ```python import pandas as pd import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset from torchvision import transforms, models from PIL import Image # 读取标注文件 train_df = pd.read_csv('train.csv') test_df = pd.read_csv('test.csv') # 定义数据预处理的transforms data_transforms = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 自定义Dataset类 class FashionDataset(Dataset): def __init__(self, df, transform=None): self.df = df self.transform = transform def __len__(self): return len(self.df) def __getitem__(self, idx): img_path = self.df.loc[idx, 'image_path'] img = Image.open(img_path).convert('RGB') if self.transform: img = self.transform(img) category = torch.tensor(self.df.loc[idx, 'category']) attributes = torch.tensor(self.df.loc[idx, 'attributes'].split(';')) return img, category, attributes # 定义模型 model = models.resnet18(pretrained=True) num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 50) # 50为类别数 # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 定义训练函数 def train(model, dataloader, criterion, optimizer): model.train() running_loss = 0.0 for inputs, category, attributes in dataloader: inputs = inputs.to(device) category = category.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, category) loss.backward() optimizer.step() running_loss += loss.item() * inputs.size(0) epoch_loss = running_loss / len(dataloader.dataset) return epoch_loss # 定义测试函数 def test(model, dataloader, criterion): model.eval() running_loss = 0.0 running_corrects = 0 for inputs, category, attributes in dataloader: inputs = inputs.to(device) category = category.to(device) outputs = model(inputs) _, preds = torch.max(outputs, 1) loss = criterion(outputs, category) running_loss += loss.item() * inputs.size(0) running_corrects += torch.sum(preds == category.data) epoch_loss = running_loss / len(dataloader.dataset) epoch_acc = running_corrects.double() / len(dataloader.dataset) return epoch_loss, epoch_acc # 定义训练集和测试集 train_dataset = FashionDataset(train_df, data_transforms) test_dataset = FashionDataset(test_df, data_transforms) # 定义DataLoader train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4) test_dataloader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4) # 训练模型 device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') model.to(device) best_acc = 0.0 for epoch in range(10): epoch_loss = train(model, train_dataloader, criterion, optimizer) _, epoch_acc = test(model, test_dataloader, criterion) print('Epoch {} loss: {:.4f} accuracy: {:.4f}'.format(epoch+1, epoch_loss, epoch_acc)) if epoch_acc > best_acc: best_acc = epoch_acc torch.save(model.state_dict(), 'best_model.pth') ``` 在这个示例中,我们使用ResNet18预训练模型来进行分类,训练了10个epochs,每个epoch中进行了训练和测试,并记录了loss和accuracy。需要注意的是,这里仅仅是一个示例,实际使用中需要根据任务的具体需求进行模型和数据处理的调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值