如何使用空间转换器在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] 范围内)。至于值a
和b
,它们是转换的比例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中裁剪图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python 和 OpenCV 裁剪图像中的多个 ROI