Spaces:
Build error
Build error
| """ | |
| @date: 2021/6/29 | |
| @description: | |
| The method with "_floorplan" suffix is only for comparison, which is used for calculation in LED2-net. | |
| However, the floorplan is affected by show_radius. Setting too large will result in the decrease of accuracy, | |
| and setting too small will result in the failure of calculation beyond the range. | |
| """ | |
| import numpy as np | |
| from shapely.geometry import Polygon | |
| def calc_inter_area(dt_xz, gt_xz): | |
| """ | |
| :param dt_xz: Prediction boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :param gt_xz: Ground truth boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :return: | |
| """ | |
| dt_polygon = Polygon(dt_xz) | |
| gt_polygon = Polygon(gt_xz) | |
| dt_area = dt_polygon.area | |
| gt_area = gt_polygon.area | |
| inter_area = dt_polygon.intersection(gt_polygon).area | |
| return dt_area, gt_area, inter_area | |
| def calc_IoU_2D(dt_xz, gt_xz): | |
| """ | |
| :param dt_xz: Prediction boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :param gt_xz: Ground truth boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :return: | |
| """ | |
| dt_area, gt_area, inter_area = calc_inter_area(dt_xz, gt_xz) | |
| iou_2d = inter_area / (gt_area + dt_area - inter_area) | |
| return iou_2d | |
| def calc_IoU_3D(dt_xz, gt_xz, dt_height, gt_height): | |
| """ | |
| :param dt_xz: Prediction boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :param gt_xz: Ground truth boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :param dt_height: | |
| :param gt_height: | |
| :return: | |
| """ | |
| dt_area, gt_area, inter_area = calc_inter_area(dt_xz, gt_xz) | |
| dt_volume = dt_area * dt_height | |
| gt_volume = gt_area * gt_height | |
| inter_volume = inter_area * min(dt_height, gt_height) | |
| iou_3d = inter_volume / (dt_volume + gt_volume - inter_volume) | |
| return iou_3d | |
| def calc_IoU(dt_xz, gt_xz, dt_height, gt_height): | |
| """ | |
| :param dt_xz: Prediction boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :param gt_xz: Ground truth boundaries can also be corners, format: [[x1, z1], [x2, z2], ...] | |
| :param dt_height: | |
| :param gt_height: | |
| :return: | |
| """ | |
| dt_area, gt_area, inter_area = calc_inter_area(dt_xz, gt_xz) | |
| iou_2d = inter_area / (gt_area + dt_area - inter_area) | |
| dt_volume = dt_area * dt_height | |
| gt_volume = gt_area * gt_height | |
| inter_volume = inter_area * min(dt_height, gt_height) | |
| iou_3d = inter_volume / (dt_volume + gt_volume - inter_volume) | |
| return iou_2d, iou_3d | |
| def calc_Iou_height(dt_height, gt_height): | |
| return min(dt_height, gt_height) / max(dt_height, gt_height) | |
| # the following is for testing only | |
| def calc_inter_area_floorplan(dt_floorplan, gt_floorplan): | |
| intersect = np.sum(np.logical_and(dt_floorplan, gt_floorplan)) | |
| dt_area = np.sum(dt_floorplan) | |
| gt_area = np.sum(gt_floorplan) | |
| return dt_area, gt_area, intersect | |
| def calc_IoU_2D_floorplan(dt_floorplan, gt_floorplan): | |
| dt_area, gt_area, inter_area = calc_inter_area_floorplan(dt_floorplan, gt_floorplan) | |
| iou_2d = inter_area / (gt_area + dt_area - inter_area) | |
| return iou_2d | |
| def calc_IoU_3D_floorplan(dt_floorplan, gt_floorplan, dt_height, gt_height): | |
| dt_area, gt_area, inter_area = calc_inter_area_floorplan(dt_floorplan, gt_floorplan) | |
| dt_volume = dt_area * dt_height | |
| gt_volume = gt_area * gt_height | |
| inter_volume = inter_area * min(dt_height, gt_height) | |
| iou_3d = inter_volume / (dt_volume + gt_volume - inter_volume) | |
| return iou_3d | |
| def calc_IoU_floorplan(dt_floorplan, gt_floorplan, dt_height, gt_height): | |
| dt_area, gt_area, inter_area = calc_inter_area_floorplan(dt_floorplan, gt_floorplan) | |
| iou_2d = inter_area / (gt_area + dt_area - inter_area) | |
| dt_volume = dt_area * dt_height | |
| gt_volume = gt_area * gt_height | |
| inter_volume = inter_area * min(dt_height, gt_height) | |
| iou_3d = inter_volume / (dt_volume + gt_volume - inter_volume) | |
| return iou_2d, iou_3d | |
| if __name__ == '__main__': | |
| from visualization.floorplan import draw_floorplan, draw_iou_floorplan | |
| from visualization.boundary import draw_boundaries, corners2boundaries | |
| from utils.conversion import uv2xyz | |
| from utils.height import height2ratio | |
| # dummy data | |
| dt_floor_corners = np.array([[0.2, 0.7], | |
| [0.4, 0.7], | |
| [0.6, 0.7], | |
| [0.8, 0.7]]) | |
| dt_height = 2.8 | |
| gt_floor_corners = np.array([[0.3, 0.7], | |
| [0.5, 0.7], | |
| [0.7, 0.7], | |
| [0.9, 0.7]]) | |
| gt_height = 3.2 | |
| dt_xz = uv2xyz(dt_floor_corners)[..., ::2] | |
| gt_xz = uv2xyz(gt_floor_corners)[..., ::2] | |
| dt_floorplan = draw_floorplan(dt_xz, show=False, show_radius=1) | |
| gt_floorplan = draw_floorplan(gt_xz, show=False, show_radius=1) | |
| # dt_floorplan = draw_floorplan(dt_xz, show=False, show_radius=2) | |
| # gt_floorplan = draw_floorplan(gt_xz, show=False, show_radius=2) | |
| iou_2d, iou_3d = calc_IoU_floorplan(dt_floorplan, gt_floorplan, dt_height, gt_height) | |
| print('use floor plan image:', iou_2d, iou_3d) | |
| iou_2d, iou_3d = calc_IoU(dt_xz, gt_xz, dt_height, gt_height) | |
| print('use floor plan polygon:', iou_2d, iou_3d) | |
| draw_iou_floorplan(dt_xz, gt_xz, show=True, iou_2d=iou_2d, iou_3d=iou_3d) | |
| pano_bd = draw_boundaries(np.zeros([512, 1024, 3]), corners_list=[dt_floor_corners], | |
| boundary_color=[0, 0, 1], ratio=height2ratio(dt_height), draw_corners=False) | |
| pano_bd = draw_boundaries(pano_bd, corners_list=[gt_floor_corners], | |
| boundary_color=[0, 1, 0], ratio=height2ratio(gt_height), show=True, draw_corners=False) | |