HPatches 数据集及特征点检测匹配评价指标解析

1. 简介

数据集下载:
数据集 GitHub 地址
HPatches [4.2GB]:hpatches-release
HPatches full sequences [1.3GB]:hpatches-sequences-release

  由于在特征点检测与匹配的相关论文中所使用的是 1.3GB 的数据集,另一个数据集暂时略过。数据集中包含 116 个文件夹,文件夹名称分为两大类 i_xxx 和 v_xxx,i_xxx 对应光照变化的图像对,v_xxx 对应视角变化的图像对。文件夹中内容如下:
在这里插入图片描述

  1 为原图,其余为目标图;H_1_x 为单应性矩阵;txt 中记录 light 或 viewpoint 对应光照和视角。部分数据展示见第三节。

  数据集中有 57 个 i_xxx,59 个 v_xxx,但是论文通常只使用 52 个 i_xxx 和 56 个 v_xxx 做测试。过滤掉了分辨率大于 1200*1600 的图像,因为不是所有的方法都能处理这个分辨率的图像(D2-Net)。

2. 评估

  论文中(Patch2Pix、DFM)常见的有两种评估:Image Matching 和 Homography Estimation,很多论文只评估第一项(D2-Net、Sparse-NCNet、Aslfeat、DualRC-Net)。
  Image Matching 是计算模型输出的匹配点的 MMA(mean matching accuracy),Homography Estimation 是根据匹配点计算单应性矩阵再计算精度。

2.1 Image Matching

  直接根据 DualRC-Net 的代码看一下 MMA 是怎么算的。

'''
match 是根据网络得到的特征点匹配结果 (n,4)
'''
# read in homography
H = np.loadtxt(H_file)
# project the query to reference
npts = matches.shape[0]
query = matches[:, :2] * (hA / hA_)
ref = matches[:, 2:] * (hB / hB_)
query_ = np.concatenate((query, np.ones((npts, 1))), axis=1)
projection = np.matmul(H, query_.T).T

# convert the projection from homogeneous coordinate to inhomogeneous coordinate
projection = projection / projection[:, 2:3]
projection = projection[:, :2]
# evaluate the result
result = np.linalg.norm(ref-projection, axis=1)

for thres in range(1, 11):
    idx = thres-1
    if change_type == 'v':
        MMA_v[idx] += np.sum(result <= thres) / result.shape[0]
    if change_type == 'i':
        MMA_i[idx] += np.sum(result <= thres) / result.shape[0]
    MMA[idx] += np.sum(result <= thres) / result.shape[0]

  利用源图像的点和单应性矩阵可以得到实际与其对应的目标图像的点坐标,计算一下与实际坐标的距离误差,按照不同的阈值得到小于阈值的匹配数量占总匹配数量的百分比。
  这里就可以看出,这个 MMA 其实和输出的匹配数量是有点关系的。一般是按匹配的得分排序,用阈值筛或者直接取前 n 个,如果特征点取得过多必然会降低影响精度。但是也不能为了精度只取很少的匹配,因为少量的点很可能集中在局部比较容易匹配的地方,匹配点的分布会影响单应性矩阵的精度,通常做特征点的检测匹配最终也是为了做对齐,这也就是为什么会有一些论文加上第二个单应性矩阵的评估。

在这里插入图片描述
  上图为 Patch2Pix 论文中的图,Illumination 对应光照变换结果,Viewpoint 对应视角变化结果,Overall 则是所有数据的结果。右边还给出了特征点和匹配点的数量,很多论文只给出左边的 MMA 对比。其实可以看出匹配的数量还是很充足的,一般深度方法有 NMS 的环节,点也不会特别集中,所以只对比 MMA 也基本够了。

  以下为 Patch2Pix 的代码,计算逻辑是完全一样的。

dist = eval_matches(matches[:, :2], matches[:, 2:], homography)
for thr in thres_range:
    if sname[0] == 'i':
        i_err[thr] += np.mean(dist <= thr)
    else:
        v_err[thr] += np.mean(dist <= thr)

def eval_matches(p1s, p2s, homography):
    # Compute the reprojection errors from im1 to im2 
    # with the given the GT homography
    p1s_h = np.concatenate([p1s, np.ones([p1s.shape[0], 1])], axis=1)  # Homogenous
    p2s_proj_h = np.transpose(np.dot(homography, np.transpose(p1s_h)))
    p2s_proj = p2s_proj_h[:, :2] / p2s_proj_h[:, 2:]
    dist = np.sqrt(np.sum((p2s - p2s_proj) ** 2, axis=1))
    return dist

2.2 Homography Estimation

  直接看 Patch2Pix 的代码

'''
篇幅有限,只挑了比较核心的语句
可以看出是利用两个单应性矩阵对图像的4个角点做变换,然后计算像素误差
其实就是把计算匹配点的 MMA 变成了计算4个角点的 MMA
'''
H_gt = np.loadtxt(os.path.join(seq_dir, 'H_1_{}'.format(im_idx)))
H_pred, inliers = pydegensac.findHomography(p1s, p2s, rthres)

im = Image.open(im1_path)
w, h = im.size
corners = np.array([[0, 0, 1],
	                [0, w - 1, 1],
	                [h - 1, 0, 1],
	                [h - 1, w - 1, 1]])
real_warped_corners = np.dot(corners, np.transpose(H_gt))
real_warped_corners = real_warped_corners[:, :2] / real_warped_corners[:, 2:]
warped_corners = np.dot(corners, np.transpose(H_pred))
warped_corners = warped_corners[:, :2] / warped_corners[:, 2:]
mean_dist = np.mean(np.linalg.norm(real_warped_corners - warped_corners, axis=1))
correctness = [float(mean_dist <= cthr) for cthr in corr_thres]

  再复盘一下 Patch2Pix 的实验结果:
在这里插入图片描述
  感觉和 MMA 的结果差不多,这边还额外给出了速度的比较,Patch2Pix 的对比实验很充分。(不过看他的 github 上说是在 48G 的 GPU 上训练的,多半测试也是)

3. 个人想法

光照变化数据:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
视角变化数据:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  随机挑选了一些数据看了一下,可以发现 HPatches 的一些特点:
(1)光照变化图像不存在视角变化,视角变化图像不存在光照变化;实际应用场景下通常两种变化同时存在。
(2)图像大多数可以近似为一个平面,从而可以将变换近似为一个单应性矩阵作为 ground truth;实际应用场景下图像存在很多深度不同的地方,也会存在有些部分会拍不清楚细节模糊。

  正是由于数据集相对简单,导致论文指标基本要刷 3 个像素以内的 MMA,不太清楚在实际运用时是否需要这么高的精度,而且单应性矩阵作为 ground truth 能否把每个像素都完美对齐也难说。另外,对模型来说,要区分出相邻像素之间的差异让匹配更精确也是相当困难的。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值