def outer_eye_corner_49_euclidean_error(shape, gt_shape): r""" Computes the Euclidean error based on 49 points normalised with the distance between the mean eye points (pupils), i.e. .. math:: \frac{\mathcal{F}(s,s^*)}{\mathcal{N}(s^*)} where .. math:: \mathcal{F}(s,s^*) = \frac{1}{49}\sum_{i=1}^{49}\sqrt{(s_{i,x}-s^*_{i,x})^2 + (s_{i,y}-s^*_{i,y})^2} where :math:`s` and :math:`s^*` are the final and ground truth shapes, respectively. :math:`(s_{i,x}, s_{i,y})` are the `x` and `y` coordinates of the :math:`i`'th point of the final shape, :math:`(s^*_{i,x}, s^*_{i,y})` are the `x` and `y` coordinates of the :math:`i`'th point of the ground truth shape. Finally, :math:`\mathcal{N}(s^*)` is the distance between the ``19``-th and ``28``-th points. Parameters ---------- shape : `menpo.shape.PointCloud` The input shape (e.g. the final shape of a fitting procedure). It must 68 or 66 or 51 or 49 points. gt_shape : `menpo.shape.PointCloud` The ground truth shape. It must have 68 or 66 or 51 or 49 points. Returns ------- normalised_error : `float` The computed normalised Euclidean error. Raises ------ ValueError Final shape must have 68 or 66 or 51 or 49 points ValueError Ground truth shape must have 68 or 66 or 51 or 49 points """ if shape.n_points not in [68, 66, 51, 49]: raise ValueError('Final shape must have 68 or 66 or 51 or 49 points') if gt_shape.n_points not in [68, 66, 51, 49]: raise ValueError('Ground truth shape must have 68 or 66 or 51 or 49 ' 'points') if shape.n_points == 68: shape = _convert_68_to_49(shape) elif shape.n_points == 66: shape = _convert_66_to_49(shape) elif shape.n_points == 51: shape = _convert_51_to_49(shape) if gt_shape.n_points == 68: gt_shape = _convert_68_to_49(gt_shape) elif gt_shape.n_points == 66: gt_shape = _convert_66_to_49(gt_shape) elif gt_shape.n_points == 51: gt_shape = _convert_51_to_49(gt_shape) return distance_indexed_normalised_error(euclidean_error, 19, 28, shape, gt_shape)
def outer_eye_corner_68_euclidean_error(shape, gt_shape): r""" Computes the Euclidean error based on 68 points normalised with the distance between the mean eye points (pupils), i.e. .. math:: \frac{\mathcal{F}(s,s^*)}{\mathcal{N}(s^*)} where .. math:: \mathcal{F}(s,s^*) = \frac{1}{68}\sum_{i=1}^{68}\sqrt{(s_{i,x}-s^*_{i,x})^2 + (s_{i,y}-s^*_{i,y})^2} where :math:`s` and :math:`s^*` are the final and ground truth shapes, respectively. :math:`(s_{i,x}, s_{i,y})` are the `x` and `y` coordinates of the :math:`i`'th point of the final shape, :math:`(s^*_{i,x}, s^*_{i,y})` are the `x` and `y` coordinates of the :math:`i`'th point of the ground truth shape. Finally, :math:`\mathcal{N}(s^*)` is the distance between the ``36``-th and ``45``-th points. Parameters ---------- shape : `menpo.shape.PointCloud` The input shape (e.g. the final shape of a fitting procedure). It must have 68 points. gt_shape : `menpo.shape.PointCloud` The ground truth shape. It must have 68 points. Returns ------- normalised_error : `float` The computed normalised Euclidean error. Raises ------ ValueError Final shape must have 68 points ValueError Ground truth shape must have 68 points """ if shape.n_points != 68: raise ValueError('Final shape must have 68 points') if gt_shape.n_points != 68: raise ValueError('Ground truth shape must have 68 points') return distance_indexed_normalised_error(euclidean_error, 36, 45, shape, gt_shape)