NameError:名称“utils”未在 Pytorch 中定义

问题描述

我有pytorch 1.7。以下代码Object detection and finetuning.

的 Pytorch 教程页面相同

我有以下行的错误

data_loader = torch.utils.data.DataLoader(dataset,batch_size=2,shuffle=True,num_workers=4,collate_fn=utils.collate_fn)

作为NameError: name 'utils' is not defined

可能有什么问题?

整个代码如下。

import os
import numpy as np
import torch
from PIL import Image


class PrepareDataset(object):
    def __init__(self,root,transforms):
        self.root = root
        self.transforms = transforms
        # load all image files,sorting them to
        # ensure that they are aligned
        self.imgs = list(sorted(os.listdir(os.path.join(root,"images"))))
        self.masks = list(sorted(os.listdir(os.path.join(root,"masks"))))
        self.annotations = list(sorted(os.listdir(os.path.join(root,"annotations"))))

    def __getitem__(self,idx):
        # load images ad masks
        img_path = os.path.join(self.root,"images",self.imgs[idx])
        mask_path = os.path.join(self.root,"masks",self.masks[idx])
        annotation_path = os.path.join(self.root,"annotations",self.annotations[idx])
        img = Image.open(img_path).convert("RGB")
        # note that we haven't converted the mask to RGB,# because each color corresponds to a different instance
        # with 0 being background
        mask = Image.open(mask_path)
        # convert the PIL Image into a numpy array
        mask = np.array(mask)
        # instances are encoded as different colors
        obj_ids = np.unique(mask)
        # first id is the background,so remove it
        obj_ids = obj_ids[1:]

        # split the color-encoded mask into a set
        # of binary masks
        masks = mask == obj_ids[:,None,None]

        # get bounding Box coordinates for each mask
        num_objs = len(obj_ids)
        Boxes = []
        for i in range(num_objs):
            pos = np.where(masks[i])
            xmin = np.min(pos[1])
            xmax = np.max(pos[1])
            ymin = np.min(pos[0])
            ymax = np.max(pos[0])
            Boxes.append([xmin,ymin,xmax,ymax])

        # convert everything into a torch.Tensor
        Boxes = torch.as_tensor(Boxes,dtype=torch.float32)
        # there is only one class
        labels = torch.ones((num_objs,),dtype=torch.int64)
        masks = torch.as_tensor(masks,dtype=torch.uint8)

        image_id = torch.tensor([idx])
        area = (Boxes[:,3] - Boxes[:,1]) * (Boxes[:,2] - Boxes[:,0])
        # suppose all instances are not crowd
        iscrowd = torch.zeros((num_objs,dtype=torch.int64)

        target = {}
        target["Boxes"] = Boxes
        target["labels"] = labels
        target["masks"] = masks
        target["image_id"] = image_id
        target["area"] = area
        target["iscrowd"] = iscrowd

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

        return img,target

    def __len__(self):
        return len(self.imgs)
    
    
import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor

# load a model pre-trained pre-trained on COCO
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)

# replace the classifier with a new one,that has
# num_classes which is user-defined
num_classes = 2  # 1 class (person) + background
# get number of input features for the classifier
in_features = model.roi_heads.Box_predictor.cls_score.in_features
# replace the pre-trained head with a new one
model.roi_heads.Box_predictor = FastRCNNPredictor(in_features,num_classes)


import torchvision
from torchvision.models.detection import FasterRCNN
from torchvision.models.detection.rpn import AnchorGenerator

# load a pre-trained model for classification and return
# only the features
backbone = torchvision.models.mobilenet_v2(pretrained=True).features
# FasterRCNN needs to kNow the number of
# output channels in a backbone. For mobilenet_v2,it's 1280
# so we need to add it here
backbone.out_channels = 1280

# let's make the rpn generate 5 x 3 anchors per spatial
# location,with 5 different sizes and 3 different aspect
# ratios. We have a Tuple[Tuple[int]] because each feature
# map Could potentially have different sizes and
# aspect ratios
anchor_generator = AnchorGenerator(sizes=((32,64,128,256,512),aspect_ratios=((0.5,1.0,2.0),))

# let's define what are the feature maps that we will
# use to perform the region of interest cropping,as well as
# the size of the crop after rescaling.
# if your backbone returns a Tensor,featmap_names is expected to
# be [0]. More generally,the backbone should return an
# OrderedDict[Tensor],and in featmap_names you can choose which
# feature maps to use.
roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=[0],output_size=7,sampling_ratio=2)

# put the pieces together inside a FasterRCNN model
model = FasterRCNN(backbone,num_classes=5,rpn_anchor_generator=anchor_generator,Box_roi_pool=roi_pooler)


import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
from torchvision.models.detection.mask_rcnn import MaskRCNNPredictor


def get_model_instance_segmentation(num_classes):
    # load an instance segmentation model pre-trained pre-trained on COCO
    model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)

    # get number of input features for the classifier
    in_features = model.roi_heads.Box_predictor.cls_score.in_features
    # replace the pre-trained head with a new one
    model.roi_heads.Box_predictor = FastRCNNPredictor(in_features,num_classes)

    # Now get the number of input features for the mask classifier
    in_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channels
    hidden_layer = 256
    # and replace the mask predictor with a new one
    model.roi_heads.mask_predictor = MaskRCNNPredictor(in_features_mask,hidden_layer,num_classes)

    return model


from torchvision import transforms as T


def get_transform(train):
    transforms = []
    transforms.append(T.ToTensor())
    if train:
        transforms.append(T.RandomHorizontalFlip(0.5))
    return T.Compose(transforms)


model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
dataset = PrepareDataset('/home/centos/atic-nyan/Traffic',get_transform(train=True))
data_loader = torch.utils.data.DataLoader(dataset,collate_fn=utils.collate_fn)
# For Training
images,targets = next(iter(data_loader))
images = list(image for image in images)
targets = [{k: v for k,v in t.items()} for t in targets]
output = model(images,targets)   # Returns losses and detections
# For inference
model.eval()
x = [torch.rand(3,300,400),torch.rand(3,500,400)]
predictions = model(x)           # Returns predictions



from engine import train_one_epoch,evaluate
import utils


def main():
    # train on the GPU or on the cpu,if a GPU is not available
    device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')

    # our dataset has two classes only - background and person
    num_classes = 2
    # use our dataset and defined transformations
    dataset = PrepareDataset('/home/centos/atic-nyan/Traffic',get_transform(train=True))
    dataset_test = PrepareDataset('/home/centos/atic-nyan/Traffic',get_transform(train=False))

    # split the dataset in train and test set
    indices = torch.randperm(len(dataset)).tolist()
    dataset = torch.utils.data.Subset(dataset,indices[:-50])
    dataset_test = torch.utils.data.Subset(dataset_test,indices[-50:])

    # define training and validation data loaders
    data_loader = torch.utils.data.DataLoader(
        dataset,collate_fn=utils.collate_fn)

    data_loader_test = torch.utils.data.DataLoader(
        dataset_test,batch_size=1,shuffle=False,collate_fn=utils.collate_fn)

    # get the model using our helper function
    model = get_model_instance_segmentation(num_classes)

    # move model to the right device
    model.to(device)

    # construct an optimizer
    params = [p for p in model.parameters() if p.requires_grad]
    optimizer = torch.optim.SGD(params,lr=0.005,momentum=0.9,weight_decay=0.0005)
    # and a learning rate scheduler
    lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer,step_size=3,gamma=0.1)

    # let's train it for 10 epochs
    num_epochs = 10

    for epoch in range(num_epochs):
        # train for one epoch,printing every 10 iterations
        train_one_epoch(model,optimizer,data_loader,device,epoch,print_freq=10)
        # update the learning rate
        lr_scheduler.step()
        # evaluate on the test dataset
        evaluate(model,data_loader_test,device=device)

    print("That's it!")

解决方法

我只是放了

def collate_fn(batch):
    data_list,label_list = [],[]
    for _data,_label in batch:
        data_list.append(_data)
        label_list.append(_label)
    return torch.Tensor(data_list),torch.LongTensor(label_list)

在我的代码中,它可以工作。

,

更改此aws glacier

data_loader = torch.utils.data.DataLoader(dataset,batch_size=2,shuffle=True,num_workers=4,collate_fn=utils.collate_fn)

由于您的整理功能使用整理模块

,

在 Discussion.pytorch 上有关于本教程的讨论。 https://discuss.pytorch.org/t/object-detection-finetuning-tutorial/52651 您可以在教程中找到:

在 references/detection/ 中,我们有许多辅助函数来简化训练和评估检测模型。在这里,我们将使用references/detection/engine.py、references/detection/utils.py 和references/detection/transforms.py。只需将它们复制到您的文件夹并在此处使用即可。

这个页面有这个文件https://github.com/pytorch/vision/tree/master/references/detection 您还应该安装 pycocotools。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...