-
Notifications
You must be signed in to change notification settings - Fork 6
Transfer PartNet latent code(size=part_num, 128) to SDM hidden code(size=1, 32) #12
Description
Hi, Thanks for your help in resolving the reproduce issue last time. Now I'm trying to replace some parts of model with another model.
I have two model's sdm latent codes whose size are both (1, 32) and they look like this:

My goal is replacing Model.1's chair back with Model.2's back.
First, I got their PartNet code by:
# 1st model's sdm code(1, 32) -> partnet codes "recoversym1"(8, 128)
latent1 = np.expand_dims(latent1, axis=0)
recover1 = sess.run([self.embedding_decode[self.part_num]], feed_dict = {self.embedding_inputs[self.part_num]: latent1})[0]
recoversym1 = np.reshape(recover1, (len(recover1), self.part_num, self.part_dim+self.hiddendim[0]))
# 2nd model's sdm code(1, 32) -> partnet codes "recoversym2"(8, 128)
latent2 = np.expand_dims(latent2, axis=0)
recover2 = sess.run([self.embedding_decode[self.part_num]], feed_dict = {self.embedding_inputs[self.part_num]: latent2})[0]
recoversym2 = np.reshape(recover2, (len(recover2), self.part_num, self.part_dim+self.hiddendim[0]))Next, I replaced the back part of Model.1's PartNet code with the back part of Model.2's PartNet code, and generate the obj file.
# create a new object partnet code, copy 2nd model's chair back to 1st model
edit_part_idx = 2
recoversym3 = recoversym1.copy()
recoversym3[:, edit_part_idx, :] = recoversym2[:, edit_part_idx, :]
if self.change_net: # enter here
symmetryf3 = np.concatenate([np.expand_dims(recover_datasymv2(recoversym3[:,k,-self.part_dim:], datainfo.boxmin[k], datainfo.boxmax[k]), axis = 1) for k in range(self.part_num)], axis = 1)
else:
symmetryf3 = recover_datasym(recoversym3[:,:,-self.part_dim:], datainfo.boxmin[0], datainfo.boxmax[0])
# generate edited obj
recovers = None
for k in range(self.part_num):
recover = sess.run([self.embedding_decode[k]], feed_dict = {self.embedding_inputs[k]: recoversym3[:,k,:self.hiddendim[0]]})[0]
deforma_v1, deforma_v_align = sess.run([self.deform_vertex[k], self.deform_vertex_align[k]], feed_dict={self.feature2point: recover, self.controlpoint: np.tile([0,0,0], (np.shape(recover)[0], 1, 1))})
deforma_v1 = self.alignallmodels(deforma_v1, id = k)
deformas.append(deforma_v1)
self.v2objfile(deforma_v1, path + '/gt_struc_' + self.part_name[k], ['0'], '0', self.part_name[k])
if k == 0:
recovers = recover.copy()
else:
recovers = np.concatenate([recovers, recover.copy()])The obj file looks like this:

Looks great! 👍
But when I encode its shape feature whose size is [8, 3752, 9] into sdm latent code:
# encode shape features(8, 3752, 9) -> sdm latent code(1, 32)
if advance_api:
app_handle = sess.run(self.app_iterator.string_handle())
for i in range(self.part_num+1):
sess.run(self.app_iterator.initializer, feed_dict={self.inputs_feature: np.expand_dims(recovers, axis=0), self.inputs_symmetry: symmetryf3})
while True:
try:
embedding = sess.run([self.encode[i]], feed_dict = {self.handle: app_handle})[0]
except tf.errors.OutOfRangeError:
break
print(embedding.shape) # (1, 32)and decode the sdm code to obj file:
# decode sdm latent code to obj file, this should be like "gt_struc" obj
recover_from32 = sess.run([self.embedding_decode[self.part_num]], feed_dict = {self.embedding_inputs[self.part_num]: embedding})[0]
recoversym_from32 = np.reshape(recover_from32, (len(recover_from32), self.part_num, self.part_dim+self.hiddendim[0]))
for k in range(self.part_num):
recover = sess.run([self.embedding_decode[k]], feed_dict = {self.embedding_inputs[k]: recoversym_from32[:,k,:self.hiddendim[0]]})[0]
deforma_v1, deforma_v_align = sess.run([self.deform_vertex[k], self.deform_vertex_align[k]], feed_dict={self.feature2point: recover, self.controlpoint: np.tile([0,0,0], (np.shape(recover)[0], 1, 1))})
deforma_v1 = self.alignallmodels(deforma_v1, id = k)
deformas.append(deforma_v1)
self.v2objfile(deforma_v1, path + '/pred_struc_' + self.part_name[k], ['0'], '0', self.part_name[k])The obj file looks like this, and it doesn't looks like the result in above image: 😢

I'm wondering the problem is the order in the shape feature of preprocessing data and inferenced data are different, so I got a wrong sdm latent code 🤔 ?
Thanks for reading this issues and I will be grateful for any help you can provide.
Regards,
Susan