大家好呀,我是李慢慢。
本周开始学习一些关于图像识别的东西。
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()
深信科创:致力于自动驾驶工业软件
深信科创是一家专注于提供自动驾驶仿真及智慧交通解决方案的国家高新技术企业。公司基于人工智能、软件测试、数字孪生与大数据等技术,一直致力于自动驾驶领域的研发和探索,拥有一支高素质的研发团队,自主研发了自动驾驶仿真及数据闭环工具链SYNKROTRON® Oasis产品系列,能够提供高精度传感器模型、动力学模型及感知级交通环境仿真解决方案等,客户可以在仿真平台上对自动驾驶系统开展大规模的仿真测试和模型训练,提前识别自动驾驶系统缺陷、降低实车测试成本、消除场景端落地的安全隐患,加速自动驾驶技术在场景端的安全落地。
更多学习资料、产品试用和社群交流请联系微信:synkrotron1
预约产品试用/技术交流:
手机端: https://synkrotron.ai/vue3/dist/index.html#/appoint_mobile
电脑端: https://synkrotron.ai/vue3/dist/index.html#/appoint_desktop