当前位置: 首页 > news >正文

怎么让百度搜索到自己的网站洱源网站建设

怎么让百度搜索到自己的网站,洱源网站建设,刚开今天新开传奇网站,去年做那些网站能致富7、关于LoFTR LoFTR论文链接#xff1a;LoFTR LoFTR的提出#xff0c;是将Transformer模型的注意力机制在特征匹配方向的应用#xff0c;Transformer的提取特征的机制#xff0c;在自身进行#xff0c;本文提出可以的两张图像之间进行特征计算#xff0c;非常适合进行特…7、关于LoFTR LoFTR论文链接LoFTR LoFTR的提出是将Transformer模型的注意力机制在特征匹配方向的应用Transformer的提取特征的机制在自身进行本文提出可以的两张图像之间进行特征计算非常适合进行特征匹配。 一、传统匹配模式的局限 首先找到一些关键点(图像梯度较高角点检测等)然后计算特征相似度来匹配这种方法很依赖检测到的特征点一旦点找不到那就不用说匹配了 对于位置不同的两个点如果它们的背景特征相似(与位置无关了)也无法匹配两者差别不大的就无法区分了 二、LoFTR解决方案 不需要先得到特征点第一个问题就得到了解决采用end2end给一个输入得到结果方法使用非常方便 三、模型架构图 模型进行特征匹配主要分为四步 Local Feature CNN就是一个blockbone对两张图特征图进行卷积分别得到原来特征图大小的1/8用来进行粗粒度的匹配和1/2用来进行细粒度的匹配 大小特征图。Coarse-Level Local Feature Transformer,是对两张1/8的特征图FAFB进行多个串联的self-attention自己的q和k向量做内积和cross-attentionFA提供qFB提供V做内积来计算自己每个区域内之间的关系和两张图不同区域内的关系。Matching Module到目前位置都是进行粗粒度匹配经过了多层的Coarse-Level Local Feature TransformerFAFB已经了解了自身的关系同时也知道了和对方之间的关系要进行关系的匹配了采用互近邻(mutual nearest neighbor (MNN))的方式匹配简单来说假设FA对某个点信息概率值大 但是同时也要某个点对A的概率值也大必须双向的源码阈值设置为0.2也就是互相的结果都大于0.2才能匹配成功筛选得到符合阈值点传入下一层。Coarse-to-Fine Module在经过粗粒度匹配之后会得到一些候选点区域这些候选点区域会传到细粒度细粒度其实就是在匹配的小区域上再做一次Coarse-Level Local Feature Transformer同样会互相了解对方的特征但是这里不是采用MNN机制假设FA的小区域中的某个点有FB对应小区域中的所有点匹配的概率值才将这写概率值绘制成类似于热力图再对整个图计算期望值得到最终的匹配点坐标。 核心代码 class LoFTR(nn.Module):、# ... 省略初始化代码def forward(self, data): 前向传播函数参数data (dict): 包含图像和可选掩码的字典image0: (torch.Tensor): (N, 1, H, W) 第一张图像image1: (torch.Tensor): (N, 1, H, W) 第二张图像mask0 (可选): (torch.Tensor): (N, H, W) 第一张图像的掩码0 表示填充位置mask1 (可选): (torch.Tensor): (N, H, W) 第二张图像的掩码# 更新数据字典添加批次大小和图像尺寸data.update({bs: data[image0].size(0), # 批次大小hw0_i: data[image0].shape[2:], # 第一张图像的高度和宽度hw1_i: data[image1].shape[2:] # 第二张图像的高度和宽度})# 如果两张图像的尺寸相同进行联合处理if data[hw0_i] data[hw1_i]:print(Concatenated Images Shape:, torch.cat([data[image0], data[image1]], dim0).shape) # ([2, 1, 480, 640])feats_c, feats_f self.backbone(torch.cat([data[image0], data[image1]], dim0))print(Feature Coarse Shape:, feats_c.shape) # 1/8 ([2, 256, 60, 80])print(Feature Fine Shape:, feats_f.shape) # 1/2 ([2, 128, 240, 320])# 分离两张图像的特征(feat_c0, feat_c1), (feat_f0, feat_f1) feats_c.split(data[bs]), feats_f.split(data[bs])print(Feature Coarse Image 0 Shape:, feat_c0.shape) # ([1, 256, 60, 80])print(Feature Coarse Image 1 Shape:, feat_c1.shape) # ([1, 256, 60, 80])print(Feature Fine Image 0 Shape:, feat_f0.shape) # ([1, 128, 240, 320])print(Feature Fine Image 1 Shape:, feat_f1.shape) # ([1, 128, 240, 320])else:# 处理不同尺寸的图像(feat_c0, feat_f0), (feat_c1, feat_f1) self.backbone(data[image0]), self.backbone(data[image1])print(Feature Coarse Image 0 Shape:, feat_c0.shape)print(Feature Coarse Image 1 Shape:, feat_c1.shape)print(Feature Fine Image 0 Shape:, feat_f0.shape)print(Feature Fine Image 1 Shape:, feat_f1.shape)# 更新数据字典添加特征图的尺寸data.update({hw0_c: feat_c0.shape[2:], # 第一张图像粗特征的高度和宽度hw1_c: feat_c1.shape[2:], # 第二张图像粗特征的高度和宽度hw0_f: feat_f0.shape[2:], # 第一张图像细特征的高度和宽度hw1_f: feat_f1.shape[2:] # 第二张图像细特征的高度和宽度})# 2. 粗级别局部变换模块# 添加位置编码信息feat_c0 rearrange(self.pos_encoding(feat_c0), n c h w - n (h w) c)print(Encoded Coarse Feature Image 0 Shape:, feat_c0.shape) # ([1, 4800, 256]) # 总共4800个点每个点事256维向量feat_c1 rearrange(self.pos_encoding(feat_c1), n c h w - n (h w) c)print(Encoded Coarse Feature Image 1 Shape:, feat_c1.shape) # ([1, 4800, 256])mask_c0 mask_c1 None # 掩码在训练中有用if mask0 in data:mask_c0, mask_c1 data[mask0].flatten(-2), data[mask1].flatten(-2)# 进行粗级别局部变换feat_c0, feat_c1 self.loftr_coarse(feat_c0, feat_c1, mask_c0, mask_c1) print(Transformed Coarse Feature Image 0 Shape:, feat_c0.shape) # ([1, 4800, 256]) # 计算后输出结果不变print(Transformed Coarse Feature Image 1 Shape:, feat_c1.shape) # ([1, 4800, 256]) # 计算后输出结果不变# 3. 粗级别匹配self.coarse_matching(feat_c0, feat_c1, data, mask_c0mask_c0, mask_c1mask_c1) # 4. 细级别细化feat_f0_unfold, feat_f1_unfold self.fine_preprocess(feat_f0, feat_f1, feat_c0, feat_c1, data)if feat_f0_unfold.size(0) ! 0: # 至少有一个粗级别预测feat_f0_unfold, feat_f1_unfold self.loftr_fine(feat_f0_unfold, feat_f1_unfold)# 5. 细级别匹配self.fine_matching(feat_f0_unfold, feat_f1_unfold, data)return xLocal Feature CNN Local Feature CNN就是一个blockbone对两张图特征图进行卷积分别得到原来特征图大小的1/8用来进行粗粒度的匹配和1/2用来进行细粒度的匹配 大小特征图。 # 来源 feats_c, feats_f self.backbone(torch.cat([data[image0], data[image1]], dim0)) def build_backbone(config):if config[backbone_type] ResNetFPN:if config[resolution] (8, 2):return ResNetFPN_8_2(config[resnetfpn])# ... class ResNetFPN_8_2(nn.Module):ResNetFPN, output resolution are 1/8 and 1/2.Each block has 2 layers.# 使用ResNetFPN获得特征图1/8 和 1/2# 关于FPNFPNFeature Pyramid Networks是一种用于目标检测和分割任务的神经网络架构# 特别适用于处理多尺度的图像特征。它通过建立特征金字塔来捕捉不同尺度的图像信息增强了模型对不同尺度目标的检测能力。def __init__(self, config):# ... 具体代码太长不展示Coarse-Level Local Transformer Coarse-Level Local Feature Transformer,是对两张1/8的特征图FAFB进行多个串联的self-attention自己的q和k向量做内积和cross-attentionFA提供qFB提供V做内积来计算自己每个区域内之间的关系和两张图不同区域内的关系。 # 来源核心代码中 feat_c0, feat_c1 self.loftr_coarse(feat_c0, feat_c1, mask_c0, mask_c1) class LocalFeatureTransformer(nn.Module):def forward(self, feat0, feat1, mask0None, mask1None):前向传播函数参数feat0 (torch.Tensor): 特征图 0形状为 [N, L, C]feat1 (torch.Tensor): 特征图 1形状为 [N, S, C]mask0 (torch.Tensor): 特征图 0 的掩码形状为 [N, L]可选mask1 (torch.Tensor): 特征图 1 的掩码形状为 [N, S]可选# 确保特征图的通道数与 transformer 的模型维度一致assert self.d_model feat0.size(2), the feature number of src and transformer must be equal# 迭代处理每一层根据名称决定操作总共4个self-cross两个额为一组for layer, name in zip(self.layers, self.layer_names): # [self, cross, self, cross, self, cross, self, cross]if name self:# 自注意力机制feat0 本身计算 q 和 kfeat0 layer(feat0, feat0, mask0, mask0)print(Self Attention Output feat0 Shape:, feat0.shape) # ([1, 4800, 256])# 自注意力机制feat1 本身计算 q 和 kfeat1 layer(feat1, feat1, mask1, mask1)print(Self Attention Output feat1 Shape:, feat1.shape) # ([1, 4800, 256])elif name cross:# 交叉注意力机制feat0 提供 qfeat1 提供 k 和 vfeat0 layer(feat0, feat1, mask0, mask1)print(Cross Attention Output feat0 Shape:, feat0.shape) # ([1, 4800, 256])# 交叉注意力机制feat1 提供 qfeat0 提供 k 和 vfeat1 layer(feat1, feat0, mask1, mask0)print(Cross Attention Output feat1 Shape:, feat1.shape) # ([1, 4800, 256])else:raise KeyError(Unknown layer type)print(Final feat0 Shape:, feat0.shape) # ([1, 4800, 256]) 计算后向量维度是不变的print(Final feat1 Shape:, feat1.shape) # ([1, 4800, 256])return feat0, feat1Matching Module Matching Module到目前位置都是进行粗粒度匹配经过了多层的Coarse-Level Local Feature TransformerFAFB已经了解了自身的关系同时也知道了和对方之间的关系要进行关系的匹配了采用互近邻(mutual nearest neighbor (MNN))的方式匹配简单来说假设FA对某个点信息概率值大 但是同时也要某个点对A的概率值也大必须双向的源码阈值设置为0.2也就是互相的结果都大于0.2才能匹配成功筛选得到符合阈值点传入下一层。 # 来源核心代码中 self.coarse_matching(feat_c0, feat_c1, data, mask_c0mask_c0, mask_c1mask_c1) class CoarseMatching(nn.Module):def forward(self, feat_c0, feat_c1, data, mask_c0None, mask_c1None):前向传播函数参数feat_c0 (torch.Tensor): 特征图 0形状为 [N, L, C]feat_c1 (torch.Tensor): 特征图 1形状为 [N, S, C]data (dict): 额外数据字典mask_c0 (torch.Tensor): 特征图 0 的掩码形状为 [N, L]可选mask_c1 (torch.Tensor): 特征图 1 的掩码形状为 [N, S]可选# 提取批次大小、特征图 0 的长度、特征图 1 的长度和特征图的通道数N, L, S, C feat_c0.size(0), feat_c0.size(1), feat_c1.size(1), feat_c0.size(2)print(feat_c0.shape) # ([1, 4800, 256])# 对特征图进行归一化feat_c0, feat_c1 map(lambda feat: feat / feat.shape[-1]**.5, [feat_c0, feat_c1])if self.match_type dual_softmax:# 计算相似度矩阵sim_matrix torch.einsum(nlc,nsc-nls, feat_c0, feat_c1) / self.temperatureprint(Similarity Matrix Shape:, sim_matrix.shape) # ([1, 4800, 4800]) ,feat_c0中的4800和feat_c1进行计算得到([1, 4800, 4800])if mask_c0 is not None:# 应用掩码将不需要的位置填充为负无穷大sim_matrix.masked_fill_(~(mask_c0[..., None] * mask_c1[:, None]).bool(),-float(inf))# 计算置信度矩阵conf_matrix F.softmax(sim_matrix, 1) * F.softmax(sim_matrix, 2)print(Confidence Matrix Shape:, conf_matrix.shape) # ([1, 4800, 4800])# ... 省略部分没走的代码# 更新数据字典data.update({conf_matrix: conf_matrix})# 从置信度矩阵中预测粗略匹配data.update(**self.get_coarse_match(conf_matrix, data))再进行下一步细粒度匹配之前需要将粗粒度匹配出来结果和1/2特征图大小进行处理找出所有待细粒度处理的各个区域 # 来源核心代码中 feat_f0_unfold, feat_f1_unfold self.fine_preprocess(feat_f0, feat_f1, feat_c0, feat_c1, data) class FinePreprocess(nn.Module):def forward(self, feat_f0, feat_f1, feat_c0, feat_c1, data):前向传播函数参数feat_f0 (torch.Tensor): 特征图 0形状为 [N, C, H, W]feat_f1 (torch.Tensor): 特征图 1形状为 [N, C, H, W]feat_c0 (torch.Tensor): 粗级特征图 0形状为 [N, L, C]feat_c1 (torch.Tensor): 粗级特征图 1形状为 [N, L, C]data (dict): 包含额外信息的数据字典更新data (dict): 更新数据字典包括W (int): 窗口大小# 获取窗口大小和步幅W self.Wstride data[hw0_f][0] // data[hw0_c][0]# 更新数据字典data.update({W: W})# 如果没有有效的批次 ID返回空张量if data[b_ids].shape[0] 0:feat0 torch.empty(0, self.W**2, self.d_model_f, devicefeat_f0.device)feat1 torch.empty(0, self.W**2, self.d_model_f, devicefeat_f0.device)return feat0, feat1# 1. 展开所有局部窗口# 使用 unfold 函数提取特征图中的局部窗口feat_f0_unfold F.unfold(feat_f0, kernel_size(W, W), stridestride, paddingW//2)feat_f0_unfold rearrange(feat_f0_unfold, n (c ww) l - n l ww c, wwW**2)feat_f1_unfold F.unfold(feat_f1, kernel_size(W, W), stridestride, paddingW//2)feat_f1_unfold rearrange(feat_f1_unfold, n (c ww) l - n l ww c, wwW**2)# 2. 仅选择预测的匹配# 根据数据中的批次 ID 和点 ID 选择特定的匹配特征feat_f0_unfold feat_f0_unfold[data[b_ids], data[i_ids]] # [n, ww, cf]feat_f1_unfold feat_f1_unfold[data[b_ids], data[j_ids]] # [n, ww, cf]# 选项使用粗级别的 Loftr 特征作为上下文信息连接和线性变换if self.cat_c_feat:# 从粗级别特征中选择窗口并进行线性变换feat_c_win self.down_proj(torch.cat([feat_c0[data[b_ids], data[i_ids]],feat_c1[data[b_ids], data[j_ids]]], 0)) # [2n, c]# 合并特征图feat_cf_win self.merge_feat(torch.cat([torch.cat([feat_f0_unfold, feat_f1_unfold], 0), # [2n, ww, cf]repeat(feat_c_win, n c - n ww c, wwW**2), # [2n, ww, cf]], -1))# 将合并后的特征图分为两部分feat_f0_unfold, feat_f1_unfold torch.chunk(feat_cf_win, 2, dim0)return feat_f0_unfold, feat_f1_unfoldCoarse-to-Fine Module Coarse-to-Fine Module在经过粗粒度匹配之后会得到一些候选点区域这些候选点区域会传到细粒度细粒度其实就是在匹配的小区域上再做一次Coarse-Level Local Feature Transformer同样会互相了解对方的特征但是这里不是采用MNN机制假设FA的小区域中的某个点有FB对应小区域中的所有点匹配的概率值才将这写概率值绘制成类似于热力图再对整个图计算期望值得到最终的匹配点坐标。 # 来源核心代码中 self.fine_matching(feat_f0_unfold, feat_f1_unfold, data) class FineMatching(nn.Module):def forward(self, feat_f0, feat_f1, data):前向传播函数参数feat_f0 (torch.Tensor): 特征图 0形状为 [M, WW, C]其中 M 是匹配的数量WW 是窗口大小的平方C 是通道数feat_f1 (torch.Tensor): 特征图 1形状为 [M, WW, C]data (dict): 包含额外信息的数据字典M, WW, C feat_f0.shape # 提取特征图的形状信息W int(math.sqrt(WW)) # 计算窗口的边长scale data[hw0_i][0] / data[hw0_f][0] # 计算缩放因子self.M, self.W, self.WW, self.C, self.scale M, W, WW, C, scale# 特殊情况处理如果没有找到粗级别匹配if M 0:assert not self.training, 在训练阶段M 应始终大于0请检查 coarse_matching.py# logger.warning(在粗级别没有找到匹配。)data.update({expec_f: torch.empty(0, 3, devicefeat_f0.device), # 返回空的期望位置和标准差mkpts0_f: data[mkpts0_c], # 使用粗级别的关键点作为回退mkpts1_f: data[mkpts1_c],})return# 选择特征图中心的特征feat_f0_picked feat_f0[:, WW//2, :]print(feat_f0_picked.shape) # ([1541, 128]) 全部待计算的特征区域个数# 计算特征之间的相似度矩阵sim_matrix torch.einsum(mc,mrc-mr, feat_f0_picked, feat_f1)print(sim_matrix.shape) # ([1541, 128]) # 使用 softmax 函数计算热图softmax_temp 1. / C**.5heatmap torch.softmax(softmax_temp * sim_matrix, dim1).view(-1, W, W)print(heatmap.shape) # ([1541, 5, 5]) # 1541 个 5x5的热力图矩阵# 从热图中计算坐标计算期望值coords_normalized dsnt.spatial_expectation2d(heatmap[None], True)[0] # 计算归一化坐标print(coords_normalized.shape) #([1541, 2]) # 1541 个x,y坐标,都是小数表示占图大小比例grid_normalized create_meshgrid(W, W, True, heatmap.device).reshape(1, -1, 2) # 创建网格print(grid_normalized.shape) #([1, 25, 2])# 计算标准差var torch.sum(grid_normalized**2 * heatmap.view(-1, WW, 1), dim1) - coords_normalized**2 # 计算方差std torch.sum(torch.sqrt(torch.clamp(var, min1e-10)), -1) # 计算标准差使用 clamp 以保证数值稳定性# 更新数据字典以用于精细级别的监督data.update({expec_f: torch.cat([coords_normalized, std.unsqueeze(1)], -1)})# 计算绝对的关键点坐标,按图长宽比例还原位置坐标self.get_fine_match(coords_normalized, data)
http://www.hkea.cn/news/14446793/

相关文章:

  • 自助建设分销商城网站蒙阴建设局网站
  • 网站建设商家东莞网站建设市场
  • 阿里云 网站空间个人网站一年多少钱
  • 昆明做整站优化提供石家庄网站推广
  • 常见的站内推广方式有哪几种室内设计公司排名全球
  • 网站后台功能技术要求深圳东门老街有什么好玩的
  • 网站免费正能量小说计算机毕设网站代做
  • 建立网站主页注意那些方面改进网站建设英文作文
  • 自助微信网站设计免费做网站广告
  • 丽江网站开发网站开发工具有组合
  • 网站配色原则wordpress播放网盘视频
  • 一个合格的网站设计境外网站icp备案申请表
  • 零食网站模板下载汽车零部件公司网站建设方案
  • 拉趣网站是谁做的大庆市住房与城乡建设局网站
  • 沧州网站建设微艾薇做网站服务器权限设置
  • 让人做网站需要注意什仓库管理 erp
  • 济南企业营销型网站建设价格中国徐州网
  • 一个电商网站开发要多久请简述网站建设的一般流程图
  • win7 iis网站无法显示该页面看看铜陵新闻
  • 网页设计尺寸快捷键上海全国关键词排名优化
  • 简易网站建设维护少儿编程培训
  • 桂林市做网站的公司洛阳霞光做网站
  • 南昌建设网站页游大全
  • 做网站用jsp和html毕业设计做企业门户网站
  • 化妆品网站建设推广方案营销手机网站版面
  • wordpress站点设置使用期限做定制网站
  • 欧美只做les 网站昆明网站建设案例
  • 网站建设的总体目标推广公司业务话术
  • win8扁平化网站华侨城网站建设
  • 建网站签合同凤阳县城乡建设局网站