[学习笔记] STN、DCN 、MORAN简单总结


STN、DCN 、MORAN简单总结

题外话

最近没啥时间写blog了,陆续接了一些活在干,但是对OCR开始感兴趣起来了,看了一篇MORAN和一篇DCN,让我感觉和我之前做的一些工作是很接近的,感觉大家都是在从不同角度去让CNN学习一种对形变更鲁棒的表示,简单总结一下。

STN、DCN和MORAN

STN是通过一个loc_net来回归一组仿射变换的参数,利用仿射变换的关系得到outfeature map与input feature map在位置上的对应关系,然后利用插值保证对应的位置存在。此外,插值还保证了整个操作是可导的,一来有了从输出位置到输入位置的导数,二来仿射关系也能根据公式导出输出对仿射变换参数的导数,用于更新loc_net。

DCN是通过一个卷积子网络回归卷积核的offset,然后卷积核在采样加权时,不在原来固定的位置采样,而是在原来的位置的基础上加上回归的offset,在这些位置进行采样加权,同样的,为了使操作是可导的,也使用了插值操作。

MORAN是OCR领域的一篇paper的方法,为了解决输入字符不对齐(比如一个字符偏上,一个字符偏下),网络学习输出每个像素值的offset,然后相当于得到了input featuremap到output featuremap的对应关系,同样插值,使得操作可导。

我在最近的工作中,需要做的是去学习给定输入的最合适的crop位置,也就是让网络学会crop,虽然STN的仿射变换已经包含的这一操作,但是在实际训练中,端到端的训练很难使得我的任务收敛到很好的结果,我也提出了一些改进,不赘述。

上述三种方法的共同点是:

  1. 都希望利用一个子网回归网络的一组参数,然后利用这个参数得到输入和输出对应的关系,通过输出来优化输入或者被回归的参数。
  2. 都在作用这种“操作”之后,使得output featuremap更适合任务,能够对任务结果有提升。
  3. STN和MORAN都是对原图进行操作,得到的结果实际上对人而言有可解释性。

不同点:

  1. STN和MORAN的结果对人而言有可解释性,DCN的结果其实对人而言没有解释性,offset对应的位置有可解释性,结果只是采样后的另一种表示。
  2. STN是针对整张图像而言,做仿射变换;MORAN是对输入拆分成块,每块有自己的offset,然后平移块;DCN是针对卷积核做offset,试图改变采样的位置,而非定点采样。

此外,还有一些问题:

MORAN V1的训练是curriculum learning,端到端训练收敛的结果并不好(虽然作者后面做了改进v2已经不需要端到端训练了),STN其实同样也存在这样的问题,据实验室的师兄说,STN在输入和输出很接近的情况下训练的效果很好,要是输入的目标占总图像很小,很难训练出一个好结果,STN在我自己实验的时候也是端到端训练收敛效果并不好。MORAN V1通过先训练OCR识别网络,然后再去优化矫正网络,这样可以学的很好,我自己在训练的时候,针对STN也是交替训练后面的分类/回归网络,然后固定其参数训练前面的loc网络,效果能达到最好。

此外,还有一篇论文也是做相似的东西的,叫RA-CNN,这篇文章也是通过训练crop用于细粒度图像分类。很有意思的是,他也不是端到端训练,但这篇文章和上面的都不太相同,这里他根据实际情况定义了crop操作的梯度,梯度的回传是自己定义的。