KITTI-360实例分割数据集车辆实例计数异常问题求助
KITTI-360实例分割车辆计数问题排查
1. 实例ID解码错误
KITTI-360的实例分割图采用RGB三通道编码实例ID,每个像素的实际实例ID需要将cv2默认读入的BGR通道值合并计算,公式为:
instance_id = pixel[2] << 16 | pixel[1] << 8 | pixel[0]
你的代码直接输出三通道像素值,未解码成实际实例ID,自然无法区分不同车辆实例。
2. 坐标顺序可能混淆
画图软件的坐标通常是(x, y)(横向为x,纵向为y),但cv2数组的索引顺序是(y, x)(行对应y,列对应x)。如果你在画图里记录的是(x, y),代码里的索引需对应为(y, x),否则会取到非目标区域的像素。
3. 未过滤车辆类实例
KITTI-360的实例ID包含类别信息,实例ID的高8位对应类别ID(车辆类的类别ID通常为10,需参考官方文档确认版本)。统计车辆实例前,需先解码实例ID并过滤出车辆类。
修正后的测试代码
import os import numpy as np import cv2 CWD = os.getcwd() instance_folder = os.path.join(CWD, 'image_my_data', "instance") instance_image_path = os.path.join(instance_folder, "0000004402.png") # 读取实例图,保留原始通道信息 instance_image_array = cv2.imread(instance_image_path, cv2.IMREAD_UNCHANGED) # 定义像素坐标:确认是(y, x)顺序,对应画图软件的(x, y)转(y, x) pixel_location_1 = (210, 815) pixel_location_2 = (200, 715) # 解码实例ID和类别ID def get_class_and_instance(pixel): # BGR转实例ID:pixel格式为[B, G, R] instance_id = pixel[2] << 16 | pixel[1] << 8 | pixel[0] class_id = (instance_id >> 16) & 0xFF # 高8位为类别ID return class_id, instance_id # 测试单个像素 pixel1 = instance_image_array[pixel_location_1[0], pixel_location_1[1]] class1, inst1 = get_class_and_instance(pixel1) print(f"像素(210,815):类别ID={class1},实例ID={inst1}") pixel2 = instance_image_array[pixel_location_2[0], pixel_location_2[1]] class2, inst2 = get_class_and_instance(pixel2) print(f"像素(200,715):类别ID={class2},实例ID={inst2}") # 统计整张图的车辆实例数量(优化版) vehicle_class_id = 10 # 向量化计算所有像素的实例ID和类别ID R = instance_image_array[..., 2] G = instance_image_array[..., 1] B = instance_image_array[..., 0] instance_ids = R << 16 | G << 8 | B class_ids = (instance_ids >> 16) & 0xFF # 过滤车辆类并统计唯一实例 vehicle_instances = instance_ids[class_ids == vehicle_class_id] unique_vehicle_instances = len(np.unique(vehicle_instances)) print(f"整张图车辆实例数量:{unique_vehicle_instances}")
内容的提问来源于stack exchange,提问作者programmer_04_03
相关产品推荐
相关产品推荐

