graph2plan / model /test.py
Zai
tada
c2ea21f
raw
history blame
9.22 kB
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