热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

threejs加载obj模型_PyTorch专栏(八):微调基于torchvision0.3的目标检测模型

作者|News编辑|安可出品|磐创AI团队出品【磐创AI导读】:本篇文章讲解了PyTorch专栏的第四章中的微调基于torchvision0.3的目标检测模型。查看专

ba0013d2f518b3e3c6db78a1c6bedd32.png

作者 | News

编辑 | 安可

出品 | 磐创AI团队出品

【磐创AI 导读】:本篇文章讲解了PyTorch专栏的第四章中的微调基于torchvision 0.3的目标检测模型。查看专栏历史文章,请点击下方蓝色字体进入相应链接阅读。查看关于本专栏的介绍:PyTorch专栏开篇。想要更多电子杂志的机器学习,深度学习资源,大家欢迎点击上方蓝字关注我们的公众号:磐创AI。

专栏目录:第一章:PyTorch之简介与下载
  • PyTorch简介
  • PyTorch环境搭建
第二章:PyTorch之60分钟入门
  • PyTorch入门
  • PyTorch自动微分
  • PyTorch神经网络
  • PyTorch图像分类器
  • PyTorch数据并行处理
第三章:PyTorch之入门强化
  • 数据加载和处理
  • PyTorch小试牛刀
  • 迁移学习
  • 混合前端的seq2seq模型部署
  • 保存和加载模型
第四章:PyTorch之图像篇
  • 微调基于torchvision 0.3的目标检测模型
  • 微调TorchVision模型
  • 空间变换器网络
  • 使用PyTorch进行神经传递
  • 生成对抗示例
  • 使用ONNX将模型转移至Caffe2和移动端
第五章:PyTorch之文本篇
  • 聊天机器人教程
  • 使用字符级RNN生成名字
  • 使用字符级RNN进行名字分类
  • 在深度学习和NLP中使用Pytorch
  • 使用Sequence2Sequence网络和注意力进行翻译
第六章:PyTorch之生成对抗网络第七章:PyTorch之强化学习在这篇文章中,我们将微调在 Penn-Fudan 数据库中对行人检测和分割的已预先训练的 Mask R-CNN 模型。它包含170个图像和345个行人实例,我们 将用它来说明如何在 torchvision 中使用新功能,以便在自定义数据集上训练实例分割模型。

1.定义数据集

对于训练对象检测的引用脚本,实例分割和人员关键点检测要求能够轻松支持添加新的自定义数据。数据集应该从标准的类torch.utils.data.Dataset继承而来,并实现_len_getitem_我们要求的唯一特性是数据集的__getitem__应该返回:* 图像:PIL图像大小(H,W) * 目标:包含以下字段的字典
<1> boxes(FloatTensor[N,4])&#xff1a;N边框(bounding boxes)坐标的格式[x0,x1,y0,y1]&#xff0c;取值范围是0到W,0到H。
<2> labels(Int64Tensor[N])&#xff1a;每个边框的标签。
<3> image_id(Int64Tensor[1])&#xff1a;图像识别器&#xff0c;它应该在数据集中的所有图像中是唯一的&#xff0c;并在评估期间使用。
<4> area(Tensor[N])&#xff1a;边框的面积&#xff0c;在使用COCO指标进行评估时使用此项来分隔小、中和大框之间的度量标准得分。
<5> iscrowed(UInt8Tensor[N,H,W])&#xff1a;在评估期间属性设置为iscrowed&#61;True的实例会被忽略。
<6> (可选)masks(UInt8Tesor[N,H,W])&#xff1a;每个对象的分段掩码。
<7> (可选)keypoints (FloatTensor[N, K, 3]&#xff1a;对于N个对象中的每一个&#xff0c;它包含[x&#xff0c;y&#xff0c;visibility]格式的K个关键点&#xff0c;用 于定义对象。visibility &#61; 0表示关键点不可见。请注意&#xff0c;对于数据扩充&#xff0c;翻转关键点的概念取决于数据表示&#xff0c;您应该调整 reference/detection/transforms.py 以用于新的关键点表示。如果你的模型返回上述方法&#xff0c;它们将使其适用于培训和评估&#xff0c;并将使用 pycocotools 的评估脚本。此外&#xff0c;如果要在训练期间使用宽高比分组(以便每个批次仅包含具有相似宽高比的图像)&#xff0c;则建议还实现get_height_and_width方法&#xff0c; 该方法返回图像的高度和宽度。如果未提供此方法&#xff0c;我们将通过__getitem__查询数据集的所有元素&#xff0c;这会将图像加载到内存中&#xff0c;但比提供自定义方法时要慢。

2.为 PennFudan 编写自定义数据集

2.1 下载数据集

下载并解压缩zip文件后&#xff0c;我们有以下文件夹结构&#xff1a;

PennFudanPed/
PedMasks/
FudanPed00001_mask.png
FudanPed00002_mask.png
FudanPed00003_mask.png
FudanPed00004_mask.png
...
PNGImages/
FudanPed00001.png
FudanPed00002.png
FudanPed00003.png
FudanPed00004.png
下面是一个图像以及其分割掩膜的例子&#xff1a; 2f9e22cc01b3ea4dcfc20a051e693efa.png08bab64cc98913a9d8378d7c8151ba14.png因此每个图像具有相应的分割掩膜&#xff0c;其中每个颜色对应于不同的实例。让我们为这个数据集写一个torch.utils.data.Dataset类。

2.2 为数据集编写类

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


class PennFudanDataset(object):
    def __init__(self, root, transforms):
        self.root &#61; root
        self.transforms &#61; transforms
        # 下载所有图像文件&#xff0c;为其排序
        # 确保它们对齐
        self.imgs &#61; list(sorted(os.listdir(os.path.join(root, "PNGImages"))))
        self.masks &#61; list(sorted(os.listdir(os.path.join(root, "PedMasks"))))

    def __getitem__(self, idx):
        # load images ad masks
        img_path &#61; os.path.join(self.root, "PNGImages", self.imgs[idx])
        mask_path &#61; os.path.join(self.root, "PedMasks", self.masks[idx])
        img &#61; Image.open(img_path).convert("RGB")
        # 请注意我们还没有将mask转换为RGB,
        # 因为每种颜色对应一个不同的实例
        # 0是背景
        mask &#61; Image.open(mask_path)
        # 将PIL图像转换为numpy数组
        mask &#61; np.array(mask)
        # 实例被编码为不同的颜色
        obj_ids &#61; np.unique(mask)
        # 第一个id是背景&#xff0c;所以删除它
        obj_ids &#61; obj_ids[1:]

        # 将颜色编码的mask分成一组
        # 二进制格式
        masks &#61; mask &#61;&#61; obj_ids[:, None, None]

        # 获取每个mask的边界框坐标
        num_objs &#61; len(obj_ids)
        boxes &#61; []
        for i in range(num_objs):
            pos &#61; np.where(masks[i])
            xmin &#61; np.min(pos[1])
            xmax &#61; np.max(pos[1])
            ymin &#61; np.min(pos[0])
            ymax &#61; np.max(pos[0])
            boxes.append([xmin, ymin, xmax, ymax])

        # 将所有转换为torch.Tensor
        boxes &#61; torch.as_tensor(boxes, dtype&#61;torch.float32)
        # 这里仅有一个类
        labels &#61; torch.ones((num_objs,), dtype&#61;torch.int64)
        masks &#61; torch.as_tensor(masks, dtype&#61;torch.uint8)

        image_id &#61; torch.tensor([idx])
        area &#61; (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])
        # 假设所有实例都不是人群
        iscrowd &#61; torch.zeros((num_objs,), dtype&#61;torch.int64)

        target &#61; {}
        target["boxes"] &#61; boxes
        target["labels"] &#61; labels
        target["masks"] &#61; masks
        target["image_id"] &#61; image_id
        target["area"] &#61; area
        target["iscrowd"] &#61; iscrowd

        if self.transforms is not None:
            img, target &#61; self.transforms(img, target)

        return img, target

    def __len__(self):
        return len(self.imgs)

3.定义模型

现在我们需要定义一个可以上述数据集执行预测的模型。在本教程中&#xff0c;我们将使用 Mask R-CNN&#xff0c; 它基于 Faster R-CNN。Faster R-CNN 是一种模型&#xff0c;可以预测图像中潜在对象的边界框和类别得分。 53ec14c554ca8f712f0daac47c9e743f.pngMask R-CNN 在 Faster R-CNN 中添加了一个额外的分支&#xff0c;它还预测每个实例的分割蒙版。25588091e315ec0dab16d7ac2f0df4d9.png有两种常见情况可能需要修改torchvision modelzoo中的一个可用模型。第一个是我们想要从预先训练的模型开始&#xff0c;然后微调最后一层。另一种是当我们想要用不同的模型替换模型的主干时(例如&#xff0c;用于更快的预测)。下面是对这两种情况的处理。
  • 1 微调已经预训练的模型 让我们假设你想从一个在COCO上已预先训练过的模型开始&#xff0c;并希望为你的特定类进行微调。这是一种可行的方法&#xff1a;

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

    # 在COCO上加载经过预训练的预训练模型
    model &#61; torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained&#61;True)

    # replace the classifier with a new one, that has
    # 将分类器替换为具有用户定义的 num_classes的新分类器
    num_classes &#61; 2  # 1 class (person) &#43; background
    # 获取分类器的输入参数的数量
    in_features &#61; model.roi_heads.box_predictor.cls_score.in_features
    # 用新的头部替换预先训练好的头部
    model.roi_heads.box_predictor &#61; FastRCNNPredictor(in_features, num_classes)

  • 2 修改模型以添加不同的主干

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

    # 加载预先训练的模型进行分类和返回
    # 只有功能
    backbone &#61; torchvision.models.mobilenet_v2(pretrained&#61;True).features
    # FasterRCNN需要知道骨干网中的输出通道数量。对于mobilenet_v2&#xff0c;它是1280&#xff0c;所以我们需要在这里添加它
    backbone.out_channels &#61; 1280

    # 我们让RPN在每个空间位置生成5 x 3个锚点
    # 具有5种不同的大小和3种不同的宽高比。
    # 我们有一个元组[元组[int]]
    # 因为每个特征映射可能具有不同的大小和宽高比
    anchor_generator &#61; AnchorGenerator(sizes&#61;((32, 64, 128, 256, 512),),
                                       aspect_ratios&#61;((0.5, 1.0, 2.0),))

    # 定义一下我们将用于执行感兴趣区域裁剪的特征映射&#xff0c;以及重新缩放后裁剪的大小。
    # 如果您的主干返回Tensor&#xff0c;则featmap_names应为[0]。
    # 更一般地&#xff0c;主干应该返回OrderedDict [Tensor]
    # 并且在featmap_names中&#xff0c;您可以选择要使用的功能映射。
    roi_pooler &#61; torchvision.ops.MultiScaleRoIAlign(featmap_names&#61;[0],
                                                    output_size&#61;7,
                                                    sampling_ratio&#61;2)

    # 将这些pieces放在FasterRCNN模型中
    model &#61; FasterRCNN(backbone,
                       num_classes&#61;2,
                       rpn_anchor_generator&#61;anchor_generator,
                       box_roi_pool&#61;roi_pooler)

3.1 PennFudan 数据集的实例分割模型

在我们的例子中&#xff0c;我们希望从预先训练的模型中进行微调&#xff0c;因为我们的数据集非常小&#xff0c;所以我们将遵循上述第一种情况。这里我们还要计算实例分割掩膜&#xff0c;因此我们将使用 Mask R-CNN&#xff1a;

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):
    # 加载在COCO上预训练的预训练的实例分割模型
    model &#61; torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained&#61;True)

    # 获取分类器的输入特征数
    in_features &#61; model.roi_heads.box_predictor.cls_score.in_features
    # 用新的头部替换预先训练好的头部
    model.roi_heads.box_predictor &#61; FastRCNNPredictor(in_features, num_classes)

    # 现在获取掩膜分类器的输入特征数
    in_features_mask &#61; model.roi_heads.mask_predictor.conv5_mask.in_channels
    hidden_layer &#61; 256
    # 并用新的掩膜预测器替换掩膜预测器
    model.roi_heads.mask_predictor &#61; MaskRCNNPredictor(in_features_mask,
                                                       hidden_layer,
                                                       num_classes)

    return model
就是这样&#xff0c;这将使模型准备好在您的自定义数据集上进行训练和评估。

4.整合

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

4.1 为数据扩充/转换编写辅助函数&#xff1a;

import transforms as T

def get_transform(train):
    transforms &#61; []
    transforms.append(T.ToTensor())
    if train:
        transforms.append(T.RandomHorizontalFlip(0.5))
    return T.Compose(transforms)

4.2 编写执行训练和验证的主要功能

from engine import train_one_epoch, evaluate
import utils


def main():
    # 在GPU上训练&#xff0c;若无GPU&#xff0c;可选择在CPU上训练
    device &#61; torch.device(&#39;cuda&#39;) if torch.cuda.is_available() else torch.device(&#39;cpu&#39;)

    # 我们的数据集只有两个类 - 背景和人
    num_classes &#61; 2
    # 使用我们的数据集和定义的转换
    dataset &#61; PennFudanDataset(&#39;PennFudanPed&#39;, get_transform(train&#61;True))
    dataset_test &#61; PennFudanDataset(&#39;PennFudanPed&#39;, get_transform(train&#61;False))

    # 在训练和测试集中拆分数据集
    indices &#61; torch.randperm(len(dataset)).tolist()
    dataset &#61; torch.utils.data.Subset(dataset, indices[:-50])
    dataset_test &#61; torch.utils.data.Subset(dataset_test, indices[-50:])

    # 定义训练和验证数据加载器
    data_loader &#61; torch.utils.data.DataLoader(
        dataset, batch_size&#61;2, shuffle&#61;True, num_workers&#61;4,
        collate_fn&#61;utils.collate_fn)

    data_loader_test &#61; torch.utils.data.DataLoader(
        dataset_test, batch_size&#61;1, shuffle&#61;False, num_workers&#61;4,
        collate_fn&#61;utils.collate_fn)

    # 使用我们的辅助函数获取模型
    model &#61; get_model_instance_segmentation(num_classes)

    # 将我们的模型迁移到合适的设备
    model.to(device)

    # 构造一个优化器
    params &#61; [p for p in model.parameters() if p.requires_grad]
    optimizer &#61; torch.optim.SGD(params, lr&#61;0.005,
                                momentum&#61;0.9, weight_decay&#61;0.0005)
    # 和学习率调度程序
    lr_scheduler &#61; torch.optim.lr_scheduler.StepLR(optimizer,
                                                   step_size&#61;3,
                                                   gamma&#61;0.1)

    # 训练10个epochs
    num_epochs &#61; 10

    for epoch in range(num_epochs):
        # 训练一个epoch&#xff0c;每10次迭代打印一次
        train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq&#61;10)
        # 更新学习速率
        lr_scheduler.step()
        # 在测试集上评价
        evaluate(model, data_loader_test, device&#61;device)

    print("That&#39;s it!")

在第一个epoch训练后可以得到下面的结果&#xff1a;

Epoch: [0] [ 0/60] eta: 0:01:18 lr: 0.000090 loss: 2.5213 (2.5213) loss_classifier: 0.8025 (0.8025) loss_box_reg: 0.2634 (0.2634) loss_mask: 1.4265 (1.4265) loss_objectness: 0.0190 (0.0190) loss_rpn_box_reg: 0.0099 (0.0099) time: 1.3121 data: 0.3024 max mem: 3485
Epoch: [0] [10/60] eta: 0:00:20 lr: 0.000936 loss: 1.3007 (1.5313) loss_classifier: 0.3979 (0.4719) loss_box_reg: 0.2454 (0.2272) loss_mask: 0.6089 (0.7953) loss_objectness: 0.0197 (0.0228) loss_rpn_box_reg: 0.0121 (0.0141) time: 0.4198 data: 0.0298 max mem: 5081
Epoch: [0] [20/60] eta: 0:00:15 lr: 0.001783 loss: 0.7567 (1.1056) loss_classifier: 0.2221 (0.3319) loss_box_reg: 0.2002 (0.2106) loss_mask: 0.2904 (0.5332) loss_objectness: 0.0146 (0.0176) loss_rpn_box_reg: 0.0094 (0.0123) time: 0.3293 data: 0.0035 max mem: 5081
Epoch: [0] [30/60] eta: 0:00:11 lr: 0.002629 loss: 0.4705 (0.8935) loss_classifier: 0.0991 (0.2517) loss_box_reg: 0.1578 (0.1957) loss_mask: 0.1970 (0.4204) loss_objectness: 0.0061 (0.0140) loss_rpn_box_reg: 0.0075 (0.0118) time: 0.3403 data: 0.0044 max mem: 5081
Epoch: [0] [40/60] eta: 0:00:07 lr: 0.003476 loss: 0.3901 (0.7568) loss_classifier: 0.0648 (0.2022) loss_box_reg: 0.1207 (0.1736) loss_mask: 0.1705 (0.3585) loss_objectness: 0.0018 (0.0113) loss_rpn_box_reg: 0.0075 (0.0112) time: 0.3407 data: 0.0044 max mem: 5081
Epoch: [0] [50/60] eta: 0:00:03 lr: 0.004323 loss: 0.3237 (0.6703) loss_classifier: 0.0474 (0.1731) loss_box_reg: 0.1109 (0.1561) loss_mask: 0.1658 (0.3201) loss_objectness: 0.0015 (0.0093) loss_rpn_box_reg: 0.0093 (0.0116) time: 0.3379 data: 0.0043 max mem: 5081
Epoch: [0] [59/60] eta: 0:00:00 lr: 0.005000 loss: 0.2540 (0.6082) loss_classifier: 0.0309 (0.1526) loss_box_reg: 0.0463 (0.1405) loss_mask: 0.1568 (0.2945) loss_objectness: 0.0012 (0.0083) loss_rpn_box_reg: 0.0093 (0.0123) time: 0.3489 data: 0.0042 max mem: 5081
Epoch: [0] Total time: 0:00:21 (0.3570 s / it)
creating index...
index created!
Test: [ 0/50] eta: 0:00:19 model_time: 0.2152 (0.2152) evaluator_time: 0.0133 (0.0133) time: 0.4000 data: 0.1701 max mem: 5081
Test: [49/50] eta: 0:00:00 model_time: 0.0628 (0.0687) evaluator_time: 0.0039 (0.0064) time: 0.0735 data: 0.0022 max mem: 5081
Test: Total time: 0:00:04 (0.0828 s / it)
Averaged stats: model_time: 0.0628 (0.0687) evaluator_time: 0.0039 (0.0064)
Accumulating evaluation results...
DONE (t&#61;0.01s).
Accumulating evaluation results...
DONE (t&#61;0.01s).
IoU metric: bbox
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.606
Average Precision (AP) &#64;[ IoU&#61;0.50 | area&#61; all | maxDets&#61;100 ] &#61; 0.984
Average Precision (AP) &#64;[ IoU&#61;0.75 | area&#61; all | maxDets&#61;100 ] &#61; 0.780
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.313
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.582
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.612
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 1 ] &#61; 0.270
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 10 ] &#61; 0.672
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.672
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.650
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.755
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.664
IoU metric: segm
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.704
Average Precision (AP) &#64;[ IoU&#61;0.50 | area&#61; all | maxDets&#61;100 ] &#61; 0.979
Average Precision (AP) &#64;[ IoU&#61;0.75 | area&#61; all | maxDets&#61;100 ] &#61; 0.871
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.325
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.488
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.727
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 1 ] &#61; 0.316
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 10 ] &#61; 0.748
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.749
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.650
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.673
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.758
因此&#xff0c;在一个epoch训练之后&#xff0c;我们获得了COCO-style mAP为60.6&#xff0c;并且mask mAP为70.4。经过训练10个epoch后&#xff0c;我得到了以下指标&#xff1a;

IoU metric: bbox
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.799
Average Precision (AP) &#64;[ IoU&#61;0.50 | area&#61; all | maxDets&#61;100 ] &#61; 0.969
Average Precision (AP) &#64;[ IoU&#61;0.75 | area&#61; all | maxDets&#61;100 ] &#61; 0.935
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.349
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.592
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.831
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 1 ] &#61; 0.324
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 10 ] &#61; 0.844
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.844
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.400
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.777
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.870
IoU metric: segm
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.761
Average Precision (AP) &#64;[ IoU&#61;0.50 | area&#61; all | maxDets&#61;100 ] &#61; 0.969
Average Precision (AP) &#64;[ IoU&#61;0.75 | area&#61; all | maxDets&#61;100 ] &#61; 0.919
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.341
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.464
Average Precision (AP) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.788
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 1 ] &#61; 0.303
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61; 10 ] &#61; 0.799
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; all | maxDets&#61;100 ] &#61; 0.799
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; small | maxDets&#61;100 ] &#61; 0.400
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61;medium | maxDets&#61;100 ] &#61; 0.769
Average Recall (AR) &#64;[ IoU&#61;0.50:0.95 | area&#61; large | maxDets&#61;100 ] &#61; 0.818
但预测结果如何呢&#xff1f;让我们在数据集中拍摄一张图像并进行验证。 733976cce161317ea21df79032d504d4.png训练的模型预测了此图像中的9个人物&#xff0c;让我们看看其中的几个&#xff0c;由下图可以看到预测效果很好。 b85aa5276f6181c0370bc4cca9104087.png

5.总结

在本教程中&#xff0c;您学习了如何在自定义数据集上为实例分段模型创建自己的训练管道。为此&#xff0c;您编写了一个torch.utils.data.Dataset类&#xff0c; 它返回图像以及地面实况框和分割掩码。您还利用了在COCO train2017上预训练的Mask R-CNN模型&#xff0c;以便对此新数据集执行传输学习。有关包含multi-machine / multi-gpu training的更完整示例&#xff0c;请检查 torchvision 存储库中的references/detection/train.py也许你还想&#xff1a;●  PyTorch专栏(七):模型保存与加载那些事●  PyTorch专栏(六): 混合前端的seq2seq模型部署●  PyTorch专栏(五)&#xff1a;迁移学习●  PyTorch专栏(四)&#xff1a;小试牛刀●  PyTorch专栏(三)&#xff1a;数据加载与预处理●  PyTorch专栏(二)●  PyTorch专栏(一)●  PyTorch专栏开篇欢迎扫码关注&#xff1a;8113e68b7b22d312bb2f75df6406349a.png47dca66a4d6b9d9c75f2f2fbd7f15245.gif 下方点击 |   | 了解更多



推荐阅读
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • 探索Windows 10平台上一系列免费且对硬件要求不高的单机游戏。尽管Windows 10以其先进的DX12技术著称,但游戏的兼容性和稳定性同样重要。本文将详细介绍几款适合低配置电脑的优秀游戏。 ... [详细]
  • 智能投顾机器人:创业者如何应对新挑战?
    随着智能投顾技术在二级市场的兴起,针对一级市场的智能投顾也逐渐崭露头角。近日,一款名为阿尔妮塔的人工智能创投机器人正式发布,它将如何改变投资人的工作方式和创业者的融资策略? ... [详细]
  • 解决PyCharm中安装PyTorch深度学习d2l包的问题
    本文详细介绍了如何在PyCharm中成功安装用于PyTorch深度学习的d2l包,包括环境配置、安装步骤及常见问题的解决方案。 ... [详细]
  • 新手指南:在Windows 10上搭建深度学习与PyTorch开发环境
    本文详细记录了一名新手在Windows 10操作系统上搭建深度学习环境的过程,包括安装必要的软件和配置环境变量等步骤,旨在帮助同样初入该领域的读者避免常见的错误。 ... [详细]
  • 2017年人工智能领域的十大里程碑事件回顾
    随着2018年的临近,我们一同回顾过去一年中人工智能领域的重要进展。这一年,无论是政策层面的支持,还是技术上的突破,都显示了人工智能发展的迅猛势头。以下是精选的2017年人工智能领域最具影响力的事件。 ... [详细]
  • 多智能体深度强化学习中的分布式奖励估计
    本文探讨了在多智能体系统中应用分布式奖励估计技术,以解决由于环境和代理互动引起的奖励不确定性问题。通过设计多动作分支奖励估计和策略加权奖励聚合方法,本研究旨在提高多智能体强化学习(MARL)的有效性和稳定性。 ... [详细]
  • 本文探讨了亚马逊Go如何通过技术创新推动零售业的发展,以及面临的市场和隐私挑战。同时,介绍了亚马逊最新的‘刷手支付’技术及其潜在影响。 ... [详细]
  • 本文由蕤内撰写,明亮公司出品,探讨了日本零售业在数字化转型中的现状与挑战。文章基于与两位在日本的投资人的深入对话,分析了日本零售业为何仍然依赖传统的POS机系统,以及中日两国在品牌建设和数字化营销上的差异。 ... [详细]
  • 浪潮AI服务器NF5488A5在MLPerf基准测试中刷新多项纪录
    近日,国际权威AI基准测试平台MLPerf发布了最新的推理测试结果,浪潮AI服务器NF5488A5在此次测试中创造了18项性能纪录,显著提升了数据中心AI推理性能。 ... [详细]
  • 图像分类算法的优化策略与实践
    本文探讨了《Bag of Tricks for Image Classification with Convolutional Neural Networks》论文中的多项技术,旨在通过具体实例和实验验证,提高卷积神经网络在图像分类任务中的性能。文章详细介绍了从模型训练加速、网络结构调整到训练参数优化等多个方面的改进方法。 ... [详细]
  • 本文探讨了如何在一个Python脚本中定义一个方法来生成特定URL,并在Robot Framework测试环境中调用此方法,通过环境变量启动测试案例。文中还提供了一个具体的实例,展示了正确的调用方式及可能遇到的问题解决方案。 ... [详细]
  • 在Ubuntu 14.04 (Desktop AMD64) 上安装与配置ROS Indigo
    本文档详细介绍了如何在Ubuntu 14.04 (Desktop AMD64) 系统上安装和配置ROS Indigo。包括设置软件源、安装ROS核心组件、初始化rosdep以及创建ROS工作空间等步骤。 ... [详细]
  • 如何用GPU服务器运行Python
    如何用GPU服务器运行Python-目录前言一、服务器登录1.1下载安装putty1.2putty远程登录 1.3查看GPU、显卡常用命令1.4Linux常用命令二、 ... [详细]
author-avatar
尚福惠珠綺裕
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有