具有薄板样条(TPS)的空间变压器网络(STN)的Pytorch实现。
STN是[1]中DeepMind提出的强大神经网络架构。 STN通过将输入图像自动整流为正常分类网络,从而实现实际空间不变性。 STN最令人惊奇的部分是它是端到端的差异,并且可以直接插入现有的网络体系结构(Alexnet,Resnet等),而无需任何额外的监督。
原始STN纸[1]对三种特定转换形式进行实验:仿射转换,投射转换和薄板样条键转换(TPS) 。其中我认为TPS是最有力的翻译,因为它可以任意地扭曲图像。如下所示,我可以扭曲我的头像
进入
TPS-STN已用于OCR应用程序[2]。在本文中,TPS-STN是在将其馈入正常的OCR文本识别模型之前自动纠正扭曲的文本图像:
我使用imageio创建GIF可视化。只需通过pip install imageio安装它。
python mnist_train.py --model unbounded_stn --angle 90 --grid_size 4
python mnist_visualize.py --model unbounded_stn --angle 90 --grid_size 4
python mnist_make_gif.py --model unbounded_stn --angle 90 --grid_size 4
然后,PNG和GIF resutls将保存在./image/unbounded_stn_angle60_grid4/和./gif/unbounded_stn_angle60_grid4/中。
您可以尝试模型架构,MNIST随机旋转角度和TPS网格大小的其他组合。下面的详细信息。
有三个可控的参数: --model , --angle , --grid_size 。
--model :str,必需
no_stn ,STN模块被丢弃,只有一个CNN分类器保留。bounded_stn , F.tanh将本地化网络的输出挤压到[-1,1],就像[2]中所做的那样unbounded_stn ,Locolizaition网络的输出不会被挤压--angle :int,默认值= 60
[-angle, angle]内的随机角度旋转--grid_size :int,默认= 4
(grid_size x grid_size)控制点来定义薄板样条变换 angle = 90的结果通常不好:
如果grid_size <= 3 : bounded_stn的结果很差
但是,如果grid_size >= 4 :
带有unbounded_stn结果还可以:
当然,每种组合中总是有坏病例。您可以从Baidu NetDisk(文件大小2G)下载我的所有GIF。
[1]空间变压器网络
[2]自动矩阵稳健的场景识别
[3]数值方法————薄板样条)