专栏目录:

第一章:PyTorch之简介与下载

  • PyTorch简介

  • PyTorch环境搭建

第二章:PyTorch之60分钟入门

第三章:PyTorch之入门强化

第四章: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]):N边框(bounding boxes)坐标的格式[x0,x1,y0,y1],取值范围是0到W,0到H。

<2> labels(Int64Tensor[N]):每个边框的标签。

<3> image_id(Int64Tensor[1]):图像识别器,它应该在数据集中的所有图像中是唯一的,并在评估期间使用。

<4> area(Tensor[N]):边框的面积,在使用COCO指标进行评估时使用此项来分隔小、中和大框之间的度量标准得分。

<5> iscrowed(UInt8Tensor[N,H,W]):在评估期间属性设置为iscrowed=True的实例会被忽略。

<6> (可选)masks(UInt8Tesor[N,H,W]):每个对象的分段掩码。

<7> (可选)keypoints (FloatTensor[N, K, 3]:对于N个对象中的每一个,它包含[x,y,visibility]格式的K个关键点,用 于定义对象。visibility = 0表示关键点不可见。请注意,对于数据扩充,翻转关键点的概念取决于数据表示,您应该调整 reference/detection/transforms.py 以用于新的关键点表示。

如果你的模型返回上述方法,它们将使其适用于培训和评估,并将使用 pycocotools 的评估脚本。

此外,如果要在训练期间使用宽高比分组(以便每个批次仅包含具有相似宽高比的图像),则建议还实现get_height_and_width方法, 该方法返回图像的高度和宽度。如果未提供此方法,我们将通过__getitem__查询数据集的所有元素,这会将图像加载到内存中,但比提供自定义方法时要慢。

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

2.1 下载数据集

下载并解压缩zip文件后,我们有以下文件夹结构:

  1.  
  2.  

PennFudanPed/

PedMasks/

FudanPed00001_mask.png

FudanPed00002_mask.png

FudanPed00003_mask.png

FudanPed00004_mask.png

...

PNGImages/

FudanPed00001.png

FudanPed00002.png

FudanPed00003.png

FudanPed00004.png

下面是一个图像以及其分割掩膜的例子:  

因此每个图像具有相应的分割掩膜,其中每个颜色对应于不同的实例。让我们为这个数据集写一个torch.utils.data.Dataset类。

2.2 为数据集编写类

  1. import os
  2. import numpy as np
  3. import torch
  4. from PIL import Image
  5. class PennFudanDataset(object):
  6.     def __init__(self, root, transforms):
  7.         self.root = root
  8.         self.transforms = transforms
  9.         # 下载所有图像文件,为其排序
  10.         # 确保它们对齐
  11.         self.imgs = list(sorted(os.listdir(os.path.join(root, "PNGImages"))))
  12.         self.masks = list(sorted(os.listdir(os.path.join(root, "PedMasks"))))
  13.     def __getitem__(self, idx):
  14.         # load images ad masks
  15.         img_path = os.path.join(self.root, "PNGImages", self.imgs[idx])
  16.         mask_path = os.path.join(self.root, "PedMasks", self.masks[idx])
  17.         img = Image.open(img_path).convert("RGB")
  18.         # 请注意我们还没有将mask转换为RGB,
  19.         # 因为每种颜色对应一个不同的实例
  20.         # 0是背景
  21.         mask = Image.open(mask_path)
  22.         # 将PIL图像转换为numpy数组
  23.         mask = np.array(mask)
  24.         # 实例被编码为不同的颜色
  25.         obj_ids = np.unique(mask)
  26.         # 第一个id是背景,所以删除它
  27.         obj_ids = obj_ids[1:]
  28.         # 将颜色编码的mask分成一组
  29.         # 二进制格式
  30.         masks = mask == obj_ids[:, None, None]
  31.         # 获取每个mask的边界框坐标
  32.         num_objs = len(obj_ids)
  33.         boxes = []
  34.         for i in range(num_objs):
  35.             pos = np.where(masks[i])
  36.             xmin = np.min(pos[1])
  37.             xmax = np.max(pos[1])
  38.             ymin = np.min(pos[0])
  39.             ymax = np.max(pos[0])
  40.             boxes.append([xmin, ymin, xmax, ymax])
  41.         # 将所有转换为torch.Tensor
  42.         boxes = torch.as_tensor(boxes, dtype=torch.float32)
  43.         # 这里仅有一个类
  44.         labels = torch.ones((num_objs,), dtype=torch.int64)
  45.         masks = torch.as_tensor(masks, dtype=torch.uint8)
  46.         image_id = torch.tensor([idx])
  47.         area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])
  48.         # 假设所有实例都不是人群
  49.         iscrowd = torch.zeros((num_objs,), dtype=torch.int64)
  50.         target = {}
  51.         target["boxes"] = boxes
  52.         target["labels"] = labels
  53.         target["masks"] = masks
  54.         target["image_id"] = image_id
  55.         target["area"] = area
  56.         target["iscrowd"] = iscrowd
  57.         if self.transforms is not None:
  58.             img, target = self.transforms(img, target)
  59.         return img, target
  60.     def __len__(self):
  61.         return len(self.imgs)
  1.  
  2.  

3.定义模型

现在我们需要定义一个可以上述数据集执行预测的模型。在本教程中,我们将使用 Mask R-CNN, 它基于 Faster R-CNN。Faster R-CNN 是一种模型,可以预测图像中潜在对象的边界框和类别得分。 

Mask R-CNN 在 Faster R-CNN 中添加了一个额外的分支,它还预测每个实例的分割蒙版。

有两种常见情况可能需要修改torchvision modelzoo中的一个可用模型。第一个是我们想要从预先训练的模型开始,然后微调最后一层。另一种是当我们想要用不同的模型替换模型的主干时(例如,用于更快的预测)。

下面是对这两种情况的处理。

  • 1 微调已经预训练的模型 让我们假设你想从一个在COCO上已预先训练过的模型开始,并希望为你的特定类进行微调。这是一种可行的方法:

    1. import torchvision
    2. from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
    3. # 在COCO上加载经过预训练的预训练模型
    4. model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
    5. # replace the classifier with a new one, that has
    6. # 将分类器替换为具有用户定义的 num_classes的新分类器
    7. num_classes = 2  # 1 class (person) + background
    8. # 获取分类器的输入参数的数量
    9. in_features = model.roi_heads.box_predictor.cls_score.in_features
    10. # 用新的头部替换预先训练好的头部
    11. model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
  • 2 修改模型以添加不同的主干

    1. import torchvision
    2. from torchvision.models.detection import FasterRCNN
    3. from torchvision.models.detection.rpn import AnchorGenerator
    4. # 加载预先训练的模型进行分类和返回
    5. # 只有功能
    6. backbone = torchvision.models.mobilenet_v2(pretrained=True).features
    7. # FasterRCNN需要知道骨干网中的输出通道数量。对于mobilenet_v2,它是1280,所以我们需要在这里添加它
    8. backbone.out_channels = 1280
    9. # 我们让RPN在每个空间位置生成5 x 3个锚点
    10. # 具有5种不同的大小和3种不同的宽高比。
    11. # 我们有一个元组[元组[int]]
    12. # 因为每个特征映射可能具有不同的大小和宽高比
    13. anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),
    14.                                    aspect_ratios=((0.5, 1.0, 2.0),))
    15. # 定义一下我们将用于执行感兴趣区域裁剪的特征映射,以及重新缩放后裁剪的大小。
    16. # 如果您的主干返回Tensor,则featmap_names应为[0]。
    17. # 更一般地,主干应该返回OrderedDict [Tensor]
    18. # 并且在featmap_names中,您可以选择要使用的功能映射。
    19. roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=[0],
    20.                                                 output_size=7,
    21.                                                 sampling_ratio=2)
    22. # 将这些pieces放在FasterRCNN模型中
    23. model = FasterRCNN(backbone,
    24.                    num_classes=2,
    25.                    rpn_anchor_generator=anchor_generator,
    26.                    box_roi_pool=roi_pooler)

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

在我们的例子中,我们希望从预先训练的模型中进行微调,因为我们的数据集非常小,所以我们将遵循上述第一种情况。

这里我们还要计算实例分割掩膜,因此我们将使用 Mask R-CNN:

  1. import torchvision
  2. from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
  3. from torchvision.models.detection.mask_rcnn import MaskRCNNPredictor
  4. def get_model_instance_segmentation(num_classes):
  5.     # 加载在COCO上预训练的预训练的实例分割模型
  6.     model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)
  7.     # 获取分类器的输入特征数
  8.     in_features = model.roi_heads.box_predictor.cls_score.in_features
  9.     # 用新的头部替换预先训练好的头部
  10.     model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
  11.     # 现在获取掩膜分类器的输入特征数
  12.     in_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channels
  13.     hidden_layer = 256
  14.     # 并用新的掩膜预测器替换掩膜预测器
  15.     model.roi_heads.mask_predictor = MaskRCNNPredictor(in_features_mask,
  16.                                                        hidden_layer,
  17.                                                        num_classes)
  18.     return model

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

4.整合

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

4.1 为数据扩充/转换编写辅助函数:

  1. import transforms as T
  2. def get_transform(train):
  3.     transforms = []
  4.     transforms.append(T.ToTensor())
  5.     if train:
  6.         transforms.append(T.RandomHorizontalFlip(0.5))
  7.     return T.Compose(transforms)

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

  1. from engine import train_one_epoch, evaluate
  2. import utils
  3. def main():
  4.     # 在GPU上训练,若无GPU,可选择在CPU上训练
  5.     device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
  6.     # 我们的数据集只有两个类 - 背景和人
  7.     num_classes = 2
  8.     # 使用我们的数据集和定义的转换
  9.     dataset = PennFudanDataset('PennFudanPed', get_transform(train=True))
  10.     dataset_test = PennFudanDataset('PennFudanPed', get_transform(train=False))
  11.     # 在训练和测试集中拆分数据集
  12.     indices = torch.randperm(len(dataset)).tolist()
  13.     dataset = torch.utils.data.Subset(dataset, indices[:-50])
  14.     dataset_test = torch.utils.data.Subset(dataset_test, indices[-50:])
  15.     # 定义训练和验证数据加载器
  16.     data_loader = torch.utils.data.DataLoader(
  17.         dataset, batch_size=2, shuffle=True, num_workers=4,
  18.         collate_fn=utils.collate_fn)
  19.     data_loader_test = torch.utils.data.DataLoader(
  20.         dataset_test, batch_size=1, shuffle=False, num_workers=4,
  21.         collate_fn=utils.collate_fn)
  22.     # 使用我们的辅助函数获取模型
  23.     model = get_model_instance_segmentation(num_classes)
  24.     # 将我们的模型迁移到合适的设备
  25.     model.to(device)
  26.     # 构造一个优化器
  27.     params = [p for p in model.parameters() if p.requires_grad]
  28.     optimizer = torch.optim.SGD(params, lr=0.005,
  29.                                 momentum=0.9, weight_decay=0.0005)
  30.     # 和学习率调度程序
  31.     lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer,
  32.                                                    step_size=3,
  33.                                                    gamma=0.1)
  34.     # 训练10个epochs
  35.     num_epochs = 10
  36.     for epoch in range(num_epochs):
  37.         # 训练一个epoch,每10次迭代打印一次
  38.         train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq=10)
  39.         # 更新学习速率
  40.         lr_scheduler.step()
  41.         # 在测试集上评价
  42.         evaluate(model, data_loader_test, device=device)
  43.     print("That's it!")

在第一个epoch训练后可以得到下面的结果:

  1.  
  2.  

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=0.01s).

Accumulating evaluation results...

DONE (t=0.01s).

IoU metric: bbox

Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.606

Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.984

Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.780

Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.313

Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.582

Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.612

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.270

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.672

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.672

Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.650

Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.755

Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.664

IoU metric: segm

Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.704

Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.979

Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.871

Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.325

Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.488

Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.727

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.316

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.748

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.749

Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.650

Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.673

Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.758

因此,在一个epoch训练之后,我们获得了COCO-style mAP为60.6,并且mask mAP为70.4。

经过训练10个epoch后,我得到了以下指标:

  1.  
  2.  

IoU metric: bbox

Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.799

Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.969

Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.935

Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.349

Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.592

Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.831

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.324

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.844

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.844

Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.400

Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.777

Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.870

IoU metric: segm

Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.761

Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.969

Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.919

Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.341

Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.464

Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.788

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.303

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.799

Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.799

Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.400

Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.769

Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.818

但预测结果如何呢?让我们在数据集中拍摄一张图像并进行验证。 

训练的模型预测了此图像中的9个人物,让我们看看其中的几个,由下图可以看到预测效果很好。 

5.总结

在本教程中,您学习了如何在自定义数据集上为实例分段模型创建自己的训练管道。为此,您编写了一个torch.utils.data.Dataset类, 它返回图像以及地面实况框和分割掩码。您还利用了在COCO train2017上预训练的Mask R-CNN模型,以便对此新数据集执行传输学习。

有关包含multi-machine / multi-gpu training的更完整示例,请检查 torchvision 存储库中的references/detection/train.py

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

PyTorch专栏(八):微调基于torchvision 0.3的目标检测模型的更多相关文章

  1. 微调torchvision 0.3的目标检测模型

    微调torchvision 0.3的目标检测模型 本文将微调在 Penn-Fudan 数据库中对行人检测和分割的已预先训练的 Mask R-CNN 模型.它包含170个图像和345个行人实例,说明如何 ...

  2. 基于COCO数据集验证的目标检测算法天梯排行榜

    基于COCO数据集验证的目标检测算法天梯排行榜 AP50 Rank Model box AP AP50 Paper Code Result Year Tags 1 SwinV2-G (HTC++) 6 ...

  3. 基于YOLO和PSPNet的目标检测与语义分割系统(python)

    基于YOLO和PSPNet的目标检测与语义分割系统 源代码地址 概述 这是我的本科毕业设计 它的主要功能是通过YOLOv5进行目标检测,并使用PSPNet进行语义分割. 本项目YOLOv5部分代码基于 ...

  4. 谷歌大脑提出:基于NAS的目标检测模型NAS-FPN,超越Mask R-CNN

    谷歌大脑提出:基于NAS的目标检测模型NAS-FPN,超越Mask R-CNN 朱晓霞发表于目标检测和深度学习订阅 235 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等价格 ...

  5. 基于模糊Choquet积分的目标检测算法

    本文根据论文:Fuzzy Integral for Moving Object Detection-FUZZ-IEEE_2008的内容及自己的理解而成,如果想了解更多细节,请参考原文.在背景建模中,我 ...

  6. 基于opencv3.0下的人脸检测和检测部分的高斯模糊处理

    如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...

  7. pytorch实现yolov3(5) 实现端到端的目标检测

    torch实现yolov3(1) torch实现yolov3(2) torch实现yolov3(3) torch实现yolov3(4) 前面4篇已经实现了network的forward,并且将netw ...

  8. PyTorch专栏(六): 混合前端的seq2seq模型部署

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/ 欢迎关注PyTorch官方中文教程站: http://pytorch.panchuang.net/ 专栏目录: 第一 ...

  9. PyTorch专栏(五):迁移学习

    专栏目录: 第一章:PyTorch之简介与下载 PyTorch简介 PyTorch环境搭建 第二章:PyTorch之60分钟入门 PyTorch入门 PyTorch自动微分 PyTorch神经网络 P ...

随机推荐

  1. 一条SQL在内存结构与后台进程工作机制

    oracle服务器由数据库以及实例组成,数据库由数据文件,控制文件等物理文件组成,实例是由内存结构+后台进程组成,实例又可以看做连接数据库的方式,在我看来就好比一家公司,实例就是一个决策的办公室,大大 ...

  2. c#版阿里云oss上传——基于layui、pupload的oss 后端web端直传的vue组件

    废话前言 去年,做项目用到oss上传,度娘上逛了一圈写了个前后端代码结合的c#版oss上传. 今年又要用到oss上传时发现很难复用,复用改动的范围太大,显然这个轮子不合格.于是想了下,花了一天的时间( ...

  3. 使用QT绘制一个多边形

    目录 1. 概述 2. 实现 2.1. 代码 2.2. 解析 3. 结果 1. 概述 可以通过QT的重绘事件和鼠标事件来绘制多边形,最简单的办法就是在继承QWidget的窗体中重写paintEvent ...

  4. PHPRAP 1.0.2 发布,修复安装失败 Bug 和优化细节

    PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复在MySQL5.5版本下安装数据初始化sql文 ...

  5. jdk1.5之后,classpath不需要再配置

    1.5之后更智能了. 设置了classpath之后,当前目录失效(在classpath中没找到就报错,不会再在当前目录继续找),所以要把当前目录添加到classpath,永久环境变量添加 .,临时环境 ...

  6. Python线性优化基础讲解~

    目前,各组织正在利用数据科学和机器学习来解决各种业务问题.为了创造一个真正的业务影响,如何弥合数据科学管道和业务决策管道之间的差距显得尤为重要. 数据科学管道的结果往往是数据中的预测.模式和洞察(通常 ...

  7. CODING 携手优普丰,道器合璧打造敏捷最佳实践

    随着全球进入到信息化时代,越来越多的企业迫切地寻求新的商业模式,要求迭代.探索.不断加速创新以响应快速变化的市场.如今一系列新兴概念如敏捷开发.极限编程.微服务.自动化.DevOps 等大行其道,然而 ...

  8. docker 学习之路 将docker容器变为镜像并上传

    环境 ubunt 16.4 去hub.docker.com上注册一个账号,并在账号中注册一个公有public或者私有仓库private 步骤如下 如上图 点击该处进入创建docker库页面 除了名字之 ...

  9. 一,kubeadm初始化k8s集群

    docker安装 wget    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo yum inst ...

  10. 微信小程序用setData修改数组或对象中的一个属性值,超好用,最简单的实现方法,不容错过!大神们 都 在 看 的方法!!!

    在page中 data: { info: [{ name: "yuki", tou: "../img/head.jpg", zGong: 130, gMoney ...