Carla之语义分割及BoundingBox验证模型

参考:
Carla系列——4.Cara模拟器添加语义分割相机(Semantic segmentation camera)
Carla自动驾驶仿真五:opencv绘制运动车辆的boudingbox(代码详解)
Carla官网Bounding Boxes
Carla官网创建自定义语义标签

一、模型导入

将建好的模型导入Carla中,放入D:\carla\Unreal\CarlaUE4\Content\Carla\Static\ [TagName]文件夹下,可以自定义标签(后面会写操作),也可以直接放入已有文件夹中(即标签)。
在Carla的这个文件夹中,每个文件夹代表一个标签,一个标签对应语义分割图像中的一个颜色。
在这里插入图片描述
例如:我将我的模型放在了D:\carla\Unreal\CarlaUE4\Content\Carla\Static\Building\Oil _\下面:
在这里插入图片描述
在这里插入图片描述
但后面我将改为放在自定义标签下:D:\carla\Unreal\CarlaUE4\Content\Carla\Static\WjyModelTest\Oil _\

二、将模型加入PropFactory蓝图

在D:\carla\Unreal\CarlaUE4\Content\Carla\Blueprints\Props\中打开PropFactory蓝图,找到DefinitionMaps数组,在该数组中添加新的条目,填入导入的模型所在的路径位置和相关信息。
在这里插入图片描述
在D:\carla\Unreal\CarlaUE4\Content\Carla\Config\Default.Package.json中,填入新模型的信息。
在这里插入图片描述

三、添加自定义的语义标签类别

1.创建新的语义ID

打开 D:\carla\LibCarla\source\carla\rpc\ObjectLabel.h 文件,在枚举末尾添加新标记,使用与其他标记相同的格式。
在这里插入图片描述

2.为资源创建 UE 文件夹

打开虚幻引擎编辑器,然后转到 D:\carla\Unreal\CarlaUE4\Content\Carla\Static。创建一个名为您的标签的新文件夹。
在这里插入图片描述

3.在UE和代码标签之间创建双向对应关系

在 D:\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Game 中打开 Tagger.cpp。
(1)转到 GetLabelByFolderName,在列表末尾添加您的标记。要比较的字符串中使用的 UE 文件夹的名称,因此此处使用完全相同的名称。

在这里插入图片描述

(2)转到 GetTagAsString 中。在交换机末尾添加新标记。
在这里插入图片描述

4.定义颜色代码

打开 D:\carla\LibCarla\source\carla\image\CityScapesPalette.h ,在数组末尾添加新标记的颜色代码。
上面一行的末尾记得加逗号,在这里我将颜色定义为了大红色
在这里插入图片描述

新的语义标记已准备就绪,可供使用。只有存储在标签的 UE 文件夹中的网格才会被标记为这样。将相应的网格移动或导入到新文件夹,以便正确标记。

5.向 carla 添加标签

此步骤与语义分割没有直接关系。但是,这些标记可用于筛选 carla 中的边界框查询。为此,必须将标签添加到 carla PythonAPI 中的 CityObjectLabel 枚举。打开 D:\carla\PythonAPI\carla\source\libcarla\World.cpp

在这里插入图片描述

如果你使用的了自定义的文件夹,记得修改上面有关该模型位置的路径信息!

四、语义分割相机&BoundingBox检测模型是否正确

将模型拖入到场景中之后,运行以下代码:

语义分割代码:

import glob
import os
import sys
import time
import random
import time
import numpy as np
import cv2try:sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (sys.version_info.major,sys.version_info.minor,'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:passimport carla
from carla import Transform, Location, RotationIM_WIDTH = 640
IM_HEIIGHT = 480def process_semantic(image):image.convert(carla.ColorConverter.CityScapesPalette)array = np.frombuffer(image.raw_data, dtype=np.dtype("uint8"))array = np.reshape(array, (image.height, image.width, 4))array = array[:, :, :3]cv2.imshow("", array)cv2.waitKey(20)return array / 255.0actor_list = []
try:# 连接masterclient = carla.Client('localhost', 2000)client.set_timeout(5.0)world = client.get_world()blueprint_library = world.get_blueprint_library()bp = blueprint_library.filter("model3")[0]spawn_point = Transform(Location(x=54.469772, y=-64.348633, z=0.600000), Rotation(pitch=0.000000, yaw=179.976562, roll=0.000000))vehicle = world.spawn_actor(bp, spawn_point)vehicle.set_autopilot(enabled=True)actor_list.append(vehicle)# 添加一个语义分割相机sem_cam = Nonesem_bp = world.get_blueprint_library().find('sensor.camera.semantic_segmentation')sem_bp.set_attribute("image_size_x", f"{IM_WIDTH}")sem_bp.set_attribute("image_size_y", f"{IM_HEIIGHT}")sem_bp.set_attribute("fov", str(105))sem_location = carla.Location(-5, 0, 2.5)sem_rotation = carla.Rotation(0, 0, 0)sem_transform = carla.Transform(sem_location, sem_rotation)sem_cam = world.spawn_actor(sem_bp, sem_transform, attach_to=vehicle, attachment_type=carla.AttachmentType.Rigid)actor_list.append(sem_cam)# 监听相机,并显示图像sem_cam.listen(lambda image: process_semantic(image))time.sleep(50)finally:for actor in actor_list:actor.destroy()print("All cleaned up!")

运行效果:
在这里插入图片描述
使用自定义语义标签运行效果:
在这里插入图片描述
我去失败了!先去吃饭回来再看

BoundingBox代码:

import glob
import os
import systry:sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (sys.version_info.major,sys.version_info.minor,'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:passimport carla
from carla import Transform, Location, Rotation
import random
import queue
import numpy as np
import cv2#构造相机投影矩阵函数
def build_projection_matrix(w, h, fov):focal = w / (2.0 * np.tan(fov * np.pi / 360.0))K = np.identity(3)K[0, 0] = K[1, 1] = focalK[0, 2] = w / 2.0K[1, 2] = h / 2.0return Kdef get_image_point(loc, K, w2c):# 计算三维坐标的二维投影# 格式化输入坐标(loc 是一个 carla.Position 对象)point = np.array([loc.x, loc.y, loc.z, 1])# 转换到相机坐标系point_camera = np.dot(w2c, point)# 将坐标系从 UE4 的坐标系转换为标准坐标系(y, -z, x),同时移除第四个分量point_camera = [point_camera[1], -point_camera[2], point_camera[0]]# 使用相机矩阵进行三维到二维投影point_img = np.dot(K, point_camera)# 归一化point_img[0] /= point_img[2]point_img[1] /= point_img[2]return point_img[0:2]# 生成的对象列表
actor_list=[]try:#连接Carla并获取世界client = carla.Client('localhost', 2000)world  = client.get_world()bp_lib = world.get_blueprint_library()# 生成车辆vehicle_bp =bp_lib.find('vehicle.lincoln.mkz_2020')spawn_points = random.choice(world.get_map().get_spawn_points())print(spawn_points)spawn_point = Transform(Location(x = 27.142294, y = 66.283257, z = 0.600000), Rotation(pitch=0.000000, yaw=-179.926727, roll=0.000000))vehicle = world.try_spawn_actor(vehicle_bp, spawn_points)actor_list.append(vehicle)# 生成相机camera_bp = bp_lib.find('sensor.camera.rgb')camera_bp.set_attribute('image_size_x','960')camera_bp.set_attribute('image_size_y','540')camera_init_trans = carla.Transform(carla.Location(z=2))camera = world.spawn_actor(camera_bp, camera_init_trans, attach_to=vehicle)actor_list.append(camera)vehicle.set_autopilot(True)#生成目标车辆for i in range(20):vehicle_bp = random.choice(bp_lib.filter('vehicle'))npc = world.try_spawn_actor(vehicle_bp, random.choice(world.get_map().get_spawn_points()))if npc:npc.set_autopilot(True)actor_list.append(npc)# 设置仿真模式为同步模式settings = world.get_settings()settings.synchronous_mode = True # 启用同步模式settings.fixed_delta_seconds = 0.05world.apply_settings(settings)# 创建对接接收相机数据image_queue = queue.Queue()camera.listen(image_queue.put)# 从相机获取属性image_w = camera_bp.get_attribute("image_size_x").as_int()  # 图像宽度image_h = camera_bp.get_attribute("image_size_y").as_int()  # 图像高度fov = camera_bp.get_attribute("fov").as_float()  # 视场角# 计算相机投影矩阵,用于从三维坐标投影到二维坐标K = build_projection_matrix(image_w, image_h, fov)edges = [[0,1], [1,3], [3,2], [2,0], [0,4], [4,5], [5,1], [5,7], [7,6], [6,4], [6,2], [7,3]]# 获取第一张图像world.tick()image = image_queue.get()# 将原始数据重新整形为 RGB 数组img = np.reshape(np.copy(image.raw_data), (image.height, image.width, 4))# 在 OpenCV 的显示窗口中显示图像cv2.namedWindow('ImageWindowName', cv2.WINDOW_AUTOSIZE)cv2.imshow('ImageWindowName', img)cv2.waitKey(1)while True:# 更新世界状态并获取图像world.tick()image = image_queue.get()img = np.reshape(np.copy(image.raw_data), (image.height, image.width, 4))# 获取相机投影矩阵world_2_camera = np.array(camera.get_transform().get_inverse_matrix())for npc in world.get_actors().filter('*vehicle*'):# 过滤掉自车if npc.id != vehicle.id:bb = npc.bounding_boxdist = npc.get_transform().location.distance(vehicle.get_transform().location)# 筛选距离在50米以内的车辆if dist < 50:forward_vec = vehicle.get_transform().get_forward_vector()ray = npc.get_transform().location - vehicle.get_transform().location# 计算车辆前进方向与车辆之间的向量的点积,# 通过阈值判断是否在相机前方绘制边界框if forward_vec.dot(ray) > 1:p1 = get_image_point(bb.location, K, world_2_camera)verts = [v for v in bb.get_world_vertices(npc.get_transform())]for edge in edges:p1 = get_image_point(verts[edge[0]], K, world_2_camera)p2 = get_image_point(verts[edge[1]], K, world_2_camera)cv2.line(img, (int(p1[0]), int(p1[1])), (int(p2[0]), int(p2[1])), (255, 0, 0, 255), 1)cv2.imshow('ImageWindowName', img)if cv2.waitKey(1) == ord('q'):breakcv2.destroyAllWindows()finally:for actor in actor_list:actor.destroy()print("All cleaned up!")

运行效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QT】飞机大战

0 项目简介 飞机大战是我们大家所熟知的一款小游戏&#xff0c;本教程就是教大家如何制作一款自己的飞机大战 首先我们看一下效果图 玩家控制一架小飞机&#xff0c;然后自动发射子弹&#xff0c;如果子弹打到了飞下来的敌机&#xff0c;则射杀敌机&#xff0c;并且有爆炸的特…

隧道施工工艺流程vr线上虚拟展示成为产品3D说明书

行业内都知道&#xff0c;汽车生产的大部分都需要冲压加工来完成&#xff0c;因此汽车冲压工艺是汽车制造过程中的重要环节&#xff0c;传统的展示方式往往局限于二维图纸和实地操作&#xff0c;难以充分展现工艺的细节和流程。然而&#xff0c;随着技术的进步&#xff0c;汽车…

不同优化器的应用

简单用用&#xff0c;优化器具体参考 深度学习中的优化器原理(SGD,SGDMomentum,Adagrad,RMSProp,Adam)_哔哩哔哩_bilibili 收藏版&#xff5c;史上最全机器学习优化器Optimizer汇总 - 知乎 (zhihu.com) import numpy as np import matplotlib.pyplot as plt import torch # …

优秀智慧园区案例 - 中建科技产业园(中建·光谷之星),万字长文解析先进智慧园区建设方案经验

一、项目背景 中建科技产业园&#xff08;中建光谷之星&#xff09;&#xff0c;位于武汉光谷中心城、中国&#xff08;湖北&#xff09;自贸试验区武汉片区双核心区&#xff0c;光谷发展主轴高新大道北侧&#xff0c;建筑面积108万平米&#xff0c;是中建三局“中建之星”和“…

设计模式—结构型模式之代理模式

设计模式—结构型模式之代理模式 代理模式(Proxy Pattern) ,给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用,对象结构型模式。 静态代理 比如我们有一个直播平台&#xff0c;提供了直播功能&#xff0c;但是如果不进行美颜&#xff0c;可能就比较冷清…

Adobe Photoshop 2020给证件照换底

1.导入图片 2.用魔法棒点击图片 3.点选择&#xff0c;反选 4.选择&#xff0c;选择并遮住 5.用画笔修饰证件照边缘 6. 7.更换要换的底的颜色 8.新建图层 9.使用快捷键altdelete键填充颜色。 10.移动图层&#xff0c;完成换底。

【ArcGIS Pro微课1000例】0030:ArcGIS Pro中自带晕渲地貌工具的妙用

在ArcGIS中,制作地貌晕渲效果通常的做法是先制作山体阴影效果,然后叠加在DEM的下面,再改变DEM的透明度来实现。而在ArcGIS Pro中自带了效果显著的晕渲地貌工具。 文章目录 一、晕渲地貌工具1. 符号系统2. 栅格函数二、山体阴影效果1. 工具箱2. 栅格函数打开ArcGIS Pro3.0,加…

【C++】类和对象(2)--构造函数

目录 一 概念 二 构造函数特性 三 默认构造函数 一 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year << "-" << _month <…

C语言 每日一题 牛客网 11.13 Day17

找零 Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币&#xff0c;以及面值1024元的纸币。 现在小Y使用1024元的纸币购买了一件价值为N(0 < N≤1024)的商品&#xff0c;请问最少他会收到多少硬币&#xff1f; 思路 运用if语句进行判断分类 代码实现 int main() {…

OpenGL_Learn10(颜色)

1. 颜色 我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。换句话说&#xff0c;那些不能被物体所吸收(Absorb)的颜色&#xff08;被拒绝的颜色&#xff09;就是我们能够感知到的物体的颜色。例如&#xff0c;太阳光…

AI工具-PPT-SlidesAI

SlidesAI 使用手册 https://tella.video/get-started-with-slidesai-tutorial-18yq 简介 SlidesAI 是一款快速创建演示文稿的AI工具&#xff0c;适用于无设计经验的用户。 开始使用 1. **安装与设置** - 访问 [SlidesAI官网](https://www.slidesai.io/zh)。 - 完成简单的设置…

玩转硬件之C51的玩法(一)——破解“口红糖”中的电路

智能玩具&#xff1a;玩具行业的新风口 玩具是儿童的好伙伴&#xff0c;也是成人的乐趣来源。 随着科技的进步和消费的升级&#xff0c;玩具的形式和功能也在不断创新&#xff0c;智能玩具作为玩具行业的新风口&#xff0c;正受到越来越多的关注和喜爱。 什么是智能玩具&…

vue Sts认证后直传图片到阿里云OSS

后端进行sts认证生成临时身份凭证&#xff0c;前端通过凭证直传图片等文件到OSS中 一 OSS配置 增加用户和角色&#xff0c;创建OSS bucket 1.1 添加用户 登录阿里云管理控制台&#xff0c;右侧头像&#xff0c;进入访问控制 点击左侧导航栏的身份管理的用户&#xff0c;点击…

基于Python优化图片亮度与噪点

支持添加噪点类型包括&#xff1a;添加高斯噪点、添加椒盐噪点、添加波动噪点、添加泊松噪点、添加周期性噪点、添加斑点噪点、添加相位噪点&#xff0c;还提供清除噪点的功能。 我们先看一下实测效果&#xff1a;&#xff08;test.jpg为原图&#xff0c;new.jpg为添加后的图片…

学习网络编程No.9【应用层协议之HTTPS】

引言&#xff1a; 北京时间&#xff1a;2023/10/29/7:34&#xff0c;好久没有在周末早起了&#xff0c;该有的困意一点不少。伴随着学习内容的深入&#xff0c;知识点越来越多&#xff0c;并且对于爱好刨根问底的我来说&#xff0c;需要了解的知识就像一座大山&#xff0c;压得…

第2关:还原键盘输入(list)

题目&#xff1a; 知识点&#xff1a; 列表list相较于数组&#xff1a; 优势&#xff1a;可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势&#xff1a;无法直接进行下标索引&#xff0c;需要迭代器it逐个遍历。 代码&#xff1a; #include <iostream>…

库存预占架构升级方案设计-交易库存中心

背景介绍 &#xfeff; 伴随物流行业的迅猛发展&#xff0c;一体化供应链模式的落地&#xff0c;对系统吞吐、系统稳定发出巨大挑战&#xff0c;库存作为供应链的重中之重表现更为明显。近三年数据可以看出&#xff1a; &#xfeff;&#xfeff; 接入商家同比增长37.64%、货…

CLIP:万物分类(视觉语言大模型)

本文来着公众号“AI大道理” ​ 论文地址&#xff1a;https://arxiv.org/abs/2103.00020 传统的分类模型需要先验的定义固定的类别&#xff0c;然后经过CNN提取特征&#xff0c;经过softmax进行分类。然而这种模式有个致命的缺点&#xff0c;那就是想加入新的一类就得重新定义…

零基础快速上手STM32开发(手把手保姆级教程)

零基础快速上手STM32开发&#xff08;手把手保姆级教程&#xff09; 1. 前言 作为一名嵌入式工程师&#xff0c;STM32 是必须要学习的一款单片机&#xff0c;同时这款单片机资料足够多&#xff0c;而且比较简单&#xff0c;非常适合初学者入门。 STM32 是一款由 STMicroelec…

双H桥直流马达步进电机驱动芯片SS8833E

由工采网代理的率能SS8833E是一款适用于有刷直流或双极步进电机的集成电机驱动芯片&#xff1b;采用eTSSOP16封装&#xff1b;该器件集成了两个PNMOS H桥和电流调节电路&#xff1b;电机输出电流可以由外部脉宽调制器&#xff08;PWM&#xff09;或内部PWM电流控制器控制。 工…