参考链接: 传送门
细节见链接,总结下我的理解:
形变的不是卷积的 kernel,而是 feature map 上的每个pixel。
并没有对conv函数做什么变化,而是在普通的input map 和 conv之间,多做了一次conv得到input_offset map,再加上原input map,得到偏移后的新的input map pixel coor。( 这里要用到一下双线性插值)
以上就把input map要做的所有变化都做完了,剩下的就是普通conv的过程了。new input map 和 conv 。。。
- 对于输出特征图
U
,正常的卷积输出的N通道 - 在
U
上使用2N个普通卷积,得到2N的特征图,这代表变形卷积采样的偏移量(2N是代表x,y两个方向)。 - 对于得到的2N的特征图,shape为(b,h,w,2c)。将代表偏移的特征图
offsets
(b,h,w,2c)与原图(b,h,w,c)相加得到实际的采样位置coord(因为offset可能是float,所以要用双线性插值得到最终形变后定位到的pixel位置)
。- 将偏移(b,h,w,2c)变形为–>(b∗c,h,w,2)
- 输入(b,h,w,c)变形为–>(b∗c,h,w)
- 调用
tf_batch_map_offsets
函数做采样,得到采样后(b∗c,h,w) (双线性插值) - 得到最终输出–>(b,h,w,c)