如何使用空间转换器在pytorch中裁剪图像?

Posted

技术标签:

【中文标题】如何使用空间转换器在pytorch中裁剪图像?【英文标题】:How to use spatial transformer to crop the image in pytorch? 【发布时间】:2019-08-17 18:32:59 【问题描述】:

空间变换网络的论文声称它可以用来裁剪图像。

给定裁剪区域(top_left, bottom_right)=(x1,y1,x2,y2),如何将该区域解释为变换矩阵并在pytorch中裁剪图像?

这里有一个关于torch (http://torch.ch/blog/2015/09/07/spatial_transformers.html)中空间变换器网络的介绍,在介绍中,它可视化了transformer所看到的边界框,我们如何在给定变换矩阵的情况下确定边界框?

[编辑]

我刚刚找到第一个问题的答案【给定裁剪区域,找出一个变换矩阵】

【问题讨论】:

你看过这个教程吗? pytorch.org/tutorials/intermediate/… 是的。但是我不知道crop和stn之间的关系。如何在给定作物区域的情况下制定变换矩阵? 另外,官方教程中空间变换网络后的图像总是包含黑色区域。但它在我提供的教程链接中没有黑色区域 @alec.tu 黑色区域意味着您的转换超出了给定输出大小的范围。确保您在转换中使用的位置和比例在正确的范围内(例如,当输出大小减半时,转换为 -0.5 到 0.5) 【参考方案1】:

原帖中的图片已经提供了很好的答案,但提供一些代码可能会有用。

重要的是,此方法应正确保留渐变。在我的例子中,我有一批 y,x 值代表裁剪位置的中心(在 [-1,1] 范围内)。至于值ab,它们是转换的比例x 和y 值,在我的例子中,我使用0.5 结合较小的输出尺寸(宽度和高度的一半)来保留原始比例,即裁剪。您可以使用1 使比例没有变化,但这样就没有裁剪了。

import torch.nn.functional as F

def crop_to_affine_matrix(t):
    'Turns (N,2) translate values into (N,2,3) affine transformation matrix'
    t = t.reshape(-1,1,2,1).flip(2) # flip x,y order to y,x
    t = F.pad(t, (2,0,0,0)).squeeze(1)
    t[:,0,0] = a
    t[:,1,1] = b
    return t

t = torch.zeros(5,2) # center crop positions for batch size 5
F.affine_grid(crop_to_affine_matrix(t), outsize)

【讨论】:

以上是关于如何使用空间转换器在pytorch中裁剪图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Imcrop 和 Matlab 保存空间参考

如何使用 Python 和 OpenCV 裁剪图像中的多个 ROI

如何在angularjs中使用ng-file上传裁剪和上传图像

ImageMagick:转换、裁剪、调整大图像

图像不占用DataGridCell中的整个空间

在 PHP 中使用 imagecopy 时如何使任何“额外空间”变白