| import copy |
| import torch |
| import torch.nn as nn |
| from torchvision.models import resnet50, ResNet50_Weights |
| from torchvision import transforms |
| from torchvision.transforms import functional as TF |
|
|
| |
| class Backbone(nn.Module): |
| def __init__(self, pretrained=True): |
| |
| super().__init__() |
|
|
| |
| weights = ResNet50_Weights.DEFAULT if pretrained else None |
| base_model = resnet50(weights=weights) |
|
|
| |
| |
| self.backbone = nn.Sequential(*list(base_model.children())[:-3]) |
|
|
|
|
| def forward(self, x): |
| |
| x = self.backbone(x) |
| return x |
|
|
|
|
| |
| |
|
|
| |
| class ToTensorTransform: |
| def __call__(self, img, target): |
| img = TF.to_tensor(img) |
| return img, target |
|
|
| |
| class ResizeTransform: |
| def __init__(self, short_side=600, max_side=1000): |
| self.short_side = short_side |
| self.max_side = max_side |
|
|
| def __call__(self, img, target): |
| return self.resize_shorter_side(img, target) |
|
|
| |
| def resize_shorter_side(self, img, target): |
| h, w = img.size |
| annotation_dict = copy.deepcopy(target) |
|
|
| scale = self.short_side / min(w, h) |
| if scale * max(w, h) > self.max_side: |
| scale = self.max_side / max(w, h) |
| |
| new_w = int(w * scale) |
| new_h = int(h * scale) |
|
|
| annotation_dict["size"]["new_width"] = new_w |
| annotation_dict["size"]["new_height"] = new_h |
|
|
| return TF.resize(img, (new_h, new_w)), annotation_dict |
|
|
| |
| class ComposedTransform: |
| def __init__(self, transforms): |
| self.transforms = transforms |
|
|
| def __call__(self, img, target): |
| for transform in self.transforms: |
| img, target = transform(img, target) |
| return img, target |
|
|
|
|
| backbone_transform = ComposedTransform([ |
| ResizeTransform(short_side=600, max_side=1000), |
| ToTensorTransform(), |
| ]) |
|
|