Semana 9: Segmentación Verdadera
Esta semana se ha estudiado la segmentación verdadera en CARLA y su implementación en el script o3d-lidarViz-manual.py.
o3d-lidarViz-manual-segmentation.py
Se ha añadido el spawn de la cámara de segmentación semántica, el procesamiento de las imágenes y las etiquetas que representan a cada color.
spawn_vehicle_lidar_camera_segmentation()
Simplemente se ha añadido la cámara de segmentación a la función de spawn.
def spawn_vehicle_lidar_camera_segmentation(world, bp, traffic_manager, delta):
vehicle_bp = bp.filter('vehicle.*')[0]
spawn_points = world.get_map().get_spawn_points()
spawn_point = random.choice(spawn_points)
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
# Configuración de sensor LiDAR
lidar_bp = bp.find('sensor.lidar.ray_cast')
lidar_bp.set_attribute('range', '100')
lidar_bp.set_attribute('rotation_frequency', str(1 / delta))
lidar_bp.set_attribute('channels', '64')
lidar_bp.set_attribute('points_per_second', '500000')
lidar_position = carla.Transform(carla.Location(x=-0.5, z=1.8))
lidar = world.spawn_actor(lidar_bp, lidar_position, attach_to=vehicle)
# Configuración de cámara RGB
camera_bp = bp.find('sensor.camera.rgb')
camera_bp.set_attribute('image_size_x', '800')
camera_bp.set_attribute('image_size_y', '600')
camera_bp.set_attribute('fov', '90')
camera_transform = carla.Transform(carla.Location(x=-4.0, z=2.5))
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle)
# Configuración de cámara de segmentación semántica
segmentation_bp = bp.find('sensor.camera.semantic_segmentation')
segmentation_bp.set_attribute('image_size_x', '800')
segmentation_bp.set_attribute('image_size_y', '600')
segmentation_bp.set_attribute('fov', '90')
segmentation_transform = carla.Transform(carla.Location(x=1, z=1.5))
segmentation_camera = world.spawn_actor(segmentation_bp, segmentation_transform, attach_to=vehicle)
vehicle.set_autopilot(True, traffic_manager.get_port())
return vehicle, lidar, camera, segmentation_camera
display_labels()
Se ha creado esta función para que se muestre por pantalla que color le corresponde a cada objeto.
# Diccionario de etiquetas y colores de segmentación
LABELS = {
0: ("Desconocido", (0, 0, 0)),
1: ("Edificio", (70, 70, 70)),
2: ("Valla", (100, 40, 40)),
3: ("Otro", (55, 90, 80)),
4: ("Peatón", (220, 20, 60)),
5: ("Señalización", (153, 153, 153)),
6: ("Semáforo", (250, 170, 30)),
7: ("Vegetación", (107, 142, 35)),
8: ("Terreno", (152, 251, 152)),
9: ("Cielo", (70, 130, 180)),
10: ("Acera", (244, 35, 232)),
11: ("Carretera", (128, 64, 128)),
12: ("Barandilla", (190, 153, 153)),
13: ("Carril-bici", (0, 0, 230)),
14: ("Coche", (0, 0, 142)),
15: ("Motocicleta", (0, 0, 70)),
16: ("Bicicleta", (119, 11, 32))
}
def display_labels(display_surface):
# Inicializar la fuente para dibujar texto
font = pygame.font.SysFont("Arial", 18)
y_offset = 10 # Posición vertical inicial para el texto
for label_id, (label_name, color) in LABELS.items():
# Crear una superficie para cada etiqueta
label_surface = font.render(f"{label_name}", True, color)
# Dibujar un pequeño rectángulo de color al lado de cada etiqueta
color_rect = pygame.Rect(10, y_offset, 20, 20)
pygame.draw.rect(display_surface, color, color_rect)
# Mostrar la etiqueta junto al rectángulo
display_surface.blit(label_surface, (40, y_offset))
y_offset += 30 # Mover hacia abajo para la siguiente etiqueta
segmentation_callback()
Se encarga de procesas las imágenes que se reciben de la cámara de segmentación para mostrarlas por pantalla y usa la función display_labels() para mostrar las etiquetas por pantalla.
def segmentation_callback(image, display_surface):
# Convertir la imagen de segmentación directamente usando CityScapesPalette
image.convert(carla.ColorConverter.CityScapesPalette)
# Convertir los datos de la imagen a un array numpy
array = np.frombuffer(image.raw_data, dtype=np.uint8)
array = np.reshape(array, (image.height, image.width, 4))
# Extraer los canales RGB y convertir de BGRA a RGB
seg_array = array[:, :, :3]
seg_array = seg_array[:, :, ::-1]
# Crear la superficie de Pygame y mostrarla en la sección inferior de la pantalla
surface = pygame.surfarray.make_surface(seg_array.swapaxes(0, 1))
display_surface.blit(surface, (0, 0))
# Llamar a la función para mostrar las etiquetas
display_labels(display_surface)
Resultado