作者 | 李慢慢1990 编辑 | 车路漫漫
点击下方卡片,关注“自动驾驶之心”公众号
ADAS巨卷干货,即可获取
点击进入→自动驾驶之心【仿真测试】技术交流群
本文只做学术分享,如有侵权,联系删文
本周末开始学习一些关于图像识别的东西。
Carla仿真模拟器中提供了很多种传感器,其中摄像头(camera)就有6种,他们分别是:
1、rgb:红绿蓝
2、semantic segmentation:语义分割
3、instance segmentation:实例分割
4、depth:深度
5、dvs:动态视觉
6、optical_flow:光流
各种传感器的效果如下:
其实摄像头传感器本质上只有一个,摄像头拍摄到的RGB图像,经过各种图像识别算法,就能转换成语义分割、实例分割、深度图等。但是Carla比较人性化,直接将各种图像识别的算法做成了不同种类的摄像头传感器模型,方便开发人员调用,直接拿到各种算法结果的真值。
下面简单记录下Carla种创建这6种摄像头的过程:
第一步:在仿真世界中创建主车。
# 创建一个客户端,连接到服务器端口
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
# 获取当前的仿真世界
world = client.get_world()
# 获取当前世界中的蓝图库
blueprint_library = world.get_blueprint_library()
# 从蓝图库中筛选出来特斯拉的‘model3’ 这个车车
bp = blueprint_library.filter('model3')[0]
print("the vehicle blueprint:", bp)
# 从地图中获取生成点
spawn_points = world.get_map().get_spawn_points()
# 利用车辆蓝图和地图生成点,创建车辆
vehicle_ego = world.spawn_actor(bp, spawn_points[1])
# 设置车辆为自动驾驶模式
vehicle_ego.set_autopilot(True)
# 将车辆加入参与者列表,方便后期统一删除
actor_list.append(vehicle_ego)
第二步:在主车上创建各种摄像头。
# 从蓝图库中筛选出来‘camera’蓝图,查看有哪些摄像头模型可以使用
camera_bp_list = blueprint_library.filter('camera')
for camera_bp_i in camera_bp_list:
print("found sensor, id:", camera_bp_i.id)
# 创建一个坐标位置
sensor_location = carla.Transform(carla.Location(x=-4, z=2))
image_size_x = 400
image_size_y = 300
# 创建一个rgb摄像头传感器到主车上
bp_camera_rgb = blueprint_library.find('sensor.camera.rgb')
bp_camera_rgb.set_attribute('image_size_x', str(image_size_x))
bp_camera_rgb.set_attribute('image_size_y', str(image_size_y))
my_camera_rgb = world.spawn_actor(bp_camera_rgb, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_rgb)
# 创建一个semantic摄像头传感器到主车上
bp_camera_sem = blueprint_library.find('sensor.camera.semantic_segmentation')
bp_camera_sem.set_attribute('image_size_x', str(image_size_x))
bp_camera_sem.set_attribute('image_size_y', str(image_size_y))
my_camera_sem = world.spawn_actor(bp_camera_sem, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_sem)
# 创建一个instance摄像头传感器到主车上
bp_camera_ins = blueprint_library.find('sensor.camera.instance_segmentation')
bp_camera_ins.set_attribute('image_size_x', str(image_size_x))
bp_camera_ins.set_attribute('image_size_y', str(image_size_y))
my_camera_ins = world.spawn_actor(bp_camera_ins, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_ins)
# 创建一个depth摄像头传感器到主车上
bp_camera_dep = blueprint_library.find('sensor.camera.depth')
bp_camera_dep.set_attribute('image_size_x', str(image_size_x))
bp_camera_dep.set_attribute('image_size_y', str(image_size_y))
my_camera_dep = world.spawn_actor(bp_camera_dep, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_dep)
# 创建一个dvs摄像头传感器到主车上
bp_camera_dvs = blueprint_library.find('sensor.camera.dvs')
bp_camera_dvs.set_attribute('image_size_x', str(image_size_x))
bp_camera_dvs.set_attribute('image_size_y', str(image_size_y))
my_camera_dvs = world.spawn_actor(bp_camera_dvs, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_dvs)
# 创建一个optical_flow摄像头传感器到主车上
bp_camera_opt = blueprint_library.find('sensor.camera.optical_flow')
bp_camera_opt.set_attribute('image_size_x', str(image_size_x))
bp_camera_opt.set_attribute('image_size_y', str(image_size_y))
my_camera_opt = world.spawn_actor(bp_camera_opt, sensor_location, attach_to=vehicle_ego)
actor_list.append(my_camera_opt)
第三步、获取各种摄像头的仿真结果。
image_w = bp_camera_rgb.get_attribute("image_size_x").as_int()
image_h = bp_camera_rgb.get_attribute("image_size_y").as_int()
image_size = (image_h, image_w, 4)
sensor_data = {"image_rgb": np.zeros(image_size),
"image_sem": np.zeros(image_size),
"image_ins": np.zeros(image_size),
"image_dep": np.zeros(image_size),
"image_dvs": np.zeros(image_size),
"image_opt": np.zeros(image_size)} # init
my_camera_rgb.listen(lambda image: callback_camera_rgb(image, sensor_data))
my_camera_sem.listen(lambda image: callback_camera_sem(image, sensor_data))
my_camera_ins.listen(lambda image: callback_camera_ins(image, sensor_data))
my_camera_dep.listen(lambda image: callback_camera_dep(image, sensor_data))
my_camera_dvs.listen(lambda image: callback_camera_dvs(image, sensor_data))
my_camera_opt.listen(lambda image: callback_camera_opt(image, sensor_data))
第四步、创建opencv窗口,显示各种传感器数据。
window_name = "li-man-man: Camera Image Display"
cv2.namedWindow(window_name, cv2.WINDOW_AUTOSIZE)
# 初始化顯示窗口:黑色
# combine all camera data as one.
top_row = np.concatenate((sensor_data["image_rgb"],sensor_data["image_sem"],sensor_data["image_ins"]), axis=1)
low_row = np.concatenate((sensor_data["image_dep"],sensor_data["image_dvs"],sensor_data["image_opt"]), axis=1)
tiled = np.concatenate((top_row, low_row), axis=0)
cv2.imshow(window_name, tiled)
cv2.waitKey(1)
while True:
# sensor_data 在被listen不断更新,因此窗口在持续更新
top_row = np.concatenate((sensor_data["image_rgb"], sensor_data["image_sem"], sensor_data["image_ins"]), axis=1)
low_row = np.concatenate((sensor_data["image_dep"], sensor_data["image_dvs"], sensor_data["image_opt"]), axis=1)
tiled = np.concatenate((top_row, low_row), axis=0)
cv2.imshow(window_name, tiled)
# cv2.imshow(window_name, sensor_data["image_rgb"])
# print("tiled.shape:", tiled.shape)
if cv2.waitKey(1) == ord("q"): # 按‘q’退出窗口
break
cv2.destroyAllWindows()
ok,上述代码组合起来运行,就是下面视频的效果啦:
代码真的是好难调试呀。
能看到几个传感器都正常显示出图像来,真的是快哭了。
本文完。
① 全网独家视频课程
BEV感知、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、点云3D目标检测、目标跟踪、Occupancy、cuda与TensorRT模型部署、协同感知、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习)
视频官网:www.zdjszx.com② 国内首个自动驾驶学习社区
近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!
③【自动驾驶之心】技术交流群
自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)
④【自动驾驶之心】平台矩阵,欢迎联系我们!