[bevformer渲染可视化] 2d框可视化 并可视化出小目标

embedded/2024/12/23 6:18:26/

可视化代码:


代码使用方法:
1.复制代码全文到任意python文件中

2.下载nuscenes v1.0-mini数据集,修改数据集路径,保证能读取到数据集

3.按照需求修改代码(本文是2dbox面积的面积和整个图片的面积比小于0.03视为小目标)

if area_ratio < 0.03:label = "small target"

3.运行命令

 在bevfomer环境下运行此python文件

import os
import cv2
import numpy as np
from nuscenes.utils.geometry_utils import view_points
from pyquaternion import Quaternion
from nuscenes import NuScenes# 初始化nuScenes
nusc = NuScenes(version='v1.0-mini', dataroot='/home/lyh/Documents/dataset/v1.0-mini/', verbose=True)# 定义类别颜色映射
category_colors = {'vehicle': (255, 255, 0),    # Yellow'pedestrian': (0, 0, 255),   # Blue'bicycle': (0, 255, 0),      # Green'motorcycle': (255, 0, 255), # Magenta'bus': (0, 255, 255),        # Cyan'trailer': (255, 165, 0),    # Orange'truck': (255, 20, 147)      # Deep Pink
}def get_color_for_category(category_name):"""获取类别的颜色"""for category, color in category_colors.items():if category in category_name:return colorreturn (128, 128, 128)  # Default color: Graydef draw_3d_box_on_image(image, corners_3d, camera_intrinsic, color, label=None):"""在图像上绘制3D框"""# 从相机坐标系->像素坐标系view = np.eye(4)view[:3, :3] = camera_intrinsicin_front = corners_3d[2, :] > 0.1if all(in_front) is False:return imagepoints = corners_3dpoints = np.concatenate((points, np.ones((1, points.shape[1]))), axis=0)points = np.dot(view, points)[:3, :]points /= points[2, :]box_img = points.astype(np.int32)for i in range(4):j = (i + 1) % 4# 下底面cv2.line(image, (box_img[0, i], box_img[1, i]), (box_img[0, j], box_img[1, j]), color, thickness=2)# 上底面cv2.line(image, (box_img[0, i + 4], box_img[1, i + 4]), (box_img[0, j + 4], box_img[1, j + 4]), color, thickness=2)# 侧边线cv2.line(image, (box_img[0, i], box_img[1, i]), (box_img[0, i + 4], box_img[1, i + 4]), color, thickness=2)if label:# 在图像上绘制文本标签x_min = min(box_img[0])y_min = min(box_img[1])cv2.putText(image, label, (x_min, y_min - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)return imagedef calculate_2d_bbox(corners_3d, camera_intrinsic):"""计算2D边界框"""view = np.eye(4)view[:3, :3] = camera_intrinsicin_front = corners_3d[2, :] > 0.1if all(in_front) is False:return Nonepoints = corners_3dpoints = np.concatenate((points, np.ones((1, points.shape[1]))), axis=0)points = np.dot(view, points)[:3, :]points /= points[2, :]box_img = points.astype(np.int32)x_min, y_min = np.min(box_img[0]), np.min(box_img[1])x_max, y_max = np.max(box_img[0]), np.max(box_img[1])return x_min, y_min, x_max, y_maxdef visualize_sample(nusc, sample_token, save_path):sample = nusc.get('sample', sample_token)sample_data_token = sample['data']['CAM_FRONT']sd_rec = nusc.get('sample_data', sample_data_token)filename = sd_rec['filename']img_path = os.path.join(nusc.dataroot, filename)img = cv2.imread(img_path)assert sd_rec['sensor_modality'] == 'camera', 'Error: This function only works for camera sample_data!'if not sd_rec['is_key_frame']:raise ValueError('The 2D re-projections are available only for keyframes.')cs_rec = nusc.get('calibrated_sensor', sd_rec['calibrated_sensor_token'])pose_rec = nusc.get('ego_pose', sd_rec['ego_pose_token'])camera_intrinsic = np.array(cs_rec['camera_intrinsic'])img_height, img_width = img.shape[:2]img_area = img_height * img_widthann_recs = [nusc.get('sample_annotation', token) for token in sample['anns']]for ann_rec in ann_recs:box = nusc.get_box(ann_rec['token'])# 从世界坐标系->车身坐标系box.translate(-np.array(pose_rec['translation']))box.rotate(Quaternion(pose_rec['rotation']).inverse)# 从车身坐标系->相机坐标系box.translate(-np.array(cs_rec['translation']))box.rotate(Quaternion(cs_rec['rotation']).inverse)corners_3d = box.corners()bbox_2d = calculate_2d_bbox(corners_3d, camera_intrinsic)if bbox_2d:x_min, y_min, x_max, y_max = bbox_2dbox_area = (x_max - x_min) * (y_max - y_min)area_ratio = np.sqrt(box_area / img_area)label = Noneif area_ratio < 0.03:label = "small target"color = get_color_for_category(ann_rec['category_name'])img = draw_3d_box_on_image(img, corners_3d, camera_intrinsic, color, label)save_filename = os.path.join(save_path, f"{sample_token}.png")cv2.imwrite(save_filename, img)print(f"Saved {save_filename}")def visualize_all_samples(nusc, save_path):if not os.path.exists(save_path):os.makedirs(save_path)for sample in nusc.sample:visualize_sample(nusc, sample['token'], save_path)# 设置保存路径并可视化所有样本
save_path = '/home/lyh/Documents/small_target_Output/'
visualize_all_samples(nusc, save_path)

可视化效果:


http://www.ppmy.cn/embedded/104639.html

相关文章

在ElementUI项目中集成iconfont图标库

在前端项目开发中经常会遇到使用的组件库提供的ICON图标不够用的情况。最常见的解决方案无非就是把设计图的图标切图引入到项目中。还有就是使用svg图标&#xff0c;封装一个渲染组件在项目里面直接引入这个组件。 本文将介绍另一种方法&#xff0c;即集成iconfont图标库的图标…

机器学习中的聚类算法概述

概述 聚类&#xff08;cluster&#xff09;与分类&#xff08;class&#xff09;问题不同&#xff0c;聚类是属于无监督学习模型&#xff0c;而分类属于有监督学习。聚类使用一些算法把样本分为N个群落&#xff0c;群落内部相似度较高&#xff0c;群落之间相似度较低。在机器学…

java简单平台跳跃游戏

对于渴望用Java创建简单平台跳跃游戏的朋友&#xff0c;这里有一个基础的游戏框架可以作为你的开始。 想象我们正开发一个2D的跳跃游戏&#xff0c;其核心玩法是让玩家控制角色以避开障碍。 下文将介绍如何利用Java结合java.awt和javax.swing库来制作一个具有图形界面的游戏示…

【SQL】餐馆营业额七日均线数据

目录 题目 分析 代码 题目 表: Customer ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | visited_on | date | | amount | int | -----------------------…

大一地信新生,如何从0规划学习WebGIS开发!附通关攻略

关于学习WebGIS开发&#xff0c;很多GIS专业的学生&#xff0c;从大一开始苦恼从哪里入手?内容太多&#xff0c;不知道什么是重点&#xff1f;不了解企业实际应用情况&#xff0c;怕所学非所用。关于这一点&#xff0c;小编通过本文详细介绍一下&#xff01; WebGIS&#xff…

区块链通证系统功能分析

区块链通证系统功能分析涉及多个关键方面&#xff0c;以确保系统能够满足不同的业务需求和合规性要求。 同质与非同质通证&#xff1a;区块链通证系统需要支持同质通证&#xff08;如ERC-20&#xff09;和非同质通证&#xff08;如ERC-721&#xff09;&#xff0c;以适应不同类…

聚水潭ERP集成用友U9(聚水潭主供应链)

源系统成集云目标系统 用友U9介绍 用友U9是中型及中大型制造业云ERP&#xff0c;为企业打造数智智造全场景应用&#xff0c;多组织协同&#xff0c;构建企业生态圈&#xff0c;集团化全球化&#xff0c;项目制造实现闭环&#xff0c;聚焦中型和中大型制造企业&#xff0c;全面…

Kevin‘s notes about Qt---Episode 3 在界面中修改程序参数Demo

Demo 效果 实现一个加法器,在输入框中分别填入a和b的值,点击“calculate”按钮,在sum处显示a+b的结果。 整体结构 我自己先写了一个模板用于测试从文本框获取输入数据,整个工程的结构如下: 说明: func_myself.h和func_myself.cpp是我自己创建的头文件和源文件,用于定…