日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

微调torchvision 0.3的目标检测模型

發(fā)布時(shí)間:2023/11/28 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微调torchvision 0.3的目标检测模型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微調(diào)torchvision 0.3的目標(biāo)檢測(cè)模型
本文將微調(diào)在 Penn-Fudan 數(shù)據(jù)庫(kù)中對(duì)行人檢測(cè)和分割的已預(yù)先訓(xùn)練的 Mask R-CNN 模型。它包含170個(gè)圖像和345個(gè)行人實(shí)例,說(shuō)明如何在 torchvision 中使用新功能,以便在自定義數(shù)據(jù)集上訓(xùn)練實(shí)例分割模型。
1.定義數(shù)據(jù)集
對(duì)于訓(xùn)練對(duì)象檢測(cè)的引用腳本,實(shí)例分割和人員關(guān)鍵點(diǎn)檢測(cè),要求能夠輕松支持添加新的自定義數(shù)據(jù)。數(shù)據(jù)集應(yīng)該從標(biāo)準(zhǔn)的類torch.utils.data.Dataset 繼承而來(lái),并實(shí)現(xiàn)_len和_getitem_
要求的唯一特性是數(shù)據(jù)集的__getitem__應(yīng)該返回:

  • 圖像:PIL圖像大小(H,W)
  • 目標(biāo):包含以下字段的字典
    <1> boxes(FloatTensor[N,4]):N邊框(bounding boxes)坐標(biāo)的格式[x0,x1,y0,y1],取值范圍是0到W,0到H。
    <2> labels(Int64Tensor[N]):每個(gè)邊框的標(biāo)簽。
    <3> image_id(Int64Tensor[1]):圖像識(shí)別器,它應(yīng)該在數(shù)據(jù)集中的所有圖像中是唯一的,并在評(píng)估期間使用。
    <4> area(Tensor[N]):邊框的面積,在使用COCO指標(biāo)進(jìn)行評(píng)估時(shí),使用此項(xiàng)來(lái)分隔小、中和大框之間的度量標(biāo)準(zhǔn)得分。
    <5> iscrowed(UInt8Tensor[N,H,W]):在評(píng)估期間屬性設(shè)置為iscrowed=True的實(shí)例會(huì)被忽略。
    <6> (可選)masks(UInt8Tesor[N,H,W]):每個(gè)對(duì)象的分段掩碼。
    <7> (可選)keypoints (FloatTensor[N, K, 3]:對(duì)于N個(gè)對(duì)象中的每一個(gè),它包含[x,y,visibility]格式的K個(gè)關(guān)鍵點(diǎn),用 于定義對(duì)象。visibility = 0表示關(guān)鍵點(diǎn)不可見(jiàn)。注意,對(duì)于數(shù)據(jù)擴(kuò)充,翻轉(zhuǎn)關(guān)鍵點(diǎn)的概念取決于數(shù)據(jù)表示,應(yīng)該調(diào)整 reference/detection/transforms.py,以用于新的關(guān)鍵點(diǎn)表示。
    如果模型返回上述方法,將使其適用于訓(xùn)練和評(píng)估,并將使用 pycocotools 的評(píng)估腳本。
    此外,如果要在訓(xùn)練期間使用寬高比分組(以便每個(gè)批次僅包含具有相似寬高比的圖像),則建議還實(shí)現(xiàn)get_height_and_width方法, 該方法返回圖像的高度和寬度。如果未提供此方法,將通過(guò)__getitem__查詢數(shù)據(jù)集的所有元素,這會(huì)將圖像加載到內(nèi)存中,但比提供自定義方法時(shí)要慢。
    2.為 PennFudan 編寫自定義數(shù)據(jù)集
    2.1 下載數(shù)據(jù)集
    下載并解壓縮zip文件后,有以下文件夾結(jié)構(gòu):
    PennFudanPed/
    PedMasks/
    FudanPed00001_mask.png
    FudanPed00002_mask.png
    FudanPed00003_mask.png
    FudanPed00004_mask.png

    PNGImages/
    FudanPed00001.png
    FudanPed00002.png
    FudanPed00003.png
    FudanPed00004.png
    下面是一個(gè)圖像以及其分割掩膜的例子:

因此每個(gè)圖像具有相應(yīng)的分割掩膜,其中每個(gè)顏色對(duì)應(yīng)于不同的實(shí)例。讓為這個(gè)數(shù)據(jù)集寫一個(gè)torch.utils.data.Dataset類。
2.2 為數(shù)據(jù)集編寫類
import os
import numpy as np
import torch
from PIL import Image

class PennFudanDataset(object):
def init(self, root, transforms):
self.root = root
self.transforms = transforms
# 下載所有圖像文件,為其排序
# 確保它們對(duì)齊
self.imgs = list(sorted(os.listdir(os.path.join(root, “PNGImages”))))
self.masks = list(sorted(os.listdir(os.path.join(root, “PedMasks”))))

def __getitem__(self, idx):# load images ad masksimg_path = os.path.join(self.root, "PNGImages", self.imgs[idx])mask_path = os.path.join(self.root, "PedMasks", self.masks[idx])img = Image.open(img_path).convert("RGB")# 請(qǐng)注意還沒(méi)有將mask轉(zhuǎn)換為RGB,# 因?yàn)槊糠N顏色對(duì)應(yīng)一個(gè)不同的實(shí)例# 0是背景mask = Image.open(mask_path)# 將PIL圖像轉(zhuǎn)換為numpy數(shù)組mask = np.array(mask)# 實(shí)例被編碼為不同的顏色obj_ids = np.unique(mask)# 第一個(gè)id是背景,所以刪除它obj_ids = obj_ids[1:]# 將顏色編碼的mask分成一組# 二進(jìn)制格式masks = mask == obj_ids[:, None, None]# 獲取每個(gè)mask的邊界框坐標(biāo)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])# 將所有轉(zhuǎn)換為torch.Tensorboxes = torch.as_tensor(boxes, dtype=torch.float32)# 這里僅有一個(gè)類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])# 假設(shè)所有實(shí)例都不是人群iscrowd = torch.zeros((num_objs,), dtype=torch.int64)target = {}target["boxes"] = boxestarget["labels"] = labelstarget["masks"] = maskstarget["image_id"] = image_idtarget["area"] = areatarget["iscrowd"] = iscrowdif self.transforms is not None:img, target = self.transforms(img, target)return img, targetdef __len__(self):return len(self.imgs)

3.定義模型
現(xiàn)在需要定義一個(gè)可以上述數(shù)據(jù)集執(zhí)行預(yù)測(cè)的模型。將使用 Mask R-CNN, 它基于 Faster R-CNN。Faster R-CNN 是一種模型,可以預(yù)測(cè)圖像中潛在對(duì)象的邊界框和類別得分。

Mask R-CNN 在 Faster R-CNN 中添加了一個(gè)額外的分支,它還預(yù)測(cè)每個(gè)實(shí)例的分割蒙版。

有兩種常見(jiàn)情況可能需要修改torchvision modelzoo中的一個(gè)可用模型。第一個(gè)是想要從預(yù)先訓(xùn)練的模型開(kāi)始,然后微調(diào)最后一層。 另一種是當(dāng)想要用不同的模型替換模型的主干時(shí)(例如,用于更快的預(yù)測(cè))。
下面是對(duì)這兩種情況的處理。

  • 1 微調(diào)已經(jīng)預(yù)訓(xùn)練的模型。從一個(gè)在COCO上已預(yù)先訓(xùn)練過(guò)的模型開(kāi)始,并希望特定類進(jìn)行微調(diào)。這是一種可行的方法:
    import torchvision
    from torchvision.models.detection.faster_rcnn import FastRCNNPredictor

在COCO上加載經(jīng)過(guò)預(yù)訓(xùn)練的預(yù)訓(xùn)練模型

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)

replace the classifier with a new one, that has

將分類器替換為具有用戶定義的 num_classes的新分類器

num_classes = 2 # 1 class (person) + background

獲取分類器的輸入?yún)?shù)的數(shù)量

in_features = model.roi_heads.box_predictor.cls_score.in_features

用新的頭部替換預(yù)先訓(xùn)練好的頭部

model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
? 2 修改模型以添加不同的主干
import torchvision
from torchvision.models.detection import FasterRCNN
from torchvision.models.detection.rpn import AnchorGenerator

加載預(yù)先訓(xùn)練的模型進(jìn)行分類和返回

只有功能

backbone = torchvision.models.mobilenet_v2(pretrained=True).features

FasterRCNN需要知道骨干網(wǎng)中的輸出通道數(shù)量。對(duì)于mobilenet_v2,它是1280,所以需要在這里添加它

backbone.out_channels = 1280

讓RPN在每個(gè)空間位置生成5 x 3個(gè)錨點(diǎn)

具有5種不同的大小和3種不同的寬高比。

有一個(gè)元組[元組[int]]

因?yàn)槊總€(gè)特征映射可能具有不同的大小和寬高比

anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),
aspect_ratios=((0.5, 1.0, 2.0),))

定義一下將用于執(zhí)行感興趣區(qū)域裁剪的特征映射,以及重新縮放后裁剪的大小。

如果的主干返回Tensor,則featmap_names應(yīng)為[0]。

更一般地,主干應(yīng)該返回OrderedDict [Tensor]

并且在featmap_names中,可以選擇要使用的功能映射。

roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=[0],
output_size=7,
sampling_ratio=2)

將這些pieces放在FasterRCNN模型中

model = FasterRCNN(backbone,
num_classes=2,
rpn_anchor_generator=anchor_generator,
box_roi_pool=roi_pooler)
3.1 PennFudan 數(shù)據(jù)集的實(shí)例分割模型
例子中,希望從預(yù)先訓(xùn)練的模型中進(jìn)行微調(diào),因?yàn)榈臄?shù)據(jù)集非常小,所以將遵循上述第一種情況。
這里還要計(jì)算實(shí)例分割掩膜,因此將使用 Mask R-CNN:
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上預(yù)訓(xùn)練的預(yù)訓(xùn)練的實(shí)例分割模型
model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)

# 獲取分類器的輸入特征數(shù)
in_features = model.roi_heads.box_predictor.cls_score.in_features
# 用新的頭部替換預(yù)先訓(xùn)練好的頭部
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)# 現(xiàn)在獲取掩膜分類器的輸入特征數(shù)
in_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channels
hidden_layer = 256
# 并用新的掩膜預(yù)測(cè)器替換掩膜預(yù)測(cè)器
model.roi_heads.mask_predictor = MaskRCNNPredictor(in_features_mask,hidden_layer,num_classes)return model

這將使模型準(zhǔn)備好在的自定義數(shù)據(jù)集上進(jìn)行訓(xùn)練和評(píng)估。
4.整合
在references/detection/中,有許多輔助函數(shù)來(lái)簡(jiǎn)化訓(xùn)練和評(píng)估檢測(cè)模型。在這里,將使用 references/detection/engine.py,references/detection/utils.py和references/detection/transforms.py。 只需將它們復(fù)制到的文件夾,并在此處使用它們。
4.1 為數(shù)據(jù)擴(kuò)充/轉(zhuǎn)換編寫輔助函數(shù):
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)
4.2 編寫執(zhí)行訓(xùn)練和驗(yàn)證的主要功能
from engine import train_one_epoch, evaluate
import utils

def main():
# 在GPU上訓(xùn)練,若無(wú)GPU,可選擇在CPU上訓(xùn)練
device = torch.device(‘cuda’) if torch.cuda.is_available() else torch.device(‘cpu’)

# 的數(shù)據(jù)集只有兩個(gè)類 - 背景和人
num_classes = 2
# 使用的數(shù)據(jù)集和定義的轉(zhuǎn)換
dataset = PennFudanDataset('PennFudanPed', get_transform(train=True))
dataset_test = PennFudanDataset('PennFudanPed', get_transform(train=False))# 在訓(xùn)練和測(cè)試集中拆分?jǐn)?shù)據(jù)集
indices = torch.randperm(len(dataset)).tolist()
dataset = torch.utils.data.Subset(dataset, indices[:-50])
dataset_test = torch.utils.data.Subset(dataset_test, indices[-50:])# 定義訓(xùn)練和驗(yàn)證數(shù)據(jù)加載器
data_loader = torch.utils.data.DataLoader(dataset, batch_size=2, shuffle=True, num_workers=4,collate_fn=utils.collate_fn)data_loader_test = torch.utils.data.DataLoader(dataset_test, batch_size=1, shuffle=False, num_workers=4,collate_fn=utils.collate_fn)# 使用的輔助函數(shù)獲取模型
model = get_model_instance_segmentation(num_classes)# 將的模型遷移到合適的設(shè)備
model.to(device)# 構(gòu)造一個(gè)優(yōu)化器
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)
# 和學(xué)習(xí)率調(diào)度程序
lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer,step_size=3,gamma=0.1)# 訓(xùn)練10個(gè)epochs
num_epochs = 10for epoch in range(num_epochs):# 訓(xùn)練一個(gè)epoch,每10次迭代打印一次train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq=10)# 更新學(xué)習(xí)速率lr_scheduler.step()# 在測(cè)試集上評(píng)價(jià)evaluate(model, data_loader_test, device=device)print("That's it!")

在第一個(gè)epoch訓(xùn)練后可以得到下面的結(jié)果:
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
因此,在一個(gè)epoch訓(xùn)練之后,獲得了COCO-style mAP為60.6,并且mask mAP為70.4。
經(jīng)過(guò)訓(xùn)練10個(gè)epoch后,得到了以下指標(biāo):
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
但預(yù)測(cè)結(jié)果如何呢?讓在數(shù)據(jù)集中拍攝一張圖像并進(jìn)行驗(yàn)證。

訓(xùn)練的模型預(yù)測(cè)了此圖像中的9個(gè)人物,讓看看其中的幾個(gè),由下圖可以看到預(yù)測(cè)效果很好。

5.總結(jié)
本文學(xué)習(xí)了如何在自定義數(shù)據(jù)集上為實(shí)例分段模型創(chuàng)建自己的訓(xùn)練管道。為此,編寫了一個(gè)torch.utils.data.Dataset類, 返回圖像以及地面實(shí)況框和分割掩碼。還利用了在COCO train2017上預(yù)訓(xùn)練的Mask R-CNN模型,以便對(duì)此新數(shù)據(jù)集執(zhí)行傳輸學(xué)習(xí)。
有關(guān)包含multi-machine / multi-gpu training的更完整示例,請(qǐng)檢查 torchvision 存儲(chǔ)庫(kù)中的references/detection/train.py。
可以下載本教程的完整源文件。

總結(jié)

以上是生活随笔為你收集整理的微调torchvision 0.3的目标检测模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。