2019-01-09 15:37:30 qq_38633071 阅读数 524
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4638 人正在学习 去看看 黄晓军

三维测重建:1 基于体元  2 基于面元 3 基于四面体 4  基于平面扫描 5 基于线特征 6 基于深度图 

密集匹配:在影像中逐像素的寻找尽可能多的同名点的一项技术。成果为深度图。

影像匹配:通过一定的匹配算法在两幅或多幅影像之间识别同名点的过程。

理解:通过密集匹配的方法生成深度图,然后根据深度图进行三维重建。

接着看一下影像匹配的分类

   进行匹配像点的相对数目:1 稀疏匹配:稀疏的视差矩阵;2 稠密匹配(密集匹配):深度图

   匹配元素:1 灰度区域匹配;2 特征匹配;

    算法分类: 1 全局;2 半全局;3 局部

理解:影像匹配包含密集匹配

密集匹配组成

匹配代价计算,代价值聚合;视差估计;结果优化

   暂时学习了这么多,哪里不准确的请指出,错一步后面学习就很难受。

2018-01-24 17:37:37 aaron121211 阅读数 6164
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4638 人正在学习 去看看 黄晓军

上一篇博文(基于深度学习的图像匹配技术专题- [patch based matching3]-mnist siamese 学习)已经完整的介绍了caffe mnist siamese模型,并训练成功,相信大家已经有点感觉了。现在我们的目标回到MatchNet,虽然作者没有提供源码,我们也能自己实现出来,加油。

当然,我们还有很多问题没有介绍,如制备数据集合等内容。我们选择边实现模型边解决这些实际问题,抓住主干,各个击破。

1.MatchNet的网络结构实现

在本专题第一讲中,我们已经知道了MatchNet的网络结构,下面我们用caffe实现出来。这里有两个.prototxt文件:一个是模型,一个是solver。其中solver的参数该如何设置,可能是更麻烦的问题。

好了,我们首先是写train.prototxt文件。

caffe基础知识

Blob:是基础的数据结构,是用来保存学习到的参数以及网络传输过程中产生数据的类。
Layer:是网络的基本单元,由此派生出了各种层类。修改这部分的人主要是研究特征表达方向的。
Net:是网络的搭建,将Layer所派生出层类组合成网络。Solver:是Net的求解,修改这部分人主要会是研究DL求解方向的。


layer {
  name: "pair_data"
  type: "Data"
  top: "pair_data"
  top: "sim"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/siamese/mnist_siamese_train_leveldb"
    batch_size: 64
  }
}
c


定义一个层需要几种信息,首先train.prototxt文件。

name: "mnist_matchnet_train_test"
##数据输入
layer {
  name: "pair_data"
  type: "Data"
  top: "pair_data"
  top: "sim"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/siamese/mnist_siamese_train_leveldb"
    batch_size: 64
  }
}
layer {
  name: "pair_data"
  type: "Data"
  top: "pair_data"
  top: "sim"
  include {
    phase: TEST
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/siamese/mnist_siamese_test_leveldb"
    batch_size: 100
  }
}

layer {
  name: "slice_pair"
  type: "Slice"
  bottom: "pair_data"
  top: "data"
  top: "data_p"
  slice_param {
    slice_dim: 1
    slice_point: 1
  }
}
###########卷积层########
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {    ##权重和偏置
    name: "conv1_w"
    lr_mult: 1
  }
  param {
    name: "conv1_b"
    lr_mult: 2
  }
  convolution_param { ## 输出通道,kernel,stride
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    name: "conv2_w"
    lr_mult: 1
  }
  param {
    name: "conv2_b"
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}

layer {
  name: "conv3"
  type: "Convolution"
  bottom: "pool2"
  top: "conv3"
  param {
    name: "conv3_w"
    lr_mult: 1
  }
  param {
    name: "conv3_b"
    lr_mult: 2
  }
  convolution_param {
    num_output: 64
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}

layer {
  name: "conv4"
  type: "Convolution"
  bottom: "conv3"
  top: "conv4"
  param {
    name: "conv4_w"
    lr_mult: 1
  }
  param {
    name: "conv4_b"
    lr_mult: 2
  }
  convolution_param {
    num_output: 96
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}

layer {
  name: "conv5"
  type: "Convolution"
  bottom: "conv4"
  top: "conv5"
  param {
    name: "conv5_w"
    lr_mult: 1
  }
  param {
    name: "conv5_b"
    lr_mult: 2
  }
  convolution_param {
    num_output: 64
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool3"
  type: "Pooling"
  bottom: "conv5"
  top: "pool3"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}

 layer { name: "ip1" type: "InnerProduct" bottom: "pool3" top: "ip1" param { name: "ip1_w" lr_mult: 1 } param { name: "ip1_b" lr_mult: 2 } inner_product_param { num_output: 500 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}layer { name: "relu1" type: "ReLU" bottom: "ip1" top: "ip1"}layer { name: "ip2" type: "InnerProduct" bottom: "ip1" top: "ip2" param { name: "ip2_w" lr_mult: 1 } param { name: "ip2_b" lr_mult: 2 } inner_product_param { num_output: 10 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}layer { name: "feat" type: "InnerProduct" bottom: "ip2" top: "feat" param { name: "feat_w" lr_mult: 1 } param { name: "feat_b" lr_mult: 2 } inner_product_param { num_output: 2 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}
#######################second 分支######################################
 layer { name: "conv1_p" type: "Convolution" bottom: "data_p" top: "conv1_p" param { name: "conv1_w" lr_mult: 1 } param { name: "conv1_b" lr_mult: 2 } convolution_param { num_output: 20 kernel_size: 5 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}layer { name: "pool1_p" type: "Pooling" bottom: "conv1_p" top: "pool1_p" pooling_param { pool: MAX kernel_size: 2 stride: 2 }}layer { name: "conv2_p" type: "Convolution" bottom: "pool1_p" top: "conv2_p" param { name: "conv2_w" lr_mult: 1 } param { name: "conv2_b" lr_mult: 2 } convolution_param { num_output: 50 kernel_size: 5 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}layer { name: "pool2_p" type: "Pooling" bottom: "conv2_p" top: "pool2_p" pooling_param { pool: MAX kernel_size: 2 stride: 2 }}



layer {
  name: "conv3_p"
  type: "Convolution"
  bottom: "pool2_p"
  top: "conv3_p"
  param {
    name: "conv3_w"
    lr_mult: 1
  }
  param {
    name: "conv3_b"
    lr_mult: 2
  }
  convolution_param {
    num_output: 64
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}

layer {
  name: "conv4_p"
  type: "Convolution"
  bottom: "conv3_p"
  top: "conv4_p"
  param {
    name: "conv4_w"
    lr_mult: 1
  }
  param {
    name: "conv4_b"
    lr_mult: 2
  }
  convolution_param {
    num_output: 96
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}

layer {
  name: "conv5_p"
  type: "Convolution"
  bottom: "conv4_p"
  top: "conv5_p"
  param {
    name: "conv5_w"
    lr_mult: 1
  }
  param {
    name: "conv5_b"
    lr_mult: 2
  }
  convolution_param {
    num_output: 64
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool3_p"
  type: "Pooling"
  bottom: "conv5_p"
  top: "pool3_p"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}

 layer { name: "ip1_p" type: "InnerProduct" bottom: "pool3_p" top: "ip1_p" param { name: "ip1_w" lr_mult: 1 } param { name: "ip1_b" lr_mult: 2 } inner_product_param { num_output: 500 weight_filler { type: "xavier" } bias_filler { type: "constant" } }}layer
 { name: "relu1_p" type: "ReLU" bottom: "ip1_p" top: "ip1_p"}layer { name: "ip2_p" type: "InnerProduct" bottom: "ip1_p" top: "ip2_p" param { name: "ip2_w" lr_mult: 1 } param { name: "ip2_b" lr_mult: 2 } inner_product_param { num_output: 10 weight_filler { type:
 "xavier" } bias_filler { type: "constant" } }}layer { name: "feat_p" type: "InnerProduct" bottom: "ip2_p" top: "feat_p" param { name: "feat_w" lr_mult: 1 } param { name: "feat_b" lr_mult: 2 } inner_product_param { num_output: 2 weight_filler { type: "xavier"
 } bias_filler { type: "constant" } }}layer { name: "loss" type: "ContrastiveLoss" bottom: "feat" bottom: "feat_p" bottom: "sim" top: "loss" contrastive_loss_param { margin: 1 }}



2. solver参数设置

前面部分描述了使用matchnet网络来处理mnist siamese数据集,我们在原来网络的基础上增加了 3个卷积层和一个max pooling, 下面我们来加入他们的参数。

# The train/test net protocol buffer definition
net: "examples/siamese/mnist_matchnet_train_test.prototxt"
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0000
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 50000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/siamese/mnist_siamese"
# solver mode: CPU or GPU
solver_mode: GPU

最后再写一个 脚本文件

#!/usr/bin/env sh
set -e

TOOLS=./build/tools

$TOOLS/caffe train --solver=examples/siamese/mnist_match_solver.prototxt $@


可以看到这个网络结构,可以达到更高的准确度。网络训练过程中,可能过拟合了,因为训练中的Loss很小,测试的效果没有那么理想。

这个网络没有改变Loss function,而是保留了siamese 中的对应部分,这是接下来要做的工作。

——————————————————————————

你的支持,将会帮助我更新博客,提供更多有别于其他博客的博文。




2020-01-16 14:29:39 qq_40721337 阅读数 96
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4638 人正在学习 去看看 黄晓军

Domain Adaptation With Discriminative Distribution and Manifold Embedding for Hyperspectral Image Classification(2019)

Abstract

  为了进行小样本HSI分类,本文提出学习流形嵌入和适配源域中的显著分布的领域适配方法。具体地,本文使用源影像的显著信息来训练源影像和目标影像的分类器,即用源域的先验类别概率分布,在嵌入空间里最小化两种域之间的概率分布差别,使得分类器能适应两种域。此外,为了防止目标域在嵌入空间里的失真映射,本文试图在嵌入空间里保持样本之间的流形关系。然后通过神经网络同时最小化三个指标来学习源域和目标域里的嵌入。实验表明本文提出的方法能够超越其他几种方法。

Index Terms

领域适配;高光谱分类;流形嵌入;最大均值差异(MMD);神经网络;遥感

Ⅰ.INTRODUCTION

  监督分类方法耗时且需要大量标记样本,标注样本数至少要超过HSI的波段数。所以主动学习、半监督学习和领域适配方法相继被提出。主动学习选择最有用的训练样本进行标记,获取新的标记样本;半监督学习利用未标记样本;领域适配利用从相似图像中获得的的标记样本。领域适配方法中,源域指带有标记样本的相似图像;目标域指待分类的图像。
  分布匹配是领域适配的一种方法,其通过数据表示变换使得源域和目标域的分布更为相似,然后在变换后的空间里训练适合于两种域的分类器;最大均值差异(MMD)也属于领域适配方法,它最小化两种域的分布距离。【9】提出迁移成分分析(TCA)通过MMD最小化两种域的分布距离来寻找共同嵌入,同时保留了原始数据在两种域中的主要统计特性;【10】构造像元级二进制分类器,其引入迁移多核学习同时最小化MMD和SVMs的结构风险函数,最后组合一系列二进制分类器即可应用于多分类问题;【11】将多核学习中的领域适配和MMD、结构风险结合起来训练一个多核分类器,选择多核分类器最不能确定的那些样本;【12】提出最小化MMD以减小两种域的分布距离的稀疏子空间。这些方法中,MMD常用来最小化源域和目标域之间的分布偏差,但是MMD不能保持域在嵌入空间中的结构信息。
  为了减少空间变换中的变形,本文利用流形对齐来保持域中的几何结构。【14】学习了一种利用图像相近的几何数据聚类样本并能保留数据的共同特性的联合流形空间,其通过bridging pairs对齐两种全局数据的流形来保留数据特性;【15】研究两张时序影像的共同的潜在几何体,并在联合数据流形中学习相似性;【16】使用基于矢量量化和图匹配的非线性变形进行领域适配,然后在嵌入空间即可训练分类器或进行回归;【17】中的流形对齐中还考虑了空间信息。最近深度学习在CV和RS的领域适配任务中都有不错的表现,可以通过神经网络学习分布匹配和流形结构;【23】使用两层网络将通过仿射、尺度不变形特征变换提取出来的特征点从源域映射到目标域;【24】提出一种将极限学习机参数从源域转换到目标域的领域适配方法,使得目标域的分类器参数最大程度地与源域对齐;【25】使用一个预训练的CNN获取特征,然后最小化包括两种损失的领域适配网络,两种损失分别为两种域之间的分布距离和类间距。但是上述方法都没有考虑源域的先验类别分布,其对分布匹配有很大影响。
  为了更好地匹配分布,本文提出一种基于DNN并考虑源域的先验类别分布的领域适配方法,即定义分类器在源域嵌入的结构损失,考虑源域的类别分布(代表源域的分布信息),用MMD在源域和目标域的嵌入空间最小化分布距离。由于在目标域中没有先验信息,在目标域中使用流形对齐以防止变形。然后以上述三个标准组合而成的目标函数训练神经网络。
在这里插入图片描述

Ⅱ.PROPOSED METHOD

在这里插入图片描述
  本文在神经网络中一同完成嵌入空间的学习分类器的训练。在输出层前加入一个线性层构成一个分类器(LR,f(x)=wTφ(x)+b),仅使用source domain中的样本嵌入空间中训练分类器。训练分类器可以转化为如下的优化问题:
在这里插入图片描述
其中l(·)是最小化预测值和真实值差值的损失函数(交叉熵函数):
在这里插入图片描述
其中Pcr(φ(x))是softmax函数的预测值:
在这里插入图片描述
  领域适配最重要的问题是怎样提升分类器在目标域的泛化能力,好的泛化能力需要训练集和测试集有相同的分布,因此领域适配问题想要学习两种域间分布差异最小的嵌入空间,使用MMD作为损失函数衡量两个不同但相关的分布的差异
在这里插入图片描述
  然而源域中每类样本数量不一样,所以本文对于源域中的样本进行加权处理:
在这里插入图片描述
其中δ(·)是一个指示函数:
在这里插入图片描述
  通过最小化MMD‘定义的分布距离,我们可以保证源域和目标域有着类似的分布了,但还不能保证嵌入表示有显著的分布,因为目标域的特征转变到嵌入空间时可能发生变形,在变换过程中使用图结构保持局部近邻关系可以解决变形问题,一种最著名的基于图结构的方法是流形学习。本文使用流形正则化保持目标域在嵌入空间里的图形结构,然后通过最小化目标域源特征空间中样本和近邻的距离即可保持目标域的近邻结构:
在这里插入图片描述
其中wiNj为源域中的某一个样本和其邻域样本的权重:
在这里插入图片描述
  本文只保持目标域中的图形结构,因为分类器在源域中训练,其可以保证源域中的特征转变到嵌入空间时不发生变形。
  两个域中的分布变为:???(不是损失函数变为吗?)
在这里插入图片描述
其中β是个权衡参数。
  匹配目标域在嵌入空间的分布和源域在嵌入空间的分布(包括源域的类分布);保持目标域在嵌入空间中的局部聚类结构。一同实现上述两点,目标域的嵌入空间能有相似和显著的分布,因而在目标域中能有好的预测泛化。
  提出模型的损失函数为:
在这里插入图片描述
其中α和β都是权衡参数,它们用来调整学习嵌入空间过程中是similar重要还是discriminant重要。本文使用小批量随机梯度下降一同学习流形嵌入模型和分类器,损失函数为上图的L。

Ⅲ.EXPERIMENTS

  对于每个高光谱数据集,本文从原始影像中选择一个子集作为源域,其包括很少的有标记样本,其他部分作为目标域。这种有偏采样策略使得源域和目标域分布不一致。

A.Data Sets and Settings

  Pavia Center数据集传感器为ROSIS-3,大小为10961096,其中有381列数据因缺少信息被移除,因此影像大小变为1096715,有102个波段。由于PC数据集不连续,本文选择影像左上角的一部分区域(黄色矩形,1~100 * 1~223)作为源域,包括5类:水、树、牧场、土壤、瓷砖;影像右边的区域(绿色矩形)也包括上述5类,将其作为目标域,因此这是一个标准的领域适配问题。PC数据集本来不止5类,黑色部分的样本被去掉了。
在这里插入图片描述
在这里插入图片描述
  Indian Pines数据集传感器为AVIRIS,大小为145*145,有220个375 ~ 2200nm的波段。由于PC数据集不连续,本文选择影像左上角的一部分区域(红色矩形,5~85 * 10~40)作为源域,包括9类;影像其他区域也包括上述9类,将其作为目标域,因此这是一个标准的领域适配问题。IP本来包括16类,黑色部分的样本被去掉了。
在这里插入图片描述
在这里插入图片描述
本文提出方法与SVM(基准方法)和【21】中提出的方法(最新方法DAN,没有考虑源域中的类分布)比较。SVM中的罚参数为100,高斯核参数为1/d,d为波段数。对于【21】的方法,我们使用64和32个神经元的两个FC层。本文提出方法使用3邻域,α和β从【0.01,0.1,1,2】中选择。

B.Results and Analysis

  PC不同类别的特征有显著性,而IP的空间分辨率很低,特征很相似,所以PC的分类精度比IP高。提出的方法在AA的提升上比OA和Kappa大,这证明先验分布可以修正分布偏差。PC中α=0.01,β=2效果最好;IP中α=0.01,β=0.1效果最好,在DAN和本文提出方法中都是这样,这点也证明了类分布匹配对分布偏差的修正???。

C.Parameters Analysis

在这里插入图片描述
  PC对α比较敏感,IP对β比较敏感,可能因为PC的显著信息很明显。如果保持流形结构,高度显著的信息就能够被保留。IP不同类别的特征很相似,所以流形结构可能保留错误的类别分布信息。总之,α的值小一点,对于高空间分辨率的影像β的值取大一点,反之取小一点。

Ⅳ.CONCLUSION

  本文提出一种新的领域适配方法,考虑源域的类别分布和目标域的流形嵌入,首先基于MMD匹配目标域的分布和源域的分布(带有源域类别信息),然后改善分类器(在源域中训练)在目标域的泛化能力,同时在目标域中添加流形正则化以防止映射失真。在两个数据集中的实验验证了提出方法的有效性。

Swear to be overdramatic☀ and true❤ to the world
我发誓将以极致的热忱与真诚,献与这个美丽的世界。

单词
在这里插入图片描述
后记
  完成于2020年1月16日14:26:47,看这篇文章效率好低。

2019-03-26 12:20:55 qq_28901541 阅读数 2667
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4638 人正在学习 去看看 黄晓军

图像配准

本文为原创文章,转载请注明出处**

目录

一、图像配准概述
二、图像匹配算法
SIFT
SURF
ORB
暴力匹配
FLANN
深度学习(superpoint)
三、各算法对比
四、图像配准在SLAM中的应用

图像配准概述

匹配:指寻找两幅影像中相似的部分(基于特征点或灰度等),从而找到与搜索图像相似的图像
配准:将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程
在这里插入图片描述

特征点

特征点:图像当中具有代表性的部分
可重复性:相同的区域可在不同的图像中被找到。
可区别性:不同的区域有不同表达。
高效率:同一图像中,特征点的数量应远小于像素的数量。
本地性:特征仅与一小片图像区域有关
在这里插入图片描述
特征点信息
位置、大小、方向、评分等------关键点
特征点周围图像的信息------描述子

特征描述应该在光照、视角发生少量变化时仍能保持一致

基于特征点配准的优缺点

■ 提取待配准图像中的点、线、边缘等特征信息,不需要其它辅助信息,在减少计算量、提高效率的同时,能够对图像灰度的变化有一定的鲁棒性
■ 只采用了图像一小部分的特征信息,所以这种算法对特征提取和特征匹配的精度及准确性要求非常高,对错误非常敏感
■ 特征点所包含的信息相对较少,只能反映出其在图像中的位置坐标信息,所以在两幅图像中寻找匹配的特征点是关键所在

基于特征图像的配准流程

1.首先对两幅图像进行特征提取得到特征点;
2.通过进行相似性度量找到匹配的特征点对;
3.然后通过匹配的特征点对得到图像空间坐标变换参数;
4.最后由坐标变换参数进行图像配准。

高斯金字塔与尺度空间

■ 高斯核是唯一的线性核,对图像模糊不会引入其他噪声
■ 对每层最模糊的一幅图像继续下采样,继续高斯模糊处理
■ 上采样(分辨率逐级升高)和下采样(分辨率逐级降低)
■ 尺度空间(O,S)
– O—octave
– S-层
– (o,s)能够确定高斯金字塔中的唯一一幅图像δ
在这里插入图片描述

其中δ为尺度大小,k的几次幂为每个八度(octave)的第几个模糊层

尺度空间图例

在这里插入图片描述

差分高斯金字塔

在这里插入图片描述
同一个八度的相邻两模糊层做差得到差分高斯金字塔

特征点检测与描述------SIFT

在不同的尺度空间上查找关键点(特征点),计算关键点的大小、方向、尺度信息,利用这些信息组成关键点对特征点进行描述
具体步骤:
■ 1. 生成高斯差分金字塔(DOG金字塔),尺度空间构建
■ 2. 空间极值点检测 (在高斯金字塔中搜索对尺度和旋转不变的特征点)
■ 3. 稳定关键点的精确定位 (离散空间用曲线拟合寻找极值点)
■ 4. 稳定关键点方向信息分配 (图像局部的梯度方向)
■ 5. 关键点描述 (将得到的特征点位置、方向、尺度信息,使用一组向量来描述特征点及其周围邻域像素的信息)
■ 6. 特征点匹配

优缺点

■ 1. 对旋转、尺度缩放、亮度变化保持不变性,对视角变化、噪声等也存在一定程度的稳定性;
■ 2. 独特性,信息量丰富,适用于在海量特征数据中进行快速,准确的匹配;
■ 3. 多量性,即使少数几个物体也可以产生大量的Sift特征向量;
■ 4. 可扩展性,可以很方便的与其他形式的特征向量进行联合;

SIFT结合FLANN

在这里插入图片描述

特征点检测–SURF

■ 1. 用Hessian矩阵构造高斯金字塔尺度空间构建
(高斯滤波后进行矩阵计算构建金字塔)
■ 2. 非极大值抑制初步确定特征点
■ 3. 稳定关键点的精确定位 (连续空间到离散空间)
■ 4. 选取主方向 (统计特征点邻域内的harr小波特征)
■ 5. 关键点描述
16*4=64维
■ 6. 特征点匹配

在这里插入图片描述

通过LOWE的论文可知,SIFT和SURF的速度相差一个数量级
原因
1.描述子的维度不同
SIFT是取1616的邻域分成44的块区域,每块统计八个方向梯度,所以为478=128维
在这里插入图片描述
SURF是分成16块,每块统计25个点4个方向的小波特征,所以为16*4=64维
在这里插入图片描述
2.SIFT是固定高斯核,改变图像尺寸; SURF固定尺寸,改变高斯核,所以SURF可以通过同一尺寸的图像与多个高斯核卷积并行处理

特征检测–SURF效果图

在这里插入图片描述
在这里插入图片描述

特征描述与匹配------SURF效果图

在这里插入图片描述
上述图片存在误匹配点,可以使用LM算法进行优化同时采用RANSAC算法筛选出内点

特征检测------ORB

ORB特征
关键点:oriented FAST
描述: BRIEF

FAST:连续N个点的灰度有明显差异
若某像素与其周围邻域内足够多的像素点相差较大,则该像素可能是角点
如下面介绍FAST-10(连续十个点超过阈值)算法步骤
在这里插入图片描述
算法步骤:
上图所示,
1.一个以像素p为中心,半径为3的圆上,有16个像素点(p1、p2、…、p16)。

2、定义一个阈值。计算p1、p9、p5、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选角点,再进行下一步考察;否则,不可能是角点;

3、若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少连续10(所以为FAST-10)个超过阈值,则是角点;否则,不可能是角点。

4、对图像进行非极大值抑制:计算特征点出的FAST得分值(即score值,也即s值),判断以特征点p为中心的一个邻域(如3x3或5x5)内,计算若有多个特征点,则判断每个特征点的s值(16个点与中心差值的绝对值总和),若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。得分计算公式如下(公式中用V表示得分,t表示阈值):

在这里插入图片描述
FAST算法实现起来简单,尤其是以速度快著称。

oriented Fast:在FAST基础上计算旋转

Brief(binary robust independent elementary features)描述子:
在特征点附近随机选取若干点对,将所选取的点的灰度值组成一个二进制串作为特征点描述子,用汉明距离度量
在这里插入图片描述
速度快,但是不具备旋转不变性和尺度不变性,对噪声敏感

特征检测–ORB

在这里插入图片描述

图像匹配------暴力匹配和FLANN匹配器

图像匹配:通过描述子的差异判断哪些特征为同一点
暴力匹配:比较图A的每个特征的与图B的所有特征点的距离,相当于轮询
加速:快速最近邻(FLANN)

对大数据集和高维特征进行最近邻搜索的算法的集合,如k近邻算法等

暴力匹配
在这里插入图片描述

FLANN特征点匹配

在这里插入图片描述
在这里插入图片描述
用快速近邻方法找到特征点匹配对,速度快,如图中找到了22对匹配的特征点

SURF和ORB的对比在这里插入图片描述

SURF:用时0.6938s,用RANSAC算法和LM算法优化筛选出的匹配点对为243对

在这里插入图片描述
ORB:用时0.1184s,用RANSAC算法和LM算法优化筛选出的匹配点对为80对

正如论文中所提到的,ORB比SURF快一个数量级,SURF比SIFT快一个数量级

Self-Supervised Interest Point Detection and Description(基于深度学习)

■ 描述符具有优良特性,在定位场景下,可以对季节和环境光照具有更强的鲁棒性
■ 虽然深度学习目前还不能很好的支持SLAM中的几何计算和位姿估计,但是在特征点跟踪和匹配上可以做得很好

在这里插入图片描述

SLAM中的图像配准

实时性必须强,速度必须要快,可以在质量和速度之间折中

■ SIFT,SURF等特征提取方法具有较好的并行性,可通过GPU等设备加速运算,如加速后的SIFT就满足实时性的要求。
■ 在目前的SLAM方案中,ORB是质量与性能之间较好的折中
■ ORB在平移、旋转、缩放的变换下仍具有较好的表现
■ FAST和BRIEF的组合非常高效
■ 匹配的时候采用快速近似最近邻

2018-11-20 17:00:46 rs_lys 阅读数 5655
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4638 人正在学习 去看看 黄晓军

双目立体匹配经典算法之Semi-Global Matching(SGM)概述:视差计算、视差优化


视差计算


  在SGM算法中,视差计算采用赢家通吃(WTA)算法,每个像素选择最小聚合代价值所对应的视差值作为最终视差,视差计算的结果是和左影像相同尺寸的视差图,存储每个像素的视差值,在影像内外参数已知的情况下,视差图可以转换为深度图,表示每个像素在空间中的位置,图1为双目立体像对的真实视差图示意图。

图1 双目立体像对及左影像真实视差图示意图

  如图2所示,某个像素的所有视差下的代价值中,选择最小代价值所对应的视差作为最优视差。这一步非常简单,这意味着聚合代价矩阵S的值必须能够准确的反映像素之间的相关性,也表明上一步代价聚合步骤是立体匹配中极为关键的步骤,直接决定了算法的准确性。

图2 赢家通吃算法示意图

视差优化


  视差优化的目的是为了对通过视差计算得到的视差图进行进一步的优化处理,剔除错误视差,提高视差精度,使视差值更可靠、更精确。

剔除错误匹配

  错误匹配直观的反应是聚合后某些像素在真实视差位置的代价值并非最小值,有很多因素能够造成这一现象的产生,如影像噪声、遮挡、弱纹理或重复纹理,以及算法的局限性。实际上目前还没有哪个算法能够完美的处理以上所有问题,所以错误匹配的剔除对所有算法都是有必要的。目前最常用的错误匹配剔除方法是左右一致性法(L-R Check),它基于视差的唯一性约束,即每个像素最多只存在一个正确视差。具体步骤是将左右影像互换位置,即左影像成为右影像,右影像成为左影像,再做一次立体匹配,得到另一张视差图,因为视差图中每个值所反映的是两个像素之间的对应关系,所以依据视差的唯一性约束,通过左影像的视差图,找到每个像素在右影像的同名点像素及该像素对应的视差值,这两个视差值之间的差值若小于一定阈值(一般为1个像素),则满足唯一性约束被保留,反之则不满足唯一性约束而被剔除。一致性检查的公式如式1所示:

式1 LR-Check

图3 一致性检查示意图

  除一致性检查之外,剔除小连连通区(Remove Peaks)、唯一性检测(Uniqueness Check)也是常用的剔除错误视差的方法,可以结合使用。

  剔除小连连通区(Remove Peaks)是指剔除掉视差图中连通的极小块区域,同一个连通区内的视差与邻域视差之差小于设定阈值(一般为1)。

  唯一性检测(Uniqueness Check)是指对每个像素计算最小代价和次最小代价的值,若两者相对差小于一定阈值,则被剔除。

if ((SecMin-Min)/Min < T)
	disparity = invalid;

提高视差精度

  提高视差精度采用子像素优化技术,因为视差计算得到的视差图是整像素精度,在很多应用中都无法满足精度要求,SGM采用二次曲线内插的方法获得子像素精度,对最优视差的代价值以及前后两个视差的代价值进行二次曲线拟合,曲线的极值点所对应的视差值即为新的子像素视差值,如图4所示。

图4 二次曲线拟合计算子像素视差

抑制噪声

  为了抑制噪声,小窗口(通常为3x3)的中值滤波(Median Filter)是常用的算法。双边滤波(Bilateral Filter)也比较常用,能够较好的保持边缘精度,效率较中值滤波低。

(注:博主已经开始写SGM编码博客啦,感兴趣的可以关注博客手把手教你编写SGM立体匹配代码(基于C++,Github同步更新)

没有更多推荐了,返回首页