Lift, Splat, Shoot图像BEV安装与模型代码详解

左侧6帧图像为不同的相机帧,右侧为BEV视角下的分割与路径规划结果

由于本人才疏学浅,解析中难免会出现不足之处,欢迎指正、讨论,有好的建议或意见都可以在评论区留言。谢谢大家!

专栏地址:https://blog.csdn.net/qq_41366026/category_11640689.html?spm=1001.2014.3001.5482

1 前言

计算机视觉算法通常使用图像是作为输入并输出预测的结果,但是对结果所在的坐标系却并不关心,例如图像分类、图像分割、图像检测等任务中,输出的结果均在原始的图像坐标系中。因此这种范式不能很好的与自动驾驶契合。

在自动驾驶中,多个相机传感器的数据一起作为输入,这样每帧图像均在自己的坐标系中;但是感知算法最终需要在车辆自身坐标系(ego coordinate)中输出最终的预测结果;并提供给下游的规划任务。

当前也有很多简单、使用的方法用于扩展单帧图像到多视角图像的方法。简单实用的有来自所有相机的每一帧图像

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这里是一个使用LIFT算法进行图像匹配的代码,其中使用了CNN网络: ``` import torch import torch.nn as nn import torch.optim as optim import numpy as np import cv2 import matplotlib.pyplot as plt from torchvision import transforms from PIL import Image from lift import LIFT # 定义CNN网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2) self.fc1 = nn.Linear(32 * 28 * 28, 1000) self.fc2 = nn.Linear(1000, 2) def forward(self, x): x = self.pool(torch.relu(self.conv1(x))) x = self.pool(torch.relu(self.conv2(x))) x = x.view(-1, 32 * 28 * 28) x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 加载图像 img1 = cv2.imread('image1.jpg', 0) img2 = cv2.imread('image2.jpg', 0) # 初始化LIFT算法 detector = LIFT() # 提取特征 kp1, des1 = detector.detectAndCompute(img1, None) kp2, des2 = detector.detectAndCompute(img2, None) # 初始化CNN网络 net = Net() # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.Adam(net.parameters(), lr=0.001) # 将特征转换为张量 des1_tensor = torch.tensor(des1).float() des2_tensor = torch.tensor(des2).float() # 将图像转换为PIL格式 img1_pil = Image.fromarray(img1) img2_pil = Image.fromarray(img2) # 图像预处理 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) img1_tensor = transform(img1_pil).unsqueeze(0) img2_tensor = transform(img2_pil).unsqueeze(0) # 训练CNN网络 for epoch in range(100): optimizer.zero_grad() output1 = net(des1_tensor) output2 = net(des2_tensor) loss = criterion(output1, output2) loss.backward() optimizer.step() print("Epoch: {}, Loss: {}".format(epoch, loss.item())) # 将特征嵌入到空间中 des1_embedded = net(des1_tensor).detach().numpy() des2_embedded = net(des2_tensor).detach().numpy() # 计算匹配矩阵 match_matrix = np.dot(des1_embedded, des2_embedded.T) # 对匹配矩阵进行归一化 norms1 = np.linalg.norm(des1_embedded, axis=1) norms2 = np.linalg.norm(des2_embedded, axis=1) normalized_match_matrix = match_matrix / np.outer(norms1, norms2) # 求取最佳匹配对 max_indices = np.argmax(normalized_match_matrix, axis=1) matches = [] for i, idx in enumerate(max_indices): matches.append(cv2.DMatch(i, idx, 0)) # 绘制匹配图像 img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches, None) plt.imshow(img_matches) plt.show() ``` 需要注意的是,这里的`lift`和`cv2`是需要提前安装Python库,且该代码仅为演示用途,不一定能够完美匹配所有图像
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NNNNNathan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值