|
|
| 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
|
|
|