ransac_flow

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是原图的尺寸。

 





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值