Deep Homography Estimation - Pytorch实现

Deep Homography Estimation- PyTorch Implementation

Deep Image Homography Estimation
Daniel DeTone, Tomasz Malisiewicz, and Andrew Rabinovich
这篇论文的Pytorch实现,代码地址 Deep-homography-estimation-pytorch. 喜欢的朋友给个⭐哦

使用说明

一、生成合成数据集
下载COCO2014数据集,分别设置训练集、验证集和测试集对应的路径。

cd data/
python gen_data.py

生成500.000个训练样本数据、5000个验证样本数据和5000个测试样本数据。
运行完成后生成的合成数据集文件列表如下:
在这里插入图片描述
二、训练

python train.py

三、测试
下载预训练权重并存放在checkpoints/文件夹下

链接:https://pan.baidu.com/s/10HXNthOBhlZbrtvIkolxKw 	提取码:l9l8 
python test.py
results
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

下面对单应性模型的代码实现进行简单分析:

import torch.nn as nn
import torch.nn.functional as F

class HomographyNet(nn.Module):
    def __init__(self):
        super(HomographyNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(2, 64, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.layer2 = nn.Sequential(
            nn.Conv2d(64, 64, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.layer3 = nn.Sequential(
            nn.Conv2d(64, 128, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.layer4 = nn.Sequential(
            nn.Conv2d(128, 128, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, kernel_size=3, padding=1, bias=False),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True)
        )
        self.fc = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(128 * 16 * 16, 1024),
            nn.ReLU(True),
            nn.Dropout(0.5),
            nn.Linear(1024, 8)
        )

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = self.layer3(out)
        out = self.layer4(out)
        out = out.contiguous().view(x.size(0), -1)
        out = self.fc(out)
        return out


if __name__ == "__main__":
    from torchsummary import summary
    model = HomographyNet().cuda()
    print(HomographyNet())
    summary(model, (2, 128, 128))

这是一个VGG风格的网络,网络的输入是2×128×128的Patch对,网络使用了8个卷积层,每个卷积层的窗口形状为3×3,填充为1,并紧接BatchNorm和ReLU;8个卷积层对应的滤波器数量为64,64,64,64,128,128,128,128。每两个卷积层后使用一个窗口形状为2、步幅为2的最大池化层。全连接层有1024个隐藏单元,输出层单元数为8,在最后一个卷积层之后和全连接层之后使用DropOut。
用torchsummary打印一下模型结构:

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 128, 128]           1,152
       BatchNorm2d-2         [-1, 64, 128, 128]             128
              ReLU-3         [-1, 64, 128, 128]               0
            Conv2d-4         [-1, 64, 128, 128]          36,864
       BatchNorm2d-5         [-1, 64, 128, 128]             128
              ReLU-6         [-1, 64, 128, 128]               0
         MaxPool2d-7           [-1, 64, 64, 64]               0
            Conv2d-8           [-1, 64, 64, 64]          36,864
       BatchNorm2d-9           [-1, 64, 64, 64]             128
             ReLU-10           [-1, 64, 64, 64]               0
           Conv2d-11           [-1, 64, 64, 64]          36,864
      BatchNorm2d-12           [-1, 64, 64, 64]             128
             ReLU-13           [-1, 64, 64, 64]               0
        MaxPool2d-14           [-1, 64, 32, 32]               0
           Conv2d-15          [-1, 128, 32, 32]          73,728
      BatchNorm2d-16          [-1, 128, 32, 32]             256
             ReLU-17          [-1, 128, 32, 32]               0
           Conv2d-18          [-1, 128, 32, 32]         147,456
      BatchNorm2d-19          [-1, 128, 32, 32]             256
             ReLU-20          [-1, 128, 32, 32]               0
        MaxPool2d-21          [-1, 128, 16, 16]               0
           Conv2d-22          [-1, 128, 16, 16]         147,456
      BatchNorm2d-23          [-1, 128, 16, 16]             256
             ReLU-24          [-1, 128, 16, 16]               0
           Conv2d-25          [-1, 128, 16, 16]         147,456
      BatchNorm2d-26          [-1, 128, 16, 16]             256
             ReLU-27          [-1, 128, 16, 16]               0
          Dropout-28                [-1, 32768]               0
           Linear-29                 [-1, 1024]      33,555,456
             ReLU-30                 [-1, 1024]               0
          Dropout-31                 [-1, 1024]               0
           Linear-32                    [-1, 8]           8,200
================================================================
Total params: 34,193,032
Trainable params: 34,193,032
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.12
Forward/backward pass size (MB): 70.52
Params size (MB): 130.44
Estimated Total Size (MB): 201.08
----------------------------------------------------------------

非常地VGG了。
完整代码见 Deep-homography-estimation-pytorch. 喜欢的朋友给个⭐哦

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: Homography估计是一种计算机视觉技术,用于在两个平面之间进行几何变换。它可以用于图像配准、图像拼接、虚拟现实等应用中。Homography估计的目标是找到一个3x3的矩阵,将一个平面上的点映射到另一个平面上的点。这个矩阵可以通过多种方法来估计,包括最小二乘法、RANSAC等。 ### 回答2: Homography estimation是一种计算机视觉技术,指的是在图像处理中,通过计算两幅图像之间的变换关系,来实现不同图像之间的几何转换。这种技术可以应用于很多领域,包括但不限于机器人视觉、图像配准、增强现实、虚拟现实和数字图像处理等。 在homography estimation中,我们需要寻找两幅图像之间的变换矩阵。这个变换矩阵被称为幂律映射,可以将一幅图像的特征点集投影到另一幅图像的对应点集,从而实现两幅图像之间的几何变换。其中特征点可以是关键点、角点,也可以是一些其他算法提取出的特征点等。 常见的homography estimation算法有RANSAC和最小二乘法等。RANSAC算法是一种假设-验证的方法,它随机选择几个特征点,通过估计变换矩阵来验证这些点是否符合变换矩阵的假设。最小二乘法是一种基于矩阵代数的方法,通过最小化特征点之间距离的平方和来计算变换矩阵。 homography estimation的一个主要应用是图像配准。在医学影像、航拍影像、卫星影像等领域,需要将多幅图像进行配准,以实现更准确的测量和分析。homography estimation可以帮助我们计算不同图像之间的几何变换关系,从而实现图像的精确配准。 总之,homography estimation是一种重要的计算机视觉技术,它为图像处理和计算机视觉领域带来了很多便利和挑战。未来,随着人工智能和机器学习技术的不断发展,homography estimation将会得到更广泛的应用和深入的研究。 ### 回答3: homography estimation是指在计算机视觉中,通过图像对之间的空间变换关系来估计两个图像之间的投影映射。在计算机视觉领域中,对于单个图像来说,可以通过特征点的匹配关系来建立基础矩阵来描述两个图像之间的外参关系,而对于一组图像来说,则需要使用homography矩阵来描述它们之间的内参数和外参数关系。 homography estimation通常需要使用RANSAC算法来进行随机采样和模型拟合的过程,以确保对噪声和异常点有较好的鲁棒性和准确性。homography estimation主要应用于图像拼接、三维重建、目标跟踪、相机标定等领域,其优点在于适用于对于场景有较大的姿态变化、平面或近似平面场景、易于感知整个场景的视点调整等场景。同时,homography estimation也有其局限性,比如对于物体的旋转、缩放、形状变化等更为复杂的情况,其表现可能并不优秀。 总体来说,homography estimation可以为计算机视觉领域提供一种有效的图像对齐和重建的方法,有着广泛的应用场景和潜在的研究价值。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值