Spaces:
Running
Running
Huang
commited on
Commit
•
6a80886
1
Parent(s):
2eb5b9e
orgin
Browse files- annotator/__init__.py +3 -1
- annotator/denthPose/Base-DensePose-RCNN-FPN.yaml +48 -0
- annotator/denthPose/__init__.py +20 -0
- annotator/denthPose/densepose_rcnn_R_50_FPN_s1x.pkl +3 -0
- annotator/denthPose/densepose_rcnn_R_50_FPN_s1x.yaml +9 -0
- annotator/denthPose/depth_pose.py +114 -0
- annotator/denthPose/readme.md +10 -0
- config/annotator.yaml +3 -0
annotator/__init__.py
CHANGED
@@ -16,6 +16,7 @@ from .pidinet import PidInet
|
|
16 |
from .shuffle import Image2MaskShuffleDetector
|
17 |
from .zoe import ZoeDetector
|
18 |
from .oneformer import OneformerDetector
|
|
|
19 |
|
20 |
__all__ = [
|
21 |
UniformerDetector,
|
@@ -34,7 +35,8 @@ __all__ = [
|
|
34 |
PidInet,
|
35 |
Image2MaskShuffleDetector,
|
36 |
ZoeDetector,
|
37 |
-
OneformerDetector
|
|
|
38 |
]
|
39 |
#
|
40 |
#
|
|
|
16 |
from .shuffle import Image2MaskShuffleDetector
|
17 |
from .zoe import ZoeDetector
|
18 |
from .oneformer import OneformerDetector
|
19 |
+
from .denthPose import DenthPoseProcessor
|
20 |
|
21 |
__all__ = [
|
22 |
UniformerDetector,
|
|
|
35 |
PidInet,
|
36 |
Image2MaskShuffleDetector,
|
37 |
ZoeDetector,
|
38 |
+
OneformerDetector,
|
39 |
+
DenthPoseProcessor
|
40 |
]
|
41 |
#
|
42 |
#
|
annotator/denthPose/Base-DensePose-RCNN-FPN.yaml
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
VERSION: 2
|
2 |
+
MODEL:
|
3 |
+
META_ARCHITECTURE: "GeneralizedRCNN"
|
4 |
+
BACKBONE:
|
5 |
+
NAME: "build_resnet_fpn_backbone"
|
6 |
+
RESNETS:
|
7 |
+
OUT_FEATURES: ["res2", "res3", "res4", "res5"]
|
8 |
+
FPN:
|
9 |
+
IN_FEATURES: ["res2", "res3", "res4", "res5"]
|
10 |
+
ANCHOR_GENERATOR:
|
11 |
+
SIZES: [[32], [64], [128], [256], [512]] # One size for each in feature map
|
12 |
+
ASPECT_RATIOS: [[0.5, 1.0, 2.0]] # Three aspect ratios (same for all in feature maps)
|
13 |
+
RPN:
|
14 |
+
IN_FEATURES: ["p2", "p3", "p4", "p5", "p6"]
|
15 |
+
PRE_NMS_TOPK_TRAIN: 2000 # Per FPN level
|
16 |
+
PRE_NMS_TOPK_TEST: 1000 # Per FPN level
|
17 |
+
# Detectron1 uses 2000 proposals per-batch,
|
18 |
+
# (See "modeling/rpn/rpn_outputs.py" for details of this legacy issue)
|
19 |
+
# which is approximately 1000 proposals per-image since the default batch size for FPN is 2.
|
20 |
+
POST_NMS_TOPK_TRAIN: 1000
|
21 |
+
POST_NMS_TOPK_TEST: 1000
|
22 |
+
|
23 |
+
DENSEPOSE_ON: True
|
24 |
+
ROI_HEADS:
|
25 |
+
NAME: "DensePoseROIHeads"
|
26 |
+
IN_FEATURES: ["p2", "p3", "p4", "p5"]
|
27 |
+
NUM_CLASSES: 1
|
28 |
+
ROI_BOX_HEAD:
|
29 |
+
NAME: "FastRCNNConvFCHead"
|
30 |
+
NUM_FC: 2
|
31 |
+
POOLER_RESOLUTION: 7
|
32 |
+
POOLER_SAMPLING_RATIO: 2
|
33 |
+
POOLER_TYPE: "ROIAlign"
|
34 |
+
ROI_DENSEPOSE_HEAD:
|
35 |
+
NAME: "DensePoseV1ConvXHead"
|
36 |
+
POOLER_TYPE: "ROIAlign"
|
37 |
+
NUM_COARSE_SEGM_CHANNELS: 2
|
38 |
+
DATASETS:
|
39 |
+
TRAIN: ("densepose_coco_2014_train", "densepose_coco_2014_valminusminival")
|
40 |
+
TEST: ("densepose_coco_2014_minival",)
|
41 |
+
SOLVER:
|
42 |
+
IMS_PER_BATCH: 16
|
43 |
+
BASE_LR: 0.01
|
44 |
+
STEPS: (60000, 80000)
|
45 |
+
MAX_ITER: 90000
|
46 |
+
WARMUP_FACTOR: 0.1
|
47 |
+
INPUT:
|
48 |
+
MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800)
|
annotator/denthPose/__init__.py
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
|
3 |
+
|
4 |
+
def install_package():
|
5 |
+
print(os.system("pip install git+https://github.com/facebookresearch/detectron2.git"))
|
6 |
+
print(os.system("pip install git+https://github.com/facebookresearch/detectron2@main#subdirectory=projects/DensePose"))
|
7 |
+
|
8 |
+
|
9 |
+
install_package()
|
10 |
+
|
11 |
+
print("finished")
|
12 |
+
|
13 |
+
|
14 |
+
class DenthPoseProcessor:
|
15 |
+
def __init__(self):
|
16 |
+
from .depth_pose import DenthPoseProcess
|
17 |
+
self.processor = DenthPoseProcess()
|
18 |
+
|
19 |
+
def __call__(self, img):
|
20 |
+
return self.processor(img)
|
annotator/denthPose/densepose_rcnn_R_50_FPN_s1x.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b8a7382001b16e453bad95ca9dbc68ae8f2b839b304cf90eaf5c27fbdb4dae91
|
3 |
+
size 255757821
|
annotator/denthPose/densepose_rcnn_R_50_FPN_s1x.yaml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
_BASE_: "Base-DensePose-RCNN-FPN.yaml"
|
2 |
+
MODEL:
|
3 |
+
WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl"
|
4 |
+
RESNETS:
|
5 |
+
DEPTH: 50
|
6 |
+
DEVICE: "cpu"
|
7 |
+
SOLVER:
|
8 |
+
MAX_ITER: 130000
|
9 |
+
STEPS: (100000, 120000)
|
annotator/denthPose/depth_pose.py
ADDED
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os.path
|
2 |
+
from os import path
|
3 |
+
from typing import List, Dict, Any, ClassVar
|
4 |
+
|
5 |
+
import torch
|
6 |
+
from densepose import add_densepose_config
|
7 |
+
from densepose.vis.base import CompoundVisualizer
|
8 |
+
from densepose.vis.bounding_box import ScoredBoundingBoxVisualizer
|
9 |
+
from densepose.vis.densepose_outputs_vertex import get_texture_atlases, DensePoseOutputsTextureVisualizer, \
|
10 |
+
DensePoseOutputsVertexVisualizer
|
11 |
+
from densepose.vis.densepose_results import DensePoseResultsContourVisualizer, \
|
12 |
+
DensePoseResultsFineSegmentationVisualizer, DensePoseResultsUVisualizer, DensePoseResultsVVisualizer
|
13 |
+
from densepose.vis.densepose_results_textures import get_texture_atlas, DensePoseResultsVisualizerWithTexture
|
14 |
+
from densepose.vis.extractor import create_extractor, CompoundExtractor
|
15 |
+
from detectron2.config import CfgNode, get_cfg
|
16 |
+
from detectron2.engine.defaults import DefaultPredictor
|
17 |
+
|
18 |
+
from annotator.base_annotator import BaseProcessor
|
19 |
+
|
20 |
+
config_model = {
|
21 |
+
"densepose_rcnn_R_50_FPN_s1x": {
|
22 |
+
"yaml": 'densepose_rcnn_R_50_FPN_s1x.yaml',
|
23 |
+
"file": "densepose_rcnn_R_50_FPN_s1x.pkl"
|
24 |
+
}
|
25 |
+
}
|
26 |
+
|
27 |
+
default_conf = config_model["densepose_rcnn_R_50_FPN_s1x"]
|
28 |
+
|
29 |
+
|
30 |
+
class DenthPoseProcess(BaseProcessor):
|
31 |
+
VISUALIZERS: ClassVar[Dict[str, object]] = {
|
32 |
+
"dp_contour": DensePoseResultsContourVisualizer,
|
33 |
+
"dp_segm": DensePoseResultsFineSegmentationVisualizer,
|
34 |
+
"dp_u": DensePoseResultsUVisualizer,
|
35 |
+
"dp_v": DensePoseResultsVVisualizer,
|
36 |
+
"dp_iuv_texture": DensePoseResultsVisualizerWithTexture,
|
37 |
+
"dp_cse_texture": DensePoseOutputsTextureVisualizer,
|
38 |
+
"dp_vertex": DensePoseOutputsVertexVisualizer,
|
39 |
+
"bbox": ScoredBoundingBoxVisualizer,
|
40 |
+
}
|
41 |
+
|
42 |
+
def __init__(self, **kwargs):
|
43 |
+
super().__init__(**kwargs)
|
44 |
+
here = path.abspath(path.dirname(__file__))
|
45 |
+
self.cfg, self.model_conf = os.path.join(here, default_conf["yaml"]), os.path.join(here, default_conf["file"])
|
46 |
+
self.predictor = None
|
47 |
+
|
48 |
+
@classmethod
|
49 |
+
def setup_config(
|
50 |
+
cls: type, config_fpath: str, model_fpath: str, opts: List[str]
|
51 |
+
):
|
52 |
+
cfg = get_cfg()
|
53 |
+
add_densepose_config(cfg)
|
54 |
+
cfg.merge_from_file(config_fpath)
|
55 |
+
if opts:
|
56 |
+
cfg.merge_from_list(opts)
|
57 |
+
cfg.MODEL.WEIGHTS = model_fpath
|
58 |
+
cfg.freeze()
|
59 |
+
return cfg
|
60 |
+
|
61 |
+
@classmethod
|
62 |
+
def create_context(cls: type, vis_specs, cfg: CfgNode, arg_texture_atlas=None, arg_texture_atlases_map=None) -> \
|
63 |
+
Dict[
|
64 |
+
str, Any]:
|
65 |
+
"""
|
66 |
+
创建可视化
|
67 |
+
"""
|
68 |
+
# vis_specs = visualizations.split(",")
|
69 |
+
visualizers = []
|
70 |
+
extractors = []
|
71 |
+
for vis_spec in vis_specs:
|
72 |
+
texture_atlas = get_texture_atlas(arg_texture_atlas)
|
73 |
+
texture_atlases_dict = get_texture_atlases(arg_texture_atlases_map)
|
74 |
+
vis = cls.VISUALIZERS[vis_spec](
|
75 |
+
cfg=cfg,
|
76 |
+
texture_atlas=texture_atlas,
|
77 |
+
texture_atlases_dict=texture_atlases_dict,
|
78 |
+
)
|
79 |
+
visualizers.append(vis)
|
80 |
+
extractor = create_extractor(vis)
|
81 |
+
extractors.append(extractor)
|
82 |
+
visualizer = CompoundVisualizer(visualizers)
|
83 |
+
extractor = CompoundExtractor(extractors)
|
84 |
+
context = {
|
85 |
+
"extractor": extractor,
|
86 |
+
"visualizer": visualizer,
|
87 |
+
"entry_idx": 0,
|
88 |
+
}
|
89 |
+
return context
|
90 |
+
|
91 |
+
def execute_on_outputs(self, image, context: Dict[str, Any], outputs):
|
92 |
+
visualizer = context["visualizer"]
|
93 |
+
extractor = context["extractor"]
|
94 |
+
# image = np.tile(image[:, :, np.newaxis], [1, 1, 3])
|
95 |
+
data = extractor(outputs)
|
96 |
+
# zero_image = np.zeros(image.shape, dtype=np.uint8)
|
97 |
+
image_vis = visualizer.visualize(image, data)
|
98 |
+
return image_vis
|
99 |
+
|
100 |
+
def __call__(self, img, visualizations=["dp_u", "dp_v", "bbox"], texture_atlas=None, texture_atlases_map=None):
|
101 |
+
opts = []
|
102 |
+
cfg = self.setup_config(config_fpath=self.cfg, model_fpath=self.model_conf, opts=opts)
|
103 |
+
if self.predictor is None:
|
104 |
+
self.predictor = DefaultPredictor(cfg)
|
105 |
+
context = self.create_context(visualizations, cfg, texture_atlas, texture_atlases_map)
|
106 |
+
with torch.no_grad():
|
107 |
+
outputs = self.predictor(img)["instances"]
|
108 |
+
return self.execute_on_outputs(img, context, outputs)
|
109 |
+
|
110 |
+
# if __name__ == '__main__':
|
111 |
+
# image_path = "demo.jpeg"
|
112 |
+
# img = cv2.imread(image_path)
|
113 |
+
# process = DenthPoseProcessor()
|
114 |
+
# process(img, "dp_contour,bbox")
|
annotator/denthPose/readme.md
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
### 安装 detectron2
|
2 |
+
pip install 'git+https://github.com/facebookresearch/detectron2.git'
|
3 |
+
|
4 |
+
### 安装 DensePose
|
5 |
+
pip install git+https://github.com/facebookresearch/detectron2@main#subdirectory=projects/DensePose
|
6 |
+
|
7 |
+
|
8 |
+
#
|
9 |
+
python apply_net.py show densepose_rcnn_R_50_FPN_s1x.yaml model_final_162be9.pkl demo.jpg dp_contour,bbox --output image_densepose_contour.png
|
10 |
+
|
config/annotator.yaml
CHANGED
@@ -123,3 +123,6 @@ zoe:
|
|
123 |
oneformer:
|
124 |
process: OneformerDetector
|
125 |
input: []
|
|
|
|
|
|
|
|
123 |
oneformer:
|
124 |
process: OneformerDetector
|
125 |
input: []
|
126 |
+
denthPose:
|
127 |
+
process: DenthPoseProcessor
|
128 |
+
input: []
|