当前位置:网站首页>3D Detection: 3D Box和点云 快速可视化
3D Detection: 3D Box和点云 快速可视化
2022-07-07 11:56:00 【烤粽子】
3D检测,用于3D box,点云快速可视化,辅助debug和分析:
(Nuscenes,mmdet3d,OpenPCDet等适用)
注意:代码适用于多种模型,但是注意BEVDet系列和FCOS3D(front View)系列要选用不同的box转换。
3D box投影到bev可视化:
import matplotlib.pyplot as plt
import torch
def box3d2x0y0wh(boxes_3d):
# BEVDet/CenterPoints
import numpy as np
n = boxes_3d.shape[0]
box2d = np.zeros((n,4))
# 3dbox --> xywh
box2d[:,:2] = boxes_3d[:,:2]
box2d[:,2] = boxes_3d[:,3]
box2d[:,3] = boxes_3d[:,4] # 2xywh
#
# xyxy = np.ones_like(box2d)
box2d[:,0] = box2d[:, 0] - box2d[:, 2] / 2
box2d[:,1] = box2d[:, 1] + box2d[:, 3] / 2 # NOTE: 左下角点
return box2d
def box3d2x0y0wh_2(boxes_3d):
# FCOS3D: front view--> BEV
import numpy as np
n = boxes_3d.shape[0]
box2d = np.zeros((n,4))
# 3dbox --> xywh 左下角点
box2d[:, 0] = boxes_3d[:, 0]
box2d[:, 1] = boxes_3d[:, 2]
box2d[:, 2] = boxes_3d[:, 4]
box2d[:, 3] = boxes_3d[:, 5] # 2xywh
#
# xyxy = np.ones_like(box2d)
box2d[:,0] = box2d[:, 0] - box2d[:, 2] / 2
box2d[:,1] = box2d[:, 1] + box2d[:, 3] / 2 # NOTE
return box2d
# 根据坐标作图
def draw_boxes(pred_boxes_3d, target_boxes_3d, path):
# pred_boxes xywh
import matplotlib.pyplot as plt
import matplotlib.patches as patches
pred_boxes = box3d2x0y0wh(pred_boxes_3d)
target_boxes = box3d2x0y0wh(target_boxes_3d)
fig, ax = plt.subplots()
ax.plot()
# ax.add_patch(patches.Rectangle((1, 1),0.5,0.5,edgecolor = 'blue',facecolor = 'red',fill=True) )
#
for index, coord in enumerate(pred_boxes):
rect = patches.Rectangle((coord[0], coord[1]), coord[2], coord[3],
linewidth=1, edgecolor='r',facecolor='none')
ax.add_patch(rect)
for index, coord in enumerate(target_boxes):
rect = patches.Rectangle((coord[0], coord[1]), coord[2], coord[3],
linewidth=1, edgecolor='g',facecolor='none')
ax.add_patch(rect)
# plt.legend(loc='best',edgecolor='g')
if os.path.exists(path):
os.remove(path)
fig.savefig(path, dpi=90, bbox_inches='tight')
# print(0)
plt.close(fig)
print('Successfully saved')
点云快速可视化:
def draw_pts(points, save_path, show=False):
''' points: [N,3+c] '''
assert len(points.shape) == 2
if isinstance(points, torch.Tensor):
points = points.cpu().numpy()
points = points.copy()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# point_range = range(0, points.shape[0], skip) # skip points to prevent crash
point_range = range(0, points.shape[0])
ax.scatter(points[point_range, 0], # x
points[point_range, 1], # y
points[point_range, 2], # z
c=points[point_range, 2], # height data for color
cmap=plt.get_cmap("Spectral"),
marker="x")
ax.axis('auto') # {equal, scaled}
if show:
plt.show()
if save_path is not None:
fig.savefig(save_path, dpi=90, bbox_inches='tight')
plt.close(fig)
边栏推荐
- 【面试高频题】难度 2.5/5,简单结合 DFS 的 Trie 模板级运用题
- Distributed transaction solution
- 带你掌握三层架构(建议收藏)
- 648. Word replacement: the classic application of dictionary tree
- Problems that cannot be accessed in MySQL LAN
- 如何让join跑得更快?
- Move base parameter analysis and experience summary
- Signal strength (RSSI) knowledge sorting
- Realize the IP address home display function and number home query
- Storage principle inside mongodb
猜你喜欢

Digital IC Design SPI

2022-7-7 Leetcode 844.比较含退格的字符串

Deep understanding of array related problems in C language

【堡垒机】云堡垒机和普通堡垒机的区别是什么?

. Net core about redis pipeline and transactions

Ways to improve the performance of raspberry pie

Storage principle inside mongodb

Realize the IP address home display function and number home query

Redis can only cache? Too out!

Build a secure and trusted computing platform based on Kunpeng's native security
随机推荐
Drawerlayout suppress sideslip display
LED light of single chip microcomputer learning notes
《厌女:日本的女性嫌恶》摘录
Mongodb command summary
Deep understanding of array related problems in C language
Introduction to database system - Chapter 1 introduction [conceptual model, hierarchical model and three-level mode (external mode, mode, internal mode)]
记一次 .NET 某新能源系统 线程疯涨 分析
"Song of ice and fire" in the eleventh issue of "open source Roundtable" -- how to balance the natural contradiction between open source and security?
C语言数组相关问题深度理解
Esp32 construction engineering add components
为租客提供帮助
华为镜像地址
Error lnk2019: unresolved external symbol
数字ic设计——SPI
.net core 关于redis的pipeline以及事务
ES日志报错赏析-Limit of total fields
属性关键字Aliases,Calculated,Cardinality,ClientName
2022-7-6 使用SIGURG来接受外带数据,不知道为什么打印不出来
最佳实践 | 用腾讯云AI意愿核身为电话合规保驾护航
PHP - laravel cache