【问题标题】:In training mode, targets should be passed在训练模式下,目标应该通过
【发布时间】:2021-06-03 02:37:52
【问题描述】:

我是深度学习的新手,在大学有一个检测交通信号灯的项目,我们可以使用开源代码。

所以,我尝试在 kaggle https://www.kaggle.com/endoruk1234/trafficlightdetection-fasterrcnn-pytorch/log 上运行代码

但是在视频上测试保存的模型的阶段,我得到了这个错误“在训练模式下,目标应该通过”。

我不确定为什么我需要在测试阶段通过目标。不明白是初始模型有问题,还是视频采集部分写错了。

模型


    from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
    def _get_instance_segmentation_model(num_classes):
        model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
        in_features = model.roi_heads.box_predictor.cls_score.in_features
        model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
        return model
    model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
    N_CLASS = 4 
    INP_FEATURES = model.roi_heads.box_predictor.cls_score.in_features
    model.roi_heads.box_predictor = FastRCNNPredictor(INP_FEATURES, N_CLASS)
    model.to(device)
    params = [p for p in model.parameters() if p.requires_grad]
    optimizer = torch.optim.Adam(params)
    lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer) 

培训


    lossHist = LossAverager()
    valLossHist = LossAverager()
    
    for epoch in range(EPOCHS):
        
        start_time = time()
        model.train()
        lossHist.reset()
        
        for images, targets, image_ids in tqdm(trainDataLoader):
            #bbox = check_bbox(bbox)
            images = torch.stack(images).to(device)
            targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
            
            bs = images.shape[0]
            
            loss_dict = model(images, targets)
            
            totalLoss = sum(loss for loss in loss_dict.values())
            lossValue = totalLoss.item()
            
            lossHist.update(lossValue,bs)
    
            optimizer.zero_grad()
            totalLoss.backward()
            optimizer.step()
        
        if lr_scheduler is not None:
            lr_scheduler.step(totalLoss)
    
        print(f"[{str(datetime.timedelta(seconds = time() - start_time))[2:7]}]")
        print(f"Epoch {epoch}/{EPOCHS}")
        print(f"Train loss: {lossHist.avg}")
        
        if(epoch == 10):
            torch.save(model.state_dict(), 'fasterrcnn_resnet{}_fpn.pth'.format(epoch)) 
    
    
    torch.save(model.state_dict(), 'fasterrcnn_resnet{}_fpn.pth'.format(epoch))

测试有错误的视频


    while(True):
        ret, input = cap.read()
        image = input.copy()
        input = preprocess(input).float()
        input = input.unsqueeze_(0)
        input = input.type(torch.cuda.FloatTensor)
    
        print(input)
    
        result = model(input)
    
        boxes = result[0]['boxes'].type(torch.cuda.FloatTensor)
        scores = result[0]['scores'].type(torch.cuda.FloatTensor)
        labels = result[0]['labels'].type(torch.cuda.FloatTensor)
    
        mask = nms(boxes,scores,0.3)
        boxes = boxes[mask]
        scores = scores[mask]
        labels = labels[mask]
    
        boxes = boxes.data.cpu().numpy().astype(np.int32)
        scores = scores.data.cpu().numpy()
        labels = labels.data.cpu().numpy()
    
        mask = scores >= 0.5
        boxes = boxes[mask]
        scores = scores[mask]
        labels = labels[mask]
    
        colors = {1:(0,255,0), 2:(255,255,0), 3:(255,0,0)}
    
        for box,label in zip(boxes,labels):
            image = cv2.rectangle(image,
                              (box[0], box[1]),
                              (box[2], box[3]),
                              (0,0,255), 1)
    
        cv2.imshow("image", image)
        
        if cv2.waitKey(0):
            break


    ValueError                                Traceback (most recent call last)
    <ipython-input-84-e32f9d25d942> in <module>()
          8     print(input)
          9 
    ---> 10     result = model(input)
         11 
         12     boxes = result[0]['boxes'].type(torch.cuda.FloatTensor)
    
    /usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
        725             result = self._slow_forward(*input, **kwargs)
        726         else:
    --> 727             result = self.forward(*input, **kwargs)
        728         for hook in itertools.chain(
        729                 _global_forward_hooks.values(),
    
    /usr/local/lib/python3.7/dist-packages/torchvision/models/detection/generalized_rcnn.py in forward(self, images, targets)
         58         """
         59         if self.training and targets is None:
    ---> 60             raise ValueError("In training mode, targets should be passed")
         61         if self.training:
         62             assert targets is not None
    
    ValueError: In training mode, targets should be passed

提前感谢您!如果您能告诉我如何更正模型或视频捕获代码,我将不胜感激。

【问题讨论】:

    标签: python pytorch faster-rcnn


    【解决方案1】:

    在您的示例中,您没有解释如何加载模型,但我认为您已经忘记了model.eval()。此功能是模型的某些特定层/部分的一种开关,这些层/部分在训练和推理(评估)时表现不同。

    要进行推断,您可以像这样加载模型:

    model.load_state_dict(torch.load("/content/gdrive/MyDrive/Models/model_Resnet.pth"))
    model.eval()
    

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 2019-11-29
      • 2023-03-10
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多