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 | |