import numpy as np # index,name,type(private/public),floorTexture room_label = [(0, 'LivingRoom', 1, "PublicArea",[220, 213, 205]), (1, 'MasterRoom', 0, "Bedroom",[138, 113, 91]), (2, 'Kitchen', 1, "FunctionArea",[244, 245, 247]), (3, 'Bathroom', 0, "FunctionArea",[224, 225, 227]), (4, 'DiningRoom', 1, "FunctionArea",[200, 193, 185]), (5, 'ChildRoom', 0, "Bedroom",[198, 173, 151]), (6, 'StudyRoom', 0, "Bedroom",[178, 153, 131]), (7, 'SecondRoom', 0, "Bedroom",[158, 133, 111]), (8, 'GuestRoom', 0, "Bedroom",[189, 172, 146]), (9, 'Balcony', 1, "PublicArea",[244, 237, 224]), (10, 'Entrance', 1, "PublicArea",[238, 235, 230]), (11, 'Storage', 0, "PublicArea",[226, 220, 206]), (12, 'Wall-in', 0, "PublicArea",[226, 220, 206]), (13, 'External', 0, "External",[255, 255, 255]), (14, 'ExteriorWall', 0, "ExteriorWall",[0, 0, 0]), (15, 'FrontDoor', 0, "FrontDoor",[255,255,0]), (16, 'InteriorWall', 0, "InteriorWall",[128,128,128]), (17, 'InteriorDoor', 0, "InteriorDoor",[255,255,255])] # color palette for nyu40 labels def create_color_palette(): return [ (0, 0, 0), (174, 199, 232), # wall (152, 223, 138), # floor (31, 119, 180), # cabinet (255, 187, 120), # bed (188, 189, 34), # chair (140, 86, 75), # sofa (255, 152, 150), # table (214, 39, 40), # door (197, 176, 213), # window (148, 103, 189), # bookshelf (196, 156, 148), # picture (23, 190, 207), # counter (178, 76, 76), (247, 182, 210), # desk (66, 188, 102), (219, 219, 141), # curtain (140, 57, 197), (202, 185, 52), (51, 176, 203), (200, 54, 131), (92, 193, 61), (78, 71, 183), (172, 114, 82), (255, 127, 14), # refrigerator (91, 163, 138), (153, 98, 156), (140, 153, 101), (158, 218, 229), # shower curtain (100, 125, 154), (178, 127, 135), (120, 185, 128), (146, 111, 194), (44, 160, 44), # toilet (112, 128, 144), # sink (96, 207, 209), (227, 119, 194), # bathtub (213, 92, 176), (94, 106, 211), (82, 84, 163), # otherfurn (100, 85, 144) ] color_palette = create_color_palette()[1:] semantics_cmap = { 'living room': '#e6194b',#[230,25,75] 'kitchen': '#3cb44b',#[60,180,75] 'bedroom': '#ffe119',#[255,225,25] 'bathroom': '#0082c8',#[0,130,200] 'balcony': '#f58230',#[245,130,48] 'corridor': '#911eb4',#[145,30,180] 'dining room': '#46f0f0',#[70,240,240] 'study': '#f032e6',#[240,50,230] 'studio': '#d2f53c',#[210,245,60] 'store room': '#fabebe',#[250,190,190] 'garden': '#008080',#[0,128,128] 'laundry room': '#e6beff',#[230,190,255] 'office': '#aa6e28',#[170,110,40] 'basement': '#fffac8',#[255,250,200] 'garage': '#800000',#[128,0,0] 'undefined': '#aaffc3',#[170,255,195] 'door': '#808000',#[128,128,0] 'window': '#ffd7b4',#[255,215,180] 'outwall': '#000000',#[0,0,0] } colormap_255 = [ [230, 25, 75],#LivingRoom [ 60, 180, 75],#MasterRoom [170, 255, 195],#Kitchen [ 0, 130, 200],#Bathroom [245, 130, 48],#DiningRoom [145, 30, 180],#ChildRoom [ 70, 240, 240],#StudyRoom [240, 50, 230],#SecondRoom [210, 245, 60],#GuestRoom [250, 190, 190],#Balcony [ 0, 128, 128],#Entrance [230, 190, 255],#Storage [170, 110, 40],#Wall-in [255, 255, 255],#External [128, 0, 0],#ExteriorWall [255, 225, 25],#FrontDoor [128, 128, 128],#InteriorWall [255, 255, 255],#InteriorDoor #[255, 215, 180], [ 0, 0, 128], [128, 128, 0], [255, 255, 255], [ 0, 0, 0] ] cmaps = { 'nyu40': color_palette, 'semantics': semantics_cmap, '255': colormap_255 } category = [category for category in room_label if category[1] not in set(['External', 'ExteriorWall', 'FrontDoor', 'InteriorWall', 'InteriorDoor'])] num_category = len(category) pixel2length = 18/256 def label2name(label=0): if label < 0 or label > 17: raise Exception("Invalid label!", label) else: return room_label[label][1] def label2index(label=0): if label < 0 or label > 17: raise Exception("Invalid label!", label) else: return label def index2label(index=0): if index < 0 or index > 17: raise Exception("Invalid index!", index) else: return index def compute_centroid(mask): sum_h = 0 sum_w = 0 count = 0 shape_array = mask.shape for h in range(shape_array[0]): for w in range(shape_array[1]): if mask[h, w] != 0: sum_h += h sum_w += w count += 1 return (sum_h//count, sum_w//count) def log(file, msg='', is_print=True): if is_print: print(msg) file.write(msg + '\n') file.flush() def collide2d(bbox1, bbox2, th=0): return not( (bbox1[0]-th > bbox2[2]) or (bbox1[2]+th < bbox2[0]) or (bbox1[1]-th > bbox2[3]) or (bbox1[3]+th < bbox2[1]) ) # # def rot90_2D(pts,k=1,cnt=np.array([127.5,127.5])): # ang = k*np.pi/2 # R = np.array([[np.cos(ang),np.sin(ang)],[-np.sin(ang),np.cos(ang)]]) # return np.dot(pts-cnt,R)+cnt # def fliplr_2D(pts,size=255): # return np.stack([pts[:,0],size-pts[:,1]],1) # # def align_image(image,rot_old,rot_new=0): # k = np.ceil((rot_old-rot_new+2*np.pi)%(2*np.pi)/(np.pi/4))//2 # return np.rot90(image,k) # # def align_box(box,rot_old,rot_new=0): # k = np.ceil((rot_old-rot_new+2*np.pi)%(2*np.pi)/(np.pi/4))//2 # box = rot90_2D(box.reshape(-1,2),k).reshape(-1,4) # return np.concatenate([np.minimum(box[:,:2],box[:,2:]),np.maximum(box[:,:2],box[:,2:])],-1)#.round().astype(int) # # def fliplr_box(box,size=255): # box=fliplr_2D(box.reshape(-1,2),size=size).reshape(-1,4) # return np.concatenate([np.minimum(box[:,:2],box[:,2:]),np.maximum(box[:,:2],box[:,2:])],-1)#.round().astype(int) def rot90_2D(pts, k=1, cnt=np.array([127.5, 127.5])): ang = k * np.pi / 2 R = np.array([[np.cos(ang), np.sin(ang)], [-np.sin(ang), np.cos(ang)]]) return np.dot(pts - cnt, R) + cnt def fliplr_2D(pts, size=255): return np.stack([pts[:, 0], size - pts[:, 1]], 1) def align_image(image, rot_old, rot_new=0): k = np.ceil((rot_old - rot_new + 2 * np.pi) % (2 * np.pi) / (np.pi / 4)) // 2 return np.rot90(image, k) def align_box(box, rot_old, rot_new=0): k = np.ceil((rot_old - rot_new + 2 * np.pi) % (2 * np.pi) / (np.pi / 4)) // 2 box = rot90_2D(box.reshape(-1, 2), k).reshape(-1, 4) return np.concatenate([np.minimum(box[:, :2], box[:, 2:]), np.maximum(box[:, :2], box[:, 2:]) + 1], -1).round().astype(int) def align_points(points, rot_old, rot_new=0): k = np.ceil((rot_old - rot_new + 2 * np.pi) % (2 * np.pi) / (np.pi / 4)) // 2 points = rot90_2D(points, k) return points.round().astype(int) def graph2labels(graph): edges = graph.edges return sorted([ tuple(sorted((room_label[graph.nodes[u]['category']][1], room_label[graph.nodes[v]['category']][1]))) for u,v in edges ]) def graph2labels_withtype(graph): edges = graph.edges(data=True) return sorted([ ('acc' if d['type'] else 'adj', *sorted( (room_label[graph.nodes[u]['category']][1], room_label[graph.nodes[v]['category']][1])) ) for u,v,d in edges ]) def graph2functions(graph): edges = graph.edges return sorted([ tuple(sorted((graph.nodes[u]['function'], graph.nodes[v]['function']))) for u,v in edges ]) def graph2functions_withtype(graph): edges = graph.edges(data=True) return sorted([ ('acc' if d['type'] else 'adj', *sorted( (graph.nodes[u]['function'], graph.nodes[v]['function'])) ) for u,v,d in edges ]) def counter2labels(counter): return sorted({ room_label[key][1]:value for key,value in counter.items() }.items()) def counter2functions(counter): counter_new = { room_label[key][1]:value for key,value in counter.items() } counter_new['Bedroom']=0 for key in counter: if room_label[key][3]=='Bedroom': counter_new['Bedroom']+=counter_new.pop(room_label[key][1]) return sorted(counter_new.items()) def point_box_relation(u,vbox): uy,ux = u vy0, vx0, vy1, vx1 = vbox if (ux