n-d图像的弹性变形。
elasticdeform的Python项目详细描述
n维图像的弹性变形(python、scipy、numpy、tensorflow)
该库实现了n维图像的弹性网格变形。
弹性变形方法在
- Ronneberger,Fischer,and Brox,“U网络:生物医学卷积网络 图像分割“(https://arxiv.org/abs/1505.04597)
- 切克等人,“三维u-net:学习稠密容积 稀疏注释“(https://arxiv.org/abs/1606.06650)的分段
该程序生成带有随机位移的粗位移网格 对于每个网格点。然后对该网格进行插值以计算 输入图像中的每个像素。然后使用 位移向量和样条插值。
除了正常的正向变形外,该包装还提供
可以通过变形反向传播梯度的函数。这使得
在卷积神经网络中,可以将变形作为一个层。
为了方便起见,在elasticdeform.tf
中提供了tensorflow包装器。
安装
pip install elasticdeform
or
pip install git+https://github.com/gvtulder/elasticdeform
这个库需要python 3和numpy开发头。
示例
此基本示例使用随机3 x 3变形网格变形图像:
importnumpy,imageio,elasticdeformX=numpy.zeros((200,300))X[::10,::10]=1# apply deformation with a random 3 x 3 gridX_deformed=elasticdeform.deform_random_grid(X,sigma=25,points=3)imageio.imsave('test_X.png',X)imageio.imsave('test_X_deformed.png',X_deformed)
多个输入
如果有多个图像,例如一个图像和一个分割图像,则可以 通过提供输入列表同时使两者变形。您可以指定 每个输入的样条线顺序不同。
# apply deformation to inputs X and Y[X_deformed,Y_deformed]=elasticdeform.deform_random_grid([X,Y])# apply deformation to inputs X and Y,# with a different interpolation for each input[X_deformed,Y_deformed]=elasticdeform.deform_random_grid([X,Y],order=[3,0])
多通道图像
默认情况下,变形将应用于输入的每个维度。如果你
如果有多通道图像,可以使用axis
参数指定哪些轴
应该变形了。每个通道将应用相同的变形。
例如,要使rgb图像在前两个维度上变形,请运行:
X_deformed=elasticdeform.deform_random_grid(X,axis=(0,1))
变形多个输入时,可以为每个输入提供一组轴:
X=numpy.random.rand(3,200,300)Y=numpy.random.rand(200,300)[X_deformed,Y_deformed]=elasticdeform.deform_random_grid([X,Y],axis=[(1,2),(0,1)])
裁剪
如果您打算从变形的图像中裁剪一个小片段,可以提供 变形函数的裁剪尺寸。然后它将只计算裁剪的 输出像素,同时仍基于完整图像计算变形网格 尺寸。这节省了计算时间。
X=numpy.random.rand(200,300)# define a crop regioncrop=(slice(50,150),slice(0,100))# generate a deformation griddisplacement=numpy.random.randn(2,3,3)*25# deform full imageX_deformed=elasticdeform.deform_grid(X,displacement)# compute only the cropped regionX_deformed_crop=elasticdeform.deform_grid(X,displacement,crop=crop)# the deformation is the samenumpy.testing.assert_equal(X_deformed[crop],X_deformed_crop)
梯度
deform_grid_gradient
函数可用于反向传播
相对于输入的输出。使用
用于前进步骤的参数。
X=numpy.random.rand(200,300)# generate a deformation griddisplacement=numpy.random.randn(2,3,3)*25# perform forward deformationX_deformed=elasticdeform.deform_grid(X,displacement)# obtain the gradient w.r.t. X_deformed (e.g., with backpropagation)dX_deformed=numpy.random.randn(*X_deformed.shape)# compute the gradient w.r.t. XdX=elasticdeform.deform_grid_gradient(dX_deformed,displacement)
注意:梯度函数将假定输入的大小与
输出。如果在正向阶段使用crop
参数,则有必要
在
X_shape
参数。
Tensorflow包装器
elasticdeform.tf
模块为tensorflow中的deform_grid
提供包装。
函数使用tensorflow张量作为输入和输出,否则使用
相同的参数。
importnumpyimportelasticdeform.tfasetfdisplacement_val=numpy.random.randn(2,3,3)*5X_val=numpy.random.rand(200,300)dY_val=numpy.random.rand(200,300)# construct TensorFlow input and top gradientdisplacement=tf.Variable(displacement_val)X=tf.Variable(X_val)dY=tf.Variable(dY_val)# the deform_grid function is similar to the plain Python equivalent,# but it accepts and returns TensorFlow TensorsX_deformed=etf.deform_grid(X,displacement,order=3)# the gradient w.r.t. X can be computed in the normal TensorFlow manner[dX]=tf.gradients(X_deformed,X,dY)
许可证信息
这个库是由Gijs van Tulder在 Biomedical Imaging Group Rotterdam, 荷兰鹿特丹伊拉斯谟公司
它的灵感来自一个类似的基于python的实现 Florian Calvet。 这种基于c的实现给出了相同的结果,但是速度更快,并且 梯度实现。
此c实现包括NI_GeometricTransform
的修改版本
来自SciPy's ndimage library。
此代码在BSD许可证下可用。有关详细信息,请参见LICENSE.txt
。