def eval_iou(predicted_v,predicted_f,voxels): faces_ = srf.face_vertices(predicted_v, predicted_f).data faces_norm = faces_ * 1. * (32. - 1) / 32. + 0.5 voxels_predict = srf.voxelization(faces_norm, 32, False).cpu().numpy() voxels_predict = voxels_predict.transpose(0, 2, 1, 3)[:, :, :, ::-1] iou = (voxels * voxels_predict).sum((1, 2, 3)) / (0 < (voxels + voxels_predict)).sum((1, 2, 3)) return iou
def evaluate_iou(self, images, voxels): vertices, faces, textures = self.reconstruct(images) faces_ = srf.face_vertices(vertices, faces).data faces_norm = faces_ * 1. * (32. - 1) / 32. + 0.5 voxels_predict = srf.voxelization(faces_norm, 32, False).cpu().numpy() voxels_predict = voxels_predict.transpose(0, 2, 1, 3)[:, :, :, ::-1] iou = (voxels * voxels_predict).sum((1, 2, 3)) / (0 < (voxels + voxels_predict)).sum((1, 2, 3)) return iou, vertices, faces, textures
vertices_real = [vertices_real for _ in range(num_rendered_images)] faces_real = [faces_real for _ in range(num_rendered_images)] vertices_real = torch.cat(vertices_real, dim=0) faces_real = torch.cat(faces_real, dim=0) vertices_generate, faces_generate = model.reconstruct( rendered_images_i) # srf.save_obj('/mnt/zhengwen/model_synthesis/shapeNetCore/test_generate.obj', vertices_generate[0], faces_generate[0]) # srf.save_obj('/mnt/zhengwen/model_synthesis/shapeNetCore/test_real.obj', vertices_real[0], faces_real[0]) faces_real_ = srf.face_vertices(vertices_real, faces_real).data faces_real_norm = faces_real_ * 1. * (32. - 1) / 32. + 0.5 voxels_real = srf.voxelization(faces_real_norm, 32, False).cpu().numpy() faces_generate_ = srf.face_vertices(vertices_generate, faces_generate).data faces_generate_norm = faces_generate_ * 1. * (32. - 1) / 32. + 0.5 voxels_generate = srf.voxelization(faces_generate_norm, 32, False).cpu().numpy() voxels_generate = voxels_generate.transpose(0, 2, 1, 3)[:, :, :, ::-1] iou = (voxels_real * voxels_generate).sum( (1, 2, 3)) / (0 < (voxels_real + voxels_generate)).sum( (1, 2, 3)) category_to_IoU[sub_root_dir].append(np.mean(iou)) obj_count += 1 sub_root_count += 1
def voxelize(self, voxel_size=32): face_vertices_norm = self.face_vertices * voxel_size / (voxel_size - 1) + 0.5 return srf.voxelization(face_vertices_norm, voxel_size, False)