Zai
test
06db6e9
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()