一、说明
我们有一个任务是找到与给定查询图像最匹配的图像。首先,我们在OpenCV中尝试了使用SIFT描述符和基于Flann的匹配器的经典图像匹配。结果是完全错误的。然后是词袋...最后,找到了AffNet和HardNet。
二、关于AffNet和HardNet
本文专门介绍如何进行应用实验,不对AffNet和HardNet原理进行详细说明。
AffNet是一种学习具有硬负常数损失的局部仿射协变区域的新方法,其性能优于最先进的词袋图像检索和宽基线立体声。
AffNet培训(来自原始论文)
HardNet 是一种新颖的紧凑学习特征描述符,在标准匹配和检索基准测试上显示了与手工制作和学习描述符相关的最先进的卓越性能,并且在 GPU 上计算速度很快(作者论文)。它在github上公开可用。
以下是使用 AffNet 匹配通过极端仿射变换捕获的图像的一个很好的例子
在这里,作者在一篇论文中更详细地描述了这种方法。关于硬网的好介绍。
三、代码获取
从 github 克隆存储库:
git clone https://github.com/ducha-aiki/affnet.git
然后移动到该文件夹。
启动 Jupyter :
jupyter notebook
并在文件夹示例中打开笔记本 SIFT-AffNet-HardNet-kornia-matching.ipynb。首先安装所有必需的库。在笔记本顶部创建一个单元格并运行
!pip install kornia pydegensac extract_patches
如果您有 OpenCV 版本 4,则可能会收到函数 SIFT_create 的错误:“函数/特性未实现此算法已获得专利,并在此配置中被排除;”。SIRF 和 SURF 在 opencv > 3.4.2.16 中不再可用。安装旧版本的OpenCV:
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
有三个管道:
- DoG-AffNet-OriNet-HardNet (使用 AffNetJIT、OriNetJIT、提取 SIFT 键点、HardNet 描述符等)
- DoG-Affine-OriNet-HardNet
- DoG-OriNet-HardNet
当使用DoG-AffNet-OriNet-HardNet管道对作者提供的图像进行AffNet匹配时,我们得到以下结果
30.0 inliers found
对于这些图像来说非常好。
对于管道DoG-AffNet-OriNet-HardNet
18.0 inliers found
对于管道DoG-OriNet-HardNet
25.0 inliers found
当我们在室内场景比赛的图像上测试AffNet时,没有任何调整参数就很兴奋。这里不需要对AffNet进行再培训。
要集成 AffNet,您只需安装所需的库并下载预训练的模型权重
wget https://github.com/ducha-aiki/affnet/raw/master/convertJIT/AffNetJIT.pt
wget https://github.com/ducha-aiki/affnet/raw/master/convertJIT/OriNetJIT.pt
wget https://github.com/ducha-aiki/affnet/raw/master/test-graf/img1.png
wget https://github.com/ducha-aiki/affnet/raw/master/test-graf/img6.png
wget https://github.com/ducha-aiki/affnet/raw/master/test-graf/H1to6p
将 Jupyter 笔记本转换为 python 脚本
jupyter nbconvert SIFT-AffNet-HardNet-kornia-matching.ipynb --to python
默认情况下,CPU 由 PyTorch 使用
dev = torch.device('cpu')
您可以切换到上面的GPU注释行和取消注释的后续行
#dev = torch.device('cuda')
就是这样。祝您在解决匹配图像的问题时好运。
四、结论
我们在上文讲述了如何在python环境用AffNet和HardNet实现图像匹配,试图实现这种功能的读者可以照着套路进行应用,至于更多的原理,我们将在其它文中详细论述。 我们从这些幻灯片中了解了AffNet和HardNet的组合。
普里瓦洛夫·弗拉基米尔