1. IC-STN模型本质
如图1,STN是将输入图像用一个几何预测器预测校正参数p,把p作用在输入图像 I i n I_{in} Iin就得到了修正后的图像 I o u t I_{out} Iout。在STN原来的论文中,几何预测器可以展开为图2的样子。
和STN不同的是,IC-STN是把扭曲参数(warp parameter)p显式地提取了出来,并且对p进行若干次迭代,类似RNN迭代的思想。其流程如图3所示。论文作者的实验表明,这样能进一步增加准确率。
IC-STN的作者说他们从IC-LK算法中获得了启发,解释了很多字,说了很多废话,其实重点不在那里,可以不用太多地关注。
2. IC-STN代码解读
pytorch代码地址在这,里面也有tensorflow的版本。此外,IC-STN代码中的难点在于理解投影变换的代码,如果和我一样没什么基础的话,可以先看看这篇知乎回答。
下面会一个个部分讲解我对pytorch代码的理解,建议结合源代码查看(代码很长,我就不贴上来了)。
2.1 options.py 部分
里面存放了很多预设参数
opt = options()
参数都可以通过opt.xxx 来调用
2.2 data.py 部分
def loadMNIST(opt, path)
用于加载MNIST数据集
def makeBatch(opt, data)
制作一个batch
def evalTest(opt, data, geometric, classifier)
评估准确率,后面解释geometric和classifier
def genPerturbations(opt)
生成初始的warp parameter
return pInit
里面有个细节,如下
pPert = np.matmul(np.linalg.inv(np.matmul(Jtransp, J)), np.matmul(Jtransp, dXY)).squeeze()
翻译成公式,作者