|
|
|
|
|
|
|
from dataclasses import fields
|
|
from typing import Any, List
|
|
import torch
|
|
|
|
from detectron2.structures import Instances
|
|
|
|
|
|
def densepose_inference(densepose_predictor_output: Any, detections: List[Instances]) -> None:
|
|
"""
|
|
Splits DensePose predictor outputs into chunks, each chunk corresponds to
|
|
detections on one image. Predictor output chunks are stored in `pred_densepose`
|
|
attribute of the corresponding `Instances` object.
|
|
|
|
Args:
|
|
densepose_predictor_output: a dataclass instance (can be of different types,
|
|
depending on predictor used for inference). Each field can be `None`
|
|
(if the corresponding output was not inferred) or a tensor of size
|
|
[N, ...], where N = N_1 + N_2 + .. + N_k is a total number of
|
|
detections on all images, N_1 is the number of detections on image 1,
|
|
N_2 is the number of detections on image 2, etc.
|
|
detections: a list of objects of type `Instance`, k-th object corresponds
|
|
to detections on k-th image.
|
|
"""
|
|
k = 0
|
|
for detection_i in detections:
|
|
if densepose_predictor_output is None:
|
|
|
|
continue
|
|
n_i = detection_i.__len__()
|
|
|
|
PredictorOutput = type(densepose_predictor_output)
|
|
output_i_dict = {}
|
|
|
|
for field in fields(densepose_predictor_output):
|
|
field_value = getattr(densepose_predictor_output, field.name)
|
|
|
|
if isinstance(field_value, torch.Tensor):
|
|
output_i_dict[field.name] = field_value[k : k + n_i]
|
|
|
|
else:
|
|
output_i_dict[field.name] = field_value
|
|
detection_i.pred_densepose = PredictorOutput(**output_i_dict)
|
|
k += n_i
|
|
|