Implementación de Pytorch de la red de transformadores espaciales (STN) con spline de placa delgada (TPS).
STN es una poderosa arquitectura de red neuronal propuesta por DeepMind en [1]. STN logra una invariancia espacial real rectificando automáticamente las imágenes de entrada antes de que se alimenten en una red de clasificación normal. La parte más sorprendente de STN es que es diferencial de extremo a extremo y puede conectarse directamente a las arquitecturas de red existentes (Alexnet, Resnet, etc.), sin ninguna supervisión adicional.
Documento STN original [1] Experimentos en tres formas de transformación específicas: transformación afina, transformación proyectiva y transformación de spline de placa delgada (TPS) . Entre ellos creo que TPS es la traducción más poderosa porque puede deformar una imagen de manera arbitraria. Como se muestra a continuación, puedo deformar mi avatar
en
TPS-STN se ha utilizado en la aplicación OCR [2]. En este documento, TPS-STN es rectificar automáticamente las imágenes de texto distorsionadas, antes de alimentarse en un modelo normal de reconocimiento de texto OCR:
Utilizo imageio para crear visualización GIF. Simplemente instálelo por 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
Entonces se guardará PNG y GIF Resutls en ./image/unbounded_stn_angle60_grid4/ y ./gif/unbounded_stn_angle60_grid4/ .
Puede probar otras combinaciones de arquitectura del modelo, ángulo de rotación aleatoria MNIST y tamaño de la cuadrícula TPS. Detalles a continuación.
Hay tres argumentos controlables: --model , --angle , --grid_size .
--model : STR, requerido
no_stn , el módulo STN se descarta y solo queda un solo clasificador CNN.bounded_stn , la salida de la red de localización se exprime a [-1, 1] por F.tanh , como se realizó en [2]unbounded_stn , la salida de la red de locolizaition no se exprime --angle : int, predeterminado = 60
[-angle, angle] --grid_size : int, default = 4
(grid_size x grid_size) Puntos de control para definir la transformación de la spline de placa delgada Los resultados con angle = 90 son generalmente malos:
Los resultados con bounded_stn son malos si grid_size <= 3 :
Pero está bien si grid_size >= 4 :
Los resultados con unbounded_stn están bien:
Por supuesto, siempre hay casos malos en cada combinación. Puede descargar todos mis GIF de Baidu NetDisk (tamaño de archivo 2G).
[1] Redes de transformadores espaciales
[2] Reconocimiento de texto de escena robusto con rectificación automática
[3] 数值方法 —— 薄板样条插值( Spline de placa delgada)