Spaces:
Runtime error
Runtime error
| 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<vx0 and uy<=vy0) or (ux==vx0 and uy==vy0): | |
| relation = 'left-above' | |
| elif (vx0<=ux<vx1 and uy<=vy0): | |
| relation = 'above' | |
| elif (vx1<=ux and uy<vy0) or (ux==vx1 and uy==vy0): | |
| relation = 'right-above' | |
| elif (vx1<=ux and vy0<=uy<vy1): | |
| relation = 'right-of' | |
| elif (vx1<ux and vy1<=uy) or (ux==vx1 and uy==vy1): | |
| relation = 'right-below' | |
| elif (vx0<ux<=vx1 and vy1<=uy): | |
| relation = 'below' | |
| elif (ux<=vx0 and vy1<uy) or (ux==vx0 and uy==vy1): | |
| relation = 'left-below' | |
| elif(ux<=vx0 and vy0<uy<=vy1): | |
| relation = "left-of" | |
| elif(vx0<ux<vx1 and vy0<uy<vy1): | |
| relation = "inside" | |
| return relation | |
| def get_vocab(): | |
| room_label = [(0, 'LivingRoom', 1, "PublicArea"), | |
| (1, 'MasterRoom', 0, "Bedroom"), | |
| (2, 'Kitchen', 1, "FunctionArea"), | |
| (3, 'Bathroom', 0, "FunctionArea"), | |
| (4, 'DiningRoom', 1, "FunctionArea"), | |
| (5, 'ChildRoom', 0, "Bedroom"), | |
| (6, 'StudyRoom', 0, "Bedroom"), | |
| (7, 'SecondRoom', 0, "Bedroom"), | |
| (8, 'GuestRoom', 0, "Bedroom"), | |
| (9, 'Balcony', 1, "PublicArea"), | |
| (10, 'Entrance', 1, "PublicArea"), | |
| (11, 'Storage', 0, "PublicArea"), | |
| (12, 'Wall-in', 0, "PublicArea"), | |
| (13, 'External', 0, "External"), | |
| (14, 'Internal', 0, "Internal")] | |
| predicates = [ | |
| 'left-above', | |
| 'left-below', | |
| 'left-of', | |
| 'above', | |
| 'inside', | |
| 'surrounding', | |
| 'below', | |
| 'right-of', | |
| 'right-above', | |
| 'right-below' | |
| ] | |
| door_pos = [ | |
| 'nan', | |
| 'bottom', | |
| 'bottom-right','right-bottom', | |
| 'right', | |
| 'right-top','top-right', | |
| 'top', | |
| 'top-left','left-top', | |
| 'left', | |
| 'left-bottom','bottom-left' | |
| ] | |
| vocab = { | |
| 'object_name_to_idx':{}, | |
| 'object_to_idx':{}, | |
| 'object_idx_to_name':[], | |
| 'pred_idx_to_name':[], | |
| 'pred_name_to_idx':{}, | |
| 'door_idx_to_name':[], | |
| 'door_name_to_idx':{} | |
| } | |
| vocab['object_name_to_idx'] = { label:index for index,label,_,_ in room_label[:] } | |
| vocab['object_to_idx'] = {str(index):index for index,lable,_,_ in room_label} | |
| vocab['object_idx_to_name'] = [label for index,label,_,_ in room_label] | |
| vocab['pred_idx_to_name'] = [p for i,p in enumerate(predicates)] | |
| vocab['pred_name_to_idx'] = {p:i for i,p in enumerate(predicates)} | |
| vocab['door_idx_to_name'] = [p for i,p in enumerate(door_pos)] | |
| vocab['door_name_to_idx'] = {p:i for i,p in enumerate(door_pos)} | |
| return vocab | |
| vocab = get_vocab() | |