图像匹配sparse-ncnet复现

一、资源下载

在进行环境配置之前需要准备以下资源:
1、sparse-ncnet源代码下载
sparse-ncnet
2、MinkowskiEngine源代码下载,由于MinkowskiEngine更新比较快,但是sparse-ncnet 没有进行更新,所以需要在连接中找到0.4.3版本的.zip文件进行下载
MinkowskiEngine0.4.3
3、训练数据集下载(如果只想跑demo可不需要进行下载),按照官方提示进行数据集下载,此过程需要访问外网
ivd数据集下载

二、环境搭建

1、我这里使用的是网上租用的服务器,由于这个复现可能对显存有要求,所以采用租用服务器的方法进行实现,而且不可以租用30系列显卡,我这里使用的是Tesla P40,因为编译MinkowskiEngine需要cuda-10.1,租用的时候选择镜像选择pytorch1.6.0。如果大家的显存是12G可能会报错,还是选择显存大一点的显卡。这个服务器新人有10元代金券,大家可以免费体验。
服务器租用网址
租用Tesla P40所需的环境
2、搭建好环境后,需要将之前下载好的sparse-ncnet源代码与MinkowskiEngine源代码上传到服务器,并进行解压。
上传之后的图片
3、首次使用这个服务器打开终端后需要执行source activate命令配置一下anaconda(如果是自己的服务器可以忽略,直接进行第4步)
初始化anaconda

4、配置好终端后,打开命令行终端依次执行以下指令,有些双等号后面有空格,大家可以自行删除
a) conda create -n sparsencnet python=3.6.9=h265db76_0(这里一定要安装3.6,其他版本有些库会安装失败
b) conda activate sparsencnet
c) conda install numpy== 1.15.1 openblas
c) conda install openblas-devel -c anaconda
d) pip install torch== 1.6.0+cu101 torchvision== 0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html或者conda install pytorch== 1.6.0 torchvision== 0.7.0 cudatoolkit=10.1 -c pytorch(大家可以到pytorch官网进行安装pytorch1.6.0,千万不要安错,一定要选择cuda10.1版本,我使用的是前者,因为网速快)
e) chmod -R 777 MinkowskiEngine-0.4.3/*
f) cd MinkowskiEngine-0.4.3(进入到自己之前解压好的MinkowskiEngine路径)

g)  export CXX=g++-7

h) python setup.py install(如果采用我推荐服务器安装,大家一定要有卡安装,否则编译出错
i) conda install https://repo.anaconda.com/pkgs/free/linux-64/cudatoolkit-8.0-3.tar.bz2(这个安装下载可能有点慢,如果用上面服务器,大家可以采用无卡模式进行安装)
j) conda install --force --no-deps faiss-gpu=1.4.0=py36_cuda8.0.61_1 -c pytorch
k) conda install matplotlib scikit-image pandas
l) pip uninstall pillow
m) CC=“cc -mavx2” pip install -U --force-reinstall pillow-simd (这个地方是英文双引号,不知道为什么发布的时候变成中文的了)

所有环境版本

三、demo测试

搭建好环境后,可以利用官方提供的demo进行测试,需要先通过/sparse-ncnet-master/trained_models/路径下的download.sh文件下载与训练模型。
预训练模型下载
我将demo.ipynb文件内的内容拷贝了出来,做成可.py文件,一定要和源文件放在同一个地方,然后进入次目录,并进入刚刚搭建好的虚拟环境进行测试。(和我用一样服务器一定要在有卡模式下
demo运行流程
demo.py的代码如下

import faiss
import torch

import os

import sys
sys.path.append('..')

import matplotlib.pyplot as plt
import numpy as np

from lib.model import ImMatchNet, MutualMatching
from lib.normalization import imreadth, resize, normalize, normalize_image
from lib.relocalize import relocalize, relocalize_soft, eval_model_reloc
from lib.sparse import get_matches_both_dirs

checkpoint = '../trained_models/sparsencnet_k10.pth.tar'
chp_args = torch.load(checkpoint)['args']
model = ImMatchNet(use_cuda=True,
                   checkpoint=checkpoint,
                   ncons_kernel_sizes=chp_args.ncons_kernel_sizes,
                   ncons_channels=chp_args.ncons_channels,
                   sparse=True,
                   symmetric_mode=bool(chp_args.symmetric_mode),
                   feature_extraction_cnn=chp_args.feature_extraction_cnn,
                   bn=bool(chp_args.bn),
                   k=chp_args.k,
                   return_fs=True,
                   change_stride=1
                  )
                  
image_size = 1600
scale_factor = 0.0625

src=imreadth('aachen_query.jpg')
hA,wA=src.shape[-2:]
src=resize(normalize(src), image_size, scale_factor)
hA_,wA_=src.shape[-2:]

tgt=imreadth('aachen_db.jpg')
hB,wB=tgt.shape[-2:]
tgt=resize(normalize(tgt), image_size, scale_factor)
hB_,wB_=tgt.shape[-2:]   
                  
with torch.no_grad():
    corr4d, feature_A_2x, feature_B_2x, fs1, fs2, fs3, fs4 = eval_model_reloc(
        model,
        {'source_image':src,
         'target_image':tgt}
    )      


Npts = 500

# extract matches
xA_, yA_, xB_, yB_, score_ = get_matches_both_dirs(corr4d, fs1, fs2, fs3, fs4)

# get top Npts
matches_idx_sorted = torch.argsort(-score_.view(-1))
N_matches = min(Npts, matches_idx_sorted.shape[0])
matches_idx_sorted = matches_idx_sorted[:N_matches]
score_ = score_[:,matches_idx_sorted]
xA_ = xA_[:,matches_idx_sorted]
yA_ = yA_[:,matches_idx_sorted]
xB_ = xB_[:,matches_idx_sorted]
yB_ = yB_[:,matches_idx_sorted]

# upscale feature sizes by 2x
fs1_,fs2_,fs3_,fs4_=2*fs1,2*fs2,2*fs3,2*fs4

# relocalization stage 1:
xA_, yA_, xB_, yB_, score_ = relocalize(xA_,
                                        yA_,
                                        xB_,
                                        yB_,
                                        score_,
                                        feature_A_2x,
                                        feature_B_2x,
                                        crop_size=2)

# relocalization stage 2:
xA_, yA_, xB_, yB_, score_ = relocalize_soft(xA_,yA_,xB_,yB_,score_,feature_A_2x, feature_B_2x, upsample_positions=False)

# normalize coords in [0,1] range
yA=((yA_+0.5)/(fs1_)).squeeze().cpu().numpy()
xA=((xA_+0.5)/(fs2_)).squeeze().cpu().numpy()
yB=((yB_+0.5)/(fs3_)).squeeze().cpu().numpy()
xB=((xB_+0.5)/(fs4_)).squeeze().cpu().numpy()




mean = torch.tensor([0.485, 0.456, 0.406]).view(1,3,1,1).cuda()
std = torch.tensor([0.229, 0.224, 0.225]).view(1,3,1,1).cuda()

src_tgt = (torch.cat((src,tgt),dim=2)*std)+mean
src_tgt = src_tgt.squeeze().permute(1,2,0).mul(255).cpu().numpy().astype(np.uint8)


plt.imshow(src_tgt)
plt.axis('off')
plt.scatter(xA*wA_,yA*hA_,0.5,c='limegreen',alpha=0.5)
plt.scatter(xB*wB_,yB*hB_+hA_,0.5,c='limegreen',alpha=0.5)
plt.plot(np.stack((xA*wA_,xB*wB_)),
         np.stack((yA*hA_,yB*hB_+hA_)),
         c='limegreen',
         linewidth=0.1)
plt.gcf().set_dpi(400)
                 

四、训练数据

在进行训练数据之前,要将下载好的数据集导入所存储位置,然后运行train.py进行训练。
存储位置
下载好的ivd数据集所存储的内容。
下载好的数据内容
运行train.py。
训练操作
训练之后的权值文件,会存储在预训练模型文件夹下。
权值文件保存路径

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值