Spaces:
Runtime error
Runtime error
from model.floorplan import * | |
from model.box_utils import * | |
from model.model import Model | |
import os | |
from model.utils import * | |
import Houseweb.views as vw | |
import numpy as np | |
import time | |
import math | |
import matlab.engine | |
global adjust,indxlist | |
adjust=False | |
def get_data(fp): | |
batch = list(fp.get_test_data()) | |
batch[0] = batch[0].unsqueeze(0).cuda() | |
batch[1] = batch[1].cuda() | |
batch[2] = batch[2].cuda() | |
batch[3] = batch[3].cuda() | |
batch[4] = batch[4].cuda() | |
return batch | |
def test(model,fp): | |
with torch.no_grad(): | |
batch = get_data(fp) | |
boundary,inside_box,rooms,attrs,triples = batch | |
model_out = model( | |
rooms, | |
triples, | |
boundary, | |
obj_to_img = None, | |
attributes = attrs, | |
boxes_gt= None, | |
generate = True, | |
refine = True, | |
relative = True, | |
inside_box=inside_box | |
) | |
boxes_pred, gene_layout, boxes_refine= model_out | |
boxes_pred = boxes_pred.detach() | |
boxes_pred = centers_to_extents(boxes_pred) | |
boxes_refine = boxes_refine.detach() | |
boxes_refine = centers_to_extents(boxes_refine) | |
gene_layout = gene_layout*boundary[:,:1] | |
gene_preds = torch.argmax(gene_layout.softmax(1).detach(),dim=1) | |
return boxes_pred.squeeze().cpu().numpy(),gene_preds.squeeze().cpu().double().numpy(),boxes_refine.squeeze().cpu().numpy() | |
def load_model(): | |
model = Model() | |
model.cuda(0) | |
model.load_state_dict( | |
torch.load('./model/model.pth', map_location={'cuda:0': 'cuda:0'})) | |
model.eval() | |
return model | |
def get_userinfo(userRoomID,adptRoomID): | |
start = time.clock() | |
global model | |
test_index = vw.testNameList.index(userRoomID.split(".")[0]) | |
test_data = vw.test_data[test_index] | |
# boundary | |
Boundary = test_data.boundary | |
boundary=[[float(x),float(y),float(z),float(k)] for x,y,z,k in list(Boundary)] | |
test_fp =FloorPlan(test_data) | |
train_index = vw.trainNameList.index(adptRoomID.split(".")[0]) | |
train_data = vw.train_data[train_index] | |
train_fp =FloorPlan(train_data,train=True) | |
fp_end = test_fp.adapt_graph(train_fp) | |
fp_end.adjust_graph() | |
return fp_end | |
def get_userinfo_adjust(userRoomID,adptRoomID,NewGraph): | |
global adjust,indxlist | |
test_index = vw.testNameList.index(userRoomID.split(".")[0]) | |
test_data = vw.test_data[test_index] | |
# boundary | |
Boundary = test_data.boundary | |
boundary=[[float(x),float(y),float(z),float(k)] for x,y,z,k in list(Boundary)] | |
test_fp =FloorPlan(test_data) | |
train_index = vw.trainNameList.index(adptRoomID.split(".")[0]) | |
train_data = vw.train_data[train_index] | |
train_fp =FloorPlan(train_data,train=True) | |
fp_end = test_fp.adapt_graph(train_fp) | |
fp_end.adjust_graph() | |
newNode = NewGraph[0] | |
newEdge = NewGraph[1] | |
oldNode = NewGraph[2] | |
temp = [] | |
for newindx, newrmname, newx, newy,scalesize in newNode: | |
for type, oldrmname, oldx, oldy, oldindx in oldNode: | |
if (int(newindx) == oldindx): | |
tmp=int(newindx), (newx - oldx), ( newy- oldy),float(scalesize) | |
temp.append(tmp) | |
newbox=[] | |
print(adjust) | |
if adjust==True: | |
oldbox = [] | |
for i in range(len(vw.boxes_pred)): | |
indxtmp=[vw.boxes_pred[i][0],vw.boxes_pred[i][1],vw.boxes_pred[i][2],vw.boxes_pred[i][3],vw.boxes_pred[i][0]] | |
oldbox.append(indxtmp) | |
if adjust==False: | |
indxlist=[] | |
oldbox=fp_end.data.box.tolist() | |
for i in range(len(oldbox)): | |
indxlist.append([oldbox[i][4]]) | |
indxlist=np.array(indxlist) | |
adjust=True | |
oldbox=fp_end.data.box.tolist() | |
# print("oldbox",oldbox) | |
# print(oldbox,"oldbox") | |
X=0 | |
Y=0 | |
for i in range(len(oldbox)): | |
X= X+(oldbox[i][2]-oldbox[i][0]) | |
Y= Y+(oldbox[i][3]-oldbox[i][1]) | |
x_ave=(X/len(oldbox))/2 | |
y_ave=(Y/len(oldbox))/2 | |
index_mapping = {} | |
# The room that already exists | |
# Move: Just by the distance | |
for newindx, tempx, tempy,scalesize in temp: | |
index_mapping[newindx] = len(newbox) | |
tmpbox=[] | |
scalesize = int(scalesize) | |
if scalesize<1: | |
scale = math.sqrt(scalesize) | |
scalex = (oldbox[newindx][2] - oldbox[newindx][0]) * (1 - scale) / 2 | |
scaley = (oldbox[newindx][3] - oldbox[newindx][1]) * (1 - scale) / 2 | |
tmpbox = [(oldbox[newindx][0] + tempx) + scalex, (oldbox[newindx][1] + tempy)+scaley, | |
(oldbox[newindx][2] + tempx) - scalex, (oldbox[newindx][3] + tempy) - scaley, oldbox[newindx][4]] | |
if scalesize == 1: | |
tmpbox = [(oldbox[newindx][0] + tempx) , (oldbox[newindx][1] + tempy) ,(oldbox[newindx][2] + tempx), (oldbox[newindx][3] + tempy), oldbox[newindx][4]] | |
if scalesize>1: | |
scale=math.sqrt(scalesize) | |
scalex = (oldbox[newindx][2] - oldbox[newindx][0]) * ( scale-1) / 2 | |
scaley = (oldbox[newindx][3] - oldbox[newindx][1]) * (scale-1) / 2 | |
tmpbox = [(oldbox[newindx][0] + tempx) - scalex, (oldbox[newindx][1] + tempy) - scaley, | |
(oldbox[newindx][2] + tempx) + scalex, (oldbox[newindx][3] + tempy) + scaley, oldbox[newindx][4]] | |
newbox.append(tmpbox) | |
# The room just added | |
# Move: The room node with the average size of the existing room | |
for newindx, newrmname, newx, newy,scalesize in newNode: | |
if int(newindx)>(len(oldbox)-1): | |
scalesize=int(scalesize) | |
index_mapping[int(newindx)] = (len(newbox)) | |
tmpbox=[] | |
if scalesize < 1: | |
scale = math.sqrt(scalesize) | |
scalex = x_ave * (1 - scale) / 2 | |
scaley = y_ave* (1 - scale) / 2 | |
tmpbox = [(newx-x_ave) +scalex,(newy-y_ave) +scaley,(newx+x_ave)-scalex,(newy+y_ave)-scaley,vocab['object_name_to_idx'][newrmname]] | |
if scalesize == 1: | |
tmpbox = [(newx - x_ave), (newy - y_ave), (newx + x_ave), (newy + y_ave),vocab['object_name_to_idx'][newrmname]] | |
if scalesize > 1: | |
scale = math.sqrt(scalesize) | |
scalex = x_ave * (scale - 1) / 2 | |
scaley = y_ave * (scale - 1) / 2 | |
tmpbox = [(newx-x_ave) - scalex, (newy-y_ave) - scaley,(newx+x_ave) + scalex, (newy+y_ave) + scaley,vocab['object_name_to_idx'][newrmname]] | |
print(scalesize) | |
newbox.append(tmpbox) | |
fp_end.data.box=np.array(newbox) | |
adjust_Edge=[] | |
for u, v in newEdge: | |
tmp=[index_mapping[int(u)],index_mapping[int(v)], 0] | |
adjust_Edge.append(tmp) | |
fp_end.data.edge=np.array(adjust_Edge) | |
rNode = fp_end.get_rooms(tensor=False) | |
rEdge = fp_end.get_triples(tensor=False)[:, [0, 2, 1]] | |
Edge = [[float(u), float(v), float(type2)] for u, v, type2 in rEdge] | |
s=time.clock() | |
boxes_pred, gene_layout, boxes_refeine = test(vw.model, fp_end) | |
e=time.clock() | |
print(' model test time: %s Seconds' % (e - s)) | |
boxes_pred = boxes_pred * 255 | |
fp_end.data.gene = gene_layout | |
rBox = boxes_pred[:] | |
Box = [[float(x), float(y), float(z), float(k)] for x, y, z, k in rBox] | |
boundary_mat = matlab.double(boundary) | |
rNode_mat = matlab.double(rNode.tolist()) | |
print("rNode.tolist()",rNode.tolist()) | |
Edge_mat = matlab.double(Edge) | |
Box_mat=matlab.double(Box) | |
fp_end.data.boundary =np.array(boundary) | |
fp_end.data.rType =np.array(rNode).astype(int) | |
fp_end.data.refineBox=np.array(Box) | |
fp_end.data.rEdge=np.array(Edge) | |
gene_mat=matlab.double(np.array(fp_end.data.gene).tolist()) | |
startcom= time.clock() | |
box_refine = vw.engview.align_fp(boundary_mat, Box_mat, rNode_mat,Edge_mat,matlab.double(fp_end.data.gene.astype(float).copy().tolist()) ,18,False, nargout=3) | |
endcom = time.clock() | |
print(' matlab.compute time: %s Seconds' % (endcom - startcom)) | |
box_out=box_refine[0] | |
box_order=box_refine[1] | |
rBoundary=box_refine[2] | |
fp_end.data.newBox = np.array(box_out) | |
fp_end.data.order = np.array(box_order) | |
fp_end.data.rBoundary = [np.array(rb) for rb in rBoundary] | |
return fp_end,box_out,box_order, gene_layout, boxes_refeine | |
def get_userinfo_net(userRoomID,adptRoomID): | |
global model | |
test_index = vw.testNameList.index(userRoomID.split(".")[0]) | |
test_data = vw.test_data[test_index] | |
# boundary | |
Boundary = test_data.boundary | |
boundary = [[float(x), float(y), float(z), float(k)] for x, y, z, k in list(Boundary)] | |
test_fp = FloorPlan(test_data) | |
train_index = vw.trainNameList.index(adptRoomID.split(".")[0]) | |
train_data = vw.train_data[train_index] | |
train_fp = FloorPlan(train_data, train=True) | |
fp_end = test_fp.adapt_graph(train_fp) | |
fp_end.adjust_graph() | |
boxes_pred, gene_layout, boxes_refeine = test(model, fp_end) | |
boxes_pred=boxes_pred*255 | |
for i in range(len(boxes_pred)): | |
for j in range(len(boxes_pred[i])): | |
boxes_pred[i][j]=float(boxes_pred[i][j]) | |
return fp_end,boxes_pred, gene_layout, boxes_refeine | |
if __name__ == "__main__": | |
pass | |