|
|
| import numpy as np
|
| from typing import Iterable, Optional, Tuple
|
| import cv2
|
|
|
| from densepose.structures import DensePoseDataRelative
|
|
|
| from .base import Boxes, Image, MatrixVisualizer, PointsVisualizer
|
|
|
|
|
| class DensePoseDataCoarseSegmentationVisualizer:
|
| """
|
| Visualizer for ground truth segmentation
|
| """
|
|
|
| def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7, **kwargs):
|
| self.mask_visualizer = MatrixVisualizer(
|
| inplace=inplace,
|
| cmap=cmap,
|
| val_scale=255.0 / DensePoseDataRelative.N_BODY_PARTS,
|
| alpha=alpha,
|
| )
|
|
|
| def visualize(
|
| self,
|
| image_bgr: Image,
|
| bbox_densepose_datas: Optional[Tuple[Iterable[Boxes], Iterable[DensePoseDataRelative]]],
|
| ) -> Image:
|
| if bbox_densepose_datas is None:
|
| return image_bgr
|
| for bbox_xywh, densepose_data in zip(*bbox_densepose_datas):
|
| matrix = densepose_data.segm.numpy()
|
| mask = np.zeros(matrix.shape, dtype=np.uint8)
|
| mask[matrix > 0] = 1
|
| image_bgr = self.mask_visualizer.visualize(image_bgr, mask, matrix, bbox_xywh.numpy())
|
| return image_bgr
|
|
|
|
|
| class DensePoseDataPointsVisualizer:
|
| def __init__(self, densepose_data_to_value_fn=None, cmap=cv2.COLORMAP_PARULA, **kwargs):
|
| self.points_visualizer = PointsVisualizer()
|
| self.densepose_data_to_value_fn = densepose_data_to_value_fn
|
| self.cmap = cmap
|
|
|
| def visualize(
|
| self,
|
| image_bgr: Image,
|
| bbox_densepose_datas: Optional[Tuple[Iterable[Boxes], Iterable[DensePoseDataRelative]]],
|
| ) -> Image:
|
| if bbox_densepose_datas is None:
|
| return image_bgr
|
| for bbox_xywh, densepose_data in zip(*bbox_densepose_datas):
|
| x0, y0, w, h = bbox_xywh.numpy()
|
| x = densepose_data.x.numpy() * w / 255.0 + x0
|
| y = densepose_data.y.numpy() * h / 255.0 + y0
|
| pts_xy = zip(x, y)
|
| if self.densepose_data_to_value_fn is None:
|
| image_bgr = self.points_visualizer.visualize(image_bgr, pts_xy)
|
| else:
|
| v = self.densepose_data_to_value_fn(densepose_data)
|
| img_colors_bgr = cv2.applyColorMap(v, self.cmap)
|
| colors_bgr = [
|
| [int(v) for v in img_color_bgr.ravel()] for img_color_bgr in img_colors_bgr
|
| ]
|
| image_bgr = self.points_visualizer.visualize(image_bgr, pts_xy, colors_bgr)
|
| return image_bgr
|
|
|
|
|
| def _densepose_data_u_for_cmap(densepose_data):
|
| u = np.clip(densepose_data.u.numpy(), 0, 1) * 255.0
|
| return u.astype(np.uint8)
|
|
|
|
|
| def _densepose_data_v_for_cmap(densepose_data):
|
| v = np.clip(densepose_data.v.numpy(), 0, 1) * 255.0
|
| return v.astype(np.uint8)
|
|
|
|
|
| def _densepose_data_i_for_cmap(densepose_data):
|
| i = (
|
| np.clip(densepose_data.i.numpy(), 0.0, DensePoseDataRelative.N_PART_LABELS)
|
| * 255.0
|
| / DensePoseDataRelative.N_PART_LABELS
|
| )
|
| return i.astype(np.uint8)
|
|
|
|
|
| class DensePoseDataPointsUVisualizer(DensePoseDataPointsVisualizer):
|
| def __init__(self, **kwargs):
|
| super(DensePoseDataPointsUVisualizer, self).__init__(
|
| densepose_data_to_value_fn=_densepose_data_u_for_cmap, **kwargs
|
| )
|
|
|
|
|
| class DensePoseDataPointsVVisualizer(DensePoseDataPointsVisualizer):
|
| def __init__(self, **kwargs):
|
| super(DensePoseDataPointsVVisualizer, self).__init__(
|
| densepose_data_to_value_fn=_densepose_data_v_for_cmap, **kwargs
|
| )
|
|
|
|
|
| class DensePoseDataPointsIVisualizer(DensePoseDataPointsVisualizer):
|
| def __init__(self, **kwargs):
|
| super(DensePoseDataPointsIVisualizer, self).__init__(
|
| densepose_data_to_value_fn=_densepose_data_i_for_cmap, **kwargs
|
| )
|
|
|