maudzung / SFA3D

Super Fast and Accurate 3D Object Detection based on 3D LiDAR Point Clouds (The PyTorch implementation)
https://github.com/maudzung/Super-Fast-Accurate-3D-Object-Detection
MIT License
1k stars 271 forks source link

question about the hm_main_center in the model #68

Closed blueskych closed 2 years ago

blueskych commented 2 years ago

Hi maudzung, I want to ask: 1) about the funcion 'build_targets' in kitti_dataset.py, if the cls_id in my dataset are all >=0, the hm_main_center will always be 0. So what is the hm_main_center used for ? and why do you set the "hm_main_center[ignore_ids, center_int[1], center_int[0]] = 0.9999" when the clsid is -1 which should be filterd or discard by us. 2) what is the function gen_hm_radius used for ? I passed the heatmap to it and it return the heatmap which is I passed.

the code is as below: def build_targets(self, labels, hflipped): minX = cnf.boundary['minX'] maxX = cnf.boundary['maxX'] minY = cnf.boundary['minY'] maxY = cnf.boundary['maxY'] minZ = cnf.boundary['minZ'] maxZ = cnf.boundary['maxZ']

    num_objects = min(len(labels), self.max_objects)
    hm_l, hm_w = self.hm_size

    hm_main_center = np.zeros((self.num_classes, hm_l, hm_w), dtype=np.float32)
    cen_offset = np.zeros((self.max_objects, 2), dtype=np.float32)
    direction = np.zeros((self.max_objects, 2), dtype=np.float32)
    z_coor = np.zeros((self.max_objects, 1), dtype=np.float32)
    dimension = np.zeros((self.max_objects, 3), dtype=np.float32)

    indices_center = np.zeros((self.max_objects), dtype=np.int64)
    obj_mask = np.zeros((self.max_objects), dtype=np.uint8)

    for k in range(num_objects):
        cls_id, x, y, z, h, w, l, yaw = labels[k]
        cls_id = int(cls_id)
        # Invert yaw angle
        yaw = -yaw
        if not ((minX <= x <= maxX) and (minY <= y <= maxY) and (minZ <= z <= maxZ)):
            continue
        if (h <= 0) or (w <= 0) or (l <= 0):
            continue

        bbox_l = l / cnf.bound_size_x * hm_l
        bbox_w = w / cnf.bound_size_y * hm_w
        #change fro compute_radius to compute_radius_v2
        radius = compute_radius((math.ceil(bbox_l), math.ceil(bbox_w)))
        radius = max(0, int(radius))

        center_y = (x - minX) / cnf.bound_size_x * hm_l  # x --> y (invert to 2D image space)
        center_x = (y - minY) / cnf.bound_size_y * hm_w  # y --> x
        center = np.array([center_x, center_y], dtype=np.float32)

        if hflipped:
            center[0] = hm_w - center[0] - 1

        center_int = center.astype(np.int32)
        if cls_id < 0:
            ignore_ids = [_ for _ in range(self.num_classes)] if cls_id == - 1 else [- cls_id - 2]
            # Consider to make mask ignore
            for cls_ig in ignore_ids:
                gen_hm_radius(hm_main_center[cls_ig], center_int, radius)
            hm_main_center[ignore_ids, center_int[1], center_int[0]] = 0.9999
            continue

        # Generate heatmaps for main center
        gen_hm_radius(hm_main_center[cls_id], center, radius)
        # Index of the center
        indices_center[k] = center_int[1] * hm_w + center_int[0]

        # targets for center offset
        cen_offset[k] = center - center_int

        # targets for dimension
        dimension[k, 0] = h
        dimension[k, 1] = w
        dimension[k, 2] = l

        # targets for direction
        direction[k, 0] = math.sin(float(yaw))  # im
        direction[k, 1] = math.cos(float(yaw))  # re
        # im -->> -im
        if hflipped:
            direction[k, 0] = - direction[k, 0]

        # targets for depth
        z_coor[k] = z - minZ

        # Generate object masks
        obj_mask[k] = 1

    targets = {
        'hm_cen': hm_main_center,
        'cen_offset': cen_offset,
        'direction': direction,
        'z_coor': z_coor,
        'dim': dimension,
        'indices_center': indices_center,
        'obj_mask': obj_mask,
    }

    return targets