coarse alignment
粗匹配过程:使用resNet50的前面3层来提取图像的特征(对A图像使用多尺度提取特征,对B图像只使用一种尺度提取特征),然后使用余弦相似度找到两幅图对应的匹配点,然后使用RANSAC+homography/Affinie变换来估计光流。
coarseModel = CoarseAlign(nbScale, coarseIter, coarsetolerance, 'Homography', minSize, 1, True, imageNet, scaleR)
coarseModel.setSource(I1):对I1进行多尺度提取特征,并将提取到的尺度做归一化
for i in range(len(self.scaleList)) :
feat = F.normalize(self.net(self.preproc(IsList[i]).unsqueeze(0).cuda()))
self.featsMultiScale.append( feat.contiguous().view(1024, -1) )
coarseModel.setTarget(I2):对I2提取一个尺度的特征,并做归一化
self.featt = F.normalize(self.net(self.preproc(self.It).unsqueeze(0).cuda()))
bestPara, InlierMask = coarseModel.getCoarse(np.zeros((I2h, I2w)))
index1, index2 = outil.mutualMatching(self.featsMultiScale, featt)#获得匹配点
#采用矩阵相乘的方式获得两两之间的余弦相似度
score = torch.mm(featA.transpose(0, 1), featB)
#A图每个位置都计算B图和该位置最匹配的位置,同理,B图每个位置也计算A图和它最匹配的位置
maxDim0, maxDim0Index = score.topk(k=1, dim = 0) # 1 * nbB
maxDim1, maxDim1Index = score.topk(k=1, dim = 1) # nbA * 1
#如果两个的对应位置匹配,则认为他们是匹配点
keepMax = keepMaxDim0 * keepMaxDim1
index1, index2 = keepMaxIndex[:, 0], keepMaxIndex[:, 1]
bestParam, _, indexInlier, _ = outil.RANSAC(self.nbIter, match1, match2, self.tolerance, self.nbPoint, self.Transform) #根据RANSAC获得最佳的匹配点,并根据最佳匹配点获得RANSAC的最佳参数
H21, nbInlier = ScoreRANSAC(match1, match2, tolerance, unique_samples.narrow(0, nbLoop * nbMaxIter, len(unique_samples) - nbLoop * nbMaxIter), Transform)
best = torch.argmax(nbInlier)
if nbInlier[best] > bestInlier:
bestParams = H21[best]
bestInlier = nbInlier[best]
#根据homography的参数做变换
flowCoarse = warper.warp_grid(bestPara)
I1_coarse = F.grid_sample(coarseModel.IsTensor, flowCoarse)
光流匹配过程
(1)resNet50提取图像特征
(2)corr层来获得特征间的匹配关系
network = {'netFeatCoarse' : model.FeatureExtractor(),
'netCorr' : model.CorrNeigh(args.kernelSize),
'netFlowCoarse' : model.NetFlowCoarse(args.kernelSize),
'netMatch' : model.NetMatchability(args.kernelSize),
}
model.FeatureExtractor():提取特征,输入原始图像[2,3,240,240]-->输出提取的特征[2,256,30,30]
model.CorrNeigh(kernelSize):A图feat的size为[2,256,30,30],B图的feat的size为[2,256,30,30].假设kernelSize大小为7,则在横向纵向(-3,3)(上下左右)上滑动B图像,每次滑动时计算各个位置的余弦相似度,得到1张得分图,size为[2,1,30,30]。共滑动49次,所以得分图的size为[2,49,30,30].
model.NetFlowCoarse(kernelSize):输入coef的特征图的大小[2,49,30,30],输出为[2,2,240,240],其中2表示x,y方向预测的光流,240,240是原图的尺寸。