Huang
orgin
6a80886
import os.path
from os import path
from typing import List, Dict, Any, ClassVar
import torch
from densepose import add_densepose_config
from densepose.vis.base import CompoundVisualizer
from densepose.vis.bounding_box import ScoredBoundingBoxVisualizer
from densepose.vis.densepose_outputs_vertex import get_texture_atlases, DensePoseOutputsTextureVisualizer, \
DensePoseOutputsVertexVisualizer
from densepose.vis.densepose_results import DensePoseResultsContourVisualizer, \
DensePoseResultsFineSegmentationVisualizer, DensePoseResultsUVisualizer, DensePoseResultsVVisualizer
from densepose.vis.densepose_results_textures import get_texture_atlas, DensePoseResultsVisualizerWithTexture
from densepose.vis.extractor import create_extractor, CompoundExtractor
from detectron2.config import CfgNode, get_cfg
from detectron2.engine.defaults import DefaultPredictor
from annotator.base_annotator import BaseProcessor
config_model = {
"densepose_rcnn_R_50_FPN_s1x": {
"yaml": 'densepose_rcnn_R_50_FPN_s1x.yaml',
"file": "densepose_rcnn_R_50_FPN_s1x.pkl"
}
}
default_conf = config_model["densepose_rcnn_R_50_FPN_s1x"]
class DenthPoseProcess(BaseProcessor):
VISUALIZERS: ClassVar[Dict[str, object]] = {
"dp_contour": DensePoseResultsContourVisualizer,
"dp_segm": DensePoseResultsFineSegmentationVisualizer,
"dp_u": DensePoseResultsUVisualizer,
"dp_v": DensePoseResultsVVisualizer,
"dp_iuv_texture": DensePoseResultsVisualizerWithTexture,
"dp_cse_texture": DensePoseOutputsTextureVisualizer,
"dp_vertex": DensePoseOutputsVertexVisualizer,
"bbox": ScoredBoundingBoxVisualizer,
}
def __init__(self, **kwargs):
super().__init__(**kwargs)
here = path.abspath(path.dirname(__file__))
self.cfg, self.model_conf = os.path.join(here, default_conf["yaml"]), os.path.join(here, default_conf["file"])
self.predictor = None
@classmethod
def setup_config(
cls: type, config_fpath: str, model_fpath: str, opts: List[str]
):
cfg = get_cfg()
add_densepose_config(cfg)
cfg.merge_from_file(config_fpath)
if opts:
cfg.merge_from_list(opts)
cfg.MODEL.WEIGHTS = model_fpath
cfg.freeze()
return cfg
@classmethod
def create_context(cls: type, vis_specs, cfg: CfgNode, arg_texture_atlas=None, arg_texture_atlases_map=None) -> \
Dict[
str, Any]:
"""
创建可视化
"""
# vis_specs = visualizations.split(",")
visualizers = []
extractors = []
for vis_spec in vis_specs:
texture_atlas = get_texture_atlas(arg_texture_atlas)
texture_atlases_dict = get_texture_atlases(arg_texture_atlases_map)
vis = cls.VISUALIZERS[vis_spec](
cfg=cfg,
texture_atlas=texture_atlas,
texture_atlases_dict=texture_atlases_dict,
)
visualizers.append(vis)
extractor = create_extractor(vis)
extractors.append(extractor)
visualizer = CompoundVisualizer(visualizers)
extractor = CompoundExtractor(extractors)
context = {
"extractor": extractor,
"visualizer": visualizer,
"entry_idx": 0,
}
return context
def execute_on_outputs(self, image, context: Dict[str, Any], outputs):
visualizer = context["visualizer"]
extractor = context["extractor"]
# image = np.tile(image[:, :, np.newaxis], [1, 1, 3])
data = extractor(outputs)
# zero_image = np.zeros(image.shape, dtype=np.uint8)
image_vis = visualizer.visualize(image, data)
return image_vis
def __call__(self, img, visualizations=["dp_u", "dp_v", "bbox"], texture_atlas=None, texture_atlases_map=None):
opts = []
cfg = self.setup_config(config_fpath=self.cfg, model_fpath=self.model_conf, opts=opts)
if self.predictor is None:
self.predictor = DefaultPredictor(cfg)
context = self.create_context(visualizations, cfg, texture_atlas, texture_atlases_map)
with torch.no_grad():
outputs = self.predictor(img)["instances"]
return self.execute_on_outputs(img, context, outputs)
# if __name__ == '__main__':
# image_path = "demo.jpeg"
# img = cv2.imread(image_path)
# process = DenthPoseProcessor()
# process(img, "dp_contour,bbox")