Skip to content

Transfer PartNet latent code(size=part_num, 128) to SDM hidden code(size=1, 32) #12

@susan31213

Description

@susan31213

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

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:
image
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: 😢
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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions