【问题标题】:Input image size of Faster-RCNN model in PytorchPytorch 中 Faster-RCNN 模型的输入图像大小
【发布时间】:2021-11-02 07:07:30
【问题描述】:

我正在尝试使用 Pytorch 实现 Faster-RCNN 模型。 在结构中,模型的第一个元素是Transform。

from torchvision.models.detection import fasterrcnn_resnet50_fpn

model = fasterrcnn_resnet50_fpn(pretrained=True)

print(model.transform)
GeneralizedRCNNTransform(
    Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    Resize(min_size=(800,), max_size=1333, mode='bilinear')
)

当图像通过Resize() 时,它们会根据宽度和高度的比例输出(800,h)(w, 1333)

for i in range(2):
    _, image, target = testset.__getitem__(i)
    img = image.unsqueeze(0)
    output, _ = model.transform(img)

Before Transform : torch.Size([512, 640])
After Transform : [(800, 1000)]
Before Transform : torch.Size([315, 640])
After Transform : [(656, 1333)]

我的问题是如何获得那些调整大小的输出以及他们为什么使用这种方法?论文里查不到资料,也看不懂fasterrcnn_resnet50_fpn中关于transform的源码。

对不起我的英语

【问题讨论】:

  • 什么是model.transform?是你实施的吗?
  • 我编辑了我的代码。这是torchvision 中的 Faster-RCNN 模型。
  • 我无法重现这个,因为GeneralizedRCNNTransform ResizeNormalize 没有被导入。请您发布一个可重现的最小示例,以便我可以提供更好的帮助吗?

标签: python pytorch faster-rcnn


【解决方案1】:

GeneralizedRCNN 数据变换https://github.com/pytorch/vision/blob/922db3086e654871c35cd80c2c01eabb65d78475/torchvision/models/detection/generalized_rcnn.py#L15

对输入执行数据转换以馈入模型

min_size:在将图像输入到主干之前要重新缩放的图像的最小尺寸。

ma​​x_size:图像在馈送到主干之前要重新缩放的最大尺寸

https://github.com/pytorch/vision/blob/main/torchvision/models/detection/faster_rcnn.py#L256

我也不知道为什么它被概括为最小 800 和最大 1333,也没有在研究论文中找到任何东西。

但由于第一层是 Conv 层,网络的输入是固定大小的,我应用了许多其他增强功能,例如镜像、随机裁剪等,灵感来自基于 SSD 的网络。因此,我宁愿在一个单独的地方进行一次所有扩充,而不是两次。 我认为该模型应该在使用形状和其他属性尽可能接近训练数据的图像进行验证期间发挥最佳效果。

虽然您可以尝试自定义 min_size 和 max_size...

`

from .transform import GeneralizedRCNNTransform

min_size = 900 #changed from default
max_size = 1433 #changed from default
image_mean = [0.485, 0.456, 0.406]
image_std = [0.229, 0.224, 0.225]

model = fasterrcnn_resnet50_fpn(pretrained=True, min_size, max_size, image_mean, image_std)

#batch of 4 image, 4 bboxes
images, boxes = torch.rand(4, 3, 600, 1200), torch.rand(4, 11, 4) 
labels = torch.randint(1, 91, (4, 11))
images = list(image for image in images)
targets = []
for i in range(len(images)):
    d = {}
    d['boxes'] = boxes[i]
    d['labels'] = labels[i]
    targets.append(d)
    
output = model(images, targets)

`

或者你可以完全编写你的变换 https://pytorch.org/vision/stable/transforms.html

'

from torchvision.transforms import transforms as T
model = fasterrcnn_resnet50_rpn()
model.transform = T.Compose([*check torchvision.transforms for more*])

'

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 2020-01-11
    • 2021-03-03
    • 2023-04-09
    • 2020-12-24
    • 2017-05-12
    • 2021-07-25
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多