# tps_stn_pytorch **Repository Path**: tunmx/tps_stn_pytorch ## Basic Information - **Project Name**: tps_stn_pytorch - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-10-23 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tps_stn_pytorch PyTorch implementation of Spatial Transformer Network (STN) with Thin Plate Spline (TPS). ## Introduction STN is a powerful neural network architecture proposed by DeepMind in [[1]](#ref-1). STN achieves real spatial invariance by automatically rectify input images before they are feeded into a normal classification network. The most amazing part of STN is that it is end-to-end differential and can be directly plugged into existing network architectures (AlexNet, Resnet, etc), **without any extra supervision.** Original STN paper [[1]](#ref-1) experiments on three specific transformation forms: Affine Transformation, Projective Transformation and **Thin Plate Spline Transformation (TPS)**. Among them I think TPS is the most powerful translation because it can warp a image in arbitrary way. As shown below, I can warp my Avatar into TPS-STN has been used in OCR application [[2]](#ref-2). In this paper TPS-STN is to automatically rectify distorted text images, before they are feeded into a normal OCR text recognition model: ## Dependencies - Python3 - PyTorch - Torchvision - Numpy - Matplotlib - Pillow / PIL - imageio I use `imageio` to create GIF visualization. Simply install it by `pip install imageio`. ## Run 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 Then PNG and GIF resutls will be saved in `./image/unbounded_stn_angle60_grid4/` and `./gif/unbounded_stn_angle60_grid4/`. You can try other combinations of model architecture, mnist random rotation angle and TPS grid size. Details below. ## Arguments There are three controllable arguments: `--model`, `--angle`, `--grid_size`. `--model`: str, required - With `no_stn`, STN module is discarded and only a single CNN classifier remains. - With `bounded_stn`, the output of localization network is squeezed to [-1, 1] by `F.tanh`, as was done in [[2]](#ref-1) - With `unbounded_stn`, the output of locolizaition network is not squeezed `--angle`: int, default = 60 - Samples in MNIST dataset will be rotated by random angles within `[-angle, angle]` `--grid_size`: int, default = 4 - Use `(grid_size x grid_size)` control points to define Thin Plate Spline transformation ## Test Accuracy Curves ## Visualize TPS-STN Results with `angle = 90` are generally bad: Results with `bounded_stn` are bad if `grid_size <= 3`: But ok if `grid_size >= 4`: Results with `unbounded_stn` are ok: Of course there are always bad cases in each combination. You can download all my GIFs from [Baidu Netdisk](https://pan.baidu.com/s/1c2KXPw0) (file size 2G). ## Reference [1] [Spatial Transformer Networks](https://arxiv.org/abs/1509.05329) [2] [Robust Scene Text Recognition with Automatic Rectification](https://arxiv.org/abs/1603.03915) [3] [数值方法——薄板样条插值(Thin-Plate Spline)](http://blog.csdn.net/VictoriaW/article/details/70161180)