def _val_step(self, images, kp2d, kp3d, has3d): tf.keras.backend.set_learning_phase(0) result = self.generator(images, training=False) # only use last computed theta (from accumulated iterative feedback loop) _, kp2d_pred, kp3d_pred, _, _, _ = result[-1] vis = kp2d[:, :, 2] kp2d_norm = tf.norm( kp2d_pred[:, :self.config.NUM_KP2D, :] - kp2d[:, :, :2], axis=2) * vis kp2d_mpjpe = tf.reduce_sum(kp2d_norm) / tf.reduce_sum(vis) self.kp2d_mpjpe_log(kp2d_mpjpe) if self.config.USE_3D: # check if at least one 3d sample available if tf.reduce_sum(has3d) > 0: kp3d_real = tf.boolean_mask(kp3d, has3d) kp3d_predict = tf.boolean_mask(kp3d_pred, has3d) kp3d_predict = kp3d_predict[:, :self.config.NUM_KP3D, :] kp3d_real = batch_align_by_pelvis(kp3d_real) kp3d_predict = batch_align_by_pelvis(kp3d_predict) kp3d_mpjpe = tf.norm(kp3d_predict - kp3d_real, axis=2) kp3d_mpjpe = tf.reduce_mean(kp3d_mpjpe) aligned_kp3d = batch_compute_similarity_transform( kp3d_real, kp3d_predict) kp3d_mpjpe_aligned = tf.norm(aligned_kp3d - kp3d_real, axis=2) kp3d_mpjpe_aligned = tf.reduce_mean(kp3d_mpjpe_aligned) self.kp3d_mpjpe_log.update_state(kp3d_mpjpe) self.kp3d_mpjpe_aligned_log.update_state(kp3d_mpjpe_aligned)
def _test_step(self, image, kp3d, return_kps=False): tf.keras.backend.set_learning_phase(0) if len(tf.shape(image)) is not 4: image = tf.expand_dims(image, 0) kp3d = tf.expand_dims(kp3d, 0) result = self.generator(image, training=False) # only use last computed theta (from accumulated iterative feedback loop) _, _, kp3d_pred, _, _, _ = result[-1] factor = tf.constant(1000, tf.float32) kp3d, kp3d_predict = kp3d * factor, kp3d_pred * factor # convert back from m -> mm kp3d_predict = kp3d_predict[:, :self.config.NUM_KP3D, :] real_kp3d = batch_align_by_pelvis(kp3d) predict_kp3d = batch_align_by_pelvis(kp3d_predict) kp3d_mpjpe = tf.norm(real_kp3d - predict_kp3d, axis=2) aligned_kp3d = batch_compute_similarity_transform( real_kp3d, predict_kp3d) kp3d_mpjpe_aligned = tf.norm(real_kp3d - aligned_kp3d, axis=2) if return_kps: return kp3d_mpjpe, kp3d_mpjpe_aligned, predict_kp3d, real_kp3d return kp3d_mpjpe, kp3d_mpjpe_aligned, None, None
def test_batch_compute_similarity_transform(self): pred_3d, real_3d = get_kp3d(self.config) output = batch_compute_similarity_transform(real_3d, pred_3d) mean = tf.reduce_mean(output) expected = np.array(1.806683, dtype=np.float32) self.assertAllCloseAccordingToType(expected, mean) self.assertEqual((self.config.BATCH_SIZE, self.config.NUM_KP3D, 3), output.shape)