From 06956ad49365c9da8643c73d80ec42e97e68cd7e Mon Sep 17 00:00:00 2001 From: "MS-TWHOMCVJZCUH\\Administrator" <455758525@qq.com> Date: Sat, 24 Feb 2024 18:54:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OodGenerater.py | 86 + __init__.py | 6 + checkpoints/README.txt | 1 + images/demo.png | Bin 0 -> 4450190 bytes images/workflow.png | Bin 0 -> 728065 bytes .../inference_ootd_dc.cpython-311.pyc | Bin 0 -> 6630 bytes .../inference_ootd_hd.cpython-311.pyc | Bin 0 -> 7160 bytes ootd/inference_ootd.py | 133 + ootd/inference_ootd_dc.py | 132 + ootd/inference_ootd_hd.py | 137 + .../attention_garm.cpython-311.pyc | Bin 0 -> 18979 bytes .../attention_vton.cpython-311.pyc | Bin 0 -> 19175 bytes .../__pycache__/pipeline_ootd.cpython-311.pyc | Bin 0 -> 43422 bytes .../transformer_garm_2d.cpython-311.pyc | Bin 0 -> 21632 bytes .../transformer_vton_2d.cpython-311.pyc | Bin 0 -> 21700 bytes .../unet_garm_2d_blocks.cpython-311.pyc | Bin 0 -> 111711 bytes .../unet_garm_2d_condition.cpython-311.pyc | Bin 0 -> 56236 bytes .../unet_vton_2d_blocks.cpython-311.pyc | Bin 0 -> 111930 bytes .../unet_vton_2d_condition.cpython-311.pyc | Bin 0 -> 56514 bytes ootd/pipelines_ootd/attention_garm.py | 402 ++ ootd/pipelines_ootd/attention_vton.py | 407 ++ ootd/pipelines_ootd/pipeline_ootd.py | 846 ++++ ootd/pipelines_ootd/transformer_garm_2d.py | 449 +++ ootd/pipelines_ootd/transformer_vton_2d.py | 452 +++ ootd/pipelines_ootd/unet_garm_2d_blocks.py | 3510 ++++++++++++++++ ootd/pipelines_ootd/unet_garm_2d_condition.py | 1183 ++++++ ootd/pipelines_ootd/unet_vton_2d_blocks.py | 3519 +++++++++++++++++ ootd/pipelines_ootd/unet_vton_2d_condition.py | 1183 ++++++ preprocess/humanparsing/aigc_run_parsing.py | 22 + preprocess/humanparsing/datasets/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 275 bytes .../simple_extractor_dataset.cpython-311.pyc | Bin 0 -> 4906 bytes preprocess/humanparsing/datasets/datasets.py | 201 + .../datasets/simple_extractor_dataset.py | 89 + .../datasets/target_generation.py | 40 + .../human_to_coco.py | 166 + .../pycococreatortools.py | 114 + .../test_human2coco_format.py | 74 + .../detectron2/.circleci/config.yml | 179 + .../mhp_extension/detectron2/.clang-format | 85 + .../mhp_extension/detectron2/.flake8 | 9 + .../detectron2/.github/CODE_OF_CONDUCT.md | 5 + .../detectron2/.github/CONTRIBUTING.md | 49 + .../.github/Detectron2-Logo-Horz.svg | 1 + .../detectron2/.github/ISSUE_TEMPLATE.md | 5 + .../detectron2/.github/ISSUE_TEMPLATE/bugs.md | 36 + .../.github/ISSUE_TEMPLATE/config.yml | 9 + .../.github/ISSUE_TEMPLATE/feature-request.md | 31 + .../ISSUE_TEMPLATE/questions-help-support.md | 26 + .../unexpected-problems-bugs.md | 45 + .../.github/pull_request_template.md | 9 + .../mhp_extension/detectron2/.gitignore | 46 + .../detectron2/GETTING_STARTED.md | 79 + .../mhp_extension/detectron2/INSTALL.md | 184 + .../mhp_extension/detectron2/LICENSE | 201 + .../mhp_extension/detectron2/MODEL_ZOO.md | 903 +++++ .../mhp_extension/detectron2/README.md | 56 + .../detectron2/configs/Base-RCNN-C4.yaml | 18 + .../configs/Base-RCNN-DilatedC5.yaml | 31 + .../detectron2/configs/Base-RCNN-FPN.yaml | 42 + .../detectron2/configs/Base-RetinaNet.yaml | 24 + .../COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml | 17 + .../faster_rcnn_R_101_C4_3x.yaml | 9 + .../faster_rcnn_R_101_DC5_3x.yaml | 9 + .../faster_rcnn_R_101_FPN_3x.yaml | 9 + .../faster_rcnn_R_50_C4_1x.yaml | 6 + .../faster_rcnn_R_50_C4_3x.yaml | 9 + .../faster_rcnn_R_50_DC5_1x.yaml | 6 + .../faster_rcnn_R_50_DC5_3x.yaml | 9 + .../faster_rcnn_R_50_FPN_1x.yaml | 6 + .../faster_rcnn_R_50_FPN_3x.yaml | 9 + .../faster_rcnn_X_101_32x8d_FPN_3x.yaml | 13 + .../retinanet_R_101_FPN_3x.yaml | 8 + .../COCO-Detection/retinanet_R_50_FPN_1x.yaml | 5 + .../COCO-Detection/retinanet_R_50_FPN_3x.yaml | 8 + .../COCO-Detection/rpn_R_50_C4_1x.yaml | 10 + .../COCO-Detection/rpn_R_50_FPN_1x.yaml | 9 + .../mask_rcnn_R_101_C4_3x.yaml | 9 + .../mask_rcnn_R_101_DC5_3x.yaml | 9 + .../mask_rcnn_R_101_FPN_3x.yaml | 9 + .../mask_rcnn_R_50_C4_1x.yaml | 6 + .../mask_rcnn_R_50_C4_3x.yaml | 9 + .../mask_rcnn_R_50_DC5_1x.yaml | 6 + .../mask_rcnn_R_50_DC5_3x.yaml | 9 + .../mask_rcnn_R_50_FPN_1x.yaml | 6 + .../mask_rcnn_R_50_FPN_3x.yaml | 9 + .../mask_rcnn_X_101_32x8d_FPN_3x.yaml | 13 + .../Base-Keypoint-RCNN-FPN.yaml | 15 + .../keypoint_rcnn_R_101_FPN_3x.yaml | 8 + .../keypoint_rcnn_R_50_FPN_1x.yaml | 5 + .../keypoint_rcnn_R_50_FPN_3x.yaml | 8 + .../keypoint_rcnn_X_101_32x8d_FPN_3x.yaml | 12 + .../Base-Panoptic-FPN.yaml | 9 + .../panoptic_fpn_R_101_3x.yaml | 8 + .../panoptic_fpn_R_50_1x.yaml | 5 + .../panoptic_fpn_R_50_3x.yaml | 8 + .../Cityscapes/mask_rcnn_R_50_FPN.yaml | 27 + .../configs/Detectron1-Comparisons/README.md | 83 + .../faster_rcnn_R_50_FPN_noaug_1x.yaml | 17 + .../keypoint_rcnn_R_50_FPN_1x.yaml | 27 + .../mask_rcnn_R_50_FPN_noaug_1x.yaml | 20 + .../mask_rcnn_R_101_FPN_1x.yaml | 19 + .../mask_rcnn_R_50_FPN_1x.yaml | 19 + .../mask_rcnn_X_101_32x8d_FPN_1x.yaml | 23 + .../Misc/cascade_mask_rcnn_R_50_FPN_1x.yaml | 12 + .../Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml | 15 + ...sk_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml | 36 + ...X_152_32x8d_FPN_IN5k_gn_dconv_parsing.yaml | 42 + .../detectron2/configs/Misc/demo.yaml | 25 + .../mask_rcnn_R_50_FPN_1x_cls_agnostic.yaml | 10 + .../mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml | 8 + .../mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml | 11 + .../Misc/mask_rcnn_R_50_FPN_3x_gn.yaml | 21 + .../Misc/mask_rcnn_R_50_FPN_3x_syncbn.yaml | 24 + ...anoptic_fpn_R_101_dconv_cascade_gn_3x.yaml | 26 + .../configs/Misc/parsing_finetune_cihp.yaml | 24 + .../configs/Misc/parsing_inference.yaml | 26 + .../scratch_mask_rcnn_R_50_FPN_3x_gn.yaml | 13 + .../scratch_mask_rcnn_R_50_FPN_9x_gn.yaml | 19 + .../scratch_mask_rcnn_R_50_FPN_9x_syncbn.yaml | 19 + .../configs/Misc/semantic_R_50_FPN_1x.yaml | 11 + .../faster_rcnn_R_50_C4.yaml | 18 + .../faster_rcnn_R_50_FPN.yaml | 18 + .../detectron2/configs/my_Base-RCNN-FPN.yaml | 42 + .../configs/quick_schedules/README.md | 1 + ...mask_rcnn_R_50_FPN_inference_acc_test.yaml | 7 + ...scade_mask_rcnn_R_50_FPN_instant_test.yaml | 11 + ...fast_rcnn_R_50_FPN_inference_acc_test.yaml | 7 + .../fast_rcnn_R_50_FPN_instant_test.yaml | 15 + ...oint_rcnn_R_50_FPN_inference_acc_test.yaml | 7 + .../keypoint_rcnn_R_50_FPN_instant_test.yaml | 14 + ...R_50_FPN_normalized_training_acc_test.yaml | 30 + ...point_rcnn_R_50_FPN_training_acc_test.yaml | 28 + .../mask_rcnn_R_50_C4_GCV_instant_test.yaml | 18 + .../mask_rcnn_R_50_C4_inference_acc_test.yaml | 7 + .../mask_rcnn_R_50_C4_instant_test.yaml | 14 + .../mask_rcnn_R_50_C4_training_acc_test.yaml | 22 + ...mask_rcnn_R_50_DC5_inference_acc_test.yaml | 7 + ...mask_rcnn_R_50_FPN_inference_acc_test.yaml | 10 + .../mask_rcnn_R_50_FPN_instant_test.yaml | 14 + .../mask_rcnn_R_50_FPN_training_acc_test.yaml | 21 + .../panoptic_fpn_R_50_inference_acc_test.yaml | 7 + .../panoptic_fpn_R_50_instant_test.yaml | 19 + .../panoptic_fpn_R_50_training_acc_test.yaml | 20 + ...retinanet_R_50_FPN_inference_acc_test.yaml | 7 + .../retinanet_R_50_FPN_instant_test.yaml | 13 + .../rpn_R_50_FPN_inference_acc_test.yaml | 7 + .../rpn_R_50_FPN_instant_test.yaml | 13 + .../semantic_R_50_FPN_inference_acc_test.yaml | 10 + .../semantic_R_50_FPN_instant_test.yaml | 18 + .../semantic_R_50_FPN_training_acc_test.yaml | 20 + .../mhp_extension/detectron2/demo/README.md | 8 + .../mhp_extension/detectron2/demo/demo.py | 161 + .../detectron2/demo/predictor.py | 220 ++ .../detectron2/detectron2/__init__.py | 10 + .../detectron2/checkpoint/__init__.py | 10 + .../detectron2/checkpoint/c2_model_loading.py | 313 ++ .../detectron2/checkpoint/catalog.py | 134 + .../checkpoint/detection_checkpoint.py | 73 + .../detectron2/detectron2/config/__init__.py | 13 + .../detectron2/detectron2/config/compat.py | 229 ++ .../detectron2/detectron2/config/config.py | 202 + .../detectron2/detectron2/config/defaults.py | 598 +++ .../detectron2/detectron2/data/__init__.py | 18 + .../detectron2/detectron2/data/build.py | 397 ++ .../detectron2/detectron2/data/catalog.py | 221 ++ .../detectron2/detectron2/data/common.py | 149 + .../detectron2/data/dataset_mapper.py | 149 + .../detectron2/data/datasets/README.md | 9 + .../detectron2/data/datasets/__init__.py | 9 + .../detectron2/data/datasets/builtin.py | 220 ++ .../detectron2/data/datasets/builtin_meta.py | 267 ++ .../detectron2/data/datasets/cityscapes.py | 329 ++ .../detectron2/data/datasets/coco.py | 466 +++ .../detectron2/data/datasets/lvis.py | 209 + .../data/datasets/lvis_v0_5_categories.py | 13 + .../detectron2/data/datasets/pascal_voc.py | 80 + .../detectron2/data/datasets/register_coco.py | 129 + .../detectron2/data/detection_utils.py | 516 +++ .../detectron2/data/samplers/__init__.py | 10 + .../data/samplers/distributed_sampler.py | 199 + .../data/samplers/grouped_batch_sampler.py | 47 + .../detectron2/data/transforms/__init__.py | 6 + .../detectron2/data/transforms/transform.py | 241 ++ .../data/transforms/transform_gen.py | 534 +++ .../detectron2/detectron2/engine/__init__.py | 12 + .../detectron2/detectron2/engine/defaults.py | 531 +++ .../detectron2/detectron2/engine/hooks.py | 427 ++ .../detectron2/detectron2/engine/launch.py | 89 + .../detectron2/engine/train_loop.py | 273 ++ .../detectron2/evaluation/__init__.py | 12 + .../evaluation/cityscapes_evaluation.py | 187 + .../detectron2/evaluation/coco_evaluation.py | 512 +++ .../detectron2/evaluation/evaluator.py | 196 + .../detectron2/evaluation/lvis_evaluation.py | 350 ++ .../evaluation/panoptic_evaluation.py | 167 + .../evaluation/pascal_voc_evaluation.py | 294 ++ .../evaluation/rotated_coco_evaluation.py | 204 + .../evaluation/sem_seg_evaluation.py | 168 + .../detectron2/evaluation/testing.py | 78 + .../detectron2/detectron2/export/README.md | 10 + .../detectron2/detectron2/export/__init__.py | 5 + .../detectron2/detectron2/export/api.py | 277 ++ .../detectron2/detectron2/export/c10.py | 503 +++ .../detectron2/export/caffe2_export.py | 204 + .../detectron2/export/caffe2_inference.py | 136 + .../detectron2/export/caffe2_modeling.py | 493 +++ .../detectron2/detectron2/export/patcher.py | 153 + .../detectron2/detectron2/export/shared.py | 1034 +++++ .../detectron2/detectron2/layers/__init__.py | 12 + .../detectron2/layers/batch_norm.py | 242 ++ .../detectron2/detectron2/layers/blocks.py | 48 + .../detectron2/layers/csrc/README.md | 7 + .../layers/csrc/ROIAlign/ROIAlign.h | 130 + .../layers/csrc/ROIAlign/ROIAlign_cpu.cpp | 508 +++ .../layers/csrc/ROIAlign/ROIAlign_cuda.cu | 430 ++ .../csrc/ROIAlignRotated/ROIAlignRotated.h | 115 + .../ROIAlignRotated/ROIAlignRotated_cpu.cpp | 522 +++ .../ROIAlignRotated/ROIAlignRotated_cuda.cu | 443 +++ .../csrc/box_iou_rotated/box_iou_rotated.h | 35 + .../box_iou_rotated/box_iou_rotated_cpu.cpp | 39 + .../box_iou_rotated/box_iou_rotated_cuda.cu | 130 + .../box_iou_rotated/box_iou_rotated_utils.h | 363 ++ .../detectron2/layers/csrc/cuda_version.cu | 9 + .../layers/csrc/deformable/deform_conv.h | 377 ++ .../csrc/deformable/deform_conv_cuda.cu | 1131 ++++++ .../deformable/deform_conv_cuda_kernel.cu | 1288 ++++++ .../layers/csrc/nms_rotated/nms_rotated.h | 39 + .../csrc/nms_rotated/nms_rotated_cpu.cpp | 75 + .../csrc/nms_rotated/nms_rotated_cuda.cu | 139 + .../detectron2/layers/csrc/vision.cpp | 102 + .../detectron2/layers/deform_conv.py | 494 +++ .../detectron2/detectron2/layers/mask_ops.py | 248 ++ .../detectron2/detectron2/layers/nms.py | 146 + .../detectron2/detectron2/layers/roi_align.py | 105 + .../detectron2/layers/roi_align_rotated.py | 88 + .../detectron2/layers/rotated_boxes.py | 22 + .../detectron2/layers/shape_spec.py | 20 + .../detectron2/detectron2/layers/wrappers.py | 215 + .../detectron2/model_zoo/__init__.py | 9 + .../detectron2/model_zoo/model_zoo.py | 150 + .../detectron2/modeling/__init__.py | 56 + .../detectron2/modeling/anchor_generator.py | 382 ++ .../detectron2/modeling/backbone/__init__.py | 9 + .../detectron2/modeling/backbone/backbone.py | 53 + .../detectron2/modeling/backbone/build.py | 33 + .../detectron2/modeling/backbone/fpn.py | 245 ++ .../detectron2/modeling/backbone/resnet.py | 591 +++ .../detectron2/modeling/box_regression.py | 247 ++ .../detectron2/detectron2/modeling/matcher.py | 123 + .../detectron2/modeling/meta_arch/__init__.py | 11 + .../detectron2/modeling/meta_arch/build.py | 23 + .../modeling/meta_arch/panoptic_fpn.py | 218 + .../detectron2/modeling/meta_arch/rcnn.py | 263 ++ .../modeling/meta_arch/retinanet.py | 489 +++ .../modeling/meta_arch/semantic_seg.py | 186 + .../detectron2/detectron2/modeling/poolers.py | 231 ++ .../detectron2/modeling/postprocessing.py | 79 + .../modeling/proposal_generator/__init__.py | 3 + .../modeling/proposal_generator/build.py | 24 + .../proposal_generator/proposal_utils.py | 57 + .../modeling/proposal_generator/rpn.py | 285 ++ .../proposal_generator/rpn_outputs.py | 323 ++ .../modeling/proposal_generator/rrpn.py | 233 ++ .../detectron2/modeling/roi_heads/__init__.py | 16 + .../detectron2/modeling/roi_heads/box_head.py | 115 + .../modeling/roi_heads/cascade_rcnn.py | 298 ++ .../modeling/roi_heads/fast_rcnn.py | 510 +++ .../modeling/roi_heads/keypoint_head.py | 253 ++ .../modeling/roi_heads/mask_head.py | 277 ++ .../modeling/roi_heads/roi_heads.py | 812 ++++ .../modeling/roi_heads/rotated_fast_rcnn.py | 276 ++ .../detectron2/modeling/sampling.py | 50 + .../modeling/test_time_augmentation.py | 285 ++ .../detectron2/detectron2/solver/__init__.py | 5 + .../detectron2/detectron2/solver/build.py | 165 + .../detectron2/solver/lr_scheduler.py | 116 + .../detectron2/structures/__init__.py | 11 + .../detectron2/detectron2/structures/boxes.py | 367 ++ .../detectron2/structures/image_list.py | 113 + .../detectron2/structures/instances.py | 185 + .../detectron2/structures/keypoints.py | 209 + .../detectron2/detectron2/structures/masks.py | 424 ++ .../detectron2/structures/rotated_boxes.py | 481 +++ .../detectron2/detectron2/utils/README.md | 5 + .../detectron2/detectron2/utils/__init__.py | 1 + .../detectron2/detectron2/utils/analysis.py | 164 + .../detectron2/utils/collect_env.py | 160 + .../detectron2/detectron2/utils/colormap.py | 140 + .../detectron2/detectron2/utils/comm.py | 263 ++ .../detectron2/detectron2/utils/env.py | 116 + .../detectron2/detectron2/utils/events.py | 432 ++ .../detectron2/detectron2/utils/logger.py | 221 ++ .../detectron2/detectron2/utils/memory.py | 86 + .../detectron2/detectron2/utils/registry.py | 6 + .../detectron2/detectron2/utils/serialize.py | 29 + .../detectron2/utils/video_visualizer.py | 235 ++ .../detectron2/detectron2/utils/visualizer.py | 1143 ++++++ .../mhp_extension/detectron2/dev/README.md | 7 + .../mhp_extension/detectron2/dev/linter.sh | 46 + .../detectron2/dev/packaging/README.md | 17 + .../dev/packaging/build_all_wheels.sh | 57 + .../detectron2/dev/packaging/build_wheel.sh | 32 + .../dev/packaging/gen_wheel_index.sh | 27 + .../detectron2/dev/packaging/pkg_helpers.bash | 57 + .../detectron2/dev/parse_results.sh | 45 + .../detectron2/dev/run_inference_tests.sh | 44 + .../detectron2/dev/run_instant_tests.sh | 27 + .../detectron2/docker/Dockerfile | 49 + .../detectron2/docker/Dockerfile-circleci | 17 + .../mhp_extension/detectron2/docker/README.md | 36 + .../detectron2/docker/docker-compose.yml | 18 + .../mhp_extension/detectron2/docs/.gitignore | 1 + .../mhp_extension/detectron2/docs/Makefile | 19 + .../mhp_extension/detectron2/docs/README.md | 16 + .../mhp_extension/detectron2/docs/conf.py | 335 ++ .../mhp_extension/detectron2/docs/index.rst | 14 + .../detectron2/docs/modules/checkpoint.rst | 7 + .../detectron2/docs/modules/config.rst | 17 + .../detectron2/docs/modules/data.rst | 40 + .../detectron2/docs/modules/engine.rst | 25 + .../detectron2/docs/modules/evaluation.rst | 7 + .../detectron2/docs/modules/export.rst | 7 + .../detectron2/docs/modules/index.rst | 17 + .../detectron2/docs/modules/layers.rst | 7 + .../detectron2/docs/modules/model_zoo.rst | 7 + .../detectron2/docs/modules/modeling.rst | 58 + .../detectron2/docs/modules/solver.rst | 7 + .../detectron2/docs/modules/structures.rst | 7 + .../detectron2/docs/modules/utils.rst | 80 + .../detectron2/docs/notes/benchmarks.md | 196 + .../detectron2/docs/notes/changelog.md | 26 + .../detectron2/docs/notes/compatibility.md | 83 + .../detectron2/docs/notes/contributing.md | 49 + .../detectron2/docs/notes/index.rst | 10 + .../detectron2/docs/tutorials/README.md | 4 + .../docs/tutorials/builtin_datasets.md | 99 + .../detectron2/docs/tutorials/configs.md | 58 + .../detectron2/docs/tutorials/data_loading.md | 77 + .../detectron2/docs/tutorials/datasets.md | 221 ++ .../detectron2/docs/tutorials/deployment.md | 92 + .../detectron2/docs/tutorials/evaluation.md | 43 + .../detectron2/docs/tutorials/extend.md | 53 + .../docs/tutorials/getting_started.md | 79 + .../detectron2/docs/tutorials/index.rst | 18 + .../detectron2/docs/tutorials/install.md | 184 + .../detectron2/docs/tutorials/models.md | 151 + .../detectron2/docs/tutorials/training.md | 50 + .../detectron2/docs/tutorials/write-models.md | 39 + .../detectron2/projects/DensePose/README.md | 54 + .../projects/DensePose/apply_net.py | 318 ++ .../configs/Base-DensePose-RCNN-FPN.yaml | 47 + .../densepose_rcnn_R_101_FPN_DL_WC1_s1x.yaml | 16 + .../densepose_rcnn_R_101_FPN_DL_WC2_s1x.yaml | 16 + .../densepose_rcnn_R_101_FPN_DL_s1x.yaml | 10 + .../densepose_rcnn_R_101_FPN_WC1_s1x.yaml | 16 + .../densepose_rcnn_R_101_FPN_WC2_s1x.yaml | 16 + .../configs/densepose_rcnn_R_101_FPN_s1x.yaml | 8 + .../densepose_rcnn_R_101_FPN_s1x_legacy.yaml | 17 + .../densepose_rcnn_R_50_FPN_DL_WC1_s1x.yaml | 16 + .../densepose_rcnn_R_50_FPN_DL_WC2_s1x.yaml | 16 + .../densepose_rcnn_R_50_FPN_DL_s1x.yaml | 10 + .../densepose_rcnn_R_50_FPN_WC1_s1x.yaml | 16 + .../densepose_rcnn_R_50_FPN_WC2_s1x.yaml | 16 + .../configs/densepose_rcnn_R_50_FPN_s1x.yaml | 8 + .../densepose_rcnn_R_50_FPN_s1x_legacy.yaml | 17 + .../configs/evolution/Base-RCNN-FPN-MC.yaml | 91 + .../evolution/faster_rcnn_R_50_FPN_1x_MC.yaml | 7 + ...nsepose_rcnn_R_50_FPN_DL_instant_test.yaml | 11 + ..._rcnn_R_50_FPN_TTA_inference_acc_test.yaml | 13 + ...sepose_rcnn_R_50_FPN_WC1_instant_test.yaml | 19 + ...sepose_rcnn_R_50_FPN_WC2_instant_test.yaml | 19 + ...pose_rcnn_R_50_FPN_inference_acc_test.yaml | 8 + .../densepose_rcnn_R_50_FPN_instant_test.yaml | 9 + ...epose_rcnn_R_50_FPN_training_acc_test.yaml | 14 + .../projects/DensePose/densepose/__init__.py | 9 + .../projects/DensePose/densepose/config.py | 68 + .../DensePose/densepose/data/__init__.py | 9 + .../DensePose/densepose/data/build.py | 405 ++ .../densepose/data/dataset_mapper.py | 118 + .../densepose/data/datasets/__init__.py | 5 + .../densepose/data/datasets/builtin.py | 10 + .../DensePose/densepose/data/datasets/coco.py | 314 ++ .../DensePose/densepose/data/structures.py | 579 +++ .../densepose/densepose_coco_evaluation.py | 1138 ++++++ .../DensePose/densepose/densepose_head.py | 1216 ++++++ .../projects/DensePose/densepose/evaluator.py | 158 + .../modeling/test_time_augmentation.py | 75 + .../projects/DensePose/densepose/roi_head.py | 213 + .../DensePose/densepose/utils/dbhelper.py | 145 + .../DensePose/densepose/utils/logger.py | 13 + .../DensePose/densepose/utils/transform.py | 16 + .../projects/DensePose/densepose/vis/base.py | 191 + .../DensePose/densepose/vis/bounding_box.py | 37 + .../DensePose/densepose/vis/densepose.py | 593 +++ .../DensePose/densepose/vis/extractor.py | 152 + .../projects/DensePose/dev/README.md | 7 + .../DensePose/dev/run_inference_tests.sh | 33 + .../DensePose/dev/run_instant_tests.sh | 28 + .../projects/DensePose/doc/GETTING_STARTED.md | 58 + .../projects/DensePose/doc/MODEL_ZOO.md | 277 ++ .../projects/DensePose/doc/TOOL_APPLY_NET.md | 130 + .../projects/DensePose/doc/TOOL_QUERY_DB.md | 105 + .../detectron2/projects/DensePose/query_db.py | 250 ++ .../projects/DensePose/tests/common.py | 110 + .../DensePose/tests/test_model_e2e.py | 43 + .../projects/DensePose/tests/test_setup.py | 30 + .../DensePose/tests/test_structures.py | 25 + .../projects/DensePose/train_net.py | 122 + .../detectron2/projects/PointRend/README.md | 135 + .../Base-PointRend-RCNN-FPN.yaml | 21 + ...pointrend_rcnn_R_50_FPN_1x_cityscapes.yaml | 23 + .../pointrend_rcnn_R_50_FPN_1x_coco.yaml | 9 + .../pointrend_rcnn_R_50_FPN_3x_coco.yaml | 13 + .../pointrend_rcnn_R_50_FPN_3x_parsing.yaml | 20 + ...trend_rcnn_X_101_32x8d_FPN_3x_parsing.yaml | 28 + .../Base-PointRend-Semantic-FPN.yaml | 19 + ...rend_semantic_R_101_FPN_1x_cityscapes.yaml | 33 + .../pointrend_semantic_R_50_FPN_1x_coco.yaml | 5 + .../projects/PointRend/finetune_net.py | 139 + .../PointRend/logs/hadoop.kylin.libdfs.log | 0 .../projects/PointRend/point_rend/__init__.py | 6 + .../PointRend/point_rend/coarse_mask_head.py | 92 + .../point_rend/color_augmentation.py | 98 + .../projects/PointRend/point_rend/config.py | 48 + .../PointRend/point_rend/dataset_mapper.py | 121 + .../PointRend/point_rend/point_features.py | 216 + .../PointRend/point_rend/point_head.py | 154 + .../PointRend/point_rend/roi_heads.py | 227 ++ .../PointRend/point_rend/semantic_seg.py | 134 + .../detectron2/projects/PointRend/run.sh | 2 + .../projects/PointRend/train_net.py | 133 + .../detectron2/projects/README.md | 31 + .../detectron2/projects/TensorMask/README.md | 64 + .../TensorMask/configs/Base-TensorMask.yaml | 25 + .../configs/tensormask_R_50_FPN_1x.yaml | 5 + .../configs/tensormask_R_50_FPN_6x.yaml | 11 + .../detectron2/projects/TensorMask/setup.py | 69 + .../TensorMask/tensormask/__init__.py | 3 + .../projects/TensorMask/tensormask/arch.py | 904 +++++ .../projects/TensorMask/tensormask/config.py | 50 + .../TensorMask/tensormask/layers/__init__.py | 4 + .../layers/csrc/SwapAlign2Nat/SwapAlign2Nat.h | 54 + .../csrc/SwapAlign2Nat/SwapAlign2Nat_cuda.cu | 526 +++ .../tensormask/layers/csrc/vision.cpp | 19 + .../tensormask/layers/swap_align2nat.py | 61 + .../projects/TensorMask/tests/__init__.py | 1 + .../TensorMask/tests/test_swap_align2nat.py | 32 + .../projects/TensorMask/train_net.py | 70 + .../detectron2/projects/TridentNet/README.md | 60 + .../configs/Base-TridentNet-Fast-C4.yaml | 29 + .../configs/tridentnet_fast_R_101_C4_3x.yaml | 9 + .../configs/tridentnet_fast_R_50_C4_1x.yaml | 6 + .../configs/tridentnet_fast_R_50_C4_3x.yaml | 9 + .../projects/TridentNet/train_net.py | 67 + .../TridentNet/tridentnet/__init__.py | 9 + .../projects/TridentNet/tridentnet/config.py | 26 + .../TridentNet/tridentnet/trident_backbone.py | 223 ++ .../TridentNet/tridentnet/trident_conv.py | 107 + .../TridentNet/tridentnet/trident_rcnn.py | 116 + .../TridentNet/tridentnet/trident_rpn.py | 32 + .../mhp_extension/detectron2/setup.cfg | 26 + .../mhp_extension/detectron2/setup.py | 156 + .../mhp_extension/detectron2/tests/README.md | 9 + .../detectron2/tests/__init__.py | 1 + .../detectron2/tests/data/__init__.py | 0 .../detectron2/tests/data/test_coco.py | 77 + .../tests/data/test_detection_utils.py | 116 + .../tests/data/test_rotation_transform.py | 62 + .../detectron2/tests/data/test_sampler.py | 23 + .../detectron2/tests/data/test_transforms.py | 134 + .../detectron2/tests/layers/__init__.py | 0 .../detectron2/tests/layers/test_mask_ops.py | 190 + .../tests/layers/test_nms_rotated.py | 188 + .../detectron2/tests/layers/test_roi_align.py | 152 + .../tests/layers/test_roi_align_rotated.py | 176 + .../detectron2/tests/modeling/__init__.py | 0 .../tests/modeling/test_anchor_generator.py | 121 + .../tests/modeling/test_box2box_transform.py | 64 + .../tests/modeling/test_fast_rcnn.py | 106 + .../tests/modeling/test_model_e2e.py | 154 + .../tests/modeling/test_roi_heads.py | 108 + .../tests/modeling/test_roi_pooler.py | 85 + .../detectron2/tests/modeling/test_rpn.py | 234 ++ .../detectron2/tests/structures/__init__.py | 0 .../detectron2/tests/structures/test_boxes.py | 182 + .../tests/structures/test_imagelist.py | 38 + .../tests/structures/test_instances.py | 25 + .../tests/structures/test_rotated_boxes.py | 357 ++ .../detectron2/tests/test_checkpoint.py | 48 + .../detectron2/tests/test_config.py | 240 ++ .../detectron2/tests/test_export_caffe2.py | 71 + .../detectron2/tests/test_model_analysis.py | 58 + .../detectron2/tests/test_model_zoo.py | 29 + .../detectron2/tests/test_visualizer.py | 143 + .../mhp_extension/detectron2/tools/README.md | 45 + .../detectron2/tools/analyze_model.py | 127 + .../detectron2/tools/benchmark.py | 167 + .../tools/convert-torchvision-to-d2.py | 56 + .../detectron2/tools/deploy/README.md | 9 + .../tools/deploy/caffe2_converter.py | 98 + .../tools/deploy/caffe2_mask_rcnn.cpp | 119 + .../deploy/torchscript_traced_mask_rcnn.cpp | 71 + .../detectron2/tools/finetune_net.py | 183 + .../detectron2/tools/inference.sh | 4 + .../detectron2/tools/plain_train_net.py | 237 ++ .../mhp_extension/detectron2/tools/run.sh | 3 + .../detectron2/tools/train_net.py | 171 + .../detectron2/tools/visualize_data.py | 93 + .../tools/visualize_json_results.py | 90 + .../global_local_datasets.py | 200 + .../global_local_evaluate.py | 210 + .../global_local_train.py | 232 ++ .../global_local_parsing/make_id_list.py | 13 + .../mhp_extension/logits_fusion.py | 307 ++ .../make_crop_and_mask_w_mask_nms.py | 134 + .../scripts/make_coco_style_annotation.sh | 14 + .../mhp_extension/scripts/make_crop.sh | 6 + .../mhp_extension/scripts/parsing_fusion.sh | 6 + preprocess/humanparsing/modules/__init__.py | 5 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 727 bytes .../modules/__pycache__/bn.cpython-311.pyc | Bin 0 -> 7817 bytes .../modules/__pycache__/dense.cpython-311.pyc | Bin 0 -> 3076 bytes .../__pycache__/functions.cpython-311.pyc | Bin 0 -> 13279 bytes .../modules/__pycache__/misc.cpython-311.pyc | Bin 0 -> 2261 bytes .../__pycache__/residual.cpython-311.pyc | Bin 0 -> 9531 bytes preprocess/humanparsing/modules/bn.py | 132 + preprocess/humanparsing/modules/deeplab.py | 84 + preprocess/humanparsing/modules/dense.py | 42 + preprocess/humanparsing/modules/functions.py | 245 ++ preprocess/humanparsing/modules/misc.py | 21 + preprocess/humanparsing/modules/residual.py | 182 + preprocess/humanparsing/modules/src/checks.h | 15 + .../humanparsing/modules/src/inplace_abn.cpp | 95 + .../humanparsing/modules/src/inplace_abn.h | 88 + .../modules/src/inplace_abn_cpu.cpp | 119 + .../modules/src/inplace_abn_cuda.cu | 333 ++ .../modules/src/inplace_abn_cuda_half.cu | 275 ++ .../humanparsing/modules/src/utils/checks.h | 15 + .../humanparsing/modules/src/utils/common.h | 49 + .../humanparsing/modules/src/utils/cuda.cuh | 71 + .../humanparsing/networks/AugmentCE2P.py | 388 ++ preprocess/humanparsing/networks/__init__.py | 12 + .../__pycache__/AugmentCE2P.cpython-311.pyc | Bin 0 -> 24008 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 862 bytes .../networks/backbone/mobilenetv2.py | 156 + .../humanparsing/networks/backbone/resnet.py | 205 + .../humanparsing/networks/backbone/resnext.py | 149 + .../networks/context_encoding/aspp.py | 64 + .../networks/context_encoding/ocnet.py | 226 ++ .../networks/context_encoding/psp.py | 48 + preprocess/humanparsing/parsing_api.py | 238 ++ preprocess/humanparsing/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 272 bytes .../__pycache__/transforms.cpython-311.pyc | Bin 0 -> 9217 bytes .../humanparsing/utils/consistency_loss.py | 33 + preprocess/humanparsing/utils/criterion.py | 142 + preprocess/humanparsing/utils/encoding.py | 188 + preprocess/humanparsing/utils/kl_loss.py | 44 + .../humanparsing/utils/lovasz_softmax.py | 279 ++ preprocess/humanparsing/utils/miou.py | 155 + preprocess/humanparsing/utils/schp.py | 80 + .../humanparsing/utils/soft_dice_loss.py | 111 + preprocess/humanparsing/utils/transforms.py | 167 + .../humanparsing/utils/warmup_scheduler.py | 71 + .../openpose/annotator/openpose/LICENSE | 108 + .../openpose/annotator/openpose/__init__.py | 102 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6424 bytes .../openpose/__pycache__/body.cpython-311.pyc | Bin 0 -> 17468 bytes .../openpose/__pycache__/face.cpython-311.pyc | Bin 0 -> 19773 bytes .../openpose/__pycache__/hand.cpython-311.pyc | Bin 0 -> 6780 bytes .../__pycache__/model.cpython-311.pyc | Bin 0 -> 11275 bytes .../openpose/__pycache__/util.cpython-311.pyc | Bin 0 -> 16475 bytes .../openpose/annotator/openpose/body.py | 229 ++ .../openpose/annotator/openpose/face.py | 368 ++ .../openpose/annotator/openpose/hand.py | 98 + .../openpose/annotator/openpose/model.py | 219 + .../openpose/annotator/openpose/util.py | 297 ++ preprocess/openpose/annotator/util.py | 100 + preprocess/openpose/run_openpose.py | 84 + requirements.txt | 18 + utils_ootd.py | 235 ++ 582 files changed, 75693 insertions(+) create mode 100644 OodGenerater.py create mode 100644 __init__.py create mode 100644 checkpoints/README.txt create mode 100644 images/demo.png create mode 100644 images/workflow.png create mode 100644 ootd/__pycache__/inference_ootd_dc.cpython-311.pyc create mode 100644 ootd/__pycache__/inference_ootd_hd.cpython-311.pyc create mode 100644 ootd/inference_ootd.py create mode 100644 ootd/inference_ootd_dc.py create mode 100644 ootd/inference_ootd_hd.py create mode 100644 ootd/pipelines_ootd/__pycache__/attention_garm.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/attention_vton.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/pipeline_ootd.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/transformer_garm_2d.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/transformer_vton_2d.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/unet_garm_2d_blocks.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/unet_garm_2d_condition.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/unet_vton_2d_blocks.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/__pycache__/unet_vton_2d_condition.cpython-311.pyc create mode 100644 ootd/pipelines_ootd/attention_garm.py create mode 100644 ootd/pipelines_ootd/attention_vton.py create mode 100644 ootd/pipelines_ootd/pipeline_ootd.py create mode 100644 ootd/pipelines_ootd/transformer_garm_2d.py create mode 100644 ootd/pipelines_ootd/transformer_vton_2d.py create mode 100644 ootd/pipelines_ootd/unet_garm_2d_blocks.py create mode 100644 ootd/pipelines_ootd/unet_garm_2d_condition.py create mode 100644 ootd/pipelines_ootd/unet_vton_2d_blocks.py create mode 100644 ootd/pipelines_ootd/unet_vton_2d_condition.py create mode 100644 preprocess/humanparsing/aigc_run_parsing.py create mode 100644 preprocess/humanparsing/datasets/__init__.py create mode 100644 preprocess/humanparsing/datasets/__pycache__/__init__.cpython-311.pyc create mode 100644 preprocess/humanparsing/datasets/__pycache__/simple_extractor_dataset.cpython-311.pyc create mode 100644 preprocess/humanparsing/datasets/datasets.py create mode 100644 preprocess/humanparsing/datasets/simple_extractor_dataset.py create mode 100644 preprocess/humanparsing/datasets/target_generation.py create mode 100644 preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/human_to_coco.py create mode 100644 preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/pycococreatortools.py create mode 100644 preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/test_human2coco_format.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.circleci/config.yml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.clang-format create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.flake8 create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/CODE_OF_CONDUCT.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/CONTRIBUTING.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/Detectron2-Logo-Horz.svg create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/bugs.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/config.yml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/feature-request.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/questions-help-support.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/unexpected-problems-bugs.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.github/pull_request_template.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/.gitignore create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/GETTING_STARTED.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/INSTALL.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/LICENSE create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/MODEL_ZOO.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-C4.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-DilatedC5.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RetinaNet.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_C4_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_DC5_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_101_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_C4_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_C4_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_DC5_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/Base-Keypoint-RCNN-FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_X_101_32x8d_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/Base-Panoptic-FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Cityscapes/mask_rcnn_R_50_FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/faster_rcnn_R_50_FPN_noaug_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/keypoint_rcnn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_101_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv_parsing.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/demo.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_cls_agnostic.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_gn.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_syncbn.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_finetune_cihp.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_inference.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_gn.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_syncbn.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/semantic_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_C4.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/my_Base-RCNN-FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_normalized_training_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_training_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_GCV_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_training_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_DC5_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_training_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_training_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_training_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/demo/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/demo/demo.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/demo/predictor.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/c2_model_loading.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/catalog.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/detection_checkpoint.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/compat.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/config.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/defaults.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/build.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/catalog.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/common.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/dataset_mapper.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin_meta.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/cityscapes.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/coco.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis_v0_5_categories.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/pascal_voc.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/register_coco.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/detection_utils.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/distributed_sampler.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/grouped_batch_sampler.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform_gen.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/defaults.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/hooks.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/launch.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/train_loop.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/cityscapes_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/coco_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/evaluator.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/lvis_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/panoptic_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/pascal_voc_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/rotated_coco_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/sem_seg_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/testing.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/api.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/c10.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_export.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_inference.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_modeling.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/patcher.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/shared.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/batch_norm.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/blocks.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign.h create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cpu.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cuda.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated.h create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cpu.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cuda.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated.h create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cpu.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cuda.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_utils.h create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/cuda_version.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv.h create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda_kernel.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated.h create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cpu.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cuda.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/vision.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/deform_conv.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/mask_ops.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/nms.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align_rotated.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/rotated_boxes.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/shape_spec.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/wrappers.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/model_zoo.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/anchor_generator.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/backbone.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/build.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/fpn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/resnet.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/box_regression.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/matcher.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/build.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/panoptic_fpn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/rcnn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/retinanet.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/semantic_seg.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/poolers.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/postprocessing.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/build.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/proposal_utils.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn_outputs.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rrpn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/box_head.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/cascade_rcnn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/fast_rcnn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/keypoint_head.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/mask_head.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/roi_heads.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/rotated_fast_rcnn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/sampling.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/test_time_augmentation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/build.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/lr_scheduler.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/boxes.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/image_list.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/instances.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/keypoints.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/masks.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/rotated_boxes.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/analysis.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/collect_env.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/colormap.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/comm.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/env.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/events.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/logger.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/memory.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/registry.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/serialize.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/video_visualizer.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/visualizer.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/linter.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/build_all_wheels.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/build_wheel.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/gen_wheel_index.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/pkg_helpers.bash create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/parse_results.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/run_inference_tests.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/dev/run_instant_tests.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile-circleci create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docker/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docker/docker-compose.yml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/.gitignore create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/Makefile create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/conf.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/index.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/checkpoint.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/config.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/data.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/engine.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/evaluation.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/export.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/index.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/layers.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/model_zoo.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/modeling.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/solver.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/structures.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/modules/utils.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/notes/benchmarks.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/notes/changelog.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/notes/compatibility.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/notes/contributing.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/notes/index.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/builtin_datasets.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/configs.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/data_loading.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/datasets.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/deployment.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/evaluation.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/extend.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/getting_started.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/index.rst create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/install.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/models.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/training.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/write-models.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/apply_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/Base-DensePose-RCNN-FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC1_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC2_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC1_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC2_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x_legacy.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC1_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC2_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC1_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC2_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x_legacy.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/Base-RCNN-FPN-MC.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/faster_rcnn_R_50_FPN_1x_MC.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_DL_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_TTA_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC1_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC2_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_inference_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_instant_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_training_acc_test.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/config.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/build.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/dataset_mapper.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/builtin.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/coco.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/structures.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_coco_evaluation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_head.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/evaluator.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/modeling/test_time_augmentation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/roi_head.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/dbhelper.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/logger.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/transform.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/base.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/bounding_box.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/densepose.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/extractor.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_inference_tests.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_instant_tests.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/GETTING_STARTED.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/MODEL_ZOO.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_APPLY_NET.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_QUERY_DB.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/query_db.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/common.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_model_e2e.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_setup.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_structures.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/train_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/Base-PointRend-RCNN-FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_cityscapes.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_coco.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_parsing.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_X_101_32x8d_FPN_3x_parsing.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/Base-PointRend-Semantic-FPN.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_101_FPN_1x_cityscapes.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_50_FPN_1x_coco.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/finetune_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/logs/hadoop.kylin.libdfs.log create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/coarse_mask_head.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/color_augmentation.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/config.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/dataset_mapper.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_features.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_head.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/roi_heads.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/semantic_seg.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/run.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/train_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/Base-TensorMask.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_6x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/setup.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/arch.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/config.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat.h create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat_cuda.cu create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/vision.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/swap_align2nat.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/test_swap_align2nat.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/train_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/Base-TridentNet-Fast-C4.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_101_C4_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_1x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_3x.yaml create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/train_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/config.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_backbone.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_conv.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rcnn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rpn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/setup.cfg create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/setup.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/data/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_coco.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_detection_utils.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_rotation_transform.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_sampler.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_transforms.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/layers/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_mask_ops.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_nms_rotated.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align_rotated.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_anchor_generator.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_box2box_transform.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_fast_rcnn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_model_e2e.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_heads.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_pooler.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_rpn.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/structures/__init__.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_boxes.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_imagelist.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_instances.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_rotated_boxes.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/test_checkpoint.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/test_config.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/test_export_caffe2.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_analysis.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_zoo.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tests/test_visualizer.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/analyze_model.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/benchmark.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/convert-torchvision-to-d2.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/README.md create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_converter.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_mask_rcnn.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/torchscript_traced_mask_rcnn.cpp create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/finetune_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/inference.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/plain_train_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/run.sh create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/train_net.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_data.py create mode 100644 preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_json_results.py create mode 100644 preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_datasets.py create mode 100644 preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_evaluate.py create mode 100644 preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_train.py create mode 100644 preprocess/humanparsing/mhp_extension/global_local_parsing/make_id_list.py create mode 100644 preprocess/humanparsing/mhp_extension/logits_fusion.py create mode 100644 preprocess/humanparsing/mhp_extension/make_crop_and_mask_w_mask_nms.py create mode 100644 preprocess/humanparsing/mhp_extension/scripts/make_coco_style_annotation.sh create mode 100644 preprocess/humanparsing/mhp_extension/scripts/make_crop.sh create mode 100644 preprocess/humanparsing/mhp_extension/scripts/parsing_fusion.sh create mode 100644 preprocess/humanparsing/modules/__init__.py create mode 100644 preprocess/humanparsing/modules/__pycache__/__init__.cpython-311.pyc create mode 100644 preprocess/humanparsing/modules/__pycache__/bn.cpython-311.pyc create mode 100644 preprocess/humanparsing/modules/__pycache__/dense.cpython-311.pyc create mode 100644 preprocess/humanparsing/modules/__pycache__/functions.cpython-311.pyc create mode 100644 preprocess/humanparsing/modules/__pycache__/misc.cpython-311.pyc create mode 100644 preprocess/humanparsing/modules/__pycache__/residual.cpython-311.pyc create mode 100644 preprocess/humanparsing/modules/bn.py create mode 100644 preprocess/humanparsing/modules/deeplab.py create mode 100644 preprocess/humanparsing/modules/dense.py create mode 100644 preprocess/humanparsing/modules/functions.py create mode 100644 preprocess/humanparsing/modules/misc.py create mode 100644 preprocess/humanparsing/modules/residual.py create mode 100644 preprocess/humanparsing/modules/src/checks.h create mode 100644 preprocess/humanparsing/modules/src/inplace_abn.cpp create mode 100644 preprocess/humanparsing/modules/src/inplace_abn.h create mode 100644 preprocess/humanparsing/modules/src/inplace_abn_cpu.cpp create mode 100644 preprocess/humanparsing/modules/src/inplace_abn_cuda.cu create mode 100644 preprocess/humanparsing/modules/src/inplace_abn_cuda_half.cu create mode 100644 preprocess/humanparsing/modules/src/utils/checks.h create mode 100644 preprocess/humanparsing/modules/src/utils/common.h create mode 100644 preprocess/humanparsing/modules/src/utils/cuda.cuh create mode 100644 preprocess/humanparsing/networks/AugmentCE2P.py create mode 100644 preprocess/humanparsing/networks/__init__.py create mode 100644 preprocess/humanparsing/networks/__pycache__/AugmentCE2P.cpython-311.pyc create mode 100644 preprocess/humanparsing/networks/__pycache__/__init__.cpython-311.pyc create mode 100644 preprocess/humanparsing/networks/backbone/mobilenetv2.py create mode 100644 preprocess/humanparsing/networks/backbone/resnet.py create mode 100644 preprocess/humanparsing/networks/backbone/resnext.py create mode 100644 preprocess/humanparsing/networks/context_encoding/aspp.py create mode 100644 preprocess/humanparsing/networks/context_encoding/ocnet.py create mode 100644 preprocess/humanparsing/networks/context_encoding/psp.py create mode 100644 preprocess/humanparsing/parsing_api.py create mode 100644 preprocess/humanparsing/utils/__init__.py create mode 100644 preprocess/humanparsing/utils/__pycache__/__init__.cpython-311.pyc create mode 100644 preprocess/humanparsing/utils/__pycache__/transforms.cpython-311.pyc create mode 100644 preprocess/humanparsing/utils/consistency_loss.py create mode 100644 preprocess/humanparsing/utils/criterion.py create mode 100644 preprocess/humanparsing/utils/encoding.py create mode 100644 preprocess/humanparsing/utils/kl_loss.py create mode 100644 preprocess/humanparsing/utils/lovasz_softmax.py create mode 100644 preprocess/humanparsing/utils/miou.py create mode 100644 preprocess/humanparsing/utils/schp.py create mode 100644 preprocess/humanparsing/utils/soft_dice_loss.py create mode 100644 preprocess/humanparsing/utils/transforms.py create mode 100644 preprocess/humanparsing/utils/warmup_scheduler.py create mode 100644 preprocess/openpose/annotator/openpose/LICENSE create mode 100644 preprocess/openpose/annotator/openpose/__init__.py create mode 100644 preprocess/openpose/annotator/openpose/__pycache__/__init__.cpython-311.pyc create mode 100644 preprocess/openpose/annotator/openpose/__pycache__/body.cpython-311.pyc create mode 100644 preprocess/openpose/annotator/openpose/__pycache__/face.cpython-311.pyc create mode 100644 preprocess/openpose/annotator/openpose/__pycache__/hand.cpython-311.pyc create mode 100644 preprocess/openpose/annotator/openpose/__pycache__/model.cpython-311.pyc create mode 100644 preprocess/openpose/annotator/openpose/__pycache__/util.cpython-311.pyc create mode 100644 preprocess/openpose/annotator/openpose/body.py create mode 100644 preprocess/openpose/annotator/openpose/face.py create mode 100644 preprocess/openpose/annotator/openpose/hand.py create mode 100644 preprocess/openpose/annotator/openpose/model.py create mode 100644 preprocess/openpose/annotator/openpose/util.py create mode 100644 preprocess/openpose/annotator/util.py create mode 100644 preprocess/openpose/run_openpose.py create mode 100644 requirements.txt create mode 100644 utils_ootd.py diff --git a/OodGenerater.py b/OodGenerater.py new file mode 100644 index 0000000..263752f --- /dev/null +++ b/OodGenerater.py @@ -0,0 +1,86 @@ +import numpy as np +from PIL import Image +from torchvision.transforms.functional import to_pil_image, to_tensor + +from .preprocess.openpose.run_openpose import OpenPose +from .preprocess.humanparsing.aigc_run_parsing import Parsing +from .ootd.inference_ootd_hd import OOTDiffusionHD +from .ootd.inference_ootd_dc import OOTDiffusionDC + +from .utils_ootd import get_mask_location + +cude_type = 0 +openpose_model_hd = OpenPose(cude_type) +parsing_model_hd = Parsing(cude_type) +ootd_model_hd = OOTDiffusionHD(cude_type) + +def tensor2pil(image): + return Image.fromarray(np.clip(255. * image.cpu().numpy().squeeze(), 0, 255).astype(np.uint8)) + +category_dict_utils = ['upper_body', 'lower_body', 'dresses'] + +class Ood_hd_CXH: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "cloth_image": ("IMAGE",), + "model_image": ("IMAGE",), + "category": (["upperbody","lowerbody","dress"],{"default":"upperbody"} ), + "steps": ("INT", {"default": 20, "min": 20, "max": 40, "step": 1}), + "scale": ("FLOAT", {"default":2, "min": 1, "max": 5, "step":0.1}), + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + } + } + + RETURN_TYPES = ("IMAGE", "IMAGE") + RETURN_NAMES = ("image", "image_masked") + FUNCTION = "generate" + + CATEGORY = "CXH" + + def generate(self, cloth_image, model_image,category,steps,scale,seed): + + model_type = 'hd' + garm_img = tensor2pil(cloth_image) + garm_img = garm_img.resize((768, 1024)) + + vton_img= tensor2pil(model_image) + vton_img = vton_img.resize((768, 1024)) + keypoints = openpose_model_hd(vton_img.resize((384, 512))) + model_parse, _ = parsing_model_hd(vton_img.resize((384, 512))) + + dictype = 0 + if category == "upperbody": + dictype = 0 + if category == "lowerbody": + dictype = 1 + if category == "dress": + dictype = 2 + mask, mask_gray = get_mask_location(model_type, category_dict_utils[dictype], model_parse, keypoints) + mask = mask.resize((768, 1024), Image.NEAREST) + mask_gray = mask_gray.resize((768, 1024), Image.NEAREST) + + masked_vton_img = Image.composite(mask_gray, vton_img, mask) + + images = ootd_model_hd( + model_type=model_type, + category=category, + image_garm=garm_img, + image_vton=masked_vton_img, + mask=mask, + image_ori=vton_img, + num_samples=1, + num_steps=steps, + image_scale=scale, + seed=seed, + ) + + output_image = to_tensor(images[0]) + output_image = output_image.permute((1, 2, 0)) + masked_vton_img = masked_vton_img.convert("RGB") + masked_vton_img = to_tensor(masked_vton_img) + masked_vton_img = masked_vton_img.permute((1, 2, 0)) + return ([output_image], [masked_vton_img]) + + diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..7c7ead8 --- /dev/null +++ b/__init__.py @@ -0,0 +1,6 @@ +from .OodGenerater import Ood_hd_CXH + +NODE_CLASS_MAPPINGS = { + "Ood_hd_CXH": Ood_hd_CXH, + "Ood_hd_CXH": Ood_hd_CXH, +} diff --git a/checkpoints/README.txt b/checkpoints/README.txt new file mode 100644 index 0000000..ce53e5e --- /dev/null +++ b/checkpoints/README.txt @@ -0,0 +1 @@ +Put checkpoints here, including ootd, humanparsing, openpose and clip-vit-large-patch14 \ No newline at end of file diff --git a/images/demo.png b/images/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..01be59a5bd3fb484193736a2bcecb66cc96dcd02 GIT binary patch literal 4450190 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
0zx0Z?kdFS>$jUI7s^P) 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ðeX7i*M-+7XesRD85*BZF*;iqu=t6 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 z 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�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�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%0A@1@5t5(HgAleHogU`mXI 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%0D!z_ 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 z zMSP0TOn|&jjz}<|;(?k}zLH~14mvrsQeZ??j#XYW$Mz24$%h_7x4(uLhjt;Jh@mwa zLOKygG9E=sYa0`wBZ(*?(I^L4-T)nRW=HR}qg zHHunytzyA4%UlIWzpqx63bbjl0wM*eq o6S(5$d$_2o5kz)XA~#q#S!iyp^XAl_ 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�}?EmaM=%8&sy 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%0Dw7xBQSw;((` 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

LV+e(CHR|%t#OTqzTX5r#cR7|>z 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%0A)j-%k$fX%SGFyxpzGC&JVUZ1 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')ENC-IC_OnP?R>WgZ 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 z z_lXlH@Eh-c9~R~>G2lj5#$?qPDgPQ^QGGDy+Z1Cc;B0(5-4u}#VVy7w8gg2xL|{=8 z)5oj+oNXG9u#<^4YU2cF(B z^V+N|Dk#=?nu!%k{*=FEQ7E`4*C;s}tv$XHUfbd?WC{q`SD9$l>r=cIL)Y){m_~Zu ztn_SRF*$u_;)V%>lxEACjRbV}`ndAir*um>2M!2=X*uzR_&3?Vz|XlS-k_ z#Op5N$t3Fa8aMxBQ)x7LDnbj1UJM=IL$Bwf(;|P_;Acb)uf_2Rq;mx(K+}IT-kZpN zODikaM|{C?F&aCGTt8 zs!!D{MQ!FWHjxSQ!LF5ZKZ%V zJU)wBQZAr4kKke)YJUe* zQ-?XFATYP*ZTzq6(t=`!T*=nWLVykzu!bD}DZb?1lcyUeTURxN@G%P837w{y=JA%d zycuWCoEacMvn`@#S%dHDc`7cfF_%mp5W)w&m*R3EYX|{)fP|sSPC5y|A*zkKCO5v* zd5n@9Fu%(FuplTCUNhdO9Iy-nH)!^BnTeCR_Tddh^K4Xu%`aB)R0ioxO4OaxX>PFM_>st&u{hV8 zSpAveNm8$3Wk&khH2N{=%xAo*)9Rqp?4i@Fq0y|M;`Q*k&)b} zC}XXeM9P?ubSH73b%%@a~5sj;fYdLtIPwHFS_MH>0!o^qkx5Ia->n*EiO zsPF&)AOJ~3K~%qq3)JVk_txh6W{oMPps&-jB%vWXwg?`@OfwnXQ!@fQ>ch0OW3ppC zZ&5sxH9*)q*%x|7*6^6?h>}2Dl7Q|7zFwoc$uXIk%q8KL&TNxIht`||W08Ao?Y=H^ zUBhl(7@U~>bYPqLo8_Hxr zdaYB#HG9Fvr@@o4wmHB|gZNv`P!w`d-|E^>Rn^tC>;8_{jk9JX_j2Huh&>PBA`>$X zt$95iPq)TrbPY#Mue}hpM;28N>U`E{Y?J^!JRdNdeDEaQoB32OyAQ6DM6tQ(&)==s zI*gG9CpronT<=o8@r^t1-e356RI3%K;ixL6vmh0_b?ui-&6Y-GosOaeXpO1qZ)#?y ziB6;ft%zua=;OhMAH?7M&0phz2kytEOBWDh zstMUGA!HMlzf@k~d_?cNiu{FQbIYj_j7j~G>u25b)4an@R;R{r65FQ+P7>}SL4kN2 z|IhFJSG@S z;mEOT@b&xdhu7({(mZpj*rrGfYJv-HD3ED~(nu)33P`qUhxE}gIhRSW3bVQxS@iCk zEPz#)dCsulR@U9RP0WT!Y)GH-tj)d<;~c^d)qaI+u@iSE%r%M`4KQr|nI{aIX#qCR zw0>Za3-55o*w7E^Y=_m!9FXq9ps*wI+6K|8|DX`vLHBd(*}E7v-g-3 zZbTvVee@lw(9L*kk8HTPucrA;_mdK`-6nPQ4{Uo>T+v{W`aZ#>>0ZQ;PSH9RUe2HV z`JZ9Oj@`WGDMnveS;SBN_>bYS2OeOd!%RGev1A<6=`<$NNhUxSv-DpUg;auuit}Xm zd@hGfHp>mfDVnsDmMP<2waS8f^-6>5+AZQ@l5e8Aa4&{lX&SG7_s?O+d_y zC|C6qT)~FlIt+PoL;fgMHAsM#9c|QI%#Ans4BubpXk1ul|IAsM6dKg9ZX~ETckSr~ z(9ZV_p|J3o51a$du5P0C*qta9bI6d2PAbh{QamPvWw|8jG7wc8=_u~g2*92Xzh1@M zrHk16y+4j_EQxF`Yrz#!3lcIgIS5g361Ar`DdDv{top=C&*Tsc0a^%0;&fyzlezCa z21S1-BnmE)YNs))?va|MD7%W0H4ewQel19=(UfZvhoa8TU14rA8vstSE*OM2;DOdw zslwIn_*{S^wK@XENwJkkVr1~h01#PuVUEd=z(l?8CV6_(AMBbQGnT z8CKV%&L<{j5$T+aN{fts+o)-iVxY%l5R#wYbof~)Zav7w05{N)b;-GeICblI=>_R1 z)KRu!I}`?FgJ%)VoCRo+{}2C8H<@EmL+-P55^gupm%TY`U6?fyi=jGq4wZ9HGFdd8&G25MW{z~0>{*6w2o=?- zC~tvbGa8D?T%@2$3IttJmL%1)4)5Dmv%v&t3baLKvW0T3CIslZht+xuS6}}eJnuy> z;`dwN)A)?2GTYK>8GrDHe}@;mBcZQhT1V-@JP*;drNI{aRb zRmX_nHZ@toM83$y{PX88F~N+$h=T_YAe+f>azC?a5|2K1f=4=DTw1|urH1RSKaPv% zE+C#NV71Y~xeMoz&L**1^Wmd|Oy9?zgV$hn{v_Ub%X7ICtkU$5EllIiC+Be4>@-ks z;sd|7hWVRl}EUzvjM}ZL&Rub$3Ng;@U&15El$?+nR z-4?Q`6edbzm>eHtMSNP<q3tC^i>&K$wR zCoW-io<{I=&}^=tlgwcA#3rN)MRXHjGHyPdh2L(W*=Qk&G`#9E60tUR9=sgYRtrs9 z6SX?_?%9opAN&?#oi2_Y*n;bh?86=Z{za5>Q~1s!XK-m@4smqw^5@+EFEfRE9zBf% zM~S$P8g@n?P-i{~%kA3y&I{OWst8UOg@f5)dj|8Hm|N;tpbVS3wk zBno+y#tKNsNC`HH42=ci`wRx5xd4$!@Y*FM<(5zWk4XGfm`$RxT44f6gNT>(3@E8g zrq~xGsQWLQM!VTUtkYw)J@UyZ6P}(s@i=mg1xzJg8~J}#Uk>> zB9f_$^|f?9tOUXee$;VEzPQ8Ahm%esw2*qF?=gX#zMB+p8?`FxwJNIBI?_{{vG1xI zS(%zW3j1cGa%)xGmGNN=r6F?2NG!2mY)iB|l@b!RC7N_dk|o{BMxn&G&3<1L{P^SK zb>eaktZ?Iyx$92_GwDIAfi7$v6oqxQ{GQ@SvED;#O|_b3ke)MEkP#$;bFDAJuvlUagK+gZxgD zW3qPF$DzG@u;a)v9QmFfKqrys=8#-AV+lVBjN77}Q$%rr)##nEv6+bv?dNSCV@O%X z2lM-l!W1_Obp?PVz^LsLsjY=_y^i_CC2XCU#(~}2F;3F}Vtx3X9#*S$j)5~K7a)S2 z<|XR)>0Xgyf3wX)&v=hgGEMz?e%D8XNS7U;LF7u$N2^ig`_XGQaPJrX9^FQTV{-QU zsSHxNJbvIue+-9?9S@OF-Q10B#fThj7-%~fqXes48#d)$yZd)oQXh^thk=~-nK@0H z>%~?8DPs8Bu_C&u`cba^rEexf|bqYewP@z_8Z)T*9|l zYw1e2Yn%V2s{TO^AvuzX>YeE(oF5uOoQ_T#w5$5csKh>eU*xC3_uADFGV|s>x)&XB z0|KCF*Sh#HAp^^Pq_sbP_7v{^(r1uQ^;uPoR4*tdBcM5GE z%{f!?jB<8vF78qzl`0PTLV#v9Xqh%bF<-OUVI_`gy@6WY!Uc-0%AZZzk<0-7wnj3!3PKjQ1ZP|2;~PXsvAmt&?POZFoCi?g%N>j zv=rkQb1I_;{q#_<2#@Ry_=qMBi{Jdx8dveJ%$G!I>9kD zJtt`j?{m{+Azy&!HMrfZOSu;{%2BLJis9Jt90MIY(rQf5%5QlfumANo3L~oI7_0-Byd0 zFUH5mkc-7|>Et6A&rwcEq-s*uFgD$cT9g7NH9f_V;G%-OhpkGI{9+uhdgG7cx@SKJ zyKHO_a-wgyo1maCAbdxXcR8ii`P+JI~k z{&&>J1~nli1nIrCMSXiG!^pJ-wIjTakgqrK&)U&^czn7W&r42Wu3vFS=lZtIPOhsc zr@lYr9wK8Hhy8BN*kXi(bz>j*^SpM=6pvxY9f*%K7mM}rBR}**ICbij6dA3RGB%L* zI}y%wIV$94$Ou6mEP)6Tt!-fLOIfhSk- z4pxn&A-#RFM}3~8)n-D(D!Qzu9JhqL=)DUjCaz6u){FRbJq%mB>wWgS_4|#+%xqDH5P)n< zZGIO$9^KF7rDd~r9b0JPl<;*#Ey!RV5GpJO6>_KJIk5L)y~S|Zw+<=!xVBh2bfgTa zv4XvJRr}oF)R&<)z&WnmGDG|iH3SARv0Wo_683hvuUpX#`gPaG#e2SrRDGVw5tN$~ zE=u?>#k+BuJeSIH)1R(ynu5ZUoA^Ic$s}x8L}|FLMKu<#9}z~?L)Yt}<&{zQs#x** z_`6Tuj=LW@jk4cFx8DZhJ&@_)#zDSk(%5Drc$)?otDz0@_Oiw9X#qP#h-LpkF?nR= zL(~~;fjtts=XM(!ML4ZFYJ)*!J)7HTaY^_5#ZPEcfFb)id1J7*op{J#oWn3WcOL~L z5wiv~zcvJXQjX(e@Weowj6%6Vqe;!IOJI92gAtqMFc{;fHcB&fB`0YdsZ}Vo)DiwsfTmcbGI8WYPhu_`wev(F~b-?Z&6txW;zf@d5OmI?dK?3>3j9Bf!BMk4SfY z7RDj$){S#Yg*>Jv#z6FnSKam+yzaHH$L@W5k>ZI7WRJp)z# zOCBTjq2=XeCP35Y__`eRQ}>#QfJwPSr)#)HMCRt_DB^v(qpZJknnKBzP#j;Yk$_YO zJ9g~Ad*Aziv>IV>!T^slS7$a3V{s;*9Ax!K zj4m#~ke;dD%RrLUQdxPOrV+J79vZ=yGRi~ituP^P&6VO zitSOXF6z%I5b>bX?V(z$SOPSOX^@GiHe0Cr9x5~;yVYR@=qgPl?aP^iDPwQISb;Liinwb$O2asgE0Zx2vx8>5cOc?xzN>G%!u!UiNMT*2yBiLd*w|7 z@wU5IY=S0JQd#X@pOX|O#Wrw*pXB=@eB|VPA^d|d5jt-Y1T|tTp{Y_@7uL<6nD!*ksL}UKMNN??hmgK zN4;NTI>vp?3NdB->u;}TQy|v-N?wrRt9jE^_;|r-;eNsfh%s~GwnAGOEtL@AR( zrce-q2X*t(CZ_*nof>kmSOqQ$Gik7nuIFKSX$jk&_j)vuVg*u3g3XsvXLpA>yG>!0 z9kz@e&~8OBkP=u^Ag{4K-F`Bh+65gL`yc_Jf)ah!IwJ03q2G(@o_ZxVW07Yd>I0_x z$2^x1(bU{iRpJrHBb`FLCJf1iUKcfL1&v6(j-=p8sf3KRfb^_(O^Qd2CKeVJu)4B{ zcDIXWt;*_0U;UduL&jUg)mI+Gwmk=U%oM3>vI@2-UiP|DXr_dK3(l<;d?sktc^vrc z#p+F1*9#6&II3+ssF*#m%edwZzba=0`$1R>UDp+?vufdcBRf9V| zXz`ww;TUqZqfC4Ft@3T=BGguzJ;3*m1Cv1EWZ)T_&qxrxvFF9)1Vc(>n+u?}c!3Gf zg@SY^ks?@%_8X}{lL9mWzdZI>)OQ#N;BjmO4iMPgaTGe+qGaa_*|q7_(QdW5Yr0YM zSOI#eR)tq@q2_h)f|tD#S6qELgSS$6l7Li^I!mVM_fhwJ{P9Qr0o!-)z`Ne|X54$v z-T2hM-G?h~{2t6NFEH79vAl|0v4C_c%RgsQ2^4ZveD9%{O>w6-jZ&`FJS?tMvAVE| z@nQk9(~~&3Z$Dql<0nrt@oQ}J4F2WzJCMm`QTJL%ciK35`Q^C#p@*?h^Rahk3oa}# z;MjpZc*!+~F_r8CsT|IftGMgYbGTyX7St}C!|%NR{pgh@k=l9)+xH(rEFZ_r<}H}X z=8(zskb!roFBd$-1L@!~ROb{<2kv=g7W?*x`AEfhOlWEypNzK3SKk93|!a~F8+wYxG7 zej5?Hb7?$r@-d8MCO}#wC(k{GEwkJBz9*==wY`cLUUvmn$}6~V@(k);1*ORyxbuN~ zv1{j5n4Ud=W}}RyvkxI%pT~92e=)v&;tUQPxdIP9c0b>%UDMNO)K_rhRhQ$nFS`|W zZx!{jhhO@w-^LZ!+=Q=x^DcCgMQk~AB@(#|ilsaX6qJ$*Ed`^Q3?~lVK9Th)#3Y5) z4$7-#F0lK}7W)=z2qI+_DhN@fCKmINiN$z-uqp}_Gdf*#$w!;cR|?DvX-Z0yc=ExA z(ONi#>2wp%zU~_A+OZwQu_7}04D!?|SSs-d@)VJ>3HYXFAO>r!PM&n|lY$^6n><>` z7t(XH&W#78?9ucZXjH4H6RELML2`T(_FeUCQ>sx_RZ}c70kiD0z*ez+(d5A?QYu+Y zYEy>PYzjdpwU91;j;c+JY?B+K*hkl6m3qWGu-CN8xj|ye@r{{c;q;4a$o(h?KUjK+ ze%y2oyLLBZLc{h{kEfiAFg9f38S85XzbovAgTPqGPyscE2+&cGYt4jzoxAdM0Obwc z=wac61ncH{%r$m9xb)y1@R!dquu1CAl=yK&4Hv5d z;WlP-ug@fh!E=#FCLkjiDxw8Z#6Ri|wnbGFtcgmhxkl4;z=bQngPPaGYPE)irDe=c zPvEk>ySUjU5vQiW9u`*140ur!2Ca2gdemHjYtT}_ZM1xNEdh};sWe*DHSTwrU{`I_ zg#hh&Xm~#SW)(guM0-`-^|`-eWiT44#w2y>S{|Ro+kWOfn3~;Y_N>GkYZ0KMYj}O~ zgh{+3Bg@0fYeglT&#tCyjp~ z5So>tsZo$rZUw;O#$w|mdAE0^kVgBHb9Bx>iR?@{ZikhhJ8hco&_T1^hTrO-*7Q;F zJZ{*#IJbo3H{OKTz4?dHWkAqyJNY8T?vhW~|axwm8W1niW%uEj&ylLm}+_5|AlCc2uN&h|8T zv;yMFmGPxIYKshlS`wa;paaUOgdw7UO9v1YYc1*r>q6}_$5uwoT@_6%P-m1aWcd-^ zBMNKu+^Cq~cUq=dTAJF42p>xjxS8hW%T$`wjOf}(sgwu~8E$$>rb!Js&UTqdD^d)J zBhinc;gzv%>p0%??w>@fpTi&h<;QU8{CT9%LECS__i6f9lEH3@9qE%i8nF{YGLuF! zlj7W~M}!#4n`#v%Kqq6Ov_iLn$l4UMrijGe_AxOrhN&&vQSBv=EsUd4uVP|+0_V@2 zV}F~@mC)i6)&Km0>DdGe$w zF41!|<1MvO)qIxxO_Ur==cF+&#l03+RRJeM=GE`idlM++nDEB&>p>hGw%;SKPD#+t zG2$`G#Z7!?nrXR_#N>x$cX(U5MKkjSN^%+YJNMZ}&r^P9P&kg=4S`L!lsP{=KE;pJ zY(n=+hN5gX`^$kV%Rte!KTi zY6OEdf#~O>>uA0Gw6eTnFu-V>=wh>Opr8=OAW=*$iM3zWa7A!lE%t8Un#3CzYUdEl z)!I}ka0H~jQMS>%9*_saPe^L_fm%}d{+T$}nHZqI4^A!WgUtRlWaUfu{u>gN3mn%n z37Q%r$X62{MaosF0;`S*nE>3ZMM`2k?SzQY)QC%e6D5NtUoZiwjefVugsXPF1FyCU zui3z*dKVx1`>)`U({reI314d>nI!)&L^Y;=7>8#4oZ0idw?f2kZPEyQe?V@~{KT2| zq4}11E-snMt`kFk)=5z8OZya;2u{K3%uehuSj!0erVx?Z+GL4NS@F`;*yx#wz!6Q9 z3+#$(@7(nfwQ0O2$*#8rgJg1p@%gqO9a*cx><;4;25aHwXJh}=t_|DEQJWk1yns-$ zw$0I;KDc+b(bANDS%@jJla#a)$?}FMK$~VyyU#R|mwn9VYxcBB3e~}x#6o_n_dxf) z#)MWN$|1&6V#6X9^wD?>jfRhMwT>e@rt!)bT#sXWc7O7qqy&^^Jm{a6NDF250}(j@06@_cmq zg30&Tbh@qGs;KBjdX6=Xt|h0oCO0n}!|C(4aXK$-j?9DjT!s4rf13aRAOJ~3K~#Ti z{H&m8q?>NoVlt;W{9B)j$9o3v9SlqDosfUH9SIR<;C^=0zc+Gf8{tUU<3#S3`EhD$ zYF!0r_f*!4U(_}Yi^HPvMD!9ja_qn+_3^9ke;+>m=}#N}LeSLBd7L4!jfzi1$yw~5 zC~S6F-9aG4^={9V7^~=#AjG5}X)DRIfe2@`qF8W-C=2J1?-h1!HCqMZKeE##F zN4q7{n^?rph;~rpwQ^W^%6TdYngBvE2;E=uW6BGm&uTNL!~(|B^vyA?Pc^>65CJv4 zCErNLB#fQ7B~;TscI+5l^P1am+ikaD`}Q6G$CRIkJ=am&eZBaZ6`-S15hH9dtlW|6gQ zh}#jf96kl-9yz8{I8_>l8xai?w{SdV;|qI2p)(7iV_Z-b_s=5ySv=yxQKpeaV3o{w^Q1wPlv zNVu(qn(w31YN0~H8_fVkFU3chT( zEQa-@6ICJ^qQxE9KD!{eb?t!yveZE3eQGORK9s6N2XUu}km&!>eWm6|x;<1I(8)6t zlT%%eY#DRv_?+qf%DrPj5*GcCJVgZyBwhrIs}goh-%I=lZj>{%h(MuRxB@P**sfzE zb|&{en2N&d-+d;0gXIp&K9dJ0jfp1qQ~chF&}d8;u7`(20t`1n^DtMmDzHZSyyd&; zJ=}D}c&Q3Z((AgP<=owSug&%>w$bbI{4%Br z1tfYM6ytGBW|ElBr7@YyppZ@>pGl#RN+Cy$#fdmisn6tyS4GXmX~bjH97U7GJSIUC zZr^Hk(C|Cx$CGH%G?#uCeyV_%zw=!K*n z7_WIdLza;WVr|q;d=sT~9GLw$a0Yoz9o9=-m!UinW(2WdFr-82Tqh47>@$mD| z&Q2hiNFiSuV=|c*Rj5!E6jk*EWCQ>Oko35yJ6!`BF<3fYE9fZK>r$m?emn-;5n~nT z1FIsGb?&C)(XnkoCypzT#K+MQf?C8B@{>5lu*8Cb5J6HPi3^YECYFZj0!*cooRCle zyS%i3OLKFq)=7oD^3oh?OAGkwNB$VckL<*OL;EqaZ6}IT)2w2vfCPiK-7Z>wi(0Cg zG(#llw%25Uu2ySc%azYZe$)1i6QCu97b7nWuTbe-UUya$|2j(KkZq|!M0EWL5q1c! zV0ZJ{#E_BeIqKyRL$;V-Cv@GIu?fFxm=#q|Xow|djDyW=*boefh=;`L17|eqUKx|a zc4E|Vo)U;K>RzmGo(E4caNKV0>pbEprNai6YbHf52=8J_Tr{HsZXDIci>RD=9EE%q z*+PK{(Bz;~nH<|OPC~f>LrK|m_OwrF-H}`;DREL`0V#FT-)&JC}B?>+d}FaHz1 zezJ_QsV%rTx5(XD<$4*Lrl*k0=Qwbo?U$zxtwa(Ow8ZFpx*Z-@l`m!yqX5Tipi(Wv zZ`ILjHnD5#c1%ugLaW)w{K^WB9y^4O{==t`P7*=9h|m7hm+-=uyaJ17&ZE(<;rY+K z8k=*#vE94TO{VbRnRBRkZ5-Xb3m^NdkK@yy_*?X+He=hd8*tUJ%aP5bF}rC3+os0R z^&9B*TF4|5IDFY*lm;80tm|;%PHcw&K(d%)~cTVBk4?l=w2lr#{!da{?FQV1)kuOXjo6Ycu z?eRhh)m9T;r-ytxgHkDnM;^H!Go^9to}R+W>P76?KEp&}->YM8c>%qC3YAtI=N9I$ zcke+=Z##%b&pwQUyALB4E8^^hbLg&|#`1}W@UoY^7*AYWKrBCoUZRaytBcvG37k0b z2#)UDj6$r1sp%Pa91~37KpL`D_~FW8)}{k(xIVtYoAwB||(J zp3xhc$Y9h4xQm~POda^m2E0a%NiM9o?zfoyNyN`uwTxJC0(-7}4pJP0P;prj5$^2g z7|Q@rjv94RfoJC{(uqD^ zbi*~+e9iN*?Wz~?9`=d+kxKKiw75loD;e6x!#XB8qWGb|SFl5R0|He)3w&{tML^up zxSGe{nrl=lSkouPR}bZC4f9LO*gQ3k!~6DNdUBj?1A!rzmR8vh=c$3ifW9&r#>5YF z4~g{F@=^Eza+>}`D~5iu{1CkavUi!`K=&?wMM|T2E&5d@YWi*hXaw{ z#&)c=V(Y}T@;n0tZ;9>%FpB1D;SO-RqwH7=c2P>Jea@??N)-tL5()6JoO+RXL>_F3wXbc(^W~g{ZjaRG!&}?J1UPqTX@NANktca9eX?3T1y zo)fPa0~pgkwOx|)e5Zj@0QKOrlJ-dsBMn>HttIga9Y>y%kh2Mxq!VCb0Z#;>W;dh2 zXYPACNj@#b4RPsQj>pCJ;zX3spwl7p4CPKKcr}k>2EuiSIGxI7_{6E1ke(ag$9M|a zWFF~68!vnD^?1eieJ}p%<6prSzw|Y%E}lUq-sF4T?Z(ieW|npbnRJdD4oRu8pUfj) z977`2N3FcXQxWLgy=I+O0t(q2kDDj*GEZV@H@Jw>Y5B-!v)H-sAZkdVG&zH6Wd-A< zahy4I628|!sxT?JAkU7a#+wdiH%%elYvaP%GsqRjF+M(pYITY4QK?WsyyL-Jxqw_c zi43Wi(4-Y!PelHfXQ^?C(Fl+dka@P`*Qhx2qFY{p7v6fSOe8RbV_ii;1a`cJ>Jh*7Lsw!xHNh*ld2EdC8qrFxyph~+a@&(xu^7**T4RCc=x-1mY>0>d#%^v zp3^Wwd-Ps>H-3)ZhtX?s^tTPm14iu!UK3^=tt^WI^oIXfBjQ>Ui6Pu)ZR5RB*sry3 zVbZeZvLSnA?UH<_^$yCah}f=xG&uxzcG7`i6CPdLJ!lRcI%X)AReKQlpU^4OdgRo+ zkBi^_S0q-?B10G=;k`tDrYR2@QH@JyNDM<1h3WmYekq2bn1!1XD350aXu9Dt1&~#s z`z_AZ+ch5^VXGYHLG9K?+?dVQD0!O9laAy9HUK- zHr8+&IOTbU;}oq?%Gt>uJ|B}mOTAlP7eWe6W1(DbVRaQ-$1`~2OP-Hs9p1;&Hd7?j zl1(F%EJ$N5H5#O7T)pN-hEzb)|L9%|h|9PU5u6DFW4wx|!F184ypqV7ZF+x?1p@qZ z0b35=fMk9Q{a)KVLe22SdWG;h*Y}&;E4&}&+CzDrUGHn<^o}B(xp6}DavBuP$Mt;p zEQd5a4f73-8682t-mph`YHzd~-<-S>;zGv8URXe?S373|<4`ml)Ss=t(#0Cx9q+)*rdbwtqa01%tGSHkH4(cyBp!FKg>7*hNOaBo1j3$3U~jdI z?!!;u%%?t!+E?$u=1L2hL=s*SXg&XW?ETqyBDQNQdP!=n2GEpwbp4d8uJ&y-l1o)?))x!2UtP0b$(#_#D5Jug*%)@S8@H%~Tq zax=1lRR5(rM~xx6EvXLB@S4(aWK?T+?b?O+zW2Sj<(6A8jPSqiHGY@hFf3Mf*Kag` z()~0np1ySPq7{<~XyPMI*ain-A8NxdH|OUsb$ov0BW^N35ND~cbRs)T2pu&xa>OaG zms3YSHmX@MI7d@&96~j*wn-jFh_e-|&15fQ>*)xL zhLT+ZDF7$2GB=0MefWREJ97dhiowxGCJ9!4PQ?>QCnzQ-Q4VQjN^v7IZE9jkr+Kn< zES6$nIOzCqMOR z6mwa|Hg!Ejac-M4YfZ{%Wa^|r-G>^>1(TOlu|MqoG}_{3FB2O|EbZJ!6JJMh36mYz zl^5}{{M>@6F+tww?y(Rd+cs)REM}L6*(Je;ne&tAUG3FEVT@` zK5OqYPVxHLL!cdRDuM+-fU?Y(#!-~0BT!WGYZ3EI6b3p$GJ&^#%Ky#pJmb-7@j z2C=;E1hf8w@YShbI=e;ESBcjRJ}gyFu9BKsj_gObN!VtQ?s_-xa&2{VUj}FAqVL0< zLa^i3cg%zPf5>Na(VM(ge3kjb|8Uk>ctD^QL9!s&?VD)KQj7Z~M8Ust+FTN;16S0sCPrcE^)~jBC+|(B9#N2hyDp_XBv!k(FL7bsnS=eY; zV-$KhaGv(~s=OIl*ZldlafPSfxj1A!6RA(i!O;kJedDsRcj%3f0n z*bNI5#L5mqlZP3FP}FTdGhi#+<2?f)LC#>bNgg!pLkfbbl4Xik96Agcm%4s3Fqqg_ zyK9Ut6?$vSmryx#f|ZD=J1Nb?=OhE-$y8QGaL|9$QOF1|&ktd+tp`yX=+NkHpH#(U zZ?#)Z?li2{%J7MN)#{+?HL+5uqEf4)+VC*8X)9j$gFnJ#QA^~ofvpg<+4&ep)I$Q_ zzW)S1^6^jOxi{Si-&;m%_l>wXcYzMUNj51Vq*HNZiv={j8q&!$3S$NIsi=lNgZl(N zkcuBgGlg6V(-UJDAIl<_$)i%M;=+Y_%q`F;p*D7H*@kpHfqagXrBe9TLl5HA#d&0A zCh)DV{5!6?>KeTCrO!pHI)`iaU5z56k>Z$Bm{ z$B;{;kWR;OaQ7}u779qkdq~C-=pcsWavi5H&ckbUkx6DyDpG+GnB6=DzwR+{V5RDz zT=C%1I1?t2#Q1)9S{)P%8N^b36bdCwPmCiL7e#Jr%Bhm-^_f$6;Z4`FGV_sr2XWc{ z9k~C#6PTTy#b>|tMVwnGBe!)Y&YnGk`3q+dj~6jMxdmv|@c8Ld@RPvg_!P2zQc+H# z+Gt>6yog$Dk;n4n#>Ox+Uf}UOxp)T|zlpPR7ja=}84VwN4v9<&rRmL>*|8hdMj5+z z?!u|_7txQWF_ACg!lij!yl@tisW@uq&f%(KJCPlmLIX)$d;Rr1(yO+*h}&=f3Z8%M zG2H!?FW};81=rs6a%?+%980x2_H3QSckccg;uAB-Pfns#$YFMR9Ib|j#ibS0Jqk2C z99)uOED@k-dIJUTG!Y?_kYJUB`si;e^kmX`#QH=m?{a~H2ro2Fh}IbSAtpl82=i7O zy?zIA0<%32kA34SDD-Q%eE%+7dF%)#Cnu0iCy~!(F)==g(!?YyaRtN=6ECnY7XmXY zFH=&(7w->7LH=5GREBJj?m z{E`b0*^br`fO}AIiylo!>ll)^;?zUGG`L8&gO<Hs-0MNbLrg7}h0qlO>_hIva;|vgy+FUY4v@ij{ zEQ!vbD6!z1PBv^AMGUlrsrLA)gQR(_VL zUJ{3kYJCtL%la|zp|=o(>8`Hixq zfixmWgp-u8(Ovr*2XpgijQn)&k-JvZ-pl$3MZQB)8Hr=%^O9oG54N=jv1A-xwTe6b z=@W>xs>ssXj}yr_g-n`8(WS(Gu+lSuW)dH>G9DA7iO{NZ;G`%+bYfP5HmVEM;7f4> z=b=P`CdCcEV;UoRsJGfE*Cke7T3SVMVg^6?o?k#BU!a~tlch8f^m*!-M~Pj+K3#kO z{g0BHWlibRAys?XlF64F#7HdzXed`%7; zs7p#|T%hY41yTXoIgabLZNZwJE!l4xX-fr7BB^wHag2>mAelYS!SD%kWxFUavx21kwpo{b-@n zYM|qLoVTS(g}Oye8-47(>yvFetzeVgfAHl|c z8V{Hzyg+Nk6sruzrgqOM#9D(g1Y1$;%@+S0$GKK)7FbG+$>j*)#)F`7(2e7VeV1<3 zP=U_z8+tCh4=k1u~;i<$)KVlT18Q-d_Fm8i+gR2e}K41RHt))b48yCk_S=!WS8SY{94)^+)yZ>vz(n(|q^QC60bV?>yq>|{T2&c?3hGf!Yj&Z4R zn8=zWojWjWhL~A&25=^R9_0X(V;rBXt@InP2{)eyO^xO(MZI35M(6gh) zD1rh6?=`;JIu+x`ZEzWOHu4MxJ%Zd`)3j&qm|Lv33@Ph_on{d|p3^i!Bm~zk1a?ku ztQMlpiZxPVtM|a&I{LkV!gdfU z@aL2yKSY(EuSlDqjj)i^*f@feJ!994$?Z9YFg0xco3o_gGtw<-l5EMVIM*_JyxZ?# zrP09QJv;HrXI+gecWy#)tb}APhioo`bSlS_Vn{qImLg2dsDQJ0g@`tBtVVycAEz}% zinOA*PT$w=k}v>~G9h9f-L~L5xe07LavkE?5;yP!@i6TTN5wxBvjq)sf!PY@>jQD+ zNay3=HNlNFn?!0C(fw<23U?Y<)P9cqzV!(cYkc&n{c6~ynIqV{6(Umvhu5afp|ii(#U%mwxB4 z*dd5vfVoQ-@$#47%5NvT%2vSf+cM2MXhc`L;>N2kNt$YezTf0rREg4*ck|w30yN-CBW5LphqH!NJP!sv-jcQs0*tW0< z6O=~{;IQW!jn(Zlh=Z~BJMX*$|K+#;6PA`1jo^)ligY`HiawE_S+P2v;0A4;>`3Is zM1qf@fAqeQFCu*0ZNM}D58GW@Wn9iB%%)G%!@Fp3JN%)F$ zQ&NY{(%vCHTAD>4DK2mN9%^0D6aj8nNtqsbv9_7mdzocScW=-)0IIUyK zb5vfWy*6_WW?Ce3aTsTi`h!fYcKDNQ!+VU65_dt)jcN|kT*>c^#YF+SMS^Kvp7c(~ zQNPGFQ1iS3vU0Fk<#|ay>c-cBf0lb}F?^dV2&d0}*5Dvw6~FOY9}to`P3cZ1u)4a8 zcl=*(#bXaWfI>Qn98Ew}0(2^Y@q8Kunm|uebhBCHl1ZKPS| zVYKFXSy$koG;V4hteD6K9fF6i7pV_=jj);5-@DhbuFo6shG8gz9#`+fu#dWtG_T3K zZzlq@dy9htR)_!{k(_eJDF+JB4hGH{==ztpUf?cA7-Bu0j^mNvGVCGtdZ?eg54nCF z*+Pj&Mkjd;s;H(W%otk1V@Ur-+$)bF>HFyWQjl6%TtsT;6-Z9+VfCQm#1yjBeMo_w z=@wMQsp#o5$-)3D)-X81z6SX=@i*NlYAEz|3nWwUY`W#tm}@c9EpxgFh=PiOB?Q6l zKoFxTf|HzRhYh<29_wV(mdL2H;(!olhyXKp=>k@WV94rMMEq-GWpNIl{gdCtWTK0s zm+irh-PFH=2LfGEz-zV8Zqg`l4_?a`0`%l&cfPO`*XR{P zlwpTrNM1~;FpgPJ!eDs`uww3jSvvvP;_Q;hc#dHEm{ReOe3e&`d;Imc#&GKqdNqb@ zA#XauzZ+&{*hv{v!|Gn{h6W1?D; z)jx;;Ern;PO*z0G*(D|rh}s9MS&*t-TSy%=)}dN0!}D73nm+2Dk5wW-S8J$vO&mIQ z94~(9tsoMDsLP4sh1etMO4EPS?}<3js<-fafBIp3>5e<`BX9pHjO{vxxeF(`2sJ*j z3DlTK<6Tmz80ytkOiUCR+^3+5fD2Mht~F}NWpdKtoy{<5X{=a4CK1C}K8=})F%(GM zIFrTFY8eka{xFsn%2-@lKxwRm%dfm1?RXjw+;t~6-`)1=SK|Kr?!xuQuSB`&;rt49 zSOR+|r|=6u{d4H16G+YM!St@Zn3$Zxf@JV*Us%o#)+h! z!}$0l#>XaEk(wSb6F|6Ohk!E~Id7N-yk6=1S^a}ZQ;ixrM0}?`=eG>`vyOVXjBX~6 zJy$-Pfg=LWS=Z2jMM2n1$2No@_S;6KQk)B$6)w&wiPIRGP%L0ZsfK-#QJ+z=6BBUa z=$j@d#cIU>1~g=Gqb3pM!lvO*4U7AtJ~0w?Zp0SLd&H{R*wp!VILc2_PksKdGHlY-q;W(FBlYy#dejm;ha^*BSIAn@8m5db0&m z6ua??{n)mBCyu=IwV2qtPZW&f1QrO8L3@_t%p`#arjEs3#X?$+{)vMB3c8rGn2-+1 zhts(_MI1hNDtr4!^hnJtHeR1$U-KGW~+_Gmq`Vf<84E*Gb0`zyj^KJajfBpbgNlDQF{#G&8sPNFW#aVGr zh|NNz3>>I{f5!J40y9shu;@hq=xe^BWJvz3j=E!iE;_qfc;|27JuV=p98*AR0Y0S& zCk;Vn-ziY6YMnfOO%#B1-P#5(N+XP_G{uu_hs=@aFDkSVae(c*+F~<4yh{pcw&|YH z2nHmnXjv?bq1EgFnnz34-~riSWQ+|4 z1189TC%`n2*n~JCAwvg~k0jlpgGs(G2}$F|fN@B7AaUY>n9qYO8+ni=*^;d3NpF6y z=K0QJ_rKO&=j?Oty;b!jkuH5tRdwqO`|Pv#8vpgLl|^A*Vz9Qr;uq?~ZU>nRnOj;& z2nd?YOf9f^J)fIk{1eyTgu>)J3geS(fr55}g?4S6Idd9?;<&tx$;nAfPfTKQ=^{2a zS1>y>C+w|j>s!c|r*P!RVQj1|VrAhn4$RM@x4nr>rzu5*Y9GGjY_z4x%wx&W|;FMJ?;wL3SE_tPELuH@% z-7bJ*KWia~9-@A^+KeKDTx7^(PiR+%{Med!~n<{h6P^ znKNes254QsVdBo$k9Hm3rsmIPOVd9Th9U9MXnzedK>OfhizVB-@`2G7_qF-(0Tec- zVY)k-qSQqu(wAULM;zj_AIGn2W3kWGcUHEbVSbN4hL9yzM?GpC@b%G7CP2fAN_5Wj zUmPHA*Rt2n@ANS^N5AnKzkxTu`OQJ{@k-X-=yfq-bBx+EBMJjXT_ue5hq7|myY$bG zuZR7NaD8oU;IIH}7uefTK@?Ah1~SiL9uXk157hKP+CGrhGqx@M7|Q1`He#a~>X8gF z*zF^;wT62#;isWZ8^uls6BLt^7CX`J;T#1aB;Uq!ifQ>fUqyH6l*B{R`Me}$*+!dP zEfSd=GAV+cGfKuoz<-i{GUWwH0g_VWpCqdzWe4pl0?kBEYL2B*CjmUNTEYx@=cY}Q^q(vHYlX#whptb9W&aVPjG}jk) zYw=}jsQO*3Ou#*T0W^qgGImTK*dI$6#AS}{)xZZfJ0k`t_Mcy6oH4Hr&Z(2APOj>2 zaeZqxmDz!2Yen@;ytv2k#_BWZbwjt?o<-JiZQP1{xIOZ8>jR2ZSX<1 z$er$K^U#+zVlSC%cZ77V>|m?Wz#TW=gde!$X54mU66N9;GUG+$3Pohn3V!C^OJy_C zc}w@3b_HR)SJn}Wf@JwBIh4e8nJ;y*Xk`=c2}3PAn-KurFU{fL4R;`sE{MMv*q*Mo zD3H-HAiOVxBf4AWD%gGAVZ)_aR3GTc%A{>K^sK;eqdOZrGKwGuqwi~oF}fcG^Ku^( zPsHs#4Ym~beuhA{#6Zu!9`uc9Z%Wjau!ZhkS^&86Utx3}r#%34T<4FPy4~!T-R$0B z*W1gch+j{E&cI`jJ%SH@@NZ#dWkvUqv$gni+zU|B({AvMK2tWHzCWmHw)-A8SW&#vuBboj-uryymsI|0nLp-FM&Pb ze&@IGzyl9RM__%A%5Y7hEaq-i$Elv+`^l!$68GXflL&w@0c9l(3kFSA2>G7~L?=TC z^dqp2wtlyxUD?n>v)99=<#jZr=wERkx8Hs{-uvG73gh#UBS!*!%FAU-zuY1vu8Xha z`pN(u=F~zR9Fv#9`U>r#z|Z%^yAd0^BJn^(?=~ollY~k#h#iL7l|Stt{2Z#CQ3W8; z0Y!a}K{Ane>>;A3+%JJB_jQds(fk1+`1EiZp=#9FYDfs9aZeXW3O0FQ4^g`%EdS&H z&{7z|+*BIdYis!PkNp9*PCbcI0f_`i%*kC& zn}9NnU9an{8X9DR7PjXWcG?|mH=EdC_t1I=P1^H`G#Z^ge)Jtbg@uhB{Q3X*AHrxW zPwm+dd?4GOV$TNtl*%vbBCH(;U4e?1Uo*SJ>_B~gO5C8uq2VPB;2VJt1tx*Y7X@b9 zG)L`dKVB5U0$Tjf?H@nR;BN`a96r1FI&zP&_|fJ>K9v|@VA=;nD?z-&4KR?SB!H5* zq!vo@d?5j4zJbLweT^YV;f=^Q?JyX`J|*#>^TlH=?r-2``fV&M=a^Z<8Wd)_F$S~` z!83(1B{jK18(#@mZGsh0Zh2puE3>@=u(|8(C-dUE*9G(BVFsfh>d;K$?Wj*U4nMzW z^DG3VR!r);)$>@taE9xG9mQX=$OlLEg$|W&b$f1-=p+wMghTYOLvUdt&1@W7iFJKZu z2}rtVG#hBtNKDd~q67NO4R%QA^|0OU<9puqb9l|$-tGwLl+8zqUBQ zs5|(7j{%_dGLfK!B(9tTWdLY5DGJOBwvN-2j#F3W_2mFSN4s8M^iEMLSnSt`Gm}ep^A(io|1X~X{BSWeObn{DTO|Ok^yNPbAfy%}zw(32cc*9?l z5Yw!~Su&9&u>%Y!*>>qLlnSdk6jl3Ys=r_JGuiFf#O7u&ya7h!O(?;^@6uQXx35P*+!*WN6i7CH@3I2Q>|mC-o|&o z@y)pX&b!dKAg{Ve{|pMMeW`sII&Qx_J{ZP!r9 z=Fn*Ou(eagks}8&F)@Y|n!J+0i}Ea zQ`3`}8Xw2>L>Y;68WHQaUg-Pqb#LA9C0 z>P7`K#U%de-}xXi)6-~`k0Ud8Kp1}yO->=zYopSt;g(x&LZ`8fMyrKfeiEH-N|;O= zttzseHs;G?ICfwXx7=_7wMqr+8&xcCZD4YG2ICX6`1VuJq1o)B!d6ehwB5qt`B}6Y zO{}c0W23Sm35uPq9n{&%y5GU%^b}t6+Iuip$m8~#j^kjVjE%Kzym09v9y#+o9$D#O z1`}An^du75g0Q@_c2=>nvMKF4u0DJKmsGR7xL*xXphiIcZtZgvV! zonJr@tFtRhVUM-Lwsrn-fN6#?Bfs}Op8F$=yC!TzM3D@0xJKEh1Y*wmh?^IDrcX0CPVSMt7U&kw6b02EW1`f=Yv2gJ@ zy!F2C$NA-Dv@=DltZra!aRIGP2lZ-0;?rzHE-fR|X<^t#N84_d%VWaCNQP^IT)6fL zW?_PdYem_qx&j(0BD&omJKk{^MGd1XI9bU~S^*Xeby|3#aPnibKoyUYF!70ihLwz0-M| zc*Sdw&E&MOz}g|3N^vZE%8clMA8tlDK3WNa?O+RzHPB@5$zoq0#kyAiL&49Wet0(+U%i0EfPA7 z&RhyKE$@HBo%cpnQQXUaF%Py&V*f>6Zsch?T$?Bcbh_9){T-~m@ECHrthV~hl9kdi zQ_@itU8X?`%48NMNODjTJYCT(1Y!{^NZq20=PfjB*Uwtda4;;Z=Kl*dXk58Zrf)|roA?@0LOQ8T0iPBOuY=hM4YRf1gNsT$v zd{RkRI)+gLp%@sV<5>4pce~c5lAvO{QU`!;v?NJ4HBpl5FRiR%b!`hvYb%(Woxu$! zPvFRb8QI6&o|I#YYa5uEnL;5$kcSoz*?wc9miMpJ8o0EyCbGX=%nMug(()R{#_}Sg z&R<#*2b#$Nj)&J+e)>_Id+f_1>lj?2ACeuLzz_Z8dvNDHuTkK*1@(gBq;Nw7nUWH1w3wbAYqq5%q&@%53H#jx9yXvzK;Ad#Uk)4F zjYJ0;TO00Idu)H*M2u(0!0&uE+9^_S*KFYHfAQZ@TVKS4_(gqWvRMawX7E{=pp$8W z7L@s!zN)mZrhgN#b2@K|fn3+NSnOse-)QHw1O(j?5H#%v7DMpgcC9W9(3_jv*lKj~ zH~#kD!=V#bIhG?`lNwZp$k#`{`KSP(tJ~Wmvm|~X0cq*2Cr_;`ysqFtv+O}W*}m7AOws$8^u7)F4!O17NMK0bx_tqk$yRUSGF@Gv|XxXr%b+-e@m>8c!Q(zKJw1h;$_{Fcnt+p8 zkV$)v$%I<9CSag+Ixhv+iG&toGpW!|Wspv>TTVuR$kr~GEX!<7$!E~S9vS-6=y&?c zu$UzfneShE5zym6ik(L?1+?l7Tz}n3{MxVoeSH0E-^8DO`g7P^I*Z!kX&jm=;&rck zJvxmxPM(2ci&m|QKEchdHGP%r(*#%)#>6gdS1SP7;W}Mp zIn{|S>g@)OUvoWXj+~U|N|C&IyN1c}34H6ZhjC>7h!oGPZ*5?0eO>18>SM>TU8P^J zg7Jwt9650fcIw+$x_AcYwlOm`gG8-@Op~BNvKx}E#sNEIdYGVe#qzX!ot#kS4>n!V z1nKp+-HD%g&wHgikxC&4vv| zuGDS`)tcA7eaIY{-LV@$*ou3#I-R~#7Os$UiOy0GZEE}3g90Ed&&Xevd?P4g#%K)*44{EXZ z>5tX7G5vY=-@V12EwLt=$m_Odb4W>DW4D=BOWMcsb7Oy&(FM##s&m6!f^Jmv?RngX zKm1|5`qi%<00Y{*+4Y94jVswByREHIHo3hy1YqO8kC%Gi`29wWEdqdc$vppk4L?t% zK>(EY4hpPIA0Zhk3jHaT8}THs#^z&1+6wRuoq(YsiXrx>%0Lgi=fHC#q;fPb;1zp? z!;ktdp&u36*q&%~*9%Y!Vnr=K^>wrtpB08G=1K^5CNpC;uiby>r%M9ffig+xLk35Z z`w+a$PN&qKc;$CK6rBA1%H> zx{stQfYZ5kK*=DMq&ipMvdbeGpwDw_A^-$|fml3>=NnV6UCT?~+WT_3F_pEhkl%n| zmJ1WN(cZt_T#xmE5C+5u<*(@jSpo(=b22;t;L#3p0BA|vyYUa$41p5TIpO(~>3o0E zUfKg?_?Itf{IcI-<34nen_G7dzeHiLVOUK+SdaV|Ui7sXfITX_gbP@>= zO7__KWdV-O%+BFAKJ+2H>s{{(mx`N{muk=cRf(G`8P_nsYH@MFF$(WB!kDg#A087~ z1HSuE`5vOuEN*C)d0a>8@B0Tp+x;W<#gH-h^B2yK-``VD+ASjQi&~SPfj?_SX`*%Q zDvsPD0{GFrt6 zt2a<>x3Nvaphg=zttPgc9ke88l|Vm}!~gO({}w*|xi8|0Z+~0jirl9p2IE-Ge-ioP za4LLX8e>-9*krKjb%~j|!Vtw>MQ6*?7*oCcs0A5#bRc&JG~dgDC`~i z?w+$Zd|%BEEV=a+0J{TFwLXP(R&=Y$)VRuI``CFaE`A|}k1k&0A8&Fzn5O^(qyXql zR%6bz^(Ye=JGN-LtZ_$PX0Z%oP!3WYj$n$!s$~D>any_235;ygp`R0ikG;ZEdk=28 zTYQ9zSAI4>!U$x9yioli+pmh%HD64-QU)Oh57TJGtG0L5FS4RJ?GC7&U)1jj$R6B# z4hTr{e2uhd_?y>LFBnKKJj1v z6#wWS{u;(IS>*b_L^_G7Y#P(KG$!*Il=v@`K{1m>F_#rmTjmL}1@6g|{LFX4oB<0H zS}Yo7JfB@Ax(q}78h zs#&Gj)rhSTkWrbWv;qZJ^f4?e7!Q)ffYQD^9+1D@_5AHQWUEFpfP+@|puz~`QD`B= z(};U1Qu%veLq{2)JuF0+r_#yvjB*Q7Xf=)7Cczaw=QZ3zLkG3D;Xd#d0%p^|Q4dED zy+`EK@E4v}z3>b&mCM2aO~%w@CMQ(}1Ro@ljulE0T-r)Z!OwJB+vs;&=yKs#ws7u+ zGr0DLe*wAiDH)frunK5et4-A4bU~5$qqx9LXzcrKIvsE!HfuwJl7lPaism|WAnY`E zL2osNffcVB+pPzwXpRMA`TVt79ZSngLJzMDN_|QC(Ri*m>R3Mg93K6%-^X>=9>a;N zuEOkrSrp4piKg0T4>a&3V?33gqifno%bO>F&m_7xC{xp5CDWN zbqCHA0U;M2^iEZ9M0c*S4@AUIkbH{2oER`VvYTI~_SnH1G6N!kJb{TG_$pX#dfwY1@WvytdZ>uO% zc36VcSWrL~S^_u>pjJntUPq%^!S+s7nCy0{O<{m0!*K&iyzTAxL`{R% z;d?MSKZAU_h<>$+#!dx`%a?KdhU;+Q;zd-psz{E_pwS}BU=F!_8i`gLhvug-GhV>N zWL7}ZnPLeS&tJxEx8H)w<~FLeHfpUl*4B5hy+ZP&Q~d^Bd)Hk!{mcbS&d%YHvuE*V4?T%;I*FBYPXg_vu+!yo zZA|8Kn3>F>Q`yAAg$vl)-a;~0#`xTEVPdk3a|;P7?0xU!1L z*)dcbq}#0H`lItWJ~xF=J@^n_`Pw%kIhMo0xmj#1p2hLQSL57;^Z4?&A4jdxL$g*# zGEER>0ppY7NN3X+qd}U^U}}5|l~6KEco} zGN=keM+Xz*W8(BOXr@W#1oG(P+&8~~baM;W965-4?zszvVoE?&Q(>TAdm{FTcg#ec?@%6G&-h}dW9v`TAF$F43;I`>+u zBm0c(>$Ka*vR1n7`Gl@;s_TwGbh_SO#G_{!^W^yXLMo*#a<+}kSi z8C)o^4JiQ)$)td*Df5|>H3lYOS7%V#ff%F+(F@FQzmhSFH{gZ}4!=gP*r4-;?T zl5*Fu+qVZ4iI#kX-nU1mC5v4zsn2U|#Yd*q2Or5xyoG-pVU+8G4hx|Kr^fwOUtjq* z*LNDdWBfPEFAA(yd^R$ltGuTi`ugWSiS31Rm@H{$9I`!gFLIBuGZ7i`gaz7ld`cUj zLjcg6F9jMK;DNrsf?o{)O_|UVzm{^Q)22N^8P-O#-BkwY9d@kP!Q$Eue&KKbDsH^x zb_ts4y0SINfLsn=edufWo!|Z!Xw_&7YFkiU@w$7&pA~#DKUFpbA9NXlOWYRmqo}rj zT(Pqz!`uYhD-)cx?je1RJi--XyW>L^5XWpJ;A-1J3Z#~1=t%?kX`oYrrowK)cg3;u zeDVfLb&C2Z(se*%2n^6`5R~U9rHCYz${|S*Gh+z7J{pZ0jvYHJz~G&o8nW38nw^#? zBgSwxHdiIyKp+r{C6fd_3v)ALJ1J?anIa=JOXB+M3!*Ic!rUTEEJ<`|FH**`&@z>F zz&C-&iwq`<3)(IDTXlOKuejq@eDELt6MX)2e~GU@{0(eecp5hz8plL7h4G1L0m*;o z)HB%bBv2fm!{w#RGRD%>463a*5}ht;I~xM3XX{t8`y-h}rc@GH*xcDdihyy9;0&Bk(hDVQmybNJ5V599d3BdFGPu)e(|w*GW^2DR;FY*jWB~A z{y4VlRjh8U0`;os#F^Q7ptg3rgu!#}sZOhd6F1z1 zcfRizP$-o&7;X|wIxTP(!#yBu_Lk&!ow~wZVjx^+p;*|#Vl}1~0{LUUcwCT#2p+kg zOJI3|J^+Nog`vBm``E4dfLS_})BczZWNg=xJ?xKNg|o9Wq8cKw#eC9(fX&I%XMygG zvw^s0AEJ0nXF9PEurLOPS`5R@XK3qs$tX+Z42hv#iEcEVaByxi!kqb1K^LROu(#b2 zjo%FeZ|vt91NZND@t*g*2j|b99{@nhn~Ke2U>{1n*)d1<>9?x>;ka1*XZEhfnxcSb z8@sXU#r+cB1{~$H1WC;iHr}xFEFoxZS_2@411OtK;?J!CMfUIO$Zm2)M9uwh;J#r2W1zuYxJ9EdDXc#G z4Ky!2jWGf;^JJrCyXB-L-4pUV0nRBTq_8$6HlqM^853rHi^nr2tVt?~1uHnSE6Lnu zWk-tfDxE&Qd};yz`Sahv+VV2cZD~xUujCU_xXV~lLTx6$ z^l_{(#l>u7%7Xq(0qIJhj{-dv>bmeb%WIL1|8l%PrGC~K8EGT98?{)SiKhrjD~j28;X zj87ty&j|ZE$!0`9kX_yR7P_Z8QcNI@hU;1*g-pG+RDUvNF7aqtLoA~0qebKd0nm*m zlGDd<=*Cx|->079JgU7Nq}s&)b08Y`e7Y7qYi&p|lj@(araAzT2OyWhRT|wpaj6%b z=NGG=uI#**;hupBZ+^5E6vteM&{y|x5B^w(Y%Awk2Zp|FkKF+p{+hPU8oQ^j`yw_5 zfEmXC?aLkC4!V;0-M9Ws^bnqW@;i9$xo4##0ryy( z?b)}HRaRTkih|l1Pv)0)DAZ1}1nlxylj9__DUapF{};ASSCkmqhH4*%olLajkrgkF zkC*XdKmKEQ)0@5@H{E!%j8kRb=x*A&2Zvb?(fQOI(vUg!WLcokMsx--nGkgDN+zVc z?|=M{e~jPzz26g39{(mbZt)pNgVH9L(tvv!OQao<%VcGKDZe%=J4n$^re9ATAgs@v z1=H^xD~-t6}1LvWAzcp|kZVsRE<4VXN412b6}_zFRHJIV;zf#LkRInr-RN?~I+ znd3jQ$OdET6{;Y8SF}`90l>N|`=GYDiBJ9EN3r?b69RzFrhqJq*)|g`^>a0xPup z_%4jq*KBKxS*Yx`RTYAv&0aCZtmBSi|1c4U!X!3ikg?IEk ztJ)1G){o8Uv3?kFaCV{woNWYmz1Rx2>WrW*Rp8rMz%c|Xn9;^x7e@**7RIu$MRoYzV=7`dsqYWkiX_Oc5d^{#sBNrZ{mfG+ z7V;<-OUM_CQhY(9nTh^PmTbLblvksQ4nA8Pl9_;kHes$4pjunNY1)3Rj(Vep2Eosj z3bv~aY*m}s-XYUk3;p~!?*Hj`VRC#7WXj~1zA9w|r4wwgK*=XGz}Qdc@a&ldeD0B_ zk)J(@_2n~2By(6ee;%b$8HbNwjiX2AP$;G`KV1^=E{%O&qfxI3Q(IxIghs0^RgsN$ z8})hz83#7@EqDmc*zVrnYrVe3j<^<+urg7-NB#Om6`f2Isf$MI#85b_E z2^(;;!Fz9GZhj7{>#Jzg8`AE1er6Jz>#JyzSuS5djcua32^8{U+QO#Z#a5+`)ulBQ zifmb#KxJne*Pc9vYfqlUnHSDsr&h((X$feB)!P%LF=SI@OiZG& zb`k0J2EO;TugB-U@*t*8@-#-0G zy!DOWi~sQP|B40@7%QGP?JKr4c=JSa_4k z$iHf>if+3t$v$H6TmjzUnl6H*%pFm*01Xi&van`j7cg~dbcTvkpSaMk<-)x}WsG(J32ZK85 zEI6puP_J&InaJYk&3B_XHtwoC-Tsm!lfXIEb(e^}RpqN(2?AzjU@L@cu+E20mpHo} z7X}E0t;iRb2oR@O02*ooDUX?%Lsrr0Mbll_E2dFn;x~Y5xzAs2T@_l5e&Q!^0`?5w zXc8uLG)$Vs>0^BbMF8~cA`W6481Pa9WTSuxSFYRqGeToR?Lo__s6Ad=x_}FheF0ep zZVGv%34oTuK1pu|1y_>9V-mGZ22RH!<@Aa$K$9tg@~+X4;+kr;iCUu}%xujDbq|?T zTc|hNSg%y^?72&_CvQJ_1V8YO_u%9`-y=yV>L(ssC=^jF7RAQq@2rj|=#5EWCVlBx zH=6_|wnYy}fr1s&Ic3ZsE&~+8>fGswzA>A`v< zW60$*ID6p|E-$WNVR;1y<{bd~z#MW6WU&=ewT4q?FG!b$*|Gw{Bzfur?+lRe9TQl6 z?&1=*s&&jwm&NwwbqRo`%v)LCkj@O9HqRvpFO5@Q{XEvsd`Ipj47kZ8@)I-oz~B2v z7@wF5?80GgSP&o_W=oA&T>Dwe=F<$j#D30KiRl6!W@-(&m@>~B-K>@5npL7wQ5YJ$ zpx7|}3bvRFa`Vo=m8%S$7vGNC-wxdGGsmyysK>D*!A1Yc%xZj@mx47%(+ z_AtmbA}GK2C4wWuISARx{Df^_dB;>j7^VsTU~zqYYU)8vyo;Rd_VMtSK7*BW&ta-m z5PN`tXM$u2e&#>g!ju&(=uqY#f@B$h)}Wv=hAHC#IWx2XSAl5ykH0ezt&Gpzb{B02 zg68j)MoYR~usHA1!YbbT*FS(eUiBI|HuMctr*dz9`72+=@BAOXC9;yNVZv7CF?UPc zMGC12X7PPmH){f5R+}Tpn;HN`%Rof0`+-b(w=S4(hP-eTxXv{iG*uZTKUz7l0GM4i zUbY{TieB(kk{4aIFGPO2me)!UC;$gWDA`h0V??C9))wp>XRpuhQF)XYmq}%X!I`qS z<625no>nVcIDBwkSemygHFF4;_4Q*+f5w5>LymnV`+I2J$`0n{590QFUW<)Z2Q$;Nc<$6`6jK>oIQ9V7>&#YDg7DR?EhNyw?A&3LXAYp->|$kg3DkKx=70Ms%pE#_esvSg|CKD3?I6x_Jx)gbSrQQ#O##!&)fE;$3Es zz9_xs$#nWR9}!e49!9 z@JI(Vl^J$#yI(vZ8voq?UGHo2=h~FJYlg`l1IqQVzP>JVWqyFpht8WnH}-DL5Ay%U zb3gKtkKp?2uOE2q_V;I9||*iq|y)V$gp>}TFbjbX2~8eiKs#@+S_=V`wHX#e_w z3^9S{2gp5^+u>t&He@Iih94HzX%8hl2}GkOi+%B`35A$JYVy+E(d;x`KjHDa#ru8# z$j%ApBbHxq`oQck+BECWK8*T>C#6L%Z3M1wwx-YKvgl`X$TF8jLI5Wp$N20UPP+j7Tbx|UPhA567F(e zp$+IWiTQii_LRT>ZQt2d7>ko>boRV{u6x$@zP~Pgpjdn_#{IWZzx&>k-OpG6`TjXC z2C$Q^Y?Nzao`lSpGQX}^!k%-OY_Rvt`>1SZ2RnT~{`dkF9@`7Svxf^V0t)swLiBlE zY(D55V+Bov4A{}l6peKa_-t;?ix1^&E`3JTYXSJ!*+Bu=CD?Oe*9%)K2BZ$g?_N-l zT?qDI2u_!MDEVi@nMCckK(3SFQ6s%BVkrsU;4|$G+ef|8LZwngE|bAqU-wG<$amc# z@$JIo3^HVeBQPR2COP8-y9qHi#@w-RWfA=Bx*&+Jr~n^!NDSE4`(5pD*&*Qu3+zcs z(Um+)cK#Y1xK=?M%q0jbrNm%eT-gK8`0~S+gvBriZ6%dY_I}h~^sVnesCoXU+l(G; zY*;L5FWvHT{ayW5j}`t(FFeeTh+HGS-gmh{B=K(cv~_v)^~V0L8OR}bT|d&KzPdHM zk7^|!06lvDU+F}Riho`Cbw-V8(7tdHon8-HTU%l;f8rDW1^@jMpODzA75ohYL-Sg? zkJO;g6pooLBLSHt_x&&%zqfBAM7)Wy^Zoq;<{|Nx1wERl6d}wQ~32?|6c`Iu5u^r zPHg8>57FMG4C{ATAl{Auwn-jR$Z0n$#$47nH^g>e{*7{*aWx|mVCULWDv2L?!)x%} zw_k^;bQ`@^P2%mX7K=T4ICE(Y+qojX|K~r5t8cnVV5C88$~6AV0-ktj>()Ozz8?1L zJB}K`;^Ly`j5`a&_rv2x=`ehR*`DH84&qk!eEI&GMPEEl(M0Lk6174dhRLW-b~ z0-0&CXfx8iK!42S9(KQ>`3x^}r!2$%w7O_RV0Q$8kAR{@|3q6r2`G#JLt{xU4(fik zHNd-22GI6NNf$f4DeZ#V_7*<#*gnnFUbCBpvPYJmAezLO3C(0vHjhqisK z+r!nbyAMC`UJ~Sv2MpS(-@MR*`^DEIk#I;b^`0V#$;cq4;0mMyzu1dcxRv27dDrnq z+zYq106eY8%Z7778E{sKbB&&S28(L|aBs7zjAI z(NrL#Bs?{UBtd+a{G{sG+1kP*|M$PevDtAPICdOk6D6s%Aj7K$>y=%Qik3=51x_8U zdR^K;G&?;Ux$FCoFHgDrk!~ZIeGd%gK2ac-8Aq`x(`uRMml;z2Qi@ln>0WSwyLdEh zD9gh>ck3?8djJ6K#9F*)VV`%}YlB9zWr0C!K}w$m+JF9i7_xhgFFpreRKN@*+XjQz z+I0d4V%tML7&<(=Y9#*Q0(^ABEf8pm+}R^R?UGe+TJYS~-AJdFYe))CoZ*s8ptiY+ z^%tH-v6w}^IEH+oC?HH}n@o0sT){P5P(X*ADQuR?_8|<=1aEYeeY4Gd)gmKp4UI}o z3Kur3b!=|eQK{BYZL~0bqt%+3^0o-SdsToxu_GP)7qN=JY|41!H57a81d(D3N> zv9`H|Ogcx`0UMh;D2|OOOJA#l^^G-bZY?7}F^5#HjP}Aa_}f4AgShtC2`sH`<9h2Hi>Jo)vnAy=A4=ETjIyZS0jj~7wjsbagG$$j zTU$l4-@(yi)5xW}SX)`b^;aFnwbxvO)2Gj3bz=+b)iy4#R`BSzpTfra3g*Tqan-Ro z-0_N=QQN3uY^sb;{lyp2Y-cc&YoVNPVyD&-wotam$>(O!&re`x{vg`*OmilGc&Ugi0mjK3I$NvgtewVvuf7XUJo7A$-1;ia8Q0>*$tE?PyJ$9=@}9_8#|lbmMJRD_vVCyvx3qm)rz78ctv2$>KGvRo6uq5A zoIG{_x8HIj4osCXIWvQDc>?)tP6Obqj28ej+mP%01))j-Ix6Eb*`|BVIy%id+5|q= zYiJMzU9F*3*+#vWz|mXo#@P6zfM!IL28@krzA6Bk<5o664CljK{V*O?$t zr&NGleuP!-r4mV54wNCt&NZ#7Nd^T#%ZQvXG#1uq(r~a_gz8Eat7;z^xa!3#i!ccp zH@#IEsa&<6_fmB(kt37i>5tft;b;@M>8{r~6Tr<A6mImlNM@Z3|U4pEru z@VoK%6KHI&;OtjFgG>TaV3j6=s(_4jeOsbQfPumyrM8^}MjcqWLr0LTs4S{!G*PQH zB$z|yPX24L`v7f4vh6gQSlX)K)cFfyqaB)^#^3$T-$H5juBl^Uon8d0EDzEbuIp6xg`=>6p=~^;F$ZKfaqeOAlGN{16iJF_tIvi zd~XT+b4RMU1>jhzB9ltu*6XiDzL>-5^Otbp(lVBomM}Lrhik7oisOe52-edfgR}v2c@2Lw(dLTR3oF2B}mYTeXJReH{rHOQZoiI}6BW$B;;5&=$uj zg&dQd42()pH6`~WfLaoti8R{1j@Yg;Z)~H-DnZ)8)OVEE1S?4A46;bD9bN`~7T@IZ zsBK=xefQjo`+xGM@bOPSh^L=<7LDc8m`&GkXtIRq>1llZsZ(h6vzVTq$EB4e(T6=U zk>~SBk?A>=M0s`&?RHOeAq#YJ)Jd6?uwW4Y-K$jvSkdmbgovPB+d;Wh#$B)d9@LUa z95{Fc&%N*h4ouGA+h6+kIj$W*9IH2MRor( z#^7YT$q6SId|NkoM!)s^E{ednqJ!B9E~xMG@WJV!%(^4vr9)aG+p%Fn>B{Ww{px2w z!Mmsaa|bYf`JVT@8|N=v@IVJ)mqbfm_|L%4jA7J(&$O$p9k>CYd7J^2{qKIv*}xd~ z-G5d~==pOUP4b2IhJTDd&-S^EP4$=R9Ror0cLic7_&7|EMN87`d3=zI$%t@V=F1r< zGGsHd^L0)MfL;@S!3rF$z)6#|#t0qjSZTV?{hed}=tn<_Yp%Iwzps4YxM6c1SX9G` z4tyEretxMw;9hIoU)%AY{k7>o96#SL06GL_IPks2GCbKnFmYb)L8OzDU9uKN$TMFD zn6)}s32u5KOmf9#Ra8BA1v?^xqrlNPFx084P$zi$$^Tm$DM0$AzCpK66^^-oU~xk_Aw|r;%WOiaK3LdXh*;=cblCDwD+0 ziEL*FY$3eX>fj4coyVvD@(FA$E->xuOl%g6vDnNNjEg;IBi5G3@in6FOFKbW(8%_4 z=z}`oPS6=ducLA+S}PylcIt4i`2`2Mk3tZM=?Mdd z$g>9zWuOCxkaq9iU#a4yIKWH2(ZEinE-|4uzxr1E#P{5T>4^yx$`eAyLb4h8N79S5 z+Rj3r#qNX5SISx^7>2Pi7jx~kq=PV#%^ViHjgb|at?5ZFLSilYkGVtFV*cuzBu^@o z7shb!I(hp1plYgxUGybcz)<7_z?}?G~I7LaNiFz#9sG=P82NW>o)5q>%B_AD}#c(2XZ*KMd-b7oShr_g>xSfx~R(eV!T| zwy>};K(^uACXwqo^0~-o9+t<;bcH&0w*dtPO4u)554VDKjR6iQgCW=Si_!eNq+V^f z?ueYDi%gH+!+nqIr7+GD27rQmmLC^!w!4!a4!7fqRwUNRFD0PRn7@9a-$}5gcADis zjbKHrQ_1PLI9D=>+RnBxKyN+sZHzPb-0w*oGMDB*=Au)`$n|=X6XIvhUK{B`7TJ7J zh<6fTF+xvp8J!M6&UGQ-sWn^JsMWC3?qIXg6##U-)d8syD$New{*ynAMn8c+`A`2D z<0b7TDlsbOOE6w1``QKM#V&OE)!u)Ip9$}`fy&X)BvaX_Ky0y_ zg!xzBY(OOF7M`9LcFi%MugU+>`bo#2%+GEWdNIJz_mIV>8bBDsLw_dFG0qpUdEuB; zc87#Uf;S);ha*+ubtoH2$i!=leJNmHU1$7mJ`w*eHl)N#`pUMS&qI&6G=+<|Vj zz(zV%xjcd{SItrJ%lr`qfLq+ufr`!kGoQ@eFN~cywqVDu9NzNUnQVrc}97Q3W|;hhfosmdKnfXGIvWx^sR0D`ak&)e(I;* zDTIx(MqI4nKm5CYi;w(=e~0mG7KKC)Gubqzb6JdM5*TM;RH1;ebO!lc8l^%`0MP89 zlw;SIBxCX<_G$|$D@h|sy2YFb^9^KxX1=)I2M*kJ7vA=ZA3$mLfE-KT+s7ZOdlF?e zHw<4iOdGC8|M^uc`B^d#*zCu;)zFWHDMGm()wm;sbwsGge0)zIjFR=f$_V}9K|)_A zaCgxeFP|SGk(?+1+65OQ%ghBLGz}JE1q>fb1&!>72%tFx!Hm|!!&smPUWq&1y7>9x0wq|*n-+n@V3E% z&B!;2s{70fN(=y?RcR?`q$jPMaA14Kc1n z$j3f6W-EWCi4u-4WIwnW+2unRID^0MLre@nn5ixcqw5ljWjy51SgQmj7(x= zvS&*Tg3=U_StsLiy@8#bDmE%rY;4z1snk$!b#e16?~yh|+_!WD0t3vR(^~P_`*Dh$ z@r6{TgfBgP5znqP(C=38=vN*IMIaO>@_!nqfo$AS5yICc60E}c1rZ~WzhC{7;3)U~&vG(Uw~ zZ@3zB#R)X~O&mRT2#r=9=gwZj<)tNYT*!c$Po>#+1L-W=*(K2IG{hn5ciOTy1;9r} zx*h{91mG~VnM9}6K%M{&0id_V0A|3nQmLcePhoj!9Vv9sYt)eLw2{wbFn#PW-t@-T zAm6SbnNFbE?BnvK9X#~a2hr))kts}~mn@-%4(eobLK+7qr_rdaqEX$#SYZsQ;)F=U zv3wTk`~()4SJ7t$cPfvDw6y^;$vjdCw)5+wpUO+MYPZ!wpG+{+1<4FL3;<;_!j7Fy zCowrbfkq~WB%kNfv$)~lIO?@3s@XCQk541fTEq9g`jvR_D__N9&z;7r-t`PL_rkaE6W{+3%!z?o#qNu?8LHOVMTChmp=x!b+2fHS#xUth!G6JNvO zat62EcrC6vc^tEIvzRKCh0&FE1LY9)zO+YSwXJI#6R zZ=B60PMDZ%Aplw&GG~q&5JWEL8`uF@DkiuC#+jI8^J=f6<&gVT5_(+JA$K;YvkQZf zILF5<>Rq*hCC=pH9-BujNbBo>o9=r3px7SL1}~nR+Ru|llTy2NOWDuW{A0pdh$gI* ziL+CGhkbliO zfzPa-rSnL(<&H2y(|$g`x{garD`I<}xb|B7>WBWhIGxJY45`LtP??S{8KfB)V6c{- z5dh7fE0qc=wYt1I7Chu!u-4|DfeA7vb4?Ry#=rz+!WdblQz-#J*92G%k?Yd6q@}FT z1VA?&xN*Fg$6c?uMSzrNFD~HBg$1lEuV8L=23H?HjAMrnAjiVW1mwA2IDZN2TRS*B zKPNKIEC!B|&&TnSQFd{81EQmOvS*Q zT*rd1-i72&9*d^Q0cl(22d)%yJ9K0C_w2Gg*`QGu7~8x?j~n6-h8_ae>>WweFp z_OaJ3x$ixfgl_FI@PtE}LDXJCv>48jCS#x4SF1$aP^h_Tjidk$t-_??dA#ePq%=r@kX{Hkm16tKQVE9&P8B_v+YLzkpn> z3?#GYrU+n8OCgUWIa5s3u`s59KIbmYR+H?Yl$0(g!orfyA%U*MFtVAftR1p&kUgT! zBFtP4@1(hYi_v;_y6dR;Nzcq0B0{PWA*G4$W<=jyIy%SHmempe)>F8 zxk*XHR+}B<@?+@dN+?avV7ypFsgy@2mB#YwDz-Pb=pjha5nEmoP~O$p{=x; zOswy0VX{1h@4oNN=;ZS#&&=V8?>r^#`_4Y~O;om4CE3Y$GchrX;@Bj***q#OvdFZN z>?NfDlJil>W-wl!!t8;0G&e3|>&%nLrMZR_=p@{B0`!p#fzFf1{!9=w-vGaJ(H17A z@xBlIGUg5))kL*)FjDzpV0rhO17YZ{4|t-*K6Id51DxrVLKzzDCQd#gOYjgm{!E@aEA|LfZk2R`N@`G8oWfze$I^_ zvtQfXkJaoNw{bV%F$6um`(5wC<%NX+)Eo%cSX@>0q|U5%APEZ#eZZWt3k7jn$LMTH zC;Qz0uIqhJhx;*LT_WL|9rm{%VdIV62VM9-+qJ9}tvw&d&#wUZH)I}cyrbTYvhx{0 zGHg9==aDRf9l^vmcMPotfEEyFtTSUcH?H`H_5{1dWV86#$3BLmM~@B#>c`jMUTe#r zzunfV|1S2j&Eue#QSW-Ub#D7Ae&1pH%^&y1`nnSfK4@{+lc~@VAS~Y<<4Rt7Xp~PP zpNCGWUN~6CPKZS8%R#_JMD}?@3s$;Y^8+%?=@^mJE*_wH0l$DjW-O{TBI$%M4`6nZ zf4tt>A}cDQL%FO!1(G$H#`fvQv2*5I7-z@7YzCQZ7P)j*0MIFZMs{W);&HaE=xbNJ zoS{9W1%OiACWIJdd8ED5MzdB&Yp058wStv;7Y{sr4xjzncd)T=3E**#-HnA~EZR!C zE+IjPg+*v$Blz)!aITCT#9l!}&jqhCWDb_8ad`%_VeS2ko)4-7-El0=cZ_U)jwB3G z>$u|k#ou4DKgFijsF$(l@x_=-=I4xc1Z!4oqmTtU&Vp@A*!DihBl$7`KvOLjnS?ctZ&Jtiy$E6L(z$y9Qv0&_J@xf$i+G2U~%g4{jf>M`WeD z*6HTMsA*{|%wgD#y~h0fsV)WQYXo+WXPG&WgnRM`36-8}Hj(bAkQl~ND=sQSz>(w; z*n_Z-`|i8}@3`-^I5;yBj#}(VP_r^X3)n~i(ArIi z@1CFx0T_0e+f*_YvN)EG--PL_u0y{=z=yeut{b0ML@du4bETtl&JSwntPIN7-D8S2 z&Hnejbk<+x-*>k#**kDPk`>z%GGl61!!WTaAH89!p}BjOnNhn3yPGoIqsy9--`S0yH7}(qWf<6o{Rf@excx?M{2KP_?owMbm77| z{9hmW2tMQiPaMOW?zkGaU3V0POdt8NF^REtJ5AKt5u6~wP7jSn2dnFK0YJaymwpZ7 za|cGo7=7DxxEy-VLcHO&9puOI2(cX451;JMY-jAKm(J#GshgmDW`KkobCEYB6S z9m1gapwBq$(gw8L>$XGf`CvH*fr(u&6UxKT&<>+1p`T$G5e-io09Xvv5E$xWmp0#_ z4W!4&)tp~0@5T0vLNWteJ?T34i7-m0q(j@M|L6~}@zi4&XZ#r?a7!Scgy059rp8Xh znKVf{G@jP#wU8;~1ZXMoOLoB~nPjypUG-{plF?~bH?lu(G~3vyx3SHf8Vjk2FGy$c z-e3GBeBr@|@W^A2BA;PA(}8c@tcGjXLPE-xFY_AyPYbSf^9M3QWT68sn?Do1p03l- z)^#yz*ZDLWQ!u~XY!gSc5L#;yOrhHQT4d?R>%!$@1eaccs=Rv5P5Ex5Zn5~D3JW-$ zTNV&}x@idGmHxJn*to{8t*DVX240`}hZf`dF21M)C9WXUd`jnE3Mkma*)jIOTq<)9 z?0%~q4#IuvgNSur)k0#d+HB?U8P!(^)-q!vZas&r(mIp=J2LYnI>*s@^X0RUK)TLk zI#wGKW5XeCAOPWeYtk@?n$OTUfikRXTsZ&_Tk%d{^J|WTb4}eu-M_K1iJyM=JMj`@i<9NOe0HOY||BO=32mMLC@k0CYK*!FVo@d@hATE+@HX z>NtX&Gii3)O`z4N3mJ*vrW!4@yREw<0(f9ufrjH)inEOyedI$hI z5)p`tLT~Op9H!`RFIKB^)+X29tHyxUuXb{O6hwDG?E6M;^pB(eGDM6!vJFi$xwuE% z@f_Hfduf#y_ji%+5dd^RiLc2Bn?PgO(&V!~yiTG;Ep$t30?Q_6FYxnTfR53McVC9| z(9`w9PIViVXTF5#xr0axlOqE}SxNY?-6@l!TJ57Ph@Y>w`-!C9mnh) zZ$!P-lB8;mK`2%QyA3LgO;WYs)|(61?)JJ=V7aOdnO;^EJJ6DMqE7ShISkVD0RY?H zSy&<9D|#K^?u*D*7D3R?Ra;7;)V1`Y&|_Wh;Y!C68{JhWmnIK&=lh~2(#6p8mNk?MaJ4D*LG_&~!a z!q*AWS>NA)^?cvR4vPcK35XjFDlnr#Lw~$#KzN%lP+oq(PuFcPnL=xO9jnhjj$9^% z{MfiS-2|y+>6~Ws(&~_m_GGf>mj+uI?A8|B1Q-ZY8=2Lc1gBL6sLH*?Ao%un1?xLi zZ0>N+*3szn@x5>PVch(R+t6;-U0ZF6CT0H8kUb4uZ4a#*ENnAJnfR^qYxvx^&R}cp zB3^&<30!;Pgs>d1ZEs_3bs5i{xrBv19XE8r_0#7{o4gBz{UV-nw=N6nhe;x;>58^+4 z;?Hnta|iPWj^W(JiG(BV(h?mm^gVOvSS65OBsx((>Q+hQCxfN z5s@F?_~y4TH8U^mtG70GfNlrd>noU?C?c0HVXRcdM0pZzg0;zLPh*Y-S~e?{np>4^ zVY*vhTEq0@B(mug%H?rvSGRERz#%;Q>}mAVSzKOR#<^#oMSXn}g=7a?s~0d?ng!BT zy!B1rD=hdAJ^VO|nOc4B@K{vr>K3%W{W-*;WyS|1_y@qUY5+Fc?EviaI zv=T*Bw<-b_6nQHwi9G?R^eA^}fYON)mI(DC`oc(eK_%6F4|Gi+pnj zXU;F+zkdEpD9_I$Tb@LAtcXlz4AX2yNT!=Cbu`;=^^xdyg^iWQGJz`u)bM*TpO$%aa7~ecwO*@>9!Iw;)qJ^572SpBk=nR`n@=9b$s2DJcGszL z3Hef4iVkRW8v8SgsnkJs?bf8KRyRbi-9Wdl4AAUgKqdp}Xh4AY|JRmfr`^M$8}7u! z^laGX#s_3LIVuj40GmvLSWt_PL6_|P(@DT^3KkVoKN6#X{?BRp&;W}URe`%iELJZ z#RRY!gN3orF{nTgBa41G?n1tRVm>E2hJeP+N>!Mt1>8+wBW+iLx!Y~js?>)y96B(A z+i$&DjyZpM5oazgVr^v=Q&SVT>eyi%J91F2Nv+szwsCf02^SVuaA0~G6Q!bp5?S@1 z&B$2!MF8~5#x|aR;jDlz(#bT|Ha9U=%wukPQh?&?n>zxeb5v?Lf8jE|=Pf^kAN%Qdp;l|k7%Z*9b;!bvFMa9D z_?N%+TS(GhCQE<>m`!u*E)iy3V}O=@qJUD`Wa3u{sKB*lbxa;CzsRCIEwB~=5y$pORNY8cG5HLAex3hp0Wfqi$ zkaM2POVOEuQhQ`m=yo8rYy$A59istLBwXuuu)9tNXl`SkV1&XXHtS6(T&cI|*AO|q zgRPY_$P}iKN*91M0YTJT3G`W9m}VytWpt2tPnKiqi5!cFQ=+T5XShxT=+x~ANFBU9 zs1G{g^GwgqB2619oyPLH=W)xiS-ku0Ka5X&;j38M>|$&A94tJS9BTCz>U|b4(q=D8 ztc%IvUMh{r61(qA$a7UzFJt|=$B<96gO3J|6@%{nJ-p?8LR=lbA845PnXl5(>z9ajv2O%kSb~BE;M}ck;o2(18qba>m4moax!lp&@MX zOSO}uvQ%Zr&=`+{X3MU0U0F1l5bje0qiBLT6usgZbFVtF83Npf1EA%Kf!`2ZkIf%Cz}VfDf4!Jw zv!AH(@AzV_wcGi=eNe0J;QssXSDQ6pA~F_aVnlhinjE)t!^EfgO<{t~&bMO>z|Aok8#J#SPvQj$I`6(= zLe6|ky^jx|_UD{`W2;l%hx27Dt2#GqmC9Ivr7AS}Y}d2#GW^fuip3)SpFg&QNIs+HlG1{PrKM;plhAH?>*=XPcdUXVH$u%JoY0`UI!A| zXU{jSGt}Pnja9XCf-mz=1_01@M4+HNNVBhtJm7_k+N(ZM!OKUn&SVy2QC;R9IhDrF znWwPx{3964rI5_$#J+Db_py(VDtRPFKl>wUeT!*$+Lx5xS zo4d^>n%h~Iw+1R3JJ2JE#S6CR&0{*3YcK5Rb* z{#V3)@#9{Da}n96o?B_UJsgY9wEzh{pq=Uqy^64l26|B6uMhPK;uS7;X*QnuFu|Jf zbfvp;00>qQ5f&?}xX|u)R(PSD;?4%7pXUJX94m8`o7**s5r5asC-IIq-izah4u{%|;YRJ9D+S~}_BOOqc*x$t(J|BiQ!rVP^v|MNc!>`eDy z_INfMZgsnL7D$zWfky0APi(x{CyLmc22k?eg%3~}@#f^#!=FcA>wfK$y>#<1oxj&P zgR*w_ncDC5hFwMd6D5E7*#G%&@L&Gp$8l+6OFC!v`$;MM7OVhc2QK!(xD3hDC~g7( zv@y`r56-4BKcn5FWt#{yD&t7r266k(Sd#r`Fx%A!qWX&3}$pzVfaJ zld{S|$AIc>U|%=-b34j!F}u~qWO9|A&c6NFqxidj_gAsFxaj1rW6O6%(SfdT#XCI6 z>}AtO*73||foAtab|qw7{L_Xretfjr;!kucAD6RPjU#E!g#Im|bgg@nZMt%W>X*?QQ>Fi;D{? zp5>XH?KD*O3=J24p`tMoQ(|zJbkXU}#GGb3@-pj-j6EbdVsj!8>Iya{4Z*TA5-q+oW4}bW>C=^RFpIjxGbP5+QUcd+5 z|4Uf8coC&!A5)nWrgIr(fzGB;%w{lIEC^XuKAS?G1d};pVAAOKT+E7C#3so^*wMHx z-CHORTC_pfS-hV>_RtBu{crvq%wBc1;8BDq#EN#EZ!8|BCRE%S4tuFq!XHf%nw5ndb%XZoZTW4h?k;?V>@(jvtqPSJlab$Q1Px;-{l4NS`BP`>wjSG zz!7DC&af(;KrUs460j5lEmqaTt_Wx4%CQy=HXPMv^>x(^dtIW!* zRcmRrgk;%xm)FL|*h6C*8?!Y7*likUFw;YCobDNB`Y^+sZWcElXc|uA6&tXHSG=@$ zBgwLMxg=Go_R7l2HTFGX&iDWKzIWfth|DZm%$!LdxiTZ(a^HRT{_FRDziZgIewhq4 z$i0}rf>|<-aVkQ|I207jT(cJ3!lW_5E;OPEejyW}FheuYMh4nmA7A{l_n{bT^ma^w1Hn=0_UyJbk_E+ z0O;uW_G-=Uu(`xo*b4x9(lz#K=sM5o-_vc$;;h9TFfU_6I6+Wh!V3(IJrL;{+7q?q z9N`49E$GlF>v5nLYdDz~9lDb>5_M6T$|v-Rd^VPL0`1B=E}wWrKvrbv%w-D#2o=Um zGW@2}hzt9rf;$M}pb;f(c7~aq43|vkciT;2q-7;jqt!;c(L%LW$9lCPV6axRgHbAn zH@)?pn4h1;XxLE}P$$qW?T@9swFc=#;wjQXg@n(WTv8QqR>^W@J*HEcdvAVW~##RNT!ZfnQIdr@{lBF3e z9XbNfOQ7AZqLj&Ds$9gZw5ZDn(0QY}fox_9$yg6BKXw?mADls;n^!Xz!pOJQpnptp4yu~8DSd>%1^tFdKZoB1nJbm^OzV)>) zAzLU3fFxT!h#c9#^C_e=9%$00y#!K5&rAIf&p?qry*!{8Q3XSRl1eiHn8uQ&3^DAuyfQV2^5DfwI@dNLvep!J%pXcsDhd> zhDoLeF`7x-cfR|Vam@|4NMXZvPXICj$pi_PibZMh#b5(v@y3>d z9xMP_oMFq3NBL$78~eQhI=zmV(djn|=+~%{G0two%x7=_Y zu0C=|3i8ffyo@s!RIKtoi2+*&#`$P z8N5=mHaQ;~wK`5ba|Yc`PrfIRvXIMS-|RHnoi4WObu?-X(Xgrb2oHSrV;I!eK^riY z%%UHU;m3dO-8gp3?PJ&EZmVt5I@v9-8%;_E_nF)U#Z9=Vyj1_l+TIfAkP8`m*aS>M zyT>@megeP*w|xK8wa_Lw)B=DG)#`>f`?%!8UiZ_a`QB|lCz{PW$hzn`QPbE07{#-g zB+nwIum#;+@$;I>bUP*+h_uP~Fwl?zrLj0UC*Bs8nbBA2r-tJRJoU(T@YDle$5e*Q z&uK|k$5RS;X2M$RGP2ql0JIiHX;8}opd}R`08Q29w38JGZR8hOplLfx8#L`EA;liu zF6yn0bnvJ(8aQ`h1$VyuRrsl&{{=J~h5_0*jJ&Rw&Egy1{3d?qfBS8)41)4g*IPn^ zs}^WuK&N6?TXqbaC6YidgM|3xu*?I4=bBKAjS^zx2s<{xwSA5MBvKh^!=7aEAG^?yQ+Y&t%cDVz9_KPf zAa!3_LxP3nqoK%g0Z+t|^mvS&nH9!pvMr1T19U3qan-@Y@Je&2bb8WKwMDy*?0=mK zE}eNC`RM~d+>>H-wv%K)x-%G|pG+a2C3_na44!})sK~PUtlXP=j9>&7{cs)_%;wsV zXJz}!j3-^KN>fu}8?yt-#k0@g>V*=1;zwSGZ#{Y(7gh$SRaUUI{1i4Wo9Y{|OeRTR7Hhzo;1S(F3^*IsM+1Bjph-N9 zpZNJ-z_Huz5C%Mnf%)+m7G|nptO)>z2iYVS!U?hnv%kZj5@-j#j#!*lC-}NUcY>S1 zlGX2rg`9#ub52w~yGb<#I)}?dG`Yn6V0K=B`POIv_ooqt8um8@_CavR;N9%5H1f{> zCx|me0WYquvuB&jM^u6>>i4CxFH3xX!VRL>8#%3DeSgFK%)N`zAA8boMk!n=19YHM zuH23ur^|O5t81g|WIIK#;rke)k@&oCed~{j?WzE1-3re18Wy%dDO+%z0HzEJv}NhB z?9X;Q7JTOGFvHGn|CT*sfk6(K-968JHWx@>kCF9l2J9xi+%ed>b!|a+9wZiFo+UaS zcP!EK!*gpvf35*zlJ-7ZpW4!7v89Ysz0WQys^iB2pxrsr-}OHp&(^bl`Imo*QmM3? z`8@IaJ?)1pxVk&nc3#H zkS>ahM*z^aU9h=M5IZ63WD2!2$FcSF{U~^GDI}v!MIV+ix|jjeie46G;kXpiN zO|gZ^0!jZRLOZ6b!QUWejLPfDzWZk&$ekxnyY2MuVo6P>qA$DN3weU2>sf6BOwJQvWvu^%m1 zhQ5>HQ20J|Ei=BfRc)X*?BlMh58@~P(cQS};3Cq~Wo3Y7=dny)S>dEp3X2L@IIB5h z`icT*koXu2N=X*bk=U}Z;*DbBYxIZoANilM+cmla%v^g1N(%?ImAc)hl1s9&)}Z4~ z*iJU`%oYc`V$BhZzU^w>kDY(ny%Xb{!OGd;kgy>Af9WrGhevmNumyc%UzcDcZsf1+ z?Th^TdI~GMLx@g)kdBTVhvyqBLG(jcw-ErnS35QOFs{t=_fI6oG|pz;?K*pzwCKHe zJI9WLagvY!$sgkD_xv?#ofbB#b*whKs1qP4I04F&IEJQ+69bC`k!h@2i?@e{v4vwe zu%8UtraNz(aTg`?k$vmpHO%j!Vim*I>FYUTY<$};#Ked4V32DElN|~KIvctOu3UC9oCP#t)`v7-^-dGcZFwT=PxfWJFuX!87>!z zGf9O9a&0F8ZA}DKlKKd)(QF>dw|6JF*yHx@wr96MSHHl|sS2Oq9)v+h6W-B8pT>`V zs6FQ>GwFa$pslf0En!pOM;XkIjmJpb*G`V=Ree6oB&+x$7EJhikFv!8H~DG1QO9RK z^Z~3sdOu3ZB+_y1lFTTrut6tMLdM0sdeRm+F}KFfr9x^*TOy8HtxBgr$Tpgt78=rJ zu!U-;hpk>88?82~ojy9f5t_pRZoKVwy!!P&jQ{xi?~~kY`6Q{mtUI3 z)!3XY5%t+E;MCe;uC55|L(4d&Gve+?f1X|6#!RowssLYu_vfA)*!b$_2S1uCvd^bC zReLfRuPrpu_hjvN6|D||h=X@?yR?fqGF=Vwk8Bbiaa*iLXcfw+{B%o`B6 zOdOp3v3`S);#r`*yYHMrbkFmoGYDhOnQTUUL*^Q!tMzc8T}+IvE0{=AjA{2YV;`Dp zu|?fJaBMO#%2$S=gqZE@uPH1F&mz`M02%T z80z2CvVCh$KNCtdeuf328-GLemoPo+oRCb0WP<e$hGJ zz6^rd9rvv+CPI9#~Ny`VWBTGq;J$7Z~+Z!6bOSR|Fyw-schHQDGWpl09rsW zWdCDpTY{ez40Hb{K8WGwGL9ZOfQ5y56lbS}u_)ycP?lB@I+?e`XzruiX$w%3piQ!$ zQt2NM0Q8K_GZ`ROP_3dsOp_3HCeye3jN-NHDKK^-E6mJ~`##3cV>lSM^E#cp$?bgG z^F_h=TPk=rOri&`%6VsF4BL?B94s-t#T7(0{Gf?70LPu{K3de^-R*Dxp~JIhgEV5K z7*?un8)UpRcPxEb$OhyW1eLbKKjoe;IFKNYHk`_Q2+oS z07*naRPa!SSTKqo_;Y|icHe7}hpChrk-eF6B_W1CaTk)vR_E25)2vlQB;%pw}yPRGV$o>kUlJ zFX6}D@iWR2OENlPc+hDSE?G(bY6Z2(KWSmFFG5*6fQyv@{`^zl#PvrP@lSr_C3y6) zhf!T$#oAUI51(xy?+vlJ@eCS`Hm<$y7;d@o4q@OVs3e*2aO%uytX*2iiRIH+tJF}K znnt@DN4`9dTW-7t#d1y({D+nfi_EFF>KG0a;)vw?YnU6g(T@R-K6MhQ{0tTkAH{9g z--!Dke-hOu+1FNa;(>2qUqfPfrt zt+pi~KZ0Dcxx4`8+O4)cHz$b+2nJ!;CS8IHWKT8i&V?abk_w#L1Pb|rFj*7KSFbm* zx_SwNMjO3m7uEV2a?L6d-A&y2!WW`^^k#hi{zq_VdJY#>&kL(_Y|uwMNe7AsA&|%v zQB1^9Sw11aXM%}^i4Q%*l4&%$1Un}{6P`dqy--Vy$oDX4hztM-3<_f=W#~p z9QBofHItUsAAH^t*Il2_+QsUb<0y=p$j&U_y6cbO_=yXcIQ95 z5Hgr8t$zsGCh(ttV(uM4)-&}OUyZgmR{#@%QY;Ffu3;i5hasB14l<<@l9da{t{%tj zH(rBluf7)h_D`WavrnFb?L?_?nP4KQM#Z#gDP&oFSQSZ7HTPVnsoe~^9W)ztDdZsl zy54MI@#qaG9=sZZt^%O_9Y@bwc`EP> zI%Kk8ebdm`KXEA>q8=s7LVT3O$R@i&;#uXTm72Z{;()ON9jlJ2YgM|ojBnvsXWS+< zLT5NiVv_FiaU*6X9oC$X;~uhZ%@fGIjcpszb1r22h8+OVYKx5@+_MRm1-8K6l=YPc znRS^Bv321DEJasVhQuJvyv<#0GZ%t-i!8m zKA+eBvKe&yeQa!2P^~v5!AZSHR(T76<~#_vPFPS!0&-)a9_1C;Eb^@O&13~+d}(b% z*e#@mVxR2KbaZwzMr+`27}#1OZ4;c_ZSa=c8?X` z(uy+^RAPaJUEwysB^H#=AP}|-{eXUuYW9D#;%?H|6##84TE7}!@9rixf?(-xt-g1* z`0aJwqoU^Uq$>ozua&c|jjCq}+rQq#G3s^CO3|JVW)$fZ2^Jf$pf7jzQrg5WEWN{` zU-!3+YFq*~5T%j#62u#Vgmj=sqW5tB)>d)qrwW6F*qTY4dHQiY^o_qm*<%ngC3{Zf z7r`LOgz45G=q8a5sRV5r?H}eBKHGP1{(Z;9WK>lYIged@8 z><@mzd+=S`mVKh|sUvd2iq<#n7&)SpT&IJSmw}hfi(K<^MGO)#VI52fhH=G%uaN9kJeS~&pKZesMPGT;Xz>ojfYw^^|CeB@~3;RoJYZ&5D&8j32X;vqbBh)uH&~0`xJ-tr~TQ@3Ibh|CIs&y>R&cjO$k;$j9eDORk zpFNLsY=k>s@(QHN)5sNz*sQdrE5h;bd`)cIWUe5-Nh+2=kFPGpt^;Yr`U7Ey&g4t* z%2Svwl!T#%dbL^IMD65*NI~^1WrSrel%TnY4J{zx{$cXQ2dEe^Lv#1dZ+|E5df6*v zYsvT0p590t&YjuJdWx|*bxCPF!^R#ZBCo~9(fo;aB~iI1Iz)|5Ey8s`1uFYZ(YBL# zcC(3ohZD1l>|Rkjd~$e1_g>J}(u!UiLbHxCS)eUpgj~^1Kqv%cLjOMa$=c$9NVk&M zKh59we&Ej!^y_Wx=)(-s{^xF7%PLF9W{v7~H!&Dh38Ckjq{N)(QC|l5EQLJI@8dumx+hJ1#xV2P`%XIEJtz8JqUUPTH0-0ebHrz}-}CcvOwQ4H zw|iLRkuzomGzLGsH)S~Obpe1n4A2^zXTg(#D0PTV65Eg22LR}Dxr~o}>|^3DVj%ZnrUfKldJI_q%Jrj+FrDXX9te*sNdgw~(@OE)1d^3vTga0zunj zb9P|c7};pYryzg;8X-1hBo1K#xS@A#qA%7ml>*?9@Qb`TU*u|%-0lYpEV4)I@Z9wg zuy5ITw6)J@(=qqb6LZF8w0lT?X)oL4$!V?-1l-fhOa+)7Jv8E`>}C}0BBA2OMx2;{u2a4nYP4c ztBWodpotUNF`y9XVB$=Z&xB>;L(-W{_lq)F1{d+?NiLwau)R-^XS0cW1!pTbK#zCh z>|){i%y8k355YNh9h#^cb6Y-n0An5sBD4Pn`;c?5c9DQr&5zZKb{$GLmVtIt5dgGF z-un%8EwIkafy#cJ6Bn=+=wh95U1wI8=8uG_(3e^I65P%$X zOnMcSttK|)u*m6m`d(dTXqhu(pUAZpy`ugc|F!uY6K&Et+TNkV`Zl^=!WmJ$ruvDt z+X&Z|jM9wNK7+DDQ$CEO(^sY5lw8ft2lwNrUVk@kIC>b#sWNiK0Q0!LvOMKV;j>OXYBqm|k9Jb0HFh9yXj23{m2SZF>dk2bhOA=exqE>dy zj?Cf5^)%H$o!y<6bM(NQ6RCV#k={P@l@JI$EAwFN*w8y&pk^^Gm$ z+7RwNcC$U?2`9w9cf0SnYg_rleekz`{zv%cUw>4)aCI1i8KBnbV!heMdaH*T3z>)X zc~x$c@RTHVBCiFn0PP$a8wr^W3*$9(!u_T{(XmI_F0D=C%XA+sXp2E;*Q#u1?vDj@ zciwpy-t~*`5+JlNYC86zYY*>rr?_?z{qe7U^(*+#fAl^)b^Loi36JP0$|Apj$okq& zv9MnpsCrZ4}G+SKeAd-1|Wq(&XwvVRJPia8vfoyOvH0SD%%Fg067ajJx5 zM#)o%mmzM3vanCGfOZ$F8y$2rCA{iAzk%}nLG@Lo)9m;e_KAZ6^ zFJJUQj7Cu!08dyx_!gBdToI)jek$Mpj-KkP3L8(b;6p2wg6>bgNOSXqCN94XYhiC6 zm4hY@qvP34NZS1tF@;SyBNQrei{;0@P{ktHE|AjK*3Xmj_kj6Wt}Ag-jok#KbS4ty zW1UP;ORl5yr+x#YPSpGSgsitDb%-NAq-;q@4Dhob{R^x-e4liXW|mz6&p?{Y&+MLT z2p>qqCAJF5H3th(1J z^H?CG-C3=jU~`5dYegnHofeIr5W7_L%209xjPoFfkjE$jkEq@8Qq>bz>+#{G$0E98_1$4#{9 z{V&`jeCudObvofzCKMiyoXFK}+}`N4adKkP4Xy2dCHmbSEB?TDzW(Kqryw`y#*}fI zMXTsGBW6sJ!d%6u2X%%0O5NbxU4fOMgsl4*+h2_hXzcp1p;NbChnr;izE5FcZbp)F zWKU&qDG^Tz$b*h2L1LmXDMAdmmjZ}J99t5Q)p#^>1m(jwBb_h!RnQW25d5=Qm?j|P z2HqwaSJqdxj#{uK#=Cv~`-yBGT~sC!YEvLKLG8DRa8o0CCmSg7GbmV zw7(UaepXp(!c-WZ2(lzYRuI zg(yydh(}PYbz0IAyww@t;2p1mS7sHb`LRmV-)GiX5ejHsj)8ua z>xZhv92TKKs0U85Yjch>cx@$<4Gc|Qt6@P94uoz$%Xid`vbMfuI&0?12WvSG7g_of z{0bvLcimO~0e;X}D%2-r2PfTZoIO0rMjj)btv%}wdRyRbqErvoi0^Dz0qicI(2Tfr zPE^K*YTU`N`T-QDBA7;rt?;r2GcPMaN~h(A4IJ7IBx)E0j*1%SWN&6=G64|E0KIzR z5qQZ2JOV&-Splvl$kdtikjk=RDWjFnBA5wS=t~7O+fB0)mn_2sf_2*s0YMW0P4IKQ z)+%+ z3D@q+;cc&dAvUXP=++y!c)5yuPp#v+tFOWfo_{;Oecv~*fB!+8zi<%`J@#E;FXOWv zK6)6}9zKTU%jbo8_w?Ck@YJbOXbuzDsP$2rTf)rz6s8GgD-C@+t@d`+1GWha6e~oib97pEJttcHiDv1OyO`|A- zCR<)KyU1rf0oawN3c|omHZ}r+YxNddtnx}^WS$9(?RN`LOBfRF}3zXZP$WNUOv zE?1EGl)(0Ih-Ry$06YUWB`aXB+d{9;7E)cr8|!GUpT!+Na2F2TbThts|6`cRPGPlH z69#3evW}%SNkO1+p^SWdgzCj7fka-wEo@!wWs=Ag=TK{n&>j*F%>+vVg=`-240YcK z88YQ1Q|Jhz1;m)=3nl<$B#4v|3WdBF=^SsX)do9;$6_pANeLtBVAw@J=^+;GFcCo&Yr`{xhL?>x4s3M>+#)heg)0-HB<&k z^orBS@7iq)yB)D3TFnOP^&0Bc3M!2T_8q($Ge>Sv=0SFqurkSb3z8TT zIqxF|wN<-KCRhW)*aP~fI{BhUEhx@{mQ2z?WRPS^EVx?tv<3R|`7E$5He>~a0WkY= zRwbYt>oAt1Z<&Z#aOAQZ#M|N7+pMA&guxDSD_jnz*pC zj`Qc(7H=pF^to&r3v;s)Ft0Y7*xanhb0vp;+vVf!wlROj#IcX`7p3C_fHi-iyBW@LRSzPJ*Zw zxL}GjrMOvGJK5Gvi$-Duz0i*!OSFuMjCV<8NfzC}jwe8yf#7Tb$xK0}lkiuv8he={ z+QXp~;*nXQ-E3&b3(C7uT>Kf~Z|V~e&9;$@%cRkb#gX)q*gAV0FTe9vWJ}XnuMea} z9T}j>t+KW944!=OTgcB}g;6puaT&I%roGOhP-HSPhb%tfcv<|;=rem(L1gT%1fJi5TvD$*Yi>niB?!)zvEU`7ADI-3aK$TH|T_7dk&^r{I^ zYimLRqvN7SU-^bN;2UN)skQW;k^B1qKqHMS}b zH{eT2<`@BF?cPve)z*sJ<9q@ea}--EPt5pP)eNQSCm4 zqta?)W0=CXPn^Z4KKBi*Upy}{L!s_q(UTAbDba-(6UHlu$`*a)y1z8Wq;V9TXB$^H zvuGwkfdrJ3yspu+4go?d~x+K6ED|bY*ey0Q-+vSxDywHTZ0A(#$Ktkw7 z9$RK#1AtaG+j9%u4ve~Y8GZ4AIiHTGGQ732tbiin?t)ERnsR4ug00-&PXIbCe z^%k&*25XpGC18qH{h|PBTQFv#c)pzzmSy4f?79theY^7;ut4iQtUj}HTf&Q$S=+a5 z)K`saP+2cNAUaq>Dnm^8Gjf)1+xVN+$N&T4ur0L}Z9(_SbgGlf(XKMGB_5MPdlu98 z218u4ZyG=GnwQ{?o32B8W=aYT^B%j>kaazy#2X}QvIIrEKm8;AkKJ;(&juq?XrS>h zAc^6iD;*&j>t&&Rzfb=sf!SlvM|OJNv6l7z<7$e98)0f<2O`y zx%Rn&&H}0B{%&<03m6orW-_6S`A{4ThIsos-j09zp7((7PC=SB&KdUaqVIM4&Q?9z zsMqiZfB1*^;0Hg56bmv;+}YKi{N38w*7kPo9am2?ChZnrGGA%O!sE0++(WxwN58U$ ztLE}JIx~aCVi`+wc`VKpF*`qv@@yGt5_2WfLSWZxw=^d(7@@M&K%+H6%PZj3WPn~c zsD<|`?8fFVz8`yb4@-IMA<=hh?T=@BJ@-6b`_iRlGq=W7f>bbO0uYsMRV*1N-%UXp=5HSIGW9d5{I#|W0@jdM$Wm$)^y@?1PEKP>5fC+?KUe=<9g=0_B{k)Gvh-TF!y*_>2wq| z_8!L&IC2)eZPvcAMFVDJJ0Ci_uzzUnC^Nl=T#U!aJ0(m0V1RTwB{5{tAJ$(r`F1U; zWQRPGsM%Paz97oqv|tNH=yiL@X4z?*U8;#OF&$=1Cs~)_nKS7Yi2I!k#>j%e{ts}( z_C08-!P+Kf_KhEB?L=E}Y2!pPxAuM6nlxWN1v^(kPyf_U3j?!#HZPOLm%sD{{MK*&OQeTA0YJ~B z6PWRmC}xrLUp^;4C zjqm;y-1yR0NPbBCO4&4;v+=o#+zsT&@X3)y^G)P{VCtRkqbeXGKqp$9Cho93#<9De za8#3ju=SDs?d-*-efL{E>m%%VV&D1tmqOF%4!~B>>cLLse1Lyb^U^hoCr4r18x20Nzj5O%fA>q6E094ok64=EB~ROXv5Fv`l4PnRQAA0S5snTm zD?B;^lIpgaxV(G``(E%y6lUk;I;;?20K^7cWG>A@Qm5X^lySAz;ozzoIc6#O%Ef|| zcX;m(V@d$X3!_G|4rq&>Ob!F4S#PR2402oX&1ULI`sVaODaTh$A?F&SuKXi6hSf0;y;gQUh)O#J$I=X<@mgLn?sGmavR9 z$wW)zx~>e+8?`#>tuAWy4(@vC%kZ*Syju3KGT525Nac4QXaE2p07*naR8}tvf0Gyx zXI_{JRK97@F(yX;+07>2|B=t)`o&qi;FfFf)h~Y$OG^jQ=*7_UiUJ;MwknvO*@vsH zx(1Iv_9zY9u zk?{yJN#ojsOGx!vxZ|3u(5ct)mHWPhWHOJ+Rvp=L9+xUBh!0b!w;DKd=!k&RzWcSW z;M^16!~D%Zi0snUhN2)g@1WD}DUgN1)Yu5QLJ8eg3+?4I z=&ql~-LJYEhi|?SAGqg>n97x~)gB@_>MEE{^jAW3SRs?ZXzMZ>t7nld%t>2vUe8O% zFiH^E%@*Y;VdGuAt(+Y=nkXJt@BY+nMs1?dwL zW>qp?bO&rxofzALEQW0DGwfo0eI3mUD=5diSjuwzX{=_- zxZ#%D@X5dVFfN>U2H8Xgsaz4c{fCe)&!SHNPMXPv0lW;IgcypYB0L6Nh6A*_9mG-z zslFYs0EfXG!@^D7rE}dD8-@VzX1$5jh{kjhIWK`)K5o^^gczaj;dknE(8C$}R|FyG6`EyaePm!W{%VtYboF%-_Jq(U+u-aTlca zjr-X!%gFI|pIeK;LR(ZWSf@IWm*H`_e@!&NeQRX9_EPcf*ibv@Ahm&P3?N9Js_HOz z-$r=ijLOWD1+=(YkiYK)fOhpo)Xv>gfM^%ZxKmL1N&?QI+l&TSKlKDE&wST(KT*I& zob7X^)u$$o_{M#3919=_5EM34+Q-y0J<$Rz!XPs`Z8~iQs>d{{4XmziV0mo=E9-T9 z@0n-Nk0tPqcfAK!Uw^YOyU$Edi<8_TIE#QaDK_zhjV+hW3aFZUoUF)X%x`yk0&YvE z2wqDGIEx?=n~Y>ofyH?p%7CE)5R1h;rbl*^B+&?#iBL|mIF0v?+Oj`pq8ZDeTzk;=`EzFds zP%h?Wj2SO2;5%{Z`#sbeO{{L!aN@*iWd<6KkoVHU08OxAqp3h|b`Kx``tLvaLBxA4 zWD0qB9t&5p__crYzaT9|HREm6@VnmG@CyZe)acdthQB>r#J z$fQLWD=1eP_!!xwq$8|M;51i)SHtp18t@Hm9DO6T3;On3HYm^eS&r(RGQ%JEG z%(SMajl}>ZZE)&of;`1mB{L+GXrc=PhDewFnMrCE;%WiKKx_%xYm_HaAkiD3*6N^I ztE1LzVP$05jm-`G?(h5#9)0*B0kZI#l5jIVfo(BP z`6R(Tv9l~l(Lg_C@hY&|SMz>`#JmH`FfoSxnPX9AG-W~&aEuf*ld+5iVl1E}Xq8MS za>; z1l1JEMGQv?bh-oN@_9&J6EQR;c^SjTGvC82pML{}NTAWrAfHJK`xD1oT|R^R{`+T8 zShxnMLKy=uhoqN9&PySi$)QQVXEcx^6i!*ST9XbOnG9`S0-6&@dI?O=mc<@tL0omK zg4N|^(Qh*g^D?e_t0s)h)GK6f%b<%_zu-DN@AfILa+g4UL>k0m%HG3I5~-$g=g!J%`@kk# z=!n}O3AW7=cjzzlaV?v5Age+`TyC#-2x1+3i7-XGWYb1%l}Ue3 z(#BE!>jFylropYQGo1;HkMhLhkK>nq>7NSlL4b$;+MCS!C$iUe)H6l2?3zMb_7{Kt z=W*}7-^L>kKcbBO))%rM!!b2v)`G^3ix9|6z3r+W8 z(_P8h+RL$5y6$({4^aT8d#wGAF`J!z_z8Eg$#gf1ZW+jIn_LYrhvlRLnowI%zgL^d znporIk@yG`Smd;$h>64c5;jQ8TN`$J(lR8C15xQq-yp_d6R?^L4-}L?1=g-J3(;=} zY}-~Rl4xEa1N8j@fM&doIVWLwwj@5*_a!Krwyr5qqwN)=Pn^yKEP3oWGU%W;WL~9> zeyf9Sqm632hi0~jdrzLn$N%OFSUq=E8K7xj(q`s0g@u`b3R8S!z!SdSlZR3rZu4Q< zD%$FG&Op$P+pZFw8_TY&cBuZRddJnxx`%`1VOgOqyRW+!+~l~GFQJtgDu%Z!I?(a* zE)1D~Ely!kvV3OPGOc{&y?kb82Q3ezt4ZEwph9XRQD1K8t;)L9X91e#Sgs0Cuagdv)@l(j*yN4G6xAliwZ#2a1dgeJg1 zX>&e6dlbjQO)o;KG%GC9x_6Ytn|T21a|fl$5jp2C1f4`HZ+4R7?%S08VvA&5v1{Ln zBZ>E-i~b>wac$d)*O#&T7P7BGgwfK*h7LXLoy85h<=*3IBejwt{`S|GxmB z!}4hIWbGU$XS@OU%3pl|-~RXqP)x>A&anF(yXmoeDT@-)X!QoTyveSbJ*?N8SgF); zX>$vg>rJdTI;eC8=n0;M-JsIaHHidMT3iqm>{xm3>ZWM75?_}2ISEUaqIq1OR8DlA z7G5w{Ha$Cy*S+o^;We*$E$+JOE?-#rc19>Ctn1PDNlYP3rMijFeCE^m*vCGO6Hh=DiLMmrFP>J&mLDQ`k3M z!rWY00MH~DOs2EKmdTD2EVSyhv;$D+|HUQY1&lXo8@VNM+MP zG&CZM4{gNW5Uoa2a8J!{i)bq}x?NP8EmT@vR60GZx4WqK2IwMz)&TgKUwAh@_1Vwj z)Ty(YzgJFxz!nf2+{B`6XAvRWV1C);Ri)ct&^g7oqa}W&{CB|=nj%!+hYs>CdR*Yc zX>8i$p?$kJC^!l1eCt;SYs0ruRS=r%20oh+kU@^ykY~y(wZ4fVwbFt@UGbE4YHJ7a z7~c=HHe@t$WY?zOX;C}6=v=e2tmYpX!y(BLdFFn(V^la`NXbYbB%z&)cTnU zl4B7n2_1j@?Qh4w`d9zbko3{^ABpXL;_2gf@2~zUHZNVobUKM?FM(MviBdX=qL)T4 zl|(6*MLwIA_&EJEf}n>Z?IlCIoyEhn+ey4dOizo2jPzamB;!e-ia756$)Cd=uYEnb zlpiLp?MJrFyoObYBbA-lY#^)5_Y+j1vty#KKe&Vwu$dUU@xPdO#6Fv%13FYM*z?fy{URY>Btq|W&%y(P-=3*3J_%-(zzfDs4Vo5vA=VY zUFF%h;g9>w8iLU@xUccXyp-TN_BR4KRv!I2rjtEn^Lb%QWzvoSCI*=W=t1y;v@4Qr zt!$30*d;K5AdhwfZ2xxfB|nN(aaO<>3brswA;T)ApluD*SRtU(69z&1Ng5LX3I+cB zDrt^K>HhT{MJlMHmd7^#*s?l?O&>pyWS-U^-?oaM;C>PWvcV}M zdj{L9R5!8m%p*w0fn2_XRN8}=WqawY$g)H#BOqvLePYsNRM-TuvK8B~H<0#g1Vj`3 z+-Y$ywNR_q1*}!AHn35xqt;?u?>>I$&Hn?A9lII5fmQdL02stgmh0n_vC{YRi|g z?}pn^I&w3!XGp{c5+EVKfJ}dufrCy94LC2A62qp&qL^++D)nfrvT}^?HbW-TL;_tp zGwm)0qY>Keju^cHLT93rd~gCF8KB!SjDjsPsP+XY8y^jkE|r9-xqbE=I_szL@)zBO z8}GUkfARTmWBG_>J=2q^YBVV0np_#DfAN_ zHX1Qus2gys*&H%-!lVMRFMuGjCDWLvJZEu_u+X%dTCqy`EJih3koS;`C(w`4NN=N% zX3LNyTHQ8s=`0(6pfAorQh+VFG%I1_NXLeVk%2lk!sgZ%`pqWN>uXp_4v_wUc$!OCZ2x$VQjK>c!n*^v*^=#%w*x^Q^=P}hz;XN=9F1A9gCxfA$qi1`aLAt zT_ou!j>vp75XPHfUuIvPwL`FFvkSiL!LWyY`7Ca|b^$NA^(IVt9{%>je~haSB?C_KS#*p`>N`H_5Gg28+xS?<8UOwY zWmTI)@L^Vyy0(=o8OIwUR(AW~lif|jh{z6UYhzbApp%Fl>FU94Dry`1b5uJ-&anE& z+{5bJ8}5ARuIk4g5DlRD0nI&MAvkciAlYu;kG-X_b=FTlgv!|`gki&G90_EieapZM z<*{`BFl`0<+(*I!tq!3SNMIoQg6)O`0G(E_@}NT|{RV2)1}?8|;nL+bTw346!^cnJ z*qwLb?jQPLOz&I7;^LCXNC5;gppZx*lSxZJAxrihf}a8DO0d4MC7?r&hlyDNk;&}L zB&1Co63E9w6jtK)`fMYWL@}Sk%+!=Px!gI5lm=#?A(q!Gld$3f9*e?}uqn!?y2IZzTFNF;HrYD2+XCtuVK_E3c(3 zk=6g4XkyZ)8p9tzU(}vI?g8!C2t42WUQy7D8}NA+TX(`K;nua2uB%B=3!pRl!5pl< zjmmNLdh|yavHkD#v+eTG*s!55{ZhwZI0ir>vdb|91w`&75TmQX%3>2U)NyGgMd(Mz zWgvn^*6L*yNN5A-+W5};qb3*^Poh!Tz?VPyA(Rq*kpr}i`L6{f2y1OpS=uavrh=bo zvoet#`0Fx8!-7oNB`lu(uGkEeaki6(1wgktebn1+)M`!Cn@y}<-oVt-A-v~b{3a3! zGEEycTStdbw*3C@{U<31%qBerzS;L{d`c-lG7Qktt-=CzwB;5>vI3C({bGZ;w!qoE zZ5B~+V{jfVBZWMp>U_#{+I`v)Lm3)49=}DR0g@9KkjmxZ70SX=QCZ(azugfq4%vPv z7s_+Z^g&I@g3Ca12pSZTv%B}Z{q@b%^F5Y4=Zb{oK&=G z6=c(%=urkn=k^~&K3_z0b5mz(*h6J&1C{EA6v<`MWT_(PB7;t+DRyJ0wuw}Hgu7n; zT1+1~ij9peG+TW%n{}Lh@=;-nyXB5MQ7UBd-~;!eA5S5j$xC5*p^!x(lam&UERv+& zCOZ?^W@vwBYiG$(r*3hUt(tyvR=za}izE8{nq9?!w!C`kx?~@^qj2 z{UlUg0LMT$zsn^>MjLr0_LyPcF%rS*1(nrC?i$JEC(_JybnRQvl}*q%MKCsAuL4nu zHG`O|wRH7CZL-Dx-V7wLC&%kmKRM>hV_yIV;XEt%TnTJrOd&QzbB_=(It-yO(mnK# zD@;S9jK;CdT)A^FF$S#)&&tL!WVGCZ9&W>oDjPb``W!; zXb$%nm=B+?>y`Jv@7{ay-uM2xFrnL`mYuF|0TmWx$G?REnqWl$Z+g?4aQgHqJpT9- zA-hFmxJG*#wo?oA9mfLAF+@MNi9+22+vhS+_dzk3y=N3C5Vif>B&5s!Y@g3w$FkG~ z3AlhwlykViogp>BK ziVl@Yf$!j$l94^@Mk6NqB#!CoNN*$ajGa2!n~HuDE^ZjN7lO}BG~L*^ZksIa?iFNv z7|(58d>Wfi--o;u7L%3ALpqT{%47VAOwgwI*9Sl|C#A*9G1|eBR5zUxMg(5Ag#lV( z!|e`w%?>t6e38oGo5xS#Z|?abwpLa^=1ocA^IG)Bh0U1pJYOn=66vOCwx2kc{U^z5 z8?RBO%CH)=smSdBX!RSEL7(T@za4F4*p;n4q85UcW8(nOuFTY@2v(C_j=Ge>EYCgw z+7zi+;DTy2ZA&fxIgHb4!i=OKoGEkxzZ&LyyPjR(u)UUeZVrpKeV%CkaGY$`Wou?g zT*H8%K*0rimfbGf(y-?I01#pk#pWF2L+JP{Gj-5O)?ee}fYtOd{CyR%zf4CD3*ORD zWt16nyB*@oCRYX-z=y?aSlt#D5i0u`XIB7p8&!6u84fX@^YD*f_5$3^t~2{)g#nr* zAV?tghiwwTAQ67FHTPv}K#dkjth}DC8hmtQZM@ba7Z&Y-OKok6IaGW6S(500`?0 zxH8kqZ)@8t_*gqkF&=UK^~dnu_x?|~?Y7(f0(jr{2?2stV3WQ2t6%#ne*gFXBc3^N zQts_{0<{D*<~cM*8x#_SWVz9gK|!FBnppj1JI^rpXUER-St!n!8Zj^F*a*qiIu7R3 zxMpq+2WQGyoGW5>-xP{dMIi=Eco__O%scndW{2BW7o83Z%*g;<#4F$Z8<<*Lk~x_e z=(Ya+_rGMHlPgTJBd_%0%gYzkZZdHJKjIqAWx2kFjYl}~4jVHadw;ihTI|el^w<4s zk{|4g%su+UdVHXx<+*$SoPhwEoTTm#-H)1kRGd=OxDPxBeMej-8U32O)Tv4A2BXtA6h^>-hXfKY-;2??s87TG)+< z;m$-%n4mL^KbuD+X+Vm9rx~NmU_^#oTGu4kU{PYPjYhkP4q0dWJyeL%Xm?O)_p#pT zp~~W^VGOzAG+y?a*WeTPd`1Z?OdW(W?gqtd!JLF+U;zME_o1>AyWKo&afk&nYcANv z%Tz8}`Da$5@n5ufE1cs9)|z>rCMM*@6oLX03(B=?C9sSA*kHt-wJ{jg^zQwQz3Fr^ z_t&dq{{%ij(9zA>)G{w7nPF{v-j6bqxkcKBjH^<!542lIn z`_kUxWkWL6i6v}Hk454P69N*U*m!hd*}u(_3u^*LdyK{8?oGP|UUc|)>*uNp(mTts zSD;g(BXD(s)dYJRrCIe+0JJ}+#$eZBItf?51U^WP4h>M+5VLEbH^k64W=PIx#~Z}s zUX7kK(SRQNHiHlCZviRTx_XQW;HvM* zb7#+1fTFwLt&*_9GEg-B9&)Pj1t?{z;-wN^Sfa=RsEJ~NoXMU?a7>q=aRY$v_d1ef zWnkdzA9^3WUI%k?)6!~idTthlQVD4R5vD}oGjJ!#XI4;m+USt6w$l;z*JiVWgN z{QN-)tog|_-@0rZ2VaS74%pmkAzitE+Yc?^`NwX= z$L{$XZ1oZtAcNijxb}HBAT?@We(|UTNa~xHQQz3YS3dW7)GBpM9lI4%i&vvGHH}<4 z3Bvg}CeA8OLPDLAOJ~3K~xA7GzO2C(qawfc!pm;E7T4W+ z13vrRWz6p@q1TRM*l%IIRYM|E5Jqjb5znXkSbOFX44MsOa%JQSWq64J$}?qjki}Mq z?<|1R zy4JOy946tB(I%C|D8Y6!T^v4o6ibWyP>jcs=~S?O`V98ZP2=I77g{aJxM(qhq6>XQ+K&MetRhXjd=4r>VrngJoQKv!y8h9kl2eO;3kE?pCI!#J4Y~v`f^sE{0sVc_;?n9GRyHblW@Q~Oc=>B^ z;Ogse_4UWFZ{I$@6_PNuCh3T#q~L^LU_Lv+%q-d=b25R@91CR-0n(JOKKPl14F<4C zrdH~)T*kvxsf4L=Nf`VYxY(@LaOT1#)asP=8q{X>H9?AG`@i<+AzX9hptiRfQipc2 zR;l3P%9^lQQ*TdCm2q%!4)e3K0<@&PPN4LqwGEuVcv%vK^Rv^)dPzy75y;J83IkTH zRtH=4CQh9>kM;EpnM($mr>D!v=du#q*dS|Zqk&PUh5J7BVWfsVVgE|!N{D+Ne&JVt z6Z@8yWWFZ>2z<-N)U|F~3y%FVevNURaDK)w{oU5F{a#PEC7s(r&eB=N>{|zJ>)+H~ zhte&&pA-PS-4BY6jecD;AiVR24hL+mVDs*o|;CA zpy*}?@lg_k%`0;ar;a~?PNOS< z>;#!6rlxRkehHiFm$ACOf>CdPPJ^95Rz`Ba)XK?imHwxSIBab|Y4w5LAXN2*&R4#~) zuEu>rmo_nk?8TC`KSL3 zUN&c78?+@9cxC7onmH2JsvF$2A!NvsI-&R#T|Yk)g1ZE<17zur!E$hcd$dU7{gXD>tC?H)T_ zBdoL4KB8Xv(igvofA{ZxOF979b?6?u%^op!r?o$$V7t5SdOp_HR&nm!g>3+4H;Lqe zpWQgL?5a=gCNP^qZA}B*kYmP$fnEQ@syE+n9wVEbG3b0cc^@YP?E*w)ZzR%aUVI8$Pu-7P zDlR!E+P5jT*k-3 zTUZ~Zao>|?@cF;{8XB7$8bjv(qum@=k{`Bph{sL5+8MX5zrb^&{a}j_RL{BkSR{wf z45ogi+S~yEfn7y|LI=&8*#dtjCM|o`fN}l!d04)QT$AT8Bpv1)n{2oKh4r!Y{e+7w zqO#eN0oj2{B~am7Q$WQEKD`T z1%61*`iNm$#Ro+DiD_;zwV$lFX{{-pf4z^@6+R)3>HcWjjfZpT0nm0^4$Kg22~gXD zBAmh=T`9)bb9!h5vUYnBvB+^Bw{2yLEiAC0DAmk_rb}n9W*e18T{=3J(@DJXuG{gt zyKctJ;sQ$3Wq5@tBr;h6KC^(Gv15IYW=@0^d|*Hl$`Gyq=#G(jER5G~WD11lKJ23# zOJe^`FNRl~QYJxDWXyRoE5a1++2;t$GI=*nH!Tr&Q4repBv#0tvnJ*^o#yW9=Tfiu z;?NX9hOX_%mGC_$elc-q<80ypWw*zqsjr``92>7swhh8pXWL^^K@NXRiZODb@KZnc z0BCE!J(us-wK=2L9lOqqz!+ykkwNvLFMk?e{L}Yg%FCeOB?JJS$)u3WdeX(yGVHe* z8>lsLZgmUiHa2l_tBMPi1}-)GX!dolFs4iZw4_@SDId&d?PqJ_x$|OWwgm_Bn5dmQ z$>z2|XM@ZlrKW%GXgTjz{%rXHSt`YHVBpZ*to?sK1& z4uV3=XTG=d?8;_$Y~$X8E5ltNG;Ex-WwFWJk1J{!Nrbks|6qiv~{@xa513XL}G3+vdnO`vL+6zdlRc zJCYshT31~^ULNY_LHxu&&Mo*FH$ErkVZZjr=)_jsJ+H?F0QJChXEs~$4eZtskMZw> z#JK2ZvisW?{_+F3_}#xpF_9Do=uDE#v~i^3F{Gt{a3rK*j7{@>%YI^fFrAkCseqqZ zl-Tc}-6IQh2TfssZll`jVyn}`DjA>|R~-O{uDTXTd3fm2$Ax5!c7@E10pAKnia>2s z{H9ohp~l}VP}y`TBffz-Dc{GkKw1lAH7v^NLkA$}sDJ3bhG>k&$6JL1Q~oJ_o+D%c z2X9~Yhy$W`pG#MfB@7L^nz?IA*^QlemcR6DF;vJ9Hkcf9T@7}sLL4^`{X^m+ z%1stvTlpEpT{P~%OIY&5V6m$WE4fVibg`HaA7wHb@oh++7s!e52GQxTHo5JTWjhfB zKBf<9mmKama#ln9BJmhE_G=lLEqSQP&p2-Nc3VGqxjvh;AA{033)ca4iVKjpu^`_M zFss6@As_WMO6*se>Foe$9iA*llN9vdgoD}+zZvULn+jt`WhlaC z`_OHAb({el934KngAPJ;{lPXW+<47z0A zCNPi;nmsg|HDT(Tzxl<;&mT5HM6J|U#yA5S6{a6;du5FoKTzR*GS+w+!^&ol^W~Hy za(1vl^|gH;#^o4+#CPTum|%1keo&-;MR#*$b}C+lYO<$SyK;oTkvv#@}I^x(RI_-{5nqH?G+F3uK&{W+CMYcM=RHb^oQ8x3q#8z{~#;BD`Cr!ZGg`KySsK~dW_%Cy#S*0{DlX1k;~8l4_a zt=I7Fhfd?Er=P**h2yAfZQ5`TG-rJML8bB-+kh5uv+P1;jSOV)bt{z$yDs6 z&=?HSYBiOulkXSA zzEf=r00vHDb3Vhjnc83u`x z2>}fe2+g-n05lo<1k50@_K_r3$Y{sve71q-^Lwed9!Cc+9Y?=AlFHUhGLBM~;KU@- z@_83*EiXEw)xfaXM88)@F+N0*GJmUr*~1IiKQn`Km$$Iei6JvPi{jjV%p5u*YkuwG z3Wn)~Fif*$(B(@T0@4=!Ltyl%3nYe!u@b!xiraL31O5} z-aBD|!ASOAztd$eL;*sx;DAXdb~9+!>ZsHz!qRv6wig*S5jgmwbEO5nXj{Xg6ST+_ zM>3Mw^OI*o)yaC%pxuy~1ja@&T^6Lk!9g`zsi%nzQ}&32=STCIlFb$)MRqu$0wA6U8KD6YKj20ZhQI|RTi+K$BuWRlKgP{@<{ zS(8l!>9K18nV(zjj_h@Q(YYm{O%jccDV1`eFU-`mKL_%9xm?2B>@3PG93m4Z!OUCR zIC1(sT5aJgm17580uo19oS(sUM~`5Bt}1$!&&`4sf~L=1TvJBUaRRe56&&2RfPDl& zX9)UApf~8tbDloGhEBJK#ko0DOSuRDn%8T0I@oS>aPrJKoIig7-EL37nzWB+XJ=#| zZ*AA5=wr~Vz zfAe2lJE)yS6ycR!%q_5tRD4AJBDINPJ_`dOVo8PfH!WaI0Cc2ScaIzAsqE!Fp8Ap% z(c!hH*uB=ZDdr2<(Qy&X*Mo$A%v6pX>i~|TN2JJ9tMBd0A7fwI%IhYJ1OL@Kv-{Nm z!un@;hVVCEqjN1aypx3Fq9U?EWqG?ZA(!`3$;cIYwH`x&o1Fzzy0q}Dpy^A z&wDy5#B>rLc>kZ_Q-ASMRPsehg!4;5AiCZq0WN?IolwdvVM}q|Zs5l=a4Kvh^da;a zgm0Jrx$`dg8)cIC>w~_?QJtQY>;qaA$#h=YrSmMgB0_$IQ%(_~~PUv~xN12MH`4J|y;*bVwPnO&n#k?ll%#&dx1J;;~#Ti9d4o{8^cC zvf}r9Oemx=WGP!hnf5d3ESj|ra;@`t^K0(J>gE>u$r*;6F^~jA0r!6Uo4EfQU&WDI zZbx-)3BybZscafo>|4ZeJVdRwiG|7x=I0ji!^fY*8G;B?X)G=87vOoT*TK@h{WAY# zW-As8sMj0lcLu_A-E6fmQ<}ljz6BgR`6N2jC4&UIn;S^?F5p!!zY}wZufc`27KW)3 z?*8tBIRC`MC?pzaZ?59%gGW%VmT>CaDXgw-qCj@iVGkG2J}EY0v9buHv*;y~SlD+3 z>g^_m<0SI5t;Zwu+uH&J->z>W#V#({3~qV$^RaaJN<8}bqo|bTaQ^HmTs-v{jvl!R ziF^?WDdK6NlS-pHw<4_C!f27pNH+%RPU>X(fwCvKPtQM$oB^O6vtJNBi2A%(q|7Dmv%D7@)|z)S?ui5NIFbu z2fZl4hTVe?&fsf4sKK{ce74arF&DNR^^=tb=1{MyHI%(ZMB>=RSxc0=iUN%5shOG0uWC8;n;3t2l-+w4~?6xU2v)1pwWZoYt_@7Lu8Ezl+Dtu3{ry#&;h* zi_d@dF4W2L?OH9J!Hf?TCC5Qm9vChF_yB8xloyYD3q7(JziVJhxSd3tjK1~mqVKOa)1#ho2Biv zG4vDoV4Ydqxh3xFf%$k21x2&%b||;(dNRiel{c#ccH+8bvi&@(BWz3}| zw{ADnsexfAjf@?@K477fp76RoU2AGyQp-glHgUb(MxXjNk-&>@xel+p^O-nwCF8ww z0)S31&yrzxAr=)l0CZ5Krz9fU$xrRg5&cGX-xMIf=1%FWGAByi-Wv?jOJ=ZguzbbeWWW+;MqlIoq-G^Yc5d>)R?O zM=r;H+3T^Fe&FzkxIMYsXLq|k_rMRo`9=KQpZxEb&*xCiq$Jmr%cfCa_fn_hxc6FQ zNv*eVW{m*oEu7h`;na2$7usZN)VUy0PoYF`SsFv>VjF&&EDQHWm_IQP8Q-&l9ba$w z@B4Zo?t6rv(L%gxwTkCI|4#h;&;2}}@r-9l+=6o8*s&+@!4G@@U;5G)vAMM=q&8u3 zjq_h8bnNE!>^Re(fjsrWf9^QGXWbHn+{6{?m@mR}@O%XJr4w3&l|vtuVGB1dRB&`@ z4*M6Ym|vK|?EDN0(wCRBU@vj(kL!970JIk$nELFV_=rjp!w%U(1z4PzCPBau8SWv*rd_8H+Jx-z2HMHe-E@R* zn;liz^}dbns3)C78{HnZTV#OlW4lWR=m8qUS|u|$c;srFJbMA#wTAcw91pQkExzSq z+Tq_uuB8K`xjwZ|0swRXmiA?gi!BAr-9A{|v$ZFvJ6ngg&n-@+`(0O9TxU&_nc?2| z(-5&;At#L%>jg458R8m@@KmquZ!#^C^X+)OSG9Hh`_-{iEFKF)m?vN!lLRS3Am{l9 zw$yB2*ysE`V>wL5GDvbrJwU*%k?u(>HDGuS2}^~jkG7+Wo%-@#@&{zE_J|CkK8i9u zhnRt2v;r`+FCz4QZT%zz;ue8Fx-ru8Sr;8Wf4E|F&4oUX7NRS&dNkgncM_dXjbk|p zFivQfa$)DzP6h-`{ox<~C*1k`7opy$%lkZcp;X3)KllN>?~nfzD(M843Rx`V2!hUH zCYO>9OUxgUC@Y`KiN2$*qn#if(tE^mXimA^=}PzT&TuRpCr86EhRFol!x5IBeg|Ir zj&~t9Q+4FEYR|j=r6DO!AY4NW+n3opW$)zpf?JVpBYDFdKfyFxJ2XfxSKJ53PxA|G zuZQy9&F7Dxb3E4}*o%9$UuEwp09rvclIU~EMAoK-`E5TKWkSl9qnk=rGk69|I0%zR zn$PT47fc@Q3C@BOP7@z;sz>HFQXr5MXs@3^^4!BH&(29zd_r0o5%8g{aj5{zVG>0$ z;DT4+vjBO!ZEUTsB7f*+EZ%g7oP$9pYac>suAsIUW3@{lsSx!*LZ-Vt(2hCz;;cJ` zA9=)ypxAKj+i!s&5#WmBU2~Q2mMhX@Jiu?H9jB{uaRvq#jxba?p%xm+1dS-zl9cdd zYNmit2517^`Vws8vuvL|g>QZ0&oE!9pgL2*(!wHU9RqZZEvA^XmcRmyjFGTINdme@ z&{z-cPE*?0F5UQCl=fYzl_U}flXR`F5`sqM6$Lp z!7*7(TE9M6<3~n*O`7XO0vxM206H)XWDIsO2)&z*8=KRE8{W=#4!s($-pO_j`> zkq^3SOfrlEQ1-MdO@AQwiD|MXx=x~}kEomQt=L)$4LGYda|+%85G|m~G2|Lnu!9;{ zVmP?qoFt4BNer4bTzujIBu4`QU((280R{oA*ZTGZq(X{ zBvMG`v-raO$MD3(1~S7Dj{V?1l=2A-QfVB%=6Yc}-flOgQj1Kutwu}0O9a%CA#;Hs zwL(GebG|x@A3pIQZa8`qzV+?9as9Pdt{r<+4O^5kh8+P{FAQUT3Q8~xlI2ALc-*H>|5u8Pn7_rJz^eT@CL z-GM@NMwyB!=TZbdJN7-tT1I(7hE%rDW~F30nGn`yX>sT_1N8{oaEM_{W}@*BWKJ#S zic)gf>9(X*3ME!HMMmj?0Ob0@2r)#X-jsIh1lQ8)BH*F7v5t*1r}69?S8(9^tMCus zJ%w4aQWQ$a3{vP~AZsL@NC^;dxOE;UANV$sgB}uWS)M8&l^J4jVIK8C2JKN%z%Knk z8=(Fp*n;L+Z{S#w6%<6ePqKP*$x=5GNJPL815M(*W!Vl$&3WoU8hL4{YNalPI0T)3 zPsWK=`;_lAAe+sG7`&`>O$r0y5W{XC$xajF);h|gjsR`u3wgBbEv#H|H9C~RWOGiZ zajw=xsWQWeGAd*#AB=Tt20;J-AOJ~3K~#`0Y8#42K5@++jV)y#`YT0gBFsBHj=p_va_>Td*U=+cEfdOUp$U`9)1wnLIPJGoX7ry zD_Gor0P~AWC|76YdC0Pp5$1KaH*)esk}G43dSv_PV%+cRJ|xSzFhO?|5L(}swrq!Q zd!E=J)LItRmjJqJhbkJ(*dd*R6X>#-+!fg&z1>0)7iqT>Da;^nDohHf>M)sT1zqNl zXpvFqC#nWgxvb!mq1Z7_K01M|N13hZj=z*4zE{oRIhWIH$+!yj1LBmvnvd_p_w>4DTsD!Pf6m&bAI>ik3Bz-av>(m4i{8I(-QoLT^g z#SoNZVp}me$vs9UQ9Aia?*BAWEHKEhVwRme#=>ylZ8gzrchGFqQLELlzEQ^p8Tfl+ zY;nzxvbgOz&&4yJ^BfJZI`ATY&vH*W_Et$4_4{bHw0NgKVCRv63(PX8qzS1YI89c1 zDTZLOX(Rx!YPp1&nF{g@6iL#njdN@3ICE|dy* z<-P)-x9SaCT-(I?i|bPKH#=Lw{^fbBEG{BVT`*1vv+Cw{1E!jdt{5A1HXf8~#6~p6gJ*(fMjQ-BE;hGeY z;x?n2_Ri#u0c5A$tAH{MZo9j&9LkHyOzwf0om@?Ex!ZnX5+{{*l1nWwxYLyl8O+&?j zBEk*^45ktAOrKT@cxj`H&)a9>ny(MhX?H=!p?0r_MqLXC*EcqS(hPq6xBopVv$GN1 zC*#kBoXy}vAN&A5{^37I)d0|<5>X0u^)~{(m|xUI49jNSZLWHYjeJc z+Ez;v`jxpEDMTZ4^hj*K1O~kkx}Cnr&U`kHjoKEfGjjq8XBQg!@+@2taJkr>B~(hY z$Q9CPG&TfW&H}%+%}pFCjqu{Pnoe)lr?_ zk9@j-WG;bDyCuxeZ33V>U9p8rrLwR$_fLIaIty4KfNg&((&Uolyh^J_*YV86jD@2M z)mi+?yM7HThYqV<;A{wPRs}K|+pz;gb9V@-q{(utY;gtbUYk;1#`(#Lh>i(5sCY#; z0T{_z7xzC1wi}yN*-lu%w^}G#cgN% zdy?HUO=<6btc3bSr+oCIAH{!p-+#tP+WV^3(?nUwq8(4J+4~ZAcED%*dE<>Y;OyD6 zQkY>NUAsp+rw`)ropjChwY8}K>!Wrj-gi7H=Y&G=xe4Gt|D5i3 zjX6gdz-h?Icf8dw5cDPBct!c^}n4T5L>x zNdR=?6amopqL5BXcMJO1^o=F%NH8?JE-@G7>{`uf5mcezuw;g$7)A<1!UEbPeT=&7 zh}K2B*TTar0xmA$J3l;)&;7&aQCnXNiUd>Sf+hf(Her%BsRM=iSqPiLU}}v4+VWw> z^cZcQtwUpdfx>kl($oP9Ea}g&6apSA6me{2@nnCr+oD%gDP3BX@twYb?NN&x*jlhP z6#>IbmlSr%bL_qX5_49zn`7Ea1|$Q@C6e>yEy*Q!77tCb2gFs4HN913>=+V7o{Yu*q#xHHK?UvB@d&qEaR6_6 z`SWn|wMS7|m=(VwlP^lFSGo$Z;iF^plZ>wGrYFzMy~cQ1zavbJ!m2n@pf*>!c1=@1 zvX{tWV}73A3QJ-|!kU0vYvzqYgY)`?G$H8HpU zqt!ftlTk2RQnXi9|pukfr=f0(0o%`f46W z7iVyAX$A}PGnikTMZR1@u29Bc(8H+LL%ZF?pvwZq0UFI7TIniY^3L~Q_TUu~ztAo2 z>#8tP_@mgaPi0L{@@L}f;i;V0|BL~keLXj!QaX%tx&x!z*&Cy&Rd;4%PR|ed(eEF1 ztb_Q;o@8z;wj3K&ADa|ad%8}1J7nT~Sbo4^+cd_kfL~#qcDdDH-^e1joPdXYawoSg zF^rkA5J8Io9U+V`NTdWG_PLLJ1gG!)I%ZO70YK*newNPIKvv? zi)7>jy`=7^&5st|+NilTAjGI%A)(HwjgU#7NPf{w$Z&6ldP2wF+hdHoSl&j?#{2X- z;n@2Dm^{?Eetat|5_ScwP7bJ@uZ687%VM7SH~#gn4FrF}PMC!&ufywq?Ke=}cR+BFKJeRCm7;EgvIMt>oZl21`KWwzF=m^hNGQT9 z28r9GE@wK`&hpmaM0q;p#b|sx+}}QFudjXlqL|CMPDGygE7G^A_i#c5K;L~=5bn2L zlm-)Z%UCC8y57`;w6R0E zROaT9%@zO(7-4@_);npX_|+=$BY-plS%ObbQ;E)22Om1OkF{M$t9Ho0Q6MIL>S2P z1M`+-l`26dh=*)brWJ!s2rK(D8M6pl?#oXC#~HBZhB$uTH*oA5pO++KxmXk++5EyB zDl;^i%K{8cI^Z8iO_)OETwP&;ZnwxH*ucW|x1)OS8W|7;cRQi)SgZ7T*%nwtqpoEy zm}Zh^=Xks1uMdlggP+}pO#$p!%MlRyq~O#ZcBvf_b6{;n3j=gunRvN1`5V0zi)%re4ro42J{;tvW6~@gUL|pj@6& z@H6*ICXIZhf^?=Jpj}P~!IUiAkieT`eUqYuUI*QFLzuq^{%SSYw!4kZMjM;kbpe;v z>TTTq!WZMt7rjuFJolsJTWNYJWRMX9RzI?`(FG7(Q2>Jx?fwvd`NjKjuHHu`(Z<&C z(>Qv~b;y?USYBGf76GWe4)*QakIn5(w3=-J*j~K2ikVVbn9tb$gN}B;+eE2YK(Uy| z=Rf~xyz3qB#_008v&#vRdgHPh+cU*;~s}JC=`%mMFl|>}R+WM{uBc- zygxGdG1)>OizGcXD8!jB7Yo7+EdZJENLZ!&-M+R4%w)vilOXVTB=bfPwX`TB_+cV7oO9mmhzaR*MEeH@Q8d)PjI5;tEtheP|9uypVc_N}Zq z8zPT18FFvMS?(Ng6+t*!=N{-dOJ;YS_J(!QLk^K-3Jcc_FQD7ctJaG zDDAtlf03$iLh3$y8;jkxboy9i7c>X^f(~Zprwi`_}dkH+T zzJ)@ridX#9YjN{!x2X&jfFcu=WVPaXwXlMf)dV;Q=un(cWznHKA-W<%rdM~* zQx5YO0v`*7JZ7pDVH;&jG8XMMT1}k3uqr@i%5AnL<#|(y1P<+A#*xDZFjFaOQ3%@> zvf`I)ugxYdu5aPu+6KDazJRKi7iO@suz)PPGO%E2FhH%<#+mc0xUja4QlW^&xf#q< zO2TSwz52cl%bBrBzz3(Ztr)7FrwYxc4)Eg+gK^LH}H_ zBJ8WLeErYj_UFH7PYhB&3IKXqfOP8XF3D!=*;tpIMILczB(bcPMdZsYawZj3&bZ?u zc6n&mDRb@ab~g($Ex;NLPV6Rg?CvI?ThAAhC3_QLQ;#wkpuR?EtEx|FNds3sZ;V@> z|1n7}_?<`W!ggHP+)VA2;46@?)^$h$9lkXkoXa@}GH)~!EC3yZTmA71ZEu^hAOYcw zYzQ)3bJg(t=+mwH5qK+fLb^l~I?4x%FlXtD75QU;X;;{4VAe7gdhC zM;3dZb!E8>KJwv@;Nu_s5Gwh+6uxoKE9k|Q5Xmzu2-#jEpwtR_Rp)UWk{BlFUt32R zwpSg9O(lhT{7G(TDRe7hoS=_g5IHYx`p6dC=MiH`DvAsxa6Dhcm>pdb!2E0##e4>{ z3-bbe&J}W)U06cBRzqc`qMb!HHiZeHpG?VkY;4xi>5io124!Tk*_J2E74rfhCdnN9I@x{;m zJx)LNAXbjtg5vBv#)Uj;?IxD073@E75RW|ZkOVUiEg!(KW5>{{H$^_PtI36pb)-@m z_pNWCJ7}R;%t--iwot|F{;M%gX0f(@0i|LU zxg1$O2zuyAyS-McCxO&quZ3Q74PXpqFhaV#fJ&as+HKr$(`^_eQ{vxsyF;8lejMGc z3j$_tjRrV;XazUla08C7ZUCvW_%sAA)thy+wwoGP8A03qmCERKI_RDF9&%#^AqqpH z+y5ff7!#9ymXst58K6~vxlQW)=v1zVpZn*(iW_dZReevBTS2m4Ww(6WwswXpi#g23 z3c$vO8w-SkXP+5}#_b4^N0H-|%s~=75~MHybYLWgJwOAIB}1$VJNc;p6)h`i!E zVbgWpDWb`47c2JSwa$3+E@<&&W7~DY!UNR$rl?uic3+pX1}8nGB~>ksVfPoP9Lc}9 zsD>x!!<>#|8ruPqj_mpXhwYE2Vhq&AvlwB(3g!v}$qZLN{xIrK-iKl)iIj9W$x7TX zlO?!0tE|xJocOgY2Bg0#IW2atqc6?49DxACfyCjYo9Unfka(dtK(o`pcOE;A(ZWI8 z`-9{7!e_sLMr~W-fBe#}DLkjfr3lUx!VVS4E?gbTIhzx~#|qmr?N$Xk#kH4Lg5)JK zEHe|1y8&L5RZKyqQrPE|oX9r2A2mF@#DwN96tJp(8tbh5yoS2@-#M=1a& z_&{PI0F6L$zgjFud8ILY^+%*w%nB?)MOcAOPw2Khwma2wpe&VP{KG`3{t zyPKUC-M7Oee^BW!}9Mtl(CZL0lcP5vx1}z`*>6 z?32+53&k9M>P64NKY9MMvAn#9e6@shHjhk>EYJi1DqxW35WOjDk?T_Dj>Z3jeg}hL zPvS;2M!9wd^eqQmJ9^DtGK-a)o~sPd!+|m~njy>DTz<|KJBMxS-M;WV!|0L^*HREe za1$EQ6}Gk=XewMY&Sy0rz}vVxw(xY-ap`v~);$rx7sgT|V%P1pAPMO@UxhZaH`)HY zM`A(~V!k_!ZeJWZMo1sK5HY3Q`JAsF&4{{!9dCjHTj1!G4<-Bhu?O*I|MA~oIhR8v$If2L)|kyDg(QQyI)1f&eQB^f4@t-)UlBI%+da510n#|{e+)q zT*&u7RIRGK<99yI+-L&DVFx$Q3=S^LU~y>G8&KA%ar)Gtl0!=3{C|WO*yR>Ac({YR0gZ)Hsv1H6Y4c%M4g^oHUR6S zbbxfdbwz6N=de9w`&;*p7A1{AJOuMzqTB^Gofvi^+D;=(MC0-gdi-&2}4`?Jnxw0ajZB zbZAi*%Shx3IJdfrOfoBRJK7bzFX_ZA_Kzco32ZwzmSRFXYRI6QhQ)HCaeK3uqioo^ zs-nKR#=n$}S2H(pnI6g>U!#S~B9vcz&E*?Hw4&-m*J;FG*Sb$aTU=$a<_<%WmaqWb z&->^-t6vb_m9r7u_2j;TbxmI?$V@5dI01>}67NP_juxD%f1+JpTx`&F*X4CAE}_q) zIYTMnPN#$zPjjD;c)5}zs(uJ>!&t5j@NEp$X3UsQ3r9-va$#1RzsdR*2g@l#7jKdA zba7Q1a~FA1TUY*90xY4#4Qx!^qt+40;!@0?n2uGwWOrh?%P>Y8-qTp|C(Z_uJNNty z)vwm|jB))8>e~&xR)0|+r)Aqi^XCNi`guy zxfH6|42roliUoF7C%!5tF?r$=`~42mqXdSI;I&KQLJ~@jxaT1G<`MBSv?CT)@Y;X% z>o|1%&FJ;m5#4fi@j~w?0#V6pln`j=?r^@DZ9BI;w4~DJH-=~omw`JXf<%qV;=p#@ zi{uZFk;rclpZ>9W2UBlEq`t-3Wk?NUd+B@k0MIH3WsC&KW`FxE&{18cgiz*u*;a4> zT~Q7uLfk;OALfvn@Y?-0g=2tXbG}FOS>>- zy-O1OLx+~*LIFqS)L~B(MuQ&uoi>`a8ZMsSz)e5%s{)=@)?#IuGGkJNn+vMgD47?o zK^1)_5g1mfV#31{!cn0U=$jqMX*pZ)$gcWZ1h6mg!!fgt-~E-mV%(koUH(8vQH5RcmHQUh5Cs{P%Pw8DU~FlIy*m)%FGP%rLurJ z87#8(EC#fkr;C1Dfi(3-1G7hO!|dT3T_t%aG!rAPU1K_sS&;Rr0W*^m-q^>MkpxBj zWfmyZK*p%hpJY)5AnQwSLjMSV#CI;^=qoCt5|XfW(LVd(+lPC;0pCuYF1p+bcFWe5 zuLc~Q0c2N<+SC4m+w(m|4)kn&zr|e`{+n>u)9xXD2P*h9Kqitf*r^uo-k~(y%8}Q1 z#!Dtdz#ZlOt%D zts2q=4Zsqt)n^s279KDFCsj-B7P{RgdaNvLb%#6# zfJ!c%l|ihxn&`A?&XYMfjY7U4U@`9dOeTq$VgcX(?sxI&v`lK7WZT8%p*8D+rta5S;4V~AH>yH--tx<5YD%O&F&U5qY=J&*Il@BrHH5B zcm#{{3s_p2$I|`-c-y=FBgPAdapjG-N;d;Ci!#AqE-O%Dt5FjM5CljDX+~zs zpQZ43JHrHyk59PN6`im|-7@JQ=FTY>+Mq6t)5< zFq^BApmbKl@%awy(gE(~f3d}AnBAY7+05O*@%DUI&2S-gA?vkveC&)-ZEPVbx zx~&%4%^F%MQ4b3M03ZNKL_t)wrm*7H+dUj0`*^Ob`YiDHnP_2=fx{(>-f`_eU2-Q( z-nmUFZ5FK{$d&(?eIY{2NjX;;I~-|SWi|aA_}YQ2)S%GhMWkzolb1dVtJySk0EAI^ zhb8D_Yv3SxEDK&0@8u~8J*UY~#odLknIhkrbcY#^UJJk*$up{sf#tGc;tbcq4 z=xJkNHeH}{FZF=C4k{NFTX^+w=KEj4xUq^H+b+=tODUL`iEXkOGjdF3dSO9g5>ndf zx=|u9ihEt`XxD*5Y{I?(pveN=tT#}rHKovofZz4T5XUdBV{vIeUjEas#|<~#qzn_u zqy)F+cS$fMw6LzPfM$Z}C`)KxaxC)Mj07Bb&nzmT3CH8RJ%Sb)1Y%WnT6AWmTtXpB zHfM-q%0iqIXD(oKYg^bZq-bx@$HL4Et~zoEON(=Ier1y5eT?M11aPl!)v&t0B?T3g zav6(rW$a&GM4^xq5G7?kfq>^PuHnpubqRb?Zjl9=fII^4=xg+PL$ummkzvP9oW#~v z4a30@*<2b2_AC2zv)RS^)+SnO7x3NBehfJ##!^Y-N);LR7rp9rc;QdH`jWukNo!_$ zP?sy-^#&3qL;G~p^4TpY?1Pn6#7qbElYy1<;P}+ox;%mQl#ia244IZpiqF@M0Hr;p?;Hex#n1^*IUoA_fgHAgv;{2# z)#L@`Jbxi*8}8T}{M98OUl$zYPf8XEG&>zc`OLP#nRFHp-*+#5c+ZzHTVSUN0-p&A zA)uFl5M_fV;6eO+0VlA?!r5Q~g4WJM5-^n{`A`bB%ztIFS`tHKo_8Q<$^sTlG+Q0{ zt~JPTzl|o+_>F(}AF#ZCMf~0XOd!5!0^@WFAN$x};m`l{11L$`Jo?B?UcnMl;W)PgA{ulmYT$Bi^%KrIdA$`~fn7?C-!SVez8*6g$tjnJ0M zSF2#ZlYAy6#Uw0%%a%$=(6^v{lhe4!U^qg1vxf1YC-;^~4MpBnSu{8v31hXlNd12sRU0cWUzJ0Ev1(N{@)ax}|fBkjX*x1DPA9_F-R1&F-*w4+{77B$5X6LWK z>gqXU`y06PWzWaCjRp$EDhAyV&YeGxg~}}c;qN|%)l`_@Uorm!2+$1SxeIz_5i3*_*RPjOAvu|WxM};k)(TSq&KAcEl8~N_;DreSEn&02 ze|hdH>AK5JKu^={dpXagj+y+vCQ0A_XYa>HKJpPQFp(kEw)XMQgbAiF4l68?-Zzss zKlzid#+fr`@!*3GxCBy^rOtGCob5UOx9Ctw=7x!=OHG8G+rS{Ik9RU~?q+XT(#xJd zOq6MY&Igk4Js;q%&tM%D&3+77N+rn)Wq>vSv;x$uNFxNc*m&48a9&j2@mtSLU-!;C zUx4?%_r1Y=O&g!g(k)rh6%fDUFXy1a$i|53L*h`nkO)-laa7|1}rU1E?eK^_5#1hO)Qr47#I=T}1C zXi91zmI$X4u&OU7&CQ2U{~$f570dJJrroi=18=VMm9*#J-+k~nKKJR*pxt1HG#wGP z0A_KZIA=`e3tPH-&w&vl)FFN%oOZV>rk=Q8yoy{un$IDL%L`wI62PLdh_G8kyrWmt zQ;im(>t0toCS;q}oQ8QeerSc)Hc*(!D3Q~y5Zq)6^(SK(c1|8+0BBn!)}=-Bdph~? z?8BvGj^$KiD&4bjLSVCkcS5=CLHdJz?B^PzYdG}TqdLqO^}}LZU%ra`(4d^VMp&?` z`!)n_h3=pS5O9kjl>Zh#uq_|jfFUr)#q4bTxlVjCH|j}-Yl`tKu00ZT0O<7xXtrB| z0bzL!?a4cCyc)ms+E?Mas}7@7DIk%`A<6dG(y2^!hYDKVTT%of-O;GS2EqW%?m^sp z;G8bCf{4Ltr48Sb?0hxi3iP zRn0A{Y%msNyC*Bkvl#Fson-cHAje`Iz(ZRq#A*08w7pL`W_lxHf5}2Ie=;P~vSVzF zjgi{!-Por6bMiCh1K4q<2hCA8#OW*!mn7QJJdn|v2U(V+If9_b{X9=vmX~y0q zZtL8+vthBe^QRO@YPM`(Fb9R7JN;>s9+m@h`Yo`I-8tkQy}X$7@hwmhkuCAqx~D&O zK9b8-ieNJk^5x6hU|bF2>}2dTF=}>&)uy@RWfYI$Z0z06VSq~C&J41N?s-BMWWQ?( z$#AH6xi1)hWiFg~C*~D8_~NHNieumS3T9F%={&?vlJv`@ST%|t2**DPW3)Js zJ%f);4C^9wUQJ*5eiL64?4TRmxw%>V;UE1GZn@2%KtH@y0L)2r z%2mAjSKomf?|44iU4q&zmKwL@f=ECl#ueZYV?x)TD|st|MT~);eS=dstA{L|prD=- zjv%rbynNt4u3nDn!ppms+;M~f+By8nE~KY6<`hjz=tu_gM>7SwIh;`zDU5X0s=;lA zr*M;SshO}(hJrVA@~0R|J6;Z7@WigLEHxj#3)Si@vV{T?(jJ!#&>AGtfG8i2C<-Pz zyW*^p37WsNlC4S5#3PU6>2Lm*$P}tb3-D0e>M{_e74N#(ge_HvN|Gx9PThh7v0$>8 z6kdgg1rSWxsF7|-Q9se5M+C~;3qS=zTm~XETI9A|1(ZL>GTRP3t=H3vcdh}geAku& z7NjRLAFGap?b(4|L_lI@15KpIF%wKhjtN77iiW}yj{Vzc%!BS-aVdR1pk%}^J^GpcH z1WL;^mhA-JvI-2gXywMGwx!x=?nIZWu=d~g0nlz!ic+zJp6{ez;wF6G-pR-*p9lj} zva{UwGQ&gmi%~jxGBG&WG)pvowfGI~a#Mb=ddE#q5fhdWHRZ8WBj^oGx((YSzBr3s zcRB!C&lgh`&gcq^NCFLMs07-ctZd3gC#cYF6Xza#7|DJcg;Gfp*9060xP$E)GDTr0 zpd6FE*(bXjLwV}NG67EJ=PrvtI&IlYWTD-vHE^+3$M$whfLH`d{LC-B1uM(@6bzCG zN~B$tv?awEiqn9x?K1(HBr>?~d;?#5@JXCFc@BpUEuntyB5r%;?YOvk8Vhr?Xf&Dv zHe;a#K_?6ZR*DrdID~0qFhn|+Mw(2RnIx9xsu*?~QsubTXy9)@^HrSQZXvn656`;& z1$f}@&*ICg$v*%$wpKfR7$2*zO(9$^U5L?0v`y3;k@wttY#$OTNq_n z`Iu*goPu$ffEo7t^4VM_i@}JXiUhVdx5Z)Xb$YU{`8y3$f|}UQlfVx$V`Mn0-5N3} zZR5_Wy%dJhnxxn42#}CP0Exs<*vARpU@(ge*R@VVK;r}#lNpEWo`x(L?h56Sv?^hX z@oY9P^Uanu`9cxt0$CB0(k^9VV+)7o%ILRx=#&@H&dyiQOP1=_D-d&W@r3Fz92@)i&rO8qK1|+H(Eo)+V+a4eYz=c2s8< zo$gY-Kz3~bGKpMw)tLr@wwQxmNvd3hdc?J23=B|rl=Uxf)fJ=--(lw!bb}8Ly=U2hwRe)PUAf_)b zdA#N!EcBH?+Cd8#Q4!-r8=U(;MLY zRvYIw8(3Oi!7E<>CR}^{^~h46rP$g~0SpA$Q|4%A5dxsQ`qP1*32Y{tvM|172wqGG zQ#4tX8HiA(s-*057TmGzA>}&nz1itueRC5hPM<@I_9f5T=?Yl->ca=He`O!arGgZ5 zm|qYApj+6i)v-pfW3weiAoDY299UUGshCHK0kP2-t!^7@n>Cy|yDFf``MDWkie`%? z3ntTMW-Fz&&21b%c?Rq2>++10vjGZL-xq;@z^TGg405rjynS2S^LLSd} z!OQTPH~cfN(tYxZpR`Ua_%-GRUYCS`Ke_Pe}&JWZZF^?i6r2^9tpcVXMq;IN6`ozE0cOhsjh zGNh@Gs5(R0qP?%cp|UX!`P)n$1_45Mi0J@Hv^v8(NQ}Ey-(ew7IIkw!RmM26A^}R; z$RXg7_sB~9Cm;F&?)&OzF`I+fj#&b5$s+HV;gwZh{d7z8F!;#gCstwUJ*jP@s+4k$ z{wHM~I~I7P^D3ye}*fv}+m1 zNYkdtB9W`0u&{#a+%htiinJ$9q*EwY%EH{-9Vm!|_R_dF6#1LV5j>MbVl)td^Kg_v zHcvL9BzmnjvJB|4(}xtMw2>T*rOher8^%dm?Itp5GFtR0z|rk>P|g>m`wW>C2qGtA zLLpxi-O+BfQ7)D+8g!(PjPr?P2KmAQ>RX$r=Eu19)?0CMy^e*YeaL4DICbVc4ld2( z;~)7`)Ydjoz4|8UF0;I_jEfi6#a?W)h%#5isNY4e)sn&)7JUtR9n|YBbcggoy6E>? zX!KI(4F^c0hct`%`eP)=DddYOnX^)5R=SFmvjuFfpTje5eHNOXKJNSBL-?7WcqxAM zXMYl3`pl>Cf4={};)WYc(MB>`Mj@BP zpwmWTI6$jeL%-7$n~@BSDT4Sb%gC0iD3<3j*glP9YYT^uJ`EegA=2X^2F-1pKX(?3 zi_1u5%2-}p!eHFNzJ&^&ecRLVH(&T7#z|$DtJgOKkdc*yOA(c71%uHLomK`| zAp{2?)+oLnZY?66Tz9FB;5{!57sxK_q9S{V``E=P-5CRuPFt7jHN@8zdoFBk>5D!~ zyvaRzpe2=S&bJTZIVP^-?c_bZ6?vZNf#k6Ds@)(&teHh4p9{}yA z4ps0+b*sFl@tqwZb}xPvjE@uC)3h+(p2Pqh*G;?GzSH!7L{)ju5eIc#O50AdEhfFT z^E}G>^S(cMA3pJkPk8p2f|@L;=z~PnSKOd-JKo8k34ya|%<%5>vc2Jls3-`3>LMF^y0?>aJ8w0!cP9QgZ5-kR% zZO-2f0BzuB1FZN!Xd454jq5xFR~tZ(z_wSt>XrE2-~HVPBlV;;vln}BZ|i3F6*+0` zTxtzpYLEEyda1n@f1d#8=w6eNb?Y&1cTNfj@626@wd3}z@6y|Kf_S+RNCfSUr~BcS z582JS*Ynyx(Id@X^?{S7LsZ;a0N#Br!ZsFN>*m4edhmTIPj(0Q;+}~vb~=siC%%W~ ziSMCEzc^cvIH42?vwb$fn3DWu*ORQ;x9s3Vk_L8iqdk?&iTv&lI}#ISPKyO|Bv4>% zY_rwChd%uU%v^N?F08h2*FSt#ik4-+vuKb$KK*8b%&6@J0Im5#**7r;CSMI|Yho6+ zLHuH;VuIx(`qMFZ1#|5{7P<~R(5e-Ycua2!LRMQtj@5-9p5I@n-olc&wZ{xET`w#j zCevwi6wZ}_t=Z;U3njJtsWCyDd{Hu_knx)LCCPaQA~Ct4%y1!qc#=$x*htY`7Zj%X z&aAgRqM@-^@v#ok(P!KF7WW6&6PetA150yw+Z%rh zFMakcC>Q9Hq>#xMkRao_YfmoF2Ig6W1)4vUct*hTjsQdRr9<(V`n01Y$1xKBqn|8b z|IN=qrc{-pLE6|Nw>URsnPx|#NQ~2CptWZYaz^2@odAajSC2cNKOd8HS-1n@#1MPY zK0m%=qB1&u-f*6E$%L|a(jLC7y9x%tQS@6JUF_kA7>}Md6d94%ci2IDycu6BabD-< z<}W+;yvIxJC~lkfIp0Ry?c95@k?ix+j+Go~dmDfJum1&RhXa(dX=Q56XOYRKkjb$) zN7Mzzn`z1uM+YkV7aTC8=FePD&xkbDy~?X!Sd29X6Gs>R4PKg#OpFYN*iO)?h3Kf zcD;*6s)(1p{XLkw>e|51-|PDPf8)4GewMFGF6W+juJh*!fHog)XF+M)4sePz23H8B zLXc+*!X{P>Z41C*dcr^TH;=SqqR$&h)2J=9!?(BCL$DZqRTFlIijde@_$U^yH~VFW zln;CZ&t~yrA;D<^b)W(|h+#VxS+fl_UZMxvzhaAe@euu6?Mby;)n{Z(E14K7@dWK# z0U9ST>i2Nh-+dfUe(j5xA#oV<*U1F3DJAt`CuZiy2~uXRi+Cs5Qv$Ti3;9m3OU&5_ zZDKU~T{OBK)LI?XJ6)`{+F0%MvDxaPHBO^CH;*lL?QVBb%xXtJF=?boF)6t)fsX`5 zieBuB#2J#mcdX4W-Y?HaSt_=ab_3y;`TO$61gw->P+mrNr(b3&Qwjh*oK0Z62aLn= zN)Tz&!8d{fcLQ#L*g2>9vvFV2{?+WB2^pXoDCL*UD zXN9;4k~0YW3U3`r{KVP)!t(55In1q^yk`!OWOzIebB79~)`CqdY%!bL>~G(%w0l(_ zIL7)c=h3Mm%0l$3=s)#EXsgC`ai||1VWR`z>M&Z|R_DgI4Q#w6H{tAa_4joAJx@4@ z9~fxd)|#BplNZ)yC(yMlToSfyg0B;jKc?;dp5OW{yy1;+6q|sb=e*Rmw(zcZ{wf}S z=m%ISm$6*TVkw`+Ts|Wm7EAfOkkS-$Bz0jIhBOMLq7?iLdjkPM_xmgy9-z}5NdANk zJcYJoq-2$iL>4do#b3f5uY3(!J+gP}N^;hO%9|j58+v%g5+0YuK@QF2x8OqjT&L~= zf4v5R&2u1qJ2E0)gEyug5gZ<|MPmfJalFUn=*7!9Hqgf=(=X%0GExeFj@j^r{Sb|y z0q-4lyb+w(gS$}<{SIGIdYQ{WXvWwCcfIlW)r|#W!iRRuTlj*1N8EJvAAAwjD#3zm z^_`O>6N5zrFImd~5f~2fKa>hyR`d4IW2@HsHctNVQ5<>2n=rF-7^!StSlFb+tguXJ zAVmZp6^9R!2?$~WsCk&^i9D7rXjMc`sKgvDd0igPt?*#DA`=~qsg{hB8MYbpx0J&C5ZC^Zx`~Uk#ksTA1mJwjb z%-o!Spv#pC3gt4gWX2<7L0}w`fvblhnYKDj0jLlFUA*FYEFQfzR9?YDP>_>9iAy+C zR|?AV493u-4n}>40T`*S(8G2J7<)Bl#O=1McMXWUjT9F$fuZKcC0{BA^A>Tq?83HI zE+H6p?l5m{gjet+h3YzgWVJFq7H$cQ(94ia(+-XAZC{{A6t8KAym3+06syzwo+fMUjh z*(67#g%_s4Z8r$`%^AytNv1MMbVq6Y^$$+s$%|X)Y;Obo0lt6t=kfNpy$wr?OClpr zoIW97(;#xSE?zjzK`1B`n<83d%RyU2U-UyrB0kWl{0BsY)1PZw#x~;l6 z6Ulr9xpEmzf-5fC>!~ zVf`m4WkB#cK`NY%v|tDcw4gJ=qy<4VtXwD9IqMAI{)nu4Ow6Ux><&>(k8#uCeQ1sP z_}cwH#H05d=%FQHKi=BfM7!I-!TtNtX${csH1ObezKyk$CosEo z0NHXD$!-tXYzp~Y9$VcM5|#Z(5a^s3p}@B2!XC($*g1^HeOXro`w(DH<33CxYMWYu z2nm3ujMpxbs_$ros)4A*Fw}Ake&h=U0cq2@$!(O=8&XA(0`Jf%^s$U?vEP>z_bs zF5uxnnPCS4j38L5h*T;kOs?Ir>KQs7saypsS6qX$Cr{#vasm&1=hbb3<&(8>fdB*2?RR2{YhBTGRO&8-b=Zfs!gnx|u7<&f;J z0LW}kx9q#2jFquv8eq(9H~}d-CLC+^txkg_5>zjm9-$5rrs%MzVkkTf*doawO&+Ak zGA`MhkeP}1V3;gPkOlaQP(Yi}udSnkbfIgP>uY3H&y&=~WRrZ7QqU8qqZaD1JqKWS zv{3a$d3a|WQ3F7$D4*^$#GUUw-^(Qw&ZL0cQ$4q^)(ks1b>Ej209`0bOI;>Ur3G~& z1@hL6`y(k(AdrgRfgQtflh(T_fGkn89wiAh!l2t1@N=u#K)pr)bQ85&3&U|a^~j3= z03ZNKL_t&n$1ZGQqus~C!U|sXrZ?ld>#h^IW1UoFeF>wff(=lY)#{*HDPiB@ zoG?)nXia}a0o#3SY}Ih`^jTcE$ouKZ_^vE3VRm*_o@Zlo1GRJKaL;EyhC-4It^`0A z#b&-40fWWV{ zNR|q}h+i=2q&tEX&R2*(-Hw1_%r}W9Q|wA!ccUOf=-!Li!Umjn32b+9nNmw&`#1&{ zq?F{awFp*8BSEKhHjQ&9j^m!Y{s)TVuG+<9fzE1i1Pi!mn@I5%e-{umM^$f&};WrEsv;YGJ$H5CHV{Ac5cbx4(zOS6(Se zZS|;W?`V*ULA5V``Kx&E@BhBU8OZi7K~y0mqw%g_P-$r>1p?|rC)wdh*r8cGmqDMv z=TsNDBJF2BPZsHH37K*Qh2?!%Ja_<0D=R3G`M$u`%{ggBO8c7A-W?9aUl=fEXLKt`xK&#zCnH_1Q6XOu|W=&Z4d%cbX z{>lElwY`O5uP?Uim@NZSW1K#DLReKA^=(uNMOPS^K(}4Pvz~Dao_*)bacZrBT&0Xm zDvyg7*05A9;x9k^U(i_JLVocoiNmlMWvjM@M4~4x>hdfA9P7Mg2@0o9V{1yXBWAMF z0+(&_(xn*zdZ(nFu68p>C0M{Wz|3qFwO$+PTnVXu3lHCWHx4f@;@X?8MS1Q3`t^(W z$(KAI?X6WD+_xY3d>McHrLW=MhmT=6%HqVy$1rMbp;)M(P^}2FZmZQoK3_s&*hjb7 zz^LCrx7Sj8E0aeuSwN;RgWTK1`~?_w}v@Job?5;24=7u7Cy_a^ehD-6+3s1B0Wr4B&Dz2^!*oG5kL%h~cyo`rHU zOzerw^5PO2+2#xFSez6;IIHh<^jv?9)eh#cRxGE zJh(_0N3(mQd=LP+#R;O%6{vwASqbdlH=O}`uR44$3UjaL+RJf!IYvCSVIS}PgZJX| zpZ`1vlv961lUzFFvGH-Q8{3p6w+vjzw}10D-;G;ueHz~Wj(3FQBeD3TZ^IejA+SX( z(Hmo?3$%937V;BVI<30u<2J#>M7=xdq=cmJx9mvrnBMmQkJb{_zfX;KYDWS+hcQ5R z#6O__V8w+7g0>i`jf*A>`Ap$YYe!1}^c&vrdc6DH?+%!#r>(U~&mSMVy{yySj){*` z{F;+&_o!_a@A4SETHKf1%R2V~(39qQ^7F)_&A~zmicj7b~Tiv0+DCIFZDDCvH}{8rkyLKGz)t(yFMbR$#?E&!dm#q(3FM~d z-&|FI9h!(=Z(Ah z6}jrMUzwb>`HJfw-7X3^F`FsOsm0kZo!$xZO?sq&^~~1umzjZ7-1@T+pqi+0(4d0u zhm3m**@Ob1nO~Fw{}C`qBr!8v##?{-HF({No`DKu<0%55^O6_fzM|jAE{M|FTVk-h zF$F+Np+SErKBIyq2SSv>7TNS4xo%l-*-z%Na`SVMDOM!5rEGCB*xEIcIiR4Oz0<>i z9El0X2_cGTtaztw7J|~^5f&X>|CD}g!(XwN8%dd_?@S)X-&t~0niimITW%96!K(eWY+^0=WyRJSEmfn=hkaDw^_pz8yk4!;uf072xB8-sqA1x zoJOTw6*3L!a_frveA(sOMy6Z*=b2=inM^l55-$w2HE!pN+g}lp<}p(HU0Vzsy_?P9 zpWo!N55V^A4rA0byIErQ*71xWO4Bv20GbTY?KZnpC2-qZ0XHp^0eS}emS(ZAG>1&F zAOL7)IOz}dnfvQ>(Qb55Z+5Xc%Hn13_$@46bHin|ufNn<`^S3!Qgd`U*X6m$0PT;d z<*Rns?V`h-g=v0zEDoWzXV~>sfp9)XBfLA6@OvW(*;NMnaxr3CL<>VA{+=iICdv6p zYuOk1vhNIwDEbHnC&$n15#(ug*(hBIC0pLnA>C zaa65d8})Vz+pQi}+XI~McCprKqtC8(>uxBt?#HlwjOY1@s zm3IcC+^N*2`SYPg655PP>KA@ZO10>Gx^RYmbcfBka}E0WU1yy*`!2G|1-R{A3C(@E zMj*f49maFCLO9~$^+H_Y?K=VSPOx8%42p4N#(YR3!q0{5`Qd2zKCE<{bT)y^hr?Rf zXNkYy7jY(`UU6Vr7jq1{Gkd{7eJ0Nz@_@&hFLika8zQ%n^ct2&^6okC%L$Hm1M3mp z2AB4?l&nK+o=G0?E?CHzxzA*+fRKQhpHv46mwW9t2r+zv*YuWlq8EN8(M4?>%B%uk)R0HDu4c?{*NZpEQz zyg=Hv3J6L7P^#dhDoBC@S{=k)sZ}_tm_*G4c8FGX$QW7+TpJ%hkRvT#C;;?)I+Qe! z6oBfhE?cNlW#f()wJ05}edVYD4H1|^v!=lX`%f9Vk)e6cLG8~nVEmG(xo1iFg zsjyeTSf|}Yx7|UlR+Cn3OV>UlsQ#AiEY&Q|!IWoIhJuJta1S=A5;G!zZQKLNbzYg@A0G z3V#;(zBLJ|q1fq>mu z#g|Nt&~3M+Dl?tRp;oUUm(K`jqBrR2^N;!LDREjDKqWvV!RO7V(CZPfnvm9ylw~xQ zcutCHzQ%E*P9c+vRkINQE$n-VEY`N07<5`Va%dUN;Q;5(Z{Ugh9>j~Dc@6rxJf3VM zurfn7(=5^n%I3b@cc()ZiZ1T?+TEyMT*dO@A_l3nfM;^4F_sn=@c4x~N{fe3s8o?o zjnQh7LAfaMn?P=nyNR)5eOAB-S@Y;!3BcJ^h)T7oYxl?j;WM)up8#lrWGEBK);#ER z#6ay4NW`{5!kozJan)y(?WP~8pm-1bPr%g#-XtLmt*PWdg3pOD0ZT~~`Mli$dP4@V zXva7n8UblgZ>i2srVCp2UoHy3g*ruwbOr>WyB6@Ntn9@u*I{lT`iLNuLZ*ldr%z)p z)xneZd=7_ai+K7?SL5)JtFW?fA7kbD9=k)#POhuQP)+& z_qu4enrPHEvA(t@`t0D<*NdJtAe3L6!~nQ(UOA`7^oSoA7M)BM5>bYR?-Qk=vc&;f zv|?4i9nK`!&*J(Ss6`wo$ttKWH5IFMV8U(s{u6Jy-?%oj$r#-6UBAK5MFySw$^sZ%W`D60+u#RFDSyLQ&Bv?nO8L}0h8zNhTksyA@r)ER7S)&wZW zA{VlT9zAkcK+2S-3}_HQt<$SEF2Twy6xwF@gsqwYoYUD1s+BwrQ6^N2%5*i>1Xr!r z#Muk0Sl_Ip$d*fsvzV(^k;`fa0NT&&G(hkq*{IK)Ju3{*OsFo-&tq|MQFP+Q<~p{{ zp24?2`*9SLl+QpaUlP4}@VcAvOYi)RNC06kYb_q+3rwz9uwth%w>MCQ$Os0JXvRfwth)$xhwT`<#{Rw3I4UrN2W)}+qha^+N5Kny{vOhCv z=2*6*6O^`_6SguIUPz&bGQCL>TlBax%M%DZ9MI+=$hMDGw}*P8g{?+II!J7GMtJw{ z{0AI9dbQ|&V^7t+#7^ZSpWGQWuBgG-oOS`rp)+DgLM?`*Zr+O{MBX$P=y zxj!U;JmY}Zw8OJZ}w8C!NUX}7y_e6!w= zHhzq$5F|c3Qx)K}G<0U-zt7-d2lJ&I61^6hwFYYSCN7*ija#n25sy9j1ZuTy^jmd2 z|IX*)mS^38Cr+LhM#M}ihwY6zW{W9&_=Eo$iD43jeOF_4|6wfcJ0wNvy@WEUB%t6Q z&MWQQKF0zhDTGlLIPL60I&Cdx%!oeFpzKiEVbe~h?apGkUV9VA9{L{2i3FZ?`yFVG zfnyInfH(i-t8w%7SK-2mGgzE2;K|hueD>@23>Zo4V$ zbB(Qw7`p)XIGw>bS3<5-MWHZ*La~ZeA%}6YFU&K|^CyrW)G<3hFJR}nnOSVFoyGor z`%vqTvC(7^WeWS3=8;YHuzzs|tE(N{|HCIxEEc633;mQrE)Q@oV1!P6OJYg~=4a8p z@Psf*ODs$PFpeq2HM=zCRB7=pU?_`4DN8wXrH7ARk6(W0JCP}rLabO&l%{)I?N+zX zCEgY$n*zxZBpRIENVs}=hqpTf)+;?MOz#^Zq#m2~zL>3!}TfV_qs>b%62M+hnvqP^%Pav|v0ML6)gznWYjvqG-ATaH?-R@^n0&wSj z5lGd=AN>9w;I6ywQu*xxpzVJA#HukX830;7V>UGXx&O)3^n1Ve@A0yizZ9>0j<@l$*VK;Cn7cm?3Z72lt#5rRe&ttwCBh0gIYA%# ziShS+pv+TUzyAK7kgdJq12_OfRT04;0Flb1W6)AOV4*I02y@ENmXO+WnK z%)JM=W!F_E_}`pguBb|?DrL#p$T(vxY-}*Ng>4K2*nq*G8PldoHl`c;GmU$?v8TU= zo*@h~(=E8QpPV@b1?RCyR=iQeib$?Sv)T{f> zJz<}{*Z$X9|N2*8$H$DGi>vCrx;@CZVcQt+Fhn~Z{0F3w*nR1K6JE$vw%m#gsDu8z z4sUm@FA?lzen$c3jZ$eW9eW7fbB{>p%oNGbBta9ivg=VMBXL(2^6_(GM=HvZC{0m} zbVl=1D&o_TxEQa_V%|ZggI>RjQy0$TfBMg#z|+kk5`#1vOI0b%({;iKfa{bZSf3RuZ%-3EMa@?#ppS=zkcO;G-haaBf2+f z3{kJ=#RuhG%bl(%90)N_NPzb5J|vB=1!Un`jpIq{RHr_x_+u1@kvNkUrc!;e-D~4JPFV_?7IF3ku8w`O|>`;-kNVMbKViQ{NjP}bmg^1GoYckcPeAQT_S4g2fQXI(7ry?c1toZ`c4SjUBxDxO?i#$%UO&=^rThk2-;b~H#PF)=YA zglQ@G_5K*%^l_A7M^JDzE=kBN@h^N|4E>9mkeCUDbK4ma+a!4)%Q z?AbkqnK{jgQQemBgEmhI&~3C`qJy6L|1+JW|Bb%46+FD1 zOY?jI0Xo=!LvGVpEbi=XkTG+ltO&lByzSaM3GBP@L!43FIFuc3BCa6Z$iHKs)4yhX zOE$YW#x!r{J9r_8VD8Ji@NDh6kKyGK6kkT!e*wu*?kfaAyeBJe3-hLmGv)t_XqI*# zN(x6Tfqs&mpjk*o3^2ksKJzIYyXOv+(@A6#Nl+$&3eY*mpQ!{b#TWEZb#15f8Km=h zj0OquVTl*mF}gEkUZ{sww1k9C|uA1nA-+=yEHc6LBLHXdymAAO0QH;nd}e;Rs~nce+qf-Q2{ zhB`~)lD4jAph<%hj#j}ZCE`1sI;wNqLl4mCue3*tdv9zI$tV*%Em$@7Y=zsu0;ZMuiZws-9)R| z#A)MxM$b@jXLupz|#!M%kC|Zf~mMQDH-^b=<1mwEs2!pH6=MTVFbg6}; z_OZ8^1W<}aw zf30QRXaKfib^QtE&9&h2k>^|E0R+ZAV)p%jiEVVgB6P6!)zT&iZaYeVM!SLXWJMJ0 zNzTf#_##(CI#-ayzuE+<5oo(^Y3Vkga$7@)sZ`%>QGIrG6|40I7FVjcRI8!gXk&4y zj+ede^?20}zfP2DsYa~vuCQ>!0zmc-f`Hv{gj}(JN6%cq+1dz8i>vtR1NUOk8DjqA zG5p+nenstClC2oKENeq1mz81UISNH8@sjkBM5o)wiL*~*wbd2%*+(CK7{v@QwPy!T zUs}QZ!aVj)=JDoNyc}2Wp2g|Mzk|dui{@~IGxK#Eyzxa?>UYr-MYjyPU6Q_8$U+kI zD(MfR;?N%gtxi*jBFS_@lz-_wkVHTNIg<(`c95*iB9BZigHd9LVxb_!JlYqwo9wsy zV)HXO27^a(9g_LDAFv{j0nk)xBqSSR(lklmqC%;&LP9qwD)^<)?F>+Fsp|dAOa-f{ zG&;>Tj(y`H-14%cXeQG*Sp{ZGY!#lz^u#2VSC*u@ovO;PZA=PMZ2o7gowgJC)g zWD=On1N*Mnheyw?pr0utlg*=2$chc^4oJKiBA-i(dNWBkd~P~y-CkGr4Yn2GG>{6` zWD2cTOYWVDNurR*A{YX7vAr7nO|#;40JORtQRmaWf(kTj6p|1UAm<~kv=Dq;5f;@O zc^VR>CE>vKBP1--*%Yoy8aYwYrrHL#K&`rzjfN-b4W%Ww5SJ1uxnCi5NR@0#ls{4# zt<1}_7%H9RHcy>p42CTM%p^Qf<*wPNqP=hlou`ihD^KGEHyp;1!&l;pJ$o=SJB`xh zBr=5}(iygM&jsp|=6sU)%*4}(MO57$x~v|Qjs|V4R+q7G`4W;d`*G#9&y&4M_h{Xx zMEzZWrmAJj{~}p8cbrpzR^w-2Hzf7?Z6ZSlKN|2>2ga%OSR%@`kkWQVTG$o-QS!3| z)19_Y;5M6yUTYqs2H&HE1hz7c5!dchaoZoWyIvCCoa9XbvUtO8J&JejZyaHofX{o~ zi(VPoRs3M&R#5GB0>A5>FCLuT%5~QqV=ZR;ZJd7aOF|yZ<+G}2PBOBnNl~3tF(u~_ z*P#@(Ihe(wk5GMyc~hOQR7@oSj+l)E=xTLE2+)mY2dPW}-+S^jhWQd^XLsQZx4sQW zj~*3UBBWW)Vj=0P>aq|i#wm2mJ0ek&QTcw)yDi&AjtZKnjrHH*d z<}fogDRzTJC$#;m%{DGBEaAeX1=$aF%}rr$dP>yzHIP9fWe>I0CeEC{h%;x;Ng#}S z234qc?%F9+ad~AK3un&Yp}YPOOa_pEmdxdau)gciRrsY}|1H^rQ?CyQ001BWNkl0QZ#;5E|)vWB6((vBb5had>uQ%rHgnWg81O4wW~0 zf1AC3&)9}@CLky3a|H?g_=SxO9dHGG#Ra3J+c|7#$Bbl9w5eAL?#X;`@wx0yctbAo zzzS@M^|DZwYF!C*8Z~_Vv;PRx7o}K@$^ z4N)sdBrv~t87GcEiO<}A2k!mGy*PaMFfLrUfaT>yEqZdnd*Whtz7U&?90rLbZuyZP zLavy_U0=B$*F5i~(vd2YD`IXUhXUK@5yxezU{6v^PVgm*x&u-Li%o_j0Kq}Yyl zrqkhZBpD|_WvA}aCH%tA{4~D!rMq$8efQ(W>z;>4o;rq6pTXr-yy{i2#-XdO#ZxEF zAX_S6*iT~A?IDXEKJmAIfmAY&)bt)?Dl?egu^0KuBnBD!6cgz8i3ODe#7+g=VAzet za4az*$Cmhp_L&_?WIq`V(P-2q09q+cAd{ogO9q2(4Hr%vL#oq}jt14{Dh|x;MX6H4 z^KZN!E9cK(?_2@bzW4|5ceme-Mi*FFxQN>FJSv3}@`WP$-8Skgmp~)r6k?F#p4&#Z(LwdX8BC^o*uQ5M7cb0X-@!w;V%H8Fd-8EKhiRZN zDQYkW_g;Z)s*jV$AHlvIhw;RT6QU|ZqI)J=K&e=e=Sz_E(Wpx??Y;wt(Y^Q-I*aE7 z7t1pP30KU>l{z`M3-5m4`!Ta~r_2pcRN3R!O2tc%STYh+ zU`^ec4-8YtN!B|tU)hTLc;HxJBabE`%F;o2J!tzVc$sZY*}vQ=wA^D9D^~{*Y z>AWDqn&ezqkf&b@|837UjzAbbe$ZCMABt$`L9Q7!(7`8>M4*$ra9v^4Cos$#rPFBa zZ=Esqu4hBBl@N|TzJ6o(&gmd=6G`H3V=vt7(5=Sa#vQlS@2 zJoYX0&OeH5HZ8d-;u-p7!zmRLN)Kfl={i8na^z{p|# z-)2kciwjONwK6we(jMFW@ok~*`5pl}h(~SUfx0yl-kU9$vDPY{GIDd&^WDNb)0m?! za*uPgR#h-wj1%kufxtnG023tW-I{WnqpTN4%&|2;E>|q?$a0-t0gHU!&g}sco1QY9 zoVSi8CjK4Yqr6MTt4L^Ifxu9@?ojEG`IWc7;kEerxBM_>CnrR$F_~2rc2QP$xfad0 zs0t(r&?0=nn79*!Vl0bFsM2YX3eZ%U9t=f58MSlH5JqFSV@|D?b7(KrF}z<6vl?>8Bv z&3+wVe-%%OVcHj(oyP@ z|M4T3fA}FxWeO-15<-AxXHynqGhf9yM1|+-$|~lUYdE*Cf@8}oc=X~j+DYQZgzSCR z>8nzy2w^&i`#6G_zjyOzzktr{yX`|ph_*3`+e032#{}=tD}M0_)$w!1eItJ#wW5GH z&WPe`Q+(Ack9&`PL5bmJ#(dhHw#2%`PKq+U`WyT^pJn≧7jkt}Z5U)9z{PpPR&< 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 G#wdBru5x>zcoRGp7`M$J(a(K~^9EcY!Or!hP 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

nMmMVGC5CqM!iri6C^Rh>RLk> zN+~}n`&q$BMrI}{r1i7}WqNXb8!g#E8GNAL5HNL`EZ76&GdTLn>%#P!N(ofqq%{l#VW3T&U0|?bFN2zZc*FdQ11?VNDX_= zTVd);fdh1UyR8kh8XLmY*K9OV=iH_XIQz=yBE@2!5gDLOPdNw4`Lm*ZoSxQB7D4MA zI@EUD|X|sk3adNKSrstfW=+=aMs!92*W=sd>Lq!Rq0w0ks(wH z1f<=N1{LzTJSyc9YPG7cYzlD8sbIAs#v+pqU}Aw`tI`&RW?qlQi~}-kkX2rpLB-Z( zC3jZ47T8|mWi=?C5_^|2o(h8YuE-i=n{&=HL6PhNKoB&Kkv6LC7&OtU$@X`HkH9OoslGHyRjjxonQEe_hL|ARu&RoPxL4&m$UMI=x>~N$(8t5Kl_eY zz&Knln*|^_j{;z1F@?1qr0wnEusXd8K$N)(mYF5Etki&Rgg57sd*0jRjtN?P3T>Mv ziN(NX5BEVBtV_z1X~#|5L(~yclpDyW@HlftrE=bZ!_}vn7L16_G;hLxV&{eyWO7@& z3G(+$Bq*mqG$tM?ly}cWh9oZ(+WFs)zp$CyN`B`H145h4r&9ih&xf+$@9 zoBDdnvJ`MLaZeER#)ish+7w3nM%uZQSQ($ zpgdvXUXo#CSIFi>Zn6bzfyIwxSI*=_c5)826`+L{7~{yI)o3USg=+`iZnx!qQTApE zdFigfm<#=VktvkN3?!0OMSwL!@gbzm>xdR>M%ai6G$5#%afdFyU`xpY*%ee)(^hAv z7X~>Mh{1)S1?tox{Lv(!ZbD&E&E~{b>~vZvu_fM^g^60^$$4Q+Ba_OZGiVEYZ`W?zeeVO9uauF`q_Jb?JocQi3#Zo`c;v~a#J;C*Apo+`0Od**Cs&qH zDA$nAm4pFFbS!<8tOB*^ABpB9TX`-kg*Nn)Xge1QC4DXesd8EMF|5V?cqCwaj=#Rq zkm5u}rh1(YhGhAcz^k$&bFZ+*hhyV&_B&lX|GKO3vgiE(KKN&Uf^U5Dn`rc!!m`bC zIH&B+L%mZf=EN6bp`z&|V}LfxP#BEw6}?bMC5fi zfUel5j+IdYzicUJ-v@qqz-(l?BT8n4fg9B`)*>}brrA;6#+3_c+$I(Ra6-n1dMsfS zr8nZNhsjpjfxy<-Umz8ON8I$ioDw&l z1^(EMUP_)j&2D0d^o~1z1E2luXCYLoSyhpGn zdDwJ0r5DrrcK`MRRUifJ8ftf8kV@y(#u-CmR;lJHHXgeV=^pJvZJAAfPXN%xk`!+7 zGw~~>JumGBWjQB-f-ua9K35;cn9C$z;W~1Pigo{1GHB+7=-1N5%A?n5iOqE10}tUh z|Jz^TRJ|iMp2SiZH+EnEd8~vSws=IO+`K2KhsXaf7UnU+q$t51FhGkPYDGVhQz|hm zx1W=8!uEzue^RzuJb!w`Bo2nqb6wGE0@UMO7%)-8v*zmS<$#-?0k zQC`X;DI#BYQl3NxjLK%05{_?lw=9g^d-~q@U?ul;1cHyGM+lJ**I81AI;E(f8vf7a z3%!jcBv;&H3^EKc>a=k6S!dw&x895c`}azWi+N$`vO*#&{>~L#S0F8d75iU03Gfn1 zN1=Z!fs*D-9YK`X){OBgn39Ap?3^aR3AZ=77fG%%DlTH_yn`wSUC*E7v_sihxKCGaR5z2IzK2K+x;!ZLBmKI9=~xx!b{7Yls_feGRUE>C5o8 zpZi&yI&~6j^#)6SMdp%(g1$cGv&D`nrn~LB30eki=VeQy4 zWNACHGZZ^#rBV`?p&iXwFt5*R^T&!`Y)%x95$U-3`FZgXSj>0&^ywH_ns%=F6pWF` zwHzy@*{+ObQ`S_;GDOpz{vox;jeG)R9 zvQw#a|5hJS$)xnTnH#w3sw?sPfAG7=rL$k`YVH@avH(s=RDyd8TkzfR)Lj7NK@L;^rJQ#>Sn z?yVN<_xb(y*Ec`_v}$Kl*1^BsIIKYJdl{D5C@Q>+^eCo9y)f}9e`lM=A|;{R4s3V* zrz^w`?Y=||ciPw^T|9yL)989k;Dk1#%60=vhVva8vx^m*#cfwGTSw2=c~=nU^dB|b zEt27{;yPZceZl;&*<#f2j1u1S(K~VfXFiDvyMm_2$fr{%U@V=xS->cyHByL65*D@1 zG*^`qGBgrHkj#PhVagFKYz%rh*-zu^Csy#_vE#}xz+w$o+(>&x^_H`N1E0eMur!?J z^qJXEW}|!m#V#{p*GA0Ck)%I@NtxUQ{TP%|8@&HEpdN&TLH#Tfz~djPl6g2 z91>K__nTH+nf>rH#;(OTmExa1QiDFOJ!d~I+rNZzo+OHS%sCQ1?lr+Pvc^$tcg16> zElgiqLGC1A72i9Z72G5rQ}hwLcGHI=W`y};$tAO^8%Y)W@=nPpJrKf*G`hny#+fu$ z`Z@gY8{dj^ue?$^N2vUW@=1{;8235tIm1E?o#(jSJj-shqmnu*@)6@Qa6*^ah2zGc z?gys}RH03P>GZ-|4QxUL&pyEyar^6TW-W)yFTi(34A7B6v4;s<2j^f%mbwXhuRSd* zOm|I!B4LlvajF}T_<29 z2Y_H}+d*FqLUC#b%KqF}@N=)-#@fmXhUF!kb^S}_xShN9Dhr28;(36u0Fa`f4U=^e zoVDt0C$UtJg$v&~SII#CG|-L*BSrHg!XQ|%zT#ilpS7)u2oufb>ai|JEN;DHYnEgY zkCS)}fgi5ziVLuq02Y8FS@1|L??F?V5GB(rMGF(Y^;5@i{L%Yy@`>-@@YBb!|MKVK zE}p9g~uy3Hn9>uWf1 zav2Mkya4&yjwtXbKn?{k+S>JomP`JanJ9LI+tdOj^B@K@hBOT>ipjv?uF@(Ukw17t zEmZajfVPY3PK#FXl(lSIC&ogVngBq1LFAq;skfr&;x_lo#Quu}ZDbp{{u}y0kupl0 z8xNvHU&oz+i+{yN%-~ zPTR!>1b8|aAYUNhfGuIjEIklIk^km#tY)NPMMe_> zHpqxc7BsR86F}A_qqVSgLO^L`on}>YHch}_`Rxq=03ZNKL_t)t0t0BQFo;aCS6^Sp z`g#NFYa3{6)K#>RvA0%3saiv6zJd%}oo8tXjTC^ZSpwwP3Y{Pjf(%^65a*)NZi@p$ zW>5w@+3qHtO$(rfU<4Y40)P>QG(LMzg3X*00zHI#t#BWfjY<6h8I95j=iki03@#Qe@IY z%+2q{VD%|1A9)hBy_ce0J%C5ongV_p4^jejkz{vHS+J?El(CJ#KC<;IIGKRmZoea7 z`(cmg_R(#(&}pp;m}1;+3wsT+Y19^WptN@%cI-J5dv-0MlrIW9+_2q7rCdR?+r(V0 zigAA=?fyu!md|E{ZJR-&VTx7iIRSw1_Ob8KJoReyMGOZ4TZMoega~|7`_ryt&s(&IjhJ6Vb2_WCK z9V0NPUT>k@>7mjyGC;4dFAD(roGYIPutoZqhPB#j zzB7Yogj2S533iAN8aeI)T$Jt!s?#T>n95=GVO%wCAkrg8OwaThbQ1<>uPH^mhLYJp z$PrVjbK3$Qpdj&*2)aijh#UUfQ5kBkIE8A{uq6OmM`y)nHUZlKKb>8}W0cRGzP-Y1b zo3ekR(t9U>JrMney@#TyMwzw{62J6j=3PTvOo)~052}dxiseX?87ho+Pg8% zWIcEzeE*vTYxy1Ba$~{_cUm$y$-lL@B9JRVH3i72Ia%3r}R*+xVfwOll;?&URC8ZTgh zAVGWSl*B}6|4J})WMFY+xS&mLrQ0khB+D6N09>2On$2Ps`V1LK!cpc4aL4)D(j|m) z!R_l#x23Gp^b>~4PD;Ol1(!UDzp0-nIe0CONm#5$V`b2jSO(uYg9sV%hsf?P-A~8_ zk=8CR{LDgH1bD0LcRsop$t->xX$(ZL1GM)uIP&--c=ma_aM>jnAo3ONJ4@TpGd@k`Nq2zNGp3?=g+k}WA9%1mBBj!}cQ8*$`g6$fU zJn|J|LM{ms1%sS1te|jjZ#&x}YGLUTE#4UR7O%ID!vv;DEU*967H&^~zHd0OC z=+OA30>nM|z>;%Lk1Cki#d8xyi)OW3^2R4d{k0WZt$t_(`Uq9K=_ZYbS*J9|>=L8V znADNVPh|G+7<-rIylywSKTU7V0zgj&@^$jIlZ4*N_Swo#lJ%Gx;hpdNW!!t;eahx2 z1vc&l&S*c(^9h+T%!J|#YXxbbnb0# ztQoI95Qa@YXI5NfD z9Qn0p{+a=kwUZuWDZ8pA{M0LMzzx@3fee8wjQ!Jw6{cq`Iv^nkeIEKpoJWb5%QHFB z7FVFB$w0=2lx5niHu;Qz49)@LJUx=rsNW*wE+mCw{HeHrUFTnnQKl%dV)KQVSJxuN zpb$7=cSg2{<@1eQ-Obj7Js8Yl&>nu;yYb-)zdxP$Odgz+|4DmDjt?ce`}dTO;>RV= zOWZiAB;q1Cjy*`oZhxQf^DQoKqcNcqMoHwg&j|TWi{K~a^ zJ&7m?=*?(Jo@BeJiW3mBvT5ewit0dW-78y?Bqy?sQ;)yI>|w2 z^SI!GbMgDX|GU_=v`e1(e|_tl@$kK0#?C?pdn!dNRZ6H8^VmV~GeOYvbJA6kEZ!1J zVmGjEPp~1)MjefI9~+%9p7RrLz(p^-SpkCE06=eNy=_;oeJ{s7lRb9q=+P*@;bH+| ziv%FdvbSJ(d_x%+@qqkExl79Kq)Cf~0>d`%-eLYIA99i3XIu3dZe-3HZ`S z@5BTD{3%p(S;>zVGbt2Okhouw#Rzgd2XBwKV2!#-n+9Sp@D93V9$R$zoi zw~w_^3g2FB;OkF4Ekz!xN;4X#axK@qJs2zvlQU{78^+AyHY#vKJ2_g%lk&g-lU~(3 zy=j1A&7bM~D1))FEGPYEHP}VITD-*B2R24q0g|$H_$n>jjIJd%rq9ospWy5h14X-a ztFPbofyy+Kqr8XWHeA7K!W=b=)O-%Vmv}kB+38$So>CrbOs40G5(x8YI{~Kt~0U;mm>Fn2Xe!`>uGj=Ot!fF z7Wr0@m7`4MhBr{+K?9mgOh&b$e@`~ws*{z3RdkZ?Ugl6s4z#XB87wp$2zlf4&O3mM z_UsS-ZbF`^^X3$crS&Hh8xvXhwx6>A& z(&^=8RL;5#J1@FI1k1wG9<9dDGAXHGBT)s8S=oX+8A+^J0M^ZodvURxb084I1rrI0 z%^%&WpLLPzS&;yD2^;}oDCnDsFauU;HH51|a&CfE&~&>5&}jvXJg)=`2pDw1CP6S0xVT#tu}?JlMy!r~ z!7V&#xypC0sZIgtNOhR4_aK=UC{asAI&+`smeu5)ABSjfiygan;=Z*& z*2G(NOGLqG8c<9!Ku?n?cAdz6-HwRddOMl)QU(aWNM}0!J_zS7ZK6!KlLycDg|kOEX>Db{3uqD&6l+rjulB{r>E?qLLO-wXr`U%YqvUGoLWAGLr*@2 zm1ZB$|G`^u;G7FE9Cd)PwsQ*|EH1OvW($AwPxoMXqlf4Iz}5KjSH6vt?LJD?d8E=~ zNqnctgqvdIM<8Dw%!?z!#)MQNK%&@sU%1hpw}On?eV zp-Z-2KtRTwUSGyZ0ED#nZm}H{_W~I}Qz$bil2YJvgo6 z9l2()#MX8N^qCYT z!6^YJ7>q#Ip5Tf$fp&cbq!ZMg&T9Kuf-eN{MmDybCN?F2A#FuQ0vuvTpLSUasQ%B3>;y%yQBGuY^LktTSD&qI)Np2lV$gIj&Gz?(dc-CkSfr8gX*)$L1_f2-L=mjL{BTUsV&$Q+p( zp~wov;aJ}7o zcd-4av~6pk*PSWD~BSPjIN1_CA}upS=T8=>>-#$}brW()g(PE2cgNgC;} zX_9_RYg26>tNa!n8pYyg73kYk6@SyjecEE8rR-mJ^do}?; zhe1iP)LqculC2hWNd{?>>zu%LD~3=RsL9L7Q_|Js>m}VGJV3$Okxdu7wu=m^^@WVg)Bj}8Qzx&{) z@SeZKn@oiCchNxs((aV*NGuB0 z_HC2_4Knbv0JurkVzTYbp;%-wwk}vnTd1O2CW)DkO;Qd=G+I zX~VLM43mmQ$81CyCbE*uz8NwsD>zzY9Oa<1Tx+$+Y@nnhSU1_(nkY&&#XqqyRty>2e2+)A@p-kPGoUYLfLDs#lbO@2V zajpfVofAJo8IZ`9U2wt7u`+;5vQmN35_n}iLl|4rBKv8~GU+-Tq;cf2hw<$5cj3Yd z&cWyIdl2WIbv8=Hth9Y4BlUWtg~uL0EYDsol(BsBB-*Vysw~n@vjz4T*2#1vW4s%QnZ&B1bxf?2^ED z;u%tBMhC^I=$w9pQ1=r$ZfA`n8=kB{Ppnu6CRkj{x+{b}H*pY`|!GZwExrPkx zYHC^;J2LESGzNB`cM)!X{Ts1k*DlWpu42HL=&WO$D|V-D3G73Y5MIBCc#6woamy{} z>AsSgbZvAa9cA|j!WW+X*rbt5(ojD*0b^hu4f+N^=0Mm*g*^In6EO@AGDyTwOlLZA zs9|}27_ngar}Y7CeOj+yW95Vvt)*S%E%OKm=*DauknyJ6-ZF3jXI&o>_A&64n|nJi zd_SRw5V8U7-C2t#VBIy6U3BqVVnNG0HB*5c;e?+ zz|WLT+9gHjGJ0qBw|zz(`>t6qQdB^wPe?NZx-~W3YJAPaXID}Cz@+%cg5P+XeM^2GzNqwgZ zBvM(P7{M`#Ccoc~+?p!KgwrJepNAV-1~o;Dcz0Rt7S%J(=L+<)jY;39+F@!6M(@Mk zyIjf0CI~oSjC;_-P1ijex7>UK_Uzh$G5tGXI^~!(r%Askn=OhjDD2x(T%d)RVwG7d za0#o@g4M1y0{#((I?Y39E|{@i#-7-PS39pTM?;&8d4NH_f~E5=Mmkp&V5Jz#60#Ng z3`cJ4;snm-jUoimT1?6*dzT^GrR@PHp=PSDV2OCY*ChP3SEm;WNW3PlY+!Wvg$FEz zqYiaQ;x4fP#n-T3v;Lm$nn{%;e@AiMSV4@PYilSZ7ISRrW@-Dlu_>`FfaKe;5w@ON z-L|z_Z2|y2O&5l?Wb*r@ojL9MaLgKhvaZpgT#r9l@;agHNZRR1``gwd8KB2$=7@lA zeBy)n*2n%Hi^T$Jr5uX+42l&3pv%(HRl2#d)jR>lBcQ`>(CsE#jW#w~9jrFmSlMXf z1iN$AS_wl2*yh=%P1p1Maq7x(3P#vIz8G~UD`!gfF{fD2AqpJ=4**)LE zdZ&jmJGgc_SlY2mI;xh-C9G|%qgJV+-D*qRgurEElQx14#z-vQZ1X`I)$YmeSoS^N zGktsmK$~u(Ex^1IyUj2bLy{=|(01@3X?~YZqgt&>jG1w90<mMRlXfz@If=dw zx+lbBtLPP#W&B(L-8yHy24f_@`J4XnqWK1b924}&Zs{SObv;DHkxfTd%y)Zy$Vnn_Abf%L43phI z*A)F~@srJRXA^Vez=>)DPS+msxlBA%@Tbm0GWIeJuMvQ*!|9s9eV9IqMlEta0(!*k z3h8Gi-)Sy`x_?O0h_Nz2fBUX~LN$|-0**p9g?t()r1&?xODhQuW3qx(NI_zg#1#-^ zNkRl3MC=*om&7<5oh};v5e~Hn_~PSF;uMK-TpYkbj6o0v$%*7K?f)!3GzH|Wds*!g z3v5NNIv&%~*OiEGg!geBTlrBKvy?-Oe9P2vNd6hvYi7H7U(A7CZQmOR)|iy-O<89f z16)VyUF|SFo3Ru#w`ObB;ug_bjB*S~pISV+ps-!eF#vavTc(_59LC6*q==61l|&hQ zpKjfIc5ENl)Vby7o~Sey6AOtDqOq9GWBW0BNA8nw&p3ZIN`6OcUHk|EWa|kLa6Pav z13BSA=i=MgIZ@GFEUx16bh6BxFQ7|@Bp=Kvr_k$=@K3Qp)@3(x{Q}^2Kv))7`H>&w zh+CPTE@o4B-g#%^{G~Z5oT^j{C}(phNO5xdC`vRJy{QvAppei|sT zTe}t%5d>$XTOZZs|o*f&lPT}?HMYYz3$)&Zthx-{R_&YHDRmFvV|B~6=j$4Is|$vi=wi0 zjD=NF5=L}Z34ZI6L8l`?=vI9lD=Vk5^NJUtwr9U2&*lhr;$|TekyHZEsMLfhlT5PZ zr8QYpRp-+Y=Hy#2%?VX6tXwcI1V`Ev%DaemM$9YJ^rF{qffCaVq{_s#ZDLil1ZoJ# zZ~+_s?N*N}CT)+a71A0=rqU(D6q9?BNOn~n!aTci5+@%12KviSVdr8ExdL0tjxgx< z(d@MGEl~X*lcf&%-~xA1 zZcN*kM;5D70=AaD!C>htU1MH3%W+QF=<4$eR)er^ZTnx51mU}`E-b_X5;KiD1JNeveRK(noz zw2$r!tJ^@5dKvTvW1Kp59FITogj7Sn=w&~SeP^AE;jn{rO4~c@|7nZoQ)?}J_>-ST zJ-q`5FTVnx`t)be8)vb!=L})KB($1U&SYq&fgr6S2!P0@rTU49^s7_1jSh9-1{ad!;l@@Y9fPgZ7WrJ}6uo$f$@tHePt$xi?)ndutMCQdJ}p;Rpi z17D@2mBs`#5FkKS=R$!DZv+hx2-`!y+ZSf&dcBTDoxgdlzO>IEdYM(tsazWAQeJ@D z1sbo89gbjU3PS>7hO})6KI71bmDEoO001BWNklu-6H= zBE?qa1E~zBZpdd-3Lxk6GY~BXFI(2OFkh>o(`^fL4aZBSXR;dBN+mS99aJkdbX!dc zn$+7JWq2iEXD~#ilE>=$26BZ0n$51PM`yEyPF2F)1Z1I}iqTB0NXE0oFDexMc56T(i{2x4v{Y_Rg1a)`jQd z+)JO0`F#h3rGR^yjOS#~7Vt8`Ct`LGDh>fSvXH0OZYq$f(?+x2!20@W^u~D{xZ+x5 zN>!xB3Zi$d7*s#GDrecg!v5@F2+lb-+kj3L!8)p2g0@d4f4s^u3qu3d;`Etlh^r)L zuUmnUS>P_2tpm~zoi2+>RPXq?^ZcPf1@1(4B(4o&!56P@r{`4Swo)YH&9V33=%i+u z=op{}Y{mdRE4VZ3^YE7X7+YyGJtK6;^|Vd&?KZE;>ok|2#zUX|5YTU7$L>8SRjSAp zi}D`>&2nD>?6Q@24`l0PG0N%FYdF2OftA&Dk*iE1HTylh`b}@c-U}~Q*(XU;>2ri9 z9)AK4JoqRUcJ9LB;sR>53JL=LqCKWXd6X3lER)fcKtEenOrpwOaDg4laA6b`pmA2% zGpya9>Zd!==27{1l{j-1(Zqo!vcvfe&qdF zKlYgDCS|vCEYyq>GYCfJ`%DgRc-t@GoM&C^nU|95Wtv&1K7nIkroF8M2g(R0?XTi& zOxnIl*PWVj4nXZ~W9#jAqCyZ( zuiHD$F1MW&xMLP3@c!?#`3oeA2Y1_ZnEW$;EM^K$n!vWnoe15YOqd*#-gP^&$KK&| zTU!U{=Vc3dv)SCtT6gY&{nwFA8iJq0brZjmtO1`0w?ZFRB;)|ljg3`&=PO^psIe@z z3OggP*o!tNliRYMrM+iX+93-7S_%wuQtYN}wpHh8@QQn#g@=79<{ z*}^*K*n%nZBq7%ysQkz&3lN`;fAfEAM_MkGWFHzkMwZ3f4y?!Hq)R<)Sx2wBW-xvvMg3( za)5hRI|igA5y_;2GV7BiIwJvTg1ZTfBN&=s1JNzC^-}~hc2Uk3wIz9)Mc*pZIZg&P znc$_s z$m566Yj;s87O}d#g8If97Iy5Bf;#ERk|7W~g)9paF_Hp81(56fbF$d-m*e4@l*BE4 zij;Pok+{lWB(}3KVY7IK#ro|gx~&%a-IjDYVcdguBD)6AS7L82>Rrwi*(~V1P{$p- z@O<3z(&yvjA9x?W^!d+;y)Gd4Gy%{YLq_x@=O8C`y)sma#Ia5cE-uB+DfEZ#*&hO6VhSX{Ey+4kS;0f(zew0b zu{4Xh1+h0T!?||7Fw`4`xAVujXOP6T*MD){7L$81;j6Msp3mEFCJQ6GTv;8Xpt!%D zE9g;{Ykgh`XSsqd0|kXPC*xrDByp7#&AlZB^*R<|jGo`?`5+IcakJ>!WPncoM9G&Z z5o4c)-_6o3)9eB@NhTR}!fU8~80pC5btdmU#`^jy-t@+w#(I6j0ieaQn@AuSz`^dp z-%^k}9-~|?23aoRZsb_mC2_fUIE*O9~$21BuV?I)bKaQxx5XU$7EMqV=l97aWe zHm?TUPQH^Q&}G{95&KeP+e~ADmYH?njA_@gvCw9ujOX|bL}JB^V%r=0vt!eZCF$HA zNismc`qi(-Ti^QD*!l>^upOT(Tu;-$K$~4-)|#HScaqoHY)wDYJ(PUr(<>{{M={5K zw&gc%Us=A$R=}*b-?Po*>DH>rV=vo6eouAr!J{^hP6PbEIFI$_gNp zxfJGMI0Gc3$Yt^vj%d%Zm@O+lBlAvdRZk3&;WaFoAMG_`0MiZ-!$D6vJ!I1b?M&2d zO0xIEpZWs+^h2LQPhQ4IY%}qH9k^QZToOkN{S7{Sr2F*yD2Z#}t7vUln`CADlG#rr zWkZ>2d*2_cC&XAQ?HYES*!3J{Cc-dAY|=4V>h!nIZ@Nk%GaI~mc3FFq_wwwH{n%Km z7>iJHB`xgZH5n^qob;`4c?({B`|T1_Us+kf9sltTeC5kuk=UjE2zbKfh-_v<@S2yE zHh+$hPoCS^6P9cBAfEsz zF6__LA@pllIO|?G{R4}0>N|Hud~RJC5MI`&>sUr|4|c?n*tmpqhq4|zsREYHJ&0Uo zQF02_u~x~HB5=2V)F7rOvObDXBnqg5_)8eS3FP2xsU3V1#Brw|@7|ds@ri-dWZ~Is zwT0zm_e|j)9B=JSd;&HEFuNSB0TX6EjJuzgKSAm-9A1zmcLFG~T-}^m6e3)9vo+D| z*)ly9)2~~+4Bm&J)~WI=ICnF9*ks~n_C@kL@fTS1YaLJAy|!zkgpW0G?O4|k<^>f1 zP3?C7r~eUOzw>=qWK1NVMY)tmsZtVOm~v4VmtBm4u>^L2A{kn<(H0UX0-#UV+c?o| zqme4$Km5`EgF8R=3H;9Q{0{QDf)uP<44APJ8=J;}NV3yLEj7T8U4I20dU_dmKl~J$ zePvE&;dP}_6P;PD&7sj~U~yql^kb=5#?wcS%C&i2vv(=?EjBGhd!di$=AqN+$noWJ z1*KA1rcS_FjH9XN0%-uu_@k(fm(lfe(Y__-(!y4YRHVo$A%o#is- zt0gQ}igIv)RS?*`c`TMc>?G!Ls>^Usv5Kj3F zfZ2AZGqQ;y_3rh$!@&4B%rv9Js|$zYG5aR4+d~^e?Oi23OxhmNqXberEO^ux8x=qX z(H*tno#i36g5^xoQmlCQM?QoHKmQq2|3_g!k)7xS0G&pTwmxlj5(P*RqmpmXUgo}G zPJ-Rg1USj~rMBk~P-U~%$7;QSQ~eRX`t)%;d~y|O#xLdB9kC<*2UD#HP^86dP3}+H z)EZp1Yw6QPk)WthG4g>dcj|UQaE21$$8?>K{0UShqjLuNR61huKQl03!dSXw4NYCS|fKc9S9n_h3rg5rLXH zIAwj-j#G@cn=Cck(0mu0&uOyOPn@5xP|mnGoU>6?07YUkDF)PXwDWaNbzZHTT(o=r znviZY&I>S~A&lh(`$^t|q;oZ19?B5)L+oAYyVs&vy{El*1GbwiwRacuG5jM&-FRdz znQvo$g2NOs4n$kwMdzP`b9dEHETmB?Sz8ncAj;v zbh;<`ic=&(j?^Sf^nRku*W}*x`(_Ja>`ibl|7~%&-+sU9d)0mF-j~Ug3EeTR@MOwB zHj5J_{Wn|JDzF0I!5BQeml{fDl`n}{{In@aeeLc~dubC8o_MgUUByEjU4^T)M-M{5VFXrRO^}z=^hRiVSilz?k5ZR^Gi1TBnbryLJkL<|?v70@q5y5X69) zQpWSRp0H7^bo2P;+87T!`UK7_WpMuJH1_YVV*mN)W1fuKMP+|x0+(~?D^m#cWk%oZw0Wec(=2*8j%?3g(T z5Fn7MM@Ek!3kHDGtEchElTTv3)x!&a@JF%dzyXX#+NQ&l9iO}1>fx_Gd>4x43JyN| zIrzqd528?=N42tmey1mlz+~)QZ#0CRjr)rrR-W5xchKsPL4=?PGT%aguiU5QqB4b5 z`5dmrHrc}nsvsk0pBp1 z&qQHi4vl6Or&BdNeEbAbWPlmv(d{0#N3&a_uu-R+}PDhODG>t7i81OSpo zyV;ig!0QpTE{v;=t%K{%+N3j3!#yEP;|xNPox8=>>TE;aN2|@XHWFu(08Z*V(H)~9 z3PN2C0ksfR-)ywdSXo1})5nW0y8ydekKn}NL%8tF-8lQ;1z0-!B2;$lQh*Beg#eBS zE+O*A0XW3zQpT!LkHF`aV}kA|0D5B;opBZiF1-f1%AB-IQ6?D!5V}GhE7%c*?y8oZ z6)3C8tw*W$H4D*nqT-yzH1H0lT*f(riJ0|-6pS)I-cYu%LEKI@=_>+1uJgQAzD;f9 zbf6Pj+J-9`9NX$r{u+iYnXX05NsC`DB@ECrbz5KqOgknSxJw?h)%SM11>-`ebF*`& zf0umjG3qA{_ab1Tx()fhUDFJz2klP7kZAb(~&b!^TEa z*q~WZ*d7dV^R5317hZL(=y`=|QAVe+v9^ZqeD^UFDm5(5&tY+4UKlwzA_jH|f~JE? zSx$MO!3S-@s7qao^YnOSzF;tw$zT>oa9J40P8gXP94F|Rtk2Yq)R6>>5m+V;aZWpb zuoy+yVX4C$n~!VHB=)h>`;-;Jwk(y)THM2c8=p~&D7COo1MC9 z4KKLq724fqs`)YrjFlj|Ilit|LhXNN6DPn#-nKRK&ux0?6y#!3-qy3^kwzxHjbl1b zKX3udX8?e<^}kghI{cnM0&Pd26BF$X$3E)jD+YjeRo7-lN8vg<*!^}v1chYAtF!gV zrvsA1>#2XH40BxU+m#95i@XWXNd^x>J3VQGYw$Aif|BQMC4$563+V{n?x4O0D2M(8vd z_Z$mb#t6g4yzL!t$HPw?!*BhU zzr>@D9Y(iD#^z;=1|6hEET*d4(i!`)b58{)R@O1MW1ld>Ga)t} z4^S$X1b|5Mod_2O&M8OujC?l&MrGjy+52-@0XxecNK1okm1DvnM6d|~Eo47nMc+uk z#k8mSL)l3?v@76Z%2fs1Qsyw=%MKsSHti(^>Dc_|iv$ob0g%%I#Y)8&ms7@N1hAvA zgmhZ%V)`(&*(v`lC`q}^BqHMn)b;cMsDA|L!{?A#z!<5l%2ivJl&1pnk?tan5z!TO ziTw+{XZjvJuzZtX?T&O4$x9rF&uaiWiX~o87~wJmW-~sdMJwq6Kw$ladn-6=|6Y9d zYv0DX`}bq6Qouafm(po0FE8V%Bd5@9cTmm~xIRF=zAm+J?QR>{N(H$B3&iu%7Mp&D zycbXxrO_YtP%f6GOBtD z#Y6+i>Fikx%!^8Ka#-Y-eD8qwL0U}BVwD=kZDv=sAh0u&15k1tI33pq7C=_{?X6y) z$c&_4Anm+9vdEO_r|8;FuK8;U1&ewBrk}ilX!(J9Xo0H7@)<;`ceKjNXHNb-jP zagR4i1f6As_E51vkJGgPwhMrkSC-7`1d78a!luP?g5$ziPh9WB=QH_TGEu0u0`SyR zhwzrS{2O1qEC@pvNA}a709A`^C9P4l;EuMgfs5ldNMw&h2{W5W1zBsHLuIqD#nCq{ zm0~Q?;oKz?_p|21&fyq&4DIO9_OSCputbspdfNQjXLf$bcpY9pmLw1CGLf^s?P;)g z65vS6MCu>Lal&Mz0#3A}jA%dSGsc0{j$u{qMPNr3uYBbz@s4-ABi0K1`?ayAt&f-u zmUyPE?5L#wx0M~7yxz1uwADSQF+f|KAkt-BHlH#;Yd0b?HIl4B#i;56 z^$DGhazG2(f{f=$w=#Cu924Nh?qn^o)BgGHui+2>_QTi^(u)ZADteul_IWL*?_?dT z+>$a_C&Hreh=M?MOqQhy0MPE8sC-b_sR{IeG2Std*_@gTHlT#rf>9B^+9R<{jK#`A zJ(G;n&)5*=x9AuR+-)(qXl>}6>wI(WC4M5E+;rZoxceQy_=|YO%U>bi@p=FJ&;J~M z@t1!kc9smu6=aJI=hm6V?F{s-vMZ9eZtg|z2YTGuXJHH}772<05=|dP%G}~&Nxc&8 zUz6n`yA1$s`zIN8a{17tEV6K=?H%(ilK!y&JCOr5$)j6ab>^toLuu5(?KfPHn||;m z!bHkAt>dUdnqB(1MzR^?GxT>dNErZHd_q2tlNXXNrqAIX%s_}zkVvp7J3Z2lC-DV! z|3GrX!kU-jF$^yg5I;a0S?oOTAo7)+^8U3z&8;bC??wrFvn!)D=k-cV0Y`tBPaOKk zUf^zGW9bz_;L426;A~qdK#0Vt-}kzJZJt5{F)$#f1|ZyGiH$J{fDS^y$-s<(rvs=& zU_rPgGGV>jQ_nig)rnrBcoXKb3< z8CkleJwrQ1x8QbWhk1%LM(MEt3cvl?kKh}3{tXt3MPYKJ|68thiwcf-^vn34B%j_6Czl8tu5C0TD^_th>`0?XHq-60?#*m2)2n&O_&snU% zI0k`A?0`jvV&X>VlTs(MP=fJ_N~t3F2{O169L4yN0hYre!bny}WElL6fI0IK_?xmK zpUFSX^8bdBXS=i)z^UmPHuM z+3~*3CgU8s$JNeOU1sC7`H;?F&Iaf8jp>xn$Z@^=hhBzXdDpLEv0BC3|MeU3-TUsr zo^lpvRLfYZl(ASXVWCnKqN8%HifXNjtn1Q9Sw{xw#(G0?ef4%9G;5o9zE*i%A}7sOTGrhMn1U~q|y=s#oG&>tiiyiP8UjCB(lq5 z&tWz)uPN+-T97tVF2$356A$3^Z+P8+aa2t`*9F`4Se$+lJ2HF*i`>L@inl*3vf~7{ zd~UIM8~2307er-(*pSVUT9C|zIa@)xKTy35arcKmgonOxmjIwiX^_i}QDmHqd8Tw$ z*uDm;aCjtaz zHx{R-y=-<^me5bJT&X;Z)7j<+d+@27Ge4u=c8r*3U2?*wUcLY4V$5b^Cqd8>+lmnb zXwE6L)z!C(`&^OD7tgEsn3VS~qC!8OBlelgVW}A$U&Z!!2!Q78eSx;Kr)j4p3$ZCz zNd!UfMQnQF3Nj?END0{*zl;1nUAxW{wW(M3VHb}O0yD8MHTJ9PExs1*8h*ZA@GdaF zGA%d)-C?$`Oc9YYb&(#wWCrTw<$P1e~{mJY73hjap&+b z#<;oWrBknC5jWpT-Q@`QYWhiw4Hcv4`XuW7j@UJ_i@8D`H(qcK&RMD=pGyfLVmX~b zC0|0OkX1Y(v(c_|FJB0W5QSWeq#}|}O*`T$&9CGbHy5HnXTw`JAL;1Z5#39@&38uv zSQasmEuIX}jO&lHIn;+)Jpb0)aryIJfHr+;c@GgOl$U$nUJlo5u>Z{D4KatC=s$0H z`6U(FcJ5pM?jt+RP>zvJA00beMhD+SZe#rLgbU!moT+5O6Q)0CQWu9RF&swfYhU=Z z<`bPy5`HO0A77TE_IGz`nNgD8&U(O@?wrB6H~n!pa}(k(fQ*xk zNA5)}(?O*+k8H7wOrGpU%E~NBf49*j=pz*ptcG_Rr)W61744|C^S z8mn}X)xxpJ1dNb&=mvp@IFN`Pqo0KiyBZp7a}j6`@6X$66W`FPZX5$o7!daJANcDt zWtIq|AaEE&5R(9CKitH{bWMc((wj)gXZTgzaCh@!mdh5`3U{u6W#S>pn5YO{=4UK3 z-IXFULX9VXeMt%E*OA#qQ?zJ8xDNxvD5THI6BIU40`L!s2_aDQ99i<3 z&APU98x93XEevkm0XhW5k~xixy8;#)3xIaMRz|g`ZLKID`#rXVBr7tL?F7+kHJ!BW zmOvq8NM9LB@&&A~Zpino))0+W0~_5w8m*=RIHfi0NI`E{#2>!@E}U`p`8asxkA0J-DFCgYKoWYm8Idt1vBHF;gjvL1%LzA*F=fYNEUq*d8Q zeI4Cl8v8DJ4$6x=mAQn;6L$@nMAsh797^g#V`Z~ggV}is1XrC#+s&k)nQ>8BXu)!t2gyGJVpr3!FeFHszSeICb~frcG!; zT~8D`{k){JY|iLr4A3UkC(m`$zXd>AUePv=d4}p*U;WhU#vQEnrys*(cYhqiUK2Z) zcB3?3MWIZ9R#9v)+7nz$EcReAAQL*&H4LP#uC8Kzqk)yx4VBm96fU~zxp>hnw=1hN z1FWo`bj+I%KYj?=LK#cK09`_fg(hPStBnmn zx|C>JqdtMxtSru`p4FfT9e#C?S)fE4SQuIb%r}xknJ$^NDHlXWHIONmP|W7>@V#He zx9<8FN;I$8x{ywu9$=xW$qsuel`zp>@IJB0 z2*0sa&Z+z0jxxZv3szZ8pLR`hqBL-H?TzqkJ(d1;!dUe$%>_AwK-lE_3|)OcQ2#{X z{lY|ec%9_!!*iysAiHDCzX$?VJ~Fz=;+tHW@jFG|d#HT?64VR(GrYo!g5&l+B|+^D zeC#{l#EC~9KrNTTh#ib1DD4>Fh2@J~np_KH0-%}5GC+wGJgDxJe3=UrvjCC%l;C5^ z7P3LFtgqwHQ%~c;$By8Ohnn0&p8HTCh7>@W}JbQht8X}PD}(tQ!cU~hBh<7zC0$A zVJp3{bf=NsB=(0EZS($~jblU`Ty=sLxzOk6i(F#xQ*7c4V;t=Kp-dU{ZCKbTfqXK# zkTr@nvwMD)C>}ce6f&J)uIF8L1%CXsZ;&{d=@A9y zMo?w>+Z77Zza=Z5ljgpp-CL3|!Rc{qlgW0UOwd)O|8slTSd?Qx21~3t_L5j4!reVc zBE@7;pnoRB-$dbbl0icyvFHtJyY1piioTAnsIN{7H6w7dejn8LXvoSyG){|a{7*EG z1F5hBlatyBa6>3s!{?c%Bb->23q@}^XIhl>?Qh?Y|NWQ#H<1_eIg^i)Jc*b~llLd9W1`ok&{5}NvCc)A2u3Xz& zed~#*%s7G6+G03BQ2H@|px)7|UCDp0UE=*XVlC&+Rz34;?^Q0lrEa6bIiqnPA`m%Xx)e zBHW4${TSQ-w$_sc?LG!((JE(iM6x@=4JX%H2r|)oPWoV?F^uKYYywvZV_iLXrgT>M zA7Gbv{o1>5!wolxO-h1|&wlo^xZ{rhC~B*R#m{2xGVe6boSy*<0DEp|b5wa>0KDp<#ZZ*Pc%EE7VecqP^g2rx5o1|1M;^*G>7W~xh zKY>qv^uzeS-u*7@Dd(}fT*U5b89T~FEY`}Ht5#55m;=|abTSruCWS_Q18v5|8f`SY zL-co?fmgrl4ve!7r^BqClj$=>(Eo%lwzH;_!#aBGsBCi8$BBZh;9xHY%uWvD6G=bW zbb+%kJ<7o`zIyv4@a;_oP1hL;ikePnse@E=J_6ECOuyNB?r0ryLg$;B_wgC-o1oi@ z#V!JZLX$)BxsS(2tgyis`~>rDu?Zc12&gr0LH%p{(c(4zPVIMXDN;-e^0Uo~4s6pDQi4mC#OYz@QjOY;W4tT7<`+Fm|v0wLY;G>v{DX zv$sO+6au0nXjJ51#|_H34${1u#YNOM*A;29Q~gtYM-q1@*`LIS)!vodx)B^WUsmqT z_`D<6PU2c0{%W(Qmj_iU*DbX^-* z-R97dDF_*$7Lp5DUjP`FPFqs+7lE$rI$<10=T+CFtryX`jKRBSlXqvuqmIZ^AYBxj)hslr|5gpjxLJTR7PlG6{%;L7ZG-7 ziI=m;DkUB2r5IJnCRv~`#E_WAK~JzVjH&XyGf%<%F3+c5-ywm@hz0n0G)8Hh^#j-A zrMKRW9+Xv@_$_6#j_<8xEXDo~ZL_2=H0c=yvf96FBj|8=xG)Yh%`o*cI+EWpT;nF^ zOjXI@@yUP3PMGyHQ?BZoL zNfSNhj7>G*gNF(JX*pAQ^={KmowS)Vxy8}kv%>)z4}TT4Oy4s=rzL5ofgw(YEh;k} z1q4i190CY?eGEHI^gAtdnoThtTjL@wc*(0o=$&!kTmieWT{T;)3IntNsF+}49ExnF z40LGaf%eKyv|;wYH4z>Pe&r4a`ehlLcwbCaEf=-*Z)6WGd;S)g9n; zcZ3I)$9Qn1kK-p!VWZhVzF0ynpTp{rCvd~1`%yaaAkIJQOzb`9Y*gkJq}6XWuT0R! z$R|RPW0W?&9rQYFblVMd8V#(RI0-E5!@~Jjxt3JU;Bt#Sa`mjr$|)ho6|KertGnC@ zvWxUA0Z)5FED%<~{?UI1u5m~sCs#3}WGiO3sO5v4WkyIUg%AL3t3MPKp%@K=UfbVS zTOa9zi9w;do|QDGqme}dDKw1SXp{1P#t@PsajRfKB(m*Dm2m{Xd&r&#r$n!h!@a9)yao28{2g;@%0ma!I9(eRHe(#U| zJ8t=j*I=d9MLU&8Zk$0OpTc^xi+ZcBZNJHAna>LA9Rbi}SsstHm2|aIQQ4Q{_kHvk z_#2E+Z?vVlx6c;g1fwxgmCK==&0?We!h!(26+pq{pd{8fwyq}Q_%3MF5-2PH&NPJO zjEs2grh<5zy&l>QIM!&k(dzcmVJql9E1**Xissm8mHuGI5OZtuz~#NSnC*AC2I=rL7AT(I>RtW*6SjOmKkN(MuUKL0^Dfi zDVrQw1L*{bj*xbE1YwNj-7~0=9u08l-mhS;br>&u&IJORsg*1E)_49t+TH}*va>7` zefK<{speD$NCFv1Aj}v7B#;1#fHtU)I5als~0(Fc1HWE4R$Nw zfJ!SZa1|Q@5yBjx$W)c2QdOy{Q)k-qeEa=|wf?ov-shYO+|3iJYVS4t>tFx>jqmq< z51_RFYCN#IiG!Cs3B}qXx~L;ts-o8)pf~OaOWSZb#Z*}Sv_d{JCP1ClYU)T3bWDIQ z|KmC$Yc+}`>9J_72F>M9?C;0W@lL(GvuXcpZhY2q{2r3ATy=f7PZn4OqPN>EX?;#z&I&#{h7|(iWnVC` zq;0_&Jm>G7ZWresdkppEeR$oAZ^G)Q{u)<3?M7U2`6W1T_%NzV`#@lPHls{|G?GOh zN&rixj?iC0s zP*Br1JS0j^ioR6mNCNjMr4iW)A}j+(-^96sE0i78&sBhhF`3AH*}l~gk+B|7yWRr_ zCL!%wE*4X@bbEsOd0<2Bn<%_9r<7*4GI2+DE+}wDqJ>wwSO9cj4aAksyPK^u6Fs|Y z=ADn&o~Tb+4r>n|!=s=5I3~j`7MJ&)9GSs zYZF_|4mP(s!qU$K?9wGq!fSr?C#B7=0H7r)%HZ-Ck3Mz=IRc=U7Er5|g?W^6N%o)t z)VQvx3)}`$J3S5@djN&MGr%j|Mno>_HsQ4hnv?&ABVmT)ca$p%g3}@!I>u7yCr&Se zQ8A!J>`vQs!poE!)G5b37z2>3+Sysj!*pgA0gA-LMC5CAxpp_6W+?EMMhBMi&BK~FMs}R5)j)9 zI3o-uN;1HJY>{6S0iaEOP#*`$Kev4nK}jcqHks!E4GnUspXr}uAWUUfI=Gx3W4O}i z9y`MeCZI4%#OuP+OQj6HZNaY)eWp=V{kYHNvdC;pl~Kw%>h0BJwM4;dEj0FIsms|Y z5E2EmgJkCn=@n6Df^f*<15h#$liffJb-op=l6OY{cMJ!|~W0d7t0KdY7%T64c{1yfu z`A-2P5~R#BC1?B}S!KQx=Al7ffWR!m8Vq^@>|Nh#;;~cbaPR#muyo`ge)-pb8^8bG zKY~C0%m0aTK8t2+4WmvA<30f;ymSeQrzfR)RxlnxpB zVg-$QNo-}YWoiEtP@I{dOO_+rbp4SsJ=?e`AEsczn}H*^ca70P3PWgPm&yjER3>NI zBAjty_$jcnMpue2c~eR139|-4x!Mku^4yCk(1o7tcV#m{N zKmMFgM4}qDb1X;=@q(sU75nh4Nm=G|hrGCKRUH z8HOJgzpw~`_IruXHe}ZjcIwcMB-~;mk0lAA&nx!kWGV>>DO8kP0=+cg{KlHFihu7b zUxL5?^yl%Er(TanxhQi~tPrR@!F?xAU~8j^1H#BO!Rop5D6x>7L08_TR7H0<5nq5; zWr3xDnx<^0OTR=r0?`*LvzrNl(^8Pm0(IJ?eT@1eiBU~@{CihG(BpmwLp~o16bXpR zmod%eg$au9M2f)$^*qG5Ka{o98x3&HwO8ZT=ROU8@;kqYM<09`wQ3cG!bIK+i%N@` zEJ_wMW&%@eLn{iEw0k#54`|!%t-#JouCpj z)JZO*ljm*+cKGvHX2s-Q9J|mCFnaw+_D)%lVFd$0QJ=m+?^?)3*wM4*i;0I%TKteExT`CH&oa!X{L1l)0b%r@QfQ z|Lrfz9@KX+n*n;8O_cx_n@$O0dk%=;pCM>09!Csxa{x5s8|6|-WV6`40gyUM?3r!p z{|*yTYQDtlmFH7Fl2O`=0)4*2HLVF#wZost$H5dK7};$;pSN(leq1<5>G621;JMFz zER@gzw{G zua~xiXPqC;?_Q3NY%NRtIsiJ7LBTx4iCi@RW62dECIVsLY+X-m4efR8BH_Y3Ny3hI zAV(@`xX=qc#*=#}Bo#~So%Eic6Rr^js5VRF&vnctFF$N2{ku!T*a@$%@ z%X<>w6~S9tNG}9H(m7;=V-K9bFTd{tc;wu=+CowBt7SAS&!jrZTTvV6!nByn8r?6k zEDNLJVUb68yzemwFt`sHrTSAi963J7fBCgM@gA}31{-ACdNP}V_e}UHJ9g!X*S*H% z0{t5mZBJsb8VkL%>`++2JKy;ZJoBcT#D8F1`=R5<@wT_W4Uay0QbsAAI;=C0cAbjJ z1q9+D??C!kS$(e+=J-Ag;#rYS2{x$P1ZkkS=d8GP9NZ9r#{-OOC~HC+ERwT{Jrz6V zv*excsWb>=``E%gsk<@hZ+k~O7Mug)ZU^6S&82wb>%SWZFS!I+0x9!lA^i|S7%7Hh z9N)TtNq0u>H!T+AUXpd?|2adX0Vp;6qciD*RFan=F$X)@2yqj~m;s|&1X7Sut~beG z#A*CS;1mJX20{Y#CY{H;hx*K1|BwT|D$~&FrR(95EFhmk1Vw zEE*~!6QVd7iVO_gI4&K9KV}`9ew6T-#Mo^HOee@njDT%1AkJmTwz$NMc?iQy(cc{_ z7v@BRIhr-xWXxvvgg+4gbg09ltJ*-7zcl`6_(VsNo@PBtSO0c-Y1c3!2$#9?rsH7F zZmURsXVDFN9X)W@$MESteINFf%cwF}S1O=N5~xa10MJEtCX~(z8h_|@>G$@~Zgp{P zV+-fDS~%b7q1m6}s^{H|kACJ0IKR3ku>rDlhBlzH9EU}Iw5uhjR4fSySphQ2fLy6o z=I~mP4zoQK%00KE`6pw(d=>()=YJ073D@{;$Lwhl?sCw@u4%s<8KC3wrKO7=HT&CO zkB0jxQOFp}HnlnJ;{fBRX@G0{?T8KE;So@C&OAhR^&TfPw!__`NIj3s#(=OQ^7RE) z6OTD&g|+#L>{yFyq~(oGi`o@lkeFuKRe>1!wSm1NjLo92tur3&FSq}hV`1@PzmLEF z(4XLuFWrqszK9aLdl2}{f&u3Lr8_k{rsXB(ES-u;vO%)9ycXzcym2ZyHg?9N-Ow5I z(Q5Z`p*g^X3GlV^Yq;;+1&jorMbZL2kK|q2rIoga+StBleQMLbb^6u09C2UV;}Ckj z>4d05x&z29_Gb%MraI`_B*0@wKBeLYF$mjyMLpT}xfeyN?HdB7wM$0Wi9lJ6^%%o& z36NfMO~Nv4pkLle3Qu>4i$wQQg$f0s2NzXD z#UvE6B=uE=EXRr$1mG-Wlf+yR6GZZvzMLc7eA$grikYSu=ZhGP6bwDi6;V2R1zz>T zZ$y4+pX4C&hCNKikz8_bw=9#QKZphIAcqsSW-#ZGedq5*_Fpo$8QI6SMj|Pk9%91Q zpM`<50nR&ao4r2QfS>)O!E=QN#P+z!7-xV^Uqu9neJKg>fSF1QN@5^@xnE|K#OgW< zIwUThdXSV=9lo5fh11^j>MoPSpwDQG)&PG%fWQ5BW3eznrQSfUQbn#%)gX)rOjXFz zip+pXY}?9BEzT<)*IoyMP8*$O6YHz1m@Hj_D{p?e9Dn5Ut8`OKbs#J9SOqYaP3D1D z5w_e!RCHD$;gu}O=S(6>BSB@JU*wb-UAdnt71}|2FDh1Xph@duAGd*`98Vzp=mSZ6 zE@93aVLa#wqjK}Y%B_lajZv2f&1z$YV z!ZFvR7Y6YcoO##q+ z)m|wf0fmtOpvfxT@3y6l%KG_LjH>&v@7m`@)hUVRm&GP#kg|MF8H6Mww6+mdP)D4) zu@V3y-*FlpJ$9QJ7h9WqTe>a}W*YQy5=vu>u`;YLEybXX$Z_AEnu>q2tXL$loU!>L z1x)Ixq99lV=1*U5z7W?-IYh*iv0~+R{LBh8?DiC4a#Su(_6-9IdY3T|T162V2Mf-6 zH-QF92QgxF;;hFA4ESw7#{g)hV#-K+rQYgkjMh)0QK!tR3DA^DXo8=n2Evdevb1F; zFl~&fR3uRbaW88tm42^_2OfPCr_OHSJ8u6@>_2!U0`_yv<$49b`P+YpzrX8V-0}K1 z;K2(UICS_3N@NKWkZ2cM%`Jvubq|uMcQ^noe9D^Kbb@-dic+C~S|x`@DTi`_jAaCC z6a{d~eMTVKU_8az`Z`+OAqZ3+5oz7|$y=Q9FqB{N)>M)h=vez$A7V=62XbYey{ zmWw3;r8BV4V2wHh+}oT-2{mbvjWG4IjrC9r5VnV!WC=1TVD0{|p}KJr&wu%M;pEv> z+;HVpxc94H#J+=9;*+1e3s1i0I^-J-VajiAZb)K66`sfg=7n zl8V)WFi|MhqfoA(P^lnWst5yNy;hY#E&mj-d#Q}cNGsoH+z|*u(O;?*1$0AJw+V(= zDwj~07ErBn{s@X5p;0cQPgZWQB{{*xx?W3U-kXfHs-D%86J=8*SUsCp(8^%QHta=o z+Z|~M%5}}QgyYdbwi~ZYW0Y;Z6c|##aHR9xZZ%P`nSK{jG0GAC<3*+h~M-O1- zz(M3oHQBoaP!rTW<$x{m#Qms&F&f1BJ&zgmdYBCQ!dTsIwWVsm-y34#Nl(Rr%dd$6 z&<5gHMpi4PG20`q;8ZyiJ0x`6jR9H(pq^=hGqTy7p(spS3YkgJhTJSZ(U)d3xhC8e zv~g+_33SKz3v1p(`RTHKCwabIqc{LMif~*c2wGk9c_F7+372c1{i0oiaFKYAf>7~O z=^bOIb2nq*+a1hHUN32kpL^gdIQ!*K0h2yTl{y;BizwC?M0T;`fUGO)G9b+5!d~8& zKya(oM3XEI?H*bkvSemZSUP~$zxk&zF>q8=8#bNd^x5+$ma5pdvM4RVSpn~XV`rb^ zzn!gFLB}?G7Q~9|->d@bw182&9`IbU`1e_OL-4Z{G7w;`Exw)Ef(&{d$RLo2`=9dC zna!Oolrq{GJqVDLq+<|-5zwJCA6k%z4A4UhhI>$n_m%*Be;`2(UWfXK<0dOTf0KfX z2|;{hk0)4qtjX-j5cmAuhp_hWHw1i0y+zxfz&Wjcr)WjNAFO>-H zJO)mr*X|`8ZcE|JD>#+>hV>4<-QZBl*;&-fAe;{=YxNXFMa*E z*f#Cf0#1+IBEme>ylu@lLqP(;Z#ibgK9KHnEeh-~#4!PR0bnd8>8z`~JV?ukZ zATpEwDt!VnP>(FmKzS#H&md4n+5Bka(auuafXw(R52cWAOy*2Jw-!~=CJ{zw+Gk|e z6s8I?5^47*zEKugDkwv*#pB3ENc)f=XukVAeSoaaWxwAOUEB;h_|;Bz!Ze>lK&Oje|#JhK#EN=Fh8Xao6d5tH5s=Qh_d+ISqdzwlZ3 z%$L7{gGZl?eT|wFSCYw!0oljTtzm1kiRHybY0>xSiHC9dC6{BG8R7KftEem;5I_V0 z+4R@=9?5jYjy3F9LLgL`#ie|9#-#Xo(*0nHUZ*RdB^J*0x@`x1xK44_ABn_!P}>7lDx;NYClFDg?g`{cD0p0^MX|VTA~BYp8e7zL ztjC-D4u6QGmbEc;5Vw4@arBJI?|@&r2rH)AjQ}qRAveJiMK3hP@=R^%#Ab zAN%Ov;XnVUUsbs&59$oi+d(0IZ70@Xl7!$1>1Y%rof63-?MWSd;%74U8(TY+VPt$~ zaRTL(7Ye4YyIo_?{zm;$w(;(vUau$E@zV1hCL{fRp&hrA&%)n)tT8}2ZjGCMAAT(d zWQ&#$?9~t?$75dn;uqt?AO5i1!>_M@Y7#Zcm}*v)C1&MqW>p8>e*5jh0L{4#KM{D) zzWjFkXM25L={2&K^JdNMUe?1D5`iu(TP$*RER1YfFzt6_T#Ny-tq0d_smMa4k}^TlUMtW(p)4_f)B(`!U?i-yX2Y^;D~pf}5TF2J zWAqZ0$Qb8X;-TV$Gr`O6MpG%kefZ>Q{O3RZ3mkj&jQE`@->pNXGmk|%3NOr`P4W_h z&UDYKJ*^+H7yb7+kB>Tmju#Oag&lE0V_Z@T$HlCF0lHT{e z_8d@=)G?~NRlS-vbiY?(6jp3)ENVxN9KtWX>z8oVRaZ)!k-!PsbMN@2e}~Wh(`TjN zQOz8kDFKd%eXk#R?NSJ-V|O1V29vn==pY2HXJt~;r5t;V$&^RP>>Ka4*n)_yi7-|s z*RwsOY;l2ZjOI1zf$IF~8}Mfhee?OaHzy0y3oE;qGD(WHWgun7VlurpzWez%;I-d% z2bK@)N1lcKoJYC1GHpw9Z2BnqoW`Yd1?`As9UUb3?Ok}xjX%V8 zdg3JWCqnyv*6otfisWM?L`N#n67MvZdGp_bpBg{<6phA0;)Kw4OkZg)c6Ay6tvgVC z!|Zlu&JVIf~=NAox8 zL)z@Li+LOi4r|p~RD|5^(*M>Ry_@c$ql^{QuN@Zq`F;7P|L*UR&*216$^gxKcNK&c z0G(wl<+1>sJ$~)a;>9vr6sRC$USGO!$=DRYRjb#d&SAVhuf_Wl_|2~7B14^#({+y( z*Q|1gA*q3o+p^785D)!fFSgMtT>}rvOCyhF) z^_q0CP(rBz+M7+u2U8ZVPjdL7U;I@RR}Lt+G{CXA9-e1+r+vU#YwwAiJJ09bRfeVx zAOJf0q;Nc;Tz7PY>cE(NH9}2z3?ae>&BA~f7p%+iS+RAyX+lhy9^UEM+y>t3^GEN& z;u7I`{+oBNh#5LHrx4p`agajd;uc@>+^4^zbYZTqi3r@BxVaTcrDE$*%qC*P)z}K< zAhW4C=3)t~m55aq(@qB;{oo(r@nc^Sw%HPi0*C=%r)lQF**Q%L6UhQ?fMx3(QxGO- z=D>3r+Y}c05s?a#`yrvwMzfFg!5EM9`}o46r?A;qkgVVdq9Vt*Xi70*aWSH6o5;2b zJ3&QuquTB=f8N1G)}K$9`^%;YEOxI2TX7dFop0+}A$Te!E^y3{zlU%iI#AkWqv~HP zvbJ{+9dCeKy@!II({{Lw$=I1aZ|JfkEcVmrmoY?JUQj^t4)_!@&p4mX9KLWhp`>|04Lr}QxITy9( z<4!~x+e=G@c(2%sFgc=Kx5q-XMEyZ>KJ{w@eQr=PFCtKPN@gm;8@RYK7frk98f&xb z64#H>^O;=o7_t&g*}a80D`qZ_Itm&2l;qHiC7k{$3Fj88McjP#Ww>Iwj#4gzda;a! zY6Y1r^)13XSGm*c>xl;3K*R3t`OOh*oDl^wCyM8_gaF5 zk|He0gDCKsZZYvrV=17_fhidhSGF@{yy8dxIWD>OXp29|yo^DT;)F8(zdQih=MkyF9v#>!?UK z?m-iAU(W+T>w+~0+g7o+$V@r_@xKy7mUask(1%PyRQ35Ig+N~j1=e+dIc)!nx1Y_r=H zK~|l}8Ik#mTXtHUKB#IH6{!LxDxWZR7_yU2ncN$qx3z`lg_Br2{V2K@&LcnWp<2!h zvtCx%S-J6*iHONyVVARjmA1{+cSrCalW1GHI*x7T@ZnG2DD7+PI804BCNqV9qw^piQ;wBwj*y+-N z6ugMde-VeK0!P};KquWYgl5ppa_{xMIIENi=HPLX?>kml+n?A~SF97ZKZ8eu8HCHD zeeMzDI;#Q@%NJ`X6-&sM$Ur7kbpqmLdo{``DqS(030NSgQ<&Z~**_eP@zA3u@X)C> z+ZLCUwthAEK3R~SYpF@iY`{589 z8%=C%cF<|}gpHT1C)H{Zi;cP^`0`Q-%^ ze=oFQr4=gYdE;Ph)0g!kE2JQj4vO%ABQiy2BTs{-Z6te6l)W_h+6a< z0qYD{kdc^R2O8#3Lwrj1LALB6fSr}?l`6`$s#M2uPRQCyc}>Gu3w!dyE?&qH%$${K ze1>|LYE`s)T`VrtP@HB_sFu+kQtsza6h=K7gng6+w4$u2!X(}w$g|VRRikn$;Aj4i z-;ajQkRvAYZ85DTJklPRz*x0 zNlRf?a0*~QgZ_YlCv6kI)of#Hb3^pb#`#q|<@)Q;Xr07!F0JAzH{67kl|?KsuOL?- zQz97)$-b_g3Nm9&c<|o@8%ePd9VO~sR{Zz-Vnlb^O|-UJ=(gKnV6AxQa$I)(vm{u> zwNLP=TwBp03MQ0fiUA)20VXyL?F4K69-ETe6H^X{6Xz|oz)bcDgQ+ta$*onNx)@Ca zwMCa%(89%;Inz44Sn8#9rT-Gj;j|_RZRY4W(`gQh5l1)B<+HR;bgs8=oe|uf1%TcQ z19bX+WOz#W68gdt3>5P;Y&r2b(8f#W_an0+z7^LpC=&~DO2!bdC3qer&~3jqxYE8ki7Js>kv?!+wmF^EDXSz?}p zF@&;F)~mdZcmsuAco@(N$CkK;J%@ki>pN|Orq7vY$%k?{9q{lZZ=5g-BL(w)fjH1@ zu{$|5RXCVZ8nIO!o9PNpF>j4A39*ARXlz5rE8&8iRfxTkQ@`pIgP3?|WDRY_Iyke}O;#n@?bU zql;driC(WI;M9o(8OMMXn3O9EDAbmaYgBOL&>@Vv9ZYg{RQDgkXxv9OQ^dj|S#h|J zn2ak*(WATdOh)wv$|%U^V-VS-eQ=mok}MMF<9_Z70AT-j8xvRf!g& zkS!&zL06f3DN4ypaU6{dDJB;?){=JuD4^|RwmIKXL76uS(oIE+M|ckHNqNyMilNUV zuaC(}c6jND{AYIn&Z(BYsC`BIoryrcPic|IK)2alOlFJ+EI7^L-1>QR&Yi>$zUHO) zfB)$o9J=gkVLTF@GNrH6#rf4$kU4W@nFT2sX_>oNU%=_pk4Q0oEhC%qAAq9>gP(!ABikqHx4bGkTI==GR&tS3E5MQp8Q|1q@G42gv_NHIt?FmHz zYJmsWm3odEXHo$41ead*6#T%y_;FP0i_zZV4wtl&B|O~URud_bREqJB&$1`B%~JH>s!{&*Pd|wN`iFm@wxq~X zW#$Y)!LyR^YTpe6wBYt_cwT7dd!jDV(FTZ$o=1G$5!&rG7U~U4!fBFB7~X{4eeWM$ z*KK3kq7HzTRcm%|oR~|-Dre2j#Oh=4ir=U>);V*q;ddZIDfpx z^71lX@PZfM{qKLjT+*)}0-+VKu6x?A7e1%517&f`Ew|w9Z-2YQo6_%Q?=$=V?~!|1 zzv;RCR!5WuK&!NiL#gQqc<9Ufu^~`e#ESb7Hn`nlyWu&zJe8(<*n05uC=mX@E)oPr z@cLpS5wNMYNTF1gL@o=GM8sNqV6xTncgC|A-&LX?19=kcWu3@WSr`!7TJZ`4E|d8r zNuUO&jn(VoQyQm<^S8YDn=XZG2Np2bkv;6i@iN^!d@Q zByNW|`9T1HW@3EU$Mx4;hj+c}omg33vAB@V<$K=q9(>?~e`?)S9B^+omlcC+)>h|D zVk7>LX6J@-SAO#S>L3jR3CG7J=P?93r>~_s%Q!X|o+-s;rWX?cXxAyJA_F})GKdl~ z*KM@zdp#g>2yI1KW4e}oFSFZLY1GG$yyAtp^@TSJ=}SQhGPM;ocOd-{#(ty_l(w>U zY2o!@6;fm{-@iUevI3% zJ{CVt>{}MEmkIc02d-YCXpm!IY@2pE$#OU@0Zj)WY4rs(=90c&G)}Uk76?KfVry&5 zI`A_7qKwj^?az0nV86IKAD>yti1J6&$WtaCo7C zm0B75mg}fiDiXu0)oTXMCh)qCe!C+%woY$^jZp@#yYrV&zw`=Zr!4H5y%R$j=WA+~ z@0DI}v(6JKo+_l;i_dwn5+VVBPUAjeO|mTyr_8oVfQgJZAcb)a8qI}1RIFCF6^aD~ z*>bY&`;=~&C1Q88tK)fzZM5|K`kec*0)P&3M9F(Nky5z+7`rqZ%ZUO5u%ypdDuNtC zrve!r%0Hh+kN3GeXPlIA8Ua8{EHR5QZEIxFU*Et-{`e2D_2`4B=5i;*tK|q3!NU$kH`4z!;j(NwJpi> zNc`38d%ixg1r3la^2IubB=<*BKk2JiGEnUbr?`-C{H^?lFPJW8OmH@>KG$sv5e-(b&L)&c0K3Y zP3PW=JT>?7=ZtyVsOVGHquRde(^-tqLB4h>=UC^*-h<0OlbNx< zX@GqmOl-w)ghnNg7e3{30YDcr6D*WTtk{q}#ZeMNMLiVdZi%}gfsEx082@2TL*|v; zmaHS1l1%B|6}%9;!gt$(x8b=YVw9W^$4+7^5)cZBM_%Ik#1OS7IXvU#--VlQy8}Jq zm<$IrGoI{n*nLd5uWU_)MKbBP?7rw;^iwPb_h|7(#K{qMcpbemF+rLF;Uw_U|$ zP3Yr#41CvH+Fb4efVKr^WVREiYBl6aWoZRUWWSD2_-il$0Ub&|FMu{C3kixKyHl@=L2C=`tu35-^c1eT z{dHKlr^@Nf?F*;^0Q|M2l~5&174Zwh4@=nn6btDWfR46dML6 z?}L@60@edMs?78|2Iz$ib~q50NrI|I-IgS6Gm`-@?lb#^>9C6_SylxUr!yizlJP)V z!!oHERnZGuR#B3yypbq8R$ff9=;bPStOGo>*2R6NH?Y~E;XamXKQdvlB7zHc?ZO3Y zw)$vpT#(AB!nlwA$#3BGuX{C`U;baX@u^qf@MV``VR0EHvYVEQR*`4`Dhkjc$JUpG z>~PRQzpVi1tx*=2KKo?~8nao7fLfdzsn({Fvg#?TAkvPvsxZ{vR>+7e6AwZ-OR*-^ zV*TQJZq}0D>za-X^I4UFCIlNxD@kuTA$$Vw+6E-wm?BZ7rN_kIsdD~SK6<*L)4!Dq z+2r|f_b85copODLHc_#Cq#+I$at2hDH*d*y-&gubJ5l2=*#3jNo5I2qe31_+XVt@M;Hw!ICb_EzV^UrJnyzw z;Ib>OP(#qbf5k!xKl5`xk8eD94%giBo#>&6eFv5`AfL+$BXgmc696!$j|C$A$q=1B zjU;W`Eb=Ftk%~taNin%j#@@wB1vP?X+0rSSL9Lock-@_PccQ8U=RRpVM${< z>LGfOJZrhZ8B_@_#jiM6q9>dRiz|0goTbR>=aZt5&Er+ zwzcCsV9=B8q$u;U5b!m}M5l(-5#u2ZE(U31mJMECKz0OZ6J&}h25aY0*?J5wd*y3! z?8GA|=ZiRZ<`I;NSv+#)92O2)Bpe=07*na zRFMt_h9i3n9Tcf%LqP*A)v`Ef3@q`^1Uyp*40;0zl1Q873QL$vu2<>^vc(d>A+{=$pv0LA0~`V1SphFg)u-qm1^6haP-QX$ zJ<_HmPp8ik&+=TH*NK2^_-;9cWa%DF=$dBaz5Ty@jUR^UK}66!Q-2xj*X zjU@rQSU$-v^`xQ);Vt12+Xu1TU}!PV3`Ic`uiA~7OI3!BBgRzodBV2bas!obp{*DZ zLd)3v7!5LqDr}x6N+0KHCNd{YX?T#uA9v@HI@g1iKuqbbS%I>>0-)nykB{8IAogz5 z&P(2KUSMt(5c{IkY+Bt!EUobX_$JOA`yAH4d5^T;8jhw|SXq%yAEj~?xnhYW%Cerv zgTAg?VLc_wa#!|8tJy)jO#rllja$Ph-tbdDj{?~%wWo~PE>oO4zb4nbY?mj%cLphrC zaq~a^U4vs80hyEGo&j*mEV2>xHZI_kfBuKa47(@@^ECm4S_~q%cJ?g0u&o4Q^5~ z7BARY<5M#>xu|CaWM_S+0ONw*I#?P+<(dFggj_qTg7mQ9nMkFgeSZGD7^JMEzQxRUvtYaBi{JlL-@W)Q}eCXFk z%&ftCn)i(1T#3xJ?ga5b^y$=Q>Ej#sd>Wnek4U!?ekTAE0Rn6Lx~#P+q%Gvhe*w%& zA%xnw+?$dJqAe`UUL*8bm^J82GN;w<;MBP_eC5Ft7>{yz&dXnmkKX+ibXo)SI-6*> zn;7@In9@F_JSvmbsEl%D3HkamN{frQ^wPt)aPB8H6Y#6; zk{h+E$YJehWx-JCh^S0XjAL-v1fkMyqHn>%5E_QcjIY-r;Fq>5|E+;%)~+zQrEEzo zMCLUr!Z^wfP6Yl@Crr>AkfFMW{*bKBlt-FKW$`8rGAZJfR(}RQA(&c<+qAHS|8Xw$ zTrN<8X2&R&S$L?)AF0DAQM8%>~ zj3~h7jLe@DyGY?2!HOEgQD*Rr_)*d>Pe4SPpv_M6SlwDjskeb2c-5`=n}7TiYWpt1 zf+S{h7*2B7SXV10CPmoor!R$hnIV&iO-y=SzGw;PQkTdxkaea=*2t2)fD&7O7Yj1~Q@;OU zU%Rf5kusOZfkp`@zV-!-+MB2nFil;V;~bL7hH)-^UyKneOS%@3dl5X}okrEP*ihE$ zWQ3)INAdkX_9h%Wdb!xf^1di{h2lf?iCT?XbQ!trE?`{5noda+)1|@~F#tK1g0g3M z!yxGHLd*4&%ULaka)}k#(`MOv_{WFl_TDVL6au~E_mm*?5QHasqB8tQEhIFeRplq; zs~(}r5{+8LQk_0#Qm0yxqIbfIw0p7|DCUTqZEdO+pJ%b_yz8UdJD37T4lG2v+W{Qm z)gv2Zhh+3lwr@E9X#hre?cMC>+4jU3fAmN1!v{a`0c~;VBnpxJm%OU$b?Fo!-A4wf zRx2V?cKW1&2Qq_VcPfLM6ljb_(s^ZRVKD+D5&K>3_!vZOpwQsD z;TR>6o6X{R&wDQ3@s4+(T4lG$d22ig2H$N>eY=03XA_A`+Qa^twO4i<fz*>vv|*k z{uZA(+I+Z(sVrGA5xwVV&f+%{F-w|y&?!<92>-a8(zWb)G1trb%;D6= z%PahE#Y2YOJK{A)9cTiVU zo#7auk@RhMk`bXDB(|%`Q{U^!{ixTSEnc_Fgjk;k-m))!Psa%m-#RUt{YhXy^8+iT z4Bq_O+wtsYJwrharK0RB<{_lLy)pJNHY~-i(lx-D)D>9dfDdJtHeinB)6{0PHsVfB zA?)g!Q<%ZW>_3Wy!&hL!9I|!taUU~|QN&hVD0gM1BCxkBMBN=4 zi;2t95;AUxtn@O{T?$GYUM#H{FFALeKCXqiFBahB1bUq@L4iHT5;*v z(zdAC?C{VN8EQgT#jkGWuz4&&ue}8Cz z>?*BQR;q?mU%eY2|NY;>{z@4|b{j3`P_I@{BolPCA~6&0Q|-{%N2lFJr`5s6RtM*| zS~#`7h1Jdg!%`jJJa++S&Nopgki1RberQ96Hs>sxfxk08!n_z`vCPRzp3ew7glJ6) zisSAsetrJw-2=TiFl24^IrJh#Eu3LIrYJgrfNS1gfyqh`LOYfDFb87`V2!%lfY7`q zk5M4A+P``ql>l;o7F`nnO|lNg#v@%4GkQ7*Fa*B2JxvKirf8nasOnO+gj?@;DPH!{ z+wrg8^5eL4p^T&T8V)pSQWU3gS2k5riLY~rW_XNZ7insh< zIDEs6$WByNemg%q+4H_GzMc0A_v4u}XCg6}z-8D$vCZM&WLJYZO(%ra3!T{;dGL_I= zxx$Jd9iycC*$Hq0lFSriZ=~`g+ff#c$quzC{Z%KTI`+M4|M zQmNo)|JBdpt6%ym{_4YjiF~doMIDTt9N2#VH{AF%k#8UP;0J}6FW81kiYl>qeNHWk zQ#)AW6kG%9BZymPgdJ{MrsG;d)?&p2%AM*UXz!*HyUXz$*`(X->Kxhnme{NU#*=Z- zXr;t>1IMZbuQ>KA^h;%>*0E^J&^q!7v6YcB*>9me;lOOQZ*`x$e5UW@1Py{s5fl<( zM-x;F!1Jy+iYr$Zuuv_cQLCU@s>nWMCwa!gNtnpoF7+e9%9Y*!-37fKvCUvk zev$s!-+y>&YDLC(PRFKf?aT#0tKaKW8s9oeUYD$j+%DE)Z)yAM@|`w+c6KvNb~tnH z%b5;`Xx?`>7D@y_*O4og1OS~epc0dx0ybbGNEqa(aL8~+L_dLqWPt9W-)doVa~-E2 zJBw$&;a{Ryu15D1h+Z~>)wMN@CwbiP^y^TrR4rK-v$|?9SJ}m6bNd8Jp{pfUWiQ8p z#rS0hb8o^<+E5$o2RGud+d+Ht0yfW{LUZ*TT4&E-t9e1%&o*ietQ??tQISGV~2NU#Ip|r3c54Nkg>zj{bZGBBZ z8w4scNJkK)w)-C9;ge_4-fE%UZ(;x9J{&l>B9)z!Q3uEG{W6Z0N4V)o0|$y@TzTb_ zv2XuDlouPqOiIQB4}x*p2!1BePuP!oZ4BBitY28eT6c)cpZ`j8IJ81tLX3ju(ge9y zXlt9?Ooq;enO?GK^cem|xS5@%?ak$V1y$c>X~_AuWz4nG;9R^N(mAi0>or{eiM?PK z;+koYB_Q(D(*kN%{2C;F?q>>0To^S6Z?$@irP^b$uOQxc4Dk|NIx>sn=aEENo1yGf2sH z5dYy<-i?p{!{>4J^X|YTUqWSJ86_GH)siH=1$3MtxPUFJr|1m`w$=629}sxTeas*t zjSPZ7*>*aMN;!`bS@yCy)GI|0Q(P^VQ7z^Kz*Wp;P$JW`Ffx-3Wr}X6kF91O-F^?} z&t1SqtBY1|Bmn7rfi0*?l1O9)9@(V{(B__I(3oJidZQ++q_t`teQANMNqBn~&l}x4i<# zPhSv2yVq-?zEH;T6Q@yIz6^b7jZL-|J_my(L*xVqL*Rn$lnDV31UO`zJtl`dTV0Xa zkN}Gu+im7iERsCK{#$PZx_N4Iqy+SfgzI zWO!9J>Tb6ux|Z#L3GN_RhlVEiARW~~XP{KYvehOimhuubQWOoHtf}ZXzEc*{v^s6= zavxkki5Vz+R;=wWrQKaFi+HQHTMMz&xg z`o7&BOvlG($Cx&F zsdH`bE>hFUK;+)8z5S?J4vy-zXwbx!J>sJ#> zad1|_d;|)Q#D1i1V4%r?dLEEvu!0~yGIlbM%VP=78;~JW0MW{bsEv+eMpp@Dv(nrg zTCvwet~)^5+hsd*lO>X*%H3GJ3;-QJmxF@!ee#Zj;Y8S|#R+u+X6e>I+gZWg)H4cz zCR?>R^AvtlNMR6JUCG8u@L@5N!95@SbF3c!DvG(Hg3-uWBx{ESOX{%S_C4Q^=fCt0 zVVP&~k1(8iqC8k4$+h9YWwrMsu_?#L!3UK!%0#7wBMMM-0vCCWo?wamN}DBOS z-(x)vpij*94#9Ta->Qw|PT?!FccHG`7!Q5z%Q$=dUQ`K$7hniMQmXF-{6wIrF~dvO zAq&9rJ84r$P^zqZl>xNh7$;y-Y&1}&o>r%a$5+>J?}HCxILzSCwa>!m?|Tdb7W#EJ z&}}z`0UB((#{ZQH$X2Q-lowE_E~2))jH|A^0>_U(iiMTK$W^NHd}Qw}(@+yEv2G;V zXkMft$$AF)G?J>ZGhw69pt`V?%3jGR<1o9L7_)*W(xk9On41d%lBS8B%^%48>l|AeNEm-5IvPIl=bLs>4VUM%QKZ5K>>xXE)zj% z0Q7dv}v*Sbgsu`#Nl4S)(`s^x2`Twqq6=4;RJ5Vj267*Dr zuIWUCN~N9_lkEQ428530UctH^IpI~0>{oDYI*Bt+ho|Sz6C}HjYJQQ_ynz2s--~ZL z8R8HB;J@H6{`^ByfFNN)1G4ci4l+nT3$LpT&?8iFX=j2!X8f+lsR2oODFEnp zN8+r0Unz`WAwvN8oi$H>&yeLU93y41e`Y1hcLK(Q@7Cu*6R2^L+8LlF-V)j0@krek z3=^7uY&dsmo00LK+itrJAN}Y@vA(_@6-qiFJidk%G8qfBkIj>|)ThsV?sM_ZcfL~+ zoqo^odD8PUFZsHcb^1h)*)ego!$qIydAuY6&@PLEH)c$*F_=;A5yV>4!x4EI9V0Wl zr)jv@vF~=g+ly(d*v-x8{Lr{g*`lHC8M2kd@>>nkSehz$SY(ED&m{kB28HPe{d33B zf9#k5pvBHGn~wGv!J1-&Nl_Eq^Quj%HjOb>(Pkn*$~yx|fv$DXV21`PY?FANGsDpT z_U;-+97B6=)Mb99kJD#Y@q2&u5q$RR4~R{s@gy%5Qu!``=0x{WeO_uD%9)RwnET+R#Ku9a>OAQwhoxgbsrJsn>YKS{LPsTatjfb6 z`nAokb+Dbr>Aawi@2uDB;5Dy#72f*OZ`Ib=_I?;^{^ou6;a}f*CpOmCV^D*b!YVg? zNSaGjkh7YvI-#^?T^@TpC7Ou{)Z$?M01)B~*%2s0A9$wR_jqBt;6jR=bx$iOP(d&0 zxt*Q!HDG%XFWOD-i)^>-oZeTJv)qpzEBifMv9Ez2f6eWsmR`ew=H?rR=-J4oU5qoni~y1-Bg?`v0;= zW<(EU5zpIP@$~LVIee=JZIkQC3#M)S@QK1BV@a@k&T!6?&wLWT$B+R!eNcLD&D}Er zBbYC(-KOqhZRUB`n{}PY7ohYPz$-oHDNcX=9(?TgejWSDB~%Lp1Q(?Ex?E$icvZT! ziqFG*WVeHEvx}`(6PwK*&bK-^wYG)x>^56p!LgHPFwU2;xv?o^K5jGn9Eoqu4x9FI z+gM^4i~(e`C>KjobjYGO{;4ruwfm(o+Vqqc#K`Z`p)sBG^$u?)UdF) zh+3nexn$+z|TT&oSs#xcH0 zQcj8GPS}08FC!b0EN#FJgG0&1_ol$cB!ka9^eDc5>MTYUyJnhS>^<6r5nf2=BF+u# zvxok;g^>gQT%SDz<@(%cMptt_(b@=#AJvA^U)(2hTQpp{>QB!CqWjq5{iAzTu`KQ{ zc=2SY-@;H=TJME6k^J3XaL@(H&xvGq0NnM_5VIk&Q!q1m{M1|Cg3B(u6ek{j1p5yh zz<~n?u(Y@&An4_#B|LWO6z;t9PCW3y0}5&u)^MGlF!vnFBkgeOpmp;~ZQ(^@w*f`x zg$Bnq(G%_|zjqveinL|Kmb|mzJqv=h8udFE4VCytIwncS zVPk+c+{!eQ$58O>8Dt7&O!pneD}MOLP~UeDqX~&*w%f+?jmvNY!6%Bo?G(2kJ(iNN zNlmWLvoVu$;fZRsCve_eXJXC|(L%3zGAAgn`{(XdBa z*o50`!(Np}yjgrf&zz#v$Xo}9!H@b#kXK>v$*WlohBWNry%X?$BCxxg6 z1WCQsS0=(S0Wux*nw!{I-^A)x2T#8Fy96xa8(ja?dY(jbT~J<}cLSgc;Mv=BtD+P| z?tuhnIP*E&`y7$Q0D^%t$-#qOMP2Am-lJibXQkk61ZKR!j?WQ@OXg zUEK4GP z!(yGR!&%g5WYDOXPKBAw3sDG8ZniqY?$&H}v9{U5CM&$xw$LThFZXo5fJ(h8KwK6| z&G@YGRdKHOtt_M2ZcA%!GCdG{ro|%}0T~lKC!o%31|wmG=1X8JZEL@hA^R}f zqO%n=E6#_gvX$0gD44(j8Swf8(G}xK4ub*PZ|mA3Ktc>6X?Hk8uiFzjKOBtF9rOek zPNR#haKy+PP!Dx6n)KxUoiisNtPy3^KVf&TsWmUOa;CWQZcy z^I$4Wf#ZULT*{febS22L&jz1;N}w~HFdB1NkO{g>CK&?OxsC`BDHI{l5`y~(5E%^x zoI)6=XLbEeKb~3`gr3KU*4JBUJ z>3D=nt%QD?Kp5&xCWci$aqaSY17nBnclpkz%F;0%3(%SdE!)Hs+)1|Z3>nW`>u7Iv z(cNgGK5gSg*IkB}-12_W)aOjli>JKcyd6CvV3GrCg&N6nl zUBZFgGj(nJW$1*;bk5L=>1z`J9e#ETrp?w8;Z^;Kbk4;Nk4}nh19gg@IOuwI;whPI zJb(X}aPF&jp;*YG*B_y_xPVHdfl{?5-3M5JLkE*gs#0jfHBDQwKR~)*Va=9@5tI4c^yf1v=i|F)vc*#p{6~|P%iv}$PHK?ow3JgqBM$%?y z;DN{achcd2An4&p*_Qby$7W8bw$&nIs$P$PK_(grI(C-lXdTD^)uE2SES9KJV6wLQ zWr9lz5ol+7w+IX9$eT48!*eKOD60exCo*KRuF3dUgezzxe0*QE-Kw# zPe9OIBb#R)!KeT7eJEvE1X55oQeh_|I5H$DbJm<5vM2)@L^brJvF z3kUTmU609@XdVu*_Mym1OX7yrAki&@eVYQ0@t@Jo^$PjOL-03Y$xxq|Kwbt8hZSU6@n(=@pCwl= zQj{jsku#Y50to;jZAa@UxRmomj)R|Dph^0MyjB zV(|IQ!}sHXuiTBAG078rDIgMIMpjl1kquG=#lRX{lPl|J1z{dI+b_t>e%oPr`(WciM0al4tVbqY}VMxk1~X{xt1Lk}0rL34H=>otHtSNO`G~ zDU8X+aLjKArlI`iGYP=CP(ZiSl^U+`h%%O7Ted{+E0{%E1hR7r%|#Zw>332TGa5>< zngElhv>kI8_1OhR+QFcZqm8GGX9VCf?m>Hv@1-~FqeylXR!176GdsJ)jMWV6vsu+p zfYiJuZ8F+dk`$C~Ftk-QK+P^L1UoB1s|GzOTc|sf-I|3dWN%VNV;0MVOm(7%DB}(6 zTwwPX#!%=JaNJUK!j^XIT9U!)1K-3CeCMtB$UpoehQ$ReR7%?YWeSNKt)4k2LDr>x z%P3V!SYN#$daYV1p|ZG$alV4VXevH}Fgvn4j_544Q|0*zWQ1hbnxWXg(wS_~Lu+#b z7NsGn0dV9hc=0P=g%{p&M+|_rghUi) z@fP=i&QLiJ7C4x22=Tp z`?z+{AtV9Nu`G)_YRUB^xax^J3s?BLQC9}*^58~Dq=Ow~VoJzjbJD(^^AvS#39a@x zoHI+;?EGEKJeZh^Oa@2yD+9FK&1w6?ZNTvQ;j!uD*1U1dO1@r<{gBW-GG6-cUHryx z{u(~^cOO?-Dxa7{B1|m$z5Gx5{*;TAN;v_5NRK~}{7C?Zt)RthWOm15yKe%Z{T#Q6 zc~8p4kZC$Swn+balEgq7w53A;v}kNkYDR#s**!ZY<4ypY*(i z--p2Na8LQQDC2Lu@kSg!ejJZI_E^LKtx0FKsr63-wfP&g?_JI~0GbTYoQv@JXT2Yv zgD2(-Ui|J#&-qSQn6(d{_#I~hpp(gMo5c{E;bJF}W0vyUBLF%S)ff9byB#0NRvC8e zZ)@@~$TIrR{tUq+CS=?;;EBd#A~`F*0YM5B>E7B|n$n|)0a_=&iRrl$qMwD)nR-(| zQwn-67piKD8pv6S%Y+e9i`%Gw#U>)FoW%ZkFTJ0DVx@DM#fq)7hLq0QceI-X*g+DF z-VozK4`RwP^I*JAbd4^d4XyyIfo-6Tp z=%5Up`g9Csdmcs4yqN|-yZu6WX=C{?P+l?i~Bevg`8mAH`ZE!jg^>J8n8jPqnz z2q_ySsN$BP(!Vr+ga4E~EYq;s(Mw{>Y?&=B4haI8NJm2cN!yE^6SMUd?7Q@8WQrAu z#T(Wz$sTVkOTM>s7;a1XT94x{VSkQ<#TqY8eG?{!6F$Aifo+~IF18RHoj5U!nb?JQ zdat{@^KV6u%{+HT%qW!Y;i~kWon*X21tx_l2ZV5W{R`l{1X25w|@ou%SF^nN~Ba}_o8w^ zu^dvEtArFCcIRyMvC(Xz+3w@ig-x8=+!8{xL1h7tZ?>`3qwmbFPdUl6aNG_$_Gj>a zb4=c8(B&W*rU{&q{Y&hI$w(i+$BZ4|92WPv%^Ss$4KU4Ilg~HDz~lTFl62G>b#z*7 ziASkiR=GbM_9Gjg_hA9M6u1lFg}%GE@Wh#5RnA2=w#CR9dnPE%$Kh<#{I>v0r7&Ds zrv?0FYl8P>Oht$=#$%MGBV2OiFy8&!zk~n!JHLs~|NTdB)$#)NRmwQHSi^FIAm|zv z7aOQAE^0oR#8E>2!~EAk$gX-5;QH_W0o?S;*C+s5CVJLRdtwq`H#_}e*YjRS!Rtl< zXvgU~W-1bgs#_AeH&1-zHN32@-q~ri<;W%v@-~?WZap!2%gW}BjcjQd`Y{nFxSoED9Ir+ zpRL`dJN*HA*#eH8-M}Zl_DyV#8IRQds?v>5;=W3Fr8Z#rRLPeVgN7AgEXUhgOD?OV z=1bay!CLaznZzi@QQ@#-3e6+1dnCL%9axxuP2^nc?U*ec7m&o)a3T)@;96{E);{+R z9{x@x9w-D%%A~EfI}10757ayapGAsI*r8SI#GKghKl-CTiZ{RM%_x?%Q?!3*b85aa zgWvd#-^2$#@P3JxDsb0VbPNLbHS0FF+6W4Y_fVetcJ^=ctpwa|a~|iiW8Xt_a7IoP z>8>*w;5#lqiW`p}#L8j~3-vO_!-;f= zm!cx#SqfS-)bDjM?6MoX=8>5fkT?-z+a&oDqP~*oN8*EoR77xyBwJLHToU9C2OZhd z!~t=wpAjjibwD99~%zfR}&+gt1YB46;@!5V@(CmO2`2Sq&7sip(Xdl5+2?+8m@zScmo+)%^HswQMFjDqBX@hJ3 z^*SANxrqy9)D9lSdOweGWf33#_L zLFEz_YegJbZXlllPM%xC$%h}t(ZdIDd9|_A28ncI7gEML2X%1r2u@Le zwCZ35L<>8#T8F~Q%hx4r4Yofdl@Tpxe zcM{SDZ8U~&1NhmWb~ndjkK%FrVROcKQ9&7dmr+pLoqW59$4FhyIa`4nTWV*Bk>k)|76JP@69f8hdOeRRHQp#baUJ>@^ z<$4(l^@6mDVKt<*sA4jntj%O}7Dgj&*F+h5$myI^6CJP^eU~wy`O5OQ0_+xHPe;ZI^~aWoTf)gt}4K z&I~lp@920e)@xYX+!CPLWSWPNCrgZi#!wHFF@pm`k=tz3MIZzN3S>;Bfy5;;99Yo{ zod$xbCuDG=AvMAJsk5lHPvQC-o{2MS>nN3L!Vui)Zefc?-O>>ZCSw${Q)GuUCbJk3 zJR&W4ax(wIj7{LWIAPR#Y=cdvIW_bNT;VwQ48;-+LoK3V@P+S%4A}KrUEV=1TNHg% zTP$I#*~GBDiQZ-t7dF??T3b8R@oK9RW|%KH6;e z@sfY`1{}HST5rmvT5mGNr$7A}tZ#1Nw%cBc#zIYGw1A)`Kx=?r(fcv;laG}JCImUt zUMG_&WjAH1IpHO4!AXEUTi<ian`kh(u$NA;LhDKsgX>VqI7<3AQTpA>g0d%26iEaH|4bY@`(#0RknAE-qo_24BaBx&O zdm3on4x-X^A^$%U04+}wTqq3S%nX7kq97`|pdGZndK%yO++8U2+foccUB=epT0o%1 zhfGS5saN!$FkC1LfFO)H=@I}_umSyK(c9g&boOAeL$@==`SlApb738)PoBlvq=rG` z2s-^fwp!;gXtgn6w~j$ilS=s_E9_8O*pFgm0m~~(Sg2KTeyxK;mtT#su#Yi-HWc>X zV!15i5mtACV@nF~(ooG*_B=bK(Eb#VDf|e zrq3cnGX4*ZS;*M0twr8&M0<>Y8`}0glu8xhMBzkI7WW4|)YvI&GC{diktChRlmw70 zz+`1x;MfJIX3W)m(R^Nc4^oV%ZK@eq&po>IA}0n!Yln+=n9(?SvJ z$M46hU-TS&@}AFQb5uk*mql+lkf+)>zlP?VSUxDQEjm5|QCnnS7694>Y638n6oGn3Qf{fdiuGv}#)yQN%V%eA zb|qxb?VxXqJw%0tQEbYeL(kJVmX1U0`sk_c0RkZ@@yHo6Sl)sqO|-4%&QXsz))7Tc zREKymlqXkAS2+NBmI9flyLZ#+^OVs}c17A&_kX8tVRGHxkA)WOdZNsrz^IM=+Mbb-ib@a$(l8}EA8yAojV-F&X}oL;n%G~ z>ok4XEWa*kH-9@uqSsiva3RVesPr-!5gBJGn={U`8xA2Zm{BpkohdpkaT1JUdw!HS z`Mc98?$d>qZ)`tXq-Guyeh74pC*1xP%XYPBjgUqDuApX}GOjl*$|;Vz*n0SD!1`m7 zd}R=lvRw8@o-KHDC>6?L4>69KC3u1bdjx6gJH?~&MrgUtN--u)}@#z#N)F&V3n zC>el_aSV~C4!p3uf&AO%JbEroCfRzk`Lg#D5+`^(EZ#4HFF4a*i}!l0{bPnfv3;Z% zJO+oPW%f=oHK8ZtGU}Pz+2a%h09iCI24S-hz1zj}ufGyMeESP=;&N3vz-4{543$f1N1GyzT58!c|c!M0MLXBO>zE#ui|fh zt2o8>QpaSU_!y!OgLC6Iem*UrANucjZpI7ghB#}@+p5h$1UU;3*ci``w zTgo5W5uv?Ky}|ey?FJUlGwG={`cwS-UwtEGB0m_n_NHTRQy?&>2l}#jUTx3%~D&Fp+}$?Eq+BgBP>DzEw%_t)9=Z zCIQeY6vD@w|V#m1{61&%O6&LedQ7B}Ny!2~5vG!8}^3@fwfioiolQ2IK=FsnM>HV(Fhdm(;r zp-rm3jCNIayVlu)EsbYH2nuSByQW0(0?9|Ju^!s*YX7O+bRD2wRJAycIJq~!`OWx= zpZEzO>W~#@HocORGUi>z|N7)V;urqSF9@j_zmqXUcAS$R=*)(gFSW%j{~Xzkan477 z3z@XzoXU2a+B&-i#9(5Zo44g_Ux;F2cRcdVb*=(-ZacyK1^qd;iz8pd;-T)BCa_eV z1G3G>dxvo!A*8XqtFNa>UxoQ216~XHD?6?eJ2W2Q<|kc>r(bp$`<5H1R;ZikWKX5r z0kJRKm;7|w9kkm`vDdXjJFR%N-MKI8HDX_CC{#+4|4|=-_!3Bdf>&Yez0+<=9#+Un z1dB!D5{-QiBnHiHnZ%@&(3#|M!)-6eO)t9xeeMSn>?*%CAE9-YX4{4FLKCo&j0$sf zX`EaXw@9#nUW~X8?DpVB=__ngJTq<)Djxqi{LbW5y#M_{V?~!J;+%7f&<~3Jr}$t6 zK+pN4m1L|;^u-7}T9lkHr$2Qq-BckUW(U`4#!q3uZ@WVt+W^~7{r{MI6DUj1vpn#* z`(9gD?~=M(n`POSEn8T&Wjl^-zzT5)BshdPGZ_*f3o``50Lhs-1BB#&!;*<1Gl!f* zauQC$5@%S(9-A237%W@fH_2LC-BRyMRo$w)uXCQ~{oeoo?yXzhC4)~=Ms(G^|MLCc z|9$WJywAJ)6Ya|YfUcMGs1N{Mt{_)n8^SEI1y*htE1L||@b8E$JKZ)$oldAu>!7{8 zgG-k#PM$s8w@l4|Dj^r$2|! zJa+}@;98sO>AKZ^T~ts;Nb7zA4afObv2a39aR(X-n<`8ElFrL8GnoMeoTPF?vl z$+sJ){q+tqHC2-zj5_msGH zQF|_~MFJfP7<9VmUU~+rHL`&jLvN1l+7$R^vfKjRbUMk@VN3&}6fgiZ|7Bx0bzd_! z+TnPD=g*$S=_@Tf^sV2HTDfElZZx=qpYDaIu(^lNtKx8dKEQRhV@2r#KpGRZXsVRpv_8g2BXD*JeG{{A{99zlQGJr zqP{DMv3hI_#Kj^8y5EwX6@dynlGJSSiT?JCv{+aX3w&4U7lg)|13Ic%3`2xmd zg&ww%n+~vb=_;06S8?}!ufe6wD{4(%oaAw3;{|jFdGrgb073GB;grb`6~YkkBGxsl zS|bZI113W<{Ex>1eVfxoKs15E6Aa0IOh)ZuUR7^o^Iln5(J|C*1mW~MeXY+ye;XUu zHgN62CG^@Y*0ZACDB<9dL#VGDz->nl2tcw_EvfodhN&37={!sX{1pqd?EHx;@|e)2 zb3t$;fjYh3KuI1}z{=54mlI=gQ-vkhS-+2Bxq@D|j}jRO#Y9*DTbvX8qH_t3oDu?0 zCb}GYe1`EDZ35B>>J9;K0Vv5VI2@zZYMT+veI&NMHb(t6n#~rrE?>fl z?z#(0%S$NNmIWl@CSZJ=dyveDqd_mU7&nlnWP_gB3~qu+S#7{#tA4+$d$o3U&}%iZ zJpk^0@U6%#tqA~tE`J-Z$%uW zoiW*Zm8k1R1E(Z1FEG!^u;+Qou_PsNQjZQ_ahs9?6IsjB^brh>rTIrLP<0HW0qGV6>UITi z9LN;pj~w;rTT}xP5Ukoj|n98wx8-05E%NH*dDO` zYPT&A>1a4Xzdy$Htu0*N+Q!9;S8;v^7%ks|txgBct;_26Fk!b40*GnLP+nDQDAv|d zY&5X8%9d>z45wurIChI{NZF0-c0sTU1Lf0^K4Za}x^;-1EQ?x|YzG6e4|C0_s4#$@ z6{waRm{<^RJVB*gLAT!v@B(W`DrT~Y0RotuACGCrjL;wQ^Qo>m5M!_+ECxhYCo8hg zX9Ekr0jdeIp^eO9G6SL!j5`(c0nhcM8{dDvXtti-gIE(-h?hmVS^}B=DgSc(UjX0| zoXqG*neFVt{^a;MchmvwKE>|@t_?+7yf)vNo{=^(lM(D3!uy7{@f;s*_iDAKA~6Lz znaoh&)8>!bW4XSBNhy!5Gf(5;*S!*te)%hCXKLUR4*ElZg~q)BE?u~!;^{+&4x(DG z;@Y+AQbLVJ4cE7t$X04V#=sb4{!^y_nE(dr7TXlrvj;tFZ#VU9{XrL_Rtw{2C zyX9#}Ff5D_hi963h%^>qGRzYpp5~d+NJ(+uO4d@I=ui`X~v~J8(_!$KQR3lciNWICgM(Ve!*mI_m35q$bI& zkmz&&W|6(HmrmI|o(wvj9sKOi{xf{)laE>qF#PA>+SqQ4$G~g#dOhu1GW2^Q$j22Y zhWuJ?&sdVn*q=3i`j%v_30;MjmzNV;nZBO?$Me1T&!0OUU;KRhTwsR)OeV|SybT=N z;coBxH5`x}>tor50n{-+mwqo^GX_8VvwI@U6JCB@pC<=m_;us4^7)(1rshEf-+^Jz z8L@4wDT8Y4|Ja;ar26~`FV=h>&@bX@x1KiL*B@@+|SCe3GK#%Tq>;B zK!mw20lw$=T+h+F@I5(ytZP?a%d;{zcr{_+&HFCtV>*~1+7&~a4mE-BLL63>zS?1?kL9aCIE~` zsZ3u>M=DnnK<6QEY`H~#r}li7n^bXu#e^7-Cb5bN4ub8fl5p-<&CyWZ(nf_E){fr+ z6zd{oa$C-(fFxaMB*4KkwoNUjoY=q7oP|_gd{G%Vj-}&2r8}IycuSco3jl-29 z4lOO?&~hE?jWX8Pma(+FY#?^#@CM8$l0;>IHc7Nb8LU6>7QE%%--`)z-JzK1W?TNh z_wPC17cO2*2pQ(>5VsNH&rL|gNvv7Hv`fY$xxX7rpRa4L$9BPt-8Vb)FZSB$*&eTO zb|n8ME-W{)8Lk`tIG)Finb`J0HFh`)sqFhogOXnfk;FbND>@xV9#dH%6K|s%kO^oyYa(6{KMvV(LVH; zqX^I@$|0ORa|S>BBR_)Yo_kL3-p3V|Unoipfbx(n4{lmYlp2AfXML84u2%0m1*XsD zx-BmxLKm$C1D@NwddFK^FFx0b8LME^K-<1g%%(TllCWvZjx-Q>%Fvt^LV6g{$L>X& z4#DQRuD|4qdR!;~p!J=wnZ|5xMV{s{N~eYH@pL^06Jj4nc2r4wFZ41x7ui+UT3jYQRIq+lEu>#eL7-y;=V{` z2Sax2HGB%^T3sgT1CZ#7dEhZg9a)@Q!t$N>;LpG7doX4f3k!fN22N56&25P1ruK$A zrhCivIA&tc#4Fx3Ro`HM<|jVSdnazK5?zt)1k~VNkw_Vq4dRP&~>A z2!0a)^zO1ExvmP@&}oY%-&u@j24%A@VVsEE8_dG|SBW2zwlY}c126V%cHc*?;c$R$ zF+k^0roly{u2i!P7o1yF?~1L_TGDefkX5JOYRNF`b=uh8+Qy};*Kz-M{12$C98@(O zcOy6B=N@|!@Bh$$#RIQ<2v1$@3Lu0+Q479A@CAcdxeSV#Db|)j z&t)(i53sehh2?4)hu7E9+`5WRb4!7{mHu^%UU(e$oVpEn-hM&=X|f*E;ZZAECiJ){ zC=l6-eL(tozN2mIG%xU-ZCla)QQw zgFwXo?-z$2BKeZ$@@6izND`<`*)AA~zdwJG9*9i?B55GXt}1~Xj64gd#*n(X>+SJ? z{xoisFh$HXG9d+Gsk?L$`OZbG)Ee5a0^hP?kPK<8x+U|NSOgqM6aV7?N>$h^_4w zu5E1N{FQ6Cy4e(yX(n4hxj@$HJZeidHr!<18?jiWqhm9fDk=nzlt*Y?yN<@yi@5bAuf&CG=P(>}Q6A-R@#+hxE#Hb! zc@-0~;^(YYhyc)J%2R7{1K4rR5GYS4jGtF3RRKzrSRGH1DQ3kwM=*IVQ$W2|#p+5! z?Y%3FGE3dCy}czinAWwc*u3xpb~dhQ?B)7F965Cd4jns$Jedi}E|<+=ZG~Xu0UD($ zMgz7TBPb;&Jxha=>xFAa4j}_tW+{n2xqK4;6WrVZ0Z>?7LLZ+ z7XnYS628~dc?6jAZ?%J0W&O}vmeBB@WCX4zz>qxYOnUOYFo?rBAoHOC(g(;)M{>5i zWM%HQvAxs6=B4v^;N%Lvs6j17--|Jv9=xZNx4@zPX z=qaG%*w~@D7P_5adyLTDX`;Q|M6)x($yYyw>Y?KTO9{hG!=EkcCv1@vfD{s60R$Zw zV#M;JaRe<$$H6gtL4L_rkPb9SM2-^$^u_3xG5r>(Y#6K;Fmf(A;>Nz|&{Xp3Nwa~` zHevTOVVNWwgDg!Fg0ayaoWbalsjhXs8QJkO4yDWF$ecA6f#^j25k8Rf5t1i?%`hp9 z2?yiM--K7c`Rx`| z4!#7L9{%tn9}{4XdgzWjPGW6s*}x&ewl(7?v|sPfb2pp^v>}g0Pqvq%5Z6 zD&RBaw70hoz~^*UqP4mpm^Tx=NuYjKP-MY?G@+OTTe$bg_(SmWgm$p`75Z1fGYb@0 z48i09&!r5b%}kvj-5D6Uw5!!h%osNn7zyk{TN_vL(f|0X=x$t2JOj#qCiKW`boA8S z_^$8$yXwwj4qOOYguvmA5)+263eTtpP7bb0XU~&scB}#25_>o#=KN^MA%CICwUdmV zC5g57BO5E69FKE;%!~d`173^QKZ`PBG{vlCY3J;+TSKRU5SmEm(#Pn}77~4ntZq9u zW;h7-!7`PH)rqq zaq%4bwQt~gBr73YIV5{$;U}|WOrOOE=O71D8G%hNRu%!U;u2K*Rp5^)p7_k8xOV1i zXw*tdLbD?UZAcFq(r#eEu(3c;FIqyJHXv;ci*Ol30TbK{oWAGR!acr z^XISN*=sFi*G^%x-A8ltGRD0wCS-PJ@e`SG^EnjjD=5@gQEDusQLoANT3$bfOunQJ zAGBH2f>EV{3^ZE2fc8FZE7wo#pu+eC?J%)3i@nEYA$1q`lVd_EglSgc>`{^albA(3YaVq2j<&fh}kR+@bw1T0&Y} zVkj|S1fPiD>IB@z_HlWFs3(}_=wC1~$)d+Ga@m6PH03(&WtYWF8n9r`m^mh3k;8ao zzyRA1iq=Ywkp-K3gZ3R6m(^-Aj9Flz0EqH+MNkB7Ew<0gmzXHDLUX20R~kzg7BXmG zI*af8bFagrU;Z*KZI4k2MSd*6+uGQ~<@1;2f2^;sNIz^gw~UdykWG!<4KrZR;Q+W@h<_IRW`;qsw+CNQ4y5 z{5+dSxmeP35b(^mATU0QCC6iQFJC}@uqD7V!S+ntl*E)y_GrC0aCJN{V79Q!f(FAwA>XrER@A;c3*BSzP(5RGY7CNUGQr*GEt~GYE#k-uBPPO>) zjHzgWdR{xoj-Yd;Q%%{-#L#4yI;u5%pI$J?#h}BbBNE#)1w^HxC9_HP(y>XVA_VYF zzM778S>}dv5?_eqx%91Myv4!NP!2&hZYLTj$8BwsmjUq&-vS1fknli{@!Q*oxivL?RtN2 zy9j8tn)vCT{z-i4i(j%Xafwck;&kG(NE2Od8xjDm&H@F~8;i!_AT$3y20r^|D!*Wt zDEheo8g=XHr*$2%I6KQ+%mVG#j{)I64vv$yHGc@ai+^0##y&@^fBko#yO{)j6vOm) z?&IX&>RJ+#m@)X<#~6>*$Ir33zL;MMJigUx2_WtOaQ^GbOFPe!rf%27*E4o1Bmn4I zt(MI1{4?KR8S1P3`e-x0#)1UUqPdRmz1NzJ&%4=J_xgU`o+bmd$;GJTImx{GRpu;6 zcNW6O3-^B1t~nAZK`_l(laYNZyUy)DXSIswa4(=nxW=CQJ&Nl(1GURyivhdPbjcP6 zqvtJXFL((`N-?4U>YxnH(k9DcvT*^;XTE@HW`Hr}H4~-;Q54IvJH=+sVpbAQkkp_^ z>(1C28KbgfJ&!M%ofCZDX<(j{&QJprD{vRsN`w=Z-{6;u2T{+7_@R$suZOD}oA~Ab z`~f`r_%pJV*vZWFRosX?tcQ@lN<%Fvm__?RFITA5bOj|-Im@O$BUb{@Rq`sb_Y?h; zTsOd+gAba@qHyLMt5#f8vB-B!VpX08jeOfh@*vT7&TJR#4$m8SB47Tzfa}1|{L`Pp z0}s5`z;_8)bSnGw!+-E!@pJ#;JqA{%4K867a#o@BxnhE5q09 zXdAn&8;eixmWv$rjK!F|72kgbBueG7%~xt~>YF4s6wZosgNqXIH&iCkC}SC!TxY>c zoKa!ki!4o^g&R-cd7dxUR>hjF zn=E54jPNP9u z=ldhsU~h<4w})PTisk!Whj0En{{R!-SDjAx+(|cF=l?x@$@w7zbm|w(%EEa+Ao+Wd ztvO3MWb>26Ja-GlMIuws!MSN&B%OU-`};LJE}{TVRN&YDj*P6r3d3g9f&ZQ4@+`-a z{OpFTC52aW0ijg#2k`66{7N1>Td{#YlUR5tUNZ7e>kdr-G^c>b4a%y|{?`xUv5$QS z4TjjJ6O^)f0iYQhW5|qn29fiyb2s;Dz9bD1I>PtaTC!zi1PwtJ1sP?h&62vr{=e%!mx&hdFg%Xz zT_^vG*_Qp<$-P28O*jZ+dN#i%E#6aJE97EDz!6CQSRnF_habjI|Kv}~cIGpOwF#~v&EgSB!<&H?)J5JkDt}O4ut0v@6JDQ z!bG?c?7}228u=~uT#>yL;)-#;-}Rao#X5;=vQIyHLb*=|?7LkW zbzHHWaEPzjO-(Nadxrq%%w#A4^n-WZj-?7g%X!7{%Y`!PrBaeBU<^&2Bf1@pLxfc$ zU~`*Y%zLO+%2;dEMJiJ$l~JyhRS4w;O-ATA!h~Ir2OW{7Fb^UEKl%?OiXm}~6JQCm zMKZ<`hRf^tmjCf@p|ZN36g*fiFZj11MiA#JHJ5JhEs(#dJs2^AhgglhhXum^8>t{~ zXq&rb9_{fsCY(xZ8+8=hi7%^V={cLoS6LK8(w4gs1N4lT3s*1)H85jQFeJo!X^10r z5kjTG*9(A-oa@~V{mtIgVx`X{EZ1jC zj*fw#3Fsh*c&mwKZ;S`O>wD!in=m2BaEkZ5_t)@Ozx`Wrdb5kqJbMiX*BaVntd{Hb z2MQ=xilxA!Sx{nP*lh_ERm@Fs$I(M*Wcyez43HaaW35_5jqO2l6p(bpS(VI6{=gO; zE$T!tsco4p1|}x0qOOZptBcKH7Ms%smX91myEnpUn#Hy4Z8Y0mwAw=qroiTA6FE8w zW1!XVDe1Pevx9nL1((iU!1n1c;=xy(LaWz9?ch;tZV%8KWziZ8k!!39Y*wulaP-gt z9A2(tZD|RcJ1uPY`nYuVJeKNJT-@A5Y0$!nLrw_OISa05F1-9bUIxb4AZk; z#^mhdxbwtO+N=zcD9>hTe|h3Z&Q^; z;Jga}X9jsfuvClKSd}b3;0bgJAW!oLSeX8{->ojyiQxW>%MwG|j)n1t=(`31(AtwX z+YkQzq62paDWuG95=_|d9sM}F=3XI)7kjl}5QQY2hrL}7ER40pQy>=8#rJdp>y2U( zCqQ2~C@>A=#t@NtBfu5Su3LqR&ef0v<}^+{TNTon9^v}gr?6Zk16f0$;bNhpZoi5F;@gSoPt!KSZUJ16x;A2!XIhHfIDzEs4F%LXbrQodY<6i$7-o zjX-k0mXN>|d|raglIpVwSw=^=dVLF*H@9*5`W7~?ZeX+7Mvp;e7MkQMD3uGy)$6EK ziYVu6YK>8;I-2Blm9 zeYVfmvkU}Sr{hA#R0f>etxgh9A@I9eD2oMur`JM}_h;Z^I>OfV3s`Pm!?8Q=L3`9i zdut18)g?Uh{L{$S4r5$gQA_k<+1m86%{pbj0OGPFTiChyJig`Cr||Gw--rW8kE@!UI=VmxXth5aapEu> zcBPx9(ooOw@y}WIE4nZEpz#z18mH*h^l6 zrCV-S5IsS-$xfOe8(3Yr7R`B^4Tvg{l~ni;&}<&4`4a|^Fkq$^oEaFx+mSo7GmER_ zgeN%`m0-DxnjD`h5c`(rB?0=#hBOVE251e;F$Z7?274@Dlc3{V$W}&hR5YFpGji(O z)pXUlP;Lh$;t3;@<(}BH@%>o&*64%p72>P6X+xLczec&@~S1%)hI>tjYPHa+$h1vUB~{cyZxe=rk~{ zEb)9^%)uULBj`ln>4N#F1us7oIwY z)jM8;&CWy&(BnZD<3Ue_Bn*^I3ndg92T-UkV`*g#YwHKFF&yIPvD?(iqR%c)J=!8U z*++cZN~MMY3#-(M)L1J8h^9RkXzpn@5fE(*QDl8Kzy&*b(B7$(is5(`^pWYzx?NCy zsMsVFVlX+@YITemO)X2wUTuYCTow!#vfxbJG>Qc5jx|SQ6}F%;?XSK8Y$j6_3DPEr zk1PuXvO^D*K;sr*0b8CRAHFCh1ww&ESlk5__*t-ZemQ21aZ*EApl!lde|yh zejH^V{VOJC43J!=u2eE7=oZF}u3ki8v?HMVG)KF=XaH!w?}7n9Smda1l-&DZdrD{p zL(V$@&}UK+o^{STdgopE?(h2nRI5ugcCA&XRnce+(h$I~|m(57TRhS!} zqU50z>Z)F%>j1e1g$;xESrrj%fvjueo$H04pL-8m0FAbT7cfoP}30BOIc+pF;yEXJH#31)X$ za<13yYHvFrM&AVhbo?*nEA?6Y6Z-*){iPTY0eFLV{%+V2i=SCS z%!ouhc^W4YWBbp?5zp29JvBGIonSn&$}}~Kk&c<`01bi=@|y- zcpmmzE581ASttvb*=}@=z4pa^-o;+;VXr-KqifDzYhz<0k#CY2dnM!oJ|YppaZpvi zJJ=wNy=(4Vj)vd0Yv;jYkzDs(otziR20u5M%XCts;+MVsqF8Q6)_)`=BcnPVqpPBb z5zM8iG+20crK1B7fHvIV@@cfrd==F^TWe=TwxE{F`GPvx36wHk-eH%*68_~c{Y#uYbyA6QMNNWQXDsCM zg$wx6ANz5fzi`38Fd1V@vyEaz3Z7??OjGP6=-mK*(WfDvWUnS{pv1h1h+KSch5Z}L z?N}zckLfbN|4s^T-IfV5KCu-XToT5R%0TzJ(;a=|(AKQQ;xWGnQX(5h8gnv5X*|R` z-*7+P@!I>avVK5$U=l8I9}x_xxub7au-uBpQn+u70o4|?k$9*`Ca~x^>mPFv6T*`8 z^0;@cix-b$4#5Z{j2)Wh?N|V4$^y2w&thDxWA*s$$dCbA$Y_hk7+^8=O_SI}Vwr`Z zMMB)=o(iav`8HXV*p_j}lsS9KpVi*IMIUVr_Li0DC}Nv=E>OE4(Im1>zlZ+wS(t3nz-B@Vp3bhm!COfPeNM|K|AAU4@`a+5{wnqV1968m-`uKK{q}o!|U*{Oh0n zDIBikaJb&UvE>GitTu3HwT_jQCDa;?q{9{CL&SiPG;1)JpnT_jc*j5ZMarGMVT5WTJultW! zFnY##HDhO-GukjI!Aw-RX%m>dHi3tC*LBY5{rJ5kxSNFZ!17}0byAx$k*B;sFm6+Z zX#?iUE(!VCqyvp(eInhiO9Tvqb$McJgTPfQ4&)rDKqJ`m#t{!y&+JxA!D>D&OYpNSXE@Ed*NY6TyR&ub9F%!B6CWH?5oHoZP zL6yg471PoC^f+AbCH-FVZTPMONrLoLia+o@YNn@ksJCB(50~ss8;23p1V38)#t7wJ zd&?2L_U=)Xf#lx zuTZU_R;wycLA;Im$;?F)gVGh-B>gvbMPSZm!d!@SS4OxJ+4?!=XL2Z&E7+W5@rJ+r zS8(FK`;{}Y8XtQn_WzA`DlSY2LN77HW68a@b-pNHb~9=Gb$&lTh}b5dxny*pEtDuu zy*mcv`_&fg?CzQOY4#p@=#0J}0JH>2sD!ZLL={*;c+WoD>|ZWWV&~RAo12jZ6O_iO z!v+mbe0cU7yqWnigykXt^dnd*Wl(OAsj-ZV+JhG5+;T$IUS3r;LxGR`fYK!dE) z78~RB>sy%C58(c9dshHX+vYoe`6_CfBWvgnyXZA{aK}qtf=RKA zD_c$MZ0{(6N;b?)XA9#meE_!~K8V|IJ&s#%J%W|>bu^Y%PzV(mVyp`93=qoufKvl(((sbdH+Uv;O5PdEj;g+7l>wsw;n5Z6 z@@;!A%)K?++$pJ|+wE9|?=l&P0oqYqdqxW4OW({r4~ir%9sN4x-=fpL5x{D@PaKZ0 zceGI6CWiWr7@&jD4FR9zIlR4?f{N)K(;RGQhnA=<8-W`GGx{L5J<}x>0EuKN$RSfI zqka7fx)-0tffX_=mylQCL@5+(kez@AiM2Hpd4sos2yOKk1Sd$9L9+?jwb)*5Jdi<6 zL;5pcd>s8!9pC&d534l`TV)GSQOMzmXP?8*{hQxKu67v3m1VVw%h5?MSnF2q39@Sv zL{ur~6{urwtws=ZE{iH#rv{^66~auitFVNv9}H;CIdMj6ve)rE&L^*DW|J9V0*{SG zGB}uQ&li~OrqeMMn;IEP2z^3uVHqc_gBl3(4dSqprkm=b*O*V=C zq%V*!LA2bX1e3Ti$v}lVdWRM)G?G|779Lqn3oAU48KJ^zLIS(Vn7wfc2m9M7udLzH z^=))JO`JM>6kmPjF&w<*Ze$A$0pd9pCQJr={|xAoja&1TLn&WW(t`}eg(5-F95Hnc zf!_rbi#ajQRH|i^i+1eJ=5=hIdjZ#;KaJ_Qk6e8nM{YZT^}~lyt}UTds|W~5AjWt| z2In%`?H&#g9awnkHO9sHm+U=I@j=5-trne^xy+nT0bPl#zMX*(24@?qoKMU z5adLV3c<@<3&ubhS{f4=!dC2TIX@g?IP4ko$7qapr-gQ_iRRW0)=u7w19#jj)>~E+ zn?olHO?%Uv1L`XN>#Z2Msk#400_dB%VA9Kq2xRkw*4aW*s+)(kcNC*v5O!SmV`nvW zJtz_9lE-AOEX1fH)k}S?qS{+Ox>OB`C^46$Vmy}JdZq;bn?ynqCR&GI>zJU2oh>=m zK~ARQ$uCzMHtG=dP+}+!^Q1wNWWbfARb!Jo2f}U}<$7Y~ful7jbC)01h2m6F`JEEe~|~ z4T~AX`m8E#bH4dQ=a_&6Yb{P44MWPCJw`Mflt} z09tby>?Ub%-%0_Ho6Kc!?BfK8e%Jqnz-JQIOvmW+He=C7$<@8q`(6ndf<9;VPmEy* zR%8l5TT~R7pc`gt`;1I;4gl=}NQAfHJ7?XD29Y$HNkyc+%dp_?xNn*!-8G)DX5zxau!Bu!hqW6vul*f@dyA4#_U_H|QwluD z66!}X<6XP(Jf8gA$5EcpMkykjXHg-2Kvp&w3kPi>56q~VKY&iea+@*WEFYiym_==7 z2eHe?2!rtmou1hZ&prDDp1rt<>Drxmexrl#&L;YUj@qWNc$c<(sl1F_ZCxw_$B!Pv z%HhLkksbfYL0sM3K)*M}kX6dLd|*}fmdX}@6mWS=Te%d1$X3*?mWnJiQx}b)6~)O$ zCY!Q#9#JO~29Gn=%|*fG;9t_sP+Wxahq6qp&@7-HEBQ4X*oI|i6BYT<`WJOlMob8d zQ_!BHox^!C+hw9+Fan_E$Anhw3@Q^C-S74^wsNV04vX7p4l)*qYKA($i z=gQ>@3WcKd18rXZu7q9)tWkc_5n_v02BkSq41RKc1Ry8Xaj?q-d?3@Yx@JV#F6j=%B!{{WQ+8KBK3wY}^~ds`DO zV{9u2zd8c3`W`nq;X&R=7zO~9sTh+iGdjVqIR_Atbkq8`t_Dh-_G_GwlB#gll7My!i2;9{B)k!x%~~Ud_N8IYY|hCNlrq+YR8PX_GOt^76)EZYWLT;UhCCV=pyzeKyuRK`f7=+++20EU5+AqM zwQh6|AD@oVtD4~I)l2xXAOCTjKX)N~9byh)%{b^F1~~gTy4|kijyZLwJ*AW0ZNun9R%9)z|`Q5&b*Gg==FJgiAIberDe(#_SzqXApWrU9XG=B$_ zd-vaeKYr$Ceg+N7sRciKfnVZ7W6+8}(_Ztj@Fw#zYp;W%&u`>+?q|I(+L!UOiUE4@ zgd~Z%=$9Zf!hVfG9dp;1^}y3F-7krwy*HW$->)|^LOmp(ND=+AmqfR_#p6i!f@`U8 ze!MpQ9Fvu4@-}!ovPpA{%@8&@g$j&X&p(d-rKeHK^C%i$ri%#BGUh4THTl3oR%F{y zi+6^u4%R7%O5FAm6*>!c=@arADz;N{n}vG)ME}wzqT`lf+*F-JEhk10+F;N_b7u$t z_iw)+ANk@}fgBk$Ev{)kpdz{bX&aO4r!BJ8!{(tg^=9}bDjX9eb5mzw6Q;j97zNU z+Dnc(NW$!|P!#R%aImQs$=_seM9=R!A^vVYFEkUQ3kU8RTVe}3aL46}L*$&J)MBFg znXtRo6f4;={_2~*32(apUewmsP^s0-PY_@x%qfcj)rLN=eM8?Umo0_j0b57vOzCa7 zX|L0#VXndp2nje68HepD{f~Z$I&+3tklLk(Hrk4hW-%?*v3l$dObgWjS~j1>c2}_1 z+&0znngs%g5F_Lw!ooA#Gqt3Hh?}*YQaKgx+Yq-6g3`>`us0*y>qc@oNtoUEpxJNJ z!A8lpIQX!~#cnXBL?pQVvw(RyktNaP=i|{cVU|5~*Itk6x@-RX`16_jd8|E(0sFbt z2mrnJ)TZarx!8ZEPQSx0QK&kjE-#s@!T`_C5W79ybq~ zu2!qcTX}(Fd_O;a(e)*>!g?_K!izZ5RT#_m_;=>2*nyaM6*1JR8yRJp={$AinvC$N zM<2zRr=P?>`n!J%jY%KJmKr$LsNvvpT_ETKYb$81EUTcO`D*58JDnc7U3O*#^0(fN zZ~eg^RSr5Wk#l?F#R!%EcE>KVx5)sVt~Uu*{k=>7B?!~G0JZxB?l-#SdJ`GAYZekC zc-HQnGoezeI0ok}DCXR2mgldx=W!v2V2?fP4J5kUgCd?Yh%g`V8Ptt41WSwNCJfB> zvWJ+`f;GL5;QPBzF2XZybR!m%UBkY)-9A3{d;b~dzVs|96e1iK~|yuctZsf)`lg91q&h&>uGwmd+0Lbh2VktWz01Aq9~)A;YiKVmUbM36VzU*wuLN+K2+4FHTpv(|^a^_z%6;jq=+9Zmk z(H06IRyXNIgcryxVqe+c33GcE{&K)=iji{LK8=0Y^_|h0>9DL5|T173FD%kfJ;|BF~!Sy2(GV%uUcw!(FiaWFRh$S3~< zKl&s8s|ZUdAKkW2_rhKlLMk5|e`M!a%-{Sa`y^e%_JIS@{T}|z0xb(On7X{lc%oR8 z>qlPAkB@bR7bV-fvJOVh0`9&viAZ=KfvW>Sp*-GTt0p#O0OH%aG2#V{H?jBa0bNgp z2TZy(@-FnLg!UUxq%ZG1yn@%>bpi*3VVa_t%cEK$!67j)1(b_r;T$`imZ;jsB6;bd z)1Tn%rHksybYQuT;$ieo`ICm`f-K z*JA`{#OaVUvVzU-2)8}(Am03)@4|q1Eqja6i=;1|2&sVi+a05@_ZZRO$3fWSntMsz zZ{X)M2J@oz?asKb-%t#_$B>fvO9X(nNB1aw5^M-NWGy$-t|h{^TuzU3EX_)t50L2)x}#Ld=-BEBcH=# z=dPpGWy@3o%d%oSK7MFjo3A$-;fd2Ph!vU4J_lEp(QNgVWFpYFKN#cM(~seucaL!5 z$P!*?*YV-cp2t&9ynwg<<-dgWMp;QyGO`K)IUJ&1&Z$yC)z0G~I)gDbI|B@+d2DWM z;f|9>@QOQ6;*rOn#+M&|2A7_F5}9fp*~$_++kLclTIh9Ka@KSCGV)8S$QDajURgn> z)5hl3jvK8-HB=`hi;E^wuubNc=ow7 zSY2(PoEf2BD`Bl(MX_8(ZD|S3?GBo)Hrk}2?-E2a!gSCT7^K$U!ttGFaq{3YZoBme zR@c|Dw7QBigBEH{Oyk>_3MRuIhMgU?faQC-a`6%l-v1W06E*`T1g#Pxy3kyl}p&Vin0uVUkrGMd}uuH`uLrL_b5ym_Mf_BcMw zizjcSS8wFzzsTE0VkimK{8?ZA>lxCX0@lJsrgHqn1tsj(hxC)8(lhP*EYTOwpI;{x z!ZVK^Eh~#H5@3))u2jX9XP-o6cnvEn4KaBY^5ulpE5|m;L>vc(GbVCmbO>k_SQr^- zQ*|--M+ne~gp#A z#<|QGnS21VsqGPs)=_9hol$#;axtfN;xux|^GU{CYhA4{z8L}>b6^`WP%zo2x$`FI zcga|6AXgg44Al1reVtn@71i3A4g$X?fQglrly!6-$iT1GF*KgUPD0PYjDJ>qbG{hN zC&+_9x>j$57MV)BJ#1dzz*chy&2|er&299$9RW8K{HKvqt|DKms(_?WD5F%ZN_U8; zn@n>#Iy=sekP$FM+c)fE7IlzvkO5V)2$Qi_06rx#Eg;G_UyLWXf?O6b>#|{a~=G(x4!`oyy`yGmJg_v7maGM z+>#0J%`MCT03ZNKL_t)91qZ`EM%})Eq14l29q=Hswn7*W0nl8Z1iy1l42S4+d+4;9 z*xKAg?eHlayZ1F}L2t~jWSO-jIf4HccM9@`pi4P-*7{lr=7_n?tvEUg+;?V`+cCOg zzydo1jWIt5xkf#yz=FxE6#DE{)-DrM3sUz`X>yVeifqUknBk06wtGaNyWp$kyn};- zE8=SLNZ&}jx+gnld#9sx7M;-5B$mlR10-!fgH6h%NdWYI0==eAZ>;dfL zjPi$aywmPtr_&Rw4cQx}#VTI^ZSO+kz=7o1&YpQ5k3aDYjvl`S%Z+7Yb)Sr|eqaSG z4iu0%>~}tc+2#hqBhc6b)RYMf#L^y4f;0Pg=rq6BU6F5E%})Opeftw_6i&wI=67q$`#gm_RQ2-l2iS@=}a+v z6_I5%O}~Rb`1M~wWlR|ufHP`Km_w-XVG8DAKC|q2aaJ%H-a-+x z_^IL`@jkZ6O%E~EU~{lLG;`C_&2*S!$qNE6Tyu8BexJSGv1uN&;5}a9fP4$QS$C4| z&IZ2p$VZUr?kF&p_24mqrz2zkBJ&On4&F=PXB8dNJ|)YIbz|~mmF?5M7@fKQRZuk; zgP=Du^R`AgeC^s0pMLUrU`U357RF?6rrnV*p;E3PS6#u{`Whboi|@e4ANi6xeq;+% zT;JY8tJ%{8m+Q;s_fBY|T7rx=5^ZZThp-hXpPR`w1;ZI5m_W8T6Z+l)o8VN+PVRQj z2NU)L9Lug^4>%T!5eQc@pwQC6pFkbDo6r+ml8&^D1BNYEbVz}ZVV z7wQPZ?f_zLHpV>*s@u9!EgmuoSkj&~K%TLYPP0?lebOxgHPF`VEBQz8vw%g@EQ*CP z(AmJlZ+;D)c=~CazO;?C<+`3@n#p71>ISY{zN7*<>Nmc#ix)3zu35x>b!!Wy>MEw$ zVyJ7S{5IA&KBtnElL-dho?<_WRrGq&6r;`#b~dkQO)0rT|1eiVzEnY$`npmTfLwlL zp(r0upm6ydhM$6p^Vn{a>tzbGw=ukW5#{O7=88ahF+OKh#43ht?E?$K(z7GP^!eAk);ep`LkRVLKjIcJJ!V?iGu-RrHfRCd4 zq*8j`XrCj!$N~4HB`B`ZJq7molHFb{B2PvD$5NKgZx^`ILcK&f947 zde#*sZPA(le&!Oxv@;h0rswT0?V<&~jgK+@E}rKYpg|pCdm+f&IhJO>=UzY+et#nX zG`kn_Tz_^4vdCVE7@*^4vF~gPz3gQ#!_WTg&#FLk(X)O%zSqsp+0UBX%c@#5_wjq% z?_OGTeSb&%ZV>?5EH3{^t-;t2*lXPJ=d;(DJ!4k3FSa)Kd%ro+x(gV%*BtCMR=JEZ z+wk1pn0>F5-R$@Q4-DfDI7ozg@Mrgk%_Ms?T8w+ivssj;+Yw&yWV%mr`MC3hVi=r1 zV+p?RRj-ts(R_xuquWv(0^_Cc`4>Nr_kZ96%6kz=EBl;9@nN3j?F4_s{T_bc#iMT1 zCV31H<}@s zyz_J)+8WS2=!RL=uUdBs#fi)=Ww*cMW#HX!e+c)z^lp?_S5d3i!EQ425ok+m--Mz8 z#`v|d_qBuo0%>|1p!3GLjuZ#;e@5VLYJEc!H%1_4?ctGB%7z90bl z`0a|9F>a)t;&Dfdy3TpFk(WEC$8D-&!`SVJv|!CVpVTHy_28U0Kc9_{uDh;823ws+gtuMyki{Ep*` z0no7>EIE|RS@*0^v>2}$zqUVPY$wl;$Ciq%5FfXn&-?o`r0dY)D3Z1UK(o_?<#@$% zIklYJ2R`_I96NLff8(#b6WvQ^alBE(t!v9TveZzA@B^#MXsj+vzcJ1-==HJPZlli* ztfLIFM^57HfB#2OSy>5>=DYA4DpYJ2%>jIG)B#m{F+@^_!)E8>=Ho(SnJ`xf3jjpm!|tWZWfemgZ^|fsPx3o<6=ghdi2ig8rn(tf zYiBcf^qCj%M~|OIPo4kl9xB*S9@y;WSXae+Jz3{&LnUe>vbUW@mCwne&v1%i$gth%oT zu&(q#0TahIhJ?dc6P}A+`^O3pH)}-gDZ8BnH*g^ zfF*W9X0ZYb9JnW89b$Teu3<`;vt<|YZcmKT)Mv!~@ECS-Cm|mL{3Km1SIX*=oH=wH z-}b$K4}~i8EM~ts>51VK+&PK@$sW^n8*gr3+FUO1m3FZ#?PLALHuHWBURyljC;Z}a zH5Cx{ee}1-Zf4E&G=A(Il(Y_`Tgc+IcGKaKH^@g)rr!_%9ZjxHzJp>Cm(LuPCq1QU)Qk8pAO8{#9yyA& zrJ5Kx-`l<&w;er*JMXw1)5!qL0T!}Q1w)lpf@H9q z45eTzP1Gwu zuC#(?<0LYbWptPr8)q@Z6!m%qE9C;d^7*ge-dn18^IP74V}}o7Fc@RIHN?Mt--mJh z#7O~Os?`Fjr91}RE>>%0w3=6O$1O)tJFq6_gsj(8$*h*>4SMMG1_GdyiHN}SDFbtZ z9u9TSdp@S`LF&KHb)g4JA71vKVK}MS}&{Gjmh|2u7E<0EvpAgtP8Y^DVAzwG5nIe zmu%3KM`Y_2Xn8!9(ZDr80Beb03I$*dh{`HC^F53mj`yG(=DEgd4>|b^N>WMENszHI zF>nRZv6dR(8o3_#JdBu`h7H;JLvVhXm7XB zYqbPeX7FD{7MwkTodXj$A5=v&*&<4XvH&s@f&of73>n;>7<&r=8LTcNyFNj#2Ev#s zIBRkyE8xg*V!@Z`bYOt)F|9`$Xk&CPJd1m8J%s*rgze3i0zS zE}}OiGaT97a>fXnCF`=WEcY^F^n(bIU zek%?hy$wt22LxzYYBUreCOc_9!xronbw}_jKLYg_EaAU=cazaTfQe$3ZGQMp2|gaF zxRjy1pE=c)0&#n$qNo#!lE-9Jhv{4*0M;eFzHN0 zMm}EKY&>(Ky&S{<(DoC6c{9dXaG0XlJ3&J6`3V3e=-AX^o3-6yGU;%;)b5mRXbBJP zCCx<~5c0j1va#yw!OJ$2HW<_);_r8R8+%>n zX4ii)gC)S~nMXc^eD^B)ot}yWD~%e8)rw?HzECoonL!xsi=jZ!WaJ$5yK?$E?VbS8 zWVFn&5CU0z(>uNs2acbzx1Ir>JAD=xuUyA1CvHQdQkA1jN0jotRAzgkq6LHKK#CcT z`XaEohAM7>^1?bz;Euu3nh#3Gf6oT*%m(yM@~Y+!`^SM%JU(I8V*v|&T}n*uS%FP# zZ}E3AkgEFv!OvERL?E8ApH9_{z!`%WB+>EebYS2w>R2Yq$R^ur?V#J~sFIj6+5<(Z zUM`hYbTQf4z$bt2*HQJV?!X4dZU(th3E%$izk_>U^IGi_bvsE?#Pc>tx=-n7Mz9;( zehWay#`tJ^&04uy;x}nW6}6#H!eDCQ9wbQguJj2(+WuuUym$u)p*G(@56^a`Z>J({s(d4(phzlV!*p3 zo3pHr4D9G)a>w?JF@3V&nt*7^8!{$ai#oL`&6lLh#dI8~T18-;WwByj#TD!_Ls@IY z64p71c5jh3oO};YdfC2U;fn#5%@^S{Xp1p`&pk`qo3@PEBD8NU$!G;Ez<}`uPY`AZ zq#ocR$U z6&9qk;Bt!1Yn#}-dPUE@esEpy#{AD% zigxyhc4ZGa>XAVQt&PhV)6NxhT?ovwps`p%u2e>*R8*@!0>Js)?9fAhi;P)(|74J6 zaF~F2>YaQ(gG^@!gUjbp5&${_uJb}*vQZHt?-PI^wx8%`gf0Nyo=|qW!F5B8od7!Y zI}Y7?65su|zYmQA>jtD!dv7bMQ{Y^H>QHH-z_%wzBDor56R#bbExK7cBeiUYI3UM# zl;%+Zoz$+CDvAL%N#Y|h8-pGU$0aO9VN45>ckcDi>nI1Om<{T{aep=!U@r61z_*4N zKb5=uN1o-N@+-3iwWb%HJt@HNXe(i#rU3=#H=@@6uoW@W5#7|&jW6M3Onf2yC z13%CIr97m3RPnED*#H6zNgiqLxxn^30NUqDdy3cV^;OuS!jF&)a$D8yRWDXyf|WjZ z41~}-i&z194&|K#D>$B*aVMUO`LX(S_IiKw@0Wi&P}{G|d-*-%=b4{NpKzbUd2j+h zr=DrI+t#`}fWI98Zh#ik=ka{Z{tmqKr7y*M-t!);Bmj(AgD6P|?wycGPS~%HcC+=k zmq~WBce4*u?uLiN?^OWk$URNsrU_6kYEeCx@S2w=K{U@KQ0F7to`8oUz$bN6@xVTt{t!tuQ|` z7|9l5=Li-2(Z3e}dZ=PjP`W|$TdYCCu!{uSq8Cxm9W?) z-fIf5m^nY)47LyL??pPvWv)PFj3EpMc=#O;<0t;{PbkK1=cjol{zX6kKmNvV;#Yp< zS0X?)U#EdP)YXj_<2ww`;L$3Z7SrQa%pc}I0;L$ZC)h)YK8SKzkqt1f-_rd&+opTb zJS1R-U~7eNTmpc$YsFybcuU6y%x*dC*)+v+7|i5_$jB$AId;YE?;x4iKDP$jjC?W?C*@krx z6k&jOzi}WHk=nH5#ez7&q*TY+ZFgc?s#&3XSji4kPAx)Tq-jjj{6LR;TEsP4iD^Nh z=lH@zry+&~>}xjyJ|`zeiXhoMb8`4kt9)*9zD5u)9FHr_!~!h7q;(RRu6}9h=ehG1 z>X@se4 z?2GJ?y=;vaYr8BwUhk3nkx4tCbNLM3_j5mmYG#a;auJPc5v6hwImSRM6(g}@ETPX< z_8pP6UEFBm?DZyIXm->^>vF4)_Lz0PB)Ll&ppAJnwZ)y0+4a++Ipb$>Az^Iyx@@0+ zF2BdTo$L03#~kA0_^nX_Hz z*MOl&cfDO!$WUWP}pCw$P5xusd|#Iv;zHV0d2oriw$d(*(Q8 zF}6m#o(%K^icSmw&F31Ai0>MUu#POUj79b{Q#`e?gAac8F^4QJqMYC~FkvV5c^pZy7i0HG{lfXULM(UEF$9}3vE4ln zm4dU)&Q9$v2Ob+RJI!0kZVfRzi+!a(9Ie}JZp-=n*x%`~dJfsr7QdkU{rO+~dA$7P zuP~xD2cw4K1jSTyd0gMPj(_+Me;AKH_E-Yyor~rz*g^4*wXdBHCoTXr5pJD#%nV9> ztk|(m-*b4M^cSL6Wj2s?mYH4m4n7Wj{@lz6ljzSpzrU3OP)Cx`fhS-MR8$iPQXEj8 z$dfR3e-9oLN_3Zs6-fYN&!7&4!SW*$lB7 zygNn7)`??(d|`!h(0(82#ZB^D&NeM@g0Bfhp=?$ka9NkG2Dd| z`Ag)#rB1BHjgxg8j!8vmM9h)A-`RD%$W-4`g!?kwy&U(J`aUM zWHJG{*ON(YEqozN8a2Q62`rb%09{jJNI*6kb2$Uf8Ox4UyAQivwH0B~snguV_I4ZB zH#Tr}vxzr-_xGc*emFeDRO~?S``{<>*4MuhfAHzAU{YydZG9D$ViDufL4&wo;yzBrMDduTimC=_B1YB+Q7=nDqixEQ#f<}JZ@jDq22A_+zY31_o=(^ z+rRd2arBk1NA2KYfvW1Ynv%A~LJ8$U9*ufg8|Ncm6Uer2-y$`RzD+ z`2t>e@(H~A;n(B9N&_1g&S3M>Mg05U`dyr=0N-@~2{hJMFle^%Z@xUm<;qEHwt84z zUB*(SgyTmJq21ZRpM3fW93Ef6%U^XLj-9v#rOX7UFJH&==XY>zr-P#hkDyv9;ox!} zwGuZxaOA`(oH>0CtYX||>chK41#^s9_P`~rls2#d3FdI10r6q*fscM=r09`2B zR>imgVXE-5o$mYH3`Kk8HwKWzS~UtNB+D{o=1ErTOhC$SWBbk9H>Aif+l5POYjbP; zhTiwwp0KAf+c~1o^i~kDu-jX_ecj*87{6clRldO|CK*GQf-Y?1c{U@=onANK%)p+_ zH|{B!qRTOyRxFlr_1tMpHZS17a#bLIRsRvpN~1boLWT~%K(&mviCbBTYcWRzhDj!s z36^Aw7UO~?GckY9h?#D4tBv3L&_{6cuDkG^-|?5Q)9MPe{GZLC7x!C>?&u_$NWD1i!LUnE(dP$AHF> z+HGeItT7s(j{-W~0osEBx@w~}LaW`imeaj11|5Q+d+7JNn6Qln+qSw>768@?l&VTJ ziyXl;1O$*(FhgLCF;o*Atu`PNSW6tf4?gRZOnUr|Fu|-q!KpOtARX7RnXn=M*eX-(Jc$0PK61ilQ6#bZRk($MUI)()m5g7_qX z75O<4pv8_0y3qy@Os=3)=oChPlQc_8yD{=2!@W`|zFU9I0H9OCzeKjmQA@O7>L|x1 zpz62hOhP%krd`9>!zTeiodkJYKk8otn1rc&Q4G+rrn-^toBwV;gy7eiJ#M#0@~76X z;}M?u^dDln@f=3Iu>qi$swh;-VwDsCIzyRY4A2Bnu~^Um&^-)#1N6zR-|4BX5AADm zb-wgh0MacoLkJ8ei0n#sh3-A3B&>Og*$kopG9ST0mz@Xc0(AaVIvPz$D@c zub9=2`-_E0l0O1E^LRSx+~WjB6C~N!e`L;Xb=zn*o49)UGA>^@kM>RrCvQK6+fJOo z(()3jEZ$`6!Gg7dqz`lE3y6AGJoNT=7*H~>B+UZ~ zYR%HM>&m>F2d*Gcc7Lq!74vUU+Mah_=598}C z`h7kKGoP&C-((n{*_V5olPLf?3F0{bIv#&u%}+0r3LVX&2bK(ZItTV}k7CYOo{?L# zvh&8)@4Nw@N)qh{iES?z_y*X~`v3ziy6d83n7{T#ahKf*y!fg~XxA8JllIza;FJs= zPk!OExctmxSgsW@%~^pJ^)Kya2C~R7l+Bx#5!0~PAA&*%jLY8olPx?|yuf1I;ZU~5 zU@#GQWT&}>jqU`WK7AcuyR?Jcw2xl5iM$AirpOc;DAreyD`)Zcx4jiFT;9O;p#1;y z_8wrCo#mO}dvmN?xx2bLsFgqgNu(AQU=b`}0OJ4#V-LnQwja;h;J7A?@eX4f3(;sF z{O1o}e82a@p`(jf+gO%DhFrQJ=Y?z`ltls@7W13-7VW)^jEyk|+8~srxqMCl*c=yu zzoPdY@It$643Wtj=$pxXcIwDTA+-QqoqbQ=gT*Kol%!2h`%4%JvuU-{oXnKqsSCo= z4wSAec0R}q&EBRg`V-b9V!%5pcgeDya)4uk1{~Xif}a)GBSnw`yk)Xai`J#}tAKZh z0t6Ih=ww0yn|9FXr%3|Pv3+O^o2;m5nJ+$@wjjX}_9e9=MolTE2kw)(F#+6)El>4wF(yxwX0~$-RZ6EGz|9FRe=OG+#`k(di+P zE{M-U;023hgi%h|wtJ#ud+dOdN(gIsg6->>@U3p3UEP$=r4=oU`qO!2a_rWSM>1DH zu0#fCvcIx8FDczw=-V)imL{8^bZ=-w%UHR0fMlzR&ZP^;j(Xz9vEY_WHaSVoa4xl* z4+|_6Pr<@Cjjb5)$D;8P=r&dh30wn*jvdEqfAUS3Sy+_9cjePFwjHj$^Ka#-xuO`a zP%W@Y9T-;k)buY2wNJC1#TZ++`N{QH0Z zn`pH|8=hz3z`D62+AI^`q4d2YA7C6mFChSW+=}@!*6pJJDC_wdLfzGaO3{)P;; zu4e;yfZgz{*bea8sXJLJGLQOFI<%xDcJk(5{6)O>^*@GIqY=>yHa-I2KKuF4;05=p6An5=HZgrVjFE;05Wg=T`E(6GL6!;y@sz(khAZzV?9dJX zEwLlUX6dgm)a>?&0G);yW=ohnb|n&pvJj?3ISI$b0K7Ou02B*>V4;^Ef(L?bA>OvbXd1gtjz?R)j>iIW4n9kYvs@;@?x95D_5?&ttqCcbIi4C6~*Gsb3Jh1h+ zxP(9U;P+o{9& zqMgcNt=YvULAB2Rmt*OCdEYMc#~lB?HXf{Psq7y zH`@YYZwrfNAET*xyx`}51vAI52x9$y)@NTiali}WYZdob_WJz+9}&6i;?k1SjZr`F zAop?_HHcFQCTpKF@9W~RdfNNYH=)cY(=G~8p|syK$Gyvw{f=HAL>(M%MRjd7Fcao+ z;xak#UxUJJjlc&uhM?}nvsKinQ1$L&al{ztC)Q!bv8u_3NmSQY@tKeQ73xnsglr~> z>~JWgUhI^{|7d5B(2Kcmjln9mK}dW^q~U^bMCaY_q@v=&!0y4ha`uRg#E+xs-q*PeYCFOc6;&gk-epc*^GJW$i>H1^R!981YtJ3{l zJFQHNhPeLd0!|*DK`sSMX7iXTPDsak9uKlW6T8&uchFCgoGO9!%_bhbu#EF-D^k2L zS14g-vV$R%nWk{UIeNMt%?Eu5V z2F9aOLe8?CDB{&`{&h?&973;4CYcbE7tp1S$=5|>`i`8Ncg}+YW|MpnEfc%O7pnUi zy>{;0=?(4_*HJNp+mGGE?e1OW${xeq^)2^gfF9!o1V_zDl>GvIJ02Wayge-Yu^Ll9 zbn+*-V(&4;p26=M0J=Z`bXgLLsSH6E8bIRYi_^?D9As?lk`=UpcAag&tJvJy#_HNS zw);uE;%9zYD(WrK&*aj7`S|U)`s6X(cd?EkgHGAJFpic>d9-^9Mwpx^OO+y@wYpu! z(fL_SmrJNMT6pB*Djs|69Qw%wCd);<^2N`=eUF{R@tG;y`QJW<)5{Iq{E8nE@L03i zl2$J~P-L(a#tzr|mcVTVIgPNjT}OR$T^L@Ub^S>+n`7-o{`g~Pk9rtQAH}y;l2{(jpqVaUl4G1G$N_G*J80CJc;N91NUxv8_dM&F$j=sW zR;Mj&LnO-8DOfH)|{1fWQe z8Iy7CmR!?qHqbry0G>VF!_|xPICA7Lrsif*o|;CXSVAVBSH(3Tc&v|pr-e?lj%KZf zmE|R5k6(wWV^;@`jvO$znYCgB!lV@f$FzNUz+Ph;k6;ZGB7v^jskHq2M_|k`;p87N zKOktzejJ8h_InUWCIEVNj5Lc&rZI;(xVcS4^sEFxuboHe+mM>$zY;N|{}rF}oeemw zjMQXbe7c=+<|<*s?Gf$^QTA>Rjm3lnI?7e?GvU-9;NrvIz+{df9R-`w+2^vQGc4N3 zO4}70w;G&FD+7mXsV5IKhDkBNSjnZW76$}Mj}#a|VAUsX|7X;Z!LPpge-gmwg_SkD z|Ia>(D{gouI=wF1ed4EbNTf#SbqM6>O3?xDsw_bSPAJPVjd(JUF+@lP=wg9}K|+{3 zCCQ&vCTD^u_#a`COsMla5=fIyL95{-Hj-2~9-4TZgw4n~8( z=Uy9aveT21v)xcuU;)*RFz61@>$H(fXpx7syB;V*pfK+VrDzh#Y(~L#tnj39HzaUC z8C^*Fsf}#dB2PC20|z;ln4ydApe?N3t&5M~rt7Z5(&h?!%`OUsX>6`OfplRK{lXl2 ziID)%*#?}zk`w`o^nVC|PHWl1b#9Qu7CnW4k}ZRnLAAQpJ)2r6rIj*@ys0NSBZEEXgh2BM2RERNO@h`qk!{ zu0_4mi2`78F1YAMf>u1ISOQ!EF!4Gdct)AYIodo5DA7VWVN8)<>c2w_v}pnT%&HvY zGCKfHdB1SC3&JA8eq$BJp55=<>VVnTQUIoM)EQLpmnJTD8k&K6igas8;M!BSdUpL@ z4s7&|_Oe_3-%-9qXTJVEz)1=jJU&hXE2i@L4WQP_P(TP>7j`K>O8i68h$0$PmsW$9D&yldevjtgCSg;Ag zkRk^Mm~OUOSY27g^70C{YE{&mO>B`>jo|Ng8>22+Wc$(zFkha;)bt!Cr>AlF&>T)2 zTfm9qM^P?SP^+!so;&^?olECMmj(e02BxW3Q)%4zycgmJfBa2iBU`@Bg+e05d|LeH z&Z?YqNvQ+@D$!3?o$RJM{7x7w2}~t#LBb%U+Ep@-e&E)CXfY?*53cz8ciiWGaCN^x z>+S&PF}|Z!uQLfCGED_VxZRvBXo4wr(Bxe`+2_NbP2}(zX^j^T>juL)xQy{mK?G>6 zH}?u3Ls#d(qTwJHs#*x=QG@8Z<97QqZoS6G^i{yeJ)MZycPk@Ib36xHEAPsGEICXU zK7q3jKZHl_`e)2d7Dxx6#TIgN1q#r&PqUzncAPPPDgB24rWIhK!8qCqQrOVzDkDB+ zL{I(ZTCIxZ?KZyn&@#?enV4s1h$>Qjvd9m`ei&pYFn?qo&v?euapzt4;>zovgKDRN zY>tcpY2;aa!hq|L-ICm#3V@;~!CD5&8PsDCO?0Y8vK^y*U*1I^e3Vgqw-k#2+tRV5 zPu6DXUXc;`C9Plyh80^~ixp^(v)GV;X0n+O0L-o~V)Hnb6K#u1Fiu9gv#6k@SR>ej z-8@vEaE!8Mu4T7?mV@LT*}0WDpR!ljqM1anDDFx zt!uR>W0ba#l+nt#CO(C0d&`11`W*s-mqHR{mX-pRzO}Jcn}N*ywBgB$EQQ!naWxTN|4am+1DoICAuetQX}!3nA$%w74eeg1oEfJYf*; z3WFV47zOmqfXk!akz8P0sE-FNma`K;S z0cEF?RUalWy>J9S^2Rse@bMGQR|~jhlueQ+(IvS;-QnF=EBk_Au?tOxMQSlYW5qV~ zhs;;E#EOkG5*i8GsdM~cL0|}I4r58aWR4~Syu@T6=nX=n-wI`;D2YJ+tHg52AKTl; zZsZKXxXcv0TQe4cEgQ(mh;GtnOS^V?rWfCEUr_M(F1pZ5Ny-R=H4dsAOag}t(9y}o z5eI-CXDf`;5#x0GI9obcOYbJ*b<22tx|iLc%P_=O@A?wn^{#h`d>;wrL^x05>`qxnULdPX+5rP@39a> zSgLaomb>_x1ZUD>k};t4I9ts=vuF89G8=Ck0BzUUccZLCo~2`8MK1x%7!?_y;{a&2 zksT1!y}Kri!#Ut{DgUp&`YHiH&&`pwe|P)kpgEEF`^4wo|2dEk2Qj+#NIW0#>rd*k zH~>0gkokMT8<+p?`tPuq#HLo`2o6BwMx=6DW$<|GFFJISsh)wp>$?R~V63qjw=!+K z{yy;hfbj0|-%eOE z39iUum|#AIXWQg}77)muCfJ|AX4(mqSB`m$T>@EH#qJTKW=lyM(m4z{kd%TbhU_xh zrEg1l)5SdxKZXze^~Z6c+J=nVkj{bT(kN4KRD4nuv)sd=N-#Gj|6(iY{it@Ob0qfg zB!W%jfn);76UKNVpv~QVt3WQhwX&Fs|922)@$mB+l8Ay4T_ne~g9e6OcE`&|T>bYy z@cTG*>SpQw7zD}eb)|br3TMuq#arL@8(3f42xAvcZfRR}1we~0=}1_D6JvT^@<=`i z+WD>qX0^46<-07G5s4{z<5S&e_KtT?cmACTwS^ru&LXK`O#mqF=1lOoGH zJ8v@A;tC67j?}6ZPtcK?XrZ(2QvoweELOaKN3NwYBJDb>acG`L<_Vb75nm@)LS^wJ zP?*4A5HhIiRL7u5wrzKcsRIGxWbET~+L+JAYChXDcJ}?BcUP59O3&{;HVDaX0+;kiyqT}B_wB<)AmP+B;xnQvicR2rP|5w^+ z>&lMM)jWVM8+VPb;}3F=-A1XdpUzNc#IuKobL?9h=$& zKv(NnB?I)@CeCg*aJJsWFgJmXW*2K!?FPbe2}y*L3%*SA?OOkHzLybO1i(o*c)!pu z&h%{h!`T8;#>GVVz63dI;hvIi*}Y4JqS(2#3AAIB$$iqL6mxH!AXX;+*sQA>BB+Rvd-qAha$b=Tt~AN?yK4SLBf&&Eu$jpLIQ zEKW{fak_%psWN7#Cs8g}q)>|t&<%E6CmB_10F;?clwzWZT#MKzGk1EV z_m+H`26x7VTpGqFtXoznp6oiC5Pc)-?xm0Nj12dq$rn8PETk|K=+E~Ga#{) zdcBUfzWwd^(bxT`#7+#yV)1Co(tII@&;Rr1@y>U?QwWaKX7%4JJQLx}>0UNpIS?2+ zNH6Z>5pBAQ0wA&t)P3%cU!L!dH1iia2jLkvxi4!Zk8{M10YE;MGB>ca11IY+72qxf zgAS{qXET&=l7qJ&13$nKt(o8A_A}Sk7^MRj#ravp{s=J)hbrAx`p6E3c*@~9TzzB~ z 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�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%0AlqCgfTFchUe$ScBgHa@!63|**RID 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⪼I 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�#c*IeK6JVzzxJ-bl%?|_6Ge_4Jwu=% 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%0A{WbIMXPX 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%0DrXNW&X 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 m51keq>_FEBN^frrR85LqTXvXhGi#7+Ue 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�G{{4Ti}OM1C+oaF7zUk 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

sW6G`1%WH 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 z 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 Cpi>xF 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

  • a?ifUz2%pEt6)_kWwcCT6cMirn_Bj*mz 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%0Ao3Ho~^qf4Apsg|U91cxMS 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

    fT?NTnz!N3`y->&1cAO34Nts07%7~+Yj7=z*j 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

    xi)IRxmCgXa;x1 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 >>9%7hl46z4ZYsdLF*;#N#-$ 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%0DvH%n3x(IoLnQ|OL> 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

    3jRoXy5CBjfeU_`O|1AKQ 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 literal 0 HcmV?d00001 diff --git a/images/workflow.png b/images/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9dfa4c64100414a16febcee86d66be366d485d GIT binary patch literal 728065 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

    5tn&|h=BLk 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%0DC4 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

    ~1Q{Pp)fcw6?rIk*c+ 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%0AP8b&$ePCOT!${!Ri) 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

    @g?aj>AK?)>=O0SU**U}3rx|&1ByEV_n-0uD^ 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 literal 0 HcmV?d00001 diff --git a/ootd/__pycache__/inference_ootd_hd.cpython-311.pyc b/ootd/__pycache__/inference_ootd_hd.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f01bdb52f651f442729ef01d0fd100657d0d1dc GIT binary patch literal 7160 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 literal 0 HcmV?d00001 diff --git a/ootd/inference_ootd.py b/ootd/inference_ootd.py new file mode 100644 index 0000000..2865892 --- /dev/null +++ b/ootd/inference_ootd.py @@ -0,0 +1,133 @@ +import pdb +from pathlib import Path +import sys +PROJECT_ROOT = Path(__file__).absolute().parents[0].absolute() +sys.path.insert(0, str(PROJECT_ROOT)) +import os + +import torch +import numpy as np +from PIL import Image +import cv2 + +import random +import time +import pdb + +from pipelines_ootd.pipeline_ootd import OotdPipeline +from pipelines_ootd.unet_garm_2d_condition import UNetGarm2DConditionModel +from pipelines_ootd.unet_vton_2d_condition import UNetVton2DConditionModel +from diffusers import UniPCMultistepScheduler +from diffusers import AutoencoderKL + +import torch.nn as nn +import torch.nn.functional as F +from transformers import AutoProcessor, CLIPVisionModelWithProjection +from transformers import CLIPTextModel, CLIPTokenizer + +VIT_PATH = "../checkpoints/clip-vit-large-patch14" +VAE_PATH = "../checkpoints/ootd" +UNET_PATH = "../checkpoints/ootd/ootd_hd/checkpoint-36000" +MODEL_PATH = "../checkpoints/ootd" + +class OOTDiffusion: + + def __init__(self, gpu_id): + self.gpu_id = 'cuda:' + str(gpu_id) + + vae = AutoencoderKL.from_pretrained( + VAE_PATH, + subfolder="vae", + torch_dtype=torch.float16, + ) + + unet_garm = UNetGarm2DConditionModel.from_pretrained( + UNET_PATH, + subfolder="unet_garm", + torch_dtype=torch.float16, + use_safetensors=True, + ) + unet_vton = UNetVton2DConditionModel.from_pretrained( + UNET_PATH, + subfolder="unet_vton", + torch_dtype=torch.float16, + use_safetensors=True, + ) + + self.pipe = OotdPipeline.from_pretrained( + MODEL_PATH, + unet_garm=unet_garm, + unet_vton=unet_vton, + vae=vae, + torch_dtype=torch.float16, + variant="fp16", + use_safetensors=True, + safety_checker=None, + requires_safety_checker=False, + ).to(self.gpu_id) + + self.pipe.scheduler = UniPCMultistepScheduler.from_config(self.pipe.scheduler.config) + + self.auto_processor = AutoProcessor.from_pretrained(VIT_PATH) + self.image_encoder = CLIPVisionModelWithProjection.from_pretrained(VIT_PATH).to(self.gpu_id) + + self.tokenizer = CLIPTokenizer.from_pretrained( + MODEL_PATH, + subfolder="tokenizer", + ) + self.text_encoder = CLIPTextModel.from_pretrained( + MODEL_PATH, + subfolder="text_encoder", + ).to(self.gpu_id) + + + def tokenize_captions(self, captions, max_length): + inputs = self.tokenizer( + captions, max_length=max_length, padding="max_length", truncation=True, return_tensors="pt" + ) + return inputs.input_ids + + + def __call__(self, + model_type='hd', + category='upperbody', + image_garm=None, + image_vton=None, + mask=None, + image_ori=None, + num_samples=1, + num_steps=20, + image_scale=1.0, + seed=-1, + ): + if seed == -1: + random.seed(time.time()) + seed = random.randint(0, 2147483647) + print('Initial seed: ' + str(seed)) + generator = torch.manual_seed(seed) + + with torch.no_grad(): + prompt_image = self.auto_processor(images=image_garm, return_tensors="pt").to(self.gpu_id) + prompt_image = self.image_encoder(prompt_image.data['pixel_values']).image_embeds + prompt_image = prompt_image.unsqueeze(1) + if model_type == 'hd': + prompt_embeds = self.text_encoder(self.tokenize_captions([""], 2).to(self.gpu_id))[0] + prompt_embeds[:, 1:] = prompt_image[:] + elif model_type == 'dc': + prompt_embeds = self.text_encoder(self.tokenize_captions([category], 3).to(self.gpu_id))[0] + prompt_embeds = torch.cat([prompt_embeds, prompt_image], dim=1) + else: + raise ValueError("model_type must be \'hd\' or \'dc\'!") + + images = self.pipe(prompt_embeds=prompt_embeds, + image_garm=image_garm, + image_vton=image_vton, + mask=mask, + image_ori=image_ori, + num_inference_steps=num_steps, + image_guidance_scale=image_scale, + num_images_per_prompt=num_samples, + generator=generator, + ).images + + return images diff --git a/ootd/inference_ootd_dc.py b/ootd/inference_ootd_dc.py new file mode 100644 index 0000000..abfbbb9 --- /dev/null +++ b/ootd/inference_ootd_dc.py @@ -0,0 +1,132 @@ +import pdb +from pathlib import Path +import sys +PROJECT_ROOT = Path(__file__).absolute().parents[0].absolute() +sys.path.insert(0, str(PROJECT_ROOT)) +import os +import torch +import numpy as np +from PIL import Image +import cv2 + +import random +import time +import pdb + +from pipelines_ootd.pipeline_ootd import OotdPipeline +from pipelines_ootd.unet_garm_2d_condition import UNetGarm2DConditionModel +from pipelines_ootd.unet_vton_2d_condition import UNetVton2DConditionModel +from diffusers import UniPCMultistepScheduler +from diffusers import AutoencoderKL + +import torch.nn as nn +import torch.nn.functional as F +from transformers import AutoProcessor, CLIPVisionModelWithProjection +from transformers import CLIPTextModel, CLIPTokenizer + +VIT_PATH = "../checkpoints/clip-vit-large-patch14" +VAE_PATH = "../checkpoints/ootd" +UNET_PATH = "../checkpoints/ootd/ootd_dc/checkpoint-36000" +MODEL_PATH = "../checkpoints/ootd" + +class OOTDiffusionDC: + + def __init__(self, gpu_id): + self.gpu_id = 'cuda:' + str(gpu_id) + + vae = AutoencoderKL.from_pretrained( + VAE_PATH, + subfolder="vae", + torch_dtype=torch.float16, + ) + + unet_garm = UNetGarm2DConditionModel.from_pretrained( + UNET_PATH, + subfolder="unet_garm", + torch_dtype=torch.float16, + use_safetensors=True, + ) + unet_vton = UNetVton2DConditionModel.from_pretrained( + UNET_PATH, + subfolder="unet_vton", + torch_dtype=torch.float16, + use_safetensors=True, + ) + + self.pipe = OotdPipeline.from_pretrained( + MODEL_PATH, + unet_garm=unet_garm, + unet_vton=unet_vton, + vae=vae, + torch_dtype=torch.float16, + variant="fp16", + use_safetensors=True, + safety_checker=None, + requires_safety_checker=False, + ).to(self.gpu_id) + + self.pipe.scheduler = UniPCMultistepScheduler.from_config(self.pipe.scheduler.config) + + self.auto_processor = AutoProcessor.from_pretrained(VIT_PATH) + self.image_encoder = CLIPVisionModelWithProjection.from_pretrained(VIT_PATH).to(self.gpu_id) + + self.tokenizer = CLIPTokenizer.from_pretrained( + MODEL_PATH, + subfolder="tokenizer", + ) + self.text_encoder = CLIPTextModel.from_pretrained( + MODEL_PATH, + subfolder="text_encoder", + ).to(self.gpu_id) + + + def tokenize_captions(self, captions, max_length): + inputs = self.tokenizer( + captions, max_length=max_length, padding="max_length", truncation=True, return_tensors="pt" + ) + return inputs.input_ids + + + def __call__(self, + model_type='hd', + category='upperbody', + image_garm=None, + image_vton=None, + mask=None, + image_ori=None, + num_samples=1, + num_steps=20, + image_scale=1.0, + seed=-1, + ): + if seed == -1: + random.seed(time.time()) + seed = random.randint(0, 2147483647) + print('Initial seed: ' + str(seed)) + generator = torch.manual_seed(seed) + + with torch.no_grad(): + prompt_image = self.auto_processor(images=image_garm, return_tensors="pt").to(self.gpu_id) + prompt_image = self.image_encoder(prompt_image.data['pixel_values']).image_embeds + prompt_image = prompt_image.unsqueeze(1) + if model_type == 'hd': + prompt_embeds = self.text_encoder(self.tokenize_captions([""], 2).to(self.gpu_id))[0] + prompt_embeds[:, 1:] = prompt_image[:] + elif model_type == 'dc': + prompt_embeds = self.text_encoder(self.tokenize_captions([category], 3).to(self.gpu_id))[0] + prompt_embeds = torch.cat([prompt_embeds, prompt_image], dim=1) + else: + raise ValueError("model_type must be \'hd\' or \'dc\'!") + + images = self.pipe(prompt_embeds=prompt_embeds, + image_garm=image_garm, + image_vton=image_vton, + mask=mask, + image_ori=image_ori, + num_inference_steps=num_steps, + image_guidance_scale=image_scale, + num_images_per_prompt=num_samples, + generator=generator, + ).images + + return images diff --git a/ootd/inference_ootd_hd.py b/ootd/inference_ootd_hd.py new file mode 100644 index 0000000..2d50d70 --- /dev/null +++ b/ootd/inference_ootd_hd.py @@ -0,0 +1,137 @@ +import pdb +from pathlib import Path +import sys +PROJECT_ROOT = Path(__file__).absolute().parents[0].absolute() +sys.path.insert(0, str(PROJECT_ROOT)) +import os +import torch +import numpy as np +from PIL import Image +import cv2 + +import random +import time +import pdb + +from pipelines_ootd.pipeline_ootd import OotdPipeline +from pipelines_ootd.unet_garm_2d_condition import UNetGarm2DConditionModel +from pipelines_ootd.unet_vton_2d_condition import UNetVton2DConditionModel +from diffusers import UniPCMultistepScheduler +from diffusers import AutoencoderKL + +import torch.nn as nn +import torch.nn.functional as F +from transformers import AutoProcessor, CLIPVisionModelWithProjection +from transformers import CLIPTextModel, CLIPTokenizer + +# checkpoint路径 +import folder_paths +comfy_path = os.path.dirname(folder_paths.__file__) +custom_nodes_path = os.path.join(comfy_path, "custom_nodes","ComfyUI_OOTDiffusion_CXH","checkpoints") + +VIT_PATH =os.path.join(custom_nodes_path,"clip-vit-large-patch14") #"../checkpoints/clip-vit-large-patch14" +VAE_PATH = os.path.join(custom_nodes_path,"ootd") #"../checkpoints/ootd" +UNET_PATH = os.path.join(custom_nodes_path,"ootd/ootd_hd/checkpoint-36000") #"../checkpoints/ootd/ootd_hd/checkpoint-36000" +MODEL_PATH = os.path.join(custom_nodes_path,"ootd") #"../checkpoints/ootd" + +class OOTDiffusionHD: + + def __init__(self, gpu_id): + self.gpu_id = 'cuda:' + str(gpu_id) + + vae = AutoencoderKL.from_pretrained( + VAE_PATH, + subfolder="vae", + torch_dtype=torch.float16, + ) + + unet_garm = UNetGarm2DConditionModel.from_pretrained( + UNET_PATH, + subfolder="unet_garm", + torch_dtype=torch.float16, + use_safetensors=True, + ) + unet_vton = UNetVton2DConditionModel.from_pretrained( + UNET_PATH, + subfolder="unet_vton", + torch_dtype=torch.float16, + use_safetensors=True, + ) + + self.pipe = OotdPipeline.from_pretrained( + MODEL_PATH, + unet_garm=unet_garm, + unet_vton=unet_vton, + vae=vae, + torch_dtype=torch.float16, + variant="fp16", + use_safetensors=True, + safety_checker=None, + requires_safety_checker=False, + ).to(self.gpu_id) + + self.pipe.scheduler = UniPCMultistepScheduler.from_config(self.pipe.scheduler.config) + + self.auto_processor = AutoProcessor.from_pretrained(VIT_PATH) + self.image_encoder = CLIPVisionModelWithProjection.from_pretrained(VIT_PATH).to(self.gpu_id) + + self.tokenizer = CLIPTokenizer.from_pretrained( + MODEL_PATH, + subfolder="tokenizer", + ) + self.text_encoder = CLIPTextModel.from_pretrained( + MODEL_PATH, + subfolder="text_encoder", + ).to(self.gpu_id) + + + def tokenize_captions(self, captions, max_length): + inputs = self.tokenizer( + captions, max_length=max_length, padding="max_length", truncation=True, return_tensors="pt" + ) + return inputs.input_ids + + + def __call__(self, + model_type='hd', + category='upperbody', + image_garm=None, + image_vton=None, + mask=None, + image_ori=None, + num_samples=1, + num_steps=20, + image_scale=1.0, + seed=-1, + ): + if seed == -1: + random.seed(time.time()) + seed = random.randint(0, 2147483647) + print('Initial seed: ' + str(seed)) + generator = torch.manual_seed(seed) + + with torch.no_grad(): + prompt_image = self.auto_processor(images=image_garm, return_tensors="pt").to(self.gpu_id) + prompt_image = self.image_encoder(prompt_image.data['pixel_values']).image_embeds + prompt_image = prompt_image.unsqueeze(1) + if model_type == 'hd': + prompt_embeds = self.text_encoder(self.tokenize_captions([""], 2).to(self.gpu_id))[0] + prompt_embeds[:, 1:] = prompt_image[:] + elif model_type == 'dc': + prompt_embeds = self.text_encoder(self.tokenize_captions([category], 3).to(self.gpu_id))[0] + prompt_embeds = torch.cat([prompt_embeds, prompt_image], dim=1) + else: + raise ValueError("model_type must be \'hd\' or \'dc\'!") + + images = self.pipe(prompt_embeds=prompt_embeds, + image_garm=image_garm, + image_vton=image_vton, + mask=mask, + image_ori=image_ori, + num_inference_steps=num_steps, + image_guidance_scale=image_scale, + num_images_per_prompt=num_samples, + generator=generator, + ).images + + return images diff --git a/ootd/pipelines_ootd/__pycache__/attention_garm.cpython-311.pyc b/ootd/pipelines_ootd/__pycache__/attention_garm.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4907ef659f1a520c9d21b7989ab1034583b21e4f GIT binary patch literal 18979 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 literal 0 HcmV?d00001 diff --git a/ootd/pipelines_ootd/__pycache__/attention_vton.cpython-311.pyc b/ootd/pipelines_ootd/__pycache__/attention_vton.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6f46dc4f37066b05c6202d046381502c70c5c32 GIT binary patch literal 19175 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 z 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 literal 0 HcmV?d00001 diff --git a/ootd/pipelines_ootd/__pycache__/pipeline_ootd.cpython-311.pyc b/ootd/pipelines_ootd/__pycache__/pipeline_ootd.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89b44c427e85225d8a23559cb1cdbd7e739c1b6a GIT binary patch literal 43422 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 literal 0 HcmV?d00001 diff --git a/ootd/pipelines_ootd/__pycache__/unet_garm_2d_blocks.cpython-311.pyc b/ootd/pipelines_ootd/__pycache__/unet_garm_2d_blocks.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b509c493d9a755a323b98bf6f98cf57f9d14e31a GIT binary patch literal 111711 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 literal 0 HcmV?d00001 diff --git a/ootd/pipelines_ootd/__pycache__/unet_vton_2d_blocks.cpython-311.pyc b/ootd/pipelines_ootd/__pycache__/unet_vton_2d_blocks.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf8d075f11091795357e148a1d5409165fd1b622 GIT binary patch literal 111930 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

    lrs=^lKN`e-daBM10d)PU@n1yoJ(IoUIB zg*xtW;iKGmP!70-3dq>MEe9}4m+9T;{vy?qQ7WOIrZ9Y;&$VRa##4&Y%Qp%)W`wq* zLeo*H_E_A45Z$3fx!-z)#l!83KG=B2Q|r>{9tCovW!1QX_HqA{RN?4FVeq2VcS)$Z zB$Zt@Mv|i{?is5i9ffF4_3?B%*UR9ZOi4+H5NLL?iqmo4iRN@?q~k~n&8f6>_eb#q zj~F^mEa2<~VjmM%hznG@<27%jr{l0Ja<^SYlB+hJ&O)-#Lms3P8WoDAs3{X3p&VG|NdRgus3gFJ(cJe|&jzuuv}b;;xD?hI z+f}1bg!2tjks{Ih6qs67V`z7ycGHD<^a=E19vwOMhE@kH9%Li+c4R6=-PBF_EtQ5! zF|N`sMH&UK@~IDsk3Pua7m%3F)&GM`tUIySWr_f(5dDn2X_W^Q07z9r&0|_4N{^O^(j!-6Ik#z}J9Cnf^pE{BHg6vH^!Di+fBpW862GONG#ntu literal 0 HcmV?d00001 diff --git a/ootd/pipelines_ootd/attention_garm.py b/ootd/pipelines_ootd/attention_garm.py new file mode 100644 index 0000000..0fba9b7 --- /dev/null +++ b/ootd/pipelines_ootd/attention_garm.py @@ -0,0 +1,402 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from typing import Any, Dict, Optional + +import torch +from torch import nn + +from diffusers.utils import USE_PEFT_BACKEND +from diffusers.utils.torch_utils import maybe_allow_in_graph +from diffusers.models.activations import GEGLU, GELU, ApproximateGELU +from diffusers.models.attention_processor import Attention +from diffusers.models.embeddings import SinusoidalPositionalEmbedding +from diffusers.models.lora import LoRACompatibleLinear +from diffusers.models.normalization import AdaLayerNorm, AdaLayerNormZero + + +@maybe_allow_in_graph +class GatedSelfAttentionDense(nn.Module): + r""" + A gated self-attention dense layer that combines visual features and object features. + + Parameters: + query_dim (`int`): The number of channels in the query. + context_dim (`int`): The number of channels in the context. + n_heads (`int`): The number of heads to use for attention. + d_head (`int`): The number of channels in each head. + """ + + def __init__(self, query_dim: int, context_dim: int, n_heads: int, d_head: int): + super().__init__() + + # we need a linear projection since we need cat visual feature and obj feature + self.linear = nn.Linear(context_dim, query_dim) + + self.attn = Attention(query_dim=query_dim, heads=n_heads, dim_head=d_head) + self.ff = FeedForward(query_dim, activation_fn="geglu") + + self.norm1 = nn.LayerNorm(query_dim) + self.norm2 = nn.LayerNorm(query_dim) + + self.register_parameter("alpha_attn", nn.Parameter(torch.tensor(0.0))) + self.register_parameter("alpha_dense", nn.Parameter(torch.tensor(0.0))) + + self.enabled = True + + def forward(self, x: torch.Tensor, objs: torch.Tensor) -> torch.Tensor: + if not self.enabled: + return x + + n_visual = x.shape[1] + objs = self.linear(objs) + + x = x + self.alpha_attn.tanh() * self.attn(self.norm1(torch.cat([x, objs], dim=1)))[:, :n_visual, :] + x = x + self.alpha_dense.tanh() * self.ff(self.norm2(x)) + + return x + + +@maybe_allow_in_graph +class BasicTransformerBlock(nn.Module): + r""" + A basic Transformer block. + + Parameters: + dim (`int`): The number of channels in the input and output. + num_attention_heads (`int`): The number of heads to use for multi-head attention. + attention_head_dim (`int`): The number of channels in each head. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + cross_attention_dim (`int`, *optional*): The size of the encoder_hidden_states vector for cross attention. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to be used in feed-forward. + num_embeds_ada_norm (: + obj: `int`, *optional*): The number of diffusion steps used during training. See `Transformer2DModel`. + attention_bias (: + obj: `bool`, *optional*, defaults to `False`): Configure if the attentions should contain a bias parameter. + only_cross_attention (`bool`, *optional*): + Whether to use only cross-attention layers. In this case two cross attention layers are used. + double_self_attention (`bool`, *optional*): + Whether to use two self-attention layers. In this case no cross attention layers are used. + upcast_attention (`bool`, *optional*): + Whether to upcast the attention computation to float32. This is useful for mixed precision training. + norm_elementwise_affine (`bool`, *optional*, defaults to `True`): + Whether to use learnable elementwise affine parameters for normalization. + norm_type (`str`, *optional*, defaults to `"layer_norm"`): + The normalization layer to use. Can be `"layer_norm"`, `"ada_norm"` or `"ada_norm_zero"`. + final_dropout (`bool` *optional*, defaults to False): + Whether to apply a final dropout after the last feed-forward layer. + attention_type (`str`, *optional*, defaults to `"default"`): + The type of attention to use. Can be `"default"` or `"gated"` or `"gated-text-image"`. + positional_embeddings (`str`, *optional*, defaults to `None`): + The type of positional embeddings to apply to. + num_positional_embeddings (`int`, *optional*, defaults to `None`): + The maximum number of positional embeddings to apply. + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + dropout=0.0, + cross_attention_dim: Optional[int] = None, + activation_fn: str = "geglu", + num_embeds_ada_norm: Optional[int] = None, + attention_bias: bool = False, + only_cross_attention: bool = False, + double_self_attention: bool = False, + upcast_attention: bool = False, + norm_elementwise_affine: bool = True, + norm_type: str = "layer_norm", # 'layer_norm', 'ada_norm', 'ada_norm_zero', 'ada_norm_single' + norm_eps: float = 1e-5, + final_dropout: bool = False, + attention_type: str = "default", + positional_embeddings: Optional[str] = None, + num_positional_embeddings: Optional[int] = None, + ): + super().__init__() + self.only_cross_attention = only_cross_attention + + self.use_ada_layer_norm_zero = (num_embeds_ada_norm is not None) and norm_type == "ada_norm_zero" + self.use_ada_layer_norm = (num_embeds_ada_norm is not None) and norm_type == "ada_norm" + self.use_ada_layer_norm_single = norm_type == "ada_norm_single" + self.use_layer_norm = norm_type == "layer_norm" + + if norm_type in ("ada_norm", "ada_norm_zero") and num_embeds_ada_norm is None: + raise ValueError( + f"`norm_type` is set to {norm_type}, but `num_embeds_ada_norm` is not defined. Please make sure to" + f" define `num_embeds_ada_norm` if setting `norm_type` to {norm_type}." + ) + + if positional_embeddings and (num_positional_embeddings is None): + raise ValueError( + "If `positional_embedding` type is defined, `num_positition_embeddings` must also be defined." + ) + + if positional_embeddings == "sinusoidal": + self.pos_embed = SinusoidalPositionalEmbedding(dim, max_seq_length=num_positional_embeddings) + else: + self.pos_embed = None + + # Define 3 blocks. Each block has its own normalization layer. + # 1. Self-Attn + if self.use_ada_layer_norm: + self.norm1 = AdaLayerNorm(dim, num_embeds_ada_norm) + elif self.use_ada_layer_norm_zero: + self.norm1 = AdaLayerNormZero(dim, num_embeds_ada_norm) + else: + self.norm1 = nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine, eps=norm_eps) + + self.attn1 = Attention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + cross_attention_dim=cross_attention_dim if only_cross_attention else None, + upcast_attention=upcast_attention, + ) + + # 2. Cross-Attn + if cross_attention_dim is not None or double_self_attention: + # We currently only use AdaLayerNormZero for self attention where there will only be one attention block. + # I.e. the number of returned modulation chunks from AdaLayerZero would not make sense if returned during + # the second cross attention block. + self.norm2 = ( + AdaLayerNorm(dim, num_embeds_ada_norm) + if self.use_ada_layer_norm + else nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine, eps=norm_eps) + ) + self.attn2 = Attention( + query_dim=dim, + cross_attention_dim=cross_attention_dim if not double_self_attention else None, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + upcast_attention=upcast_attention, + ) # is self-attn if encoder_hidden_states is none + else: + self.norm2 = None + self.attn2 = None + + # 3. Feed-forward + if not self.use_ada_layer_norm_single: + self.norm3 = nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine, eps=norm_eps) + + self.ff = FeedForward(dim, dropout=dropout, activation_fn=activation_fn, final_dropout=final_dropout) + + # 4. Fuser + if attention_type == "gated" or attention_type == "gated-text-image": + self.fuser = GatedSelfAttentionDense(dim, cross_attention_dim, num_attention_heads, attention_head_dim) + + # 5. Scale-shift for PixArt-Alpha. + if self.use_ada_layer_norm_single: + self.scale_shift_table = nn.Parameter(torch.randn(6, dim) / dim**0.5) + + # let chunk size default to None + self._chunk_size = None + self._chunk_dim = 0 + + def set_chunk_feed_forward(self, chunk_size: Optional[int], dim: int): + # Sets chunk feed-forward + self._chunk_size = chunk_size + self._chunk_dim = dim + + def forward( + self, + hidden_states: torch.FloatTensor, + spatial_attn_inputs = [], + attention_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + timestep: Optional[torch.LongTensor] = None, + cross_attention_kwargs: Dict[str, Any] = None, + class_labels: Optional[torch.LongTensor] = None, + ) -> torch.FloatTensor: + # Notice that normalization is always applied before the real computation in the following blocks. + # 0. Self-Attention + batch_size = hidden_states.shape[0] + + spatial_attn_input = hidden_states + spatial_attn_inputs.append(spatial_attn_input) + + if self.use_ada_layer_norm: + norm_hidden_states = self.norm1(hidden_states, timestep) + elif self.use_ada_layer_norm_zero: + norm_hidden_states, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.norm1( + hidden_states, timestep, class_labels, hidden_dtype=hidden_states.dtype + ) + elif self.use_layer_norm: + norm_hidden_states = self.norm1(hidden_states) + elif self.use_ada_layer_norm_single: + shift_msa, scale_msa, gate_msa, shift_mlp, scale_mlp, gate_mlp = ( + self.scale_shift_table[None] + timestep.reshape(batch_size, 6, -1) + ).chunk(6, dim=1) + norm_hidden_states = self.norm1(hidden_states) + norm_hidden_states = norm_hidden_states * (1 + scale_msa) + shift_msa + norm_hidden_states = norm_hidden_states.squeeze(1) + else: + raise ValueError("Incorrect norm used") + + if self.pos_embed is not None: + norm_hidden_states = self.pos_embed(norm_hidden_states) + + # 1. Retrieve lora scale. + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + # 2. Prepare GLIGEN inputs + cross_attention_kwargs = cross_attention_kwargs.copy() if cross_attention_kwargs is not None else {} + gligen_kwargs = cross_attention_kwargs.pop("gligen", None) + + attn_output = self.attn1( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states if self.only_cross_attention else None, + attention_mask=attention_mask, + **cross_attention_kwargs, + ) + if self.use_ada_layer_norm_zero: + attn_output = gate_msa.unsqueeze(1) * attn_output + elif self.use_ada_layer_norm_single: + attn_output = gate_msa * attn_output + + hidden_states = attn_output + hidden_states + if hidden_states.ndim == 4: + hidden_states = hidden_states.squeeze(1) + + # 2.5 GLIGEN Control + if gligen_kwargs is not None: + hidden_states = self.fuser(hidden_states, gligen_kwargs["objs"]) + + # 3. Cross-Attention + if self.attn2 is not None: + if self.use_ada_layer_norm: + norm_hidden_states = self.norm2(hidden_states, timestep) + elif self.use_ada_layer_norm_zero or self.use_layer_norm: + norm_hidden_states = self.norm2(hidden_states) + elif self.use_ada_layer_norm_single: + # For PixArt norm2 isn't applied here: + # https://github.com/PixArt-alpha/PixArt-alpha/blob/0f55e922376d8b797edd44d25d0e7464b260dcab/diffusion/model/nets/PixArtMS.py#L70C1-L76C103 + norm_hidden_states = hidden_states + else: + raise ValueError("Incorrect norm") + + if self.pos_embed is not None and self.use_ada_layer_norm_single is False: + norm_hidden_states = self.pos_embed(norm_hidden_states) + + attn_output = self.attn2( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=encoder_attention_mask, + **cross_attention_kwargs, + ) + hidden_states = attn_output + hidden_states + + # 4. Feed-forward + if not self.use_ada_layer_norm_single: + norm_hidden_states = self.norm3(hidden_states) + + if self.use_ada_layer_norm_zero: + norm_hidden_states = norm_hidden_states * (1 + scale_mlp[:, None]) + shift_mlp[:, None] + + if self.use_ada_layer_norm_single: + norm_hidden_states = self.norm2(hidden_states) + norm_hidden_states = norm_hidden_states * (1 + scale_mlp) + shift_mlp + + if self._chunk_size is not None: + # "feed_forward_chunk_size" can be used to save memory + if norm_hidden_states.shape[self._chunk_dim] % self._chunk_size != 0: + raise ValueError( + f"`hidden_states` dimension to be chunked: {norm_hidden_states.shape[self._chunk_dim]} has to be divisible by chunk size: {self._chunk_size}. Make sure to set an appropriate `chunk_size` when calling `unet.enable_forward_chunking`." + ) + + num_chunks = norm_hidden_states.shape[self._chunk_dim] // self._chunk_size + ff_output = torch.cat( + [ + self.ff(hid_slice, scale=lora_scale) + for hid_slice in norm_hidden_states.chunk(num_chunks, dim=self._chunk_dim) + ], + dim=self._chunk_dim, + ) + else: + ff_output = self.ff(norm_hidden_states, scale=lora_scale) + + if self.use_ada_layer_norm_zero: + ff_output = gate_mlp.unsqueeze(1) * ff_output + elif self.use_ada_layer_norm_single: + ff_output = gate_mlp * ff_output + + hidden_states = ff_output + hidden_states + if hidden_states.ndim == 4: + hidden_states = hidden_states.squeeze(1) + + return hidden_states, spatial_attn_inputs + + +class FeedForward(nn.Module): + r""" + A feed-forward layer. + + Parameters: + dim (`int`): The number of channels in the input. + dim_out (`int`, *optional*): The number of channels in the output. If not given, defaults to `dim`. + mult (`int`, *optional*, defaults to 4): The multiplier to use for the hidden dimension. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to be used in feed-forward. + final_dropout (`bool` *optional*, defaults to False): Apply a final dropout. + """ + + def __init__( + self, + dim: int, + dim_out: Optional[int] = None, + mult: int = 4, + dropout: float = 0.0, + activation_fn: str = "geglu", + final_dropout: bool = False, + ): + super().__init__() + inner_dim = int(dim * mult) + dim_out = dim_out if dim_out is not None else dim + linear_cls = LoRACompatibleLinear if not USE_PEFT_BACKEND else nn.Linear + + if activation_fn == "gelu": + act_fn = GELU(dim, inner_dim) + if activation_fn == "gelu-approximate": + act_fn = GELU(dim, inner_dim, approximate="tanh") + elif activation_fn == "geglu": + act_fn = GEGLU(dim, inner_dim) + elif activation_fn == "geglu-approximate": + act_fn = ApproximateGELU(dim, inner_dim) + + self.net = nn.ModuleList([]) + # project in + self.net.append(act_fn) + # project dropout + self.net.append(nn.Dropout(dropout)) + # project out + self.net.append(linear_cls(inner_dim, dim_out)) + # FF as used in Vision Transformer, MLP-Mixer, etc. have a final dropout + if final_dropout: + self.net.append(nn.Dropout(dropout)) + + def forward(self, hidden_states: torch.Tensor, scale: float = 1.0) -> torch.Tensor: + compatible_cls = (GEGLU,) if USE_PEFT_BACKEND else (GEGLU, LoRACompatibleLinear) + for module in self.net: + if isinstance(module, compatible_cls): + hidden_states = module(hidden_states, scale) + else: + hidden_states = module(hidden_states) + return hidden_states diff --git a/ootd/pipelines_ootd/attention_vton.py b/ootd/pipelines_ootd/attention_vton.py new file mode 100644 index 0000000..cc8914f --- /dev/null +++ b/ootd/pipelines_ootd/attention_vton.py @@ -0,0 +1,407 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from typing import Any, Dict, Optional + +import torch +from torch import nn + +from diffusers.utils import USE_PEFT_BACKEND +from diffusers.utils.torch_utils import maybe_allow_in_graph +from diffusers.models.activations import GEGLU, GELU, ApproximateGELU +from diffusers.models.attention_processor import Attention +from diffusers.models.embeddings import SinusoidalPositionalEmbedding +from diffusers.models.lora import LoRACompatibleLinear +from diffusers.models.normalization import AdaLayerNorm, AdaLayerNormZero + + +@maybe_allow_in_graph +class GatedSelfAttentionDense(nn.Module): + r""" + A gated self-attention dense layer that combines visual features and object features. + + Parameters: + query_dim (`int`): The number of channels in the query. + context_dim (`int`): The number of channels in the context. + n_heads (`int`): The number of heads to use for attention. + d_head (`int`): The number of channels in each head. + """ + + def __init__(self, query_dim: int, context_dim: int, n_heads: int, d_head: int): + super().__init__() + + # we need a linear projection since we need cat visual feature and obj feature + self.linear = nn.Linear(context_dim, query_dim) + + self.attn = Attention(query_dim=query_dim, heads=n_heads, dim_head=d_head) + self.ff = FeedForward(query_dim, activation_fn="geglu") + + self.norm1 = nn.LayerNorm(query_dim) + self.norm2 = nn.LayerNorm(query_dim) + + self.register_parameter("alpha_attn", nn.Parameter(torch.tensor(0.0))) + self.register_parameter("alpha_dense", nn.Parameter(torch.tensor(0.0))) + + self.enabled = True + + def forward(self, x: torch.Tensor, objs: torch.Tensor) -> torch.Tensor: + if not self.enabled: + return x + + n_visual = x.shape[1] + objs = self.linear(objs) + + x = x + self.alpha_attn.tanh() * self.attn(self.norm1(torch.cat([x, objs], dim=1)))[:, :n_visual, :] + x = x + self.alpha_dense.tanh() * self.ff(self.norm2(x)) + + return x + + +@maybe_allow_in_graph +class BasicTransformerBlock(nn.Module): + r""" + A basic Transformer block. + + Parameters: + dim (`int`): The number of channels in the input and output. + num_attention_heads (`int`): The number of heads to use for multi-head attention. + attention_head_dim (`int`): The number of channels in each head. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + cross_attention_dim (`int`, *optional*): The size of the encoder_hidden_states vector for cross attention. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to be used in feed-forward. + num_embeds_ada_norm (: + obj: `int`, *optional*): The number of diffusion steps used during training. See `Transformer2DModel`. + attention_bias (: + obj: `bool`, *optional*, defaults to `False`): Configure if the attentions should contain a bias parameter. + only_cross_attention (`bool`, *optional*): + Whether to use only cross-attention layers. In this case two cross attention layers are used. + double_self_attention (`bool`, *optional*): + Whether to use two self-attention layers. In this case no cross attention layers are used. + upcast_attention (`bool`, *optional*): + Whether to upcast the attention computation to float32. This is useful for mixed precision training. + norm_elementwise_affine (`bool`, *optional*, defaults to `True`): + Whether to use learnable elementwise affine parameters for normalization. + norm_type (`str`, *optional*, defaults to `"layer_norm"`): + The normalization layer to use. Can be `"layer_norm"`, `"ada_norm"` or `"ada_norm_zero"`. + final_dropout (`bool` *optional*, defaults to False): + Whether to apply a final dropout after the last feed-forward layer. + attention_type (`str`, *optional*, defaults to `"default"`): + The type of attention to use. Can be `"default"` or `"gated"` or `"gated-text-image"`. + positional_embeddings (`str`, *optional*, defaults to `None`): + The type of positional embeddings to apply to. + num_positional_embeddings (`int`, *optional*, defaults to `None`): + The maximum number of positional embeddings to apply. + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + dropout=0.0, + cross_attention_dim: Optional[int] = None, + activation_fn: str = "geglu", + num_embeds_ada_norm: Optional[int] = None, + attention_bias: bool = False, + only_cross_attention: bool = False, + double_self_attention: bool = False, + upcast_attention: bool = False, + norm_elementwise_affine: bool = True, + norm_type: str = "layer_norm", # 'layer_norm', 'ada_norm', 'ada_norm_zero', 'ada_norm_single' + norm_eps: float = 1e-5, + final_dropout: bool = False, + attention_type: str = "default", + positional_embeddings: Optional[str] = None, + num_positional_embeddings: Optional[int] = None, + ): + super().__init__() + self.only_cross_attention = only_cross_attention + + self.use_ada_layer_norm_zero = (num_embeds_ada_norm is not None) and norm_type == "ada_norm_zero" + self.use_ada_layer_norm = (num_embeds_ada_norm is not None) and norm_type == "ada_norm" + self.use_ada_layer_norm_single = norm_type == "ada_norm_single" + self.use_layer_norm = norm_type == "layer_norm" + + if norm_type in ("ada_norm", "ada_norm_zero") and num_embeds_ada_norm is None: + raise ValueError( + f"`norm_type` is set to {norm_type}, but `num_embeds_ada_norm` is not defined. Please make sure to" + f" define `num_embeds_ada_norm` if setting `norm_type` to {norm_type}." + ) + + if positional_embeddings and (num_positional_embeddings is None): + raise ValueError( + "If `positional_embedding` type is defined, `num_positition_embeddings` must also be defined." + ) + + if positional_embeddings == "sinusoidal": + self.pos_embed = SinusoidalPositionalEmbedding(dim, max_seq_length=num_positional_embeddings) + else: + self.pos_embed = None + + # Define 3 blocks. Each block has its own normalization layer. + # 1. Self-Attn + if self.use_ada_layer_norm: + self.norm1 = AdaLayerNorm(dim, num_embeds_ada_norm) + elif self.use_ada_layer_norm_zero: + self.norm1 = AdaLayerNormZero(dim, num_embeds_ada_norm) + else: + self.norm1 = nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine, eps=norm_eps) + + self.attn1 = Attention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + cross_attention_dim=cross_attention_dim if only_cross_attention else None, + upcast_attention=upcast_attention, + ) + + # 2. Cross-Attn + if cross_attention_dim is not None or double_self_attention: + # We currently only use AdaLayerNormZero for self attention where there will only be one attention block. + # I.e. the number of returned modulation chunks from AdaLayerZero would not make sense if returned during + # the second cross attention block. + self.norm2 = ( + AdaLayerNorm(dim, num_embeds_ada_norm) + if self.use_ada_layer_norm + else nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine, eps=norm_eps) + ) + self.attn2 = Attention( + query_dim=dim, + cross_attention_dim=cross_attention_dim if not double_self_attention else None, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + upcast_attention=upcast_attention, + ) # is self-attn if encoder_hidden_states is none + else: + self.norm2 = None + self.attn2 = None + + # 3. Feed-forward + if not self.use_ada_layer_norm_single: + self.norm3 = nn.LayerNorm(dim, elementwise_affine=norm_elementwise_affine, eps=norm_eps) + + self.ff = FeedForward(dim, dropout=dropout, activation_fn=activation_fn, final_dropout=final_dropout) + + # 4. Fuser + if attention_type == "gated" or attention_type == "gated-text-image": + self.fuser = GatedSelfAttentionDense(dim, cross_attention_dim, num_attention_heads, attention_head_dim) + + # 5. Scale-shift for PixArt-Alpha. + if self.use_ada_layer_norm_single: + self.scale_shift_table = nn.Parameter(torch.randn(6, dim) / dim**0.5) + + # let chunk size default to None + self._chunk_size = None + self._chunk_dim = 0 + + def set_chunk_feed_forward(self, chunk_size: Optional[int], dim: int): + # Sets chunk feed-forward + self._chunk_size = chunk_size + self._chunk_dim = dim + + def forward( + self, + hidden_states: torch.FloatTensor, + spatial_attn_inputs = [], + spatial_attn_idx = 0, + attention_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + timestep: Optional[torch.LongTensor] = None, + cross_attention_kwargs: Dict[str, Any] = None, + class_labels: Optional[torch.LongTensor] = None, + ) -> torch.FloatTensor: + # Notice that normalization is always applied before the real computation in the following blocks. + # 0. Self-Attention + batch_size = hidden_states.shape[0] + + spatial_attn_input = spatial_attn_inputs[spatial_attn_idx] + spatial_attn_idx += 1 + hidden_states = torch.cat((hidden_states, spatial_attn_input), dim=1) + + if self.use_ada_layer_norm: + norm_hidden_states = self.norm1(hidden_states, timestep) + elif self.use_ada_layer_norm_zero: + norm_hidden_states, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.norm1( + hidden_states, timestep, class_labels, hidden_dtype=hidden_states.dtype + ) + elif self.use_layer_norm: + norm_hidden_states = self.norm1(hidden_states) + elif self.use_ada_layer_norm_single: + shift_msa, scale_msa, gate_msa, shift_mlp, scale_mlp, gate_mlp = ( + self.scale_shift_table[None] + timestep.reshape(batch_size, 6, -1) + ).chunk(6, dim=1) + norm_hidden_states = self.norm1(hidden_states) + norm_hidden_states = norm_hidden_states * (1 + scale_msa) + shift_msa + norm_hidden_states = norm_hidden_states.squeeze(1) + else: + raise ValueError("Incorrect norm used") + + if self.pos_embed is not None: + norm_hidden_states = self.pos_embed(norm_hidden_states) + + # 1. Retrieve lora scale. + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + # 2. Prepare GLIGEN inputs + cross_attention_kwargs = cross_attention_kwargs.copy() if cross_attention_kwargs is not None else {} + gligen_kwargs = cross_attention_kwargs.pop("gligen", None) + + attn_output = self.attn1( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states if self.only_cross_attention else None, + attention_mask=attention_mask, + **cross_attention_kwargs, + ) + if self.use_ada_layer_norm_zero: + attn_output = gate_msa.unsqueeze(1) * attn_output + elif self.use_ada_layer_norm_single: + attn_output = gate_msa * attn_output + + + hidden_states = attn_output + hidden_states + hidden_states, _ = hidden_states.chunk(2, dim=1) + + if hidden_states.ndim == 4: + hidden_states = hidden_states.squeeze(1) + + # 2.5 GLIGEN Control + if gligen_kwargs is not None: + hidden_states = self.fuser(hidden_states, gligen_kwargs["objs"]) + + # 3. Cross-Attention + if self.attn2 is not None: + if self.use_ada_layer_norm: + norm_hidden_states = self.norm2(hidden_states, timestep) + elif self.use_ada_layer_norm_zero or self.use_layer_norm: + norm_hidden_states = self.norm2(hidden_states) + elif self.use_ada_layer_norm_single: + # For PixArt norm2 isn't applied here: + # https://github.com/PixArt-alpha/PixArt-alpha/blob/0f55e922376d8b797edd44d25d0e7464b260dcab/diffusion/model/nets/PixArtMS.py#L70C1-L76C103 + norm_hidden_states = hidden_states + else: + raise ValueError("Incorrect norm") + + if self.pos_embed is not None and self.use_ada_layer_norm_single is False: + norm_hidden_states = self.pos_embed(norm_hidden_states) + + attn_output = self.attn2( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=encoder_attention_mask, + **cross_attention_kwargs, + ) + hidden_states = attn_output + hidden_states + + # 4. Feed-forward + if not self.use_ada_layer_norm_single: + norm_hidden_states = self.norm3(hidden_states) + + if self.use_ada_layer_norm_zero: + norm_hidden_states = norm_hidden_states * (1 + scale_mlp[:, None]) + shift_mlp[:, None] + + if self.use_ada_layer_norm_single: + norm_hidden_states = self.norm2(hidden_states) + norm_hidden_states = norm_hidden_states * (1 + scale_mlp) + shift_mlp + + if self._chunk_size is not None: + # "feed_forward_chunk_size" can be used to save memory + if norm_hidden_states.shape[self._chunk_dim] % self._chunk_size != 0: + raise ValueError( + f"`hidden_states` dimension to be chunked: {norm_hidden_states.shape[self._chunk_dim]} has to be divisible by chunk size: {self._chunk_size}. Make sure to set an appropriate `chunk_size` when calling `unet.enable_forward_chunking`." + ) + + num_chunks = norm_hidden_states.shape[self._chunk_dim] // self._chunk_size + ff_output = torch.cat( + [ + self.ff(hid_slice, scale=lora_scale) + for hid_slice in norm_hidden_states.chunk(num_chunks, dim=self._chunk_dim) + ], + dim=self._chunk_dim, + ) + else: + ff_output = self.ff(norm_hidden_states, scale=lora_scale) + + if self.use_ada_layer_norm_zero: + ff_output = gate_mlp.unsqueeze(1) * ff_output + elif self.use_ada_layer_norm_single: + ff_output = gate_mlp * ff_output + + hidden_states = ff_output + hidden_states + if hidden_states.ndim == 4: + hidden_states = hidden_states.squeeze(1) + + return hidden_states, spatial_attn_inputs, spatial_attn_idx + + +class FeedForward(nn.Module): + r""" + A feed-forward layer. + + Parameters: + dim (`int`): The number of channels in the input. + dim_out (`int`, *optional*): The number of channels in the output. If not given, defaults to `dim`. + mult (`int`, *optional*, defaults to 4): The multiplier to use for the hidden dimension. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to be used in feed-forward. + final_dropout (`bool` *optional*, defaults to False): Apply a final dropout. + """ + + def __init__( + self, + dim: int, + dim_out: Optional[int] = None, + mult: int = 4, + dropout: float = 0.0, + activation_fn: str = "geglu", + final_dropout: bool = False, + ): + super().__init__() + inner_dim = int(dim * mult) + dim_out = dim_out if dim_out is not None else dim + linear_cls = LoRACompatibleLinear if not USE_PEFT_BACKEND else nn.Linear + + if activation_fn == "gelu": + act_fn = GELU(dim, inner_dim) + if activation_fn == "gelu-approximate": + act_fn = GELU(dim, inner_dim, approximate="tanh") + elif activation_fn == "geglu": + act_fn = GEGLU(dim, inner_dim) + elif activation_fn == "geglu-approximate": + act_fn = ApproximateGELU(dim, inner_dim) + + self.net = nn.ModuleList([]) + # project in + self.net.append(act_fn) + # project dropout + self.net.append(nn.Dropout(dropout)) + # project out + self.net.append(linear_cls(inner_dim, dim_out)) + # FF as used in Vision Transformer, MLP-Mixer, etc. have a final dropout + if final_dropout: + self.net.append(nn.Dropout(dropout)) + + def forward(self, hidden_states: torch.Tensor, scale: float = 1.0) -> torch.Tensor: + compatible_cls = (GEGLU,) if USE_PEFT_BACKEND else (GEGLU, LoRACompatibleLinear) + for module in self.net: + if isinstance(module, compatible_cls): + hidden_states = module(hidden_states, scale) + else: + hidden_states = module(hidden_states) + return hidden_states diff --git a/ootd/pipelines_ootd/pipeline_ootd.py b/ootd/pipelines_ootd/pipeline_ootd.py new file mode 100644 index 0000000..9e8d2ea --- /dev/null +++ b/ootd/pipelines_ootd/pipeline_ootd.py @@ -0,0 +1,846 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +import inspect +from typing import Any, Callable, Dict, List, Optional, Union + +import numpy as np +import PIL.Image +import torch +from packaging import version +from transformers import CLIPImageProcessor, CLIPTextModel, CLIPTokenizer + +from transformers import AutoProcessor, CLIPVisionModelWithProjection + +from .unet_vton_2d_condition import UNetVton2DConditionModel +from .unet_garm_2d_condition import UNetGarm2DConditionModel + +from diffusers.configuration_utils import FrozenDict +from diffusers.image_processor import PipelineImageInput, VaeImageProcessor +from diffusers.loaders import FromSingleFileMixin, LoraLoaderMixin, TextualInversionLoaderMixin +from diffusers.models import AutoencoderKL, UNet2DConditionModel +from diffusers.models.lora import adjust_lora_scale_text_encoder +from diffusers.schedulers import KarrasDiffusionSchedulers +from diffusers.utils import ( + PIL_INTERPOLATION, + USE_PEFT_BACKEND, + deprecate, + logging, + replace_example_docstring, + scale_lora_layers, + unscale_lora_layers, +) +from diffusers.utils.torch_utils import randn_tensor +from diffusers.pipelines.pipeline_utils import DiffusionPipeline +from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput +from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +# Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_img2img.preprocess +def preprocess(image): + deprecation_message = "The preprocess method is deprecated and will be removed in diffusers 1.0.0. Please use VaeImageProcessor.preprocess(...) instead" + deprecate("preprocess", "1.0.0", deprecation_message, standard_warn=False) + if isinstance(image, torch.Tensor): + return image + elif isinstance(image, PIL.Image.Image): + image = [image] + + if isinstance(image[0], PIL.Image.Image): + w, h = image[0].size + w, h = (x - x % 8 for x in (w, h)) # resize to integer multiple of 8 + + image = [np.array(i.resize((w, h), resample=PIL_INTERPOLATION["lanczos"]))[None, :] for i in image] + image = np.concatenate(image, axis=0) + image = np.array(image).astype(np.float32) / 255.0 + image = image.transpose(0, 3, 1, 2) + image = 2.0 * image - 1.0 + image = torch.from_numpy(image) + elif isinstance(image[0], torch.Tensor): + image = torch.cat(image, dim=0) + return image + + +class OotdPipeline(DiffusionPipeline, TextualInversionLoaderMixin, LoraLoaderMixin): + r""" + Args: + vae ([`AutoencoderKL`]): + Variational Auto-Encoder (VAE) model to encode and decode images to and from latent representations. + text_encoder ([`~transformers.CLIPTextModel`]): + Frozen text-encoder ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)). + tokenizer ([`~transformers.CLIPTokenizer`]): + A `CLIPTokenizer` to tokenize text. + unet ([`UNet2DConditionModel`]): + A `UNet2DConditionModel` to denoise the encoded image latents. + scheduler ([`SchedulerMixin`]): + A scheduler to be used in combination with `unet` to denoise the encoded image latents. Can be one of + [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. + safety_checker ([`StableDiffusionSafetyChecker`]): + Classification module that estimates whether generated images could be considered offensive or harmful. + Please refer to the [model card](https://huggingface.co/runwayml/stable-diffusion-v1-5) for more details + about a model's potential harms. + feature_extractor ([`~transformers.CLIPImageProcessor`]): + A `CLIPImageProcessor` to extract features from generated images; used as inputs to the `safety_checker`. + """ + model_cpu_offload_seq = "text_encoder->unet->vae" + _optional_components = ["safety_checker", "feature_extractor"] + _exclude_from_cpu_offload = ["safety_checker"] + _callback_tensor_inputs = ["latents", "prompt_embeds", "vton_latents"] + + def __init__( + self, + vae: AutoencoderKL, + text_encoder: CLIPTextModel, + tokenizer: CLIPTokenizer, + unet_garm: UNetGarm2DConditionModel, + unet_vton: UNetVton2DConditionModel, + scheduler: KarrasDiffusionSchedulers, + safety_checker: StableDiffusionSafetyChecker, + feature_extractor: CLIPImageProcessor, + requires_safety_checker: bool = True, + ): + super().__init__() + + if safety_checker is None and requires_safety_checker: + logger.warning( + f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure" + " that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered" + " results in services or applications open to the public. Both the diffusers team and Hugging Face" + " strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling" + " it only for use-cases that involve analyzing network behavior or auditing its results. For more" + " information, please have a look at https://github.com/huggingface/diffusers/pull/254 ." + ) + + if safety_checker is not None and feature_extractor is None: + raise ValueError( + "Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety" + " checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead." + ) + + self.register_modules( + vae=vae, + text_encoder=text_encoder, + tokenizer=tokenizer, + unet_garm=unet_garm, + unet_vton=unet_vton, + scheduler=scheduler, + safety_checker=safety_checker, + feature_extractor=feature_extractor, + ) + self.vae_scale_factor = 2 ** (len(self.vae.config.block_out_channels) - 1) + self.image_processor = VaeImageProcessor(vae_scale_factor=self.vae_scale_factor) + self.register_to_config(requires_safety_checker=requires_safety_checker) + + @torch.no_grad() + def __call__( + self, + prompt: Union[str, List[str]] = None, + image_garm: PipelineImageInput = None, + image_vton: PipelineImageInput = None, + mask: PipelineImageInput = None, + image_ori: PipelineImageInput = None, + num_inference_steps: int = 100, + guidance_scale: float = 7.5, + image_guidance_scale: float = 1.5, + negative_prompt: Optional[Union[str, List[str]]] = None, + num_images_per_prompt: Optional[int] = 1, + eta: float = 0.0, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + latents: Optional[torch.FloatTensor] = None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + output_type: Optional[str] = "pil", + return_dict: bool = True, + callback_on_step_end: Optional[Callable[[int, int, Dict], None]] = None, + callback_on_step_end_tensor_inputs: List[str] = ["latents"], + **kwargs, + ): + r""" + The call function to the pipeline for generation. + + Args: + prompt (`str` or `List[str]`, *optional*): + The prompt or prompts to guide image generation. If not defined, you need to pass `prompt_embeds`. + image (`torch.FloatTensor` `np.ndarray`, `PIL.Image.Image`, `List[torch.FloatTensor]`, `List[PIL.Image.Image]`, or `List[np.ndarray]`): + `Image` or tensor representing an image batch to be repainted according to `prompt`. Can also accept + image latents as `image`, but if passing latents directly it is not encoded again. + num_inference_steps (`int`, *optional*, defaults to 100): + The number of denoising steps. More denoising steps usually lead to a higher quality image at the + expense of slower inference. + guidance_scale (`float`, *optional*, defaults to 7.5): + A higher guidance scale value encourages the model to generate images closely linked to the text + `prompt` at the expense of lower image quality. Guidance scale is enabled when `guidance_scale > 1`. + image_guidance_scale (`float`, *optional*, defaults to 1.5): + Push the generated image towards the initial `image`. Image guidance scale is enabled by setting + `image_guidance_scale > 1`. Higher image guidance scale encourages generated images that are closely + linked to the source `image`, usually at the expense of lower image quality. This pipeline requires a + value of at least `1`. + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts to guide what to not include in image generation. If not defined, you need to + pass `negative_prompt_embeds` instead. Ignored when not using guidance (`guidance_scale < 1`). + num_images_per_prompt (`int`, *optional*, defaults to 1): + The number of images to generate per prompt. + eta (`float`, *optional*, defaults to 0.0): + Corresponds to parameter eta (η) from the [DDIM](https://arxiv.org/abs/2010.02502) paper. Only applies + to the [`~schedulers.DDIMScheduler`], and is ignored in other schedulers. + generator (`torch.Generator`, *optional*): + A [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) to make + generation deterministic. + latents (`torch.FloatTensor`, *optional*): + Pre-generated noisy latents sampled from a Gaussian distribution, to be used as inputs for image + generation. Can be used to tweak the same generation with different prompts. If not provided, a latents + tensor is generated by sampling using the supplied random `generator`. + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs (prompt weighting). If not + provided, text embeddings are generated from the `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs (prompt weighting). If + not provided, `negative_prompt_embeds` are generated from the `negative_prompt` input argument. + output_type (`str`, *optional*, defaults to `"pil"`): + The output format of the generated image. Choose between `PIL.Image` or `np.array`. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] instead of a + plain tuple. + callback_on_step_end (`Callable`, *optional*): + A function that calls at the end of each denoising steps during the inference. The function is called + with the following arguments: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, + callback_kwargs: Dict)`. `callback_kwargs` will include a list of all tensors as specified by + `callback_on_step_end_tensor_inputs`. + callback_on_step_end_tensor_inputs (`List`, *optional*): + The list of tensor inputs for the `callback_on_step_end` function. The tensors specified in the list + will be passed as `callback_kwargs` argument. You will only be able to include variables listed in the + `._callback_tensor_inputs` attribute of your pipeline class. + + Returns: + [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] or `tuple`: + If `return_dict` is `True`, [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] is returned, + otherwise a `tuple` is returned where the first element is a list with the generated images and the + second element is a list of `bool`s indicating whether the corresponding generated image contains + "not-safe-for-work" (nsfw) content. + """ + + callback = kwargs.pop("callback", None) + callback_steps = kwargs.pop("callback_steps", None) + + if callback is not None: + deprecate( + "callback", + "1.0.0", + "Passing `callback` as an input argument to `__call__` is deprecated, consider use `callback_on_step_end`", + ) + if callback_steps is not None: + deprecate( + "callback_steps", + "1.0.0", + "Passing `callback_steps` as an input argument to `__call__` is deprecated, consider use `callback_on_step_end`", + ) + + # 0. Check inputs + self.check_inputs( + prompt, + callback_steps, + negative_prompt, + prompt_embeds, + negative_prompt_embeds, + callback_on_step_end_tensor_inputs, + ) + self._guidance_scale = guidance_scale + self._image_guidance_scale = image_guidance_scale + + if (image_vton is None) or (image_garm is None): + raise ValueError("`image` input cannot be undefined.") + + # 1. Define call parameters + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + device = self._execution_device + # check if scheduler is in sigmas space + scheduler_is_in_sigma_space = hasattr(self.scheduler, "sigmas") + + # 2. Encode input prompt + prompt_embeds = self._encode_prompt( + prompt, + device, + num_images_per_prompt, + self.do_classifier_free_guidance, + negative_prompt, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + ) + + # 3. Preprocess image + image_garm = self.image_processor.preprocess(image_garm) + image_vton = self.image_processor.preprocess(image_vton) + image_ori = self.image_processor.preprocess(image_ori) + mask = np.array(mask) + mask[mask < 127] = 0 + mask[mask >= 127] = 255 + mask = torch.tensor(mask) + mask = mask / 255 + mask = mask.reshape(-1, 1, mask.size(-2), mask.size(-1)) + + # 4. set timesteps + self.scheduler.set_timesteps(num_inference_steps, device=device) + timesteps = self.scheduler.timesteps + + # 5. Prepare Image latents + garm_latents = self.prepare_garm_latents( + image_garm, + batch_size, + num_images_per_prompt, + prompt_embeds.dtype, + device, + self.do_classifier_free_guidance, + generator, + ) + + vton_latents, mask_latents, image_ori_latents = self.prepare_vton_latents( + image_vton, + mask, + image_ori, + batch_size, + num_images_per_prompt, + prompt_embeds.dtype, + device, + self.do_classifier_free_guidance, + generator, + ) + + height, width = vton_latents.shape[-2:] + height = height * self.vae_scale_factor + width = width * self.vae_scale_factor + + # 6. Prepare latent variables + num_channels_latents = self.vae.config.latent_channels + latents = self.prepare_latents( + batch_size * num_images_per_prompt, + num_channels_latents, + height, + width, + prompt_embeds.dtype, + device, + generator, + latents, + ) + + noise = latents.clone() + + # 8. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline + extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) + + # 9. Denoising loop + num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order + self._num_timesteps = len(timesteps) + + _, spatial_attn_outputs = self.unet_garm( + garm_latents, + 0, + encoder_hidden_states=prompt_embeds, + return_dict=False, + ) + + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + latent_model_input = torch.cat([latents] * 2) if self.do_classifier_free_guidance else latents + + # concat latents, image_latents in the channel dimension + scaled_latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + latent_vton_model_input = torch.cat([scaled_latent_model_input, vton_latents], dim=1) + # latent_vton_model_input = scaled_latent_model_input + vton_latents + + spatial_attn_inputs = spatial_attn_outputs.copy() + + # predict the noise residual + noise_pred = self.unet_vton( + latent_vton_model_input, + spatial_attn_inputs, + t, + encoder_hidden_states=prompt_embeds, + return_dict=False, + )[0] + + # Hack: + # For karras style schedulers the model does classifer free guidance using the + # predicted_original_sample instead of the noise_pred. So we need to compute the + # predicted_original_sample here if we are using a karras style scheduler. + if scheduler_is_in_sigma_space: + step_index = (self.scheduler.timesteps == t).nonzero()[0].item() + sigma = self.scheduler.sigmas[step_index] + noise_pred = latent_model_input - sigma * noise_pred + + # perform guidance + if self.do_classifier_free_guidance: + noise_pred_text_image, noise_pred_text = noise_pred.chunk(2) + noise_pred = ( + noise_pred_text + + self.image_guidance_scale * (noise_pred_text_image - noise_pred_text) + ) + + # Hack: + # For karras style schedulers the model does classifer free guidance using the + # predicted_original_sample instead of the noise_pred. But the scheduler.step function + # expects the noise_pred and computes the predicted_original_sample internally. So we + # need to overwrite the noise_pred here such that the value of the computed + # predicted_original_sample is correct. + if scheduler_is_in_sigma_space: + noise_pred = (noise_pred - latents) / (-sigma) + + # compute the previous noisy sample x_t -> x_t-1 + latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0] + + init_latents_proper = image_ori_latents * self.vae.config.scaling_factor + + # repainting + if i < len(timesteps) - 1: + noise_timestep = timesteps[i + 1] + init_latents_proper = self.scheduler.add_noise( + init_latents_proper, noise, torch.tensor([noise_timestep]) + ) + + latents = (1 - mask_latents) * init_latents_proper + mask_latents * latents + + if callback_on_step_end is not None: + callback_kwargs = {} + for k in callback_on_step_end_tensor_inputs: + callback_kwargs[k] = locals()[k] + callback_outputs = callback_on_step_end(self, i, t, callback_kwargs) + + latents = callback_outputs.pop("latents", latents) + prompt_embeds = callback_outputs.pop("prompt_embeds", prompt_embeds) + negative_prompt_embeds = callback_outputs.pop("negative_prompt_embeds", negative_prompt_embeds) + vton_latents = callback_outputs.pop("vton_latents", vton_latents) + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): + progress_bar.update() + if callback is not None and i % callback_steps == 0: + step_idx = i // getattr(self.scheduler, "order", 1) + callback(step_idx, t, latents) + + if not output_type == "latent": + image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0] + image, has_nsfw_concept = self.run_safety_checker(image, device, prompt_embeds.dtype) + else: + image = latents + has_nsfw_concept = None + + if has_nsfw_concept is None: + do_denormalize = [True] * image.shape[0] + else: + do_denormalize = [not has_nsfw for has_nsfw in has_nsfw_concept] + + image = self.image_processor.postprocess(image, output_type=output_type, do_denormalize=do_denormalize) + + # Offload all models + self.maybe_free_model_hooks() + + if not return_dict: + return (image, has_nsfw_concept) + + return StableDiffusionPipelineOutput(images=image, nsfw_content_detected=has_nsfw_concept) + + def _encode_prompt( + self, + prompt, + device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt=None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + ): + r""" + Encodes the prompt into text encoder hidden states. + + Args: + prompt (`str` or `List[str]`, *optional*): + prompt to be encoded + device: (`torch.device`): + torch device + num_images_per_prompt (`int`): + number of images that should be generated per prompt + do_classifier_free_guidance (`bool`): + whether to use classifier free guidance or not + negative_ prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds` instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` is + less than `1`). + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + """ + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + if prompt_embeds is None: + # textual inversion: procecss multi-vector tokens if necessary + if isinstance(self, TextualInversionLoaderMixin): + prompt = self.maybe_convert_prompt(prompt, self.tokenizer) + + text_inputs = self.tokenizer( + prompt, + padding="max_length", + max_length=self.tokenizer.model_max_length, + truncation=True, + return_tensors="pt", + ) + text_input_ids = text_inputs.input_ids + untruncated_ids = self.tokenizer(prompt, padding="longest", return_tensors="pt").input_ids + + if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal( + text_input_ids, untruncated_ids + ): + removed_text = self.tokenizer.batch_decode( + untruncated_ids[:, self.tokenizer.model_max_length - 1 : -1] + ) + logger.warning( + "The following part of your input was truncated because CLIP can only handle sequences up to" + f" {self.tokenizer.model_max_length} tokens: {removed_text}" + ) + + if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = text_inputs.attention_mask.to(device) + else: + attention_mask = None + + prompt_embeds = self.text_encoder( + text_input_ids.to(device), + attention_mask=attention_mask, + ) + prompt_embeds = prompt_embeds[0] + + prompt_embeds = prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) + + bs_embed, seq_len, _ = prompt_embeds.shape + # duplicate text embeddings for each generation per prompt, using mps friendly method + prompt_embeds = prompt_embeds.repeat(1, num_images_per_prompt, 1) + prompt_embeds = prompt_embeds.view(bs_embed * num_images_per_prompt, seq_len, -1) + + # get unconditional embeddings for classifier free guidance + if do_classifier_free_guidance and negative_prompt_embeds is None: + uncond_tokens: List[str] + if negative_prompt is None: + uncond_tokens = [""] * batch_size + elif type(prompt) is not type(negative_prompt): + raise TypeError( + f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" + f" {type(prompt)}." + ) + elif isinstance(negative_prompt, str): + uncond_tokens = [negative_prompt] + elif batch_size != len(negative_prompt): + raise ValueError( + f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" + f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" + " the batch size of `prompt`." + ) + else: + uncond_tokens = negative_prompt + + # textual inversion: procecss multi-vector tokens if necessary + if isinstance(self, TextualInversionLoaderMixin): + uncond_tokens = self.maybe_convert_prompt(uncond_tokens, self.tokenizer) + + max_length = prompt_embeds.shape[1] + uncond_input = self.tokenizer( + uncond_tokens, + padding="max_length", + max_length=max_length, + truncation=True, + return_tensors="pt", + ) + + if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = uncond_input.attention_mask.to(device) + else: + attention_mask = None + + if do_classifier_free_guidance: + prompt_embeds = torch.cat([prompt_embeds, prompt_embeds]) + + return prompt_embeds + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.run_safety_checker + def run_safety_checker(self, image, device, dtype): + if self.safety_checker is None: + has_nsfw_concept = None + else: + if torch.is_tensor(image): + feature_extractor_input = self.image_processor.postprocess(image, output_type="pil") + else: + feature_extractor_input = self.image_processor.numpy_to_pil(image) + safety_checker_input = self.feature_extractor(feature_extractor_input, return_tensors="pt").to(device) + image, has_nsfw_concept = self.safety_checker( + images=image, clip_input=safety_checker_input.pixel_values.to(dtype) + ) + return image, has_nsfw_concept + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_extra_step_kwargs + def prepare_extra_step_kwargs(self, generator, eta): + # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature + # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. + # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 + # and should be between [0, 1] + + accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys()) + extra_step_kwargs = {} + if accepts_eta: + extra_step_kwargs["eta"] = eta + + # check if the scheduler accepts generator + accepts_generator = "generator" in set(inspect.signature(self.scheduler.step).parameters.keys()) + if accepts_generator: + extra_step_kwargs["generator"] = generator + return extra_step_kwargs + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.decode_latents + def decode_latents(self, latents): + deprecation_message = "The decode_latents method is deprecated and will be removed in 1.0.0. Please use VaeImageProcessor.postprocess(...) instead" + deprecate("decode_latents", "1.0.0", deprecation_message, standard_warn=False) + + latents = 1 / self.vae.config.scaling_factor * latents + image = self.vae.decode(latents, return_dict=False)[0] + image = (image / 2 + 0.5).clamp(0, 1) + # we always cast to float32 as this does not cause significant overhead and is compatible with bfloat16 + image = image.cpu().permute(0, 2, 3, 1).float().numpy() + return image + + def check_inputs( + self, + prompt, + callback_steps, + negative_prompt=None, + prompt_embeds=None, + negative_prompt_embeds=None, + callback_on_step_end_tensor_inputs=None, + ): + if callback_steps is not None and (not isinstance(callback_steps, int) or callback_steps <= 0): + raise ValueError( + f"`callback_steps` has to be a positive integer but is {callback_steps} of type" + f" {type(callback_steps)}." + ) + + if callback_on_step_end_tensor_inputs is not None and not all( + k in self._callback_tensor_inputs for k in callback_on_step_end_tensor_inputs + ): + raise ValueError( + f"`callback_on_step_end_tensor_inputs` has to be in {self._callback_tensor_inputs}, but found {[k for k in callback_on_step_end_tensor_inputs if k not in self._callback_tensor_inputs]}" + ) + + if prompt is not None and prompt_embeds is not None: + raise ValueError( + f"Cannot forward both `prompt`: {prompt} and `prompt_embeds`: {prompt_embeds}. Please make sure to" + " only forward one of the two." + ) + elif prompt is None and prompt_embeds is None: + raise ValueError( + "Provide either `prompt` or `prompt_embeds`. Cannot leave both `prompt` and `prompt_embeds` undefined." + ) + elif prompt is not None and (not isinstance(prompt, str) and not isinstance(prompt, list)): + raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") + + if negative_prompt is not None and negative_prompt_embeds is not None: + raise ValueError( + f"Cannot forward both `negative_prompt`: {negative_prompt} and `negative_prompt_embeds`:" + f" {negative_prompt_embeds}. Please make sure to only forward one of the two." + ) + + if prompt_embeds is not None and negative_prompt_embeds is not None: + if prompt_embeds.shape != negative_prompt_embeds.shape: + raise ValueError( + "`prompt_embeds` and `negative_prompt_embeds` must have the same shape when passed directly, but" + f" got: `prompt_embeds` {prompt_embeds.shape} != `negative_prompt_embeds`" + f" {negative_prompt_embeds.shape}." + ) + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_latents + def prepare_latents(self, batch_size, num_channels_latents, height, width, dtype, device, generator, latents=None): + shape = (batch_size, num_channels_latents, height // self.vae_scale_factor, width // self.vae_scale_factor) + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators." + ) + + if latents is None: + latents = randn_tensor(shape, generator=generator, device=device, dtype=dtype) + else: + latents = latents.to(device) + + # scale the initial noise by the standard deviation required by the scheduler + latents = latents * self.scheduler.init_noise_sigma + return latents + + def prepare_garm_latents( + self, image, batch_size, num_images_per_prompt, dtype, device, do_classifier_free_guidance, generator=None + ): + if not isinstance(image, (torch.Tensor, PIL.Image.Image, list)): + raise ValueError( + f"`image` has to be of type `torch.Tensor`, `PIL.Image.Image` or list but is {type(image)}" + ) + + image = image.to(device=device, dtype=dtype) + + batch_size = batch_size * num_images_per_prompt + + if image.shape[1] == 4: + image_latents = image + else: + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators." + ) + + if isinstance(generator, list): + image_latents = [self.vae.encode(image[i : i + 1]).latent_dist.mode() for i in range(batch_size)] + image_latents = torch.cat(image_latents, dim=0) + else: + image_latents = self.vae.encode(image).latent_dist.mode() + + if batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] == 0: + additional_image_per_prompt = batch_size // image_latents.shape[0] + image_latents = torch.cat([image_latents] * additional_image_per_prompt, dim=0) + elif batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] != 0: + raise ValueError( + f"Cannot duplicate `image` of batch size {image_latents.shape[0]} to {batch_size} text prompts." + ) + else: + image_latents = torch.cat([image_latents], dim=0) + + if do_classifier_free_guidance: + uncond_image_latents = torch.zeros_like(image_latents) + image_latents = torch.cat([image_latents, uncond_image_latents], dim=0) + + return image_latents + + def prepare_vton_latents( + self, image, mask, image_ori, batch_size, num_images_per_prompt, dtype, device, do_classifier_free_guidance, generator=None + ): + if not isinstance(image, (torch.Tensor, PIL.Image.Image, list)): + raise ValueError( + f"`image` has to be of type `torch.Tensor`, `PIL.Image.Image` or list but is {type(image)}" + ) + + image = image.to(device=device, dtype=dtype) + image_ori = image_ori.to(device=device, dtype=dtype) + + batch_size = batch_size * num_images_per_prompt + + if image.shape[1] == 4: + image_latents = image + image_ori_latents = image_ori + else: + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators." + ) + + if isinstance(generator, list): + image_latents = [self.vae.encode(image[i : i + 1]).latent_dist.mode() for i in range(batch_size)] + image_latents = torch.cat(image_latents, dim=0) + image_ori_latents = [self.vae.encode(image_ori[i : i + 1]).latent_dist.mode() for i in range(batch_size)] + image_ori_latents = torch.cat(image_ori_latents, dim=0) + else: + image_latents = self.vae.encode(image).latent_dist.mode() + image_ori_latents = self.vae.encode(image_ori).latent_dist.mode() + + mask = torch.nn.functional.interpolate( + mask, size=(image_latents.size(-2), image_latents.size(-1)) + ) + mask = mask.to(device=device, dtype=dtype) + + if batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] == 0: + additional_image_per_prompt = batch_size // image_latents.shape[0] + image_latents = torch.cat([image_latents] * additional_image_per_prompt, dim=0) + mask = torch.cat([mask] * additional_image_per_prompt, dim=0) + image_ori_latents = torch.cat([image_ori_latents] * additional_image_per_prompt, dim=0) + elif batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] != 0: + raise ValueError( + f"Cannot duplicate `image` of batch size {image_latents.shape[0]} to {batch_size} text prompts." + ) + else: + image_latents = torch.cat([image_latents], dim=0) + mask = torch.cat([mask], dim=0) + image_ori_latents = torch.cat([image_ori_latents], dim=0) + + if do_classifier_free_guidance: + # uncond_image_latents = torch.zeros_like(image_latents) + image_latents = torch.cat([image_latents] * 2, dim=0) + + return image_latents, mask, image_ori_latents + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.enable_freeu + def enable_freeu(self, s1: float, s2: float, b1: float, b2: float): + r"""Enables the FreeU mechanism as in https://arxiv.org/abs/2309.11497. + + The suffixes after the scaling factors represent the stages where they are being applied. + + Please refer to the [official repository](https://github.com/ChenyangSi/FreeU) for combinations of the values + that are known to work well for different pipelines such as Stable Diffusion v1, v2, and Stable Diffusion XL. + + Args: + s1 (`float`): + Scaling factor for stage 1 to attenuate the contributions of the skip features. This is done to + mitigate "oversmoothing effect" in the enhanced denoising process. + s2 (`float`): + Scaling factor for stage 2 to attenuate the contributions of the skip features. This is done to + mitigate "oversmoothing effect" in the enhanced denoising process. + b1 (`float`): Scaling factor for stage 1 to amplify the contributions of backbone features. + b2 (`float`): Scaling factor for stage 2 to amplify the contributions of backbone features. + """ + if not hasattr(self, "unet"): + raise ValueError("The pipeline must have `unet` for using FreeU.") + self.unet_vton.enable_freeu(s1=s1, s2=s2, b1=b1, b2=b2) + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.disable_freeu + def disable_freeu(self): + """Disables the FreeU mechanism if enabled.""" + self.unet_vton.disable_freeu() + + @property + def guidance_scale(self): + return self._guidance_scale + + @property + def image_guidance_scale(self): + return self._image_guidance_scale + + @property + def num_timesteps(self): + return self._num_timesteps + + # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) + # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` + # corresponds to doing no classifier free guidance. + @property + def do_classifier_free_guidance(self): + return self.image_guidance_scale >= 1.0 diff --git a/ootd/pipelines_ootd/transformer_garm_2d.py b/ootd/pipelines_ootd/transformer_garm_2d.py new file mode 100644 index 0000000..6f4d987 --- /dev/null +++ b/ootd/pipelines_ootd/transformer_garm_2d.py @@ -0,0 +1,449 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from dataclasses import dataclass +from typing import Any, Dict, Optional + +import torch +import torch.nn.functional as F +from torch import nn + +from .attention_garm import BasicTransformerBlock + +from diffusers.configuration_utils import ConfigMixin, register_to_config +from diffusers.models.embeddings import ImagePositionalEmbeddings +from diffusers.utils import USE_PEFT_BACKEND, BaseOutput, deprecate +# from diffusers.models.attention import BasicTransformerBlock +from diffusers.models.embeddings import CaptionProjection, PatchEmbed +from diffusers.models.lora import LoRACompatibleConv, LoRACompatibleLinear +from diffusers.models.modeling_utils import ModelMixin +from diffusers.models.normalization import AdaLayerNormSingle + + +@dataclass +class Transformer2DModelOutput(BaseOutput): + """ + The output of [`Transformer2DModel`]. + + Args: + sample (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)` or `(batch size, num_vector_embeds - 1, num_latent_pixels)` if [`Transformer2DModel`] is discrete): + The hidden states output conditioned on the `encoder_hidden_states` input. If discrete, returns probability + distributions for the unnoised latent pixels. + """ + + sample: torch.FloatTensor + + +class Transformer2DModel(ModelMixin, ConfigMixin): + """ + A 2D Transformer model for image-like data. + + Parameters: + num_attention_heads (`int`, *optional*, defaults to 16): The number of heads to use for multi-head attention. + attention_head_dim (`int`, *optional*, defaults to 88): The number of channels in each head. + in_channels (`int`, *optional*): + The number of channels in the input and output (specify if the input is **continuous**). + num_layers (`int`, *optional*, defaults to 1): The number of layers of Transformer blocks to use. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + cross_attention_dim (`int`, *optional*): The number of `encoder_hidden_states` dimensions to use. + sample_size (`int`, *optional*): The width of the latent images (specify if the input is **discrete**). + This is fixed during training since it is used to learn a number of position embeddings. + num_vector_embeds (`int`, *optional*): + The number of classes of the vector embeddings of the latent pixels (specify if the input is **discrete**). + Includes the class for the masked latent pixel. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to use in feed-forward. + num_embeds_ada_norm ( `int`, *optional*): + The number of diffusion steps used during training. Pass if at least one of the norm_layers is + `AdaLayerNorm`. This is fixed during training since it is used to learn a number of embeddings that are + added to the hidden states. + + During inference, you can denoise for up to but not more steps than `num_embeds_ada_norm`. + attention_bias (`bool`, *optional*): + Configure if the `TransformerBlocks` attention should contain a bias parameter. + """ + + @register_to_config + def __init__( + self, + num_attention_heads: int = 16, + attention_head_dim: int = 88, + in_channels: Optional[int] = None, + out_channels: Optional[int] = None, + num_layers: int = 1, + dropout: float = 0.0, + norm_num_groups: int = 32, + cross_attention_dim: Optional[int] = None, + attention_bias: bool = False, + sample_size: Optional[int] = None, + num_vector_embeds: Optional[int] = None, + patch_size: Optional[int] = None, + activation_fn: str = "geglu", + num_embeds_ada_norm: Optional[int] = None, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + double_self_attention: bool = False, + upcast_attention: bool = False, + norm_type: str = "layer_norm", + norm_elementwise_affine: bool = True, + norm_eps: float = 1e-5, + attention_type: str = "default", + caption_channels: int = None, + ): + super().__init__() + self.use_linear_projection = use_linear_projection + self.num_attention_heads = num_attention_heads + self.attention_head_dim = attention_head_dim + inner_dim = num_attention_heads * attention_head_dim + + conv_cls = nn.Conv2d if USE_PEFT_BACKEND else LoRACompatibleConv + linear_cls = nn.Linear if USE_PEFT_BACKEND else LoRACompatibleLinear + + # 1. Transformer2DModel can process both standard continuous images of shape `(batch_size, num_channels, width, height)` as well as quantized image embeddings of shape `(batch_size, num_image_vectors)` + # Define whether input is continuous or discrete depending on configuration + self.is_input_continuous = (in_channels is not None) and (patch_size is None) + self.is_input_vectorized = num_vector_embeds is not None + self.is_input_patches = in_channels is not None and patch_size is not None + + if norm_type == "layer_norm" and num_embeds_ada_norm is not None: + deprecation_message = ( + f"The configuration file of this model: {self.__class__} is outdated. `norm_type` is either not set or" + " incorrectly set to `'layer_norm'`.Make sure to set `norm_type` to `'ada_norm'` in the config." + " Please make sure to update the config accordingly as leaving `norm_type` might led to incorrect" + " results in future versions. If you have downloaded this checkpoint from the Hugging Face Hub, it" + " would be very nice if you could open a Pull request for the `transformer/config.json` file" + ) + deprecate("norm_type!=num_embeds_ada_norm", "1.0.0", deprecation_message, standard_warn=False) + norm_type = "ada_norm" + + if self.is_input_continuous and self.is_input_vectorized: + raise ValueError( + f"Cannot define both `in_channels`: {in_channels} and `num_vector_embeds`: {num_vector_embeds}. Make" + " sure that either `in_channels` or `num_vector_embeds` is None." + ) + elif self.is_input_vectorized and self.is_input_patches: + raise ValueError( + f"Cannot define both `num_vector_embeds`: {num_vector_embeds} and `patch_size`: {patch_size}. Make" + " sure that either `num_vector_embeds` or `num_patches` is None." + ) + elif not self.is_input_continuous and not self.is_input_vectorized and not self.is_input_patches: + raise ValueError( + f"Has to define `in_channels`: {in_channels}, `num_vector_embeds`: {num_vector_embeds}, or patch_size:" + f" {patch_size}. Make sure that `in_channels`, `num_vector_embeds` or `num_patches` is not None." + ) + + # 2. Define input layers + if self.is_input_continuous: + self.in_channels = in_channels + + self.norm = torch.nn.GroupNorm(num_groups=norm_num_groups, num_channels=in_channels, eps=1e-6, affine=True) + if use_linear_projection: + self.proj_in = linear_cls(in_channels, inner_dim) + else: + self.proj_in = conv_cls(in_channels, inner_dim, kernel_size=1, stride=1, padding=0) + elif self.is_input_vectorized: + assert sample_size is not None, "Transformer2DModel over discrete input must provide sample_size" + assert num_vector_embeds is not None, "Transformer2DModel over discrete input must provide num_embed" + + self.height = sample_size + self.width = sample_size + self.num_vector_embeds = num_vector_embeds + self.num_latent_pixels = self.height * self.width + + self.latent_image_embedding = ImagePositionalEmbeddings( + num_embed=num_vector_embeds, embed_dim=inner_dim, height=self.height, width=self.width + ) + elif self.is_input_patches: + assert sample_size is not None, "Transformer2DModel over patched input must provide sample_size" + + self.height = sample_size + self.width = sample_size + + self.patch_size = patch_size + interpolation_scale = self.config.sample_size // 64 # => 64 (= 512 pixart) has interpolation scale 1 + interpolation_scale = max(interpolation_scale, 1) + self.pos_embed = PatchEmbed( + height=sample_size, + width=sample_size, + patch_size=patch_size, + in_channels=in_channels, + embed_dim=inner_dim, + interpolation_scale=interpolation_scale, + ) + + # 3. Define transformers blocks + self.transformer_blocks = nn.ModuleList( + [ + BasicTransformerBlock( + inner_dim, + num_attention_heads, + attention_head_dim, + dropout=dropout, + cross_attention_dim=cross_attention_dim, + activation_fn=activation_fn, + num_embeds_ada_norm=num_embeds_ada_norm, + attention_bias=attention_bias, + only_cross_attention=only_cross_attention, + double_self_attention=double_self_attention, + upcast_attention=upcast_attention, + norm_type=norm_type, + norm_elementwise_affine=norm_elementwise_affine, + norm_eps=norm_eps, + attention_type=attention_type, + ) + for d in range(num_layers) + ] + ) + + # 4. Define output layers + self.out_channels = in_channels if out_channels is None else out_channels + if self.is_input_continuous: + # TODO: should use out_channels for continuous projections + if use_linear_projection: + self.proj_out = linear_cls(inner_dim, in_channels) + else: + self.proj_out = conv_cls(inner_dim, in_channels, kernel_size=1, stride=1, padding=0) + elif self.is_input_vectorized: + self.norm_out = nn.LayerNorm(inner_dim) + self.out = nn.Linear(inner_dim, self.num_vector_embeds - 1) + elif self.is_input_patches and norm_type != "ada_norm_single": + self.norm_out = nn.LayerNorm(inner_dim, elementwise_affine=False, eps=1e-6) + self.proj_out_1 = nn.Linear(inner_dim, 2 * inner_dim) + self.proj_out_2 = nn.Linear(inner_dim, patch_size * patch_size * self.out_channels) + elif self.is_input_patches and norm_type == "ada_norm_single": + self.norm_out = nn.LayerNorm(inner_dim, elementwise_affine=False, eps=1e-6) + self.scale_shift_table = nn.Parameter(torch.randn(2, inner_dim) / inner_dim**0.5) + self.proj_out = nn.Linear(inner_dim, patch_size * patch_size * self.out_channels) + + # 5. PixArt-Alpha blocks. + self.adaln_single = None + self.use_additional_conditions = False + if norm_type == "ada_norm_single": + self.use_additional_conditions = self.config.sample_size == 128 + # TODO(Sayak, PVP) clean this, for now we use sample size to determine whether to use + # additional conditions until we find better name + self.adaln_single = AdaLayerNormSingle(inner_dim, use_additional_conditions=self.use_additional_conditions) + + self.caption_projection = None + if caption_channels is not None: + self.caption_projection = CaptionProjection(in_features=caption_channels, hidden_size=inner_dim) + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.Tensor, + spatial_attn_inputs = [], + encoder_hidden_states: Optional[torch.Tensor] = None, + timestep: Optional[torch.LongTensor] = None, + added_cond_kwargs: Dict[str, torch.Tensor] = None, + class_labels: Optional[torch.LongTensor] = None, + cross_attention_kwargs: Dict[str, Any] = None, + attention_mask: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.Tensor] = None, + return_dict: bool = True, + ): + """ + The [`Transformer2DModel`] forward method. + + Args: + hidden_states (`torch.LongTensor` of shape `(batch size, num latent pixels)` if discrete, `torch.FloatTensor` of shape `(batch size, channel, height, width)` if continuous): + Input `hidden_states`. + encoder_hidden_states ( `torch.FloatTensor` of shape `(batch size, sequence len, embed dims)`, *optional*): + Conditional embeddings for cross attention layer. If not given, cross-attention defaults to + self-attention. + timestep ( `torch.LongTensor`, *optional*): + Used to indicate denoising step. Optional timestep to be applied as an embedding in `AdaLayerNorm`. + class_labels ( `torch.LongTensor` of shape `(batch size, num classes)`, *optional*): + Used to indicate class labels conditioning. Optional class labels to be applied as an embedding in + `AdaLayerZeroNorm`. + cross_attention_kwargs ( `Dict[str, Any]`, *optional*): + A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under + `self.processor` in + [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). + attention_mask ( `torch.Tensor`, *optional*): + An attention mask of shape `(batch, key_tokens)` is applied to `encoder_hidden_states`. If `1` the mask + is kept, otherwise if `0` it is discarded. Mask will be converted into a bias, which adds large + negative values to the attention scores corresponding to "discard" tokens. + encoder_attention_mask ( `torch.Tensor`, *optional*): + Cross-attention mask applied to `encoder_hidden_states`. Two formats supported: + + * Mask `(batch, sequence_length)` True = keep, False = discard. + * Bias `(batch, 1, sequence_length)` 0 = keep, -10000 = discard. + + If `ndim == 2`: will be interpreted as a mask, then converted into a bias consistent with the format + above. This bias will be added to the cross-attention scores. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~models.unet_2d_condition.UNet2DConditionOutput`] instead of a plain + tuple. + + Returns: + If `return_dict` is True, an [`~models.transformer_2d.Transformer2DModelOutput`] is returned, otherwise a + `tuple` where the first element is the sample tensor. + """ + # ensure attention_mask is a bias, and give it a singleton query_tokens dimension. + # we may have done this conversion already, e.g. if we came here via UNet2DConditionModel#forward. + # we can tell by counting dims; if ndim == 2: it's a mask rather than a bias. + # expects mask of shape: + # [batch, key_tokens] + # adds singleton query_tokens dimension: + # [batch, 1, key_tokens] + # this helps to broadcast it as a bias over attention scores, which will be in one of the following shapes: + # [batch, heads, query_tokens, key_tokens] (e.g. torch sdp attn) + # [batch * heads, query_tokens, key_tokens] (e.g. xformers or classic attn) + if attention_mask is not None and attention_mask.ndim == 2: + # assume that mask is expressed as: + # (1 = keep, 0 = discard) + # convert mask into a bias that can be added to attention scores: + # (keep = +0, discard = -10000.0) + attention_mask = (1 - attention_mask.to(hidden_states.dtype)) * -10000.0 + attention_mask = attention_mask.unsqueeze(1) + + # convert encoder_attention_mask to a bias the same way we do for attention_mask + if encoder_attention_mask is not None and encoder_attention_mask.ndim == 2: + encoder_attention_mask = (1 - encoder_attention_mask.to(hidden_states.dtype)) * -10000.0 + encoder_attention_mask = encoder_attention_mask.unsqueeze(1) + + # Retrieve lora scale. + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + # 1. Input + if self.is_input_continuous: + batch, _, height, width = hidden_states.shape + residual = hidden_states + + hidden_states = self.norm(hidden_states) + if not self.use_linear_projection: + hidden_states = ( + self.proj_in(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_in(hidden_states) + ) + inner_dim = hidden_states.shape[1] + hidden_states = hidden_states.permute(0, 2, 3, 1).reshape(batch, height * width, inner_dim) + else: + inner_dim = hidden_states.shape[1] + hidden_states = hidden_states.permute(0, 2, 3, 1).reshape(batch, height * width, inner_dim) + hidden_states = ( + self.proj_in(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_in(hidden_states) + ) + + elif self.is_input_vectorized: + hidden_states = self.latent_image_embedding(hidden_states) + elif self.is_input_patches: + height, width = hidden_states.shape[-2] // self.patch_size, hidden_states.shape[-1] // self.patch_size + hidden_states = self.pos_embed(hidden_states) + + if self.adaln_single is not None: + if self.use_additional_conditions and added_cond_kwargs is None: + raise ValueError( + "`added_cond_kwargs` cannot be None when using additional conditions for `adaln_single`." + ) + batch_size = hidden_states.shape[0] + timestep, embedded_timestep = self.adaln_single( + timestep, added_cond_kwargs, batch_size=batch_size, hidden_dtype=hidden_states.dtype + ) + + # 2. Blocks + if self.caption_projection is not None: + batch_size = hidden_states.shape[0] + encoder_hidden_states = self.caption_projection(encoder_hidden_states) + encoder_hidden_states = encoder_hidden_states.view(batch_size, -1, hidden_states.shape[-1]) + + for block in self.transformer_blocks: + if self.training and self.gradient_checkpointing: + hidden_states, spatial_attn_inputs = torch.utils.checkpoint.checkpoint( + block, + hidden_states, + spatial_attn_inputs, + attention_mask, + encoder_hidden_states, + encoder_attention_mask, + timestep, + cross_attention_kwargs, + class_labels, + use_reentrant=False, + ) + else: + hidden_states, spatial_attn_inputs = block( + hidden_states, + spatial_attn_inputs, + attention_mask=attention_mask, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + timestep=timestep, + cross_attention_kwargs=cross_attention_kwargs, + class_labels=class_labels, + ) + + # 3. Output + if self.is_input_continuous: + if not self.use_linear_projection: + hidden_states = hidden_states.reshape(batch, height, width, inner_dim).permute(0, 3, 1, 2).contiguous() + hidden_states = ( + self.proj_out(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_out(hidden_states) + ) + else: + hidden_states = ( + self.proj_out(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_out(hidden_states) + ) + hidden_states = hidden_states.reshape(batch, height, width, inner_dim).permute(0, 3, 1, 2).contiguous() + + output = hidden_states + residual + elif self.is_input_vectorized: + hidden_states = self.norm_out(hidden_states) + logits = self.out(hidden_states) + # (batch, self.num_vector_embeds - 1, self.num_latent_pixels) + logits = logits.permute(0, 2, 1) + + # log(p(x_0)) + output = F.log_softmax(logits.double(), dim=1).float() + + if self.is_input_patches: + if self.config.norm_type != "ada_norm_single": + conditioning = self.transformer_blocks[0].norm1.emb( + timestep, class_labels, hidden_dtype=hidden_states.dtype + ) + shift, scale = self.proj_out_1(F.silu(conditioning)).chunk(2, dim=1) + hidden_states = self.norm_out(hidden_states) * (1 + scale[:, None]) + shift[:, None] + hidden_states = self.proj_out_2(hidden_states) + elif self.config.norm_type == "ada_norm_single": + shift, scale = (self.scale_shift_table[None] + embedded_timestep[:, None]).chunk(2, dim=1) + hidden_states = self.norm_out(hidden_states) + # Modulation + hidden_states = hidden_states * (1 + scale) + shift + hidden_states = self.proj_out(hidden_states) + hidden_states = hidden_states.squeeze(1) + + # unpatchify + if self.adaln_single is None: + height = width = int(hidden_states.shape[1] ** 0.5) + hidden_states = hidden_states.reshape( + shape=(-1, height, width, self.patch_size, self.patch_size, self.out_channels) + ) + hidden_states = torch.einsum("nhwpqc->nchpwq", hidden_states) + output = hidden_states.reshape( + shape=(-1, self.out_channels, height * self.patch_size, width * self.patch_size) + ) + + if not return_dict: + return (output,), spatial_attn_inputs + + return Transformer2DModelOutput(sample=output), spatial_attn_inputs diff --git a/ootd/pipelines_ootd/transformer_vton_2d.py b/ootd/pipelines_ootd/transformer_vton_2d.py new file mode 100644 index 0000000..276ee5b --- /dev/null +++ b/ootd/pipelines_ootd/transformer_vton_2d.py @@ -0,0 +1,452 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from dataclasses import dataclass +from typing import Any, Dict, Optional + +import torch +import torch.nn.functional as F +from torch import nn + +from .attention_vton import BasicTransformerBlock + +from diffusers.configuration_utils import ConfigMixin, register_to_config +from diffusers.models.embeddings import ImagePositionalEmbeddings +from diffusers.utils import USE_PEFT_BACKEND, BaseOutput, deprecate +# from diffusers.models.attention import BasicTransformerBlock +from diffusers.models.embeddings import CaptionProjection, PatchEmbed +from diffusers.models.lora import LoRACompatibleConv, LoRACompatibleLinear +from diffusers.models.modeling_utils import ModelMixin +from diffusers.models.normalization import AdaLayerNormSingle + + +@dataclass +class Transformer2DModelOutput(BaseOutput): + """ + The output of [`Transformer2DModel`]. + + Args: + sample (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)` or `(batch size, num_vector_embeds - 1, num_latent_pixels)` if [`Transformer2DModel`] is discrete): + The hidden states output conditioned on the `encoder_hidden_states` input. If discrete, returns probability + distributions for the unnoised latent pixels. + """ + + sample: torch.FloatTensor + + +class Transformer2DModel(ModelMixin, ConfigMixin): + """ + A 2D Transformer model for image-like data. + + Parameters: + num_attention_heads (`int`, *optional*, defaults to 16): The number of heads to use for multi-head attention. + attention_head_dim (`int`, *optional*, defaults to 88): The number of channels in each head. + in_channels (`int`, *optional*): + The number of channels in the input and output (specify if the input is **continuous**). + num_layers (`int`, *optional*, defaults to 1): The number of layers of Transformer blocks to use. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + cross_attention_dim (`int`, *optional*): The number of `encoder_hidden_states` dimensions to use. + sample_size (`int`, *optional*): The width of the latent images (specify if the input is **discrete**). + This is fixed during training since it is used to learn a number of position embeddings. + num_vector_embeds (`int`, *optional*): + The number of classes of the vector embeddings of the latent pixels (specify if the input is **discrete**). + Includes the class for the masked latent pixel. + activation_fn (`str`, *optional*, defaults to `"geglu"`): Activation function to use in feed-forward. + num_embeds_ada_norm ( `int`, *optional*): + The number of diffusion steps used during training. Pass if at least one of the norm_layers is + `AdaLayerNorm`. This is fixed during training since it is used to learn a number of embeddings that are + added to the hidden states. + + During inference, you can denoise for up to but not more steps than `num_embeds_ada_norm`. + attention_bias (`bool`, *optional*): + Configure if the `TransformerBlocks` attention should contain a bias parameter. + """ + + @register_to_config + def __init__( + self, + num_attention_heads: int = 16, + attention_head_dim: int = 88, + in_channels: Optional[int] = None, + out_channels: Optional[int] = None, + num_layers: int = 1, + dropout: float = 0.0, + norm_num_groups: int = 32, + cross_attention_dim: Optional[int] = None, + attention_bias: bool = False, + sample_size: Optional[int] = None, + num_vector_embeds: Optional[int] = None, + patch_size: Optional[int] = None, + activation_fn: str = "geglu", + num_embeds_ada_norm: Optional[int] = None, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + double_self_attention: bool = False, + upcast_attention: bool = False, + norm_type: str = "layer_norm", + norm_elementwise_affine: bool = True, + norm_eps: float = 1e-5, + attention_type: str = "default", + caption_channels: int = None, + ): + super().__init__() + self.use_linear_projection = use_linear_projection + self.num_attention_heads = num_attention_heads + self.attention_head_dim = attention_head_dim + inner_dim = num_attention_heads * attention_head_dim + + conv_cls = nn.Conv2d if USE_PEFT_BACKEND else LoRACompatibleConv + linear_cls = nn.Linear if USE_PEFT_BACKEND else LoRACompatibleLinear + + # 1. Transformer2DModel can process both standard continuous images of shape `(batch_size, num_channels, width, height)` as well as quantized image embeddings of shape `(batch_size, num_image_vectors)` + # Define whether input is continuous or discrete depending on configuration + self.is_input_continuous = (in_channels is not None) and (patch_size is None) + self.is_input_vectorized = num_vector_embeds is not None + self.is_input_patches = in_channels is not None and patch_size is not None + + if norm_type == "layer_norm" and num_embeds_ada_norm is not None: + deprecation_message = ( + f"The configuration file of this model: {self.__class__} is outdated. `norm_type` is either not set or" + " incorrectly set to `'layer_norm'`.Make sure to set `norm_type` to `'ada_norm'` in the config." + " Please make sure to update the config accordingly as leaving `norm_type` might led to incorrect" + " results in future versions. If you have downloaded this checkpoint from the Hugging Face Hub, it" + " would be very nice if you could open a Pull request for the `transformer/config.json` file" + ) + deprecate("norm_type!=num_embeds_ada_norm", "1.0.0", deprecation_message, standard_warn=False) + norm_type = "ada_norm" + + if self.is_input_continuous and self.is_input_vectorized: + raise ValueError( + f"Cannot define both `in_channels`: {in_channels} and `num_vector_embeds`: {num_vector_embeds}. Make" + " sure that either `in_channels` or `num_vector_embeds` is None." + ) + elif self.is_input_vectorized and self.is_input_patches: + raise ValueError( + f"Cannot define both `num_vector_embeds`: {num_vector_embeds} and `patch_size`: {patch_size}. Make" + " sure that either `num_vector_embeds` or `num_patches` is None." + ) + elif not self.is_input_continuous and not self.is_input_vectorized and not self.is_input_patches: + raise ValueError( + f"Has to define `in_channels`: {in_channels}, `num_vector_embeds`: {num_vector_embeds}, or patch_size:" + f" {patch_size}. Make sure that `in_channels`, `num_vector_embeds` or `num_patches` is not None." + ) + + # 2. Define input layers + if self.is_input_continuous: + self.in_channels = in_channels + + self.norm = torch.nn.GroupNorm(num_groups=norm_num_groups, num_channels=in_channels, eps=1e-6, affine=True) + if use_linear_projection: + self.proj_in = linear_cls(in_channels, inner_dim) + else: + self.proj_in = conv_cls(in_channels, inner_dim, kernel_size=1, stride=1, padding=0) + elif self.is_input_vectorized: + assert sample_size is not None, "Transformer2DModel over discrete input must provide sample_size" + assert num_vector_embeds is not None, "Transformer2DModel over discrete input must provide num_embed" + + self.height = sample_size + self.width = sample_size + self.num_vector_embeds = num_vector_embeds + self.num_latent_pixels = self.height * self.width + + self.latent_image_embedding = ImagePositionalEmbeddings( + num_embed=num_vector_embeds, embed_dim=inner_dim, height=self.height, width=self.width + ) + elif self.is_input_patches: + assert sample_size is not None, "Transformer2DModel over patched input must provide sample_size" + + self.height = sample_size + self.width = sample_size + + self.patch_size = patch_size + interpolation_scale = self.config.sample_size // 64 # => 64 (= 512 pixart) has interpolation scale 1 + interpolation_scale = max(interpolation_scale, 1) + self.pos_embed = PatchEmbed( + height=sample_size, + width=sample_size, + patch_size=patch_size, + in_channels=in_channels, + embed_dim=inner_dim, + interpolation_scale=interpolation_scale, + ) + + # 3. Define transformers blocks + self.transformer_blocks = nn.ModuleList( + [ + BasicTransformerBlock( + inner_dim, + num_attention_heads, + attention_head_dim, + dropout=dropout, + cross_attention_dim=cross_attention_dim, + activation_fn=activation_fn, + num_embeds_ada_norm=num_embeds_ada_norm, + attention_bias=attention_bias, + only_cross_attention=only_cross_attention, + double_self_attention=double_self_attention, + upcast_attention=upcast_attention, + norm_type=norm_type, + norm_elementwise_affine=norm_elementwise_affine, + norm_eps=norm_eps, + attention_type=attention_type, + ) + for d in range(num_layers) + ] + ) + + # 4. Define output layers + self.out_channels = in_channels if out_channels is None else out_channels + if self.is_input_continuous: + # TODO: should use out_channels for continuous projections + if use_linear_projection: + self.proj_out = linear_cls(inner_dim, in_channels) + else: + self.proj_out = conv_cls(inner_dim, in_channels, kernel_size=1, stride=1, padding=0) + elif self.is_input_vectorized: + self.norm_out = nn.LayerNorm(inner_dim) + self.out = nn.Linear(inner_dim, self.num_vector_embeds - 1) + elif self.is_input_patches and norm_type != "ada_norm_single": + self.norm_out = nn.LayerNorm(inner_dim, elementwise_affine=False, eps=1e-6) + self.proj_out_1 = nn.Linear(inner_dim, 2 * inner_dim) + self.proj_out_2 = nn.Linear(inner_dim, patch_size * patch_size * self.out_channels) + elif self.is_input_patches and norm_type == "ada_norm_single": + self.norm_out = nn.LayerNorm(inner_dim, elementwise_affine=False, eps=1e-6) + self.scale_shift_table = nn.Parameter(torch.randn(2, inner_dim) / inner_dim**0.5) + self.proj_out = nn.Linear(inner_dim, patch_size * patch_size * self.out_channels) + + # 5. PixArt-Alpha blocks. + self.adaln_single = None + self.use_additional_conditions = False + if norm_type == "ada_norm_single": + self.use_additional_conditions = self.config.sample_size == 128 + # TODO(Sayak, PVP) clean this, for now we use sample size to determine whether to use + # additional conditions until we find better name + self.adaln_single = AdaLayerNormSingle(inner_dim, use_additional_conditions=self.use_additional_conditions) + + self.caption_projection = None + if caption_channels is not None: + self.caption_projection = CaptionProjection(in_features=caption_channels, hidden_size=inner_dim) + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.Tensor, + spatial_attn_inputs = [], + spatial_attn_idx = 0, + encoder_hidden_states: Optional[torch.Tensor] = None, + timestep: Optional[torch.LongTensor] = None, + added_cond_kwargs: Dict[str, torch.Tensor] = None, + class_labels: Optional[torch.LongTensor] = None, + cross_attention_kwargs: Dict[str, Any] = None, + attention_mask: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.Tensor] = None, + return_dict: bool = True, + ): + """ + The [`Transformer2DModel`] forward method. + + Args: + hidden_states (`torch.LongTensor` of shape `(batch size, num latent pixels)` if discrete, `torch.FloatTensor` of shape `(batch size, channel, height, width)` if continuous): + Input `hidden_states`. + encoder_hidden_states ( `torch.FloatTensor` of shape `(batch size, sequence len, embed dims)`, *optional*): + Conditional embeddings for cross attention layer. If not given, cross-attention defaults to + self-attention. + timestep ( `torch.LongTensor`, *optional*): + Used to indicate denoising step. Optional timestep to be applied as an embedding in `AdaLayerNorm`. + class_labels ( `torch.LongTensor` of shape `(batch size, num classes)`, *optional*): + Used to indicate class labels conditioning. Optional class labels to be applied as an embedding in + `AdaLayerZeroNorm`. + cross_attention_kwargs ( `Dict[str, Any]`, *optional*): + A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under + `self.processor` in + [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). + attention_mask ( `torch.Tensor`, *optional*): + An attention mask of shape `(batch, key_tokens)` is applied to `encoder_hidden_states`. If `1` the mask + is kept, otherwise if `0` it is discarded. Mask will be converted into a bias, which adds large + negative values to the attention scores corresponding to "discard" tokens. + encoder_attention_mask ( `torch.Tensor`, *optional*): + Cross-attention mask applied to `encoder_hidden_states`. Two formats supported: + + * Mask `(batch, sequence_length)` True = keep, False = discard. + * Bias `(batch, 1, sequence_length)` 0 = keep, -10000 = discard. + + If `ndim == 2`: will be interpreted as a mask, then converted into a bias consistent with the format + above. This bias will be added to the cross-attention scores. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~models.unet_2d_condition.UNet2DConditionOutput`] instead of a plain + tuple. + + Returns: + If `return_dict` is True, an [`~models.transformer_2d.Transformer2DModelOutput`] is returned, otherwise a + `tuple` where the first element is the sample tensor. + """ + # ensure attention_mask is a bias, and give it a singleton query_tokens dimension. + # we may have done this conversion already, e.g. if we came here via UNet2DConditionModel#forward. + # we can tell by counting dims; if ndim == 2: it's a mask rather than a bias. + # expects mask of shape: + # [batch, key_tokens] + # adds singleton query_tokens dimension: + # [batch, 1, key_tokens] + # this helps to broadcast it as a bias over attention scores, which will be in one of the following shapes: + # [batch, heads, query_tokens, key_tokens] (e.g. torch sdp attn) + # [batch * heads, query_tokens, key_tokens] (e.g. xformers or classic attn) + if attention_mask is not None and attention_mask.ndim == 2: + # assume that mask is expressed as: + # (1 = keep, 0 = discard) + # convert mask into a bias that can be added to attention scores: + # (keep = +0, discard = -10000.0) + attention_mask = (1 - attention_mask.to(hidden_states.dtype)) * -10000.0 + attention_mask = attention_mask.unsqueeze(1) + + # convert encoder_attention_mask to a bias the same way we do for attention_mask + if encoder_attention_mask is not None and encoder_attention_mask.ndim == 2: + encoder_attention_mask = (1 - encoder_attention_mask.to(hidden_states.dtype)) * -10000.0 + encoder_attention_mask = encoder_attention_mask.unsqueeze(1) + + # Retrieve lora scale. + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + # 1. Input + if self.is_input_continuous: + batch, _, height, width = hidden_states.shape + residual = hidden_states + + hidden_states = self.norm(hidden_states) + if not self.use_linear_projection: + hidden_states = ( + self.proj_in(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_in(hidden_states) + ) + inner_dim = hidden_states.shape[1] + hidden_states = hidden_states.permute(0, 2, 3, 1).reshape(batch, height * width, inner_dim) + else: + inner_dim = hidden_states.shape[1] + hidden_states = hidden_states.permute(0, 2, 3, 1).reshape(batch, height * width, inner_dim) + hidden_states = ( + self.proj_in(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_in(hidden_states) + ) + + elif self.is_input_vectorized: + hidden_states = self.latent_image_embedding(hidden_states) + elif self.is_input_patches: + height, width = hidden_states.shape[-2] // self.patch_size, hidden_states.shape[-1] // self.patch_size + hidden_states = self.pos_embed(hidden_states) + + if self.adaln_single is not None: + if self.use_additional_conditions and added_cond_kwargs is None: + raise ValueError( + "`added_cond_kwargs` cannot be None when using additional conditions for `adaln_single`." + ) + batch_size = hidden_states.shape[0] + timestep, embedded_timestep = self.adaln_single( + timestep, added_cond_kwargs, batch_size=batch_size, hidden_dtype=hidden_states.dtype + ) + + # 2. Blocks + if self.caption_projection is not None: + batch_size = hidden_states.shape[0] + encoder_hidden_states = self.caption_projection(encoder_hidden_states) + encoder_hidden_states = encoder_hidden_states.view(batch_size, -1, hidden_states.shape[-1]) + + for block in self.transformer_blocks: + if self.training and self.gradient_checkpointing: + hidden_states, spatial_attn_inputs, spatial_attn_idx = torch.utils.checkpoint.checkpoint( + block, + hidden_states, + spatial_attn_inputs, + spatial_attn_idx, + attention_mask, + encoder_hidden_states, + encoder_attention_mask, + timestep, + cross_attention_kwargs, + class_labels, + use_reentrant=False, + ) + else: + hidden_states, spatial_attn_inputs, spatial_attn_idx = block( + hidden_states, + spatial_attn_inputs, + spatial_attn_idx, + attention_mask=attention_mask, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + timestep=timestep, + cross_attention_kwargs=cross_attention_kwargs, + class_labels=class_labels, + ) + + # 3. Output + if self.is_input_continuous: + if not self.use_linear_projection: + hidden_states = hidden_states.reshape(batch, height, width, inner_dim).permute(0, 3, 1, 2).contiguous() + hidden_states = ( + self.proj_out(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_out(hidden_states) + ) + else: + hidden_states = ( + self.proj_out(hidden_states, scale=lora_scale) + if not USE_PEFT_BACKEND + else self.proj_out(hidden_states) + ) + hidden_states = hidden_states.reshape(batch, height, width, inner_dim).permute(0, 3, 1, 2).contiguous() + + output = hidden_states + residual + elif self.is_input_vectorized: + hidden_states = self.norm_out(hidden_states) + logits = self.out(hidden_states) + # (batch, self.num_vector_embeds - 1, self.num_latent_pixels) + logits = logits.permute(0, 2, 1) + + # log(p(x_0)) + output = F.log_softmax(logits.double(), dim=1).float() + + if self.is_input_patches: + if self.config.norm_type != "ada_norm_single": + conditioning = self.transformer_blocks[0].norm1.emb( + timestep, class_labels, hidden_dtype=hidden_states.dtype + ) + shift, scale = self.proj_out_1(F.silu(conditioning)).chunk(2, dim=1) + hidden_states = self.norm_out(hidden_states) * (1 + scale[:, None]) + shift[:, None] + hidden_states = self.proj_out_2(hidden_states) + elif self.config.norm_type == "ada_norm_single": + shift, scale = (self.scale_shift_table[None] + embedded_timestep[:, None]).chunk(2, dim=1) + hidden_states = self.norm_out(hidden_states) + # Modulation + hidden_states = hidden_states * (1 + scale) + shift + hidden_states = self.proj_out(hidden_states) + hidden_states = hidden_states.squeeze(1) + + # unpatchify + if self.adaln_single is None: + height = width = int(hidden_states.shape[1] ** 0.5) + hidden_states = hidden_states.reshape( + shape=(-1, height, width, self.patch_size, self.patch_size, self.out_channels) + ) + hidden_states = torch.einsum("nhwpqc->nchpwq", hidden_states) + output = hidden_states.reshape( + shape=(-1, self.out_channels, height * self.patch_size, width * self.patch_size) + ) + + if not return_dict: + return (output,), spatial_attn_inputs, spatial_attn_idx + + return Transformer2DModelOutput(sample=output), spatial_attn_inputs, spatial_attn_idx diff --git a/ootd/pipelines_ootd/unet_garm_2d_blocks.py b/ootd/pipelines_ootd/unet_garm_2d_blocks.py new file mode 100644 index 0000000..06dddd9 --- /dev/null +++ b/ootd/pipelines_ootd/unet_garm_2d_blocks.py @@ -0,0 +1,3510 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from typing import Any, Dict, Optional, Tuple, Union + +import numpy as np +import torch +import torch.nn.functional as F +from torch import nn + +from .transformer_garm_2d import Transformer2DModel + +from diffusers.utils import is_torch_version, logging +from diffusers.utils.torch_utils import apply_freeu +from diffusers.models.activations import get_activation +from diffusers.models.attention_processor import Attention, AttnAddedKVProcessor, AttnAddedKVProcessor2_0 +from diffusers.models.dual_transformer_2d import DualTransformer2DModel +from diffusers.models.normalization import AdaGroupNorm +from diffusers.models.resnet import Downsample2D, FirDownsample2D, FirUpsample2D, KDownsample2D, KUpsample2D, ResnetBlock2D, Upsample2D +# from diffusers.models.transformer_2d import Transformer2DModel + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +def get_down_block( + down_block_type: str, + num_layers: int, + in_channels: int, + out_channels: int, + temb_channels: int, + add_downsample: bool, + resnet_eps: float, + resnet_act_fn: str, + transformer_layers_per_block: int = 1, + num_attention_heads: Optional[int] = None, + resnet_groups: Optional[int] = None, + cross_attention_dim: Optional[int] = None, + downsample_padding: Optional[int] = None, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + resnet_time_scale_shift: str = "default", + attention_type: str = "default", + resnet_skip_time_act: bool = False, + resnet_out_scale_factor: float = 1.0, + cross_attention_norm: Optional[str] = None, + attention_head_dim: Optional[int] = None, + downsample_type: Optional[str] = None, + dropout: float = 0.0, +): + # If attn head dim is not defined, we default it to the number of heads + if attention_head_dim is None: + logger.warn( + f"It is recommended to provide `attention_head_dim` when calling `get_down_block`. Defaulting `attention_head_dim` to {num_attention_heads}." + ) + attention_head_dim = num_attention_heads + + down_block_type = down_block_type[7:] if down_block_type.startswith("UNetRes") else down_block_type + if down_block_type == "DownBlock2D": + return DownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "ResnetDownsampleBlock2D": + return ResnetDownsampleBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + ) + elif down_block_type == "AttnDownBlock2D": + if add_downsample is False: + downsample_type = None + else: + downsample_type = downsample_type or "conv" # default to 'conv' + return AttnDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + downsample_type=downsample_type, + ) + elif down_block_type == "CrossAttnDownBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for CrossAttnDownBlock2D") + return CrossAttnDownBlock2D( + num_layers=num_layers, + transformer_layers_per_block=transformer_layers_per_block, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + cross_attention_dim=cross_attention_dim, + num_attention_heads=num_attention_heads, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + ) + elif down_block_type == "SimpleCrossAttnDownBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for SimpleCrossAttnDownBlock2D") + return SimpleCrossAttnDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + ) + elif down_block_type == "SkipDownBlock2D": + return SkipDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + downsample_padding=downsample_padding, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "AttnSkipDownBlock2D": + return AttnSkipDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "DownEncoderBlock2D": + return DownEncoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "AttnDownEncoderBlock2D": + return AttnDownEncoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "KDownBlock2D": + return KDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + ) + elif down_block_type == "KCrossAttnDownBlock2D": + return KCrossAttnDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + add_self_attention=True if not add_downsample else False, + ) + raise ValueError(f"{down_block_type} does not exist.") + + +def get_up_block( + up_block_type: str, + num_layers: int, + in_channels: int, + out_channels: int, + prev_output_channel: int, + temb_channels: int, + add_upsample: bool, + resnet_eps: float, + resnet_act_fn: str, + resolution_idx: Optional[int] = None, + transformer_layers_per_block: int = 1, + num_attention_heads: Optional[int] = None, + resnet_groups: Optional[int] = None, + cross_attention_dim: Optional[int] = None, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + resnet_time_scale_shift: str = "default", + attention_type: str = "default", + resnet_skip_time_act: bool = False, + resnet_out_scale_factor: float = 1.0, + cross_attention_norm: Optional[str] = None, + attention_head_dim: Optional[int] = None, + upsample_type: Optional[str] = None, + dropout: float = 0.0, +) -> nn.Module: + # If attn head dim is not defined, we default it to the number of heads + if attention_head_dim is None: + logger.warn( + f"It is recommended to provide `attention_head_dim` when calling `get_up_block`. Defaulting `attention_head_dim` to {num_attention_heads}." + ) + attention_head_dim = num_attention_heads + + up_block_type = up_block_type[7:] if up_block_type.startswith("UNetRes") else up_block_type + if up_block_type == "UpBlock2D": + return UpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif up_block_type == "ResnetUpsampleBlock2D": + return ResnetUpsampleBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + ) + elif up_block_type == "CrossAttnUpBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for CrossAttnUpBlock2D") + return CrossAttnUpBlock2D( + num_layers=num_layers, + transformer_layers_per_block=transformer_layers_per_block, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + cross_attention_dim=cross_attention_dim, + num_attention_heads=num_attention_heads, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + ) + elif up_block_type == "SimpleCrossAttnUpBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for SimpleCrossAttnUpBlock2D") + return SimpleCrossAttnUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + ) + elif up_block_type == "AttnUpBlock2D": + if add_upsample is False: + upsample_type = None + else: + upsample_type = upsample_type or "conv" # default to 'conv' + + return AttnUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + upsample_type=upsample_type, + ) + elif up_block_type == "SkipUpBlock2D": + return SkipUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif up_block_type == "AttnSkipUpBlock2D": + return AttnSkipUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif up_block_type == "UpDecoderBlock2D": + return UpDecoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + temb_channels=temb_channels, + ) + elif up_block_type == "AttnUpDecoderBlock2D": + return AttnUpDecoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + temb_channels=temb_channels, + ) + elif up_block_type == "KUpBlock2D": + return KUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + ) + elif up_block_type == "KCrossAttnUpBlock2D": + return KCrossAttnUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + ) + + raise ValueError(f"{up_block_type} does not exist.") + + +class AutoencoderTinyBlock(nn.Module): + """ + Tiny Autoencoder block used in [`AutoencoderTiny`]. It is a mini residual module consisting of plain conv + ReLU + blocks. + + Args: + in_channels (`int`): The number of input channels. + out_channels (`int`): The number of output channels. + act_fn (`str`): + ` The activation function to use. Supported values are `"swish"`, `"mish"`, `"gelu"`, and `"relu"`. + + Returns: + `torch.FloatTensor`: A tensor with the same shape as the input tensor, but with the number of channels equal to + `out_channels`. + """ + + def __init__(self, in_channels: int, out_channels: int, act_fn: str): + super().__init__() + act_fn = get_activation(act_fn) + self.conv = nn.Sequential( + nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), + act_fn, + nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), + act_fn, + nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), + ) + self.skip = ( + nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False) + if in_channels != out_channels + else nn.Identity() + ) + self.fuse = nn.ReLU() + + def forward(self, x: torch.FloatTensor) -> torch.FloatTensor: + return self.fuse(self.conv(x) + self.skip(x)) + + +class UNetMidBlock2D(nn.Module): + """ + A 2D UNet mid-block [`UNetMidBlock2D`] with multiple residual blocks and optional attention blocks. + + Args: + in_channels (`int`): The number of input channels. + temb_channels (`int`): The number of temporal embedding channels. + dropout (`float`, *optional*, defaults to 0.0): The dropout rate. + num_layers (`int`, *optional*, defaults to 1): The number of residual blocks. + resnet_eps (`float`, *optional*, 1e-6 ): The epsilon value for the resnet blocks. + resnet_time_scale_shift (`str`, *optional*, defaults to `default`): + The type of normalization to apply to the time embeddings. This can help to improve the performance of the + model on tasks with long-range temporal dependencies. + resnet_act_fn (`str`, *optional*, defaults to `swish`): The activation function for the resnet blocks. + resnet_groups (`int`, *optional*, defaults to 32): + The number of groups to use in the group normalization layers of the resnet blocks. + attn_groups (`Optional[int]`, *optional*, defaults to None): The number of groups for the attention blocks. + resnet_pre_norm (`bool`, *optional*, defaults to `True`): + Whether to use pre-normalization for the resnet blocks. + add_attention (`bool`, *optional*, defaults to `True`): Whether to add attention blocks. + attention_head_dim (`int`, *optional*, defaults to 1): + Dimension of a single attention head. The number of attention heads is determined based on this value and + the number of input channels. + output_scale_factor (`float`, *optional*, defaults to 1.0): The output scale factor. + + Returns: + `torch.FloatTensor`: The output of the last residual block, which is a tensor of shape `(batch_size, + in_channels, height, width)`. + + """ + + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", # default, spatial + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + attn_groups: Optional[int] = None, + resnet_pre_norm: bool = True, + add_attention: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + ): + super().__init__() + resnet_groups = resnet_groups if resnet_groups is not None else min(in_channels // 4, 32) + self.add_attention = add_attention + + if attn_groups is None: + attn_groups = resnet_groups if resnet_time_scale_shift == "default" else None + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ] + attentions = [] + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {in_channels}." + ) + attention_head_dim = in_channels + + for _ in range(num_layers): + if self.add_attention: + attentions.append( + Attention( + in_channels, + heads=in_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=attn_groups, + spatial_norm_dim=temb_channels if resnet_time_scale_shift == "spatial" else None, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + else: + attentions.append(None) + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + def forward(self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None) -> torch.FloatTensor: + hidden_states = self.resnets[0](hidden_states, temb) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + if attn is not None: + hidden_states = attn(hidden_states, temb=temb) + hidden_states = resnet(hidden_states, temb) + + return hidden_states + + +class UNetMidBlock2DCrossAttn(nn.Module): + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + transformer_layers_per_block: Union[int, Tuple[int]] = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + num_attention_heads: int = 1, + output_scale_factor: float = 1.0, + cross_attention_dim: int = 1280, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + upcast_attention: bool = False, + attention_type: str = "default", + ): + super().__init__() + + self.has_cross_attention = True + self.num_attention_heads = num_attention_heads + resnet_groups = resnet_groups if resnet_groups is not None else min(in_channels // 4, 32) + + # support for variable transformer layers per block + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * num_layers + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ] + attentions = [] + + for i in range(num_layers): + if not dual_cross_attention: + attentions.append( + Transformer2DModel( + num_attention_heads, + in_channels // num_attention_heads, + in_channels=in_channels, + num_layers=transformer_layers_per_block[i], + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + ) + else: + attentions.append( + DualTransformer2DModel( + num_attention_heads, + in_channels // num_attention_heads, + in_channels=in_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + ) + ) + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + spatial_attn_inputs = [], + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + hidden_states = self.resnets[0](hidden_states, temb, scale=lora_scale) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states, spatial_attn_inputs = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + else: + hidden_states, spatial_attn_inputs = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + return hidden_states, spatial_attn_inputs + + +class UNetMidBlock2DSimpleCrossAttn(nn.Module): + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + cross_attention_dim: int = 1280, + skip_time_act: bool = False, + only_cross_attention: bool = False, + cross_attention_norm: Optional[str] = None, + ): + super().__init__() + + self.has_cross_attention = True + + self.attention_head_dim = attention_head_dim + resnet_groups = resnet_groups if resnet_groups is not None else min(in_channels // 4, 32) + + self.num_heads = in_channels // self.attention_head_dim + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ] + attentions = [] + + for _ in range(num_layers): + processor = ( + AttnAddedKVProcessor2_0() if hasattr(F, "scaled_dot_product_attention") else AttnAddedKVProcessor() + ) + + attentions.append( + Attention( + query_dim=in_channels, + cross_attention_dim=in_channels, + heads=self.num_heads, + dim_head=self.attention_head_dim, + added_kv_proj_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + bias=True, + upcast_softmax=True, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + processor=processor, + ) + ) + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + lora_scale = cross_attention_kwargs.get("scale", 1.0) + + if attention_mask is None: + # if encoder_hidden_states is defined: we are doing cross-attn, so we should use cross-attn mask. + mask = None if encoder_hidden_states is None else encoder_attention_mask + else: + # when attention_mask is defined: we don't even check for encoder_attention_mask. + # this is to maintain compatibility with UnCLIP, which uses 'attention_mask' param for cross-attn masks. + # TODO: UnCLIP should express cross-attn mask via encoder_attention_mask param instead of via attention_mask. + # then we can simplify this whole if/else block to: + # mask = attention_mask if encoder_hidden_states is None else encoder_attention_mask + mask = attention_mask + + hidden_states = self.resnets[0](hidden_states, temb, scale=lora_scale) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + # attn + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + + # resnet + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + return hidden_states + + +class AttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + downsample_padding: int = 1, + downsample_type: str = "conv", + ): + super().__init__() + resnets = [] + attentions = [] + self.downsample_type = downsample_type + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if downsample_type == "conv": + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + elif downsample_type == "resnet": + self.downsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + down=True, + ) + ] + ) + else: + self.downsamplers = None + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + lora_scale = cross_attention_kwargs.get("scale", 1.0) + + output_states = () + + for resnet, attn in zip(self.resnets, self.attentions): + cross_attention_kwargs.update({"scale": lora_scale}) + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states = attn(hidden_states, **cross_attention_kwargs) + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + if self.downsample_type == "resnet": + hidden_states = downsampler(hidden_states, temb=temb, scale=lora_scale) + else: + hidden_states = downsampler(hidden_states, scale=lora_scale) + + output_states += (hidden_states,) + + return hidden_states, output_states + + +class CrossAttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + transformer_layers_per_block: Union[int, Tuple[int]] = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + num_attention_heads: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + downsample_padding: int = 1, + add_downsample: bool = True, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + attention_type: str = "default", + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + self.num_attention_heads = num_attention_heads + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * num_layers + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + if not dual_cross_attention: + attentions.append( + Transformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=transformer_layers_per_block[i], + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + ) + else: + attentions.append( + DualTransformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + spatial_attn_inputs = [], + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + additional_residuals: Optional[torch.FloatTensor] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + blocks = list(zip(self.resnets, self.attentions)) + + for i, (resnet, attn) in enumerate(blocks): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states, spatial_attn_inputs = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states, spatial_attn_inputs = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + + # apply additional residuals to the output of the last pair of resnet and attention blocks + if i == len(blocks) - 1 and additional_residuals is not None: + hidden_states = hidden_states + additional_residuals + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale=lora_scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states, spatial_attn_inputs + + +class DownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale=scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states + + +class DownEncoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=None, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + def forward(self, hidden_states: torch.FloatTensor, scale: float = 1.0) -> torch.FloatTensor: + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb=None, scale=scale) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale) + + return hidden_states + + +class AttnDownEncoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + resnets = [] + attentions = [] + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=None, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + def forward(self, hidden_states: torch.FloatTensor, scale: float = 1.0) -> torch.FloatTensor: + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb=None, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, **cross_attention_kwargs) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale) + + return hidden_states + + +class AttnSkipDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = np.sqrt(2.0), + add_downsample: bool = True, + ): + super().__init__() + self.attentions = nn.ModuleList([]) + self.resnets = nn.ModuleList([]) + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + self.resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(in_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + self.attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=32, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + if add_downsample: + self.resnet_down = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + down=True, + kernel="fir", + ) + self.downsamplers = nn.ModuleList([FirDownsample2D(out_channels, out_channels=out_channels)]) + self.skip_conv = nn.Conv2d(3, out_channels, kernel_size=(1, 1), stride=(1, 1)) + else: + self.resnet_down = None + self.downsamplers = None + self.skip_conv = None + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + skip_sample: Optional[torch.FloatTensor] = None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...], torch.FloatTensor]: + output_states = () + + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, **cross_attention_kwargs) + output_states += (hidden_states,) + + if self.downsamplers is not None: + hidden_states = self.resnet_down(hidden_states, temb, scale=scale) + for downsampler in self.downsamplers: + skip_sample = downsampler(skip_sample) + + hidden_states = self.skip_conv(skip_sample) + hidden_states + + output_states += (hidden_states,) + + return hidden_states, output_states, skip_sample + + +class SkipDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + output_scale_factor: float = np.sqrt(2.0), + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + self.resnets = nn.ModuleList([]) + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + self.resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(in_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + if add_downsample: + self.resnet_down = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + down=True, + kernel="fir", + ) + self.downsamplers = nn.ModuleList([FirDownsample2D(out_channels, out_channels=out_channels)]) + self.skip_conv = nn.Conv2d(3, out_channels, kernel_size=(1, 1), stride=(1, 1)) + else: + self.resnet_down = None + self.downsamplers = None + self.skip_conv = None + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + skip_sample: Optional[torch.FloatTensor] = None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...], torch.FloatTensor]: + output_states = () + + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb, scale) + output_states += (hidden_states,) + + if self.downsamplers is not None: + hidden_states = self.resnet_down(hidden_states, temb, scale) + for downsampler in self.downsamplers: + skip_sample = downsampler(skip_sample) + + hidden_states = self.skip_conv(skip_sample) + hidden_states + + output_states += (hidden_states,) + + return hidden_states, output_states, skip_sample + + +class ResnetDownsampleBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + skip_time_act: bool = False, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + down=True, + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale) + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, temb, scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states + + +class SimpleCrossAttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + skip_time_act: bool = False, + only_cross_attention: bool = False, + cross_attention_norm: Optional[str] = None, + ): + super().__init__() + + self.has_cross_attention = True + + resnets = [] + attentions = [] + + self.attention_head_dim = attention_head_dim + self.num_heads = out_channels // self.attention_head_dim + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + processor = ( + AttnAddedKVProcessor2_0() if hasattr(F, "scaled_dot_product_attention") else AttnAddedKVProcessor() + ) + + attentions.append( + Attention( + query_dim=out_channels, + cross_attention_dim=out_channels, + heads=self.num_heads, + dim_head=attention_head_dim, + added_kv_proj_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + bias=True, + upcast_softmax=True, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + processor=processor, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + down=True, + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + lora_scale = cross_attention_kwargs.get("scale", 1.0) + + if attention_mask is None: + # if encoder_hidden_states is defined: we are doing cross-attn, so we should use cross-attn mask. + mask = None if encoder_hidden_states is None else encoder_attention_mask + else: + # when attention_mask is defined: we don't even check for encoder_attention_mask. + # this is to maintain compatibility with UnCLIP, which uses 'attention_mask' param for cross-attn masks. + # TODO: UnCLIP should express cross-attn mask via encoder_attention_mask param instead of via attention_mask. + # then we can simplify this whole if/else block to: + # mask = attention_mask if encoder_hidden_states is None else encoder_attention_mask + mask = attention_mask + + for resnet, attn in zip(self.resnets, self.attentions): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + hidden_states = torch.utils.checkpoint.checkpoint(create_custom_forward(resnet), hidden_states, temb) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, temb, scale=lora_scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states + + +class KDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 4, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + resnet_group_size: int = 32, + add_downsample: bool = False, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + temb_channels=temb_channels, + groups=groups, + groups_out=groups_out, + eps=resnet_eps, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + # YiYi's comments- might be able to use FirDownsample2D, look into details later + self.downsamplers = nn.ModuleList([KDownsample2D()]) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale) + + output_states += (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states) + + return hidden_states, output_states + + +class KCrossAttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + cross_attention_dim: int, + dropout: float = 0.0, + num_layers: int = 4, + resnet_group_size: int = 32, + add_downsample: bool = True, + attention_head_dim: int = 64, + add_self_attention: bool = False, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + temb_channels=temb_channels, + groups=groups, + groups_out=groups_out, + eps=resnet_eps, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + attentions.append( + KAttentionBlock( + out_channels, + out_channels // attention_head_dim, + attention_head_dim, + cross_attention_dim=cross_attention_dim, + temb_channels=temb_channels, + attention_bias=True, + add_self_attention=add_self_attention, + cross_attention_norm="layer_norm", + group_size=resnet_group_size, + ) + ) + + self.resnets = nn.ModuleList(resnets) + self.attentions = nn.ModuleList(attentions) + + if add_downsample: + self.downsamplers = nn.ModuleList([KDownsample2D()]) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + for resnet, attn in zip(self.resnets, self.attentions): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + + if self.downsamplers is None: + output_states += (None,) + else: + output_states += (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states) + + return hidden_states, output_states + + +class AttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: int = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + upsample_type: str = "conv", + ): + super().__init__() + resnets = [] + attentions = [] + + self.upsample_type = upsample_type + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if upsample_type == "conv": + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + elif upsample_type == "resnet": + self.upsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + up=True, + ) + ] + ) + else: + self.upsamplers = None + + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, **cross_attention_kwargs) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + if self.upsample_type == "resnet": + hidden_states = upsampler(hidden_states, temb=temb, scale=scale) + else: + hidden_states = upsampler(hidden_states, scale=scale) + + return hidden_states + + +class CrossAttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + prev_output_channel: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + transformer_layers_per_block: Union[int, Tuple[int]] = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + num_attention_heads: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + attention_type: str = "default", + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + self.num_attention_heads = num_attention_heads + + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * num_layers + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + if not dual_cross_attention: + attentions.append( + Transformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=transformer_layers_per_block[i], + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + ) + else: + attentions.append( + DualTransformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + spatial_attn_inputs = [], + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + upsample_size: Optional[int] = None, + attention_mask: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + is_freeu_enabled = ( + getattr(self, "s1", None) + and getattr(self, "s2", None) + and getattr(self, "b1", None) + and getattr(self, "b2", None) + ) + + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + + # FreeU: Only operate on the first two stages + if is_freeu_enabled: + hidden_states, res_hidden_states = apply_freeu( + self.resolution_idx, + hidden_states, + res_hidden_states, + s1=self.s1, + s2=self.s2, + b1=self.b1, + b2=self.b2, + ) + + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states, spatial_attn_inputs = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states, spatial_attn_inputs = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, upsample_size, scale=lora_scale) + + return hidden_states, spatial_attn_inputs + + +class UpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + is_freeu_enabled = ( + getattr(self, "s1", None) + and getattr(self, "s2", None) + and getattr(self, "b1", None) + and getattr(self, "b2", None) + ) + + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + + # FreeU: Only operate on the first two stages + if is_freeu_enabled: + hidden_states, res_hidden_states = apply_freeu( + self.resolution_idx, + hidden_states, + res_hidden_states, + s1=self.s1, + s2=self.s2, + b1=self.b1, + b2=self.b2, + ) + + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, upsample_size, scale=scale) + + return hidden_states + + +class UpDecoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", # default, spatial + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + temb_channels: Optional[int] = None, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + input_channels = in_channels if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=input_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.resolution_idx = resolution_idx + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> torch.FloatTensor: + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb=temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states) + + return hidden_states + + +class AttnUpDecoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + temb_channels: Optional[int] = None, + ): + super().__init__() + resnets = [] + attentions = [] + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `out_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + input_channels = in_channels if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=input_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups if resnet_time_scale_shift != "spatial" else None, + spatial_norm_dim=temb_channels if resnet_time_scale_shift == "spatial" else None, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.resolution_idx = resolution_idx + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> torch.FloatTensor: + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb=temb, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, temb=temb, **cross_attention_kwargs) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, scale=scale) + + return hidden_states + + +class AttnSkipUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = np.sqrt(2.0), + add_upsample: bool = True, + ): + super().__init__() + self.attentions = nn.ModuleList([]) + self.resnets = nn.ModuleList([]) + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + self.resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(resnet_in_channels + res_skip_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `out_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + self.attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=32, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.upsampler = FirUpsample2D(in_channels, out_channels=out_channels) + if add_upsample: + self.resnet_up = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + up=True, + kernel="fir", + ) + self.skip_conv = nn.Conv2d(out_channels, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) + self.skip_norm = torch.nn.GroupNorm( + num_groups=min(out_channels // 4, 32), num_channels=out_channels, eps=resnet_eps, affine=True + ) + self.act = nn.SiLU() + else: + self.resnet_up = None + self.skip_conv = None + self.skip_norm = None + self.act = None + + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + skip_sample=None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, torch.FloatTensor]: + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb, scale=scale) + + cross_attention_kwargs = {"scale": scale} + hidden_states = self.attentions[0](hidden_states, **cross_attention_kwargs) + + if skip_sample is not None: + skip_sample = self.upsampler(skip_sample) + else: + skip_sample = 0 + + if self.resnet_up is not None: + skip_sample_states = self.skip_norm(hidden_states) + skip_sample_states = self.act(skip_sample_states) + skip_sample_states = self.skip_conv(skip_sample_states) + + skip_sample = skip_sample + skip_sample_states + + hidden_states = self.resnet_up(hidden_states, temb, scale=scale) + + return hidden_states, skip_sample + + +class SkipUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + output_scale_factor: float = np.sqrt(2.0), + add_upsample: bool = True, + upsample_padding: int = 1, + ): + super().__init__() + self.resnets = nn.ModuleList([]) + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + self.resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min((resnet_in_channels + res_skip_channels) // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.upsampler = FirUpsample2D(in_channels, out_channels=out_channels) + if add_upsample: + self.resnet_up = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + up=True, + kernel="fir", + ) + self.skip_conv = nn.Conv2d(out_channels, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) + self.skip_norm = torch.nn.GroupNorm( + num_groups=min(out_channels // 4, 32), num_channels=out_channels, eps=resnet_eps, affine=True + ) + self.act = nn.SiLU() + else: + self.resnet_up = None + self.skip_conv = None + self.skip_norm = None + self.act = None + + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + skip_sample=None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, torch.FloatTensor]: + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb, scale=scale) + + if skip_sample is not None: + skip_sample = self.upsampler(skip_sample) + else: + skip_sample = 0 + + if self.resnet_up is not None: + skip_sample_states = self.skip_norm(hidden_states) + skip_sample_states = self.act(skip_sample_states) + skip_sample_states = self.skip_conv(skip_sample_states) + + skip_sample = skip_sample + skip_sample_states + + hidden_states = self.resnet_up(hidden_states, temb, scale=scale) + + return hidden_states, skip_sample + + +class ResnetUpsampleBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + skip_time_act: bool = False, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + up=True, + ) + ] + ) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, temb, scale=scale) + + return hidden_states + + +class SimpleCrossAttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + prev_output_channel: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + skip_time_act: bool = False, + only_cross_attention: bool = False, + cross_attention_norm: Optional[str] = None, + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + self.attention_head_dim = attention_head_dim + + self.num_heads = out_channels // self.attention_head_dim + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + processor = ( + AttnAddedKVProcessor2_0() if hasattr(F, "scaled_dot_product_attention") else AttnAddedKVProcessor() + ) + + attentions.append( + Attention( + query_dim=out_channels, + cross_attention_dim=out_channels, + heads=self.num_heads, + dim_head=self.attention_head_dim, + added_kv_proj_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + bias=True, + upcast_softmax=True, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + processor=processor, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + up=True, + ) + ] + ) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + lora_scale = cross_attention_kwargs.get("scale", 1.0) + if attention_mask is None: + # if encoder_hidden_states is defined: we are doing cross-attn, so we should use cross-attn mask. + mask = None if encoder_hidden_states is None else encoder_attention_mask + else: + # when attention_mask is defined: we don't even check for encoder_attention_mask. + # this is to maintain compatibility with UnCLIP, which uses 'attention_mask' param for cross-attn masks. + # TODO: UnCLIP should express cross-attn mask via encoder_attention_mask param instead of via attention_mask. + # then we can simplify this whole if/else block to: + # mask = attention_mask if encoder_hidden_states is None else encoder_attention_mask + mask = attention_mask + + for resnet, attn in zip(self.resnets, self.attentions): + # resnet + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + hidden_states = torch.utils.checkpoint.checkpoint(create_custom_forward(resnet), hidden_states, temb) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, temb, scale=lora_scale) + + return hidden_states + + +class KUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + resolution_idx: int, + dropout: float = 0.0, + num_layers: int = 5, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + resnet_group_size: Optional[int] = 32, + add_upsample: bool = True, + ): + super().__init__() + resnets = [] + k_in_channels = 2 * out_channels + k_out_channels = in_channels + num_layers = num_layers - 1 + + for i in range(num_layers): + in_channels = k_in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=k_out_channels if (i == num_layers - 1) else out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=groups, + groups_out=groups_out, + dropout=dropout, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([KUpsample2D()]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + res_hidden_states_tuple = res_hidden_states_tuple[-1] + if res_hidden_states_tuple is not None: + hidden_states = torch.cat([hidden_states, res_hidden_states_tuple], dim=1) + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states) + + return hidden_states + + +class KCrossAttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + resolution_idx: int, + dropout: float = 0.0, + num_layers: int = 4, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + resnet_group_size: int = 32, + attention_head_dim: int = 1, # attention dim_head + cross_attention_dim: int = 768, + add_upsample: bool = True, + upcast_attention: bool = False, + ): + super().__init__() + resnets = [] + attentions = [] + + is_first_block = in_channels == out_channels == temb_channels + is_middle_block = in_channels != out_channels + add_self_attention = True if is_first_block else False + + self.has_cross_attention = True + self.attention_head_dim = attention_head_dim + + # in_channels, and out_channels for the block (k-unet) + k_in_channels = out_channels if is_first_block else 2 * out_channels + k_out_channels = in_channels + + num_layers = num_layers - 1 + + for i in range(num_layers): + in_channels = k_in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + if is_middle_block and (i == num_layers - 1): + conv_2d_out_channels = k_out_channels + else: + conv_2d_out_channels = None + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + conv_2d_out_channels=conv_2d_out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=groups, + groups_out=groups_out, + dropout=dropout, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + attentions.append( + KAttentionBlock( + k_out_channels if (i == num_layers - 1) else out_channels, + k_out_channels // attention_head_dim + if (i == num_layers - 1) + else out_channels // attention_head_dim, + attention_head_dim, + cross_attention_dim=cross_attention_dim, + temb_channels=temb_channels, + attention_bias=True, + add_self_attention=add_self_attention, + cross_attention_norm="layer_norm", + upcast_attention=upcast_attention, + ) + ) + + self.resnets = nn.ModuleList(resnets) + self.attentions = nn.ModuleList(attentions) + + if add_upsample: + self.upsamplers = nn.ModuleList([KUpsample2D()]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + upsample_size: Optional[int] = None, + attention_mask: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + res_hidden_states_tuple = res_hidden_states_tuple[-1] + if res_hidden_states_tuple is not None: + hidden_states = torch.cat([hidden_states, res_hidden_states_tuple], dim=1) + + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + for resnet, attn in zip(self.resnets, self.attentions): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states) + + return hidden_states + + +# can potentially later be renamed to `No-feed-forward` attention +class KAttentionBlock(nn.Module): + r""" + A basic Transformer block. + + Parameters: + dim (`int`): The number of channels in the input and output. + num_attention_heads (`int`): The number of heads to use for multi-head attention. + attention_head_dim (`int`): The number of channels in each head. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + cross_attention_dim (`int`, *optional*): The size of the encoder_hidden_states vector for cross attention. + attention_bias (`bool`, *optional*, defaults to `False`): + Configure if the attention layers should contain a bias parameter. + upcast_attention (`bool`, *optional*, defaults to `False`): + Set to `True` to upcast the attention computation to `float32`. + temb_channels (`int`, *optional*, defaults to 768): + The number of channels in the token embedding. + add_self_attention (`bool`, *optional*, defaults to `False`): + Set to `True` to add self-attention to the block. + cross_attention_norm (`str`, *optional*, defaults to `None`): + The type of normalization to use for the cross attention. Can be `None`, `layer_norm`, or `group_norm`. + group_size (`int`, *optional*, defaults to 32): + The number of groups to separate the channels into for group normalization. + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + dropout: float = 0.0, + cross_attention_dim: Optional[int] = None, + attention_bias: bool = False, + upcast_attention: bool = False, + temb_channels: int = 768, # for ada_group_norm + add_self_attention: bool = False, + cross_attention_norm: Optional[str] = None, + group_size: int = 32, + ): + super().__init__() + self.add_self_attention = add_self_attention + + # 1. Self-Attn + if add_self_attention: + self.norm1 = AdaGroupNorm(temb_channels, dim, max(1, dim // group_size)) + self.attn1 = Attention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + cross_attention_dim=None, + cross_attention_norm=None, + ) + + # 2. Cross-Attn + self.norm2 = AdaGroupNorm(temb_channels, dim, max(1, dim // group_size)) + self.attn2 = Attention( + query_dim=dim, + cross_attention_dim=cross_attention_dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + upcast_attention=upcast_attention, + cross_attention_norm=cross_attention_norm, + ) + + def _to_3d(self, hidden_states: torch.FloatTensor, height: int, weight: int) -> torch.FloatTensor: + return hidden_states.permute(0, 2, 3, 1).reshape(hidden_states.shape[0], height * weight, -1) + + def _to_4d(self, hidden_states: torch.FloatTensor, height: int, weight: int) -> torch.FloatTensor: + return hidden_states.permute(0, 2, 1).reshape(hidden_states.shape[0], -1, height, weight) + + def forward( + self, + hidden_states: torch.FloatTensor, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + # TODO: mark emb as non-optional (self.norm2 requires it). + # requires assessing impact of change to positional param interface. + emb: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + # 1. Self-Attention + if self.add_self_attention: + norm_hidden_states = self.norm1(hidden_states, emb) + + height, weight = norm_hidden_states.shape[2:] + norm_hidden_states = self._to_3d(norm_hidden_states, height, weight) + + attn_output = self.attn1( + norm_hidden_states, + encoder_hidden_states=None, + attention_mask=attention_mask, + **cross_attention_kwargs, + ) + attn_output = self._to_4d(attn_output, height, weight) + + hidden_states = attn_output + hidden_states + + # 2. Cross-Attention/None + norm_hidden_states = self.norm2(hidden_states, emb) + + height, weight = norm_hidden_states.shape[2:] + norm_hidden_states = self._to_3d(norm_hidden_states, height, weight) + attn_output = self.attn2( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask if encoder_hidden_states is None else encoder_attention_mask, + **cross_attention_kwargs, + ) + attn_output = self._to_4d(attn_output, height, weight) + + hidden_states = attn_output + hidden_states + + return hidden_states diff --git a/ootd/pipelines_ootd/unet_garm_2d_condition.py b/ootd/pipelines_ootd/unet_garm_2d_condition.py new file mode 100644 index 0000000..0b28a3a --- /dev/null +++ b/ootd/pipelines_ootd/unet_garm_2d_condition.py @@ -0,0 +1,1183 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from dataclasses import dataclass +from typing import Any, Dict, List, Optional, Tuple, Union + +import torch +import torch.nn as nn +import torch.utils.checkpoint + +from .unet_garm_2d_blocks import ( + UNetMidBlock2D, + UNetMidBlock2DCrossAttn, + UNetMidBlock2DSimpleCrossAttn, + get_down_block, + get_up_block, +) + +from diffusers.configuration_utils import ConfigMixin, register_to_config +from diffusers.loaders import UNet2DConditionLoadersMixin +from diffusers.utils import USE_PEFT_BACKEND, BaseOutput, deprecate, logging, scale_lora_layers, unscale_lora_layers +from diffusers.models.activations import get_activation +from diffusers.models.attention_processor import ( + ADDED_KV_ATTENTION_PROCESSORS, + CROSS_ATTENTION_PROCESSORS, + AttentionProcessor, + AttnAddedKVProcessor, + AttnProcessor, +) +from diffusers.models.embeddings import ( + GaussianFourierProjection, + ImageHintTimeEmbedding, + ImageProjection, + ImageTimeEmbedding, + PositionNet, + TextImageProjection, + TextImageTimeEmbedding, + TextTimeEmbedding, + TimestepEmbedding, + Timesteps, +) +from diffusers.models.modeling_utils import ModelMixin +# from diffusers.models.unet_2d_blocks import ( +# UNetMidBlock2D, +# UNetMidBlock2DCrossAttn, +# UNetMidBlock2DSimpleCrossAttn, +# get_down_block, +# get_up_block, +# ) + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +@dataclass +class UNet2DConditionOutput(BaseOutput): + """ + The output of [`UNet2DConditionModel`]. + + Args: + sample (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`): + The hidden states output conditioned on `encoder_hidden_states` input. Output of last layer of model. + """ + + sample: torch.FloatTensor = None + + +class UNetGarm2DConditionModel(ModelMixin, ConfigMixin, UNet2DConditionLoadersMixin): + r""" + A conditional 2D UNet model that takes a noisy sample, conditional state, and a timestep and returns a sample + shaped output. + + This model inherits from [`ModelMixin`]. Check the superclass documentation for it's generic methods implemented + for all models (such as downloading or saving). + + Parameters: + sample_size (`int` or `Tuple[int, int]`, *optional*, defaults to `None`): + Height and width of input/output sample. + in_channels (`int`, *optional*, defaults to 4): Number of channels in the input sample. + out_channels (`int`, *optional*, defaults to 4): Number of channels in the output. + center_input_sample (`bool`, *optional*, defaults to `False`): Whether to center the input sample. + flip_sin_to_cos (`bool`, *optional*, defaults to `False`): + Whether to flip the sin to cos in the time embedding. + freq_shift (`int`, *optional*, defaults to 0): The frequency shift to apply to the time embedding. + down_block_types (`Tuple[str]`, *optional*, defaults to `("CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "DownBlock2D")`): + The tuple of downsample blocks to use. + mid_block_type (`str`, *optional*, defaults to `"UNetMidBlock2DCrossAttn"`): + Block type for middle of UNet, it can be one of `UNetMidBlock2DCrossAttn`, `UNetMidBlock2D`, or + `UNetMidBlock2DSimpleCrossAttn`. If `None`, the mid block layer is skipped. + up_block_types (`Tuple[str]`, *optional*, defaults to `("UpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D")`): + The tuple of upsample blocks to use. + only_cross_attention(`bool` or `Tuple[bool]`, *optional*, default to `False`): + Whether to include self-attention in the basic transformer blocks, see + [`~models.attention.BasicTransformerBlock`]. + block_out_channels (`Tuple[int]`, *optional*, defaults to `(320, 640, 1280, 1280)`): + The tuple of output channels for each block. + layers_per_block (`int`, *optional*, defaults to 2): The number of layers per block. + downsample_padding (`int`, *optional*, defaults to 1): The padding to use for the downsampling convolution. + mid_block_scale_factor (`float`, *optional*, defaults to 1.0): The scale factor to use for the mid block. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + act_fn (`str`, *optional*, defaults to `"silu"`): The activation function to use. + norm_num_groups (`int`, *optional*, defaults to 32): The number of groups to use for the normalization. + If `None`, normalization and activation layers is skipped in post-processing. + norm_eps (`float`, *optional*, defaults to 1e-5): The epsilon to use for the normalization. + cross_attention_dim (`int` or `Tuple[int]`, *optional*, defaults to 1280): + The dimension of the cross attention features. + transformer_layers_per_block (`int`, `Tuple[int]`, or `Tuple[Tuple]` , *optional*, defaults to 1): + The number of transformer blocks of type [`~models.attention.BasicTransformerBlock`]. Only relevant for + [`~models.unet_2d_blocks.CrossAttnDownBlock2D`], [`~models.unet_2d_blocks.CrossAttnUpBlock2D`], + [`~models.unet_2d_blocks.UNetMidBlock2DCrossAttn`]. + reverse_transformer_layers_per_block : (`Tuple[Tuple]`, *optional*, defaults to None): + The number of transformer blocks of type [`~models.attention.BasicTransformerBlock`], in the upsampling + blocks of the U-Net. Only relevant if `transformer_layers_per_block` is of type `Tuple[Tuple]` and for + [`~models.unet_2d_blocks.CrossAttnDownBlock2D`], [`~models.unet_2d_blocks.CrossAttnUpBlock2D`], + [`~models.unet_2d_blocks.UNetMidBlock2DCrossAttn`]. + encoder_hid_dim (`int`, *optional*, defaults to None): + If `encoder_hid_dim_type` is defined, `encoder_hidden_states` will be projected from `encoder_hid_dim` + dimension to `cross_attention_dim`. + encoder_hid_dim_type (`str`, *optional*, defaults to `None`): + If given, the `encoder_hidden_states` and potentially other embeddings are down-projected to text + embeddings of dimension `cross_attention` according to `encoder_hid_dim_type`. + attention_head_dim (`int`, *optional*, defaults to 8): The dimension of the attention heads. + num_attention_heads (`int`, *optional*): + The number of attention heads. If not defined, defaults to `attention_head_dim` + resnet_time_scale_shift (`str`, *optional*, defaults to `"default"`): Time scale shift config + for ResNet blocks (see [`~models.resnet.ResnetBlock2D`]). Choose from `default` or `scale_shift`. + class_embed_type (`str`, *optional*, defaults to `None`): + The type of class embedding to use which is ultimately summed with the time embeddings. Choose from `None`, + `"timestep"`, `"identity"`, `"projection"`, or `"simple_projection"`. + addition_embed_type (`str`, *optional*, defaults to `None`): + Configures an optional embedding which will be summed with the time embeddings. Choose from `None` or + "text". "text" will use the `TextTimeEmbedding` layer. + addition_time_embed_dim: (`int`, *optional*, defaults to `None`): + Dimension for the timestep embeddings. + num_class_embeds (`int`, *optional*, defaults to `None`): + Input dimension of the learnable embedding matrix to be projected to `time_embed_dim`, when performing + class conditioning with `class_embed_type` equal to `None`. + time_embedding_type (`str`, *optional*, defaults to `positional`): + The type of position embedding to use for timesteps. Choose from `positional` or `fourier`. + time_embedding_dim (`int`, *optional*, defaults to `None`): + An optional override for the dimension of the projected time embedding. + time_embedding_act_fn (`str`, *optional*, defaults to `None`): + Optional activation function to use only once on the time embeddings before they are passed to the rest of + the UNet. Choose from `silu`, `mish`, `gelu`, and `swish`. + timestep_post_act (`str`, *optional*, defaults to `None`): + The second activation function to use in timestep embedding. Choose from `silu`, `mish` and `gelu`. + time_cond_proj_dim (`int`, *optional*, defaults to `None`): + The dimension of `cond_proj` layer in the timestep embedding. + conv_in_kernel (`int`, *optional*, default to `3`): The kernel size of `conv_in` layer. conv_out_kernel (`int`, + *optional*, default to `3`): The kernel size of `conv_out` layer. projection_class_embeddings_input_dim (`int`, + *optional*): The dimension of the `class_labels` input when + `class_embed_type="projection"`. Required when `class_embed_type="projection"`. + class_embeddings_concat (`bool`, *optional*, defaults to `False`): Whether to concatenate the time + embeddings with the class embeddings. + mid_block_only_cross_attention (`bool`, *optional*, defaults to `None`): + Whether to use cross attention with the mid block when using the `UNetMidBlock2DSimpleCrossAttn`. If + `only_cross_attention` is given as a single boolean and `mid_block_only_cross_attention` is `None`, the + `only_cross_attention` value is used as the value for `mid_block_only_cross_attention`. Default to `False` + otherwise. + """ + + _supports_gradient_checkpointing = True + + @register_to_config + def __init__( + self, + sample_size: Optional[int] = None, + in_channels: int = 4, + out_channels: int = 4, + center_input_sample: bool = False, + flip_sin_to_cos: bool = True, + freq_shift: int = 0, + down_block_types: Tuple[str] = ( + "CrossAttnDownBlock2D", + "CrossAttnDownBlock2D", + "CrossAttnDownBlock2D", + "DownBlock2D", + ), + mid_block_type: Optional[str] = "UNetMidBlock2DCrossAttn", + up_block_types: Tuple[str] = ("UpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D"), + only_cross_attention: Union[bool, Tuple[bool]] = False, + block_out_channels: Tuple[int] = (320, 640, 1280, 1280), + layers_per_block: Union[int, Tuple[int]] = 2, + downsample_padding: int = 1, + mid_block_scale_factor: float = 1, + dropout: float = 0.0, + act_fn: str = "silu", + norm_num_groups: Optional[int] = 32, + norm_eps: float = 1e-5, + cross_attention_dim: Union[int, Tuple[int]] = 1280, + transformer_layers_per_block: Union[int, Tuple[int], Tuple[Tuple]] = 1, + reverse_transformer_layers_per_block: Optional[Tuple[Tuple[int]]] = None, + encoder_hid_dim: Optional[int] = None, + encoder_hid_dim_type: Optional[str] = None, + attention_head_dim: Union[int, Tuple[int]] = 8, + num_attention_heads: Optional[Union[int, Tuple[int]]] = None, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + class_embed_type: Optional[str] = None, + addition_embed_type: Optional[str] = None, + addition_time_embed_dim: Optional[int] = None, + num_class_embeds: Optional[int] = None, + upcast_attention: bool = False, + resnet_time_scale_shift: str = "default", + resnet_skip_time_act: bool = False, + resnet_out_scale_factor: int = 1.0, + time_embedding_type: str = "positional", + time_embedding_dim: Optional[int] = None, + time_embedding_act_fn: Optional[str] = None, + timestep_post_act: Optional[str] = None, + time_cond_proj_dim: Optional[int] = None, + conv_in_kernel: int = 3, + conv_out_kernel: int = 3, + projection_class_embeddings_input_dim: Optional[int] = None, + attention_type: str = "default", + class_embeddings_concat: bool = False, + mid_block_only_cross_attention: Optional[bool] = None, + cross_attention_norm: Optional[str] = None, + addition_embed_type_num_heads=64, + ): + super().__init__() + + self.sample_size = sample_size + + if num_attention_heads is not None: + raise ValueError( + "At the moment it is not possible to define the number of attention heads via `num_attention_heads` because of a naming issue as described in https://github.com/huggingface/diffusers/issues/2011#issuecomment-1547958131. Passing `num_attention_heads` will only be supported in diffusers v0.19." + ) + + # If `num_attention_heads` is not defined (which is the case for most models) + # it will default to `attention_head_dim`. This looks weird upon first reading it and it is. + # The reason for this behavior is to correct for incorrectly named variables that were introduced + # when this library was created. The incorrect naming was only discovered much later in https://github.com/huggingface/diffusers/issues/2011#issuecomment-1547958131 + # Changing `attention_head_dim` to `num_attention_heads` for 40,000+ configurations is too backwards breaking + # which is why we correct for the naming here. + num_attention_heads = num_attention_heads or attention_head_dim + + # Check inputs + if len(down_block_types) != len(up_block_types): + raise ValueError( + f"Must provide the same number of `down_block_types` as `up_block_types`. `down_block_types`: {down_block_types}. `up_block_types`: {up_block_types}." + ) + + if len(block_out_channels) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `block_out_channels` as `down_block_types`. `block_out_channels`: {block_out_channels}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(only_cross_attention, bool) and len(only_cross_attention) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `only_cross_attention` as `down_block_types`. `only_cross_attention`: {only_cross_attention}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(num_attention_heads, int) and len(num_attention_heads) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `num_attention_heads` as `down_block_types`. `num_attention_heads`: {num_attention_heads}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(attention_head_dim, int) and len(attention_head_dim) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `attention_head_dim` as `down_block_types`. `attention_head_dim`: {attention_head_dim}. `down_block_types`: {down_block_types}." + ) + + if isinstance(cross_attention_dim, list) and len(cross_attention_dim) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `cross_attention_dim` as `down_block_types`. `cross_attention_dim`: {cross_attention_dim}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(layers_per_block, int) and len(layers_per_block) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `layers_per_block` as `down_block_types`. `layers_per_block`: {layers_per_block}. `down_block_types`: {down_block_types}." + ) + if isinstance(transformer_layers_per_block, list) and reverse_transformer_layers_per_block is None: + for layer_number_per_block in transformer_layers_per_block: + if isinstance(layer_number_per_block, list): + raise ValueError("Must provide 'reverse_transformer_layers_per_block` if using asymmetrical UNet.") + + # input + conv_in_padding = (conv_in_kernel - 1) // 2 + self.conv_in = nn.Conv2d( + in_channels, block_out_channels[0], kernel_size=conv_in_kernel, padding=conv_in_padding + ) + + # time + if time_embedding_type == "fourier": + time_embed_dim = time_embedding_dim or block_out_channels[0] * 2 + if time_embed_dim % 2 != 0: + raise ValueError(f"`time_embed_dim` should be divisible by 2, but is {time_embed_dim}.") + self.time_proj = GaussianFourierProjection( + time_embed_dim // 2, set_W_to_weight=False, log=False, flip_sin_to_cos=flip_sin_to_cos + ) + timestep_input_dim = time_embed_dim + elif time_embedding_type == "positional": + time_embed_dim = time_embedding_dim or block_out_channels[0] * 4 + + self.time_proj = Timesteps(block_out_channels[0], flip_sin_to_cos, freq_shift) + timestep_input_dim = block_out_channels[0] + else: + raise ValueError( + f"{time_embedding_type} does not exist. Please make sure to use one of `fourier` or `positional`." + ) + + self.time_embedding = TimestepEmbedding( + timestep_input_dim, + time_embed_dim, + act_fn=act_fn, + post_act_fn=timestep_post_act, + cond_proj_dim=time_cond_proj_dim, + ) + + if encoder_hid_dim_type is None and encoder_hid_dim is not None: + encoder_hid_dim_type = "text_proj" + self.register_to_config(encoder_hid_dim_type=encoder_hid_dim_type) + logger.info("encoder_hid_dim_type defaults to 'text_proj' as `encoder_hid_dim` is defined.") + + if encoder_hid_dim is None and encoder_hid_dim_type is not None: + raise ValueError( + f"`encoder_hid_dim` has to be defined when `encoder_hid_dim_type` is set to {encoder_hid_dim_type}." + ) + + if encoder_hid_dim_type == "text_proj": + self.encoder_hid_proj = nn.Linear(encoder_hid_dim, cross_attention_dim) + elif encoder_hid_dim_type == "text_image_proj": + # image_embed_dim DOESN'T have to be `cross_attention_dim`. To not clutter the __init__ too much + # they are set to `cross_attention_dim` here as this is exactly the required dimension for the currently only use + # case when `addition_embed_type == "text_image_proj"` (Kadinsky 2.1)` + self.encoder_hid_proj = TextImageProjection( + text_embed_dim=encoder_hid_dim, + image_embed_dim=cross_attention_dim, + cross_attention_dim=cross_attention_dim, + ) + elif encoder_hid_dim_type == "image_proj": + # Kandinsky 2.2 + self.encoder_hid_proj = ImageProjection( + image_embed_dim=encoder_hid_dim, + cross_attention_dim=cross_attention_dim, + ) + elif encoder_hid_dim_type is not None: + raise ValueError( + f"encoder_hid_dim_type: {encoder_hid_dim_type} must be None, 'text_proj' or 'text_image_proj'." + ) + else: + self.encoder_hid_proj = None + + # class embedding + if class_embed_type is None and num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + elif class_embed_type == "timestep": + self.class_embedding = TimestepEmbedding(timestep_input_dim, time_embed_dim, act_fn=act_fn) + elif class_embed_type == "identity": + self.class_embedding = nn.Identity(time_embed_dim, time_embed_dim) + elif class_embed_type == "projection": + if projection_class_embeddings_input_dim is None: + raise ValueError( + "`class_embed_type`: 'projection' requires `projection_class_embeddings_input_dim` be set" + ) + # The projection `class_embed_type` is the same as the timestep `class_embed_type` except + # 1. the `class_labels` inputs are not first converted to sinusoidal embeddings + # 2. it projects from an arbitrary input dimension. + # + # Note that `TimestepEmbedding` is quite general, being mainly linear layers and activations. + # When used for embedding actual timesteps, the timesteps are first converted to sinusoidal embeddings. + # As a result, `TimestepEmbedding` can be passed arbitrary vectors. + self.class_embedding = TimestepEmbedding(projection_class_embeddings_input_dim, time_embed_dim) + elif class_embed_type == "simple_projection": + if projection_class_embeddings_input_dim is None: + raise ValueError( + "`class_embed_type`: 'simple_projection' requires `projection_class_embeddings_input_dim` be set" + ) + self.class_embedding = nn.Linear(projection_class_embeddings_input_dim, time_embed_dim) + else: + self.class_embedding = None + + if addition_embed_type == "text": + if encoder_hid_dim is not None: + text_time_embedding_from_dim = encoder_hid_dim + else: + text_time_embedding_from_dim = cross_attention_dim + + self.add_embedding = TextTimeEmbedding( + text_time_embedding_from_dim, time_embed_dim, num_heads=addition_embed_type_num_heads + ) + elif addition_embed_type == "text_image": + # text_embed_dim and image_embed_dim DON'T have to be `cross_attention_dim`. To not clutter the __init__ too much + # they are set to `cross_attention_dim` here as this is exactly the required dimension for the currently only use + # case when `addition_embed_type == "text_image"` (Kadinsky 2.1)` + self.add_embedding = TextImageTimeEmbedding( + text_embed_dim=cross_attention_dim, image_embed_dim=cross_attention_dim, time_embed_dim=time_embed_dim + ) + elif addition_embed_type == "text_time": + self.add_time_proj = Timesteps(addition_time_embed_dim, flip_sin_to_cos, freq_shift) + self.add_embedding = TimestepEmbedding(projection_class_embeddings_input_dim, time_embed_dim) + elif addition_embed_type == "image": + # Kandinsky 2.2 + self.add_embedding = ImageTimeEmbedding(image_embed_dim=encoder_hid_dim, time_embed_dim=time_embed_dim) + elif addition_embed_type == "image_hint": + # Kandinsky 2.2 ControlNet + self.add_embedding = ImageHintTimeEmbedding(image_embed_dim=encoder_hid_dim, time_embed_dim=time_embed_dim) + elif addition_embed_type is not None: + raise ValueError(f"addition_embed_type: {addition_embed_type} must be None, 'text' or 'text_image'.") + + if time_embedding_act_fn is None: + self.time_embed_act = None + else: + self.time_embed_act = get_activation(time_embedding_act_fn) + + self.down_blocks = nn.ModuleList([]) + self.up_blocks = nn.ModuleList([]) + + if isinstance(only_cross_attention, bool): + if mid_block_only_cross_attention is None: + mid_block_only_cross_attention = only_cross_attention + + only_cross_attention = [only_cross_attention] * len(down_block_types) + + if mid_block_only_cross_attention is None: + mid_block_only_cross_attention = False + + if isinstance(num_attention_heads, int): + num_attention_heads = (num_attention_heads,) * len(down_block_types) + + if isinstance(attention_head_dim, int): + attention_head_dim = (attention_head_dim,) * len(down_block_types) + + if isinstance(cross_attention_dim, int): + cross_attention_dim = (cross_attention_dim,) * len(down_block_types) + + if isinstance(layers_per_block, int): + layers_per_block = [layers_per_block] * len(down_block_types) + + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * len(down_block_types) + + if class_embeddings_concat: + # The time embeddings are concatenated with the class embeddings. The dimension of the + # time embeddings passed to the down, middle, and up blocks is twice the dimension of the + # regular time embeddings + blocks_time_embed_dim = time_embed_dim * 2 + else: + blocks_time_embed_dim = time_embed_dim + + # down + output_channel = block_out_channels[0] + for i, down_block_type in enumerate(down_block_types): + input_channel = output_channel + output_channel = block_out_channels[i] + is_final_block = i == len(block_out_channels) - 1 + + down_block = get_down_block( + down_block_type, + num_layers=layers_per_block[i], + transformer_layers_per_block=transformer_layers_per_block[i], + in_channels=input_channel, + out_channels=output_channel, + temb_channels=blocks_time_embed_dim, + add_downsample=not is_final_block, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + resnet_groups=norm_num_groups, + cross_attention_dim=cross_attention_dim[i], + num_attention_heads=num_attention_heads[i], + downsample_padding=downsample_padding, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention[i], + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + resnet_skip_time_act=resnet_skip_time_act, + resnet_out_scale_factor=resnet_out_scale_factor, + cross_attention_norm=cross_attention_norm, + attention_head_dim=attention_head_dim[i] if attention_head_dim[i] is not None else output_channel, + dropout=dropout, + ) + self.down_blocks.append(down_block) + + # mid + if mid_block_type == "UNetMidBlock2DCrossAttn": + self.mid_block = UNetMidBlock2DCrossAttn( + transformer_layers_per_block=transformer_layers_per_block[-1], + in_channels=block_out_channels[-1], + temb_channels=blocks_time_embed_dim, + dropout=dropout, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + output_scale_factor=mid_block_scale_factor, + resnet_time_scale_shift=resnet_time_scale_shift, + cross_attention_dim=cross_attention_dim[-1], + num_attention_heads=num_attention_heads[-1], + resnet_groups=norm_num_groups, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + elif mid_block_type == "UNetMidBlock2DSimpleCrossAttn": + self.mid_block = UNetMidBlock2DSimpleCrossAttn( + in_channels=block_out_channels[-1], + temb_channels=blocks_time_embed_dim, + dropout=dropout, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + output_scale_factor=mid_block_scale_factor, + cross_attention_dim=cross_attention_dim[-1], + attention_head_dim=attention_head_dim[-1], + resnet_groups=norm_num_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + only_cross_attention=mid_block_only_cross_attention, + cross_attention_norm=cross_attention_norm, + ) + elif mid_block_type == "UNetMidBlock2D": + self.mid_block = UNetMidBlock2D( + in_channels=block_out_channels[-1], + temb_channels=blocks_time_embed_dim, + dropout=dropout, + num_layers=0, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + output_scale_factor=mid_block_scale_factor, + resnet_groups=norm_num_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + add_attention=False, + ) + elif mid_block_type is None: + self.mid_block = None + else: + raise ValueError(f"unknown mid_block_type : {mid_block_type}") + + # count how many layers upsample the images + self.num_upsamplers = 0 + + # up + reversed_block_out_channels = list(reversed(block_out_channels)) + reversed_num_attention_heads = list(reversed(num_attention_heads)) + reversed_layers_per_block = list(reversed(layers_per_block)) + reversed_cross_attention_dim = list(reversed(cross_attention_dim)) + reversed_transformer_layers_per_block = ( + list(reversed(transformer_layers_per_block)) + if reverse_transformer_layers_per_block is None + else reverse_transformer_layers_per_block + ) + only_cross_attention = list(reversed(only_cross_attention)) + + output_channel = reversed_block_out_channels[0] + for i, up_block_type in enumerate(up_block_types): + is_final_block = i == len(block_out_channels) - 1 + + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + input_channel = reversed_block_out_channels[min(i + 1, len(block_out_channels) - 1)] + + # add upsample block for all BUT final layer + if not is_final_block: + add_upsample = True + self.num_upsamplers += 1 + else: + add_upsample = False + + up_block = get_up_block( + up_block_type, + num_layers=reversed_layers_per_block[i] + 1, + transformer_layers_per_block=reversed_transformer_layers_per_block[i], + in_channels=input_channel, + out_channels=output_channel, + prev_output_channel=prev_output_channel, + temb_channels=blocks_time_embed_dim, + add_upsample=add_upsample, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + resolution_idx=i, + resnet_groups=norm_num_groups, + cross_attention_dim=reversed_cross_attention_dim[i], + num_attention_heads=reversed_num_attention_heads[i], + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention[i], + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + resnet_skip_time_act=resnet_skip_time_act, + resnet_out_scale_factor=resnet_out_scale_factor, + cross_attention_norm=cross_attention_norm, + attention_head_dim=attention_head_dim[i] if attention_head_dim[i] is not None else output_channel, + dropout=dropout, + ) + self.up_blocks.append(up_block) + prev_output_channel = output_channel + + # out + if norm_num_groups is not None: + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[0], num_groups=norm_num_groups, eps=norm_eps + ) + + self.conv_act = get_activation(act_fn) + + else: + self.conv_norm_out = None + self.conv_act = None + + conv_out_padding = (conv_out_kernel - 1) // 2 + self.conv_out = nn.Conv2d( + block_out_channels[0], out_channels, kernel_size=conv_out_kernel, padding=conv_out_padding + ) + + if attention_type in ["gated", "gated-text-image"]: + positive_len = 768 + if isinstance(cross_attention_dim, int): + positive_len = cross_attention_dim + elif isinstance(cross_attention_dim, tuple) or isinstance(cross_attention_dim, list): + positive_len = cross_attention_dim[0] + + feature_type = "text-only" if attention_type == "gated" else "text-image" + self.position_net = PositionNet( + positive_len=positive_len, out_dim=cross_attention_dim, feature_type=feature_type + ) + + @property + def attn_processors(self) -> Dict[str, AttentionProcessor]: + r""" + Returns: + `dict` of attention processors: A dictionary containing all attention processors used in the model with + indexed by its weight name. + """ + # set recursively + processors = {} + + def fn_recursive_add_processors(name: str, module: torch.nn.Module, processors: Dict[str, AttentionProcessor]): + if hasattr(module, "get_processor"): + processors[f"{name}.processor"] = module.get_processor(return_deprecated_lora=True) + + for sub_name, child in module.named_children(): + fn_recursive_add_processors(f"{name}.{sub_name}", child, processors) + + return processors + + for name, module in self.named_children(): + fn_recursive_add_processors(name, module, processors) + + return processors + + def set_attn_processor( + self, processor: Union[AttentionProcessor, Dict[str, AttentionProcessor]], _remove_lora=False + ): + r""" + Sets the attention processor to use to compute attention. + + Parameters: + processor (`dict` of `AttentionProcessor` or only `AttentionProcessor`): + The instantiated processor class or a dictionary of processor classes that will be set as the processor + for **all** `Attention` layers. + + If `processor` is a dict, the key needs to define the path to the corresponding cross attention + processor. This is strongly recommended when setting trainable attention processors. + + """ + count = len(self.attn_processors.keys()) + + if isinstance(processor, dict) and len(processor) != count: + raise ValueError( + f"A dict of processors was passed, but the number of processors {len(processor)} does not match the" + f" number of attention layers: {count}. Please make sure to pass {count} processor classes." + ) + + def fn_recursive_attn_processor(name: str, module: torch.nn.Module, processor): + if hasattr(module, "set_processor"): + if not isinstance(processor, dict): + module.set_processor(processor, _remove_lora=_remove_lora) + else: + module.set_processor(processor.pop(f"{name}.processor"), _remove_lora=_remove_lora) + + for sub_name, child in module.named_children(): + fn_recursive_attn_processor(f"{name}.{sub_name}", child, processor) + + for name, module in self.named_children(): + fn_recursive_attn_processor(name, module, processor) + + def set_default_attn_processor(self): + """ + Disables custom attention processors and sets the default attention implementation. + """ + if all(proc.__class__ in ADDED_KV_ATTENTION_PROCESSORS for proc in self.attn_processors.values()): + processor = AttnAddedKVProcessor() + elif all(proc.__class__ in CROSS_ATTENTION_PROCESSORS for proc in self.attn_processors.values()): + processor = AttnProcessor() + else: + raise ValueError( + f"Cannot call `set_default_attn_processor` when attention processors are of type {next(iter(self.attn_processors.values()))}" + ) + + self.set_attn_processor(processor, _remove_lora=True) + + def set_attention_slice(self, slice_size): + r""" + Enable sliced attention computation. + + When this option is enabled, the attention module splits the input tensor in slices to compute attention in + several steps. This is useful for saving some memory in exchange for a small decrease in speed. + + Args: + slice_size (`str` or `int` or `list(int)`, *optional*, defaults to `"auto"`): + When `"auto"`, input to the attention heads is halved, so attention is computed in two steps. If + `"max"`, maximum amount of memory is saved by running only one slice at a time. If a number is + provided, uses as many slices as `attention_head_dim // slice_size`. In this case, `attention_head_dim` + must be a multiple of `slice_size`. + """ + sliceable_head_dims = [] + + def fn_recursive_retrieve_sliceable_dims(module: torch.nn.Module): + if hasattr(module, "set_attention_slice"): + sliceable_head_dims.append(module.sliceable_head_dim) + + for child in module.children(): + fn_recursive_retrieve_sliceable_dims(child) + + # retrieve number of attention layers + for module in self.children(): + fn_recursive_retrieve_sliceable_dims(module) + + num_sliceable_layers = len(sliceable_head_dims) + + if slice_size == "auto": + # half the attention head size is usually a good trade-off between + # speed and memory + slice_size = [dim // 2 for dim in sliceable_head_dims] + elif slice_size == "max": + # make smallest slice possible + slice_size = num_sliceable_layers * [1] + + slice_size = num_sliceable_layers * [slice_size] if not isinstance(slice_size, list) else slice_size + + if len(slice_size) != len(sliceable_head_dims): + raise ValueError( + f"You have provided {len(slice_size)}, but {self.config} has {len(sliceable_head_dims)} different" + f" attention layers. Make sure to match `len(slice_size)` to be {len(sliceable_head_dims)}." + ) + + for i in range(len(slice_size)): + size = slice_size[i] + dim = sliceable_head_dims[i] + if size is not None and size > dim: + raise ValueError(f"size {size} has to be smaller or equal to {dim}.") + + # Recursively walk through all the children. + # Any children which exposes the set_attention_slice method + # gets the message + def fn_recursive_set_attention_slice(module: torch.nn.Module, slice_size: List[int]): + if hasattr(module, "set_attention_slice"): + module.set_attention_slice(slice_size.pop()) + + for child in module.children(): + fn_recursive_set_attention_slice(child, slice_size) + + reversed_slice_size = list(reversed(slice_size)) + for module in self.children(): + fn_recursive_set_attention_slice(module, reversed_slice_size) + + def _set_gradient_checkpointing(self, module, value=False): + if hasattr(module, "gradient_checkpointing"): + module.gradient_checkpointing = value + + def enable_freeu(self, s1, s2, b1, b2): + r"""Enables the FreeU mechanism from https://arxiv.org/abs/2309.11497. + + The suffixes after the scaling factors represent the stage blocks where they are being applied. + + Please refer to the [official repository](https://github.com/ChenyangSi/FreeU) for combinations of values that + are known to work well for different pipelines such as Stable Diffusion v1, v2, and Stable Diffusion XL. + + Args: + s1 (`float`): + Scaling factor for stage 1 to attenuate the contributions of the skip features. This is done to + mitigate the "oversmoothing effect" in the enhanced denoising process. + s2 (`float`): + Scaling factor for stage 2 to attenuate the contributions of the skip features. This is done to + mitigate the "oversmoothing effect" in the enhanced denoising process. + b1 (`float`): Scaling factor for stage 1 to amplify the contributions of backbone features. + b2 (`float`): Scaling factor for stage 2 to amplify the contributions of backbone features. + """ + for i, upsample_block in enumerate(self.up_blocks): + setattr(upsample_block, "s1", s1) + setattr(upsample_block, "s2", s2) + setattr(upsample_block, "b1", b1) + setattr(upsample_block, "b2", b2) + + def disable_freeu(self): + """Disables the FreeU mechanism.""" + freeu_keys = {"s1", "s2", "b1", "b2"} + for i, upsample_block in enumerate(self.up_blocks): + for k in freeu_keys: + if hasattr(upsample_block, k) or getattr(upsample_block, k, None) is not None: + setattr(upsample_block, k, None) + + def forward( + self, + sample: torch.FloatTensor, + timestep: Union[torch.Tensor, float, int], + encoder_hidden_states: torch.Tensor, + class_labels: Optional[torch.Tensor] = None, + timestep_cond: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + added_cond_kwargs: Optional[Dict[str, torch.Tensor]] = None, + down_block_additional_residuals: Optional[Tuple[torch.Tensor]] = None, + mid_block_additional_residual: Optional[torch.Tensor] = None, + down_intrablock_additional_residuals: Optional[Tuple[torch.Tensor]] = None, + encoder_attention_mask: Optional[torch.Tensor] = None, + return_dict: bool = True, + ) -> Union[UNet2DConditionOutput, Tuple]: + r""" + The [`UNet2DConditionModel`] forward method. + + Args: + sample (`torch.FloatTensor`): + The noisy input tensor with the following shape `(batch, channel, height, width)`. + timestep (`torch.FloatTensor` or `float` or `int`): The number of timesteps to denoise an input. + encoder_hidden_states (`torch.FloatTensor`): + The encoder hidden states with shape `(batch, sequence_length, feature_dim)`. + class_labels (`torch.Tensor`, *optional*, defaults to `None`): + Optional class labels for conditioning. Their embeddings will be summed with the timestep embeddings. + timestep_cond: (`torch.Tensor`, *optional*, defaults to `None`): + Conditional embeddings for timestep. If provided, the embeddings will be summed with the samples passed + through the `self.time_embedding` layer to obtain the timestep embeddings. + attention_mask (`torch.Tensor`, *optional*, defaults to `None`): + An attention mask of shape `(batch, key_tokens)` is applied to `encoder_hidden_states`. If `1` the mask + is kept, otherwise if `0` it is discarded. Mask will be converted into a bias, which adds large + negative values to the attention scores corresponding to "discard" tokens. + cross_attention_kwargs (`dict`, *optional*): + A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under + `self.processor` in + [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). + added_cond_kwargs: (`dict`, *optional*): + A kwargs dictionary containing additional embeddings that if specified are added to the embeddings that + are passed along to the UNet blocks. + down_block_additional_residuals: (`tuple` of `torch.Tensor`, *optional*): + A tuple of tensors that if specified are added to the residuals of down unet blocks. + mid_block_additional_residual: (`torch.Tensor`, *optional*): + A tensor that if specified is added to the residual of the middle unet block. + encoder_attention_mask (`torch.Tensor`): + A cross-attention mask of shape `(batch, sequence_length)` is applied to `encoder_hidden_states`. If + `True` the mask is kept, otherwise if `False` it is discarded. Mask will be converted into a bias, + which adds large negative values to the attention scores corresponding to "discard" tokens. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~models.unet_2d_condition.UNet2DConditionOutput`] instead of a plain + tuple. + cross_attention_kwargs (`dict`, *optional*): + A kwargs dictionary that if specified is passed along to the [`AttnProcessor`]. + added_cond_kwargs: (`dict`, *optional*): + A kwargs dictionary containin additional embeddings that if specified are added to the embeddings that + are passed along to the UNet blocks. + down_block_additional_residuals (`tuple` of `torch.Tensor`, *optional*): + additional residuals to be added to UNet long skip connections from down blocks to up blocks for + example from ControlNet side model(s) + mid_block_additional_residual (`torch.Tensor`, *optional*): + additional residual to be added to UNet mid block output, for example from ControlNet side model + down_intrablock_additional_residuals (`tuple` of `torch.Tensor`, *optional*): + additional residuals to be added within UNet down blocks, for example from T2I-Adapter side model(s) + + Returns: + [`~models.unet_2d_condition.UNet2DConditionOutput`] or `tuple`: + If `return_dict` is True, an [`~models.unet_2d_condition.UNet2DConditionOutput`] is returned, otherwise + a `tuple` is returned where the first element is the sample tensor. + """ + # By default samples have to be AT least a multiple of the overall upsampling factor. + # The overall upsampling factor is equal to 2 ** (# num of upsampling layers). + # However, the upsampling interpolation output size can be forced to fit any upsampling size + # on the fly if necessary. + default_overall_up_factor = 2**self.num_upsamplers + + # upsample size should be forwarded when sample is not a multiple of `default_overall_up_factor` + forward_upsample_size = False + upsample_size = None + + for dim in sample.shape[-2:]: + if dim % default_overall_up_factor != 0: + # Forward upsample size to force interpolation output size. + forward_upsample_size = True + break + + # ensure attention_mask is a bias, and give it a singleton query_tokens dimension + # expects mask of shape: + # [batch, key_tokens] + # adds singleton query_tokens dimension: + # [batch, 1, key_tokens] + # this helps to broadcast it as a bias over attention scores, which will be in one of the following shapes: + # [batch, heads, query_tokens, key_tokens] (e.g. torch sdp attn) + # [batch * heads, query_tokens, key_tokens] (e.g. xformers or classic attn) + if attention_mask is not None: + # assume that mask is expressed as: + # (1 = keep, 0 = discard) + # convert mask into a bias that can be added to attention scores: + # (keep = +0, discard = -10000.0) + attention_mask = (1 - attention_mask.to(sample.dtype)) * -10000.0 + attention_mask = attention_mask.unsqueeze(1) + + # convert encoder_attention_mask to a bias the same way we do for attention_mask + if encoder_attention_mask is not None: + encoder_attention_mask = (1 - encoder_attention_mask.to(sample.dtype)) * -10000.0 + encoder_attention_mask = encoder_attention_mask.unsqueeze(1) + + # 0. center input if necessary + if self.config.center_input_sample: + sample = 2 * sample - 1.0 + + # 1. time + timesteps = timestep + if not torch.is_tensor(timesteps): + # TODO: this requires sync between CPU and GPU. So try to pass timesteps as tensors if you can + # This would be a good case for the `match` statement (Python 3.10+) + is_mps = sample.device.type == "mps" + if isinstance(timestep, float): + dtype = torch.float32 if is_mps else torch.float64 + else: + dtype = torch.int32 if is_mps else torch.int64 + timesteps = torch.tensor([timesteps], dtype=dtype, device=sample.device) + elif len(timesteps.shape) == 0: + timesteps = timesteps[None].to(sample.device) + + # broadcast to batch dimension in a way that's compatible with ONNX/Core ML + timesteps = timesteps.expand(sample.shape[0]) + + t_emb = self.time_proj(timesteps) + + # `Timesteps` does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=sample.dtype) + + emb = self.time_embedding(t_emb, timestep_cond) + aug_emb = None + + if self.class_embedding is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + + if self.config.class_embed_type == "timestep": + class_labels = self.time_proj(class_labels) + + # `Timesteps` does not contain any weights and will always return f32 tensors + # there might be better ways to encapsulate this. + class_labels = class_labels.to(dtype=sample.dtype) + + class_emb = self.class_embedding(class_labels).to(dtype=sample.dtype) + + if self.config.class_embeddings_concat: + emb = torch.cat([emb, class_emb], dim=-1) + else: + emb = emb + class_emb + + if self.config.addition_embed_type == "text": + aug_emb = self.add_embedding(encoder_hidden_states) + elif self.config.addition_embed_type == "text_image": + # Kandinsky 2.1 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'text_image' which requires the keyword argument `image_embeds` to be passed in `added_cond_kwargs`" + ) + + image_embs = added_cond_kwargs.get("image_embeds") + text_embs = added_cond_kwargs.get("text_embeds", encoder_hidden_states) + aug_emb = self.add_embedding(text_embs, image_embs) + elif self.config.addition_embed_type == "text_time": + # SDXL - style + if "text_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'text_time' which requires the keyword argument `text_embeds` to be passed in `added_cond_kwargs`" + ) + text_embeds = added_cond_kwargs.get("text_embeds") + if "time_ids" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'text_time' which requires the keyword argument `time_ids` to be passed in `added_cond_kwargs`" + ) + time_ids = added_cond_kwargs.get("time_ids") + time_embeds = self.add_time_proj(time_ids.flatten()) + time_embeds = time_embeds.reshape((text_embeds.shape[0], -1)) + add_embeds = torch.concat([text_embeds, time_embeds], dim=-1) + add_embeds = add_embeds.to(emb.dtype) + aug_emb = self.add_embedding(add_embeds) + elif self.config.addition_embed_type == "image": + # Kandinsky 2.2 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'image' which requires the keyword argument `image_embeds` to be passed in `added_cond_kwargs`" + ) + image_embs = added_cond_kwargs.get("image_embeds") + aug_emb = self.add_embedding(image_embs) + elif self.config.addition_embed_type == "image_hint": + # Kandinsky 2.2 - style + if "image_embeds" not in added_cond_kwargs or "hint" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'image_hint' which requires the keyword arguments `image_embeds` and `hint` to be passed in `added_cond_kwargs`" + ) + image_embs = added_cond_kwargs.get("image_embeds") + hint = added_cond_kwargs.get("hint") + aug_emb, hint = self.add_embedding(image_embs, hint) + sample = torch.cat([sample, hint], dim=1) + + emb = emb + aug_emb if aug_emb is not None else emb + + if self.time_embed_act is not None: + emb = self.time_embed_act(emb) + + if self.encoder_hid_proj is not None and self.config.encoder_hid_dim_type == "text_proj": + encoder_hidden_states = self.encoder_hid_proj(encoder_hidden_states) + elif self.encoder_hid_proj is not None and self.config.encoder_hid_dim_type == "text_image_proj": + # Kadinsky 2.1 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `encoder_hid_dim_type` set to 'text_image_proj' which requires the keyword argument `image_embeds` to be passed in `added_conditions`" + ) + + image_embeds = added_cond_kwargs.get("image_embeds") + encoder_hidden_states = self.encoder_hid_proj(encoder_hidden_states, image_embeds) + elif self.encoder_hid_proj is not None and self.config.encoder_hid_dim_type == "image_proj": + # Kandinsky 2.2 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `encoder_hid_dim_type` set to 'image_proj' which requires the keyword argument `image_embeds` to be passed in `added_conditions`" + ) + image_embeds = added_cond_kwargs.get("image_embeds") + encoder_hidden_states = self.encoder_hid_proj(image_embeds) + # 2. pre-process + sample = self.conv_in(sample) + + # 2.5 GLIGEN position net + if cross_attention_kwargs is not None and cross_attention_kwargs.get("gligen", None) is not None: + cross_attention_kwargs = cross_attention_kwargs.copy() + gligen_args = cross_attention_kwargs.pop("gligen") + cross_attention_kwargs["gligen"] = {"objs": self.position_net(**gligen_args)} + + # For Vton + spatial_attn_inputs = [] + + # 3. down + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + if USE_PEFT_BACKEND: + # weight the lora layers by setting `lora_scale` for each PEFT layer + scale_lora_layers(self, lora_scale) + + is_controlnet = mid_block_additional_residual is not None and down_block_additional_residuals is not None + # using new arg down_intrablock_additional_residuals for T2I-Adapters, to distinguish from controlnets + is_adapter = down_intrablock_additional_residuals is not None + # maintain backward compatibility for legacy usage, where + # T2I-Adapter and ControlNet both use down_block_additional_residuals arg + # but can only use one or the other + if not is_adapter and mid_block_additional_residual is None and down_block_additional_residuals is not None: + deprecate( + "T2I should not use down_block_additional_residuals", + "1.3.0", + "Passing intrablock residual connections with `down_block_additional_residuals` is deprecated \ + and will be removed in diffusers 1.3.0. `down_block_additional_residuals` should only be used \ + for ControlNet. Please make sure use `down_intrablock_additional_residuals` instead. ", + standard_warn=False, + ) + down_intrablock_additional_residuals = down_block_additional_residuals + is_adapter = True + + down_block_res_samples = (sample,) + for downsample_block in self.down_blocks: + if hasattr(downsample_block, "has_cross_attention") and downsample_block.has_cross_attention: + # For t2i-adapter CrossAttnDownBlock2D + additional_residuals = {} + if is_adapter and len(down_intrablock_additional_residuals) > 0: + additional_residuals["additional_residuals"] = down_intrablock_additional_residuals.pop(0) + + sample, res_samples, spatial_attn_inputs = downsample_block( + hidden_states=sample, + spatial_attn_inputs=spatial_attn_inputs, + temb=emb, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + **additional_residuals, + ) + else: + sample, res_samples = downsample_block( + hidden_states=sample, + temb=emb, + scale=lora_scale, + ) + if is_adapter and len(down_intrablock_additional_residuals) > 0: + sample += down_intrablock_additional_residuals.pop(0) + + down_block_res_samples += res_samples + + # if is_controlnet: + # new_down_block_res_samples = () + + # for down_block_res_sample, down_block_additional_residual in zip( + # down_block_res_samples, down_block_additional_residuals + # ): + # down_block_res_sample = down_block_res_sample + down_block_additional_residual + # new_down_block_res_samples = new_down_block_res_samples + (down_block_res_sample,) + + # down_block_res_samples = new_down_block_res_samples + + # 4. mid + if self.mid_block is not None: + if hasattr(self.mid_block, "has_cross_attention") and self.mid_block.has_cross_attention: + sample, spatial_attn_inputs = self.mid_block( + sample, + spatial_attn_inputs=spatial_attn_inputs, + temb=emb, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + else: + sample = self.mid_block(sample, emb) + + # To support T2I-Adapter-XL + if ( + is_adapter + and len(down_intrablock_additional_residuals) > 0 + and sample.shape == down_intrablock_additional_residuals[0].shape + ): + sample += down_intrablock_additional_residuals.pop(0) + + if is_controlnet: + sample = sample + mid_block_additional_residual + + # 5. up + for i, upsample_block in enumerate(self.up_blocks): + is_final_block = i == len(self.up_blocks) - 1 + + res_samples = down_block_res_samples[-len(upsample_block.resnets) :] + down_block_res_samples = down_block_res_samples[: -len(upsample_block.resnets)] + + # if we have not reached the final block and need to forward the + # upsample size, we do it here + if not is_final_block and forward_upsample_size: + upsample_size = down_block_res_samples[-1].shape[2:] + + if hasattr(upsample_block, "has_cross_attention") and upsample_block.has_cross_attention: + sample, spatial_attn_inputs = upsample_block( + hidden_states=sample, + spatial_attn_inputs=spatial_attn_inputs, + temb=emb, + res_hidden_states_tuple=res_samples, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + upsample_size=upsample_size, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + ) + else: + sample = upsample_block( + hidden_states=sample, + temb=emb, + res_hidden_states_tuple=res_samples, + upsample_size=upsample_size, + scale=lora_scale, + ) + + # 6. post-process + if self.conv_norm_out: + sample = self.conv_norm_out(sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample) + + if USE_PEFT_BACKEND: + # remove `lora_scale` from each PEFT layer + unscale_lora_layers(self, lora_scale) + + if not return_dict: + return (sample,), spatial_attn_inputs + + return UNet2DConditionOutput(sample=sample), spatial_attn_inputs diff --git a/ootd/pipelines_ootd/unet_vton_2d_blocks.py b/ootd/pipelines_ootd/unet_vton_2d_blocks.py new file mode 100644 index 0000000..57e2555 --- /dev/null +++ b/ootd/pipelines_ootd/unet_vton_2d_blocks.py @@ -0,0 +1,3519 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from typing import Any, Dict, Optional, Tuple, Union + +import numpy as np +import torch +import torch.nn.functional as F +from torch import nn + +from .transformer_vton_2d import Transformer2DModel + +from diffusers.utils import is_torch_version, logging +from diffusers.utils.torch_utils import apply_freeu +from diffusers.models.activations import get_activation +from diffusers.models.attention_processor import Attention, AttnAddedKVProcessor, AttnAddedKVProcessor2_0 +from diffusers.models.dual_transformer_2d import DualTransformer2DModel +from diffusers.models.normalization import AdaGroupNorm +from diffusers.models.resnet import Downsample2D, FirDownsample2D, FirUpsample2D, KDownsample2D, KUpsample2D, ResnetBlock2D, Upsample2D +# from diffusers.models.transformer_2d import Transformer2DModel + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +def get_down_block( + down_block_type: str, + num_layers: int, + in_channels: int, + out_channels: int, + temb_channels: int, + add_downsample: bool, + resnet_eps: float, + resnet_act_fn: str, + transformer_layers_per_block: int = 1, + num_attention_heads: Optional[int] = None, + resnet_groups: Optional[int] = None, + cross_attention_dim: Optional[int] = None, + downsample_padding: Optional[int] = None, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + resnet_time_scale_shift: str = "default", + attention_type: str = "default", + resnet_skip_time_act: bool = False, + resnet_out_scale_factor: float = 1.0, + cross_attention_norm: Optional[str] = None, + attention_head_dim: Optional[int] = None, + downsample_type: Optional[str] = None, + dropout: float = 0.0, +): + # If attn head dim is not defined, we default it to the number of heads + if attention_head_dim is None: + logger.warn( + f"It is recommended to provide `attention_head_dim` when calling `get_down_block`. Defaulting `attention_head_dim` to {num_attention_heads}." + ) + attention_head_dim = num_attention_heads + + down_block_type = down_block_type[7:] if down_block_type.startswith("UNetRes") else down_block_type + if down_block_type == "DownBlock2D": + return DownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "ResnetDownsampleBlock2D": + return ResnetDownsampleBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + ) + elif down_block_type == "AttnDownBlock2D": + if add_downsample is False: + downsample_type = None + else: + downsample_type = downsample_type or "conv" # default to 'conv' + return AttnDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + downsample_type=downsample_type, + ) + elif down_block_type == "CrossAttnDownBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for CrossAttnDownBlock2D") + return CrossAttnDownBlock2D( + num_layers=num_layers, + transformer_layers_per_block=transformer_layers_per_block, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + cross_attention_dim=cross_attention_dim, + num_attention_heads=num_attention_heads, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + ) + elif down_block_type == "SimpleCrossAttnDownBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for SimpleCrossAttnDownBlock2D") + return SimpleCrossAttnDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + ) + elif down_block_type == "SkipDownBlock2D": + return SkipDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + downsample_padding=downsample_padding, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "AttnSkipDownBlock2D": + return AttnSkipDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "DownEncoderBlock2D": + return DownEncoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "AttnDownEncoderBlock2D": + return AttnDownEncoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + downsample_padding=downsample_padding, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif down_block_type == "KDownBlock2D": + return KDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + ) + elif down_block_type == "KCrossAttnDownBlock2D": + return KCrossAttnDownBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + dropout=dropout, + add_downsample=add_downsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + add_self_attention=True if not add_downsample else False, + ) + raise ValueError(f"{down_block_type} does not exist.") + + +def get_up_block( + up_block_type: str, + num_layers: int, + in_channels: int, + out_channels: int, + prev_output_channel: int, + temb_channels: int, + add_upsample: bool, + resnet_eps: float, + resnet_act_fn: str, + resolution_idx: Optional[int] = None, + transformer_layers_per_block: int = 1, + num_attention_heads: Optional[int] = None, + resnet_groups: Optional[int] = None, + cross_attention_dim: Optional[int] = None, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + resnet_time_scale_shift: str = "default", + attention_type: str = "default", + resnet_skip_time_act: bool = False, + resnet_out_scale_factor: float = 1.0, + cross_attention_norm: Optional[str] = None, + attention_head_dim: Optional[int] = None, + upsample_type: Optional[str] = None, + dropout: float = 0.0, +) -> nn.Module: + # If attn head dim is not defined, we default it to the number of heads + if attention_head_dim is None: + logger.warn( + f"It is recommended to provide `attention_head_dim` when calling `get_up_block`. Defaulting `attention_head_dim` to {num_attention_heads}." + ) + attention_head_dim = num_attention_heads + + up_block_type = up_block_type[7:] if up_block_type.startswith("UNetRes") else up_block_type + if up_block_type == "UpBlock2D": + return UpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif up_block_type == "ResnetUpsampleBlock2D": + return ResnetUpsampleBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + ) + elif up_block_type == "CrossAttnUpBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for CrossAttnUpBlock2D") + return CrossAttnUpBlock2D( + num_layers=num_layers, + transformer_layers_per_block=transformer_layers_per_block, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + cross_attention_dim=cross_attention_dim, + num_attention_heads=num_attention_heads, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + ) + elif up_block_type == "SimpleCrossAttnUpBlock2D": + if cross_attention_dim is None: + raise ValueError("cross_attention_dim must be specified for SimpleCrossAttnUpBlock2D") + return SimpleCrossAttnUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + output_scale_factor=resnet_out_scale_factor, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + ) + elif up_block_type == "AttnUpBlock2D": + if add_upsample is False: + upsample_type = None + else: + upsample_type = upsample_type or "conv" # default to 'conv' + + return AttnUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + upsample_type=upsample_type, + ) + elif up_block_type == "SkipUpBlock2D": + return SkipUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif up_block_type == "AttnSkipUpBlock2D": + return AttnSkipUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + prev_output_channel=prev_output_channel, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + ) + elif up_block_type == "UpDecoderBlock2D": + return UpDecoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + temb_channels=temb_channels, + ) + elif up_block_type == "AttnUpDecoderBlock2D": + return AttnUpDecoderBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + resnet_groups=resnet_groups, + attention_head_dim=attention_head_dim, + resnet_time_scale_shift=resnet_time_scale_shift, + temb_channels=temb_channels, + ) + elif up_block_type == "KUpBlock2D": + return KUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + ) + elif up_block_type == "KCrossAttnUpBlock2D": + return KCrossAttnUpBlock2D( + num_layers=num_layers, + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + resolution_idx=resolution_idx, + dropout=dropout, + add_upsample=add_upsample, + resnet_eps=resnet_eps, + resnet_act_fn=resnet_act_fn, + cross_attention_dim=cross_attention_dim, + attention_head_dim=attention_head_dim, + ) + + raise ValueError(f"{up_block_type} does not exist.") + + +class AutoencoderTinyBlock(nn.Module): + """ + Tiny Autoencoder block used in [`AutoencoderTiny`]. It is a mini residual module consisting of plain conv + ReLU + blocks. + + Args: + in_channels (`int`): The number of input channels. + out_channels (`int`): The number of output channels. + act_fn (`str`): + ` The activation function to use. Supported values are `"swish"`, `"mish"`, `"gelu"`, and `"relu"`. + + Returns: + `torch.FloatTensor`: A tensor with the same shape as the input tensor, but with the number of channels equal to + `out_channels`. + """ + + def __init__(self, in_channels: int, out_channels: int, act_fn: str): + super().__init__() + act_fn = get_activation(act_fn) + self.conv = nn.Sequential( + nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), + act_fn, + nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), + act_fn, + nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), + ) + self.skip = ( + nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False) + if in_channels != out_channels + else nn.Identity() + ) + self.fuse = nn.ReLU() + + def forward(self, x: torch.FloatTensor) -> torch.FloatTensor: + return self.fuse(self.conv(x) + self.skip(x)) + + +class UNetMidBlock2D(nn.Module): + """ + A 2D UNet mid-block [`UNetMidBlock2D`] with multiple residual blocks and optional attention blocks. + + Args: + in_channels (`int`): The number of input channels. + temb_channels (`int`): The number of temporal embedding channels. + dropout (`float`, *optional*, defaults to 0.0): The dropout rate. + num_layers (`int`, *optional*, defaults to 1): The number of residual blocks. + resnet_eps (`float`, *optional*, 1e-6 ): The epsilon value for the resnet blocks. + resnet_time_scale_shift (`str`, *optional*, defaults to `default`): + The type of normalization to apply to the time embeddings. This can help to improve the performance of the + model on tasks with long-range temporal dependencies. + resnet_act_fn (`str`, *optional*, defaults to `swish`): The activation function for the resnet blocks. + resnet_groups (`int`, *optional*, defaults to 32): + The number of groups to use in the group normalization layers of the resnet blocks. + attn_groups (`Optional[int]`, *optional*, defaults to None): The number of groups for the attention blocks. + resnet_pre_norm (`bool`, *optional*, defaults to `True`): + Whether to use pre-normalization for the resnet blocks. + add_attention (`bool`, *optional*, defaults to `True`): Whether to add attention blocks. + attention_head_dim (`int`, *optional*, defaults to 1): + Dimension of a single attention head. The number of attention heads is determined based on this value and + the number of input channels. + output_scale_factor (`float`, *optional*, defaults to 1.0): The output scale factor. + + Returns: + `torch.FloatTensor`: The output of the last residual block, which is a tensor of shape `(batch_size, + in_channels, height, width)`. + + """ + + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", # default, spatial + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + attn_groups: Optional[int] = None, + resnet_pre_norm: bool = True, + add_attention: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + ): + super().__init__() + resnet_groups = resnet_groups if resnet_groups is not None else min(in_channels // 4, 32) + self.add_attention = add_attention + + if attn_groups is None: + attn_groups = resnet_groups if resnet_time_scale_shift == "default" else None + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ] + attentions = [] + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {in_channels}." + ) + attention_head_dim = in_channels + + for _ in range(num_layers): + if self.add_attention: + attentions.append( + Attention( + in_channels, + heads=in_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=attn_groups, + spatial_norm_dim=temb_channels if resnet_time_scale_shift == "spatial" else None, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + else: + attentions.append(None) + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + def forward(self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None) -> torch.FloatTensor: + hidden_states = self.resnets[0](hidden_states, temb) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + if attn is not None: + hidden_states = attn(hidden_states, temb=temb) + hidden_states = resnet(hidden_states, temb) + + return hidden_states + + +class UNetMidBlock2DCrossAttn(nn.Module): + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + transformer_layers_per_block: Union[int, Tuple[int]] = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + num_attention_heads: int = 1, + output_scale_factor: float = 1.0, + cross_attention_dim: int = 1280, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + upcast_attention: bool = False, + attention_type: str = "default", + ): + super().__init__() + + self.has_cross_attention = True + self.num_attention_heads = num_attention_heads + resnet_groups = resnet_groups if resnet_groups is not None else min(in_channels // 4, 32) + + # support for variable transformer layers per block + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * num_layers + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ] + attentions = [] + + for i in range(num_layers): + if not dual_cross_attention: + attentions.append( + Transformer2DModel( + num_attention_heads, + in_channels // num_attention_heads, + in_channels=in_channels, + num_layers=transformer_layers_per_block[i], + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + ) + else: + attentions.append( + DualTransformer2DModel( + num_attention_heads, + in_channels // num_attention_heads, + in_channels=in_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + ) + ) + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + spatial_attn_inputs = [], + spatial_attn_idx = 0, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + hidden_states = self.resnets[0](hidden_states, temb, scale=lora_scale) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states, spatial_attn_inputs, spatial_attn_idx = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + else: + hidden_states, spatial_attn_inputs, spatial_attn_idx = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + return hidden_states, spatial_attn_inputs, spatial_attn_idx + + +class UNetMidBlock2DSimpleCrossAttn(nn.Module): + def __init__( + self, + in_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + cross_attention_dim: int = 1280, + skip_time_act: bool = False, + only_cross_attention: bool = False, + cross_attention_norm: Optional[str] = None, + ): + super().__init__() + + self.has_cross_attention = True + + self.attention_head_dim = attention_head_dim + resnet_groups = resnet_groups if resnet_groups is not None else min(in_channels // 4, 32) + + self.num_heads = in_channels // self.attention_head_dim + + # there is always at least one resnet + resnets = [ + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ] + attentions = [] + + for _ in range(num_layers): + processor = ( + AttnAddedKVProcessor2_0() if hasattr(F, "scaled_dot_product_attention") else AttnAddedKVProcessor() + ) + + attentions.append( + Attention( + query_dim=in_channels, + cross_attention_dim=in_channels, + heads=self.num_heads, + dim_head=self.attention_head_dim, + added_kv_proj_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + bias=True, + upcast_softmax=True, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + processor=processor, + ) + ) + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=in_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + lora_scale = cross_attention_kwargs.get("scale", 1.0) + + if attention_mask is None: + # if encoder_hidden_states is defined: we are doing cross-attn, so we should use cross-attn mask. + mask = None if encoder_hidden_states is None else encoder_attention_mask + else: + # when attention_mask is defined: we don't even check for encoder_attention_mask. + # this is to maintain compatibility with UnCLIP, which uses 'attention_mask' param for cross-attn masks. + # TODO: UnCLIP should express cross-attn mask via encoder_attention_mask param instead of via attention_mask. + # then we can simplify this whole if/else block to: + # mask = attention_mask if encoder_hidden_states is None else encoder_attention_mask + mask = attention_mask + + hidden_states = self.resnets[0](hidden_states, temb, scale=lora_scale) + for attn, resnet in zip(self.attentions, self.resnets[1:]): + # attn + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + + # resnet + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + return hidden_states + + +class AttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + downsample_padding: int = 1, + downsample_type: str = "conv", + ): + super().__init__() + resnets = [] + attentions = [] + self.downsample_type = downsample_type + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if downsample_type == "conv": + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + elif downsample_type == "resnet": + self.downsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + down=True, + ) + ] + ) + else: + self.downsamplers = None + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + lora_scale = cross_attention_kwargs.get("scale", 1.0) + + output_states = () + + for resnet, attn in zip(self.resnets, self.attentions): + cross_attention_kwargs.update({"scale": lora_scale}) + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states = attn(hidden_states, **cross_attention_kwargs) + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + if self.downsample_type == "resnet": + hidden_states = downsampler(hidden_states, temb=temb, scale=lora_scale) + else: + hidden_states = downsampler(hidden_states, scale=lora_scale) + + output_states += (hidden_states,) + + return hidden_states, output_states + + +class CrossAttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + transformer_layers_per_block: Union[int, Tuple[int]] = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + num_attention_heads: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + downsample_padding: int = 1, + add_downsample: bool = True, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + attention_type: str = "default", + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + self.num_attention_heads = num_attention_heads + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * num_layers + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + if not dual_cross_attention: + attentions.append( + Transformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=transformer_layers_per_block[i], + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + ) + else: + attentions.append( + DualTransformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + spatial_attn_inputs = [], + spatial_attn_idx = 0, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + additional_residuals: Optional[torch.FloatTensor] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + blocks = list(zip(self.resnets, self.attentions)) + + for i, (resnet, attn) in enumerate(blocks): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states, spatial_attn_inputs, spatial_attn_idx = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states, spatial_attn_inputs, spatial_attn_idx = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + + # apply additional residuals to the output of the last pair of resnet and attention blocks + if i == len(blocks) - 1 and additional_residuals is not None: + hidden_states = hidden_states + additional_residuals + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale=lora_scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states, spatial_attn_inputs, spatial_attn_idx + + +class DownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale=scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states + + +class DownEncoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=None, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + def forward(self, hidden_states: torch.FloatTensor, scale: float = 1.0) -> torch.FloatTensor: + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb=None, scale=scale) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale) + + return hidden_states + + +class AttnDownEncoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + resnets = [] + attentions = [] + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=None, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + Downsample2D( + out_channels, use_conv=True, out_channels=out_channels, padding=downsample_padding, name="op" + ) + ] + ) + else: + self.downsamplers = None + + def forward(self, hidden_states: torch.FloatTensor, scale: float = 1.0) -> torch.FloatTensor: + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb=None, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, **cross_attention_kwargs) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, scale) + + return hidden_states + + +class AttnSkipDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = np.sqrt(2.0), + add_downsample: bool = True, + ): + super().__init__() + self.attentions = nn.ModuleList([]) + self.resnets = nn.ModuleList([]) + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + self.resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(in_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + self.attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=32, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + if add_downsample: + self.resnet_down = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + down=True, + kernel="fir", + ) + self.downsamplers = nn.ModuleList([FirDownsample2D(out_channels, out_channels=out_channels)]) + self.skip_conv = nn.Conv2d(3, out_channels, kernel_size=(1, 1), stride=(1, 1)) + else: + self.resnet_down = None + self.downsamplers = None + self.skip_conv = None + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + skip_sample: Optional[torch.FloatTensor] = None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...], torch.FloatTensor]: + output_states = () + + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, **cross_attention_kwargs) + output_states += (hidden_states,) + + if self.downsamplers is not None: + hidden_states = self.resnet_down(hidden_states, temb, scale=scale) + for downsampler in self.downsamplers: + skip_sample = downsampler(skip_sample) + + hidden_states = self.skip_conv(skip_sample) + hidden_states + + output_states += (hidden_states,) + + return hidden_states, output_states, skip_sample + + +class SkipDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + output_scale_factor: float = np.sqrt(2.0), + add_downsample: bool = True, + downsample_padding: int = 1, + ): + super().__init__() + self.resnets = nn.ModuleList([]) + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + self.resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(in_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + if add_downsample: + self.resnet_down = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + down=True, + kernel="fir", + ) + self.downsamplers = nn.ModuleList([FirDownsample2D(out_channels, out_channels=out_channels)]) + self.skip_conv = nn.Conv2d(3, out_channels, kernel_size=(1, 1), stride=(1, 1)) + else: + self.resnet_down = None + self.downsamplers = None + self.skip_conv = None + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + skip_sample: Optional[torch.FloatTensor] = None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...], torch.FloatTensor]: + output_states = () + + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb, scale) + output_states += (hidden_states,) + + if self.downsamplers is not None: + hidden_states = self.resnet_down(hidden_states, temb, scale) + for downsampler in self.downsamplers: + skip_sample = downsampler(skip_sample) + + hidden_states = self.skip_conv(skip_sample) + hidden_states + + output_states += (hidden_states,) + + return hidden_states, output_states, skip_sample + + +class ResnetDownsampleBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + skip_time_act: bool = False, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + down=True, + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale) + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, temb, scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states + + +class SimpleCrossAttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + add_downsample: bool = True, + skip_time_act: bool = False, + only_cross_attention: bool = False, + cross_attention_norm: Optional[str] = None, + ): + super().__init__() + + self.has_cross_attention = True + + resnets = [] + attentions = [] + + self.attention_head_dim = attention_head_dim + self.num_heads = out_channels // self.attention_head_dim + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + processor = ( + AttnAddedKVProcessor2_0() if hasattr(F, "scaled_dot_product_attention") else AttnAddedKVProcessor() + ) + + attentions.append( + Attention( + query_dim=out_channels, + cross_attention_dim=out_channels, + heads=self.num_heads, + dim_head=attention_head_dim, + added_kv_proj_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + bias=True, + upcast_softmax=True, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + processor=processor, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + self.downsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + down=True, + ) + ] + ) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + lora_scale = cross_attention_kwargs.get("scale", 1.0) + + if attention_mask is None: + # if encoder_hidden_states is defined: we are doing cross-attn, so we should use cross-attn mask. + mask = None if encoder_hidden_states is None else encoder_attention_mask + else: + # when attention_mask is defined: we don't even check for encoder_attention_mask. + # this is to maintain compatibility with UnCLIP, which uses 'attention_mask' param for cross-attn masks. + # TODO: UnCLIP should express cross-attn mask via encoder_attention_mask param instead of via attention_mask. + # then we can simplify this whole if/else block to: + # mask = attention_mask if encoder_hidden_states is None else encoder_attention_mask + mask = attention_mask + + for resnet, attn in zip(self.resnets, self.attentions): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + hidden_states = torch.utils.checkpoint.checkpoint(create_custom_forward(resnet), hidden_states, temb) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + + output_states = output_states + (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states, temb, scale=lora_scale) + + output_states = output_states + (hidden_states,) + + return hidden_states, output_states + + +class KDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + dropout: float = 0.0, + num_layers: int = 4, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + resnet_group_size: int = 32, + add_downsample: bool = False, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + temb_channels=temb_channels, + groups=groups, + groups_out=groups_out, + eps=resnet_eps, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_downsample: + # YiYi's comments- might be able to use FirDownsample2D, look into details later + self.downsamplers = nn.ModuleList([KDownsample2D()]) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale) + + output_states += (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states) + + return hidden_states, output_states + + +class KCrossAttnDownBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + cross_attention_dim: int, + dropout: float = 0.0, + num_layers: int = 4, + resnet_group_size: int = 32, + add_downsample: bool = True, + attention_head_dim: int = 64, + add_self_attention: bool = False, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + + for i in range(num_layers): + in_channels = in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + dropout=dropout, + temb_channels=temb_channels, + groups=groups, + groups_out=groups_out, + eps=resnet_eps, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + attentions.append( + KAttentionBlock( + out_channels, + out_channels // attention_head_dim, + attention_head_dim, + cross_attention_dim=cross_attention_dim, + temb_channels=temb_channels, + attention_bias=True, + add_self_attention=add_self_attention, + cross_attention_norm="layer_norm", + group_size=resnet_group_size, + ) + ) + + self.resnets = nn.ModuleList(resnets) + self.attentions = nn.ModuleList(attentions) + + if add_downsample: + self.downsamplers = nn.ModuleList([KDownsample2D()]) + else: + self.downsamplers = None + + self.gradient_checkpointing = False + + def forward( + self, + hidden_states: torch.FloatTensor, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> Tuple[torch.FloatTensor, Tuple[torch.FloatTensor, ...]]: + output_states = () + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + + for resnet, attn in zip(self.resnets, self.attentions): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + + if self.downsamplers is None: + output_states += (None,) + else: + output_states += (hidden_states,) + + if self.downsamplers is not None: + for downsampler in self.downsamplers: + hidden_states = downsampler(hidden_states) + + return hidden_states, output_states + + +class AttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: int = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + upsample_type: str = "conv", + ): + super().__init__() + resnets = [] + attentions = [] + + self.upsample_type = upsample_type + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `in_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if upsample_type == "conv": + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + elif upsample_type == "resnet": + self.upsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + up=True, + ) + ] + ) + else: + self.upsamplers = None + + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, **cross_attention_kwargs) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + if self.upsample_type == "resnet": + hidden_states = upsampler(hidden_states, temb=temb, scale=scale) + else: + hidden_states = upsampler(hidden_states, scale=scale) + + return hidden_states + + +class CrossAttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + prev_output_channel: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + transformer_layers_per_block: Union[int, Tuple[int]] = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + num_attention_heads: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + only_cross_attention: bool = False, + upcast_attention: bool = False, + attention_type: str = "default", + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + self.num_attention_heads = num_attention_heads + + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * num_layers + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + if not dual_cross_attention: + attentions.append( + Transformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=transformer_layers_per_block[i], + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + ) + else: + attentions.append( + DualTransformer2DModel( + num_attention_heads, + out_channels // num_attention_heads, + in_channels=out_channels, + num_layers=1, + cross_attention_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + spatial_attn_inputs = [], + spatial_attn_idx = 0, + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + upsample_size: Optional[int] = None, + attention_mask: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + is_freeu_enabled = ( + getattr(self, "s1", None) + and getattr(self, "s2", None) + and getattr(self, "b1", None) + and getattr(self, "b2", None) + ) + + for resnet, attn in zip(self.resnets, self.attentions): + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + + # FreeU: Only operate on the first two stages + if is_freeu_enabled: + hidden_states, res_hidden_states = apply_freeu( + self.resolution_idx, + hidden_states, + res_hidden_states, + s1=self.s1, + s2=self.s2, + b1=self.b1, + b2=self.b2, + ) + + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states, spatial_attn_inputs, spatial_attn_idx = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states, spatial_attn_inputs, spatial_attn_idx = attn( + hidden_states, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + return_dict=False, + ) + hidden_states = hidden_states[0] + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, upsample_size, scale=lora_scale) + + return hidden_states, spatial_attn_inputs, spatial_attn_idx + + +class UpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + is_freeu_enabled = ( + getattr(self, "s1", None) + and getattr(self, "s2", None) + and getattr(self, "b1", None) + and getattr(self, "b2", None) + ) + + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + + # FreeU: Only operate on the first two stages + if is_freeu_enabled: + hidden_states, res_hidden_states = apply_freeu( + self.resolution_idx, + hidden_states, + res_hidden_states, + s1=self.s1, + s2=self.s2, + b1=self.b1, + b2=self.b2, + ) + + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, upsample_size, scale=scale) + + return hidden_states + + +class UpDecoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", # default, spatial + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + temb_channels: Optional[int] = None, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + input_channels = in_channels if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=input_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.resolution_idx = resolution_idx + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> torch.FloatTensor: + for resnet in self.resnets: + hidden_states = resnet(hidden_states, temb=temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states) + + return hidden_states + + +class AttnUpDecoderBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + temb_channels: Optional[int] = None, + ): + super().__init__() + resnets = [] + attentions = [] + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `out_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + for i in range(num_layers): + input_channels = in_channels if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=input_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=resnet_groups if resnet_time_scale_shift != "spatial" else None, + spatial_norm_dim=temb_channels if resnet_time_scale_shift == "spatial" else None, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([Upsample2D(out_channels, use_conv=True, out_channels=out_channels)]) + else: + self.upsamplers = None + + self.resolution_idx = resolution_idx + + def forward( + self, hidden_states: torch.FloatTensor, temb: Optional[torch.FloatTensor] = None, scale: float = 1.0 + ) -> torch.FloatTensor: + for resnet, attn in zip(self.resnets, self.attentions): + hidden_states = resnet(hidden_states, temb=temb, scale=scale) + cross_attention_kwargs = {"scale": scale} + hidden_states = attn(hidden_states, temb=temb, **cross_attention_kwargs) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, scale=scale) + + return hidden_states + + +class AttnSkipUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + output_scale_factor: float = np.sqrt(2.0), + add_upsample: bool = True, + ): + super().__init__() + self.attentions = nn.ModuleList([]) + self.resnets = nn.ModuleList([]) + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + self.resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(resnet_in_channels + res_skip_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + if attention_head_dim is None: + logger.warn( + f"It is not recommend to pass `attention_head_dim=None`. Defaulting `attention_head_dim` to `out_channels`: {out_channels}." + ) + attention_head_dim = out_channels + + self.attentions.append( + Attention( + out_channels, + heads=out_channels // attention_head_dim, + dim_head=attention_head_dim, + rescale_output_factor=output_scale_factor, + eps=resnet_eps, + norm_num_groups=32, + residual_connection=True, + bias=True, + upcast_softmax=True, + _from_deprecated_attn_block=True, + ) + ) + + self.upsampler = FirUpsample2D(in_channels, out_channels=out_channels) + if add_upsample: + self.resnet_up = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + up=True, + kernel="fir", + ) + self.skip_conv = nn.Conv2d(out_channels, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) + self.skip_norm = torch.nn.GroupNorm( + num_groups=min(out_channels // 4, 32), num_channels=out_channels, eps=resnet_eps, affine=True + ) + self.act = nn.SiLU() + else: + self.resnet_up = None + self.skip_conv = None + self.skip_norm = None + self.act = None + + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + skip_sample=None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, torch.FloatTensor]: + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb, scale=scale) + + cross_attention_kwargs = {"scale": scale} + hidden_states = self.attentions[0](hidden_states, **cross_attention_kwargs) + + if skip_sample is not None: + skip_sample = self.upsampler(skip_sample) + else: + skip_sample = 0 + + if self.resnet_up is not None: + skip_sample_states = self.skip_norm(hidden_states) + skip_sample_states = self.act(skip_sample_states) + skip_sample_states = self.skip_conv(skip_sample_states) + + skip_sample = skip_sample + skip_sample_states + + hidden_states = self.resnet_up(hidden_states, temb, scale=scale) + + return hidden_states, skip_sample + + +class SkipUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_pre_norm: bool = True, + output_scale_factor: float = np.sqrt(2.0), + add_upsample: bool = True, + upsample_padding: int = 1, + ): + super().__init__() + self.resnets = nn.ModuleList([]) + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + self.resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min((resnet_in_channels + res_skip_channels) // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + ) + ) + + self.upsampler = FirUpsample2D(in_channels, out_channels=out_channels) + if add_upsample: + self.resnet_up = ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=min(out_channels // 4, 32), + groups_out=min(out_channels // 4, 32), + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + use_in_shortcut=True, + up=True, + kernel="fir", + ) + self.skip_conv = nn.Conv2d(out_channels, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) + self.skip_norm = torch.nn.GroupNorm( + num_groups=min(out_channels // 4, 32), num_channels=out_channels, eps=resnet_eps, affine=True + ) + self.act = nn.SiLU() + else: + self.resnet_up = None + self.skip_conv = None + self.skip_norm = None + self.act = None + + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + skip_sample=None, + scale: float = 1.0, + ) -> Tuple[torch.FloatTensor, torch.FloatTensor]: + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + hidden_states = resnet(hidden_states, temb, scale=scale) + + if skip_sample is not None: + skip_sample = self.upsampler(skip_sample) + else: + skip_sample = 0 + + if self.resnet_up is not None: + skip_sample_states = self.skip_norm(hidden_states) + skip_sample_states = self.act(skip_sample_states) + skip_sample_states = self.skip_conv(skip_sample_states) + + skip_sample = skip_sample + skip_sample_states + + hidden_states = self.resnet_up(hidden_states, temb, scale=scale) + + return hidden_states, skip_sample + + +class ResnetUpsampleBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + prev_output_channel: int, + out_channels: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + skip_time_act: bool = False, + ): + super().__init__() + resnets = [] + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + up=True, + ) + ] + ) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + for resnet in self.resnets: + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, temb, scale=scale) + + return hidden_states + + +class SimpleCrossAttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + prev_output_channel: int, + temb_channels: int, + resolution_idx: Optional[int] = None, + dropout: float = 0.0, + num_layers: int = 1, + resnet_eps: float = 1e-6, + resnet_time_scale_shift: str = "default", + resnet_act_fn: str = "swish", + resnet_groups: int = 32, + resnet_pre_norm: bool = True, + attention_head_dim: int = 1, + cross_attention_dim: int = 1280, + output_scale_factor: float = 1.0, + add_upsample: bool = True, + skip_time_act: bool = False, + only_cross_attention: bool = False, + cross_attention_norm: Optional[str] = None, + ): + super().__init__() + resnets = [] + attentions = [] + + self.has_cross_attention = True + self.attention_head_dim = attention_head_dim + + self.num_heads = out_channels // self.attention_head_dim + + for i in range(num_layers): + res_skip_channels = in_channels if (i == num_layers - 1) else out_channels + resnet_in_channels = prev_output_channel if i == 0 else out_channels + + resnets.append( + ResnetBlock2D( + in_channels=resnet_in_channels + res_skip_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + ) + ) + + processor = ( + AttnAddedKVProcessor2_0() if hasattr(F, "scaled_dot_product_attention") else AttnAddedKVProcessor() + ) + + attentions.append( + Attention( + query_dim=out_channels, + cross_attention_dim=out_channels, + heads=self.num_heads, + dim_head=self.attention_head_dim, + added_kv_proj_dim=cross_attention_dim, + norm_num_groups=resnet_groups, + bias=True, + upcast_softmax=True, + only_cross_attention=only_cross_attention, + cross_attention_norm=cross_attention_norm, + processor=processor, + ) + ) + self.attentions = nn.ModuleList(attentions) + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList( + [ + ResnetBlock2D( + in_channels=out_channels, + out_channels=out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=resnet_groups, + dropout=dropout, + time_embedding_norm=resnet_time_scale_shift, + non_linearity=resnet_act_fn, + output_scale_factor=output_scale_factor, + pre_norm=resnet_pre_norm, + skip_time_act=skip_time_act, + up=True, + ) + ] + ) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + lora_scale = cross_attention_kwargs.get("scale", 1.0) + if attention_mask is None: + # if encoder_hidden_states is defined: we are doing cross-attn, so we should use cross-attn mask. + mask = None if encoder_hidden_states is None else encoder_attention_mask + else: + # when attention_mask is defined: we don't even check for encoder_attention_mask. + # this is to maintain compatibility with UnCLIP, which uses 'attention_mask' param for cross-attn masks. + # TODO: UnCLIP should express cross-attn mask via encoder_attention_mask param instead of via attention_mask. + # then we can simplify this whole if/else block to: + # mask = attention_mask if encoder_hidden_states is None else encoder_attention_mask + mask = attention_mask + + for resnet, attn in zip(self.resnets, self.attentions): + # resnet + # pop res hidden states + res_hidden_states = res_hidden_states_tuple[-1] + res_hidden_states_tuple = res_hidden_states_tuple[:-1] + hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1) + + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + hidden_states = torch.utils.checkpoint.checkpoint(create_custom_forward(resnet), hidden_states, temb) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=mask, + **cross_attention_kwargs, + ) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states, temb, scale=lora_scale) + + return hidden_states + + +class KUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + resolution_idx: int, + dropout: float = 0.0, + num_layers: int = 5, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + resnet_group_size: Optional[int] = 32, + add_upsample: bool = True, + ): + super().__init__() + resnets = [] + k_in_channels = 2 * out_channels + k_out_channels = in_channels + num_layers = num_layers - 1 + + for i in range(num_layers): + in_channels = k_in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=k_out_channels if (i == num_layers - 1) else out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=groups, + groups_out=groups_out, + dropout=dropout, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + + self.resnets = nn.ModuleList(resnets) + + if add_upsample: + self.upsamplers = nn.ModuleList([KUpsample2D()]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + upsample_size: Optional[int] = None, + scale: float = 1.0, + ) -> torch.FloatTensor: + res_hidden_states_tuple = res_hidden_states_tuple[-1] + if res_hidden_states_tuple is not None: + hidden_states = torch.cat([hidden_states, res_hidden_states_tuple], dim=1) + + for resnet in self.resnets: + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module(*inputs) + + return custom_forward + + if is_torch_version(">=", "1.11.0"): + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb, use_reentrant=False + ) + else: + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), hidden_states, temb + ) + else: + hidden_states = resnet(hidden_states, temb, scale=scale) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states) + + return hidden_states + + +class KCrossAttnUpBlock2D(nn.Module): + def __init__( + self, + in_channels: int, + out_channels: int, + temb_channels: int, + resolution_idx: int, + dropout: float = 0.0, + num_layers: int = 4, + resnet_eps: float = 1e-5, + resnet_act_fn: str = "gelu", + resnet_group_size: int = 32, + attention_head_dim: int = 1, # attention dim_head + cross_attention_dim: int = 768, + add_upsample: bool = True, + upcast_attention: bool = False, + ): + super().__init__() + resnets = [] + attentions = [] + + is_first_block = in_channels == out_channels == temb_channels + is_middle_block = in_channels != out_channels + add_self_attention = True if is_first_block else False + + self.has_cross_attention = True + self.attention_head_dim = attention_head_dim + + # in_channels, and out_channels for the block (k-unet) + k_in_channels = out_channels if is_first_block else 2 * out_channels + k_out_channels = in_channels + + num_layers = num_layers - 1 + + for i in range(num_layers): + in_channels = k_in_channels if i == 0 else out_channels + groups = in_channels // resnet_group_size + groups_out = out_channels // resnet_group_size + + if is_middle_block and (i == num_layers - 1): + conv_2d_out_channels = k_out_channels + else: + conv_2d_out_channels = None + + resnets.append( + ResnetBlock2D( + in_channels=in_channels, + out_channels=out_channels, + conv_2d_out_channels=conv_2d_out_channels, + temb_channels=temb_channels, + eps=resnet_eps, + groups=groups, + groups_out=groups_out, + dropout=dropout, + non_linearity=resnet_act_fn, + time_embedding_norm="ada_group", + conv_shortcut_bias=False, + ) + ) + attentions.append( + KAttentionBlock( + k_out_channels if (i == num_layers - 1) else out_channels, + k_out_channels // attention_head_dim + if (i == num_layers - 1) + else out_channels // attention_head_dim, + attention_head_dim, + cross_attention_dim=cross_attention_dim, + temb_channels=temb_channels, + attention_bias=True, + add_self_attention=add_self_attention, + cross_attention_norm="layer_norm", + upcast_attention=upcast_attention, + ) + ) + + self.resnets = nn.ModuleList(resnets) + self.attentions = nn.ModuleList(attentions) + + if add_upsample: + self.upsamplers = nn.ModuleList([KUpsample2D()]) + else: + self.upsamplers = None + + self.gradient_checkpointing = False + self.resolution_idx = resolution_idx + + def forward( + self, + hidden_states: torch.FloatTensor, + res_hidden_states_tuple: Tuple[torch.FloatTensor, ...], + temb: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + upsample_size: Optional[int] = None, + attention_mask: Optional[torch.FloatTensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + res_hidden_states_tuple = res_hidden_states_tuple[-1] + if res_hidden_states_tuple is not None: + hidden_states = torch.cat([hidden_states, res_hidden_states_tuple], dim=1) + + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + for resnet, attn in zip(self.resnets, self.attentions): + if self.training and self.gradient_checkpointing: + + def create_custom_forward(module, return_dict=None): + def custom_forward(*inputs): + if return_dict is not None: + return module(*inputs, return_dict=return_dict) + else: + return module(*inputs) + + return custom_forward + + ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {} + hidden_states = torch.utils.checkpoint.checkpoint( + create_custom_forward(resnet), + hidden_states, + temb, + **ckpt_kwargs, + ) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + else: + hidden_states = resnet(hidden_states, temb, scale=lora_scale) + hidden_states = attn( + hidden_states, + encoder_hidden_states=encoder_hidden_states, + emb=temb, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + + if self.upsamplers is not None: + for upsampler in self.upsamplers: + hidden_states = upsampler(hidden_states) + + return hidden_states + + +# can potentially later be renamed to `No-feed-forward` attention +class KAttentionBlock(nn.Module): + r""" + A basic Transformer block. + + Parameters: + dim (`int`): The number of channels in the input and output. + num_attention_heads (`int`): The number of heads to use for multi-head attention. + attention_head_dim (`int`): The number of channels in each head. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + cross_attention_dim (`int`, *optional*): The size of the encoder_hidden_states vector for cross attention. + attention_bias (`bool`, *optional*, defaults to `False`): + Configure if the attention layers should contain a bias parameter. + upcast_attention (`bool`, *optional*, defaults to `False`): + Set to `True` to upcast the attention computation to `float32`. + temb_channels (`int`, *optional*, defaults to 768): + The number of channels in the token embedding. + add_self_attention (`bool`, *optional*, defaults to `False`): + Set to `True` to add self-attention to the block. + cross_attention_norm (`str`, *optional*, defaults to `None`): + The type of normalization to use for the cross attention. Can be `None`, `layer_norm`, or `group_norm`. + group_size (`int`, *optional*, defaults to 32): + The number of groups to separate the channels into for group normalization. + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + dropout: float = 0.0, + cross_attention_dim: Optional[int] = None, + attention_bias: bool = False, + upcast_attention: bool = False, + temb_channels: int = 768, # for ada_group_norm + add_self_attention: bool = False, + cross_attention_norm: Optional[str] = None, + group_size: int = 32, + ): + super().__init__() + self.add_self_attention = add_self_attention + + # 1. Self-Attn + if add_self_attention: + self.norm1 = AdaGroupNorm(temb_channels, dim, max(1, dim // group_size)) + self.attn1 = Attention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + cross_attention_dim=None, + cross_attention_norm=None, + ) + + # 2. Cross-Attn + self.norm2 = AdaGroupNorm(temb_channels, dim, max(1, dim // group_size)) + self.attn2 = Attention( + query_dim=dim, + cross_attention_dim=cross_attention_dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + dropout=dropout, + bias=attention_bias, + upcast_attention=upcast_attention, + cross_attention_norm=cross_attention_norm, + ) + + def _to_3d(self, hidden_states: torch.FloatTensor, height: int, weight: int) -> torch.FloatTensor: + return hidden_states.permute(0, 2, 3, 1).reshape(hidden_states.shape[0], height * weight, -1) + + def _to_4d(self, hidden_states: torch.FloatTensor, height: int, weight: int) -> torch.FloatTensor: + return hidden_states.permute(0, 2, 1).reshape(hidden_states.shape[0], -1, height, weight) + + def forward( + self, + hidden_states: torch.FloatTensor, + encoder_hidden_states: Optional[torch.FloatTensor] = None, + # TODO: mark emb as non-optional (self.norm2 requires it). + # requires assessing impact of change to positional param interface. + emb: Optional[torch.FloatTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + ) -> torch.FloatTensor: + cross_attention_kwargs = cross_attention_kwargs if cross_attention_kwargs is not None else {} + + # 1. Self-Attention + if self.add_self_attention: + norm_hidden_states = self.norm1(hidden_states, emb) + + height, weight = norm_hidden_states.shape[2:] + norm_hidden_states = self._to_3d(norm_hidden_states, height, weight) + + attn_output = self.attn1( + norm_hidden_states, + encoder_hidden_states=None, + attention_mask=attention_mask, + **cross_attention_kwargs, + ) + attn_output = self._to_4d(attn_output, height, weight) + + hidden_states = attn_output + hidden_states + + # 2. Cross-Attention/None + norm_hidden_states = self.norm2(hidden_states, emb) + + height, weight = norm_hidden_states.shape[2:] + norm_hidden_states = self._to_3d(norm_hidden_states, height, weight) + attn_output = self.attn2( + norm_hidden_states, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask if encoder_hidden_states is None else encoder_attention_mask, + **cross_attention_kwargs, + ) + attn_output = self._to_4d(attn_output, height, weight) + + hidden_states = attn_output + hidden_states + + return hidden_states diff --git a/ootd/pipelines_ootd/unet_vton_2d_condition.py b/ootd/pipelines_ootd/unet_vton_2d_condition.py new file mode 100644 index 0000000..1e3a3fe --- /dev/null +++ b/ootd/pipelines_ootd/unet_vton_2d_condition.py @@ -0,0 +1,1183 @@ +# Copyright 2023 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Modified by Yuhao Xu for OOTDiffusion (https://github.com/levihsu/OOTDiffusion) +from dataclasses import dataclass +from typing import Any, Dict, List, Optional, Tuple, Union + +import torch +import torch.nn as nn +import torch.utils.checkpoint + +from .unet_vton_2d_blocks import ( + UNetMidBlock2D, + UNetMidBlock2DCrossAttn, + UNetMidBlock2DSimpleCrossAttn, + get_down_block, + get_up_block, +) + +from diffusers.configuration_utils import ConfigMixin, register_to_config +from diffusers.loaders import UNet2DConditionLoadersMixin +from diffusers.utils import USE_PEFT_BACKEND, BaseOutput, deprecate, logging, scale_lora_layers, unscale_lora_layers +from diffusers.models.activations import get_activation +from diffusers.models.attention_processor import ( + ADDED_KV_ATTENTION_PROCESSORS, + CROSS_ATTENTION_PROCESSORS, + AttentionProcessor, + AttnAddedKVProcessor, + AttnProcessor, +) +from diffusers.models.embeddings import ( + GaussianFourierProjection, + ImageHintTimeEmbedding, + ImageProjection, + ImageTimeEmbedding, + PositionNet, + TextImageProjection, + TextImageTimeEmbedding, + TextTimeEmbedding, + TimestepEmbedding, + Timesteps, +) +from diffusers.models.modeling_utils import ModelMixin +# from ..diffusers.src.diffusers.models.unet_2d_blocks import ( +# UNetMidBlock2D, +# UNetMidBlock2DCrossAttn, +# UNetMidBlock2DSimpleCrossAttn, +# get_down_block, +# get_up_block, +# ) + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +@dataclass +class UNet2DConditionOutput(BaseOutput): + """ + The output of [`UNet2DConditionModel`]. + + Args: + sample (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`): + The hidden states output conditioned on `encoder_hidden_states` input. Output of last layer of model. + """ + + sample: torch.FloatTensor = None + + +class UNetVton2DConditionModel(ModelMixin, ConfigMixin, UNet2DConditionLoadersMixin): + r""" + A conditional 2D UNet model that takes a noisy sample, conditional state, and a timestep and returns a sample + shaped output. + + This model inherits from [`ModelMixin`]. Check the superclass documentation for it's generic methods implemented + for all models (such as downloading or saving). + + Parameters: + sample_size (`int` or `Tuple[int, int]`, *optional*, defaults to `None`): + Height and width of input/output sample. + in_channels (`int`, *optional*, defaults to 4): Number of channels in the input sample. + out_channels (`int`, *optional*, defaults to 4): Number of channels in the output. + center_input_sample (`bool`, *optional*, defaults to `False`): Whether to center the input sample. + flip_sin_to_cos (`bool`, *optional*, defaults to `False`): + Whether to flip the sin to cos in the time embedding. + freq_shift (`int`, *optional*, defaults to 0): The frequency shift to apply to the time embedding. + down_block_types (`Tuple[str]`, *optional*, defaults to `("CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "CrossAttnDownBlock2D", "DownBlock2D")`): + The tuple of downsample blocks to use. + mid_block_type (`str`, *optional*, defaults to `"UNetMidBlock2DCrossAttn"`): + Block type for middle of UNet, it can be one of `UNetMidBlock2DCrossAttn`, `UNetMidBlock2D`, or + `UNetMidBlock2DSimpleCrossAttn`. If `None`, the mid block layer is skipped. + up_block_types (`Tuple[str]`, *optional*, defaults to `("UpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D")`): + The tuple of upsample blocks to use. + only_cross_attention(`bool` or `Tuple[bool]`, *optional*, default to `False`): + Whether to include self-attention in the basic transformer blocks, see + [`~models.attention.BasicTransformerBlock`]. + block_out_channels (`Tuple[int]`, *optional*, defaults to `(320, 640, 1280, 1280)`): + The tuple of output channels for each block. + layers_per_block (`int`, *optional*, defaults to 2): The number of layers per block. + downsample_padding (`int`, *optional*, defaults to 1): The padding to use for the downsampling convolution. + mid_block_scale_factor (`float`, *optional*, defaults to 1.0): The scale factor to use for the mid block. + dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use. + act_fn (`str`, *optional*, defaults to `"silu"`): The activation function to use. + norm_num_groups (`int`, *optional*, defaults to 32): The number of groups to use for the normalization. + If `None`, normalization and activation layers is skipped in post-processing. + norm_eps (`float`, *optional*, defaults to 1e-5): The epsilon to use for the normalization. + cross_attention_dim (`int` or `Tuple[int]`, *optional*, defaults to 1280): + The dimension of the cross attention features. + transformer_layers_per_block (`int`, `Tuple[int]`, or `Tuple[Tuple]` , *optional*, defaults to 1): + The number of transformer blocks of type [`~models.attention.BasicTransformerBlock`]. Only relevant for + [`~models.unet_2d_blocks.CrossAttnDownBlock2D`], [`~models.unet_2d_blocks.CrossAttnUpBlock2D`], + [`~models.unet_2d_blocks.UNetMidBlock2DCrossAttn`]. + reverse_transformer_layers_per_block : (`Tuple[Tuple]`, *optional*, defaults to None): + The number of transformer blocks of type [`~models.attention.BasicTransformerBlock`], in the upsampling + blocks of the U-Net. Only relevant if `transformer_layers_per_block` is of type `Tuple[Tuple]` and for + [`~models.unet_2d_blocks.CrossAttnDownBlock2D`], [`~models.unet_2d_blocks.CrossAttnUpBlock2D`], + [`~models.unet_2d_blocks.UNetMidBlock2DCrossAttn`]. + encoder_hid_dim (`int`, *optional*, defaults to None): + If `encoder_hid_dim_type` is defined, `encoder_hidden_states` will be projected from `encoder_hid_dim` + dimension to `cross_attention_dim`. + encoder_hid_dim_type (`str`, *optional*, defaults to `None`): + If given, the `encoder_hidden_states` and potentially other embeddings are down-projected to text + embeddings of dimension `cross_attention` according to `encoder_hid_dim_type`. + attention_head_dim (`int`, *optional*, defaults to 8): The dimension of the attention heads. + num_attention_heads (`int`, *optional*): + The number of attention heads. If not defined, defaults to `attention_head_dim` + resnet_time_scale_shift (`str`, *optional*, defaults to `"default"`): Time scale shift config + for ResNet blocks (see [`~models.resnet.ResnetBlock2D`]). Choose from `default` or `scale_shift`. + class_embed_type (`str`, *optional*, defaults to `None`): + The type of class embedding to use which is ultimately summed with the time embeddings. Choose from `None`, + `"timestep"`, `"identity"`, `"projection"`, or `"simple_projection"`. + addition_embed_type (`str`, *optional*, defaults to `None`): + Configures an optional embedding which will be summed with the time embeddings. Choose from `None` or + "text". "text" will use the `TextTimeEmbedding` layer. + addition_time_embed_dim: (`int`, *optional*, defaults to `None`): + Dimension for the timestep embeddings. + num_class_embeds (`int`, *optional*, defaults to `None`): + Input dimension of the learnable embedding matrix to be projected to `time_embed_dim`, when performing + class conditioning with `class_embed_type` equal to `None`. + time_embedding_type (`str`, *optional*, defaults to `positional`): + The type of position embedding to use for timesteps. Choose from `positional` or `fourier`. + time_embedding_dim (`int`, *optional*, defaults to `None`): + An optional override for the dimension of the projected time embedding. + time_embedding_act_fn (`str`, *optional*, defaults to `None`): + Optional activation function to use only once on the time embeddings before they are passed to the rest of + the UNet. Choose from `silu`, `mish`, `gelu`, and `swish`. + timestep_post_act (`str`, *optional*, defaults to `None`): + The second activation function to use in timestep embedding. Choose from `silu`, `mish` and `gelu`. + time_cond_proj_dim (`int`, *optional*, defaults to `None`): + The dimension of `cond_proj` layer in the timestep embedding. + conv_in_kernel (`int`, *optional*, default to `3`): The kernel size of `conv_in` layer. conv_out_kernel (`int`, + *optional*, default to `3`): The kernel size of `conv_out` layer. projection_class_embeddings_input_dim (`int`, + *optional*): The dimension of the `class_labels` input when + `class_embed_type="projection"`. Required when `class_embed_type="projection"`. + class_embeddings_concat (`bool`, *optional*, defaults to `False`): Whether to concatenate the time + embeddings with the class embeddings. + mid_block_only_cross_attention (`bool`, *optional*, defaults to `None`): + Whether to use cross attention with the mid block when using the `UNetMidBlock2DSimpleCrossAttn`. If + `only_cross_attention` is given as a single boolean and `mid_block_only_cross_attention` is `None`, the + `only_cross_attention` value is used as the value for `mid_block_only_cross_attention`. Default to `False` + otherwise. + """ + + _supports_gradient_checkpointing = True + + @register_to_config + def __init__( + self, + sample_size: Optional[int] = None, + in_channels: int = 4, + out_channels: int = 4, + center_input_sample: bool = False, + flip_sin_to_cos: bool = True, + freq_shift: int = 0, + down_block_types: Tuple[str] = ( + "CrossAttnDownBlock2D", + "CrossAttnDownBlock2D", + "CrossAttnDownBlock2D", + "DownBlock2D", + ), + mid_block_type: Optional[str] = "UNetMidBlock2DCrossAttn", + up_block_types: Tuple[str] = ("UpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D", "CrossAttnUpBlock2D"), + only_cross_attention: Union[bool, Tuple[bool]] = False, + block_out_channels: Tuple[int] = (320, 640, 1280, 1280), + layers_per_block: Union[int, Tuple[int]] = 2, + downsample_padding: int = 1, + mid_block_scale_factor: float = 1, + dropout: float = 0.0, + act_fn: str = "silu", + norm_num_groups: Optional[int] = 32, + norm_eps: float = 1e-5, + cross_attention_dim: Union[int, Tuple[int]] = 1280, + transformer_layers_per_block: Union[int, Tuple[int], Tuple[Tuple]] = 1, + reverse_transformer_layers_per_block: Optional[Tuple[Tuple[int]]] = None, + encoder_hid_dim: Optional[int] = None, + encoder_hid_dim_type: Optional[str] = None, + attention_head_dim: Union[int, Tuple[int]] = 8, + num_attention_heads: Optional[Union[int, Tuple[int]]] = None, + dual_cross_attention: bool = False, + use_linear_projection: bool = False, + class_embed_type: Optional[str] = None, + addition_embed_type: Optional[str] = None, + addition_time_embed_dim: Optional[int] = None, + num_class_embeds: Optional[int] = None, + upcast_attention: bool = False, + resnet_time_scale_shift: str = "default", + resnet_skip_time_act: bool = False, + resnet_out_scale_factor: int = 1.0, + time_embedding_type: str = "positional", + time_embedding_dim: Optional[int] = None, + time_embedding_act_fn: Optional[str] = None, + timestep_post_act: Optional[str] = None, + time_cond_proj_dim: Optional[int] = None, + conv_in_kernel: int = 3, + conv_out_kernel: int = 3, + projection_class_embeddings_input_dim: Optional[int] = None, + attention_type: str = "default", + class_embeddings_concat: bool = False, + mid_block_only_cross_attention: Optional[bool] = None, + cross_attention_norm: Optional[str] = None, + addition_embed_type_num_heads=64, + ): + super().__init__() + + self.sample_size = sample_size + + if num_attention_heads is not None: + raise ValueError( + "At the moment it is not possible to define the number of attention heads via `num_attention_heads` because of a naming issue as described in https://github.com/huggingface/diffusers/issues/2011#issuecomment-1547958131. Passing `num_attention_heads` will only be supported in diffusers v0.19." + ) + + # If `num_attention_heads` is not defined (which is the case for most models) + # it will default to `attention_head_dim`. This looks weird upon first reading it and it is. + # The reason for this behavior is to correct for incorrectly named variables that were introduced + # when this library was created. The incorrect naming was only discovered much later in https://github.com/huggingface/diffusers/issues/2011#issuecomment-1547958131 + # Changing `attention_head_dim` to `num_attention_heads` for 40,000+ configurations is too backwards breaking + # which is why we correct for the naming here. + num_attention_heads = num_attention_heads or attention_head_dim + + # Check inputs + if len(down_block_types) != len(up_block_types): + raise ValueError( + f"Must provide the same number of `down_block_types` as `up_block_types`. `down_block_types`: {down_block_types}. `up_block_types`: {up_block_types}." + ) + + if len(block_out_channels) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `block_out_channels` as `down_block_types`. `block_out_channels`: {block_out_channels}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(only_cross_attention, bool) and len(only_cross_attention) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `only_cross_attention` as `down_block_types`. `only_cross_attention`: {only_cross_attention}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(num_attention_heads, int) and len(num_attention_heads) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `num_attention_heads` as `down_block_types`. `num_attention_heads`: {num_attention_heads}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(attention_head_dim, int) and len(attention_head_dim) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `attention_head_dim` as `down_block_types`. `attention_head_dim`: {attention_head_dim}. `down_block_types`: {down_block_types}." + ) + + if isinstance(cross_attention_dim, list) and len(cross_attention_dim) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `cross_attention_dim` as `down_block_types`. `cross_attention_dim`: {cross_attention_dim}. `down_block_types`: {down_block_types}." + ) + + if not isinstance(layers_per_block, int) and len(layers_per_block) != len(down_block_types): + raise ValueError( + f"Must provide the same number of `layers_per_block` as `down_block_types`. `layers_per_block`: {layers_per_block}. `down_block_types`: {down_block_types}." + ) + if isinstance(transformer_layers_per_block, list) and reverse_transformer_layers_per_block is None: + for layer_number_per_block in transformer_layers_per_block: + if isinstance(layer_number_per_block, list): + raise ValueError("Must provide 'reverse_transformer_layers_per_block` if using asymmetrical UNet.") + + # input + conv_in_padding = (conv_in_kernel - 1) // 2 + self.conv_in = nn.Conv2d( + in_channels, block_out_channels[0], kernel_size=conv_in_kernel, padding=conv_in_padding + ) + + # time + if time_embedding_type == "fourier": + time_embed_dim = time_embedding_dim or block_out_channels[0] * 2 + if time_embed_dim % 2 != 0: + raise ValueError(f"`time_embed_dim` should be divisible by 2, but is {time_embed_dim}.") + self.time_proj = GaussianFourierProjection( + time_embed_dim // 2, set_W_to_weight=False, log=False, flip_sin_to_cos=flip_sin_to_cos + ) + timestep_input_dim = time_embed_dim + elif time_embedding_type == "positional": + time_embed_dim = time_embedding_dim or block_out_channels[0] * 4 + + self.time_proj = Timesteps(block_out_channels[0], flip_sin_to_cos, freq_shift) + timestep_input_dim = block_out_channels[0] + else: + raise ValueError( + f"{time_embedding_type} does not exist. Please make sure to use one of `fourier` or `positional`." + ) + + self.time_embedding = TimestepEmbedding( + timestep_input_dim, + time_embed_dim, + act_fn=act_fn, + post_act_fn=timestep_post_act, + cond_proj_dim=time_cond_proj_dim, + ) + + if encoder_hid_dim_type is None and encoder_hid_dim is not None: + encoder_hid_dim_type = "text_proj" + self.register_to_config(encoder_hid_dim_type=encoder_hid_dim_type) + logger.info("encoder_hid_dim_type defaults to 'text_proj' as `encoder_hid_dim` is defined.") + + if encoder_hid_dim is None and encoder_hid_dim_type is not None: + raise ValueError( + f"`encoder_hid_dim` has to be defined when `encoder_hid_dim_type` is set to {encoder_hid_dim_type}." + ) + + if encoder_hid_dim_type == "text_proj": + self.encoder_hid_proj = nn.Linear(encoder_hid_dim, cross_attention_dim) + elif encoder_hid_dim_type == "text_image_proj": + # image_embed_dim DOESN'T have to be `cross_attention_dim`. To not clutter the __init__ too much + # they are set to `cross_attention_dim` here as this is exactly the required dimension for the currently only use + # case when `addition_embed_type == "text_image_proj"` (Kadinsky 2.1)` + self.encoder_hid_proj = TextImageProjection( + text_embed_dim=encoder_hid_dim, + image_embed_dim=cross_attention_dim, + cross_attention_dim=cross_attention_dim, + ) + elif encoder_hid_dim_type == "image_proj": + # Kandinsky 2.2 + self.encoder_hid_proj = ImageProjection( + image_embed_dim=encoder_hid_dim, + cross_attention_dim=cross_attention_dim, + ) + elif encoder_hid_dim_type is not None: + raise ValueError( + f"encoder_hid_dim_type: {encoder_hid_dim_type} must be None, 'text_proj' or 'text_image_proj'." + ) + else: + self.encoder_hid_proj = None + + # class embedding + if class_embed_type is None and num_class_embeds is not None: + self.class_embedding = nn.Embedding(num_class_embeds, time_embed_dim) + elif class_embed_type == "timestep": + self.class_embedding = TimestepEmbedding(timestep_input_dim, time_embed_dim, act_fn=act_fn) + elif class_embed_type == "identity": + self.class_embedding = nn.Identity(time_embed_dim, time_embed_dim) + elif class_embed_type == "projection": + if projection_class_embeddings_input_dim is None: + raise ValueError( + "`class_embed_type`: 'projection' requires `projection_class_embeddings_input_dim` be set" + ) + # The projection `class_embed_type` is the same as the timestep `class_embed_type` except + # 1. the `class_labels` inputs are not first converted to sinusoidal embeddings + # 2. it projects from an arbitrary input dimension. + # + # Note that `TimestepEmbedding` is quite general, being mainly linear layers and activations. + # When used for embedding actual timesteps, the timesteps are first converted to sinusoidal embeddings. + # As a result, `TimestepEmbedding` can be passed arbitrary vectors. + self.class_embedding = TimestepEmbedding(projection_class_embeddings_input_dim, time_embed_dim) + elif class_embed_type == "simple_projection": + if projection_class_embeddings_input_dim is None: + raise ValueError( + "`class_embed_type`: 'simple_projection' requires `projection_class_embeddings_input_dim` be set" + ) + self.class_embedding = nn.Linear(projection_class_embeddings_input_dim, time_embed_dim) + else: + self.class_embedding = None + + if addition_embed_type == "text": + if encoder_hid_dim is not None: + text_time_embedding_from_dim = encoder_hid_dim + else: + text_time_embedding_from_dim = cross_attention_dim + + self.add_embedding = TextTimeEmbedding( + text_time_embedding_from_dim, time_embed_dim, num_heads=addition_embed_type_num_heads + ) + elif addition_embed_type == "text_image": + # text_embed_dim and image_embed_dim DON'T have to be `cross_attention_dim`. To not clutter the __init__ too much + # they are set to `cross_attention_dim` here as this is exactly the required dimension for the currently only use + # case when `addition_embed_type == "text_image"` (Kadinsky 2.1)` + self.add_embedding = TextImageTimeEmbedding( + text_embed_dim=cross_attention_dim, image_embed_dim=cross_attention_dim, time_embed_dim=time_embed_dim + ) + elif addition_embed_type == "text_time": + self.add_time_proj = Timesteps(addition_time_embed_dim, flip_sin_to_cos, freq_shift) + self.add_embedding = TimestepEmbedding(projection_class_embeddings_input_dim, time_embed_dim) + elif addition_embed_type == "image": + # Kandinsky 2.2 + self.add_embedding = ImageTimeEmbedding(image_embed_dim=encoder_hid_dim, time_embed_dim=time_embed_dim) + elif addition_embed_type == "image_hint": + # Kandinsky 2.2 ControlNet + self.add_embedding = ImageHintTimeEmbedding(image_embed_dim=encoder_hid_dim, time_embed_dim=time_embed_dim) + elif addition_embed_type is not None: + raise ValueError(f"addition_embed_type: {addition_embed_type} must be None, 'text' or 'text_image'.") + + if time_embedding_act_fn is None: + self.time_embed_act = None + else: + self.time_embed_act = get_activation(time_embedding_act_fn) + + self.down_blocks = nn.ModuleList([]) + self.up_blocks = nn.ModuleList([]) + + if isinstance(only_cross_attention, bool): + if mid_block_only_cross_attention is None: + mid_block_only_cross_attention = only_cross_attention + + only_cross_attention = [only_cross_attention] * len(down_block_types) + + if mid_block_only_cross_attention is None: + mid_block_only_cross_attention = False + + if isinstance(num_attention_heads, int): + num_attention_heads = (num_attention_heads,) * len(down_block_types) + + if isinstance(attention_head_dim, int): + attention_head_dim = (attention_head_dim,) * len(down_block_types) + + if isinstance(cross_attention_dim, int): + cross_attention_dim = (cross_attention_dim,) * len(down_block_types) + + if isinstance(layers_per_block, int): + layers_per_block = [layers_per_block] * len(down_block_types) + + if isinstance(transformer_layers_per_block, int): + transformer_layers_per_block = [transformer_layers_per_block] * len(down_block_types) + + if class_embeddings_concat: + # The time embeddings are concatenated with the class embeddings. The dimension of the + # time embeddings passed to the down, middle, and up blocks is twice the dimension of the + # regular time embeddings + blocks_time_embed_dim = time_embed_dim * 2 + else: + blocks_time_embed_dim = time_embed_dim + + # down + output_channel = block_out_channels[0] + for i, down_block_type in enumerate(down_block_types): + input_channel = output_channel + output_channel = block_out_channels[i] + is_final_block = i == len(block_out_channels) - 1 + + down_block = get_down_block( + down_block_type, + num_layers=layers_per_block[i], + transformer_layers_per_block=transformer_layers_per_block[i], + in_channels=input_channel, + out_channels=output_channel, + temb_channels=blocks_time_embed_dim, + add_downsample=not is_final_block, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + resnet_groups=norm_num_groups, + cross_attention_dim=cross_attention_dim[i], + num_attention_heads=num_attention_heads[i], + downsample_padding=downsample_padding, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention[i], + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + resnet_skip_time_act=resnet_skip_time_act, + resnet_out_scale_factor=resnet_out_scale_factor, + cross_attention_norm=cross_attention_norm, + attention_head_dim=attention_head_dim[i] if attention_head_dim[i] is not None else output_channel, + dropout=dropout, + ) + self.down_blocks.append(down_block) + + # mid + if mid_block_type == "UNetMidBlock2DCrossAttn": + self.mid_block = UNetMidBlock2DCrossAttn( + transformer_layers_per_block=transformer_layers_per_block[-1], + in_channels=block_out_channels[-1], + temb_channels=blocks_time_embed_dim, + dropout=dropout, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + output_scale_factor=mid_block_scale_factor, + resnet_time_scale_shift=resnet_time_scale_shift, + cross_attention_dim=cross_attention_dim[-1], + num_attention_heads=num_attention_heads[-1], + resnet_groups=norm_num_groups, + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + upcast_attention=upcast_attention, + attention_type=attention_type, + ) + elif mid_block_type == "UNetMidBlock2DSimpleCrossAttn": + self.mid_block = UNetMidBlock2DSimpleCrossAttn( + in_channels=block_out_channels[-1], + temb_channels=blocks_time_embed_dim, + dropout=dropout, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + output_scale_factor=mid_block_scale_factor, + cross_attention_dim=cross_attention_dim[-1], + attention_head_dim=attention_head_dim[-1], + resnet_groups=norm_num_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + skip_time_act=resnet_skip_time_act, + only_cross_attention=mid_block_only_cross_attention, + cross_attention_norm=cross_attention_norm, + ) + elif mid_block_type == "UNetMidBlock2D": + self.mid_block = UNetMidBlock2D( + in_channels=block_out_channels[-1], + temb_channels=blocks_time_embed_dim, + dropout=dropout, + num_layers=0, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + output_scale_factor=mid_block_scale_factor, + resnet_groups=norm_num_groups, + resnet_time_scale_shift=resnet_time_scale_shift, + add_attention=False, + ) + elif mid_block_type is None: + self.mid_block = None + else: + raise ValueError(f"unknown mid_block_type : {mid_block_type}") + + # count how many layers upsample the images + self.num_upsamplers = 0 + + # up + reversed_block_out_channels = list(reversed(block_out_channels)) + reversed_num_attention_heads = list(reversed(num_attention_heads)) + reversed_layers_per_block = list(reversed(layers_per_block)) + reversed_cross_attention_dim = list(reversed(cross_attention_dim)) + reversed_transformer_layers_per_block = ( + list(reversed(transformer_layers_per_block)) + if reverse_transformer_layers_per_block is None + else reverse_transformer_layers_per_block + ) + only_cross_attention = list(reversed(only_cross_attention)) + + output_channel = reversed_block_out_channels[0] + for i, up_block_type in enumerate(up_block_types): + is_final_block = i == len(block_out_channels) - 1 + + prev_output_channel = output_channel + output_channel = reversed_block_out_channels[i] + input_channel = reversed_block_out_channels[min(i + 1, len(block_out_channels) - 1)] + + # add upsample block for all BUT final layer + if not is_final_block: + add_upsample = True + self.num_upsamplers += 1 + else: + add_upsample = False + + up_block = get_up_block( + up_block_type, + num_layers=reversed_layers_per_block[i] + 1, + transformer_layers_per_block=reversed_transformer_layers_per_block[i], + in_channels=input_channel, + out_channels=output_channel, + prev_output_channel=prev_output_channel, + temb_channels=blocks_time_embed_dim, + add_upsample=add_upsample, + resnet_eps=norm_eps, + resnet_act_fn=act_fn, + resolution_idx=i, + resnet_groups=norm_num_groups, + cross_attention_dim=reversed_cross_attention_dim[i], + num_attention_heads=reversed_num_attention_heads[i], + dual_cross_attention=dual_cross_attention, + use_linear_projection=use_linear_projection, + only_cross_attention=only_cross_attention[i], + upcast_attention=upcast_attention, + resnet_time_scale_shift=resnet_time_scale_shift, + attention_type=attention_type, + resnet_skip_time_act=resnet_skip_time_act, + resnet_out_scale_factor=resnet_out_scale_factor, + cross_attention_norm=cross_attention_norm, + attention_head_dim=attention_head_dim[i] if attention_head_dim[i] is not None else output_channel, + dropout=dropout, + ) + self.up_blocks.append(up_block) + prev_output_channel = output_channel + + # out + if norm_num_groups is not None: + self.conv_norm_out = nn.GroupNorm( + num_channels=block_out_channels[0], num_groups=norm_num_groups, eps=norm_eps + ) + + self.conv_act = get_activation(act_fn) + + else: + self.conv_norm_out = None + self.conv_act = None + + conv_out_padding = (conv_out_kernel - 1) // 2 + self.conv_out = nn.Conv2d( + block_out_channels[0], out_channels, kernel_size=conv_out_kernel, padding=conv_out_padding + ) + + if attention_type in ["gated", "gated-text-image"]: + positive_len = 768 + if isinstance(cross_attention_dim, int): + positive_len = cross_attention_dim + elif isinstance(cross_attention_dim, tuple) or isinstance(cross_attention_dim, list): + positive_len = cross_attention_dim[0] + + feature_type = "text-only" if attention_type == "gated" else "text-image" + self.position_net = PositionNet( + positive_len=positive_len, out_dim=cross_attention_dim, feature_type=feature_type + ) + + @property + def attn_processors(self) -> Dict[str, AttentionProcessor]: + r""" + Returns: + `dict` of attention processors: A dictionary containing all attention processors used in the model with + indexed by its weight name. + """ + # set recursively + processors = {} + + def fn_recursive_add_processors(name: str, module: torch.nn.Module, processors: Dict[str, AttentionProcessor]): + if hasattr(module, "get_processor"): + processors[f"{name}.processor"] = module.get_processor(return_deprecated_lora=True) + + for sub_name, child in module.named_children(): + fn_recursive_add_processors(f"{name}.{sub_name}", child, processors) + + return processors + + for name, module in self.named_children(): + fn_recursive_add_processors(name, module, processors) + + return processors + + def set_attn_processor( + self, processor: Union[AttentionProcessor, Dict[str, AttentionProcessor]], _remove_lora=False + ): + r""" + Sets the attention processor to use to compute attention. + + Parameters: + processor (`dict` of `AttentionProcessor` or only `AttentionProcessor`): + The instantiated processor class or a dictionary of processor classes that will be set as the processor + for **all** `Attention` layers. + + If `processor` is a dict, the key needs to define the path to the corresponding cross attention + processor. This is strongly recommended when setting trainable attention processors. + + """ + count = len(self.attn_processors.keys()) + + if isinstance(processor, dict) and len(processor) != count: + raise ValueError( + f"A dict of processors was passed, but the number of processors {len(processor)} does not match the" + f" number of attention layers: {count}. Please make sure to pass {count} processor classes." + ) + + def fn_recursive_attn_processor(name: str, module: torch.nn.Module, processor): + if hasattr(module, "set_processor"): + if not isinstance(processor, dict): + module.set_processor(processor, _remove_lora=_remove_lora) + else: + module.set_processor(processor.pop(f"{name}.processor"), _remove_lora=_remove_lora) + + for sub_name, child in module.named_children(): + fn_recursive_attn_processor(f"{name}.{sub_name}", child, processor) + + for name, module in self.named_children(): + fn_recursive_attn_processor(name, module, processor) + + def set_default_attn_processor(self): + """ + Disables custom attention processors and sets the default attention implementation. + """ + if all(proc.__class__ in ADDED_KV_ATTENTION_PROCESSORS for proc in self.attn_processors.values()): + processor = AttnAddedKVProcessor() + elif all(proc.__class__ in CROSS_ATTENTION_PROCESSORS for proc in self.attn_processors.values()): + processor = AttnProcessor() + else: + raise ValueError( + f"Cannot call `set_default_attn_processor` when attention processors are of type {next(iter(self.attn_processors.values()))}" + ) + + self.set_attn_processor(processor, _remove_lora=True) + + def set_attention_slice(self, slice_size): + r""" + Enable sliced attention computation. + + When this option is enabled, the attention module splits the input tensor in slices to compute attention in + several steps. This is useful for saving some memory in exchange for a small decrease in speed. + + Args: + slice_size (`str` or `int` or `list(int)`, *optional*, defaults to `"auto"`): + When `"auto"`, input to the attention heads is halved, so attention is computed in two steps. If + `"max"`, maximum amount of memory is saved by running only one slice at a time. If a number is + provided, uses as many slices as `attention_head_dim // slice_size`. In this case, `attention_head_dim` + must be a multiple of `slice_size`. + """ + sliceable_head_dims = [] + + def fn_recursive_retrieve_sliceable_dims(module: torch.nn.Module): + if hasattr(module, "set_attention_slice"): + sliceable_head_dims.append(module.sliceable_head_dim) + + for child in module.children(): + fn_recursive_retrieve_sliceable_dims(child) + + # retrieve number of attention layers + for module in self.children(): + fn_recursive_retrieve_sliceable_dims(module) + + num_sliceable_layers = len(sliceable_head_dims) + + if slice_size == "auto": + # half the attention head size is usually a good trade-off between + # speed and memory + slice_size = [dim // 2 for dim in sliceable_head_dims] + elif slice_size == "max": + # make smallest slice possible + slice_size = num_sliceable_layers * [1] + + slice_size = num_sliceable_layers * [slice_size] if not isinstance(slice_size, list) else slice_size + + if len(slice_size) != len(sliceable_head_dims): + raise ValueError( + f"You have provided {len(slice_size)}, but {self.config} has {len(sliceable_head_dims)} different" + f" attention layers. Make sure to match `len(slice_size)` to be {len(sliceable_head_dims)}." + ) + + for i in range(len(slice_size)): + size = slice_size[i] + dim = sliceable_head_dims[i] + if size is not None and size > dim: + raise ValueError(f"size {size} has to be smaller or equal to {dim}.") + + # Recursively walk through all the children. + # Any children which exposes the set_attention_slice method + # gets the message + def fn_recursive_set_attention_slice(module: torch.nn.Module, slice_size: List[int]): + if hasattr(module, "set_attention_slice"): + module.set_attention_slice(slice_size.pop()) + + for child in module.children(): + fn_recursive_set_attention_slice(child, slice_size) + + reversed_slice_size = list(reversed(slice_size)) + for module in self.children(): + fn_recursive_set_attention_slice(module, reversed_slice_size) + + def _set_gradient_checkpointing(self, module, value=False): + if hasattr(module, "gradient_checkpointing"): + module.gradient_checkpointing = value + + def enable_freeu(self, s1, s2, b1, b2): + r"""Enables the FreeU mechanism from https://arxiv.org/abs/2309.11497. + + The suffixes after the scaling factors represent the stage blocks where they are being applied. + + Please refer to the [official repository](https://github.com/ChenyangSi/FreeU) for combinations of values that + are known to work well for different pipelines such as Stable Diffusion v1, v2, and Stable Diffusion XL. + + Args: + s1 (`float`): + Scaling factor for stage 1 to attenuate the contributions of the skip features. This is done to + mitigate the "oversmoothing effect" in the enhanced denoising process. + s2 (`float`): + Scaling factor for stage 2 to attenuate the contributions of the skip features. This is done to + mitigate the "oversmoothing effect" in the enhanced denoising process. + b1 (`float`): Scaling factor for stage 1 to amplify the contributions of backbone features. + b2 (`float`): Scaling factor for stage 2 to amplify the contributions of backbone features. + """ + for i, upsample_block in enumerate(self.up_blocks): + setattr(upsample_block, "s1", s1) + setattr(upsample_block, "s2", s2) + setattr(upsample_block, "b1", b1) + setattr(upsample_block, "b2", b2) + + def disable_freeu(self): + """Disables the FreeU mechanism.""" + freeu_keys = {"s1", "s2", "b1", "b2"} + for i, upsample_block in enumerate(self.up_blocks): + for k in freeu_keys: + if hasattr(upsample_block, k) or getattr(upsample_block, k, None) is not None: + setattr(upsample_block, k, None) + + def forward( + self, + sample: torch.FloatTensor, + spatial_attn_inputs, + timestep: Union[torch.Tensor, float, int], + encoder_hidden_states: torch.Tensor, + class_labels: Optional[torch.Tensor] = None, + timestep_cond: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + cross_attention_kwargs: Optional[Dict[str, Any]] = None, + added_cond_kwargs: Optional[Dict[str, torch.Tensor]] = None, + down_block_additional_residuals: Optional[Tuple[torch.Tensor]] = None, + mid_block_additional_residual: Optional[torch.Tensor] = None, + down_intrablock_additional_residuals: Optional[Tuple[torch.Tensor]] = None, + encoder_attention_mask: Optional[torch.Tensor] = None, + return_dict: bool = True, + ) -> Union[UNet2DConditionOutput, Tuple]: + r""" + The [`UNet2DConditionModel`] forward method. + + Args: + sample (`torch.FloatTensor`): + The noisy input tensor with the following shape `(batch, channel, height, width)`. + timestep (`torch.FloatTensor` or `float` or `int`): The number of timesteps to denoise an input. + encoder_hidden_states (`torch.FloatTensor`): + The encoder hidden states with shape `(batch, sequence_length, feature_dim)`. + class_labels (`torch.Tensor`, *optional*, defaults to `None`): + Optional class labels for conditioning. Their embeddings will be summed with the timestep embeddings. + timestep_cond: (`torch.Tensor`, *optional*, defaults to `None`): + Conditional embeddings for timestep. If provided, the embeddings will be summed with the samples passed + through the `self.time_embedding` layer to obtain the timestep embeddings. + attention_mask (`torch.Tensor`, *optional*, defaults to `None`): + An attention mask of shape `(batch, key_tokens)` is applied to `encoder_hidden_states`. If `1` the mask + is kept, otherwise if `0` it is discarded. Mask will be converted into a bias, which adds large + negative values to the attention scores corresponding to "discard" tokens. + cross_attention_kwargs (`dict`, *optional*): + A kwargs dictionary that if specified is passed along to the `AttentionProcessor` as defined under + `self.processor` in + [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). + added_cond_kwargs: (`dict`, *optional*): + A kwargs dictionary containing additional embeddings that if specified are added to the embeddings that + are passed along to the UNet blocks. + down_block_additional_residuals: (`tuple` of `torch.Tensor`, *optional*): + A tuple of tensors that if specified are added to the residuals of down unet blocks. + mid_block_additional_residual: (`torch.Tensor`, *optional*): + A tensor that if specified is added to the residual of the middle unet block. + encoder_attention_mask (`torch.Tensor`): + A cross-attention mask of shape `(batch, sequence_length)` is applied to `encoder_hidden_states`. If + `True` the mask is kept, otherwise if `False` it is discarded. Mask will be converted into a bias, + which adds large negative values to the attention scores corresponding to "discard" tokens. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~models.unet_2d_condition.UNet2DConditionOutput`] instead of a plain + tuple. + cross_attention_kwargs (`dict`, *optional*): + A kwargs dictionary that if specified is passed along to the [`AttnProcessor`]. + added_cond_kwargs: (`dict`, *optional*): + A kwargs dictionary containin additional embeddings that if specified are added to the embeddings that + are passed along to the UNet blocks. + down_block_additional_residuals (`tuple` of `torch.Tensor`, *optional*): + additional residuals to be added to UNet long skip connections from down blocks to up blocks for + example from ControlNet side model(s) + mid_block_additional_residual (`torch.Tensor`, *optional*): + additional residual to be added to UNet mid block output, for example from ControlNet side model + down_intrablock_additional_residuals (`tuple` of `torch.Tensor`, *optional*): + additional residuals to be added within UNet down blocks, for example from T2I-Adapter side model(s) + + Returns: + [`~models.unet_2d_condition.UNet2DConditionOutput`] or `tuple`: + If `return_dict` is True, an [`~models.unet_2d_condition.UNet2DConditionOutput`] is returned, otherwise + a `tuple` is returned where the first element is the sample tensor. + """ + # By default samples have to be AT least a multiple of the overall upsampling factor. + # The overall upsampling factor is equal to 2 ** (# num of upsampling layers). + # However, the upsampling interpolation output size can be forced to fit any upsampling size + # on the fly if necessary. + default_overall_up_factor = 2**self.num_upsamplers + + # upsample size should be forwarded when sample is not a multiple of `default_overall_up_factor` + forward_upsample_size = False + upsample_size = None + + for dim in sample.shape[-2:]: + if dim % default_overall_up_factor != 0: + # Forward upsample size to force interpolation output size. + forward_upsample_size = True + break + + # ensure attention_mask is a bias, and give it a singleton query_tokens dimension + # expects mask of shape: + # [batch, key_tokens] + # adds singleton query_tokens dimension: + # [batch, 1, key_tokens] + # this helps to broadcast it as a bias over attention scores, which will be in one of the following shapes: + # [batch, heads, query_tokens, key_tokens] (e.g. torch sdp attn) + # [batch * heads, query_tokens, key_tokens] (e.g. xformers or classic attn) + if attention_mask is not None: + # assume that mask is expressed as: + # (1 = keep, 0 = discard) + # convert mask into a bias that can be added to attention scores: + # (keep = +0, discard = -10000.0) + attention_mask = (1 - attention_mask.to(sample.dtype)) * -10000.0 + attention_mask = attention_mask.unsqueeze(1) + + # convert encoder_attention_mask to a bias the same way we do for attention_mask + if encoder_attention_mask is not None: + encoder_attention_mask = (1 - encoder_attention_mask.to(sample.dtype)) * -10000.0 + encoder_attention_mask = encoder_attention_mask.unsqueeze(1) + + # 0. center input if necessary + if self.config.center_input_sample: + sample = 2 * sample - 1.0 + + # 1. time + timesteps = timestep + if not torch.is_tensor(timesteps): + # TODO: this requires sync between CPU and GPU. So try to pass timesteps as tensors if you can + # This would be a good case for the `match` statement (Python 3.10+) + is_mps = sample.device.type == "mps" + if isinstance(timestep, float): + dtype = torch.float32 if is_mps else torch.float64 + else: + dtype = torch.int32 if is_mps else torch.int64 + timesteps = torch.tensor([timesteps], dtype=dtype, device=sample.device) + elif len(timesteps.shape) == 0: + timesteps = timesteps[None].to(sample.device) + + # broadcast to batch dimension in a way that's compatible with ONNX/Core ML + timesteps = timesteps.expand(sample.shape[0]) + + t_emb = self.time_proj(timesteps) + + # `Timesteps` does not contain any weights and will always return f32 tensors + # but time_embedding might actually be running in fp16. so we need to cast here. + # there might be better ways to encapsulate this. + t_emb = t_emb.to(dtype=sample.dtype) + + emb = self.time_embedding(t_emb, timestep_cond) + aug_emb = None + + if self.class_embedding is not None: + if class_labels is None: + raise ValueError("class_labels should be provided when num_class_embeds > 0") + + if self.config.class_embed_type == "timestep": + class_labels = self.time_proj(class_labels) + + # `Timesteps` does not contain any weights and will always return f32 tensors + # there might be better ways to encapsulate this. + class_labels = class_labels.to(dtype=sample.dtype) + + class_emb = self.class_embedding(class_labels).to(dtype=sample.dtype) + + if self.config.class_embeddings_concat: + emb = torch.cat([emb, class_emb], dim=-1) + else: + emb = emb + class_emb + + if self.config.addition_embed_type == "text": + aug_emb = self.add_embedding(encoder_hidden_states) + elif self.config.addition_embed_type == "text_image": + # Kandinsky 2.1 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'text_image' which requires the keyword argument `image_embeds` to be passed in `added_cond_kwargs`" + ) + + image_embs = added_cond_kwargs.get("image_embeds") + text_embs = added_cond_kwargs.get("text_embeds", encoder_hidden_states) + aug_emb = self.add_embedding(text_embs, image_embs) + elif self.config.addition_embed_type == "text_time": + # SDXL - style + if "text_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'text_time' which requires the keyword argument `text_embeds` to be passed in `added_cond_kwargs`" + ) + text_embeds = added_cond_kwargs.get("text_embeds") + if "time_ids" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'text_time' which requires the keyword argument `time_ids` to be passed in `added_cond_kwargs`" + ) + time_ids = added_cond_kwargs.get("time_ids") + time_embeds = self.add_time_proj(time_ids.flatten()) + time_embeds = time_embeds.reshape((text_embeds.shape[0], -1)) + add_embeds = torch.concat([text_embeds, time_embeds], dim=-1) + add_embeds = add_embeds.to(emb.dtype) + aug_emb = self.add_embedding(add_embeds) + elif self.config.addition_embed_type == "image": + # Kandinsky 2.2 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'image' which requires the keyword argument `image_embeds` to be passed in `added_cond_kwargs`" + ) + image_embs = added_cond_kwargs.get("image_embeds") + aug_emb = self.add_embedding(image_embs) + elif self.config.addition_embed_type == "image_hint": + # Kandinsky 2.2 - style + if "image_embeds" not in added_cond_kwargs or "hint" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `addition_embed_type` set to 'image_hint' which requires the keyword arguments `image_embeds` and `hint` to be passed in `added_cond_kwargs`" + ) + image_embs = added_cond_kwargs.get("image_embeds") + hint = added_cond_kwargs.get("hint") + aug_emb, hint = self.add_embedding(image_embs, hint) + sample = torch.cat([sample, hint], dim=1) + + emb = emb + aug_emb if aug_emb is not None else emb + + if self.time_embed_act is not None: + emb = self.time_embed_act(emb) + + if self.encoder_hid_proj is not None and self.config.encoder_hid_dim_type == "text_proj": + encoder_hidden_states = self.encoder_hid_proj(encoder_hidden_states) + elif self.encoder_hid_proj is not None and self.config.encoder_hid_dim_type == "text_image_proj": + # Kadinsky 2.1 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `encoder_hid_dim_type` set to 'text_image_proj' which requires the keyword argument `image_embeds` to be passed in `added_conditions`" + ) + + image_embeds = added_cond_kwargs.get("image_embeds") + encoder_hidden_states = self.encoder_hid_proj(encoder_hidden_states, image_embeds) + elif self.encoder_hid_proj is not None and self.config.encoder_hid_dim_type == "image_proj": + # Kandinsky 2.2 - style + if "image_embeds" not in added_cond_kwargs: + raise ValueError( + f"{self.__class__} has the config param `encoder_hid_dim_type` set to 'image_proj' which requires the keyword argument `image_embeds` to be passed in `added_conditions`" + ) + image_embeds = added_cond_kwargs.get("image_embeds") + encoder_hidden_states = self.encoder_hid_proj(image_embeds) + # 2. pre-process + sample = self.conv_in(sample) + + # 2.5 GLIGEN position net + if cross_attention_kwargs is not None and cross_attention_kwargs.get("gligen", None) is not None: + cross_attention_kwargs = cross_attention_kwargs.copy() + gligen_args = cross_attention_kwargs.pop("gligen") + cross_attention_kwargs["gligen"] = {"objs": self.position_net(**gligen_args)} + + # for spatial attention + spatial_attn_idx = 0 + + # 3. down + lora_scale = cross_attention_kwargs.get("scale", 1.0) if cross_attention_kwargs is not None else 1.0 + if USE_PEFT_BACKEND: + # weight the lora layers by setting `lora_scale` for each PEFT layer + scale_lora_layers(self, lora_scale) + + is_controlnet = mid_block_additional_residual is not None and down_block_additional_residuals is not None + # using new arg down_intrablock_additional_residuals for T2I-Adapters, to distinguish from controlnets + is_adapter = down_intrablock_additional_residuals is not None + # maintain backward compatibility for legacy usage, where + # T2I-Adapter and ControlNet both use down_block_additional_residuals arg + # but can only use one or the other + if not is_adapter and mid_block_additional_residual is None and down_block_additional_residuals is not None: + deprecate( + "T2I should not use down_block_additional_residuals", + "1.3.0", + "Passing intrablock residual connections with `down_block_additional_residuals` is deprecated \ + and will be removed in diffusers 1.3.0. `down_block_additional_residuals` should only be used \ + for ControlNet. Please make sure use `down_intrablock_additional_residuals` instead. ", + standard_warn=False, + ) + down_intrablock_additional_residuals = down_block_additional_residuals + is_adapter = True + + down_block_res_samples = (sample,) + for downsample_block in self.down_blocks: + if hasattr(downsample_block, "has_cross_attention") and downsample_block.has_cross_attention: + # For t2i-adapter CrossAttnDownBlock2D + additional_residuals = {} + if is_adapter and len(down_intrablock_additional_residuals) > 0: + additional_residuals["additional_residuals"] = down_intrablock_additional_residuals.pop(0) + + sample, res_samples, spatial_attn_inputs, spatial_attn_idx = downsample_block( + hidden_states=sample, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + temb=emb, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + **additional_residuals, + ) + else: + sample, res_samples = downsample_block(hidden_states=sample, temb=emb, scale=lora_scale) + if is_adapter and len(down_intrablock_additional_residuals) > 0: + sample += down_intrablock_additional_residuals.pop(0) + + down_block_res_samples += res_samples + + if is_controlnet: + new_down_block_res_samples = () + + for down_block_res_sample, down_block_additional_residual in zip( + down_block_res_samples, down_block_additional_residuals + ): + down_block_res_sample = down_block_res_sample + down_block_additional_residual + new_down_block_res_samples = new_down_block_res_samples + (down_block_res_sample,) + + down_block_res_samples = new_down_block_res_samples + + # 4. mid + if self.mid_block is not None: + if hasattr(self.mid_block, "has_cross_attention") and self.mid_block.has_cross_attention: + sample, spatial_attn_inputs, spatial_attn_idx = self.mid_block( + sample, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + temb=emb, + encoder_hidden_states=encoder_hidden_states, + attention_mask=attention_mask, + cross_attention_kwargs=cross_attention_kwargs, + encoder_attention_mask=encoder_attention_mask, + ) + else: + sample = self.mid_block(sample, emb) + + # To support T2I-Adapter-XL + if ( + is_adapter + and len(down_intrablock_additional_residuals) > 0 + and sample.shape == down_intrablock_additional_residuals[0].shape + ): + sample += down_intrablock_additional_residuals.pop(0) + + if is_controlnet: + sample = sample + mid_block_additional_residual + + # 5. up + for i, upsample_block in enumerate(self.up_blocks): + is_final_block = i == len(self.up_blocks) - 1 + + res_samples = down_block_res_samples[-len(upsample_block.resnets) :] + down_block_res_samples = down_block_res_samples[: -len(upsample_block.resnets)] + + # if we have not reached the final block and need to forward the + # upsample size, we do it here + if not is_final_block and forward_upsample_size: + upsample_size = down_block_res_samples[-1].shape[2:] + + if hasattr(upsample_block, "has_cross_attention") and upsample_block.has_cross_attention: + sample, spatial_attn_inputs, spatial_attn_idx = upsample_block( + hidden_states=sample, + spatial_attn_inputs=spatial_attn_inputs, + spatial_attn_idx=spatial_attn_idx, + temb=emb, + res_hidden_states_tuple=res_samples, + encoder_hidden_states=encoder_hidden_states, + cross_attention_kwargs=cross_attention_kwargs, + upsample_size=upsample_size, + attention_mask=attention_mask, + encoder_attention_mask=encoder_attention_mask, + ) + else: + sample = upsample_block( + hidden_states=sample, + temb=emb, + res_hidden_states_tuple=res_samples, + upsample_size=upsample_size, + scale=lora_scale, + ) + + # 6. post-process + if self.conv_norm_out: + sample = self.conv_norm_out(sample) + sample = self.conv_act(sample) + sample = self.conv_out(sample) + + if USE_PEFT_BACKEND: + # remove `lora_scale` from each PEFT layer + unscale_lora_layers(self, lora_scale) + + if not return_dict: + return (sample,) + + return UNet2DConditionOutput(sample=sample) diff --git a/preprocess/humanparsing/aigc_run_parsing.py b/preprocess/humanparsing/aigc_run_parsing.py new file mode 100644 index 0000000..ee2a83f --- /dev/null +++ b/preprocess/humanparsing/aigc_run_parsing.py @@ -0,0 +1,22 @@ +import pdb +from pathlib import Path +import sys + +PROJECT_ROOT = Path(__file__).absolute().parents[0].absolute() +sys.path.insert(0, str(PROJECT_ROOT)) +from .parsing_api import load_atr_model, load_lip_model, inference +import torch + + +class Parsing: + def __init__(self, gpu_id: int): + self.gpu_id = gpu_id + torch.cuda.set_device(gpu_id) + self.atr_model = load_atr_model() + self.lip_model = load_lip_model() + + + def __call__(self, input_image): + torch.cuda.set_device(self.gpu_id) + parsed_image, face_mask = inference(self.atr_model, self.lip_model, input_image) + return parsed_image, face_mask diff --git a/preprocess/humanparsing/datasets/__init__.py b/preprocess/humanparsing/datasets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/preprocess/humanparsing/datasets/__pycache__/__init__.cpython-311.pyc b/preprocess/humanparsing/datasets/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1807555bf62e595b7cc1fa9bb7e5df3a14cbd9a3 GIT binary patch literal 275 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 self.aspect_ratio * h: + h = w * 1.0 / self.aspect_ratio + elif w < self.aspect_ratio * h: + w = h * self.aspect_ratio + scale = np.array([w * 1.0, h * 1.0], dtype=np.float32) + return center, scale + + def __getitem__(self, index): + train_item = self.train_list[index] + + im_path = os.path.join(self.root, self.dataset + '_images', train_item + '.jpg') + parsing_anno_path = os.path.join(self.root, self.dataset + '_segmentations', train_item + '.png') + + im = cv2.imread(im_path, cv2.IMREAD_COLOR) + h, w, _ = im.shape + parsing_anno = np.zeros((h, w), dtype=np.long) + + # Get person center and scale + person_center, s = self._box2cs([0, 0, w - 1, h - 1]) + r = 0 + + if self.dataset != 'test': + # Get pose annotation + parsing_anno = cv2.imread(parsing_anno_path, cv2.IMREAD_GRAYSCALE) + if self.dataset == 'train' or self.dataset == 'trainval': + sf = self.scale_factor + rf = self.rotation_factor + s = s * np.clip(np.random.randn() * sf + 1, 1 - sf, 1 + sf) + r = np.clip(np.random.randn() * rf, -rf * 2, rf * 2) if random.random() <= 0.6 else 0 + + if random.random() <= self.flip_prob: + im = im[:, ::-1, :] + parsing_anno = parsing_anno[:, ::-1] + person_center[0] = im.shape[1] - person_center[0] - 1 + right_idx = [15, 17, 19] + left_idx = [14, 16, 18] + for i in range(0, 3): + right_pos = np.where(parsing_anno == right_idx[i]) + left_pos = np.where(parsing_anno == left_idx[i]) + parsing_anno[right_pos[0], right_pos[1]] = left_idx[i] + parsing_anno[left_pos[0], left_pos[1]] = right_idx[i] + + trans = get_affine_transform(person_center, s, r, self.crop_size) + input = cv2.warpAffine( + im, + trans, + (int(self.crop_size[1]), int(self.crop_size[0])), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(0, 0, 0)) + + if self.transform: + input = self.transform(input) + + meta = { + 'name': train_item, + 'center': person_center, + 'height': h, + 'width': w, + 'scale': s, + 'rotation': r + } + + if self.dataset == 'val' or self.dataset == 'test': + return input, meta + else: + label_parsing = cv2.warpAffine( + parsing_anno, + trans, + (int(self.crop_size[1]), int(self.crop_size[0])), + flags=cv2.INTER_NEAREST, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(255)) + + label_parsing = torch.from_numpy(label_parsing) + + return input, label_parsing, meta + + +class LIPDataValSet(data.Dataset): + def __init__(self, root, dataset='val', crop_size=[473, 473], transform=None, flip=False): + self.root = root + self.crop_size = crop_size + self.transform = transform + self.flip = flip + self.dataset = dataset + self.root = root + self.aspect_ratio = crop_size[1] * 1.0 / crop_size[0] + self.crop_size = np.asarray(crop_size) + + list_path = os.path.join(self.root, self.dataset + '_id.txt') + val_list = [i_id.strip() for i_id in open(list_path)] + + self.val_list = val_list + self.number_samples = len(self.val_list) + + def __len__(self): + return len(self.val_list) + + def _box2cs(self, box): + x, y, w, h = box[:4] + return self._xywh2cs(x, y, w, h) + + def _xywh2cs(self, x, y, w, h): + center = np.zeros((2), dtype=np.float32) + center[0] = x + w * 0.5 + center[1] = y + h * 0.5 + if w > self.aspect_ratio * h: + h = w * 1.0 / self.aspect_ratio + elif w < self.aspect_ratio * h: + w = h * self.aspect_ratio + scale = np.array([w * 1.0, h * 1.0], dtype=np.float32) + + return center, scale + + def __getitem__(self, index): + val_item = self.val_list[index] + # Load training image + im_path = os.path.join(self.root, self.dataset + '_images', val_item + '.jpg') + im = cv2.imread(im_path, cv2.IMREAD_COLOR) + h, w, _ = im.shape + # Get person center and scale + person_center, s = self._box2cs([0, 0, w - 1, h - 1]) + r = 0 + trans = get_affine_transform(person_center, s, r, self.crop_size) + input = cv2.warpAffine( + im, + trans, + (int(self.crop_size[1]), int(self.crop_size[0])), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(0, 0, 0)) + input = self.transform(input) + flip_input = input.flip(dims=[-1]) + if self.flip: + batch_input_im = torch.stack([input, flip_input]) + else: + batch_input_im = input + + meta = { + 'name': val_item, + 'center': person_center, + 'height': h, + 'width': w, + 'scale': s, + 'rotation': r + } + + return batch_input_im, meta diff --git a/preprocess/humanparsing/datasets/simple_extractor_dataset.py b/preprocess/humanparsing/datasets/simple_extractor_dataset.py new file mode 100644 index 0000000..c5e8524 --- /dev/null +++ b/preprocess/humanparsing/datasets/simple_extractor_dataset.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : dataset.py +@Time : 8/30/19 9:12 PM +@Desc : Dataset Definition +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import os +import pdb + +import cv2 +import numpy as np +from PIL import Image +from torch.utils import data +from utils.transforms import get_affine_transform + + +class SimpleFolderDataset(data.Dataset): + def __init__(self, root, input_size=[512, 512], transform=None): + self.root = root + self.input_size = input_size + self.transform = transform + self.aspect_ratio = input_size[1] * 1.0 / input_size[0] + self.input_size = np.asarray(input_size) + self.is_pil_image = False + if isinstance(root, Image.Image): + self.file_list = [root] + self.is_pil_image = True + elif os.path.isfile(root): + self.file_list = [os.path.basename(root)] + self.root = os.path.dirname(root) + else: + self.file_list = os.listdir(self.root) + + def __len__(self): + return len(self.file_list) + + def _box2cs(self, box): + x, y, w, h = box[:4] + return self._xywh2cs(x, y, w, h) + + def _xywh2cs(self, x, y, w, h): + center = np.zeros((2), dtype=np.float32) + center[0] = x + w * 0.5 + center[1] = y + h * 0.5 + if w > self.aspect_ratio * h: + h = w * 1.0 / self.aspect_ratio + elif w < self.aspect_ratio * h: + w = h * self.aspect_ratio + scale = np.array([w, h], dtype=np.float32) + return center, scale + + def __getitem__(self, index): + if self.is_pil_image: + img = np.asarray(self.file_list[index])[:, :, [2, 1, 0]] + else: + img_name = self.file_list[index] + img_path = os.path.join(self.root, img_name) + img = cv2.imread(img_path, cv2.IMREAD_COLOR) + h, w, _ = img.shape + + # Get person center and scale + person_center, s = self._box2cs([0, 0, w - 1, h - 1]) + r = 0 + trans = get_affine_transform(person_center, s, r, self.input_size) + input = cv2.warpAffine( + img, + trans, + (int(self.input_size[1]), int(self.input_size[0])), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(0, 0, 0)) + + input = self.transform(input) + meta = { + 'center': person_center, + 'height': h, + 'width': w, + 'scale': s, + 'rotation': r + } + + return input, meta diff --git a/preprocess/humanparsing/datasets/target_generation.py b/preprocess/humanparsing/datasets/target_generation.py new file mode 100644 index 0000000..8524db4 --- /dev/null +++ b/preprocess/humanparsing/datasets/target_generation.py @@ -0,0 +1,40 @@ +import torch +from torch.nn import functional as F + + +def generate_edge_tensor(label, edge_width=3): + label = label.type(torch.cuda.FloatTensor) + if len(label.shape) == 2: + label = label.unsqueeze(0) + n, h, w = label.shape + edge = torch.zeros(label.shape, dtype=torch.float).cuda() + # right + edge_right = edge[:, 1:h, :] + edge_right[(label[:, 1:h, :] != label[:, :h - 1, :]) & (label[:, 1:h, :] != 255) + & (label[:, :h - 1, :] != 255)] = 1 + + # up + edge_up = edge[:, :, :w - 1] + edge_up[(label[:, :, :w - 1] != label[:, :, 1:w]) + & (label[:, :, :w - 1] != 255) + & (label[:, :, 1:w] != 255)] = 1 + + # upright + edge_upright = edge[:, :h - 1, :w - 1] + edge_upright[(label[:, :h - 1, :w - 1] != label[:, 1:h, 1:w]) + & (label[:, :h - 1, :w - 1] != 255) + & (label[:, 1:h, 1:w] != 255)] = 1 + + # bottomright + edge_bottomright = edge[:, :h - 1, 1:w] + edge_bottomright[(label[:, :h - 1, 1:w] != label[:, 1:h, :w - 1]) + & (label[:, :h - 1, 1:w] != 255) + & (label[:, 1:h, :w - 1] != 255)] = 1 + + kernel = torch.ones((1, 1, edge_width, edge_width), dtype=torch.float).cuda() + with torch.no_grad(): + edge = edge.unsqueeze(1) + edge = F.conv2d(edge, kernel, stride=1, padding=1) + edge[edge!=0] = 1 + edge = edge.squeeze() + return edge diff --git a/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/human_to_coco.py b/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/human_to_coco.py new file mode 100644 index 0000000..8eccb3a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/human_to_coco.py @@ -0,0 +1,166 @@ +import argparse +import datetime +import json +import os +from PIL import Image +import numpy as np + +import pycococreatortools + + +def get_arguments(): + parser = argparse.ArgumentParser(description="transform mask annotation to coco annotation") + parser.add_argument("--dataset", type=str, default='CIHP', help="name of dataset (CIHP, MHPv2 or VIP)") + parser.add_argument("--json_save_dir", type=str, default='../data/msrcnn_finetune_annotations', + help="path to save coco-style annotation json file") + parser.add_argument("--use_val", type=bool, default=False, + help="use train+val set for finetuning or not") + parser.add_argument("--train_img_dir", type=str, default='../data/instance-level_human_parsing/Training/Images', + help="train image path") + parser.add_argument("--train_anno_dir", type=str, + default='../data/instance-level_human_parsing/Training/Human_ids', + help="train human mask path") + parser.add_argument("--val_img_dir", type=str, default='../data/instance-level_human_parsing/Validation/Images', + help="val image path") + parser.add_argument("--val_anno_dir", type=str, + default='../data/instance-level_human_parsing/Validation/Human_ids', + help="val human mask path") + return parser.parse_args() + + +def main(args): + INFO = { + "description": args.split_name + " Dataset", + "url": "", + "version": "", + "year": 2019, + "contributor": "xyq", + "date_created": datetime.datetime.utcnow().isoformat(' ') + } + + LICENSES = [ + { + "id": 1, + "name": "", + "url": "" + } + ] + + CATEGORIES = [ + { + 'id': 1, + 'name': 'person', + 'supercategory': 'person', + }, + ] + + coco_output = { + "info": INFO, + "licenses": LICENSES, + "categories": CATEGORIES, + "images": [], + "annotations": [] + } + + image_id = 1 + segmentation_id = 1 + + for image_name in os.listdir(args.train_img_dir): + image = Image.open(os.path.join(args.train_img_dir, image_name)) + image_info = pycococreatortools.create_image_info( + image_id, image_name, image.size + ) + coco_output["images"].append(image_info) + + human_mask_name = os.path.splitext(image_name)[0] + '.png' + human_mask = np.asarray(Image.open(os.path.join(args.train_anno_dir, human_mask_name))) + human_gt_labels = np.unique(human_mask) + + for i in range(1, len(human_gt_labels)): + category_info = {'id': 1, 'is_crowd': 0} + binary_mask = np.uint8(human_mask == i) + annotation_info = pycococreatortools.create_annotation_info( + segmentation_id, image_id, category_info, binary_mask, + image.size, tolerance=10 + ) + if annotation_info is not None: + coco_output["annotations"].append(annotation_info) + + segmentation_id += 1 + image_id += 1 + + if not os.path.exists(args.json_save_dir): + os.makedirs(args.json_save_dir) + if not args.use_val: + with open('{}/{}_train.json'.format(args.json_save_dir, args.split_name), 'w') as output_json_file: + json.dump(coco_output, output_json_file) + else: + for image_name in os.listdir(args.val_img_dir): + image = Image.open(os.path.join(args.val_img_dir, image_name)) + image_info = pycococreatortools.create_image_info( + image_id, image_name, image.size + ) + coco_output["images"].append(image_info) + + human_mask_name = os.path.splitext(image_name)[0] + '.png' + human_mask = np.asarray(Image.open(os.path.join(args.val_anno_dir, human_mask_name))) + human_gt_labels = np.unique(human_mask) + + for i in range(1, len(human_gt_labels)): + category_info = {'id': 1, 'is_crowd': 0} + binary_mask = np.uint8(human_mask == i) + annotation_info = pycococreatortools.create_annotation_info( + segmentation_id, image_id, category_info, binary_mask, + image.size, tolerance=10 + ) + if annotation_info is not None: + coco_output["annotations"].append(annotation_info) + + segmentation_id += 1 + image_id += 1 + + with open('{}/{}_trainval.json'.format(args.json_save_dir, args.split_name), 'w') as output_json_file: + json.dump(coco_output, output_json_file) + + coco_output_val = { + "info": INFO, + "licenses": LICENSES, + "categories": CATEGORIES, + "images": [], + "annotations": [] + } + + image_id_val = 1 + segmentation_id_val = 1 + + for image_name in os.listdir(args.val_img_dir): + image = Image.open(os.path.join(args.val_img_dir, image_name)) + image_info = pycococreatortools.create_image_info( + image_id_val, image_name, image.size + ) + coco_output_val["images"].append(image_info) + + human_mask_name = os.path.splitext(image_name)[0] + '.png' + human_mask = np.asarray(Image.open(os.path.join(args.val_anno_dir, human_mask_name))) + human_gt_labels = np.unique(human_mask) + + for i in range(1, len(human_gt_labels)): + category_info = {'id': 1, 'is_crowd': 0} + binary_mask = np.uint8(human_mask == i) + annotation_info = pycococreatortools.create_annotation_info( + segmentation_id_val, image_id_val, category_info, binary_mask, + image.size, tolerance=10 + ) + if annotation_info is not None: + coco_output_val["annotations"].append(annotation_info) + + segmentation_id_val += 1 + image_id_val += 1 + + with open('{}/{}_val.json'.format(args.json_save_dir, args.split_name), 'w') as output_json_file_val: + json.dump(coco_output_val, output_json_file_val) + + +if __name__ == "__main__": + args = get_arguments() + main(args) diff --git a/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/pycococreatortools.py b/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/pycococreatortools.py new file mode 100644 index 0000000..3f3d833 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/pycococreatortools.py @@ -0,0 +1,114 @@ +import re +import datetime +import numpy as np +from itertools import groupby +from skimage import measure +from PIL import Image +from pycocotools import mask + +convert = lambda text: int(text) if text.isdigit() else text.lower() +natrual_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] + + +def resize_binary_mask(array, new_size): + image = Image.fromarray(array.astype(np.uint8) * 255) + image = image.resize(new_size) + return np.asarray(image).astype(np.bool_) + + +def close_contour(contour): + if not np.array_equal(contour[0], contour[-1]): + contour = np.vstack((contour, contour[0])) + return contour + + +def binary_mask_to_rle(binary_mask): + rle = {'counts': [], 'size': list(binary_mask.shape)} + counts = rle.get('counts') + for i, (value, elements) in enumerate(groupby(binary_mask.ravel(order='F'))): + if i == 0 and value == 1: + counts.append(0) + counts.append(len(list(elements))) + + return rle + + +def binary_mask_to_polygon(binary_mask, tolerance=0): + """Converts a binary mask to COCO polygon representation + Args: + binary_mask: a 2D binary numpy array where '1's represent the object + tolerance: Maximum distance from original points of polygon to approximated + polygonal chain. If tolerance is 0, the original coordinate array is returned. + """ + polygons = [] + # pad mask to close contours of shapes which start and end at an edge + padded_binary_mask = np.pad(binary_mask, pad_width=1, mode='constant', constant_values=0) + contours = measure.find_contours(padded_binary_mask, 0.5) + contours = np.subtract(contours, 1) + for contour in contours: + contour = close_contour(contour) + contour = measure.approximate_polygon(contour, tolerance) + if len(contour) < 3: + continue + contour = np.flip(contour, axis=1) + segmentation = contour.ravel().tolist() + # after padding and subtracting 1 we may get -0.5 points in our segmentation + segmentation = [0 if i < 0 else i for i in segmentation] + polygons.append(segmentation) + + return polygons + + +def create_image_info(image_id, file_name, image_size, + date_captured=datetime.datetime.utcnow().isoformat(' '), + license_id=1, coco_url="", flickr_url=""): + image_info = { + "id": image_id, + "file_name": file_name, + "width": image_size[0], + "height": image_size[1], + "date_captured": date_captured, + "license": license_id, + "coco_url": coco_url, + "flickr_url": flickr_url + } + + return image_info + + +def create_annotation_info(annotation_id, image_id, category_info, binary_mask, + image_size=None, tolerance=2, bounding_box=None): + if image_size is not None: + binary_mask = resize_binary_mask(binary_mask, image_size) + + binary_mask_encoded = mask.encode(np.asfortranarray(binary_mask.astype(np.uint8))) + + area = mask.area(binary_mask_encoded) + if area < 1: + return None + + if bounding_box is None: + bounding_box = mask.toBbox(binary_mask_encoded) + + if category_info["is_crowd"]: + is_crowd = 1 + segmentation = binary_mask_to_rle(binary_mask) + else: + is_crowd = 0 + segmentation = binary_mask_to_polygon(binary_mask, tolerance) + if not segmentation: + return None + + annotation_info = { + "id": annotation_id, + "image_id": image_id, + "category_id": category_info["id"], + "iscrowd": is_crowd, + "area": area.tolist(), + "bbox": bounding_box.tolist(), + "segmentation": segmentation, + "width": binary_mask.shape[1], + "height": binary_mask.shape[0], + } + + return annotation_info diff --git a/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/test_human2coco_format.py b/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/test_human2coco_format.py new file mode 100644 index 0000000..1733918 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/coco_style_annotation_creator/test_human2coco_format.py @@ -0,0 +1,74 @@ +import argparse +import datetime +import json +import os +from PIL import Image + +import pycococreatortools + + +def get_arguments(): + parser = argparse.ArgumentParser(description="transform mask annotation to coco annotation") + parser.add_argument("--dataset", type=str, default='CIHP', help="name of dataset (CIHP, MHPv2 or VIP)") + parser.add_argument("--json_save_dir", type=str, default='../data/CIHP/annotations', + help="path to save coco-style annotation json file") + parser.add_argument("--test_img_dir", type=str, default='../data/CIHP/Testing/Images', + help="test image path") + return parser.parse_args() + +args = get_arguments() + +INFO = { + "description": args.dataset + "Dataset", + "url": "", + "version": "", + "year": 2020, + "contributor": "yunqiuxu", + "date_created": datetime.datetime.utcnow().isoformat(' ') +} + +LICENSES = [ + { + "id": 1, + "name": "", + "url": "" + } +] + +CATEGORIES = [ + { + 'id': 1, + 'name': 'person', + 'supercategory': 'person', + }, +] + + +def main(args): + coco_output = { + "info": INFO, + "licenses": LICENSES, + "categories": CATEGORIES, + "images": [], + "annotations": [] + } + + image_id = 1 + + for image_name in os.listdir(args.test_img_dir): + image = Image.open(os.path.join(args.test_img_dir, image_name)) + image_info = pycococreatortools.create_image_info( + image_id, image_name, image.size + ) + coco_output["images"].append(image_info) + image_id += 1 + + if not os.path.exists(os.path.join(args.json_save_dir)): + os.mkdir(os.path.join(args.json_save_dir)) + + with open('{}/{}.json'.format(args.json_save_dir, args.dataset), 'w') as output_json_file: + json.dump(coco_output, output_json_file) + + +if __name__ == "__main__": + main(args) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.circleci/config.yml b/preprocess/humanparsing/mhp_extension/detectron2/.circleci/config.yml new file mode 100644 index 0000000..6c60588 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.circleci/config.yml @@ -0,0 +1,179 @@ +# Python CircleCI 2.0 configuration file +# +# Check https://circleci.com/docs/2.0/language-python/ for more details +# +version: 2 + +# ------------------------------------------------------------------------------------- +# Environments to run the jobs in +# ------------------------------------------------------------------------------------- +cpu: &cpu + docker: + - image: circleci/python:3.6.8-stretch + resource_class: medium + +gpu: &gpu + machine: + image: ubuntu-1604:201903-01 + docker_layer_caching: true + resource_class: gpu.small + +# ------------------------------------------------------------------------------------- +# Re-usable commands +# ------------------------------------------------------------------------------------- +install_python: &install_python + - run: + name: Install Python + working_directory: ~/ + command: | + pyenv install 3.6.1 + pyenv global 3.6.1 + +setup_venv: &setup_venv + - run: + name: Setup Virtual Env + working_directory: ~/ + command: | + python -m venv ~/venv + echo ". ~/venv/bin/activate" >> $BASH_ENV + . ~/venv/bin/activate + python --version + which python + which pip + pip install --upgrade pip + +install_dep: &install_dep + - run: + name: Install Dependencies + command: | + pip install --progress-bar off -U 'git+https://github.com/facebookresearch/fvcore' + pip install --progress-bar off cython opencv-python + pip install --progress-bar off 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI' + pip install --progress-bar off torch torchvision + +install_detectron2: &install_detectron2 + - run: + name: Install Detectron2 + command: | + gcc --version + pip install -U --progress-bar off -e .[dev] + python -m detectron2.utils.collect_env + +install_nvidia_driver: &install_nvidia_driver + - run: + name: Install nvidia driver + working_directory: ~/ + command: | + wget -q 'https://s3.amazonaws.com/ossci-linux/nvidia_driver/NVIDIA-Linux-x86_64-430.40.run' + sudo /bin/bash ./NVIDIA-Linux-x86_64-430.40.run -s --no-drm + nvidia-smi + +run_unittests: &run_unittests + - run: + name: Run Unit Tests + command: | + python -m unittest discover -v -s tests + +# ------------------------------------------------------------------------------------- +# Jobs to run +# ------------------------------------------------------------------------------------- +jobs: + cpu_tests: + <<: *cpu + + working_directory: ~/detectron2 + + steps: + - checkout + - <<: *setup_venv + + # Cache the venv directory that contains dependencies + - restore_cache: + keys: + - cache-key-{{ .Branch }}-ID-20200425 + + - <<: *install_dep + + - save_cache: + paths: + - ~/venv + key: cache-key-{{ .Branch }}-ID-20200425 + + - <<: *install_detectron2 + + - run: + name: isort + command: | + isort -c -sp . + - run: + name: black + command: | + black --check -l 100 . + - run: + name: flake8 + command: | + flake8 . + + - <<: *run_unittests + + gpu_tests: + <<: *gpu + + working_directory: ~/detectron2 + + steps: + - checkout + - <<: *install_nvidia_driver + + - run: + name: Install nvidia-docker + working_directory: ~/ + command: | + curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - + distribution=$(. /etc/os-release;echo $ID$VERSION_ID) + curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \ + sudo tee /etc/apt/sources.list.d/nvidia-docker.list + sudo apt-get update && sudo apt-get install -y nvidia-docker2 + # reload the docker daemon configuration + sudo pkill -SIGHUP dockerd + + - run: + name: Launch docker + working_directory: ~/detectron2/docker + command: | + nvidia-docker build -t detectron2:v0 -f Dockerfile-circleci . + nvidia-docker run -itd --name d2 detectron2:v0 + docker exec -it d2 nvidia-smi + + - run: + name: Build Detectron2 + command: | + docker exec -it d2 pip install 'git+https://github.com/facebookresearch/fvcore' + docker cp ~/detectron2 d2:/detectron2 + # This will build d2 for the target GPU arch only + docker exec -it d2 pip install -e /detectron2 + docker exec -it d2 python3 -m detectron2.utils.collect_env + docker exec -it d2 python3 -c 'import torch; assert(torch.cuda.is_available())' + + - run: + name: Run Unit Tests + command: | + docker exec -e CIRCLECI=true -it d2 python3 -m unittest discover -v -s /detectron2/tests + +workflows: + version: 2 + regular_test: + jobs: + - cpu_tests + - gpu_tests + + #nightly_test: + #jobs: + #- gpu_tests + #triggers: + #- schedule: + #cron: "0 0 * * *" + #filters: + #branches: + #only: + #- master diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.clang-format b/preprocess/humanparsing/mhp_extension/detectron2/.clang-format new file mode 100644 index 0000000..a757d4f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.clang-format @@ -0,0 +1,85 @@ +AccessModifierOffset: -1 +AlignAfterOpenBracket: AlwaysBreak +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlinesLeft: true +AlignOperands: false +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: true +BinPackArguments: false +BinPackParameters: false +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ForEachMacros: [ FOR_EACH, FOR_EACH_ENUMERATE, FOR_EACH_KV, FOR_EACH_R, FOR_EACH_RANGE, ] +IncludeCategories: + - Regex: '^<.*\.h(pp)?>' + Priority: 1 + - Regex: '^<.*' + Priority: 2 + - Regex: '.*' + Priority: 3 +IndentCaseLabels: true +IndentWidth: 2 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: false +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Left +ReflowComments: true +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.flake8 b/preprocess/humanparsing/mhp_extension/detectron2/.flake8 new file mode 100644 index 0000000..0cc61b7 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.flake8 @@ -0,0 +1,9 @@ +# This is an example .flake8 config, used when developing *Black* itself. +# Keep in sync with setup.cfg which is used for source packages. + +[flake8] +ignore = W503, E203, E221, C901, C408, E741 +max-line-length = 100 +max-complexity = 18 +select = B,C,E,F,W,T4,B9 +exclude = build,__init__.py diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/CODE_OF_CONDUCT.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..0f7ad8b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,5 @@ +# Code of Conduct + +Facebook has adopted a Code of Conduct that we expect project participants to adhere to. +Please read the [full text](https://code.fb.com/codeofconduct/) +so that you can understand what actions will and will not be tolerated. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/CONTRIBUTING.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/CONTRIBUTING.md new file mode 100644 index 0000000..81936df --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/CONTRIBUTING.md @@ -0,0 +1,49 @@ +# Contributing to detectron2 + +## Issues +We use GitHub issues to track public bugs and questions. +Please make sure to follow one of the +[issue templates](https://github.com/facebookresearch/detectron2/issues/new/choose) +when reporting any issues. + +Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe +disclosure of security bugs. In those cases, please go through the process +outlined on that page and do not file a public issue. + +## Pull Requests +We actively welcome your pull requests. + +However, if you're adding any significant features (e.g. > 50 lines), please +make sure to have a corresponding issue to discuss your motivation and proposals, +before sending a PR. We do not always accept new features, and we take the following +factors into consideration: + +1. Whether the same feature can be achieved without modifying detectron2. +Detectron2 is designed so that you can implement many extensions from the outside, e.g. +those in [projects](https://github.com/facebookresearch/detectron2/tree/master/projects). +If some part is not as extensible, you can also bring up the issue to make it more extensible. +2. Whether the feature is potentially useful to a large audience, or only to a small portion of users. +3. Whether the proposed solution has a good design / interface. +4. Whether the proposed solution adds extra mental/practical overhead to users who don't + need such feature. +5. Whether the proposed solution breaks existing APIs. + +When sending a PR, please do: + +1. If a PR contains multiple orthogonal changes, split it to several PRs. +2. If you've added code that should be tested, add tests. +3. For PRs that need experiments (e.g. adding a new model or new methods), + you don't need to update model zoo, but do provide experiment results in the description of the PR. +4. If APIs are changed, update the documentation. +5. Make sure your code lints with `./dev/linter.sh`. + + +## Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Facebook's open source projects. + +Complete your CLA here: + +## License +By contributing to detectron2, you agree that your contributions will be licensed +under the LICENSE file in the root directory of this source tree. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/Detectron2-Logo-Horz.svg b/preprocess/humanparsing/mhp_extension/detectron2/.github/Detectron2-Logo-Horz.svg new file mode 100644 index 0000000..eb2d643 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/Detectron2-Logo-Horz.svg @@ -0,0 +1 @@ +Detectron2-Logo-Horz \ No newline at end of file diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..5e8aaa2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,5 @@ + +Please select an issue template from +https://github.com/facebookresearch/detectron2/issues/new/choose . + +Otherwise your issue will be closed. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/bugs.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/bugs.md new file mode 100644 index 0000000..52d2998 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/bugs.md @@ -0,0 +1,36 @@ +--- +name: "🐛 Bugs" +about: Report bugs in detectron2 +title: Please read & provide the following + +--- + +## Instructions To Reproduce the 🐛 Bug: + +1. what changes you made (`git diff`) or what code you wrote +``` + +``` +2. what exact command you run: +3. what you observed (including __full logs__): +``` + +``` +4. please simplify the steps as much as possible so they do not require additional resources to + run, such as a private dataset. + +## Expected behavior: + +If there are no obvious error in "what you observed" provided above, +please tell us the expected behavior. + +## Environment: + +Provide your environment information using the following command: +``` +wget -nc -q https://github.com/facebookresearch/detectron2/raw/master/detectron2/utils/collect_env.py && python collect_env.py +``` + +If your issue looks like an installation issue / environment issue, +please first try to solve it yourself with the instructions in +https://detectron2.readthedocs.io/tutorials/install.html#common-installation-issues diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/config.yml b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..c19e249 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,9 @@ +# require an issue template to be chosen +blank_issues_enabled: false + +# Unexpected behaviors & bugs are split to two templates. +# When they are one template, users think "it's not a bug" and don't choose the template. +# +# But the file name is still "unexpected-problems-bugs.md" so that old references +# to this issue template still works. +# It's ok since this template should be a superset of "bugs.md" (unexpected behaviors is a superset of bugs) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/feature-request.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..dd69a33 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,31 @@ +--- +name: "\U0001F680Feature Request" +about: Submit a proposal/request for a new detectron2 feature + +--- + +## 🚀 Feature +A clear and concise description of the feature proposal. + + +## Motivation & Examples + +Tell us why the feature is useful. + +Describe what the feature would look like, if it is implemented. +Best demonstrated using **code examples** in addition to words. + +## Note + +We only consider adding new features if they are relevant to many users. + +If you request implementation of research papers -- +we only consider papers that have enough significance and prevalance in the object detection field. + +We do not take requests for most projects in the `projects/` directory, +because they are research code release that is mainly for other researchers to reproduce results. + +Instead of adding features inside detectron2, +you can implement many features by [extending detectron2](https://detectron2.readthedocs.io/tutorials/extend.html). +The [projects/](https://github.com/facebookresearch/detectron2/tree/master/projects/) directory contains many of such examples. + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/questions-help-support.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/questions-help-support.md new file mode 100644 index 0000000..0811561 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/questions-help-support.md @@ -0,0 +1,26 @@ +--- +name: "❓How to do something?" +about: How to do something using detectron2? What does an API do? + +--- + +## ❓ How to do something using detectron2 + +Describe what you want to do, including: +1. what inputs you will provide, if any: +2. what outputs you are expecting: + +## ❓ What does an API do and how to use it? +Please link to which API or documentation you're asking about from +https://detectron2.readthedocs.io/ + + +NOTE: + +1. Only general answers are provided. + If you want to ask about "why X did not work", please use the + [Unexpected behaviors](https://github.com/facebookresearch/detectron2/issues/new/choose) issue template. + +2. About how to implement new models / new dataloader / new training logic, etc., check documentation first. + +3. We do not answer general machine learning / computer vision questions that are not specific to detectron2, such as how a model works, how to improve your training/make it converge, or what algorithm/methods can be used to achieve X. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/unexpected-problems-bugs.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/unexpected-problems-bugs.md new file mode 100644 index 0000000..bafee7a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/ISSUE_TEMPLATE/unexpected-problems-bugs.md @@ -0,0 +1,45 @@ +--- +name: "Unexpected behaviors" +about: Run into unexpected behaviors when using detectron2 +title: Please read & provide the following + +--- + +If you do not know the root cause of the problem, and wish someone to help you, please +post according to this template: + +## Instructions To Reproduce the Issue: + +1. what changes you made (`git diff`) or what code you wrote +``` + +``` +2. what exact command you run: +3. what you observed (including __full logs__): +``` + +``` +4. please simplify the steps as much as possible so they do not require additional resources to + run, such as a private dataset. + +## Expected behavior: + +If there are no obvious error in "what you observed" provided above, +please tell us the expected behavior. + +If you expect the model to converge / work better, note that we do not give suggestions +on how to train a new model. +Only in one of the two conditions we will help with it: +(1) You're unable to reproduce the results in detectron2 model zoo. +(2) It indicates a detectron2 bug. + +## Environment: + +Provide your environment information using the following command: +``` +wget -nc -q https://github.com/facebookresearch/detectron2/raw/master/detectron2/utils/collect_env.py && python collect_env.py +``` + +If your issue looks like an installation issue / environment issue, +please first try to solve it yourself with the instructions in +https://detectron2.readthedocs.io/tutorials/install.html#common-installation-issues diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.github/pull_request_template.md b/preprocess/humanparsing/mhp_extension/detectron2/.github/pull_request_template.md new file mode 100644 index 0000000..4ff5ea5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.github/pull_request_template.md @@ -0,0 +1,9 @@ +Thanks for your contribution! + +If you're sending a large PR (e.g., >50 lines), +please open an issue first about the feature / bug, and indicate how you want to contribute. + +Before submitting a PR, please run `dev/linter.sh` to lint the code. + +See https://detectron2.readthedocs.io/notes/contributing.html#pull-requests +about how we handle PRs. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/.gitignore b/preprocess/humanparsing/mhp_extension/detectron2/.gitignore new file mode 100644 index 0000000..e85df4c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/.gitignore @@ -0,0 +1,46 @@ +# output dir +output +instant_test_output +inference_test_output + + +*.jpg +*.png +*.txt +*.json +*.diff + +# compilation and distribution +__pycache__ +_ext +*.pyc +*.so +detectron2.egg-info/ +build/ +dist/ +wheels/ + +# pytorch/python/numpy formats +*.pth +*.pkl +*.npy + +# ipython/jupyter notebooks +*.ipynb +**/.ipynb_checkpoints/ + +# Editor temporaries +*.swn +*.swo +*.swp +*~ + +# editor settings +.idea +.vscode + +# project dirs +/detectron2/model_zoo/configs +/datasets +/projects/*/datasets +/models diff --git a/preprocess/humanparsing/mhp_extension/detectron2/GETTING_STARTED.md b/preprocess/humanparsing/mhp_extension/detectron2/GETTING_STARTED.md new file mode 100644 index 0000000..acaf13f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/GETTING_STARTED.md @@ -0,0 +1,79 @@ +## Getting Started with Detectron2 + +This document provides a brief intro of the usage of builtin command-line tools in detectron2. + +For a tutorial that involves actual coding with the API, +see our [Colab Notebook](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5) +which covers how to run inference with an +existing model, and how to train a builtin model on a custom dataset. + +For more advanced tutorials, refer to our [documentation](https://detectron2.readthedocs.io/tutorials/extend.html). + + +### Inference Demo with Pre-trained Models + +1. Pick a model and its config file from + [model zoo](MODEL_ZOO.md), + for example, `mask_rcnn_R_50_FPN_3x.yaml`. +2. We provide `demo.py` that is able to run builtin standard models. Run it with: +``` +cd demo/ +python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ + --input input1.jpg input2.jpg \ + [--other-options] + --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl +``` +The configs are made for training, therefore we need to specify `MODEL.WEIGHTS` to a model from model zoo for evaluation. +This command will run the inference and show visualizations in an OpenCV window. + +For details of the command line arguments, see `demo.py -h` or look at its source code +to understand its behavior. Some common arguments are: +* To run __on your webcam__, replace `--input files` with `--webcam`. +* To run __on a video__, replace `--input files` with `--video-input video.mp4`. +* To run __on cpu__, add `MODEL.DEVICE cpu` after `--opts`. +* To save outputs to a directory (for images) or a file (for webcam or video), use `--output`. + + +### Training & Evaluation in Command Line + +We provide a script in "tools/{,plain_}train_net.py", that is made to train +all the configs provided in detectron2. +You may want to use it as a reference to write your own training script. + +To train a model with "train_net.py", first +setup the corresponding datasets following +[datasets/README.md](./datasets/README.md), +then run: +``` +cd tools/ +./train_net.py --num-gpus 8 \ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml +``` + +The configs are made for 8-GPU training. +To train on 1 GPU, you may need to [change some parameters](https://arxiv.org/abs/1706.02677), e.g.: +``` +./train_net.py \ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \ + --num-gpus 1 SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025 +``` + +For most models, CPU training is not supported. + +To evaluate a model's performance, use +``` +./train_net.py \ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \ + --eval-only MODEL.WEIGHTS /path/to/checkpoint_file +``` +For more options, see `./train_net.py -h`. + +### Use Detectron2 APIs in Your Code + +See our [Colab Notebook](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5) +to learn how to use detectron2 APIs to: +1. run inference with an existing model +2. train a builtin model on a custom dataset + +See [detectron2/projects](https://github.com/facebookresearch/detectron2/tree/master/projects) +for more ways to build your project on detectron2. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/INSTALL.md b/preprocess/humanparsing/mhp_extension/detectron2/INSTALL.md new file mode 100644 index 0000000..3985f8a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/INSTALL.md @@ -0,0 +1,184 @@ +## Installation + +Our [Colab Notebook](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5) +has step-by-step instructions that install detectron2. +The [Dockerfile](docker) +also installs detectron2 with a few simple commands. + +### Requirements +- Linux or macOS with Python ≥ 3.6 +- PyTorch ≥ 1.4 +- [torchvision](https://github.com/pytorch/vision/) that matches the PyTorch installation. + You can install them together at [pytorch.org](https://pytorch.org) to make sure of this. +- OpenCV, optional, needed by demo and visualization +- pycocotools: `pip install cython; pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'` + + +### Build Detectron2 from Source + +gcc & g++ ≥ 5 are required. [ninja](https://ninja-build.org/) is recommended for faster build. +After having them, run: +``` +python -m pip install 'git+https://github.com/facebookresearch/detectron2.git' +# (add --user if you don't have permission) + +# Or, to install it from a local clone: +git clone https://github.com/facebookresearch/detectron2.git +python -m pip install -e detectron2 + +# Or if you are on macOS +# CC=clang CXX=clang++ python -m pip install -e . +``` + +To __rebuild__ detectron2 that's built from a local clone, use `rm -rf build/ **/*.so` to clean the +old build first. You often need to rebuild detectron2 after reinstalling PyTorch. + +### Install Pre-Built Detectron2 (Linux only) +``` +# for CUDA 10.1: +python -m pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/index.html +``` +You can replace cu101 with "cu{100,92}" or "cpu". + +Note that: +1. Such installation has to be used with certain version of official PyTorch release. + See [releases](https://github.com/facebookresearch/detectron2/releases) for requirements. + It will not work with a different version of PyTorch or a non-official build of PyTorch. +2. Such installation is out-of-date w.r.t. master branch of detectron2. It may not be + compatible with the master branch of a research project that uses detectron2 (e.g. those in + [projects](projects) or [meshrcnn](https://github.com/facebookresearch/meshrcnn/)). + +### Common Installation Issues + +If you met issues using the pre-built detectron2, please uninstall it and try building it from source. + +Click each issue for its solutions: + +

    + +Undefined torch/aten/caffe2 symbols, or segmentation fault immediately when running the library. + +
    + +This usually happens when detectron2 or torchvision is not +compiled with the version of PyTorch you're running. + +Pre-built torchvision or detectron2 has to work with the corresponding official release of pytorch. +If the error comes from a pre-built torchvision, uninstall torchvision and pytorch and reinstall them +following [pytorch.org](http://pytorch.org). So the versions will match. + +If the error comes from a pre-built detectron2, check [release notes](https://github.com/facebookresearch/detectron2/releases) +to see the corresponding pytorch version required for each pre-built detectron2. + +If the error comes from detectron2 or torchvision that you built manually from source, +remove files you built (`build/`, `**/*.so`) and rebuild it so it can pick up the version of pytorch currently in your environment. + +If you cannot resolve this problem, please include the output of `gdb -ex "r" -ex "bt" -ex "quit" --args python -m detectron2.utils.collect_env` +in your issue. +
    + +
    + +Undefined C++ symbols (e.g. `GLIBCXX`) or C++ symbols not found. + +
    +Usually it's because the library is compiled with a newer C++ compiler but run with an old C++ runtime. + +This often happens with old anaconda. +Try `conda update libgcc`. Then rebuild detectron2. + +The fundamental solution is to run the code with proper C++ runtime. +One way is to use `LD_PRELOAD=/path/to/libstdc++.so`. + +
    + +
    + +"Not compiled with GPU support" or "Detectron2 CUDA Compiler: not available". + +
    +CUDA is not found when building detectron2. +You should make sure + +``` +python -c 'import torch; from torch.utils.cpp_extension import CUDA_HOME; print(torch.cuda.is_available(), CUDA_HOME)' +``` + +print valid outputs at the time you build detectron2. + +Most models can run inference (but not training) without GPU support. To use CPUs, set `MODEL.DEVICE='cpu'` in the config. +
    + +
    + +"invalid device function" or "no kernel image is available for execution". + +
    +Two possibilities: + +* You build detectron2 with one version of CUDA but run it with a different version. + + To check whether it is the case, + use `python -m detectron2.utils.collect_env` to find out inconsistent CUDA versions. + In the output of this command, you should expect "Detectron2 CUDA Compiler", "CUDA_HOME", "PyTorch built with - CUDA" + to contain cuda libraries of the same version. + + When they are inconsistent, + you need to either install a different build of PyTorch (or build by yourself) + to match your local CUDA installation, or install a different version of CUDA to match PyTorch. + +* Detectron2 or PyTorch/torchvision is not built for the correct GPU architecture (compute compatibility). + + The GPU architecture for PyTorch/detectron2/torchvision is available in the "architecture flags" in + `python -m detectron2.utils.collect_env`. + + The GPU architecture flags of detectron2/torchvision by default matches the GPU model detected + during compilation. This means the compiled code may not work on a different GPU model. + To overwrite the GPU architecture for detectron2/torchvision, use `TORCH_CUDA_ARCH_LIST` environment variable during compilation. + + For example, `export TORCH_CUDA_ARCH_LIST=6.0,7.0` makes it compile for both P100s and V100s. + Visit [developer.nvidia.com/cuda-gpus](https://developer.nvidia.com/cuda-gpus) to find out + the correct compute compatibility number for your device. + +
    + +
    + +Undefined CUDA symbols; cannot open libcudart.so; other nvcc failures. + +
    +The version of NVCC you use to build detectron2 or torchvision does +not match the version of CUDA you are running with. +This often happens when using anaconda's CUDA runtime. + +Use `python -m detectron2.utils.collect_env` to find out inconsistent CUDA versions. +In the output of this command, you should expect "Detectron2 CUDA Compiler", "CUDA_HOME", "PyTorch built with - CUDA" +to contain cuda libraries of the same version. + +When they are inconsistent, +you need to either install a different build of PyTorch (or build by yourself) +to match your local CUDA installation, or install a different version of CUDA to match PyTorch. +
    + + +
    + +"ImportError: cannot import name '_C'". + +
    +Please build and install detectron2 following the instructions above. + +If you are running code from detectron2's root directory, `cd` to a different one. +Otherwise you may not import the code that you installed. +
    + +
    + +ONNX conversion segfault after some "TraceWarning". + +
    +The ONNX package is compiled with too old compiler. + +Please build and install ONNX from its source code using a compiler +whose version is closer to what's used by PyTorch (available in `torch.__config__.show()`). +
    diff --git a/preprocess/humanparsing/mhp_extension/detectron2/LICENSE b/preprocess/humanparsing/mhp_extension/detectron2/LICENSE new file mode 100644 index 0000000..d483689 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/LICENSE @@ -0,0 +1,201 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions: + +(a) You must give any other recipients of the Work or +Derivative Works a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright 2019 - present, Facebook, Inc + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/MODEL_ZOO.md b/preprocess/humanparsing/mhp_extension/detectron2/MODEL_ZOO.md new file mode 100644 index 0000000..07b81ff --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/MODEL_ZOO.md @@ -0,0 +1,903 @@ +# Detectron2 Model Zoo and Baselines + +## Introduction + +This file documents a large collection of baselines trained +with detectron2 in Sep-Oct, 2019. +All numbers were obtained on [Big Basin](https://engineering.fb.com/data-center-engineering/introducing-big-basin-our-next-generation-ai-hardware/) +servers with 8 NVIDIA V100 GPUs & NVLink. The software in use were PyTorch 1.3, CUDA 9.2, cuDNN 7.4.2 or 7.6.3. +You can access these models from code using [detectron2.model_zoo](https://detectron2.readthedocs.io/modules/model_zoo.html) APIs. + +In addition to these official baseline models, you can find more models in [projects/](projects/). + +#### How to Read the Tables +* The "Name" column contains a link to the config file. Running `tools/train_net.py` with this config file + and 8 GPUs will reproduce the model. +* Training speed is averaged across the entire training. + We keep updating the speed with latest version of detectron2/pytorch/etc., + so they might be different from the `metrics` file. + Training speed for multi-machine jobs is not provided. +* Inference speed is measured by `tools/train_net.py --eval-only`, or [inference_on_dataset()](https://detectron2.readthedocs.io/modules/evaluation.html#detectron2.evaluation.inference_on_dataset), + with batch size 1 in detectron2 directly. + Measuring it with your own code will likely introduce other overhead. + Actual deployment in production should in general be faster than the given inference + speed due to more optimizations. +* The *model id* column is provided for ease of reference. + To check downloaded file integrity, any model on this page contains its md5 prefix in its file name. +* Training curves and other statistics can be found in `metrics` for each model. + +#### Common Settings for COCO Models +* All COCO models were trained on `train2017` and evaluated on `val2017`. +* The default settings are __not directly comparable__ with Detectron's standard settings. + For example, our default training data augmentation uses scale jittering in addition to horizontal flipping. + + To make fair comparisons with Detectron's settings, see + [Detectron1-Comparisons](configs/Detectron1-Comparisons/) for accuracy comparison, + and [benchmarks](https://detectron2.readthedocs.io/notes/benchmarks.html) + for speed comparison. +* For Faster/Mask R-CNN, we provide baselines based on __3 different backbone combinations__: + * __FPN__: Use a ResNet+FPN backbone with standard conv and FC heads for mask and box prediction, + respectively. It obtains the best + speed/accuracy tradeoff, but the other two are still useful for research. + * __C4__: Use a ResNet conv4 backbone with conv5 head. The original baseline in the Faster R-CNN paper. + * __DC5__ (Dilated-C5): Use a ResNet conv5 backbone with dilations in conv5, and standard conv and FC heads + for mask and box prediction, respectively. + This is used by the Deformable ConvNet paper. +* Most models are trained with the 3x schedule (~37 COCO epochs). + Although 1x models are heavily under-trained, we provide some ResNet-50 models with the 1x (~12 COCO epochs) + training schedule for comparison when doing quick research iteration. + +#### ImageNet Pretrained Models + +We provide backbone models pretrained on ImageNet-1k dataset. +These models have __different__ format from those provided in Detectron: we do not fuse BatchNorm into an affine layer. +* [R-50.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/MSRA/R-50.pkl): converted copy of [MSRA's original ResNet-50](https://github.com/KaimingHe/deep-residual-networks) model. +* [R-101.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/MSRA/R-101.pkl): converted copy of [MSRA's original ResNet-101](https://github.com/KaimingHe/deep-residual-networks) model. +* [X-101-32x8d.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/FAIR/X-101-32x8d.pkl): ResNeXt-101-32x8d model trained with Caffe2 at FB. + +Pretrained models in Detectron's format can still be used. For example: +* [X-152-32x8d-IN5k.pkl](https://dl.fbaipublicfiles.com/detectron/ImageNetPretrained/25093814/X-152-32x8d-IN5k.pkl): + ResNeXt-152-32x8d model trained on ImageNet-5k with Caffe2 at FB (see ResNeXt paper for details on ImageNet-5k). +* [R-50-GN.pkl](https://dl.fbaipublicfiles.com/detectron/ImageNetPretrained/47261647/R-50-GN.pkl): + ResNet-50 with Group Normalization. +* [R-101-GN.pkl](https://dl.fbaipublicfiles.com/detectron/ImageNetPretrained/47592356/R-101-GN.pkl): + ResNet-101 with Group Normalization. + +Torchvision's ResNet models can be used after converted by [this script](tools/convert-torchvision-to-d2.py). + +#### License + +All models available for download through this document are licensed under the +[Creative Commons Attribution-ShareAlike 3.0 license](https://creativecommons.org/licenses/by-sa/3.0/). + +### COCO Object Detection Baselines + +#### Faster R-CNN: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    model iddownload
    R50-C41x0.5510.1024.835.7137257644model | metrics
    R50-DC51x0.3800.0685.037.3137847829model | metrics
    R50-FPN1x0.2100.0383.037.9137257794model | metrics
    R50-C43x0.5430.1044.838.4137849393model | metrics
    R50-DC53x0.3780.0705.039.0137849425model | metrics
    R50-FPN3x0.2090.0383.040.2137849458model | metrics
    R101-C43x0.6190.1395.941.1138204752model | metrics
    R101-DC53x0.4520.0866.140.6138204841model | metrics
    R101-FPN3x0.2860.0514.142.0137851257model | metrics
    X101-FPN3x0.6380.0986.743.0139173657model | metrics
    + +#### RetinaNet: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    model iddownload
    R501x0.2000.0553.936.5137593951model | metrics
    R503x0.2010.0553.937.9137849486model | metrics
    R1013x0.2800.0685.139.9138363263model | metrics
    + +#### RPN & Fast R-CNN: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    prop.
    AR
    model iddownload
    RPN R50-C41x0.1300.0341.551.6137258005model | metrics
    RPN R50-FPN1x0.1860.0322.758.0137258492model | metrics
    Fast R-CNN R50-FPN1x0.1400.0292.637.8137635226model | metrics
    + +### COCO Instance Segmentation Baselines with Mask R-CNN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    mask
    AP
    model iddownload
    R50-C41x0.5840.1105.236.832.2137259246model | metrics
    R50-DC51x0.4710.0766.538.334.2137260150model | metrics
    R50-FPN1x0.2610.0433.438.635.2137260431model | metrics
    R50-C43x0.5750.1115.239.834.4137849525model | metrics
    R50-DC53x0.4700.0766.540.035.9137849551model | metrics
    R50-FPN3x0.2610.0433.441.037.2137849600model | metrics
    R101-C43x0.6520.1456.342.636.7138363239model | metrics
    R101-DC53x0.5450.0927.641.937.3138363294model | metrics
    R101-FPN3x0.3400.0564.642.938.6138205316model | metrics
    X101-FPN3x0.6900.1037.244.339.5139653917model | metrics
    + +### COCO Person Keypoint Detection Baselines with Keypoint R-CNN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    kp.
    AP
    model iddownload
    R50-FPN1x0.3150.0725.053.664.0137261548model | metrics
    R50-FPN3x0.3160.0665.055.465.5137849621model | metrics
    R101-FPN3x0.3900.0766.156.466.1138363331model | metrics
    X101-FPN3x0.7380.1218.757.366.0139686956model | metrics
    + +### COCO Panoptic Segmentation Baselines with Panoptic FPN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    mask
    AP
    PQmodel iddownload
    R50-FPN1x0.3040.0534.837.634.739.4139514544model | metrics
    R50-FPN3x0.3020.0534.840.036.541.5139514569model | metrics
    R101-FPN3x0.3920.0666.042.438.543.0139514519model | metrics
    + + +### LVIS Instance Segmentation Baselines with Mask R-CNN + +Mask R-CNN baselines on the [LVIS dataset](https://lvisdataset.org), v0.5. +These baselines are described in Table 3(c) of the [LVIS paper](https://arxiv.org/abs/1908.03195). + +NOTE: the 1x schedule here has the same amount of __iterations__ as the COCO 1x baselines. +They are roughly 24 epochs of LVISv0.5 data. +The final results of these configs have large variance across different runs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    mask
    AP
    model iddownload
    R50-FPN1x0.2920.1077.123.624.4144219072model | metrics
    R101-FPN1x0.3710.1147.825.625.9144219035model | metrics
    X101-FPN1x0.7120.15110.226.727.1144219108model | metrics
    + + + +### Cityscapes & Pascal VOC Baselines + +Simple baselines for +* Mask R-CNN on Cityscapes instance segmentation (initialized from COCO pre-training, then trained on Cityscapes fine annotations only) +* Faster R-CNN on PASCAL VOC object detection (trained on VOC 2007 train+val + VOC 2012 train+val, tested on VOC 2007 using 11-point interpolated AP) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Nametrain
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    box
    AP50
    mask
    AP
    model iddownload
    R50-FPN, Cityscapes0.2400.0784.436.5142423278model | metrics
    R50-C4, VOC0.5370.0814.851.980.3142202221model | metrics
    + + + +### Other Settings + +Ablations for Deformable Conv and Cascade R-CNN: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    mask
    AP
    model iddownload
    Baseline R50-FPN1x0.2610.0433.438.635.2137260431model | metrics
    Deformable Conv1x0.3420.0483.541.537.5138602867model | metrics
    Cascade R-CNN1x0.3170.0524.042.136.4138602847model | metrics
    Baseline R50-FPN3x0.2610.0433.441.037.2137849600model | metrics
    Deformable Conv3x0.3490.0473.542.738.5144998336model | metrics
    Cascade R-CNN3x0.3280.0534.044.338.5144998488model | metrics
    + + +Ablations for normalization methods, and a few models trained from scratch following [Rethinking ImageNet Pre-training](https://arxiv.org/abs/1811.08883). +(Note: The baseline uses `2fc` head while the others use [`4conv1fc` head](https://arxiv.org/abs/1803.08494)) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    mask
    AP
    model iddownload
    Baseline R50-FPN3x0.2610.0433.441.037.2137849600model | metrics
    GN3x0.3560.0697.342.638.6138602888model | metrics
    SyncBN3x0.3710.0535.541.937.8169527823model | metrics
    GN (from scratch)3x0.4000.0699.839.936.6138602908model | metrics
    GN (from scratch)9xN/A0.0709.843.739.6183808979model | metrics
    SyncBN (from scratch)9xN/A0.0557.243.639.3184226666model | metrics
    + + +A few very large models trained for a long time, for demo purposes. They are trained using multiple machines: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Nameinference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    mask
    AP
    PQmodel iddownload
    Panoptic FPN R1010.10711.447.441.346.1139797668model | metrics
    Mask R-CNN X1520.24215.150.244.018131413model | metrics
    above + test-time aug.51.945.9
    diff --git a/preprocess/humanparsing/mhp_extension/detectron2/README.md b/preprocess/humanparsing/mhp_extension/detectron2/README.md new file mode 100644 index 0000000..1fbb95b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/README.md @@ -0,0 +1,56 @@ + + +Detectron2 is Facebook AI Research's next generation software system +that implements state-of-the-art object detection algorithms. +It is a ground-up rewrite of the previous version, +[Detectron](https://github.com/facebookresearch/Detectron/), +and it originates from [maskrcnn-benchmark](https://github.com/facebookresearch/maskrcnn-benchmark/). + +
    + +
    + +### What's New +* It is powered by the [PyTorch](https://pytorch.org) deep learning framework. +* Includes more features such as panoptic segmentation, densepose, Cascade R-CNN, rotated bounding boxes, etc. +* Can be used as a library to support [different projects](projects/) on top of it. + We'll open source more research projects in this way. +* It [trains much faster](https://detectron2.readthedocs.io/notes/benchmarks.html). + +See our [blog post](https://ai.facebook.com/blog/-detectron2-a-pytorch-based-modular-object-detection-library-/) +to see more demos and learn about detectron2. + +## Installation + +See [INSTALL.md](INSTALL.md). + +## Quick Start + +See [GETTING_STARTED.md](GETTING_STARTED.md), +or the [Colab Notebook](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5). + +Learn more at our [documentation](https://detectron2.readthedocs.org). +And see [projects/](projects/) for some projects that are built on top of detectron2. + +## Model Zoo and Baselines + +We provide a large set of baseline results and trained models available for download in the [Detectron2 Model Zoo](MODEL_ZOO.md). + + +## License + +Detectron2 is released under the [Apache 2.0 license](LICENSE). + +## Citing Detectron2 + +If you use Detectron2 in your research or wish to refer to the baseline results published in the [Model Zoo](MODEL_ZOO.md), please use the following BibTeX entry. + +```BibTeX +@misc{wu2019detectron2, + author = {Yuxin Wu and Alexander Kirillov and Francisco Massa and + Wan-Yen Lo and Ross Girshick}, + title = {Detectron2}, + howpublished = {\url{https://github.com/facebookresearch/detectron2}}, + year = {2019} +} +``` diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-C4.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-C4.yaml new file mode 100644 index 0000000..fbf34a0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-C4.yaml @@ -0,0 +1,18 @@ +MODEL: + META_ARCHITECTURE: "GeneralizedRCNN" + RPN: + PRE_NMS_TOPK_TEST: 6000 + POST_NMS_TOPK_TEST: 1000 + ROI_HEADS: + NAME: "Res5ROIHeads" +DATASETS: + TRAIN: ("coco_2017_train",) + TEST: ("coco_2017_val",) +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.02 + STEPS: (60000, 80000) + MAX_ITER: 90000 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-DilatedC5.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-DilatedC5.yaml new file mode 100644 index 0000000..c0d6d16 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-DilatedC5.yaml @@ -0,0 +1,31 @@ +MODEL: + META_ARCHITECTURE: "GeneralizedRCNN" + RESNETS: + OUT_FEATURES: ["res5"] + RES5_DILATION: 2 + RPN: + IN_FEATURES: ["res5"] + PRE_NMS_TOPK_TEST: 6000 + POST_NMS_TOPK_TEST: 1000 + ROI_HEADS: + NAME: "StandardROIHeads" + IN_FEATURES: ["res5"] + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_FC: 2 + POOLER_RESOLUTION: 7 + ROI_MASK_HEAD: + NAME: "MaskRCNNConvUpsampleHead" + NUM_CONV: 4 + POOLER_RESOLUTION: 14 +DATASETS: + TRAIN: ("coco_2017_train",) + TEST: ("coco_2017_val",) +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.02 + STEPS: (60000, 80000) + MAX_ITER: 90000 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-FPN.yaml new file mode 100644 index 0000000..3e020f2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RCNN-FPN.yaml @@ -0,0 +1,42 @@ +MODEL: + META_ARCHITECTURE: "GeneralizedRCNN" + BACKBONE: + NAME: "build_resnet_fpn_backbone" + RESNETS: + OUT_FEATURES: ["res2", "res3", "res4", "res5"] + FPN: + IN_FEATURES: ["res2", "res3", "res4", "res5"] + ANCHOR_GENERATOR: + SIZES: [[32], [64], [128], [256], [512]] # One size for each in feature map + ASPECT_RATIOS: [[0.5, 1.0, 2.0]] # Three aspect ratios (same for all in feature maps) + RPN: + IN_FEATURES: ["p2", "p3", "p4", "p5", "p6"] + PRE_NMS_TOPK_TRAIN: 2000 # Per FPN level + PRE_NMS_TOPK_TEST: 1000 # Per FPN level + # Detectron1 uses 2000 proposals per-batch, + # (See "modeling/rpn/rpn_outputs.py" for details of this legacy issue) + # which is approximately 1000 proposals per-image since the default batch size for FPN is 2. + POST_NMS_TOPK_TRAIN: 1000 + POST_NMS_TOPK_TEST: 1000 + ROI_HEADS: + NAME: "StandardROIHeads" + IN_FEATURES: ["p2", "p3", "p4", "p5"] + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_FC: 2 + POOLER_RESOLUTION: 7 + ROI_MASK_HEAD: + NAME: "MaskRCNNConvUpsampleHead" + NUM_CONV: 4 + POOLER_RESOLUTION: 14 +DATASETS: + TRAIN: ("coco_2017_train",) + TEST: ("coco_2017_val",) +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.02 + STEPS: (60000, 80000) + MAX_ITER: 90000 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RetinaNet.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RetinaNet.yaml new file mode 100644 index 0000000..12ec9d2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Base-RetinaNet.yaml @@ -0,0 +1,24 @@ +MODEL: + META_ARCHITECTURE: "RetinaNet" + BACKBONE: + NAME: "build_retinanet_resnet_fpn_backbone" + RESNETS: + OUT_FEATURES: ["res3", "res4", "res5"] + ANCHOR_GENERATOR: + SIZES: !!python/object/apply:eval ["[[x, x * 2**(1.0/3), x * 2**(2.0/3) ] for x in [32, 64, 128, 256, 512 ]]"] + FPN: + IN_FEATURES: ["res3", "res4", "res5"] + RETINANET: + IOU_THRESHOLDS: [0.4, 0.5] + IOU_LABELS: [0, -1, 1] +DATASETS: + TRAIN: ("coco_2017_train",) + TEST: ("coco_2017_val",) +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.01 # Note that RetinaNet uses a different default learning rate + STEPS: (60000, 80000) + MAX_ITER: 90000 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..773ac10 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml @@ -0,0 +1,17 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + LOAD_PROPOSALS: True + RESNETS: + DEPTH: 50 + PROPOSAL_GENERATOR: + NAME: "PrecomputedProposals" +DATASETS: + TRAIN: ("coco_2017_train",) + PROPOSAL_FILES_TRAIN: ("detectron2://COCO-Detection/rpn_R_50_FPN_1x/137258492/coco_2017_train_box_proposals_21bc3a.pkl", ) + TEST: ("coco_2017_val",) + PROPOSAL_FILES_TEST: ("detectron2://COCO-Detection/rpn_R_50_FPN_1x/137258492/coco_2017_val_box_proposals_ee0dad.pkl", ) +DATALOADER: + # proposals are part of the dataset_dicts, and take a lot of RAM + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_C4_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_C4_3x.yaml new file mode 100644 index 0000000..db142cd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_C4_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: False + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_DC5_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_DC5_3x.yaml new file mode 100644 index 0000000..bceb6b3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_DC5_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-DilatedC5.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: False + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml new file mode 100644 index 0000000..57a098f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: False + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_1x.yaml new file mode 100644 index 0000000..f961301 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_1x.yaml @@ -0,0 +1,6 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_3x.yaml new file mode 100644 index 0000000..bc51bce --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_C4_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_1x.yaml new file mode 100644 index 0000000..0fe96f5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_1x.yaml @@ -0,0 +1,6 @@ +_BASE_: "../Base-RCNN-DilatedC5.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_3x.yaml new file mode 100644 index 0000000..33fadeb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_DC5_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-DilatedC5.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..3262019 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml @@ -0,0 +1,6 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml new file mode 100644 index 0000000..4139518 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml new file mode 100644 index 0000000..9c9b5ab --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml @@ -0,0 +1,13 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + MASK_ON: False + WEIGHTS: "detectron2://ImageNetPretrained/FAIR/X-101-32x8d.pkl" + PIXEL_STD: [57.375, 57.120, 58.395] + RESNETS: + STRIDE_IN_1X1: False # this is a C2 model + NUM_GROUPS: 32 + WIDTH_PER_GROUP: 8 + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_101_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_101_FPN_3x.yaml new file mode 100644 index 0000000..4abb1b9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_101_FPN_3x.yaml @@ -0,0 +1,8 @@ +_BASE_: "../Base-RetinaNet.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_1x.yaml new file mode 100644 index 0000000..4a24ce3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_1x.yaml @@ -0,0 +1,5 @@ +_BASE_: "../Base-RetinaNet.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_3x.yaml new file mode 100644 index 0000000..3b5412d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/retinanet_R_50_FPN_3x.yaml @@ -0,0 +1,8 @@ +_BASE_: "../Base-RetinaNet.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_C4_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_C4_1x.yaml new file mode 100644 index 0000000..e048211 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_C4_1x.yaml @@ -0,0 +1,10 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + META_ARCHITECTURE: "ProposalNetwork" + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 + RPN: + PRE_NMS_TOPK_TEST: 12000 + POST_NMS_TOPK_TEST: 2000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..dc9c952 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Detection/rpn_R_50_FPN_1x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "ProposalNetwork" + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 + RPN: + POST_NMS_TOPK_TEST: 2000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_C4_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_C4_3x.yaml new file mode 100644 index 0000000..1a94cc4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_C4_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: True + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_DC5_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_DC5_3x.yaml new file mode 100644 index 0000000..67b70cf --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_DC5_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-DilatedC5.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: True + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_FPN_3x.yaml new file mode 100644 index 0000000..1935a30 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_101_FPN_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: True + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x.yaml new file mode 100644 index 0000000..a9aeb4e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x.yaml @@ -0,0 +1,6 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x.yaml new file mode 100644 index 0000000..38ed867 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml new file mode 100644 index 0000000..b13eefa --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml @@ -0,0 +1,6 @@ +_BASE_: "../Base-RCNN-DilatedC5.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x.yaml new file mode 100644 index 0000000..d401016 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-DilatedC5.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..d50fb86 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml @@ -0,0 +1,6 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml new file mode 100644 index 0000000..be7d06b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml new file mode 100644 index 0000000..d14c63f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml @@ -0,0 +1,13 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + MASK_ON: True + WEIGHTS: "detectron2://ImageNetPretrained/FAIR/X-101-32x8d.pkl" + PIXEL_STD: [57.375, 57.120, 58.395] + RESNETS: + STRIDE_IN_1X1: False # this is a C2 model + NUM_GROUPS: 32 + WIDTH_PER_GROUP: 8 + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/Base-Keypoint-RCNN-FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/Base-Keypoint-RCNN-FPN.yaml new file mode 100644 index 0000000..4e03944 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/Base-Keypoint-RCNN-FPN.yaml @@ -0,0 +1,15 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + KEYPOINT_ON: True + ROI_HEADS: + NUM_CLASSES: 1 + ROI_BOX_HEAD: + SMOOTH_L1_BETA: 0.5 # Keypoint AP degrades (though box AP improves) when using plain L1 loss + RPN: + # Detectron1 uses 2000 proposals per-batch, but this option is per-image in detectron2. + # 1000 proposals per-image is found to hurt box AP. + # Therefore we increase it to 1500 per-image. + POST_NMS_TOPK_TRAIN: 1500 +DATASETS: + TRAIN: ("keypoints_coco_2017_train",) + TEST: ("keypoints_coco_2017_val",) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml new file mode 100644 index 0000000..9309535 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml @@ -0,0 +1,8 @@ +_BASE_: "Base-Keypoint-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..7bf85cf --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_1x.yaml @@ -0,0 +1,5 @@ +_BASE_: "Base-Keypoint-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml new file mode 100644 index 0000000..a07f243 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml @@ -0,0 +1,8 @@ +_BASE_: "Base-Keypoint-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_X_101_32x8d_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_X_101_32x8d_FPN_3x.yaml new file mode 100644 index 0000000..d4bfa20 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-Keypoints/keypoint_rcnn_X_101_32x8d_FPN_3x.yaml @@ -0,0 +1,12 @@ +_BASE_: "Base-Keypoint-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/FAIR/X-101-32x8d.pkl" + PIXEL_STD: [57.375, 57.120, 58.395] + RESNETS: + STRIDE_IN_1X1: False # this is a C2 model + NUM_GROUPS: 32 + WIDTH_PER_GROUP: 8 + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/Base-Panoptic-FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/Base-Panoptic-FPN.yaml new file mode 100644 index 0000000..755c120 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/Base-Panoptic-FPN.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "PanopticFPN" + MASK_ON: True + SEM_SEG_HEAD: + LOSS_WEIGHT: 0.5 +DATASETS: + TRAIN: ("coco_2017_train_panoptic_separated",) + TEST: ("coco_2017_val_panoptic_separated",) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml new file mode 100644 index 0000000..0e01f6f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml @@ -0,0 +1,8 @@ +_BASE_: "Base-Panoptic-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_1x.yaml new file mode 100644 index 0000000..6afa2c1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_1x.yaml @@ -0,0 +1,5 @@ +_BASE_: "Base-Panoptic-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml new file mode 100644 index 0000000..b956b3f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml @@ -0,0 +1,8 @@ +_BASE_: "Base-Panoptic-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Cityscapes/mask_rcnn_R_50_FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Cityscapes/mask_rcnn_R_50_FPN.yaml new file mode 100644 index 0000000..1a7aaeb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Cityscapes/mask_rcnn_R_50_FPN.yaml @@ -0,0 +1,27 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + # WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + # For better, more stable performance initialize from COCO + WEIGHTS: "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl" + MASK_ON: True + ROI_HEADS: + NUM_CLASSES: 8 +# This is similar to the setting used in Mask R-CNN paper, Appendix A +# But there are some differences, e.g., we did not initialize the output +# layer using the corresponding classes from COCO +INPUT: + MIN_SIZE_TRAIN: (800, 832, 864, 896, 928, 960, 992, 1024) + MIN_SIZE_TRAIN_SAMPLING: "choice" + MIN_SIZE_TEST: 1024 + MAX_SIZE_TRAIN: 2048 + MAX_SIZE_TEST: 2048 +DATASETS: + TRAIN: ("cityscapes_fine_instance_seg_train",) + TEST: ("cityscapes_fine_instance_seg_val",) +SOLVER: + BASE_LR: 0.01 + STEPS: (18000,) + MAX_ITER: 24000 + IMS_PER_BATCH: 8 +TEST: + EVAL_PERIOD: 8000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/README.md b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/README.md new file mode 100644 index 0000000..a90ed9e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/README.md @@ -0,0 +1,83 @@ + +Detectron2 model zoo's experimental settings and a few implementation details are different from Detectron. + +The differences in implementation details are shared in +[Compatibility with Other Libraries](../../docs/notes/compatibility.md). + +The differences in model zoo's experimental settings include: +* Use scale augmentation during training. This improves AP with lower training cost. +* Use L1 loss instead of smooth L1 loss for simplicity. This sometimes improves box AP but may + affect other AP. +* Use `POOLER_SAMPLING_RATIO=0` instead of 2. This does not significantly affect AP. +* Use `ROIAlignV2`. This does not significantly affect AP. + +In this directory, we provide a few configs that __do not__ have the above changes. +They mimic Detectron's behavior as close as possible, +and provide a fair comparison of accuracy and speed against Detectron. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    mask
    AP
    kp.
    AP
    model iddownload
    Faster R-CNN1x0.2190.0383.136.9137781054model | metrics
    Keypoint R-CNN1x0.3130.0715.053.164.2137781195model | metrics
    Mask R-CNN1x0.2730.0433.437.834.9137781281model | metrics
    + +## Comparisons: + +* Faster R-CNN: Detectron's AP is 36.7, similar to ours. +* Keypoint R-CNN: Detectron's AP is box 53.6, keypoint 64.2. Fixing a Detectron's + [bug](https://github.com/facebookresearch/Detectron/issues/459) lead to a drop in box AP, and can be + compensated back by some parameter tuning. +* Mask R-CNN: Detectron's AP is box 37.7, mask 33.9. We're 1 AP better in mask AP, due to more correct implementation. + +For speed comparison, see [benchmarks](https://detectron2.readthedocs.io/notes/benchmarks.html). diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/faster_rcnn_R_50_FPN_noaug_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/faster_rcnn_R_50_FPN_noaug_1x.yaml new file mode 100644 index 0000000..6ce77f1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/faster_rcnn_R_50_FPN_noaug_1x.yaml @@ -0,0 +1,17 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 + # Detectron1 uses smooth L1 loss with some magic beta values. + # The defaults are changed to L1 loss in Detectron2. + RPN: + SMOOTH_L1_BETA: 0.1111 + ROI_BOX_HEAD: + SMOOTH_L1_BETA: 1.0 + POOLER_SAMPLING_RATIO: 2 + POOLER_TYPE: "ROIAlign" +INPUT: + # no scale augmentation + MIN_SIZE_TRAIN: (800, ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/keypoint_rcnn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/keypoint_rcnn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..aacf868 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/keypoint_rcnn_R_50_FPN_1x.yaml @@ -0,0 +1,27 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + KEYPOINT_ON: True + RESNETS: + DEPTH: 50 + ROI_HEADS: + NUM_CLASSES: 1 + ROI_KEYPOINT_HEAD: + POOLER_RESOLUTION: 14 + POOLER_SAMPLING_RATIO: 2 + POOLER_TYPE: "ROIAlign" + # Detectron1 uses smooth L1 loss with some magic beta values. + # The defaults are changed to L1 loss in Detectron2. + ROI_BOX_HEAD: + SMOOTH_L1_BETA: 1.0 + POOLER_SAMPLING_RATIO: 2 + POOLER_TYPE: "ROIAlign" + RPN: + SMOOTH_L1_BETA: 0.1111 + # Detectron1 uses 2000 proposals per-batch, but this option is per-image in detectron2 + # 1000 proposals per-image is found to hurt box AP. + # Therefore we increase it to 1500 per-image. + POST_NMS_TOPK_TRAIN: 1500 +DATASETS: + TRAIN: ("keypoints_coco_2017_train",) + TEST: ("keypoints_coco_2017_val",) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml new file mode 100644 index 0000000..4ea86a8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml @@ -0,0 +1,20 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + # Detectron1 uses smooth L1 loss with some magic beta values. + # The defaults are changed to L1 loss in Detectron2. + RPN: + SMOOTH_L1_BETA: 0.1111 + ROI_BOX_HEAD: + SMOOTH_L1_BETA: 1.0 + POOLER_SAMPLING_RATIO: 2 + POOLER_TYPE: "ROIAlign" + ROI_MASK_HEAD: + POOLER_SAMPLING_RATIO: 2 + POOLER_TYPE: "ROIAlign" +INPUT: + # no scale augmentation + MIN_SIZE_TRAIN: (800, ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_101_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_101_FPN_1x.yaml new file mode 100644 index 0000000..f0c3a1b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_101_FPN_1x.yaml @@ -0,0 +1,19 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: True + RESNETS: + DEPTH: 101 + ROI_HEADS: + NUM_CLASSES: 1230 + SCORE_THRESH_TEST: 0.0001 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +DATASETS: + TRAIN: ("lvis_v0.5_train",) + TEST: ("lvis_v0.5_val",) +TEST: + DETECTIONS_PER_IMAGE: 300 # LVIS allows up to 300 +DATALOADER: + SAMPLER_TRAIN: "RepeatFactorTrainingSampler" + REPEAT_THRESHOLD: 0.001 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..64b4caa --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml @@ -0,0 +1,19 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + ROI_HEADS: + NUM_CLASSES: 1230 + SCORE_THRESH_TEST: 0.0001 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +DATASETS: + TRAIN: ("lvis_v0.5_train",) + TEST: ("lvis_v0.5_val",) +TEST: + DETECTIONS_PER_IMAGE: 300 # LVIS allows up to 300 +DATALOADER: + SAMPLER_TRAIN: "RepeatFactorTrainingSampler" + REPEAT_THRESHOLD: 0.001 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_1x.yaml new file mode 100644 index 0000000..c8b822c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/LVIS-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_1x.yaml @@ -0,0 +1,23 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/FAIR/X-101-32x8d.pkl" + PIXEL_STD: [57.375, 57.120, 58.395] + MASK_ON: True + RESNETS: + STRIDE_IN_1X1: False # this is a C2 model + NUM_GROUPS: 32 + WIDTH_PER_GROUP: 8 + DEPTH: 101 + ROI_HEADS: + NUM_CLASSES: 1230 + SCORE_THRESH_TEST: 0.0001 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +DATASETS: + TRAIN: ("lvis_v0.5_train",) + TEST: ("lvis_v0.5_val",) +TEST: + DETECTIONS_PER_IMAGE: 300 # LVIS allows up to 300 +DATALOADER: + SAMPLER_TRAIN: "RepeatFactorTrainingSampler" + REPEAT_THRESHOLD: 0.001 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_1x.yaml new file mode 100644 index 0000000..abb33b6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_1x.yaml @@ -0,0 +1,12 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + ROI_HEADS: + NAME: CascadeROIHeads + ROI_BOX_HEAD: + CLS_AGNOSTIC_BBOX_REG: True + RPN: + POST_NMS_TOPK_TRAIN: 2000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml new file mode 100644 index 0000000..e2201ad --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml @@ -0,0 +1,15 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + ROI_HEADS: + NAME: CascadeROIHeads + ROI_BOX_HEAD: + CLS_AGNOSTIC_BBOX_REG: True + RPN: + POST_NMS_TOPK_TRAIN: 2000 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml new file mode 100644 index 0000000..fc117f6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml @@ -0,0 +1,36 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + MASK_ON: True + WEIGHTS: "catalog://ImageNetPretrained/FAIR/X-152-32x8d-IN5k" + RESNETS: + STRIDE_IN_1X1: False # this is a C2 model + NUM_GROUPS: 32 + WIDTH_PER_GROUP: 8 + DEPTH: 152 + DEFORM_ON_PER_STAGE: [False, True, True, True] + ROI_HEADS: + NAME: "CascadeROIHeads" + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_CONV: 4 + NUM_FC: 1 + NORM: "GN" + CLS_AGNOSTIC_BBOX_REG: True + ROI_MASK_HEAD: + NUM_CONV: 8 + NORM: "GN" + RPN: + POST_NMS_TOPK_TRAIN: 2000 +SOLVER: + IMS_PER_BATCH: 128 + STEPS: (35000, 45000) + MAX_ITER: 50000 + BASE_LR: 0.16 +INPUT: + MIN_SIZE_TRAIN: (640, 864) + MIN_SIZE_TRAIN_SAMPLING: "range" + MAX_SIZE_TRAIN: 1440 + CROP: + ENABLED: True +TEST: + EVAL_PERIOD: 2500 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv_parsing.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv_parsing.yaml new file mode 100644 index 0000000..544f58f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv_parsing.yaml @@ -0,0 +1,42 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + MASK_ON: True +# WEIGHTS: "catalog://ImageNetPretrained/FAIR/X-152-32x8d-IN5k" + WEIGHTS: "model_0039999_e76410.pkl" + RESNETS: + STRIDE_IN_1X1: False # this is a C2 model + NUM_GROUPS: 32 + WIDTH_PER_GROUP: 8 + DEPTH: 152 + DEFORM_ON_PER_STAGE: [False, True, True, True] + ROI_HEADS: + NAME: "CascadeROIHeads" + NUM_CLASSES: 1 + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_CONV: 4 + NUM_FC: 1 + NORM: "GN" + CLS_AGNOSTIC_BBOX_REG: True + ROI_MASK_HEAD: + NUM_CONV: 8 + NORM: "GN" + RPN: + POST_NMS_TOPK_TRAIN: 2000 +SOLVER: +# IMS_PER_BATCH: 128 + IMS_PER_BATCH: 1 + STEPS: (35000, 45000) + MAX_ITER: 50000 + BASE_LR: 0.16 +INPUT: + MIN_SIZE_TRAIN: (640, 864) + MIN_SIZE_TRAIN_SAMPLING: "range" + MAX_SIZE_TRAIN: 1440 + CROP: + ENABLED: True +TEST: + EVAL_PERIOD: 2500 +DATASETS: + TRAIN: ("CIHP_train","VIP_trainval") + TEST: ("CIHP_val",) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/demo.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/demo.yaml new file mode 100644 index 0000000..bbf9685 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/demo.yaml @@ -0,0 +1,25 @@ +_BASE_: "cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml" +MODEL: + MASK_ON: True + ROI_HEADS: + NMS_THRESH_TEST: 0.95 + SCORE_THRESH_TEST: 0.5 + NUM_CLASSES: 1 +SOLVER: + IMS_PER_BATCH: 1 + STEPS: (30000, 45000) + MAX_ITER: 50000 + BASE_LR: 0.02 +INPUT: + MIN_SIZE_TRAIN: (640, 864) + MIN_SIZE_TRAIN_SAMPLING: "range" + MAX_SIZE_TRAIN: 1440 + CROP: + ENABLED: True +TEST: + AUG: + ENABLED: True +DATASETS: + TRAIN: ("demo_train",) + TEST: ("demo_val",) +OUTPUT_DIR: "../../data/DemoDataset/detectron2_prediction" diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_cls_agnostic.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_cls_agnostic.yaml new file mode 100644 index 0000000..4c3b767 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_cls_agnostic.yaml @@ -0,0 +1,10 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + ROI_BOX_HEAD: + CLS_AGNOSTIC_BBOX_REG: True + ROI_MASK_HEAD: + CLS_AGNOSTIC_MASK: True diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml new file mode 100644 index 0000000..04ff988 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml @@ -0,0 +1,8 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + DEFORM_ON_PER_STAGE: [False, True, True, True] # on Res3,Res4,Res5 + DEFORM_MODULATED: False diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml new file mode 100644 index 0000000..68c0ca5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml @@ -0,0 +1,11 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + DEFORM_ON_PER_STAGE: [False, True, True, True] # on Res3,Res4,Res5 + DEFORM_MODULATED: False +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_gn.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_gn.yaml new file mode 100644 index 0000000..74d274e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_gn.yaml @@ -0,0 +1,21 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "catalog://ImageNetPretrained/FAIR/R-50-GN" + MASK_ON: True + RESNETS: + DEPTH: 50 + NORM: "GN" + STRIDE_IN_1X1: False + FPN: + NORM: "GN" + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_CONV: 4 + NUM_FC: 1 + NORM: "GN" + ROI_MASK_HEAD: + NORM: "GN" +SOLVER: + # 3x schedule + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_syncbn.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_syncbn.yaml new file mode 100644 index 0000000..11ebb07 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/mask_rcnn_R_50_FPN_3x_syncbn.yaml @@ -0,0 +1,24 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + NORM: "SyncBN" + STRIDE_IN_1X1: True + FPN: + NORM: "SyncBN" + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_CONV: 4 + NUM_FC: 1 + NORM: "SyncBN" + ROI_MASK_HEAD: + NORM: "SyncBN" +SOLVER: + # 3x schedule + STEPS: (210000, 250000) + MAX_ITER: 270000 +TEST: + PRECISE_BN: + ENABLED: True diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml new file mode 100644 index 0000000..34016ce --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml @@ -0,0 +1,26 @@ +# A large PanopticFPN for demo purposes. +# Use GN on backbone to support semantic seg. +# Use Cascade + Deform Conv to improve localization. +_BASE_: "../COCO-PanopticSegmentation/Base-Panoptic-FPN.yaml" +MODEL: + WEIGHTS: "catalog://ImageNetPretrained/FAIR/R-101-GN" + RESNETS: + DEPTH: 101 + NORM: "GN" + DEFORM_ON_PER_STAGE: [False, True, True, True] + STRIDE_IN_1X1: False + FPN: + NORM: "GN" + ROI_HEADS: + NAME: CascadeROIHeads + ROI_BOX_HEAD: + CLS_AGNOSTIC_BBOX_REG: True + ROI_MASK_HEAD: + NORM: "GN" + RPN: + POST_NMS_TOPK_TRAIN: 2000 +SOLVER: + STEPS: (105000, 125000) + MAX_ITER: 135000 + IMS_PER_BATCH: 32 + BASE_LR: 0.04 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_finetune_cihp.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_finetune_cihp.yaml new file mode 100644 index 0000000..766f46a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_finetune_cihp.yaml @@ -0,0 +1,24 @@ +_BASE_: "cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml" +MODEL: + MASK_ON: True + WEIGHTS: "model_0039999_e76410.pkl" + ROI_HEADS: + NUM_CLASSES: 1 +SOLVER: + IMS_PER_BATCH: 16 + STEPS: (140000, 180000) + MAX_ITER: 200000 + BASE_LR: 0.02 +INPUT: + MIN_SIZE_TRAIN: (640, 864) + MIN_SIZE_TRAIN_SAMPLING: "range" + MAX_SIZE_TRAIN: 1440 + CROP: + ENABLED: True +TEST: + EVAL_PERIOD: 0 +DATASETS: + TRAIN: ("CIHP_train") + TEST: ("CIHP_val",) +OUTPUT_DIR: "./finetune_output" + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_inference.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_inference.yaml new file mode 100644 index 0000000..d6a529b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/parsing_inference.yaml @@ -0,0 +1,26 @@ +_BASE_: "cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml" +MODEL: + MASK_ON: True + WEIGHTS: "./finetune_ouput/model_final.pth" + ROI_HEADS: + NMS_THRESH_TEST: 0.95 + SCORE_THRESH_TEST: 0.5 + NUM_CLASSES: 1 +SOLVER: + IMS_PER_BATCH: 1 + STEPS: (30000, 45000) + MAX_ITER: 50000 + BASE_LR: 0.02 +INPUT: + MIN_SIZE_TRAIN: (640, 864) + MIN_SIZE_TRAIN_SAMPLING: "range" + MAX_SIZE_TRAIN: 1440 + CROP: + ENABLED: True +TEST: + AUG: + ENABLED: True +DATASETS: + TRAIN: ("CIHP_trainval",) + TEST: ("CIHP_test",) +OUTPUT_DIR: "./inference_output" diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml new file mode 100644 index 0000000..f340028 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml @@ -0,0 +1,13 @@ +_BASE_: "mask_rcnn_R_50_FPN_3x_gn.yaml" +MODEL: + # Train from random initialization. + WEIGHTS: "" + # It makes sense to divide by STD when training from scratch + # But it seems to make no difference on the results and C2's models didn't do this. + # So we keep things consistent with C2. + # PIXEL_STD: [57.375, 57.12, 58.395] + MASK_ON: True + BACKBONE: + FREEZE_AT: 0 +# NOTE: Please refer to Rethinking ImageNet Pre-training https://arxiv.org/abs/1811.08883 +# to learn what you need for training from scratch. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_gn.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_gn.yaml new file mode 100644 index 0000000..d90c9ff --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_gn.yaml @@ -0,0 +1,19 @@ +_BASE_: "mask_rcnn_R_50_FPN_3x_gn.yaml" +MODEL: + PIXEL_STD: [57.375, 57.12, 58.395] + WEIGHTS: "" + MASK_ON: True + RESNETS: + STRIDE_IN_1X1: False + BACKBONE: + FREEZE_AT: 0 +SOLVER: + # 9x schedule + IMS_PER_BATCH: 64 # 4x the standard + STEPS: (187500, 197500) # last 60/4==15k and last 20/4==5k + MAX_ITER: 202500 # 90k * 9 / 4 + BASE_LR: 0.08 +TEST: + EVAL_PERIOD: 2500 +# NOTE: Please refer to Rethinking ImageNet Pre-training https://arxiv.org/abs/1811.08883 +# to learn what you need for training from scratch. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_syncbn.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_syncbn.yaml new file mode 100644 index 0000000..60d4e42 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/scratch_mask_rcnn_R_50_FPN_9x_syncbn.yaml @@ -0,0 +1,19 @@ +_BASE_: "mask_rcnn_R_50_FPN_3x_syncbn.yaml" +MODEL: + PIXEL_STD: [57.375, 57.12, 58.395] + WEIGHTS: "" + MASK_ON: True + RESNETS: + STRIDE_IN_1X1: False + BACKBONE: + FREEZE_AT: 0 +SOLVER: + # 9x schedule + IMS_PER_BATCH: 64 # 4x the standard + STEPS: (187500, 197500) # last 60/4==15k and last 20/4==5k + MAX_ITER: 202500 # 90k * 9 / 4 + BASE_LR: 0.08 +TEST: + EVAL_PERIOD: 2500 +# NOTE: Please refer to Rethinking ImageNet Pre-training https://arxiv.org/abs/1811.08883 +# to learn what you need for training from scratch. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/semantic_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/semantic_R_50_FPN_1x.yaml new file mode 100644 index 0000000..ac256e1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/Misc/semantic_R_50_FPN_1x.yaml @@ -0,0 +1,11 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "SemanticSegmentor" + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +DATASETS: + TRAIN: ("coco_2017_train_panoptic_stuffonly",) + TEST: ("coco_2017_val_panoptic_stuffonly",) +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_C4.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_C4.yaml new file mode 100644 index 0000000..ea2a6ba --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_C4.yaml @@ -0,0 +1,18 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 + ROI_HEADS: + NUM_CLASSES: 20 +INPUT: + MIN_SIZE_TRAIN: (480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800) + MIN_SIZE_TEST: 800 +DATASETS: + TRAIN: ('voc_2007_trainval', 'voc_2012_trainval') + TEST: ('voc_2007_test',) +SOLVER: + STEPS: (12000, 16000) + MAX_ITER: 18000 # 17.4 epochs + WARMUP_ITERS: 100 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_FPN.yaml new file mode 100644 index 0000000..e554cab --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/PascalVOC-Detection/faster_rcnn_R_50_FPN.yaml @@ -0,0 +1,18 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 + ROI_HEADS: + NUM_CLASSES: 20 +INPUT: + MIN_SIZE_TRAIN: (480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800) + MIN_SIZE_TEST: 800 +DATASETS: + TRAIN: ('voc_2007_trainval', 'voc_2012_trainval') + TEST: ('voc_2007_test',) +SOLVER: + STEPS: (12000, 16000) + MAX_ITER: 18000 # 17.4 epochs + WARMUP_ITERS: 100 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/my_Base-RCNN-FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/my_Base-RCNN-FPN.yaml new file mode 100644 index 0000000..d649eed --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/my_Base-RCNN-FPN.yaml @@ -0,0 +1,42 @@ +MODEL: + META_ARCHITECTURE: "GeneralizedRCNN" + BACKBONE: + NAME: "build_resnet_fpn_backbone" + RESNETS: + OUT_FEATURES: ["res2", "res3", "res4", "res5"] + FPN: + IN_FEATURES: ["res2", "res3", "res4", "res5"] + ANCHOR_GENERATOR: + SIZES: [[32], [64], [128], [256], [512]] # One size for each in feature map + ASPECT_RATIOS: [[0.5, 1.0, 2.0]] # Three aspect ratios (same for all in feature maps) + RPN: + IN_FEATURES: ["p2", "p3", "p4", "p5", "p6"] + PRE_NMS_TOPK_TRAIN: 2000 # Per FPN level + PRE_NMS_TOPK_TEST: 1000 # Per FPN level + # Detectron1 uses 2000 proposals per-batch, + # (See "modeling/rpn/rpn_outputs.py" for details of this legacy issue) + # which is approximately 1000 proposals per-image since the default batch size for FPN is 2. + POST_NMS_TOPK_TRAIN: 1000 + POST_NMS_TOPK_TEST: 1000 + ROI_HEADS: + NAME: "StandardROIHeads" + IN_FEATURES: ["p2", "p3", "p4", "p5"] + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_FC: 2 + POOLER_RESOLUTION: 7 + ROI_MASK_HEAD: + NAME: "MaskRCNNConvUpsampleHead" + NUM_CONV: 4 + POOLER_RESOLUTION: 14 +DATASETS: + TRAIN: ("coco_2017_train",) + TEST: ("coco_2017_val",) +SOLVER: + IMS_PER_BATCH: 2 + BASE_LR: 0.02 + STEPS: (60000, 80000) + MAX_ITER: 90000 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/README.md b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/README.md new file mode 100644 index 0000000..a278199 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/README.md @@ -0,0 +1 @@ +These are quick configs for performance or accuracy regression tracking purposes. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..fc5a411 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml" +MODEL: + WEIGHTS: "detectron2://Misc/cascade_mask_rcnn_R_50_FPN_3x/144998488/model_final_480dd8.pkl" +DATASETS: + TEST: ("coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 50.18, 0.02], ["segm", "AP", 43.87, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..e41a0fe --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/cascade_mask_rcnn_R_50_FPN_instant_test.yaml @@ -0,0 +1,11 @@ +_BASE_: "../Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml" +DATASETS: + TRAIN: ("coco_2017_val_100",) + TEST: ("coco_2017_val_100",) +SOLVER: + BASE_LR: 0.005 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..a2f37e5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-Detection/fast_rcnn_R_50_FPN_1x/137635226/model_final_e5f7ce.pkl" +DATASETS: + TEST: ("coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 45.70, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..52fc0ec --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/fast_rcnn_R_50_FPN_instant_test.yaml @@ -0,0 +1,15 @@ +_BASE_: "../COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" +DATASETS: + TRAIN: ("coco_2017_val_100",) + PROPOSAL_FILES_TRAIN: ("detectron2://COCO-Detection/rpn_R_50_FPN_1x/137258492/coco_2017_val_box_proposals_ee0dad.pkl", ) + TEST: ("coco_2017_val_100",) + PROPOSAL_FILES_TEST: ("detectron2://COCO-Detection/rpn_R_50_FPN_1x/137258492/coco_2017_val_box_proposals_ee0dad.pkl", ) +SOLVER: + BASE_LR: 0.005 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..14cf2aa --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x/137849621/model_final_a6e10b.pkl" +DATASETS: + TEST: ("keypoints_coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 52.47, 0.02], ["keypoints", "AP", 67.36, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..dc09034 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_instant_test.yaml @@ -0,0 +1,14 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + KEYPOINT_ON: True +DATASETS: + TRAIN: ("keypoints_coco_2017_val_100",) + TEST: ("keypoints_coco_2017_val_100",) +SOLVER: + BASE_LR: 0.005 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_normalized_training_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_normalized_training_acc_test.yaml new file mode 100644 index 0000000..4b92392 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_normalized_training_acc_test.yaml @@ -0,0 +1,30 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + KEYPOINT_ON: True + RESNETS: + DEPTH: 50 + ROI_HEADS: + BATCH_SIZE_PER_IMAGE: 256 + NUM_CLASSES: 1 + ROI_KEYPOINT_HEAD: + POOLER_RESOLUTION: 14 + POOLER_SAMPLING_RATIO: 2 + NORMALIZE_LOSS_BY_VISIBLE_KEYPOINTS: False + LOSS_WEIGHT: 4.0 + ROI_BOX_HEAD: + SMOOTH_L1_BETA: 1.0 # Keypoint AP degrades when using plain L1 loss + RPN: + SMOOTH_L1_BETA: 0.2 # Keypoint AP degrades when using plain L1 loss +DATASETS: + TRAIN: ("keypoints_coco_2017_val",) + TEST: ("keypoints_coco_2017_val",) +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +SOLVER: + WARMUP_FACTOR: 0.33333333 + WARMUP_ITERS: 100 + STEPS: (5500, 5800) + MAX_ITER: 6000 +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 55.35, 1.0], ["keypoints", "AP", 76.91, 1.0]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_training_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_training_acc_test.yaml new file mode 100644 index 0000000..9bd9628 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/keypoint_rcnn_R_50_FPN_training_acc_test.yaml @@ -0,0 +1,28 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + KEYPOINT_ON: True + RESNETS: + DEPTH: 50 + ROI_HEADS: + BATCH_SIZE_PER_IMAGE: 256 + NUM_CLASSES: 1 + ROI_KEYPOINT_HEAD: + POOLER_RESOLUTION: 14 + POOLER_SAMPLING_RATIO: 2 + ROI_BOX_HEAD: + SMOOTH_L1_BETA: 1.0 # Keypoint AP degrades when using plain L1 loss + RPN: + SMOOTH_L1_BETA: 0.2 # Keypoint AP degrades when using plain L1 loss +DATASETS: + TRAIN: ("keypoints_coco_2017_val",) + TEST: ("keypoints_coco_2017_val",) +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +SOLVER: + WARMUP_FACTOR: 0.33333333 + WARMUP_ITERS: 100 + STEPS: (5500, 5800) + MAX_ITER: 6000 +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 53.5, 1.0], ["keypoints", "AP", 72.4, 1.0]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_GCV_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_GCV_instant_test.yaml new file mode 100644 index 0000000..ab6e698 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_GCV_instant_test.yaml @@ -0,0 +1,18 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True +DATASETS: + TRAIN: ("coco_2017_val_100",) + TEST: ("coco_2017_val_100",) +SOLVER: + BASE_LR: 0.001 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 + CLIP_GRADIENTS: + ENABLED: True + CLIP_TYPE: "value" + CLIP_VALUE: 1.0 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_inference_acc_test.yaml new file mode 100644 index 0000000..b2d5b7f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x/137849525/model_final_4ce675.pkl" +DATASETS: + TEST: ("coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 47.37, 0.02], ["segm", "AP", 40.99, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_instant_test.yaml new file mode 100644 index 0000000..6c4f121 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_instant_test.yaml @@ -0,0 +1,14 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True +DATASETS: + TRAIN: ("coco_2017_val_100",) + TEST: ("coco_2017_val_100",) +SOLVER: + BASE_LR: 0.001 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_training_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_training_acc_test.yaml new file mode 100644 index 0000000..f68dd8f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_C4_training_acc_test.yaml @@ -0,0 +1,22 @@ +_BASE_: "../Base-RCNN-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + ROI_HEADS: + BATCH_SIZE_PER_IMAGE: 256 + MASK_ON: True +DATASETS: + TRAIN: ("coco_2017_val",) + TEST: ("coco_2017_val",) +INPUT: + MIN_SIZE_TRAIN: (600,) + MAX_SIZE_TRAIN: 1000 + MIN_SIZE_TEST: 800 + MAX_SIZE_TEST: 1000 +SOLVER: + IMS_PER_BATCH: 8 # base uses 16 + WARMUP_FACTOR: 0.33333 + WARMUP_ITERS: 100 + STEPS: (11000, 11600) + MAX_ITER: 12000 +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 41.88, 0.7], ["segm", "AP", 33.79, 0.5]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_DC5_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_DC5_inference_acc_test.yaml new file mode 100644 index 0000000..e3ce6cf --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_DC5_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x/137849551/model_final_84107b.pkl" +DATASETS: + TEST: ("coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 47.44, 0.02], ["segm", "AP", 42.94, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..e5454bf --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,10 @@ +_BASE_: "../COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl" +DATASETS: + TEST: ("coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 47.34, 0.02], ["segm", "AP", 42.67, 0.02], ["bbox_TTA", "AP", 49.11, 0.02], ["segm_TTA", "AP", 45.04, 0.02]] + AUG: + ENABLED: True + MIN_SIZES: (700, 800) # to save some time diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..6dbfcde --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_instant_test.yaml @@ -0,0 +1,14 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True +DATASETS: + TRAIN: ("coco_2017_val_100",) + TEST: ("coco_2017_val_100",) +SOLVER: + BASE_LR: 0.005 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_training_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_training_acc_test.yaml new file mode 100644 index 0000000..ffca550 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/mask_rcnn_R_50_FPN_training_acc_test.yaml @@ -0,0 +1,21 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + ROI_HEADS: + BATCH_SIZE_PER_IMAGE: 256 + MASK_ON: True +DATASETS: + TRAIN: ("coco_2017_val",) + TEST: ("coco_2017_val",) +INPUT: + MIN_SIZE_TRAIN: (600,) + MAX_SIZE_TRAIN: 1000 + MIN_SIZE_TEST: 800 + MAX_SIZE_TEST: 1000 +SOLVER: + WARMUP_FACTOR: 0.3333333 + WARMUP_ITERS: 100 + STEPS: (5500, 5800) + MAX_ITER: 6000 +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 42.0, 1.6], ["segm", "AP", 35.4, 1.25]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_inference_acc_test.yaml new file mode 100644 index 0000000..70874e3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-PanopticSegmentation/panoptic_fpn_R_50_3x/139514569/model_final_c10459.pkl" +DATASETS: + TEST: ("coco_2017_val_100_panoptic_separated",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 46.47, 0.02], ["segm", "AP", 43.39, 0.02], ["sem_seg", "mIoU", 42.55, 0.02], ["panoptic_seg", "PQ", 38.99, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_instant_test.yaml new file mode 100644 index 0000000..7cdee7b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_instant_test.yaml @@ -0,0 +1,19 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "PanopticFPN" + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + SEM_SEG_HEAD: + LOSS_WEIGHT: 0.5 +DATASETS: + TRAIN: ("coco_2017_val_100_panoptic_separated",) + TEST: ("coco_2017_val_100_panoptic_separated",) +SOLVER: + BASE_LR: 0.005 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 1 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_training_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_training_acc_test.yaml new file mode 100644 index 0000000..0581631 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/panoptic_fpn_R_50_training_acc_test.yaml @@ -0,0 +1,20 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "PanopticFPN" + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: True + RESNETS: + DEPTH: 50 + SEM_SEG_HEAD: + LOSS_WEIGHT: 0.5 +DATASETS: + TRAIN: ("coco_2017_val_panoptic_separated",) + TEST: ("coco_2017_val_panoptic_separated",) +SOLVER: + BASE_LR: 0.01 + WARMUP_FACTOR: 0.001 + WARMUP_ITERS: 500 + STEPS: (5500,) + MAX_ITER: 7000 +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 46.70, 1.1], ["segm", "AP", 38.73, 0.7], ["sem_seg", "mIoU", 64.73, 1.2], ["panoptic_seg", "PQ", 48.13, 0.8]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..36b9988 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../COCO-Detection/retinanet_R_50_FPN_3x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-Detection/retinanet_R_50_FPN_3x/137849486/model_final_4cafe0.pkl" +DATASETS: + TEST: ("coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 44.36, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..8d95c1f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/retinanet_R_50_FPN_instant_test.yaml @@ -0,0 +1,13 @@ +_BASE_: "../COCO-Detection/retinanet_R_50_FPN_1x.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" +DATASETS: + TRAIN: ("coco_2017_val_100",) + TEST: ("coco_2017_val_100",) +SOLVER: + BASE_LR: 0.005 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..c7c3f90 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,7 @@ +_BASE_: "../COCO-Detection/rpn_R_50_FPN_1x.yaml" +MODEL: + WEIGHTS: "detectron2://COCO-Detection/rpn_R_50_FPN_1x/137258492/model_final_02ce48.pkl" +DATASETS: + TEST: ("coco_2017_val_100",) +TEST: + EXPECTED_RESULTS: [["box_proposals", "AR@1000", 58.16, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..402d432 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/rpn_R_50_FPN_instant_test.yaml @@ -0,0 +1,13 @@ +_BASE_: "../COCO-Detection/rpn_R_50_FPN_1x.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" +DATASETS: + TRAIN: ("coco_2017_val_100",) + TEST: ("coco_2017_val_100",) +SOLVER: + STEPS: (30,) + MAX_ITER: 40 + BASE_LR: 0.005 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..bca7498 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,10 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "SemanticSegmentor" + WEIGHTS: "detectron2://semantic_R_50_FPN_1x/111802073/model_final_c18079783c55a94968edc28b7101c5f0.pkl" + RESNETS: + DEPTH: 50 +DATASETS: + TEST: ("coco_2017_val_100_panoptic_stuffonly",) +TEST: + EXPECTED_RESULTS: [["sem_seg", "mIoU", 39.53, 0.02], ["sem_seg", "mACC", 51.50, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..14ab606 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_instant_test.yaml @@ -0,0 +1,18 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "SemanticSegmentor" + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +DATASETS: + TRAIN: ("coco_2017_val_100_panoptic_stuffonly",) + TEST: ("coco_2017_val_100_panoptic_stuffonly",) +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +SOLVER: + BASE_LR: 0.005 + STEPS: (30,) + MAX_ITER: 40 + IMS_PER_BATCH: 4 +DATALOADER: + NUM_WORKERS: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_training_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_training_acc_test.yaml new file mode 100644 index 0000000..1f78d77 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/configs/quick_schedules/semantic_R_50_FPN_training_acc_test.yaml @@ -0,0 +1,20 @@ +_BASE_: "../Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "SemanticSegmentor" + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +DATASETS: + TRAIN: ("coco_2017_val_panoptic_stuffonly",) + TEST: ("coco_2017_val_panoptic_stuffonly",) +SOLVER: + BASE_LR: 0.01 + WARMUP_FACTOR: 0.001 + WARMUP_ITERS: 300 + STEPS: (5500,) + MAX_ITER: 7000 +TEST: + EXPECTED_RESULTS: [["sem_seg", "mIoU", 76.51, 1.0], ["sem_seg", "mACC", 83.25, 1.0]] +INPUT: + # no scale augmentation + MIN_SIZE_TRAIN: (800, ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/demo/README.md b/preprocess/humanparsing/mhp_extension/detectron2/demo/README.md new file mode 100644 index 0000000..caa755f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/demo/README.md @@ -0,0 +1,8 @@ + +## Detectron2 Demo + +We provide a command line tool to run a simple demo of builtin models. +The usage is explained in [GETTING_STARTED.md](../GETTING_STARTED.md). + +See our [blog post](https://ai.facebook.com/blog/-detectron2-a-pytorch-based-modular-object-detection-library-) +for a high-quality demo generated with this tool. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/demo/demo.py b/preprocess/humanparsing/mhp_extension/detectron2/demo/demo.py new file mode 100644 index 0000000..1fd8df8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/demo/demo.py @@ -0,0 +1,161 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import argparse +import glob +import multiprocessing as mp +import os +import time +import cv2 +import tqdm + +from detectron2.config import get_cfg +from detectron2.data.detection_utils import read_image +from detectron2.utils.logger import setup_logger + +from predictor import VisualizationDemo + +# constants +WINDOW_NAME = "COCO detections" + + +def setup_cfg(args): + # load config from file and command-line arguments + cfg = get_cfg() + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + # Set score_threshold for builtin models + cfg.MODEL.RETINANET.SCORE_THRESH_TEST = args.confidence_threshold + cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = args.confidence_threshold + cfg.MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH = args.confidence_threshold + cfg.freeze() + return cfg + + +def get_parser(): + parser = argparse.ArgumentParser(description="Detectron2 demo for builtin models") + parser.add_argument( + "--config-file", + default="configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml", + metavar="FILE", + help="path to config file", + ) + parser.add_argument("--webcam", action="store_true", help="Take inputs from webcam.") + parser.add_argument("--video-input", help="Path to video file.") + parser.add_argument( + "--input", + nargs="+", + help="A list of space separated input images; " + "or a single glob pattern such as 'directory/*.jpg'", + ) + parser.add_argument( + "--output", + help="A file or directory to save output visualizations. " + "If not given, will show output in an OpenCV window.", + ) + + parser.add_argument( + "--confidence-threshold", + type=float, + default=0.5, + help="Minimum score for instance predictions to be shown", + ) + parser.add_argument( + "--opts", + help="Modify config options using the command-line 'KEY VALUE' pairs", + default=[], + nargs=argparse.REMAINDER, + ) + return parser + + +if __name__ == "__main__": + mp.set_start_method("spawn", force=True) + args = get_parser().parse_args() + setup_logger(name="fvcore") + logger = setup_logger() + logger.info("Arguments: " + str(args)) + + cfg = setup_cfg(args) + + demo = VisualizationDemo(cfg) + + if args.input: + if len(args.input) == 1: + args.input = glob.glob(os.path.expanduser(args.input[0])) + assert args.input, "The input path(s) was not found" + for path in tqdm.tqdm(args.input, disable=not args.output): + # use PIL, to be consistent with evaluation + img = read_image(path, format="BGR") + start_time = time.time() + predictions, visualized_output = demo.run_on_image(img) + logger.info( + "{}: {} in {:.2f}s".format( + path, + "detected {} instances".format(len(predictions["instances"])) + if "instances" in predictions + else "finished", + time.time() - start_time, + ) + ) + + if args.output: + if os.path.isdir(args.output): + assert os.path.isdir(args.output), args.output + out_filename = os.path.join(args.output, os.path.basename(path)) + else: + assert len(args.input) == 1, "Please specify a directory with args.output" + out_filename = args.output + visualized_output.save(out_filename) + else: + cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) + cv2.imshow(WINDOW_NAME, visualized_output.get_image()[:, :, ::-1]) + if cv2.waitKey(0) == 27: + break # esc to quit + elif args.webcam: + assert args.input is None, "Cannot have both --input and --webcam!" + assert args.output is None, "output not yet supported with --webcam!" + cam = cv2.VideoCapture(0) + for vis in tqdm.tqdm(demo.run_on_video(cam)): + cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) + cv2.imshow(WINDOW_NAME, vis) + if cv2.waitKey(1) == 27: + break # esc to quit + cam.release() + cv2.destroyAllWindows() + elif args.video_input: + video = cv2.VideoCapture(args.video_input) + width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) + height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) + frames_per_second = video.get(cv2.CAP_PROP_FPS) + num_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) + basename = os.path.basename(args.video_input) + + if args.output: + if os.path.isdir(args.output): + output_fname = os.path.join(args.output, basename) + output_fname = os.path.splitext(output_fname)[0] + ".mkv" + else: + output_fname = args.output + assert not os.path.isfile(output_fname), output_fname + output_file = cv2.VideoWriter( + filename=output_fname, + # some installation of opencv may not support x264 (due to its license), + # you can try other format (e.g. MPEG) + fourcc=cv2.VideoWriter_fourcc(*"x264"), + fps=float(frames_per_second), + frameSize=(width, height), + isColor=True, + ) + assert os.path.isfile(args.video_input) + for vis_frame in tqdm.tqdm(demo.run_on_video(video), total=num_frames): + if args.output: + output_file.write(vis_frame) + else: + cv2.namedWindow(basename, cv2.WINDOW_NORMAL) + cv2.imshow(basename, vis_frame) + if cv2.waitKey(1) == 27: + break # esc to quit + video.release() + if args.output: + output_file.release() + else: + cv2.destroyAllWindows() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/demo/predictor.py b/preprocess/humanparsing/mhp_extension/detectron2/demo/predictor.py new file mode 100644 index 0000000..689fa85 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/demo/predictor.py @@ -0,0 +1,220 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import atexit +import bisect +import multiprocessing as mp +from collections import deque +import cv2 +import torch + +from detectron2.data import MetadataCatalog +from detectron2.engine.defaults import DefaultPredictor +from detectron2.utils.video_visualizer import VideoVisualizer +from detectron2.utils.visualizer import ColorMode, Visualizer + + +class VisualizationDemo(object): + def __init__(self, cfg, instance_mode=ColorMode.IMAGE, parallel=False): + """ + Args: + cfg (CfgNode): + instance_mode (ColorMode): + parallel (bool): whether to run the model in different processes from visualization. + Useful since the visualization logic can be slow. + """ + self.metadata = MetadataCatalog.get( + cfg.DATASETS.TEST[0] if len(cfg.DATASETS.TEST) else "__unused" + ) + self.cpu_device = torch.device("cpu") + self.instance_mode = instance_mode + + self.parallel = parallel + if parallel: + num_gpu = torch.cuda.device_count() + self.predictor = AsyncPredictor(cfg, num_gpus=num_gpu) + else: + self.predictor = DefaultPredictor(cfg) + + def run_on_image(self, image): + """ + Args: + image (np.ndarray): an image of shape (H, W, C) (in BGR order). + This is the format used by OpenCV. + + Returns: + predictions (dict): the output of the model. + vis_output (VisImage): the visualized image output. + """ + vis_output = None + predictions = self.predictor(image) + # Convert image from OpenCV BGR format to Matplotlib RGB format. + image = image[:, :, ::-1] + visualizer = Visualizer(image, self.metadata, instance_mode=self.instance_mode) + if "panoptic_seg" in predictions: + panoptic_seg, segments_info = predictions["panoptic_seg"] + vis_output = visualizer.draw_panoptic_seg_predictions( + panoptic_seg.to(self.cpu_device), segments_info + ) + else: + if "sem_seg" in predictions: + vis_output = visualizer.draw_sem_seg( + predictions["sem_seg"].argmax(dim=0).to(self.cpu_device) + ) + if "instances" in predictions: + instances = predictions["instances"].to(self.cpu_device) + vis_output = visualizer.draw_instance_predictions(predictions=instances) + + return predictions, vis_output + + def _frame_from_video(self, video): + while video.isOpened(): + success, frame = video.read() + if success: + yield frame + else: + break + + def run_on_video(self, video): + """ + Visualizes predictions on frames of the input video. + + Args: + video (cv2.VideoCapture): a :class:`VideoCapture` object, whose source can be + either a webcam or a video file. + + Yields: + ndarray: BGR visualizations of each video frame. + """ + video_visualizer = VideoVisualizer(self.metadata, self.instance_mode) + + def process_predictions(frame, predictions): + frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) + if "panoptic_seg" in predictions: + panoptic_seg, segments_info = predictions["panoptic_seg"] + vis_frame = video_visualizer.draw_panoptic_seg_predictions( + frame, panoptic_seg.to(self.cpu_device), segments_info + ) + elif "instances" in predictions: + predictions = predictions["instances"].to(self.cpu_device) + vis_frame = video_visualizer.draw_instance_predictions(frame, predictions) + elif "sem_seg" in predictions: + vis_frame = video_visualizer.draw_sem_seg( + frame, predictions["sem_seg"].argmax(dim=0).to(self.cpu_device) + ) + + # Converts Matplotlib RGB format to OpenCV BGR format + vis_frame = cv2.cvtColor(vis_frame.get_image(), cv2.COLOR_RGB2BGR) + return vis_frame + + frame_gen = self._frame_from_video(video) + if self.parallel: + buffer_size = self.predictor.default_buffer_size + + frame_data = deque() + + for cnt, frame in enumerate(frame_gen): + frame_data.append(frame) + self.predictor.put(frame) + + if cnt >= buffer_size: + frame = frame_data.popleft() + predictions = self.predictor.get() + yield process_predictions(frame, predictions) + + while len(frame_data): + frame = frame_data.popleft() + predictions = self.predictor.get() + yield process_predictions(frame, predictions) + else: + for frame in frame_gen: + yield process_predictions(frame, self.predictor(frame)) + + +class AsyncPredictor: + """ + A predictor that runs the model asynchronously, possibly on >1 GPUs. + Because rendering the visualization takes considerably amount of time, + this helps improve throughput when rendering videos. + """ + + class _StopToken: + pass + + class _PredictWorker(mp.Process): + def __init__(self, cfg, task_queue, result_queue): + self.cfg = cfg + self.task_queue = task_queue + self.result_queue = result_queue + super().__init__() + + def run(self): + predictor = DefaultPredictor(self.cfg) + + while True: + task = self.task_queue.get() + if isinstance(task, AsyncPredictor._StopToken): + break + idx, data = task + result = predictor(data) + self.result_queue.put((idx, result)) + + def __init__(self, cfg, num_gpus: int = 1): + """ + Args: + cfg (CfgNode): + num_gpus (int): if 0, will run on CPU + """ + num_workers = max(num_gpus, 1) + self.task_queue = mp.Queue(maxsize=num_workers * 3) + self.result_queue = mp.Queue(maxsize=num_workers * 3) + self.procs = [] + for gpuid in range(max(num_gpus, 1)): + cfg = cfg.clone() + cfg.defrost() + cfg.MODEL.DEVICE = "cuda:{}".format(gpuid) if num_gpus > 0 else "cpu" + self.procs.append( + AsyncPredictor._PredictWorker(cfg, self.task_queue, self.result_queue) + ) + + self.put_idx = 0 + self.get_idx = 0 + self.result_rank = [] + self.result_data = [] + + for p in self.procs: + p.start() + atexit.register(self.shutdown) + + def put(self, image): + self.put_idx += 1 + self.task_queue.put((self.put_idx, image)) + + def get(self): + self.get_idx += 1 # the index needed for this request + if len(self.result_rank) and self.result_rank[0] == self.get_idx: + res = self.result_data[0] + del self.result_data[0], self.result_rank[0] + return res + + while True: + # make sure the results are returned in the correct order + idx, res = self.result_queue.get() + if idx == self.get_idx: + return res + insert = bisect.bisect(self.result_rank, idx) + self.result_rank.insert(insert, idx) + self.result_data.insert(insert, res) + + def __len__(self): + return self.put_idx - self.get_idx + + def __call__(self, image): + self.put(image) + return self.get() + + def shutdown(self): + for _ in self.procs: + self.task_queue.put(AsyncPredictor._StopToken()) + + @property + def default_buffer_size(self): + return len(self.procs) * 5 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/__init__.py new file mode 100644 index 0000000..41816af --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +from .utils.env import setup_environment + +setup_environment() + + +# This line will be programatically read/write by setup.py. +# Leave them at the bottom of this file and don't touch them. +__version__ = "0.1.3" diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/__init__.py new file mode 100644 index 0000000..e17a9df --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +# File: + + +from . import catalog as _UNUSED # register the handler +from .detection_checkpoint import DetectionCheckpointer +from fvcore.common.checkpoint import Checkpointer, PeriodicCheckpointer + +__all__ = ["Checkpointer", "PeriodicCheckpointer", "DetectionCheckpointer"] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/c2_model_loading.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/c2_model_loading.py new file mode 100644 index 0000000..e27ba84 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/c2_model_loading.py @@ -0,0 +1,313 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import logging +import re +import torch +from fvcore.common.checkpoint import ( + get_missing_parameters_message, + get_unexpected_parameters_message, +) + + +def convert_basic_c2_names(original_keys): + """ + Apply some basic name conversion to names in C2 weights. + It only deals with typical backbone models. + + Args: + original_keys (list[str]): + Returns: + list[str]: The same number of strings matching those in original_keys. + """ + layer_keys = copy.deepcopy(original_keys) + layer_keys = [ + {"pred_b": "linear_b", "pred_w": "linear_w"}.get(k, k) for k in layer_keys + ] # some hard-coded mappings + + layer_keys = [k.replace("_", ".") for k in layer_keys] + layer_keys = [re.sub("\\.b$", ".bias", k) for k in layer_keys] + layer_keys = [re.sub("\\.w$", ".weight", k) for k in layer_keys] + # Uniform both bn and gn names to "norm" + layer_keys = [re.sub("bn\\.s$", "norm.weight", k) for k in layer_keys] + layer_keys = [re.sub("bn\\.bias$", "norm.bias", k) for k in layer_keys] + layer_keys = [re.sub("bn\\.rm", "norm.running_mean", k) for k in layer_keys] + layer_keys = [re.sub("bn\\.running.mean$", "norm.running_mean", k) for k in layer_keys] + layer_keys = [re.sub("bn\\.riv$", "norm.running_var", k) for k in layer_keys] + layer_keys = [re.sub("bn\\.running.var$", "norm.running_var", k) for k in layer_keys] + layer_keys = [re.sub("bn\\.gamma$", "norm.weight", k) for k in layer_keys] + layer_keys = [re.sub("bn\\.beta$", "norm.bias", k) for k in layer_keys] + layer_keys = [re.sub("gn\\.s$", "norm.weight", k) for k in layer_keys] + layer_keys = [re.sub("gn\\.bias$", "norm.bias", k) for k in layer_keys] + + # stem + layer_keys = [re.sub("^res\\.conv1\\.norm\\.", "conv1.norm.", k) for k in layer_keys] + # to avoid mis-matching with "conv1" in other components (e.g. detection head) + layer_keys = [re.sub("^conv1\\.", "stem.conv1.", k) for k in layer_keys] + + # layer1-4 is used by torchvision, however we follow the C2 naming strategy (res2-5) + # layer_keys = [re.sub("^res2.", "layer1.", k) for k in layer_keys] + # layer_keys = [re.sub("^res3.", "layer2.", k) for k in layer_keys] + # layer_keys = [re.sub("^res4.", "layer3.", k) for k in layer_keys] + # layer_keys = [re.sub("^res5.", "layer4.", k) for k in layer_keys] + + # blocks + layer_keys = [k.replace(".branch1.", ".shortcut.") for k in layer_keys] + layer_keys = [k.replace(".branch2a.", ".conv1.") for k in layer_keys] + layer_keys = [k.replace(".branch2b.", ".conv2.") for k in layer_keys] + layer_keys = [k.replace(".branch2c.", ".conv3.") for k in layer_keys] + + # DensePose substitutions + layer_keys = [re.sub("^body.conv.fcn", "body_conv_fcn", k) for k in layer_keys] + layer_keys = [k.replace("AnnIndex.lowres", "ann_index_lowres") for k in layer_keys] + layer_keys = [k.replace("Index.UV.lowres", "index_uv_lowres") for k in layer_keys] + layer_keys = [k.replace("U.lowres", "u_lowres") for k in layer_keys] + layer_keys = [k.replace("V.lowres", "v_lowres") for k in layer_keys] + return layer_keys + + +def convert_c2_detectron_names(weights): + """ + Map Caffe2 Detectron weight names to Detectron2 names. + + Args: + weights (dict): name -> tensor + + Returns: + dict: detectron2 names -> tensor + dict: detectron2 names -> C2 names + """ + logger = logging.getLogger(__name__) + logger.info("Remapping C2 weights ......") + original_keys = sorted(weights.keys()) + layer_keys = copy.deepcopy(original_keys) + + layer_keys = convert_basic_c2_names(layer_keys) + + # -------------------------------------------------------------------------- + # RPN hidden representation conv + # -------------------------------------------------------------------------- + # FPN case + # In the C2 model, the RPN hidden layer conv is defined for FPN level 2 and then + # shared for all other levels, hence the appearance of "fpn2" + layer_keys = [ + k.replace("conv.rpn.fpn2", "proposal_generator.rpn_head.conv") for k in layer_keys + ] + # Non-FPN case + layer_keys = [k.replace("conv.rpn", "proposal_generator.rpn_head.conv") for k in layer_keys] + + # -------------------------------------------------------------------------- + # RPN box transformation conv + # -------------------------------------------------------------------------- + # FPN case (see note above about "fpn2") + layer_keys = [ + k.replace("rpn.bbox.pred.fpn2", "proposal_generator.rpn_head.anchor_deltas") + for k in layer_keys + ] + layer_keys = [ + k.replace("rpn.cls.logits.fpn2", "proposal_generator.rpn_head.objectness_logits") + for k in layer_keys + ] + # Non-FPN case + layer_keys = [ + k.replace("rpn.bbox.pred", "proposal_generator.rpn_head.anchor_deltas") for k in layer_keys + ] + layer_keys = [ + k.replace("rpn.cls.logits", "proposal_generator.rpn_head.objectness_logits") + for k in layer_keys + ] + + # -------------------------------------------------------------------------- + # Fast R-CNN box head + # -------------------------------------------------------------------------- + layer_keys = [re.sub("^bbox\\.pred", "bbox_pred", k) for k in layer_keys] + layer_keys = [re.sub("^cls\\.score", "cls_score", k) for k in layer_keys] + layer_keys = [re.sub("^fc6\\.", "box_head.fc1.", k) for k in layer_keys] + layer_keys = [re.sub("^fc7\\.", "box_head.fc2.", k) for k in layer_keys] + # 4conv1fc head tensor names: head_conv1_w, head_conv1_gn_s + layer_keys = [re.sub("^head\\.conv", "box_head.conv", k) for k in layer_keys] + + # -------------------------------------------------------------------------- + # FPN lateral and output convolutions + # -------------------------------------------------------------------------- + def fpn_map(name): + """ + Look for keys with the following patterns: + 1) Starts with "fpn.inner." + Example: "fpn.inner.res2.2.sum.lateral.weight" + Meaning: These are lateral pathway convolutions + 2) Starts with "fpn.res" + Example: "fpn.res2.2.sum.weight" + Meaning: These are FPN output convolutions + """ + splits = name.split(".") + norm = ".norm" if "norm" in splits else "" + if name.startswith("fpn.inner."): + # splits example: ['fpn', 'inner', 'res2', '2', 'sum', 'lateral', 'weight'] + stage = int(splits[2][len("res") :]) + return "fpn_lateral{}{}.{}".format(stage, norm, splits[-1]) + elif name.startswith("fpn.res"): + # splits example: ['fpn', 'res2', '2', 'sum', 'weight'] + stage = int(splits[1][len("res") :]) + return "fpn_output{}{}.{}".format(stage, norm, splits[-1]) + return name + + layer_keys = [fpn_map(k) for k in layer_keys] + + # -------------------------------------------------------------------------- + # Mask R-CNN mask head + # -------------------------------------------------------------------------- + # roi_heads.StandardROIHeads case + layer_keys = [k.replace(".[mask].fcn", "mask_head.mask_fcn") for k in layer_keys] + layer_keys = [re.sub("^\\.mask\\.fcn", "mask_head.mask_fcn", k) for k in layer_keys] + layer_keys = [k.replace("mask.fcn.logits", "mask_head.predictor") for k in layer_keys] + # roi_heads.Res5ROIHeads case + layer_keys = [k.replace("conv5.mask", "mask_head.deconv") for k in layer_keys] + + # -------------------------------------------------------------------------- + # Keypoint R-CNN head + # -------------------------------------------------------------------------- + # interestingly, the keypoint head convs have blob names that are simply "conv_fcnX" + layer_keys = [k.replace("conv.fcn", "roi_heads.keypoint_head.conv_fcn") for k in layer_keys] + layer_keys = [ + k.replace("kps.score.lowres", "roi_heads.keypoint_head.score_lowres") for k in layer_keys + ] + layer_keys = [k.replace("kps.score.", "roi_heads.keypoint_head.score.") for k in layer_keys] + + # -------------------------------------------------------------------------- + # Done with replacements + # -------------------------------------------------------------------------- + assert len(set(layer_keys)) == len(layer_keys) + assert len(original_keys) == len(layer_keys) + + new_weights = {} + new_keys_to_original_keys = {} + for orig, renamed in zip(original_keys, layer_keys): + new_keys_to_original_keys[renamed] = orig + if renamed.startswith("bbox_pred.") or renamed.startswith("mask_head.predictor."): + # remove the meaningless prediction weight for background class + new_start_idx = 4 if renamed.startswith("bbox_pred.") else 1 + new_weights[renamed] = weights[orig][new_start_idx:] + logger.info( + "Remove prediction weight for background class in {}. The shape changes from " + "{} to {}.".format( + renamed, tuple(weights[orig].shape), tuple(new_weights[renamed].shape) + ) + ) + elif renamed.startswith("cls_score."): + # move weights of bg class from original index 0 to last index + logger.info( + "Move classification weights for background class in {} from index 0 to " + "index {}.".format(renamed, weights[orig].shape[0] - 1) + ) + new_weights[renamed] = torch.cat([weights[orig][1:], weights[orig][:1]]) + else: + new_weights[renamed] = weights[orig] + + return new_weights, new_keys_to_original_keys + + +# Note the current matching is not symmetric. +# it assumes model_state_dict will have longer names. +def align_and_update_state_dicts(model_state_dict, ckpt_state_dict, c2_conversion=True): + """ + Match names between the two state-dict, and update the values of model_state_dict in-place with + copies of the matched tensor in ckpt_state_dict. + If `c2_conversion==True`, `ckpt_state_dict` is assumed to be a Caffe2 + model and will be renamed at first. + + Strategy: suppose that the models that we will create will have prefixes appended + to each of its keys, for example due to an extra level of nesting that the original + pre-trained weights from ImageNet won't contain. For example, model.state_dict() + might return backbone[0].body.res2.conv1.weight, while the pre-trained model contains + res2.conv1.weight. We thus want to match both parameters together. + For that, we look for each model weight, look among all loaded keys if there is one + that is a suffix of the current weight name, and use it if that's the case. + If multiple matches exist, take the one with longest size + of the corresponding name. For example, for the same model as before, the pretrained + weight file can contain both res2.conv1.weight, as well as conv1.weight. In this case, + we want to match backbone[0].body.conv1.weight to conv1.weight, and + backbone[0].body.res2.conv1.weight to res2.conv1.weight. + """ + model_keys = sorted(model_state_dict.keys()) + if c2_conversion: + ckpt_state_dict, original_keys = convert_c2_detectron_names(ckpt_state_dict) + # original_keys: the name in the original dict (before renaming) + else: + original_keys = {x: x for x in ckpt_state_dict.keys()} + ckpt_keys = sorted(ckpt_state_dict.keys()) + + def match(a, b): + # Matched ckpt_key should be a complete (starts with '.') suffix. + # For example, roi_heads.mesh_head.whatever_conv1 does not match conv1, + # but matches whatever_conv1 or mesh_head.whatever_conv1. + return a == b or a.endswith("." + b) + + # get a matrix of string matches, where each (i, j) entry correspond to the size of the + # ckpt_key string, if it matches + match_matrix = [len(j) if match(i, j) else 0 for i in model_keys for j in ckpt_keys] + match_matrix = torch.as_tensor(match_matrix).view(len(model_keys), len(ckpt_keys)) + # use the matched one with longest size in case of multiple matches + max_match_size, idxs = match_matrix.max(1) + # remove indices that correspond to no-match + idxs[max_match_size == 0] = -1 + + # used for logging + max_len_model = max(len(key) for key in model_keys) if model_keys else 1 + max_len_ckpt = max(len(key) for key in ckpt_keys) if ckpt_keys else 1 + log_str_template = "{: <{}} loaded from {: <{}} of shape {}" + logger = logging.getLogger(__name__) + # matched_pairs (matched checkpoint key --> matched model key) + matched_keys = {} + for idx_model, idx_ckpt in enumerate(idxs.tolist()): + if idx_ckpt == -1: + continue + key_model = model_keys[idx_model] + key_ckpt = ckpt_keys[idx_ckpt] + value_ckpt = ckpt_state_dict[key_ckpt] + shape_in_model = model_state_dict[key_model].shape + + if shape_in_model != value_ckpt.shape: + logger.warning( + "Shape of {} in checkpoint is {}, while shape of {} in model is {}.".format( + key_ckpt, value_ckpt.shape, key_model, shape_in_model + ) + ) + logger.warning( + "{} will not be loaded. Please double check and see if this is desired.".format( + key_ckpt + ) + ) + continue + + model_state_dict[key_model] = value_ckpt.clone() + if key_ckpt in matched_keys: # already added to matched_keys + logger.error( + "Ambiguity found for {} in checkpoint!" + "It matches at least two keys in the model ({} and {}).".format( + key_ckpt, key_model, matched_keys[key_ckpt] + ) + ) + raise ValueError("Cannot match one checkpoint key to multiple keys in the model.") + + matched_keys[key_ckpt] = key_model + logger.info( + log_str_template.format( + key_model, + max_len_model, + original_keys[key_ckpt], + max_len_ckpt, + tuple(shape_in_model), + ) + ) + matched_model_keys = matched_keys.values() + matched_ckpt_keys = matched_keys.keys() + # print warnings about unmatched keys on both side + unmatched_model_keys = [k for k in model_keys if k not in matched_model_keys] + if len(unmatched_model_keys): + logger.info(get_missing_parameters_message(unmatched_model_keys)) + + unmatched_ckpt_keys = [k for k in ckpt_keys if k not in matched_ckpt_keys] + if len(unmatched_ckpt_keys): + logger.info( + get_unexpected_parameters_message(original_keys[x] for x in unmatched_ckpt_keys) + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/catalog.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/catalog.py new file mode 100644 index 0000000..62f81f3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/catalog.py @@ -0,0 +1,134 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +from fvcore.common.file_io import PathHandler, PathManager + + +class ModelCatalog(object): + """ + Store mappings from names to third-party models. + """ + + S3_C2_DETECTRON_PREFIX = "https://dl.fbaipublicfiles.com/detectron" + + # MSRA models have STRIDE_IN_1X1=True. False otherwise. + # NOTE: all BN models here have fused BN into an affine layer. + # As a result, you should only load them to a model with "FrozenBN". + # Loading them to a model with regular BN or SyncBN is wrong. + # Even when loaded to FrozenBN, it is still different from affine by an epsilon, + # which should be negligible for training. + # NOTE: all models here uses PIXEL_STD=[1,1,1] + # NOTE: Most of the BN models here are no longer used. We use the + # re-converted pre-trained models under detectron2 model zoo instead. + C2_IMAGENET_MODELS = { + "MSRA/R-50": "ImageNetPretrained/MSRA/R-50.pkl", + "MSRA/R-101": "ImageNetPretrained/MSRA/R-101.pkl", + "FAIR/R-50-GN": "ImageNetPretrained/47261647/R-50-GN.pkl", + "FAIR/R-101-GN": "ImageNetPretrained/47592356/R-101-GN.pkl", + "FAIR/X-101-32x8d": "ImageNetPretrained/20171220/X-101-32x8d.pkl", + "FAIR/X-101-64x4d": "ImageNetPretrained/FBResNeXt/X-101-64x4d.pkl", + "FAIR/X-152-32x8d-IN5k": "ImageNetPretrained/25093814/X-152-32x8d-IN5k.pkl", + } + + C2_DETECTRON_PATH_FORMAT = ( + "{prefix}/{url}/output/train/{dataset}/{type}/model_final.pkl" # noqa B950 + ) + + C2_DATASET_COCO = "coco_2014_train%3Acoco_2014_valminusminival" + C2_DATASET_COCO_KEYPOINTS = "keypoints_coco_2014_train%3Akeypoints_coco_2014_valminusminival" + + # format: {model_name} -> part of the url + C2_DETECTRON_MODELS = { + "35857197/e2e_faster_rcnn_R-50-C4_1x": "35857197/12_2017_baselines/e2e_faster_rcnn_R-50-C4_1x.yaml.01_33_49.iAX0mXvW", # noqa B950 + "35857345/e2e_faster_rcnn_R-50-FPN_1x": "35857345/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_1x.yaml.01_36_30.cUF7QR7I", # noqa B950 + "35857890/e2e_faster_rcnn_R-101-FPN_1x": "35857890/12_2017_baselines/e2e_faster_rcnn_R-101-FPN_1x.yaml.01_38_50.sNxI7sX7", # noqa B950 + "36761737/e2e_faster_rcnn_X-101-32x8d-FPN_1x": "36761737/12_2017_baselines/e2e_faster_rcnn_X-101-32x8d-FPN_1x.yaml.06_31_39.5MIHi1fZ", # noqa B950 + "35858791/e2e_mask_rcnn_R-50-C4_1x": "35858791/12_2017_baselines/e2e_mask_rcnn_R-50-C4_1x.yaml.01_45_57.ZgkA7hPB", # noqa B950 + "35858933/e2e_mask_rcnn_R-50-FPN_1x": "35858933/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml.01_48_14.DzEQe4wC", # noqa B950 + "35861795/e2e_mask_rcnn_R-101-FPN_1x": "35861795/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_1x.yaml.02_31_37.KqyEK4tT", # noqa B950 + "36761843/e2e_mask_rcnn_X-101-32x8d-FPN_1x": "36761843/12_2017_baselines/e2e_mask_rcnn_X-101-32x8d-FPN_1x.yaml.06_35_59.RZotkLKI", # noqa B950 + "48616381/e2e_mask_rcnn_R-50-FPN_2x_gn": "GN/48616381/04_2018_gn_baselines/e2e_mask_rcnn_R-50-FPN_2x_gn_0416.13_23_38.bTlTI97Q", # noqa B950 + "37697547/e2e_keypoint_rcnn_R-50-FPN_1x": "37697547/12_2017_baselines/e2e_keypoint_rcnn_R-50-FPN_1x.yaml.08_42_54.kdzV35ao", # noqa B950 + "35998355/rpn_R-50-C4_1x": "35998355/12_2017_baselines/rpn_R-50-C4_1x.yaml.08_00_43.njH5oD9L", # noqa B950 + "35998814/rpn_R-50-FPN_1x": "35998814/12_2017_baselines/rpn_R-50-FPN_1x.yaml.08_06_03.Axg0r179", # noqa B950 + "36225147/fast_R-50-FPN_1x": "36225147/12_2017_baselines/fast_rcnn_R-50-FPN_1x.yaml.08_39_09.L3obSdQ2", # noqa B950 + } + + @staticmethod + def get(name): + if name.startswith("Caffe2Detectron/COCO"): + return ModelCatalog._get_c2_detectron_baseline(name) + if name.startswith("ImageNetPretrained/"): + return ModelCatalog._get_c2_imagenet_pretrained(name) + raise RuntimeError("model not present in the catalog: {}".format(name)) + + @staticmethod + def _get_c2_imagenet_pretrained(name): + prefix = ModelCatalog.S3_C2_DETECTRON_PREFIX + name = name[len("ImageNetPretrained/") :] + name = ModelCatalog.C2_IMAGENET_MODELS[name] + url = "/".join([prefix, name]) + return url + + @staticmethod + def _get_c2_detectron_baseline(name): + name = name[len("Caffe2Detectron/COCO/") :] + url = ModelCatalog.C2_DETECTRON_MODELS[name] + if "keypoint_rcnn" in name: + dataset = ModelCatalog.C2_DATASET_COCO_KEYPOINTS + else: + dataset = ModelCatalog.C2_DATASET_COCO + + if "35998355/rpn_R-50-C4_1x" in name: + # this one model is somehow different from others .. + type = "rpn" + else: + type = "generalized_rcnn" + + # Detectron C2 models are stored in the structure defined in `C2_DETECTRON_PATH_FORMAT`. + url = ModelCatalog.C2_DETECTRON_PATH_FORMAT.format( + prefix=ModelCatalog.S3_C2_DETECTRON_PREFIX, url=url, type=type, dataset=dataset + ) + return url + + +class ModelCatalogHandler(PathHandler): + """ + Resolve URL like catalog://. + """ + + PREFIX = "catalog://" + + def _get_supported_prefixes(self): + return [self.PREFIX] + + def _get_local_path(self, path): + logger = logging.getLogger(__name__) + catalog_path = ModelCatalog.get(path[len(self.PREFIX) :]) + logger.info("Catalog entry {} points to {}".format(path, catalog_path)) + return PathManager.get_local_path(catalog_path) + + def _open(self, path, mode="r", **kwargs): + return PathManager.open(self._get_local_path(path), mode, **kwargs) + + +class Detectron2Handler(PathHandler): + """ + Resolve anything that's in Detectron2 model zoo. + """ + + PREFIX = "detectron2://" + S3_DETECTRON2_PREFIX = "https://dl.fbaipublicfiles.com/detectron2/" + + def _get_supported_prefixes(self): + return [self.PREFIX] + + def _get_local_path(self, path): + name = path[len(self.PREFIX) :] + return PathManager.get_local_path(self.S3_DETECTRON2_PREFIX + name) + + def _open(self, path, mode="r", **kwargs): + return PathManager.open(self._get_local_path(path), mode, **kwargs) + + +PathManager.register_handler(ModelCatalogHandler()) +PathManager.register_handler(Detectron2Handler()) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/detection_checkpoint.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/detection_checkpoint.py new file mode 100644 index 0000000..06e6739 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/checkpoint/detection_checkpoint.py @@ -0,0 +1,73 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import pickle +from fvcore.common.checkpoint import Checkpointer +from fvcore.common.file_io import PathManager + +import detectron2.utils.comm as comm + +from .c2_model_loading import align_and_update_state_dicts + + +class DetectionCheckpointer(Checkpointer): + """ + Same as :class:`Checkpointer`, but is able to handle models in detectron & detectron2 + model zoo, and apply conversions for legacy models. + """ + + def __init__(self, model, save_dir="", *, save_to_disk=None, **checkpointables): + is_main_process = comm.is_main_process() + super().__init__( + model, + save_dir, + save_to_disk=is_main_process if save_to_disk is None else save_to_disk, + **checkpointables, + ) + + def _load_file(self, filename): + if filename.endswith(".pkl"): + with PathManager.open(filename, "rb") as f: + data = pickle.load(f, encoding="latin1") + if "model" in data and "__author__" in data: + # file is in Detectron2 model zoo format + self.logger.info("Reading a file from '{}'".format(data["__author__"])) + return data + else: + # assume file is from Caffe2 / Detectron1 model zoo + if "blobs" in data: + # Detection models have "blobs", but ImageNet models don't + data = data["blobs"] + data = {k: v for k, v in data.items() if not k.endswith("_momentum")} + return {"model": data, "__author__": "Caffe2", "matching_heuristics": True} + + loaded = super()._load_file(filename) # load native pth checkpoint + if "model" not in loaded: + loaded = {"model": loaded} + return loaded + + def _load_model(self, checkpoint): + if checkpoint.get("matching_heuristics", False): + self._convert_ndarray_to_tensor(checkpoint["model"]) + # convert weights by name-matching heuristics + model_state_dict = self.model.state_dict() + align_and_update_state_dicts( + model_state_dict, + checkpoint["model"], + c2_conversion=checkpoint.get("__author__", None) == "Caffe2", + ) + checkpoint["model"] = model_state_dict + # for non-caffe2 models, use standard ways to load it + incompatible = super()._load_model(checkpoint) + if incompatible is None: # support older versions of fvcore + return None + + model_buffers = dict(self.model.named_buffers(recurse=False)) + for k in ["pixel_mean", "pixel_std"]: + # Ignore missing key message about pixel_mean/std. + # Though they may be missing in old checkpoints, they will be correctly + # initialized from config anyway. + if k in model_buffers: + try: + incompatible.missing_keys.remove(k) + except ValueError: + pass + return incompatible diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/__init__.py new file mode 100644 index 0000000..f996ecd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .compat import downgrade_config, upgrade_config +from .config import CfgNode, get_cfg, global_cfg, set_global_cfg, configurable + +__all__ = [ + "CfgNode", + "get_cfg", + "global_cfg", + "set_global_cfg", + "downgrade_config", + "upgrade_config", + "configurable", +] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/compat.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/compat.py new file mode 100644 index 0000000..41fe3a0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/compat.py @@ -0,0 +1,229 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +Backward compatibility of configs. + +Instructions to bump version: ++ It's not needed to bump version if new keys are added. + It's only needed when backward-incompatible changes happen + (i.e., some existing keys disappear, or the meaning of a key changes) ++ To bump version, do the following: + 1. Increment _C.VERSION in defaults.py + 2. Add a converter in this file. + + Each ConverterVX has a function "upgrade" which in-place upgrades config from X-1 to X, + and a function "downgrade" which in-place downgrades config from X to X-1 + + In each function, VERSION is left unchanged. + + Each converter assumes that its input has the relevant keys + (i.e., the input is not a partial config). + 3. Run the tests (test_config.py) to make sure the upgrade & downgrade + functions are consistent. +""" + +import logging +from typing import List, Optional, Tuple + +from .config import CfgNode as CN +from .defaults import _C + +__all__ = ["upgrade_config", "downgrade_config"] + + +def upgrade_config(cfg: CN, to_version: Optional[int] = None) -> CN: + """ + Upgrade a config from its current version to a newer version. + + Args: + cfg (CfgNode): + to_version (int): defaults to the latest version. + """ + cfg = cfg.clone() + if to_version is None: + to_version = _C.VERSION + + assert cfg.VERSION <= to_version, "Cannot upgrade from v{} to v{}!".format( + cfg.VERSION, to_version + ) + for k in range(cfg.VERSION, to_version): + converter = globals()["ConverterV" + str(k + 1)] + converter.upgrade(cfg) + cfg.VERSION = k + 1 + return cfg + + +def downgrade_config(cfg: CN, to_version: int) -> CN: + """ + Downgrade a config from its current version to an older version. + + Args: + cfg (CfgNode): + to_version (int): + + Note: + A general downgrade of arbitrary configs is not always possible due to the + different functionalities in different versions. + The purpose of downgrade is only to recover the defaults in old versions, + allowing it to load an old partial yaml config. + Therefore, the implementation only needs to fill in the default values + in the old version when a general downgrade is not possible. + """ + cfg = cfg.clone() + assert cfg.VERSION >= to_version, "Cannot downgrade from v{} to v{}!".format( + cfg.VERSION, to_version + ) + for k in range(cfg.VERSION, to_version, -1): + converter = globals()["ConverterV" + str(k)] + converter.downgrade(cfg) + cfg.VERSION = k - 1 + return cfg + + +def guess_version(cfg: CN, filename: str) -> int: + """ + Guess the version of a partial config where the VERSION field is not specified. + Returns the version, or the latest if cannot make a guess. + + This makes it easier for users to migrate. + """ + logger = logging.getLogger(__name__) + + def _has(name: str) -> bool: + cur = cfg + for n in name.split("."): + if n not in cur: + return False + cur = cur[n] + return True + + # Most users' partial configs have "MODEL.WEIGHT", so guess on it + ret = None + if _has("MODEL.WEIGHT") or _has("TEST.AUG_ON"): + ret = 1 + + if ret is not None: + logger.warning("Config '{}' has no VERSION. Assuming it to be v{}.".format(filename, ret)) + else: + ret = _C.VERSION + logger.warning( + "Config '{}' has no VERSION. Assuming it to be compatible with latest v{}.".format( + filename, ret + ) + ) + return ret + + +def _rename(cfg: CN, old: str, new: str) -> None: + old_keys = old.split(".") + new_keys = new.split(".") + + def _set(key_seq: List[str], val: str) -> None: + cur = cfg + for k in key_seq[:-1]: + if k not in cur: + cur[k] = CN() + cur = cur[k] + cur[key_seq[-1]] = val + + def _get(key_seq: List[str]) -> CN: + cur = cfg + for k in key_seq: + cur = cur[k] + return cur + + def _del(key_seq: List[str]) -> None: + cur = cfg + for k in key_seq[:-1]: + cur = cur[k] + del cur[key_seq[-1]] + if len(cur) == 0 and len(key_seq) > 1: + _del(key_seq[:-1]) + + _set(new_keys, _get(old_keys)) + _del(old_keys) + + +class _RenameConverter: + """ + A converter that handles simple rename. + """ + + RENAME: List[Tuple[str, str]] = [] # list of tuples of (old name, new name) + + @classmethod + def upgrade(cls, cfg: CN) -> None: + for old, new in cls.RENAME: + _rename(cfg, old, new) + + @classmethod + def downgrade(cls, cfg: CN) -> None: + for old, new in cls.RENAME[::-1]: + _rename(cfg, new, old) + + +class ConverterV1(_RenameConverter): + RENAME = [("MODEL.RPN_HEAD.NAME", "MODEL.RPN.HEAD_NAME")] + + +class ConverterV2(_RenameConverter): + """ + A large bulk of rename, before public release. + """ + + RENAME = [ + ("MODEL.WEIGHT", "MODEL.WEIGHTS"), + ("MODEL.PANOPTIC_FPN.SEMANTIC_LOSS_SCALE", "MODEL.SEM_SEG_HEAD.LOSS_WEIGHT"), + ("MODEL.PANOPTIC_FPN.RPN_LOSS_SCALE", "MODEL.RPN.LOSS_WEIGHT"), + ("MODEL.PANOPTIC_FPN.INSTANCE_LOSS_SCALE", "MODEL.PANOPTIC_FPN.INSTANCE_LOSS_WEIGHT"), + ("MODEL.PANOPTIC_FPN.COMBINE_ON", "MODEL.PANOPTIC_FPN.COMBINE.ENABLED"), + ( + "MODEL.PANOPTIC_FPN.COMBINE_OVERLAP_THRESHOLD", + "MODEL.PANOPTIC_FPN.COMBINE.OVERLAP_THRESH", + ), + ( + "MODEL.PANOPTIC_FPN.COMBINE_STUFF_AREA_LIMIT", + "MODEL.PANOPTIC_FPN.COMBINE.STUFF_AREA_LIMIT", + ), + ( + "MODEL.PANOPTIC_FPN.COMBINE_INSTANCES_CONFIDENCE_THRESHOLD", + "MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH", + ), + ("MODEL.ROI_HEADS.SCORE_THRESH", "MODEL.ROI_HEADS.SCORE_THRESH_TEST"), + ("MODEL.ROI_HEADS.NMS", "MODEL.ROI_HEADS.NMS_THRESH_TEST"), + ("MODEL.RETINANET.INFERENCE_SCORE_THRESHOLD", "MODEL.RETINANET.SCORE_THRESH_TEST"), + ("MODEL.RETINANET.INFERENCE_TOPK_CANDIDATES", "MODEL.RETINANET.TOPK_CANDIDATES_TEST"), + ("MODEL.RETINANET.INFERENCE_NMS_THRESHOLD", "MODEL.RETINANET.NMS_THRESH_TEST"), + ("TEST.DETECTIONS_PER_IMG", "TEST.DETECTIONS_PER_IMAGE"), + ("TEST.AUG_ON", "TEST.AUG.ENABLED"), + ("TEST.AUG_MIN_SIZES", "TEST.AUG.MIN_SIZES"), + ("TEST.AUG_MAX_SIZE", "TEST.AUG.MAX_SIZE"), + ("TEST.AUG_FLIP", "TEST.AUG.FLIP"), + ] + + @classmethod + def upgrade(cls, cfg: CN) -> None: + super().upgrade(cfg) + + if cfg.MODEL.META_ARCHITECTURE == "RetinaNet": + _rename( + cfg, "MODEL.RETINANET.ANCHOR_ASPECT_RATIOS", "MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS" + ) + _rename(cfg, "MODEL.RETINANET.ANCHOR_SIZES", "MODEL.ANCHOR_GENERATOR.SIZES") + del cfg["MODEL"]["RPN"]["ANCHOR_SIZES"] + del cfg["MODEL"]["RPN"]["ANCHOR_ASPECT_RATIOS"] + else: + _rename(cfg, "MODEL.RPN.ANCHOR_ASPECT_RATIOS", "MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS") + _rename(cfg, "MODEL.RPN.ANCHOR_SIZES", "MODEL.ANCHOR_GENERATOR.SIZES") + del cfg["MODEL"]["RETINANET"]["ANCHOR_SIZES"] + del cfg["MODEL"]["RETINANET"]["ANCHOR_ASPECT_RATIOS"] + del cfg["MODEL"]["RETINANET"]["ANCHOR_STRIDES"] + + @classmethod + def downgrade(cls, cfg: CN) -> None: + super().downgrade(cfg) + + _rename(cfg, "MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS", "MODEL.RPN.ANCHOR_ASPECT_RATIOS") + _rename(cfg, "MODEL.ANCHOR_GENERATOR.SIZES", "MODEL.RPN.ANCHOR_SIZES") + cfg.MODEL.RETINANET.ANCHOR_ASPECT_RATIOS = cfg.MODEL.RPN.ANCHOR_ASPECT_RATIOS + cfg.MODEL.RETINANET.ANCHOR_SIZES = cfg.MODEL.RPN.ANCHOR_SIZES + cfg.MODEL.RETINANET.ANCHOR_STRIDES = [] # this is not used anywhere in any version diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/config.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/config.py new file mode 100644 index 0000000..14ad524 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/config.py @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import functools +import inspect +import logging +from fvcore.common.config import CfgNode as _CfgNode +from fvcore.common.file_io import PathManager + + +class CfgNode(_CfgNode): + """ + The same as `fvcore.common.config.CfgNode`, but different in: + + 1. Use unsafe yaml loading by default. + Note that this may lead to arbitrary code execution: you must not + load a config file from untrusted sources before manually inspecting + the content of the file. + 2. Support config versioning. + When attempting to merge an old config, it will convert the old config automatically. + """ + + # Note that the default value of allow_unsafe is changed to True + def merge_from_file(self, cfg_filename: str, allow_unsafe: bool = True) -> None: + assert PathManager.isfile(cfg_filename), f"Config file '{cfg_filename}' does not exist!" + loaded_cfg = _CfgNode.load_yaml_with_base(cfg_filename, allow_unsafe=allow_unsafe) + loaded_cfg = type(self)(loaded_cfg) + + # defaults.py needs to import CfgNode + from .defaults import _C + + latest_ver = _C.VERSION + assert ( + latest_ver == self.VERSION + ), "CfgNode.merge_from_file is only allowed on a config object of latest version!" + + logger = logging.getLogger(__name__) + + loaded_ver = loaded_cfg.get("VERSION", None) + if loaded_ver is None: + from .compat import guess_version + + loaded_ver = guess_version(loaded_cfg, cfg_filename) + assert loaded_ver <= self.VERSION, "Cannot merge a v{} config into a v{} config.".format( + loaded_ver, self.VERSION + ) + + if loaded_ver == self.VERSION: + self.merge_from_other_cfg(loaded_cfg) + else: + # compat.py needs to import CfgNode + from .compat import upgrade_config, downgrade_config + + logger.warning( + "Loading an old v{} config file '{}' by automatically upgrading to v{}. " + "See docs/CHANGELOG.md for instructions to update your files.".format( + loaded_ver, cfg_filename, self.VERSION + ) + ) + # To convert, first obtain a full config at an old version + old_self = downgrade_config(self, to_version=loaded_ver) + old_self.merge_from_other_cfg(loaded_cfg) + new_config = upgrade_config(old_self) + self.clear() + self.update(new_config) + + def dump(self, *args, **kwargs): + """ + Returns: + str: a yaml string representation of the config + """ + # to make it show up in docs + return super().dump(*args, **kwargs) + + +global_cfg = CfgNode() + + +def get_cfg() -> CfgNode: + """ + Get a copy of the default config. + + Returns: + a detectron2 CfgNode instance. + """ + from .defaults import _C + + return _C.clone() + + +def set_global_cfg(cfg: CfgNode) -> None: + """ + Let the global config point to the given cfg. + + Assume that the given "cfg" has the key "KEY", after calling + `set_global_cfg(cfg)`, the key can be accessed by: + + .. code-block:: python + + from detectron2.config import global_cfg + print(global_cfg.KEY) + + By using a hacky global config, you can access these configs anywhere, + without having to pass the config object or the values deep into the code. + This is a hacky feature introduced for quick prototyping / research exploration. + """ + global global_cfg + global_cfg.clear() + global_cfg.update(cfg) + + +def configurable(init_func): + """ + Decorate a class's __init__ method so that it can be called with a CfgNode + object using the class's from_config classmethod. + + Examples: + + .. code-block:: python + + class A: + @configurable + def __init__(self, a, b=2, c=3): + pass + + @classmethod + def from_config(cls, cfg): + # Returns kwargs to be passed to __init__ + return {"a": cfg.A, "b": cfg.B} + + a1 = A(a=1, b=2) # regular construction + a2 = A(cfg) # construct with a cfg + a3 = A(cfg, b=3, c=4) # construct with extra overwrite + """ + assert init_func.__name__ == "__init__", "@configurable should only be used for __init__!" + if init_func.__module__.startswith("detectron2."): + assert ( + init_func.__doc__ is not None and "experimental" in init_func.__doc__ + ), f"configurable {init_func} should be marked experimental" + + @functools.wraps(init_func) + def wrapped(self, *args, **kwargs): + try: + from_config_func = type(self).from_config + except AttributeError: + raise AttributeError("Class with @configurable must have a 'from_config' classmethod.") + if not inspect.ismethod(from_config_func): + raise TypeError("Class with @configurable must have a 'from_config' classmethod.") + + if _called_with_cfg(*args, **kwargs): + explicit_args = _get_args_from_config(from_config_func, *args, **kwargs) + init_func(self, **explicit_args) + else: + init_func(self, *args, **kwargs) + + return wrapped + + +def _get_args_from_config(from_config_func, *args, **kwargs): + """ + Use `from_config` to obtain explicit arguments. + + Returns: + dict: arguments to be used for cls.__init__ + """ + signature = inspect.signature(from_config_func) + if list(signature.parameters.keys())[0] != "cfg": + raise TypeError( + f"{from_config_func.__self__}.from_config must take 'cfg' as the first argument!" + ) + support_var_arg = any( + param.kind in [param.VAR_POSITIONAL, param.VAR_KEYWORD] + for param in signature.parameters.values() + ) + if support_var_arg: # forward all arguments to from_config, if from_config accepts them + ret = from_config_func(*args, **kwargs) + else: + # forward supported arguments to from_config + supported_arg_names = set(signature.parameters.keys()) + extra_kwargs = {} + for name in list(kwargs.keys()): + if name not in supported_arg_names: + extra_kwargs[name] = kwargs.pop(name) + ret = from_config_func(*args, **kwargs) + # forward the other arguments to __init__ + ret.update(extra_kwargs) + return ret + + +def _called_with_cfg(*args, **kwargs): + """ + Returns: + bool: whether the arguments contain CfgNode and should be considered + forwarded to from_config. + """ + if len(args) and isinstance(args[0], _CfgNode): + return True + if isinstance(kwargs.pop("cfg", None), _CfgNode): + return True + # `from_config`'s first argument is forced to be "cfg". + # So the above check covers all cases. + return False diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/defaults.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/defaults.py new file mode 100644 index 0000000..b9ad62f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/config/defaults.py @@ -0,0 +1,598 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .config import CfgNode as CN + +# ----------------------------------------------------------------------------- +# Convention about Training / Test specific parameters +# ----------------------------------------------------------------------------- +# Whenever an argument can be either used for training or for testing, the +# corresponding name will be post-fixed by a _TRAIN for a training parameter, +# or _TEST for a test-specific parameter. +# For example, the number of images during training will be +# IMAGES_PER_BATCH_TRAIN, while the number of images for testing will be +# IMAGES_PER_BATCH_TEST + +# ----------------------------------------------------------------------------- +# Config definition +# ----------------------------------------------------------------------------- + +_C = CN() + +# The version number, to upgrade from old configs to new ones if any +# changes happen. It's recommended to keep a VERSION in your config file. +_C.VERSION = 2 + +_C.MODEL = CN() +_C.MODEL.LOAD_PROPOSALS = False +_C.MODEL.MASK_ON = False +_C.MODEL.KEYPOINT_ON = False +_C.MODEL.DEVICE = "cuda" +_C.MODEL.META_ARCHITECTURE = "GeneralizedRCNN" + +# Path (possibly with schema like catalog:// or detectron2://) to a checkpoint file +# to be loaded to the model. You can find available models in the model zoo. +_C.MODEL.WEIGHTS = "" + +# Values to be used for image normalization (BGR order, since INPUT.FORMAT defaults to BGR). +# To train on images of different number of channels, just set different mean & std. +# Default values are the mean pixel value from ImageNet: [103.53, 116.28, 123.675] +_C.MODEL.PIXEL_MEAN = [103.530, 116.280, 123.675] +# When using pre-trained models in Detectron1 or any MSRA models, +# std has been absorbed into its conv1 weights, so the std needs to be set 1. +# Otherwise, you can use [57.375, 57.120, 58.395] (ImageNet std) +_C.MODEL.PIXEL_STD = [1.0, 1.0, 1.0] + + +# ----------------------------------------------------------------------------- +# INPUT +# ----------------------------------------------------------------------------- +_C.INPUT = CN() +# Size of the smallest side of the image during training +_C.INPUT.MIN_SIZE_TRAIN = (800,) +# Sample size of smallest side by choice or random selection from range give by +# INPUT.MIN_SIZE_TRAIN +_C.INPUT.MIN_SIZE_TRAIN_SAMPLING = "choice" +# Maximum size of the side of the image during training +_C.INPUT.MAX_SIZE_TRAIN = 1333 +# Size of the smallest side of the image during testing. Set to zero to disable resize in testing. +_C.INPUT.MIN_SIZE_TEST = 800 +# Maximum size of the side of the image during testing +_C.INPUT.MAX_SIZE_TEST = 1333 + +# `True` if cropping is used for data augmentation during training +_C.INPUT.CROP = CN({"ENABLED": False}) +# Cropping type: +# - "relative" crop (H * CROP.SIZE[0], W * CROP.SIZE[1]) part of an input of size (H, W) +# - "relative_range" uniformly sample relative crop size from between [CROP.SIZE[0], [CROP.SIZE[1]]. +# and [1, 1] and use it as in "relative" scenario. +# - "absolute" crop part of an input with absolute size: (CROP.SIZE[0], CROP.SIZE[1]). +_C.INPUT.CROP.TYPE = "relative_range" +# Size of crop in range (0, 1] if CROP.TYPE is "relative" or "relative_range" and in number of +# pixels if CROP.TYPE is "absolute" +_C.INPUT.CROP.SIZE = [0.9, 0.9] + + +# Whether the model needs RGB, YUV, HSV etc. +# Should be one of the modes defined here, as we use PIL to read the image: +# https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes +# with BGR being the one exception. One can set image format to BGR, we will +# internally use RGB for conversion and flip the channels over +_C.INPUT.FORMAT = "BGR" +# The ground truth mask format that the model will use. +# Mask R-CNN supports either "polygon" or "bitmask" as ground truth. +_C.INPUT.MASK_FORMAT = "polygon" # alternative: "bitmask" + + +# ----------------------------------------------------------------------------- +# Dataset +# ----------------------------------------------------------------------------- +_C.DATASETS = CN() +# List of the dataset names for training. Must be registered in DatasetCatalog +_C.DATASETS.TRAIN = () +# List of the pre-computed proposal files for training, which must be consistent +# with data listed in DATASETS.TRAIN. +_C.DATASETS.PROPOSAL_FILES_TRAIN = () +# Number of top scoring precomputed proposals to keep for training +_C.DATASETS.PRECOMPUTED_PROPOSAL_TOPK_TRAIN = 2000 +# List of the dataset names for testing. Must be registered in DatasetCatalog +_C.DATASETS.TEST = () +# List of the pre-computed proposal files for test, which must be consistent +# with data listed in DATASETS.TEST. +_C.DATASETS.PROPOSAL_FILES_TEST = () +# Number of top scoring precomputed proposals to keep for test +_C.DATASETS.PRECOMPUTED_PROPOSAL_TOPK_TEST = 1000 + +# ----------------------------------------------------------------------------- +# DataLoader +# ----------------------------------------------------------------------------- +_C.DATALOADER = CN() +# Number of data loading threads +_C.DATALOADER.NUM_WORKERS = 4 +# If True, each batch should contain only images for which the aspect ratio +# is compatible. This groups portrait images together, and landscape images +# are not batched with portrait images. +_C.DATALOADER.ASPECT_RATIO_GROUPING = True +# Options: TrainingSampler, RepeatFactorTrainingSampler +_C.DATALOADER.SAMPLER_TRAIN = "TrainingSampler" +# Repeat threshold for RepeatFactorTrainingSampler +_C.DATALOADER.REPEAT_THRESHOLD = 0.0 +# if True, the dataloader will filter out images that have no associated +# annotations at train time. +_C.DATALOADER.FILTER_EMPTY_ANNOTATIONS = True + +# ---------------------------------------------------------------------------- # +# Backbone options +# ---------------------------------------------------------------------------- # +_C.MODEL.BACKBONE = CN() + +_C.MODEL.BACKBONE.NAME = "build_resnet_backbone" +# Freeze the first several stages so they are not trained. +# There are 5 stages in ResNet. The first is a convolution, and the following +# stages are each group of residual blocks. +_C.MODEL.BACKBONE.FREEZE_AT = 2 + + +# ---------------------------------------------------------------------------- # +# FPN options +# ---------------------------------------------------------------------------- # +_C.MODEL.FPN = CN() +# Names of the input feature maps to be used by FPN +# They must have contiguous power of 2 strides +# e.g., ["res2", "res3", "res4", "res5"] +_C.MODEL.FPN.IN_FEATURES = [] +_C.MODEL.FPN.OUT_CHANNELS = 256 + +# Options: "" (no norm), "GN" +_C.MODEL.FPN.NORM = "" + +# Types for fusing the FPN top-down and lateral features. Can be either "sum" or "avg" +_C.MODEL.FPN.FUSE_TYPE = "sum" + + +# ---------------------------------------------------------------------------- # +# Proposal generator options +# ---------------------------------------------------------------------------- # +_C.MODEL.PROPOSAL_GENERATOR = CN() +# Current proposal generators include "RPN", "RRPN" and "PrecomputedProposals" +_C.MODEL.PROPOSAL_GENERATOR.NAME = "RPN" +# Proposal height and width both need to be greater than MIN_SIZE +# (a the scale used during training or inference) +_C.MODEL.PROPOSAL_GENERATOR.MIN_SIZE = 0 + + +# ---------------------------------------------------------------------------- # +# Anchor generator options +# ---------------------------------------------------------------------------- # +_C.MODEL.ANCHOR_GENERATOR = CN() +# The generator can be any name in the ANCHOR_GENERATOR registry +_C.MODEL.ANCHOR_GENERATOR.NAME = "DefaultAnchorGenerator" +# Anchor sizes (i.e. sqrt of area) in absolute pixels w.r.t. the network input. +# Format: list[list[float]]. SIZES[i] specifies the list of sizes +# to use for IN_FEATURES[i]; len(SIZES) == len(IN_FEATURES) must be true, +# or len(SIZES) == 1 is true and size list SIZES[0] is used for all +# IN_FEATURES. +_C.MODEL.ANCHOR_GENERATOR.SIZES = [[32, 64, 128, 256, 512]] +# Anchor aspect ratios. For each area given in `SIZES`, anchors with different aspect +# ratios are generated by an anchor generator. +# Format: list[list[float]]. ASPECT_RATIOS[i] specifies the list of aspect ratios (H/W) +# to use for IN_FEATURES[i]; len(ASPECT_RATIOS) == len(IN_FEATURES) must be true, +# or len(ASPECT_RATIOS) == 1 is true and aspect ratio list ASPECT_RATIOS[0] is used +# for all IN_FEATURES. +_C.MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS = [[0.5, 1.0, 2.0]] +# Anchor angles. +# list[list[float]], the angle in degrees, for each input feature map. +# ANGLES[i] specifies the list of angles for IN_FEATURES[i]. +_C.MODEL.ANCHOR_GENERATOR.ANGLES = [[-90, 0, 90]] +# Relative offset between the center of the first anchor and the top-left corner of the image +# Value has to be in [0, 1). Recommend to use 0.5, which means half stride. +# The value is not expected to affect model accuracy. +_C.MODEL.ANCHOR_GENERATOR.OFFSET = 0.0 + +# ---------------------------------------------------------------------------- # +# RPN options +# ---------------------------------------------------------------------------- # +_C.MODEL.RPN = CN() +_C.MODEL.RPN.HEAD_NAME = "StandardRPNHead" # used by RPN_HEAD_REGISTRY + +# Names of the input feature maps to be used by RPN +# e.g., ["p2", "p3", "p4", "p5", "p6"] for FPN +_C.MODEL.RPN.IN_FEATURES = ["res4"] +# Remove RPN anchors that go outside the image by BOUNDARY_THRESH pixels +# Set to -1 or a large value, e.g. 100000, to disable pruning anchors +_C.MODEL.RPN.BOUNDARY_THRESH = -1 +# IOU overlap ratios [BG_IOU_THRESHOLD, FG_IOU_THRESHOLD] +# Minimum overlap required between an anchor and ground-truth box for the +# (anchor, gt box) pair to be a positive example (IoU >= FG_IOU_THRESHOLD +# ==> positive RPN example: 1) +# Maximum overlap allowed between an anchor and ground-truth box for the +# (anchor, gt box) pair to be a negative examples (IoU < BG_IOU_THRESHOLD +# ==> negative RPN example: 0) +# Anchors with overlap in between (BG_IOU_THRESHOLD <= IoU < FG_IOU_THRESHOLD) +# are ignored (-1) +_C.MODEL.RPN.IOU_THRESHOLDS = [0.3, 0.7] +_C.MODEL.RPN.IOU_LABELS = [0, -1, 1] +# Total number of RPN examples per image +_C.MODEL.RPN.BATCH_SIZE_PER_IMAGE = 256 +# Target fraction of foreground (positive) examples per RPN minibatch +_C.MODEL.RPN.POSITIVE_FRACTION = 0.5 +# Weights on (dx, dy, dw, dh) for normalizing RPN anchor regression targets +_C.MODEL.RPN.BBOX_REG_WEIGHTS = (1.0, 1.0, 1.0, 1.0) +# The transition point from L1 to L2 loss. Set to 0.0 to make the loss simply L1. +_C.MODEL.RPN.SMOOTH_L1_BETA = 0.0 +_C.MODEL.RPN.LOSS_WEIGHT = 1.0 +# Number of top scoring RPN proposals to keep before applying NMS +# When FPN is used, this is *per FPN level* (not total) +_C.MODEL.RPN.PRE_NMS_TOPK_TRAIN = 12000 +_C.MODEL.RPN.PRE_NMS_TOPK_TEST = 6000 +# Number of top scoring RPN proposals to keep after applying NMS +# When FPN is used, this limit is applied per level and then again to the union +# of proposals from all levels +# NOTE: When FPN is used, the meaning of this config is different from Detectron1. +# It means per-batch topk in Detectron1, but per-image topk here. +# See "modeling/rpn/rpn_outputs.py" for details. +_C.MODEL.RPN.POST_NMS_TOPK_TRAIN = 2000 +_C.MODEL.RPN.POST_NMS_TOPK_TEST = 1000 +# NMS threshold used on RPN proposals +_C.MODEL.RPN.NMS_THRESH = 0.7 + +# ---------------------------------------------------------------------------- # +# ROI HEADS options +# ---------------------------------------------------------------------------- # +_C.MODEL.ROI_HEADS = CN() +_C.MODEL.ROI_HEADS.NAME = "Res5ROIHeads" +# Number of foreground classes +_C.MODEL.ROI_HEADS.NUM_CLASSES = 80 +# Names of the input feature maps to be used by ROI heads +# Currently all heads (box, mask, ...) use the same input feature map list +# e.g., ["p2", "p3", "p4", "p5"] is commonly used for FPN +_C.MODEL.ROI_HEADS.IN_FEATURES = ["res4"] +# IOU overlap ratios [IOU_THRESHOLD] +# Overlap threshold for an RoI to be considered background (if < IOU_THRESHOLD) +# Overlap threshold for an RoI to be considered foreground (if >= IOU_THRESHOLD) +_C.MODEL.ROI_HEADS.IOU_THRESHOLDS = [0.5] +_C.MODEL.ROI_HEADS.IOU_LABELS = [0, 1] +# RoI minibatch size *per image* (number of regions of interest [ROIs]) +# Total number of RoIs per training minibatch = +# ROI_HEADS.BATCH_SIZE_PER_IMAGE * SOLVER.IMS_PER_BATCH +# E.g., a common configuration is: 512 * 16 = 8192 +_C.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 512 +# Target fraction of RoI minibatch that is labeled foreground (i.e. class > 0) +_C.MODEL.ROI_HEADS.POSITIVE_FRACTION = 0.25 + +# Only used on test mode + +# Minimum score threshold (assuming scores in a [0, 1] range); a value chosen to +# balance obtaining high recall with not having too many low precision +# detections that will slow down inference post processing steps (like NMS) +# A default threshold of 0.0 increases AP by ~0.2-0.3 but significantly slows down +# inference. +_C.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.05 +# Overlap threshold used for non-maximum suppression (suppress boxes with +# IoU >= this threshold) +_C.MODEL.ROI_HEADS.NMS_THRESH_TEST = 0.5 +# If True, augment proposals with ground-truth boxes before sampling proposals to +# train ROI heads. +_C.MODEL.ROI_HEADS.PROPOSAL_APPEND_GT = True + +# ---------------------------------------------------------------------------- # +# Box Head +# ---------------------------------------------------------------------------- # +_C.MODEL.ROI_BOX_HEAD = CN() +# C4 don't use head name option +# Options for non-C4 models: FastRCNNConvFCHead, +_C.MODEL.ROI_BOX_HEAD.NAME = "" +# Default weights on (dx, dy, dw, dh) for normalizing bbox regression targets +# These are empirically chosen to approximately lead to unit variance targets +_C.MODEL.ROI_BOX_HEAD.BBOX_REG_WEIGHTS = (10.0, 10.0, 5.0, 5.0) +# The transition point from L1 to L2 loss. Set to 0.0 to make the loss simply L1. +_C.MODEL.ROI_BOX_HEAD.SMOOTH_L1_BETA = 0.0 +_C.MODEL.ROI_BOX_HEAD.POOLER_RESOLUTION = 14 +_C.MODEL.ROI_BOX_HEAD.POOLER_SAMPLING_RATIO = 0 +# Type of pooling operation applied to the incoming feature map for each RoI +_C.MODEL.ROI_BOX_HEAD.POOLER_TYPE = "ROIAlignV2" + +_C.MODEL.ROI_BOX_HEAD.NUM_FC = 0 +# Hidden layer dimension for FC layers in the RoI box head +_C.MODEL.ROI_BOX_HEAD.FC_DIM = 1024 +_C.MODEL.ROI_BOX_HEAD.NUM_CONV = 0 +# Channel dimension for Conv layers in the RoI box head +_C.MODEL.ROI_BOX_HEAD.CONV_DIM = 256 +# Normalization method for the convolution layers. +# Options: "" (no norm), "GN", "SyncBN". +_C.MODEL.ROI_BOX_HEAD.NORM = "" +# Whether to use class agnostic for bbox regression +_C.MODEL.ROI_BOX_HEAD.CLS_AGNOSTIC_BBOX_REG = False +# If true, RoI heads use bounding boxes predicted by the box head rather than proposal boxes. +_C.MODEL.ROI_BOX_HEAD.TRAIN_ON_PRED_BOXES = False + +# ---------------------------------------------------------------------------- # +# Cascaded Box Head +# ---------------------------------------------------------------------------- # +_C.MODEL.ROI_BOX_CASCADE_HEAD = CN() +# The number of cascade stages is implicitly defined by the length of the following two configs. +_C.MODEL.ROI_BOX_CASCADE_HEAD.BBOX_REG_WEIGHTS = ( + (10.0, 10.0, 5.0, 5.0), + (20.0, 20.0, 10.0, 10.0), + (30.0, 30.0, 15.0, 15.0), +) +_C.MODEL.ROI_BOX_CASCADE_HEAD.IOUS = (0.5, 0.6, 0.7) + + +# ---------------------------------------------------------------------------- # +# Mask Head +# ---------------------------------------------------------------------------- # +_C.MODEL.ROI_MASK_HEAD = CN() +_C.MODEL.ROI_MASK_HEAD.NAME = "MaskRCNNConvUpsampleHead" +_C.MODEL.ROI_MASK_HEAD.POOLER_RESOLUTION = 14 +_C.MODEL.ROI_MASK_HEAD.POOLER_SAMPLING_RATIO = 0 +_C.MODEL.ROI_MASK_HEAD.NUM_CONV = 0 # The number of convs in the mask head +_C.MODEL.ROI_MASK_HEAD.CONV_DIM = 256 +# Normalization method for the convolution layers. +# Options: "" (no norm), "GN", "SyncBN". +_C.MODEL.ROI_MASK_HEAD.NORM = "" +# Whether to use class agnostic for mask prediction +_C.MODEL.ROI_MASK_HEAD.CLS_AGNOSTIC_MASK = False +# Type of pooling operation applied to the incoming feature map for each RoI +_C.MODEL.ROI_MASK_HEAD.POOLER_TYPE = "ROIAlignV2" + + +# ---------------------------------------------------------------------------- # +# Keypoint Head +# ---------------------------------------------------------------------------- # +_C.MODEL.ROI_KEYPOINT_HEAD = CN() +_C.MODEL.ROI_KEYPOINT_HEAD.NAME = "KRCNNConvDeconvUpsampleHead" +_C.MODEL.ROI_KEYPOINT_HEAD.POOLER_RESOLUTION = 14 +_C.MODEL.ROI_KEYPOINT_HEAD.POOLER_SAMPLING_RATIO = 0 +_C.MODEL.ROI_KEYPOINT_HEAD.CONV_DIMS = tuple(512 for _ in range(8)) +_C.MODEL.ROI_KEYPOINT_HEAD.NUM_KEYPOINTS = 17 # 17 is the number of keypoints in COCO. + +# Images with too few (or no) keypoints are excluded from training. +_C.MODEL.ROI_KEYPOINT_HEAD.MIN_KEYPOINTS_PER_IMAGE = 1 +# Normalize by the total number of visible keypoints in the minibatch if True. +# Otherwise, normalize by the total number of keypoints that could ever exist +# in the minibatch. +# The keypoint softmax loss is only calculated on visible keypoints. +# Since the number of visible keypoints can vary significantly between +# minibatches, this has the effect of up-weighting the importance of +# minibatches with few visible keypoints. (Imagine the extreme case of +# only one visible keypoint versus N: in the case of N, each one +# contributes 1/N to the gradient compared to the single keypoint +# determining the gradient direction). Instead, we can normalize the +# loss by the total number of keypoints, if it were the case that all +# keypoints were visible in a full minibatch. (Returning to the example, +# this means that the one visible keypoint contributes as much as each +# of the N keypoints.) +_C.MODEL.ROI_KEYPOINT_HEAD.NORMALIZE_LOSS_BY_VISIBLE_KEYPOINTS = True +# Multi-task loss weight to use for keypoints +# Recommended values: +# - use 1.0 if NORMALIZE_LOSS_BY_VISIBLE_KEYPOINTS is True +# - use 4.0 if NORMALIZE_LOSS_BY_VISIBLE_KEYPOINTS is False +_C.MODEL.ROI_KEYPOINT_HEAD.LOSS_WEIGHT = 1.0 +# Type of pooling operation applied to the incoming feature map for each RoI +_C.MODEL.ROI_KEYPOINT_HEAD.POOLER_TYPE = "ROIAlignV2" + +# ---------------------------------------------------------------------------- # +# Semantic Segmentation Head +# ---------------------------------------------------------------------------- # +_C.MODEL.SEM_SEG_HEAD = CN() +_C.MODEL.SEM_SEG_HEAD.NAME = "SemSegFPNHead" +_C.MODEL.SEM_SEG_HEAD.IN_FEATURES = ["p2", "p3", "p4", "p5"] +# Label in the semantic segmentation ground truth that is ignored, i.e., no loss is calculated for +# the correposnding pixel. +_C.MODEL.SEM_SEG_HEAD.IGNORE_VALUE = 255 +# Number of classes in the semantic segmentation head +_C.MODEL.SEM_SEG_HEAD.NUM_CLASSES = 54 +# Number of channels in the 3x3 convs inside semantic-FPN heads. +_C.MODEL.SEM_SEG_HEAD.CONVS_DIM = 128 +# Outputs from semantic-FPN heads are up-scaled to the COMMON_STRIDE stride. +_C.MODEL.SEM_SEG_HEAD.COMMON_STRIDE = 4 +# Normalization method for the convolution layers. Options: "" (no norm), "GN". +_C.MODEL.SEM_SEG_HEAD.NORM = "GN" +_C.MODEL.SEM_SEG_HEAD.LOSS_WEIGHT = 1.0 + +_C.MODEL.PANOPTIC_FPN = CN() +# Scaling of all losses from instance detection / segmentation head. +_C.MODEL.PANOPTIC_FPN.INSTANCE_LOSS_WEIGHT = 1.0 + +# options when combining instance & semantic segmentation outputs +_C.MODEL.PANOPTIC_FPN.COMBINE = CN({"ENABLED": True}) +_C.MODEL.PANOPTIC_FPN.COMBINE.OVERLAP_THRESH = 0.5 +_C.MODEL.PANOPTIC_FPN.COMBINE.STUFF_AREA_LIMIT = 4096 +_C.MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH = 0.5 + + +# ---------------------------------------------------------------------------- # +# RetinaNet Head +# ---------------------------------------------------------------------------- # +_C.MODEL.RETINANET = CN() + +# This is the number of foreground classes. +_C.MODEL.RETINANET.NUM_CLASSES = 80 + +_C.MODEL.RETINANET.IN_FEATURES = ["p3", "p4", "p5", "p6", "p7"] + +# Convolutions to use in the cls and bbox tower +# NOTE: this doesn't include the last conv for logits +_C.MODEL.RETINANET.NUM_CONVS = 4 + +# IoU overlap ratio [bg, fg] for labeling anchors. +# Anchors with < bg are labeled negative (0) +# Anchors with >= bg and < fg are ignored (-1) +# Anchors with >= fg are labeled positive (1) +_C.MODEL.RETINANET.IOU_THRESHOLDS = [0.4, 0.5] +_C.MODEL.RETINANET.IOU_LABELS = [0, -1, 1] + +# Prior prob for rare case (i.e. foreground) at the beginning of training. +# This is used to set the bias for the logits layer of the classifier subnet. +# This improves training stability in the case of heavy class imbalance. +_C.MODEL.RETINANET.PRIOR_PROB = 0.01 + +# Inference cls score threshold, only anchors with score > INFERENCE_TH are +# considered for inference (to improve speed) +_C.MODEL.RETINANET.SCORE_THRESH_TEST = 0.05 +_C.MODEL.RETINANET.TOPK_CANDIDATES_TEST = 1000 +_C.MODEL.RETINANET.NMS_THRESH_TEST = 0.5 + +# Weights on (dx, dy, dw, dh) for normalizing Retinanet anchor regression targets +_C.MODEL.RETINANET.BBOX_REG_WEIGHTS = (1.0, 1.0, 1.0, 1.0) + +# Loss parameters +_C.MODEL.RETINANET.FOCAL_LOSS_GAMMA = 2.0 +_C.MODEL.RETINANET.FOCAL_LOSS_ALPHA = 0.25 +_C.MODEL.RETINANET.SMOOTH_L1_LOSS_BETA = 0.1 + + +# ---------------------------------------------------------------------------- # +# ResNe[X]t options (ResNets = {ResNet, ResNeXt} +# Note that parts of a resnet may be used for both the backbone and the head +# These options apply to both +# ---------------------------------------------------------------------------- # +_C.MODEL.RESNETS = CN() + +_C.MODEL.RESNETS.DEPTH = 50 +_C.MODEL.RESNETS.OUT_FEATURES = ["res4"] # res4 for C4 backbone, res2..5 for FPN backbone + +# Number of groups to use; 1 ==> ResNet; > 1 ==> ResNeXt +_C.MODEL.RESNETS.NUM_GROUPS = 1 + +# Options: FrozenBN, GN, "SyncBN", "BN" +_C.MODEL.RESNETS.NORM = "FrozenBN" + +# Baseline width of each group. +# Scaling this parameters will scale the width of all bottleneck layers. +_C.MODEL.RESNETS.WIDTH_PER_GROUP = 64 + +# Place the stride 2 conv on the 1x1 filter +# Use True only for the original MSRA ResNet; use False for C2 and Torch models +_C.MODEL.RESNETS.STRIDE_IN_1X1 = True + +# Apply dilation in stage "res5" +_C.MODEL.RESNETS.RES5_DILATION = 1 + +# Output width of res2. Scaling this parameters will scale the width of all 1x1 convs in ResNet +# For R18 and R34, this needs to be set to 64 +_C.MODEL.RESNETS.RES2_OUT_CHANNELS = 256 +_C.MODEL.RESNETS.STEM_OUT_CHANNELS = 64 + +# Apply Deformable Convolution in stages +# Specify if apply deform_conv on Res2, Res3, Res4, Res5 +_C.MODEL.RESNETS.DEFORM_ON_PER_STAGE = [False, False, False, False] +# Use True to use modulated deform_conv (DeformableV2, https://arxiv.org/abs/1811.11168); +# Use False for DeformableV1. +_C.MODEL.RESNETS.DEFORM_MODULATED = False +# Number of groups in deformable conv. +_C.MODEL.RESNETS.DEFORM_NUM_GROUPS = 1 + + +# ---------------------------------------------------------------------------- # +# Solver +# ---------------------------------------------------------------------------- # +_C.SOLVER = CN() + +# See detectron2/solver/build.py for LR scheduler options +_C.SOLVER.LR_SCHEDULER_NAME = "WarmupMultiStepLR" + +_C.SOLVER.MAX_ITER = 40000 + +_C.SOLVER.BASE_LR = 0.001 + +_C.SOLVER.MOMENTUM = 0.9 + +_C.SOLVER.NESTEROV = False + +_C.SOLVER.WEIGHT_DECAY = 0.0001 +# The weight decay that's applied to parameters of normalization layers +# (typically the affine transformation) +_C.SOLVER.WEIGHT_DECAY_NORM = 0.0 + +_C.SOLVER.GAMMA = 0.1 +# The iteration number to decrease learning rate by GAMMA. +_C.SOLVER.STEPS = (30000,) + +_C.SOLVER.WARMUP_FACTOR = 1.0 / 1000 +_C.SOLVER.WARMUP_ITERS = 1000 +_C.SOLVER.WARMUP_METHOD = "linear" + +# Save a checkpoint after every this number of iterations +_C.SOLVER.CHECKPOINT_PERIOD = 5000 + +# Number of images per batch across all machines. +# If we have 16 GPUs and IMS_PER_BATCH = 32, +# each GPU will see 2 images per batch. +_C.SOLVER.IMS_PER_BATCH = 16 + +# Detectron v1 (and previous detection code) used a 2x higher LR and 0 WD for +# biases. This is not useful (at least for recent models). You should avoid +# changing these and they exist only to reproduce Detectron v1 training if +# desired. +_C.SOLVER.BIAS_LR_FACTOR = 1.0 +_C.SOLVER.WEIGHT_DECAY_BIAS = _C.SOLVER.WEIGHT_DECAY + +# Gradient clipping +_C.SOLVER.CLIP_GRADIENTS = CN({"ENABLED": False}) +# Type of gradient clipping, currently 2 values are supported: +# - "value": the absolute values of elements of each gradients are clipped +# - "norm": the norm of the gradient for each parameter is clipped thus +# affecting all elements in the parameter +_C.SOLVER.CLIP_GRADIENTS.CLIP_TYPE = "value" +# Maximum absolute value used for clipping gradients +_C.SOLVER.CLIP_GRADIENTS.CLIP_VALUE = 1.0 +# Floating point number p for L-p norm to be used with the "norm" +# gradient clipping type; for L-inf, please specify .inf +_C.SOLVER.CLIP_GRADIENTS.NORM_TYPE = 2.0 + +# ---------------------------------------------------------------------------- # +# Specific test options +# ---------------------------------------------------------------------------- # +_C.TEST = CN() +# For end-to-end tests to verify the expected accuracy. +# Each item is [task, metric, value, tolerance] +# e.g.: [['bbox', 'AP', 38.5, 0.2]] +_C.TEST.EXPECTED_RESULTS = [] +# The period (in terms of steps) to evaluate the model during training. +# Set to 0 to disable. +_C.TEST.EVAL_PERIOD = 0 +# The sigmas used to calculate keypoint OKS. See http://cocodataset.org/#keypoints-eval +# When empty it will use the defaults in COCO. +# Otherwise it should have the same length as ROI_KEYPOINT_HEAD.NUM_KEYPOINTS. +_C.TEST.KEYPOINT_OKS_SIGMAS = [] +# Maximum number of detections to return per image during inference (100 is +# based on the limit established for the COCO dataset). +_C.TEST.DETECTIONS_PER_IMAGE = 100 + +_C.TEST.AUG = CN({"ENABLED": False}) +_C.TEST.AUG.MIN_SIZES = (400, 500, 600, 700, 800, 900, 1000, 1100, 1200) +_C.TEST.AUG.MAX_SIZE = 4000 +_C.TEST.AUG.FLIP = True + +_C.TEST.PRECISE_BN = CN({"ENABLED": False}) +_C.TEST.PRECISE_BN.NUM_ITER = 200 + +# ---------------------------------------------------------------------------- # +# Misc options +# ---------------------------------------------------------------------------- # +# Directory where output files are written +_C.OUTPUT_DIR = "./output" +# Set seed to negative to fully randomize everything. +# Set seed to positive to use a fixed seed. Note that a fixed seed increases +# reproducibility but does not guarantee fully deterministic behavior. +# Disabling all parallelism further increases reproducibility. +_C.SEED = -1 +# Benchmark different cudnn algorithms. +# If input images have very different sizes, this option will have large overhead +# for about 10k iterations. It usually hurts total time, but can benefit for certain models. +# If input images have the same or similar sizes, benchmark is often helpful. +_C.CUDNN_BENCHMARK = False +# The period (in terms of steps) for minibatch visualization at train time. +# Set to 0 to disable. +_C.VIS_PERIOD = 0 + +# global config is for quick hack purposes. +# You can set them in command line or config files, +# and access it with: +# +# from detectron2.config import global_cfg +# print(global_cfg.HACK) +# +# Do not commit any configs into it. +_C.GLOBAL = CN() +_C.GLOBAL.HACK = 1.0 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/__init__.py new file mode 100644 index 0000000..e8f72e0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from . import transforms # isort:skip + +from .build import ( + build_detection_test_loader, + build_detection_train_loader, + get_detection_dataset_dicts, + load_proposals_into_dataset, + print_instances_class_histogram, +) +from .catalog import DatasetCatalog, MetadataCatalog +from .common import DatasetFromList, MapDataset +from .dataset_mapper import DatasetMapper + +# ensure the builtin data are registered +from . import datasets, samplers # isort:skip + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/build.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/build.py new file mode 100644 index 0000000..cb7e857 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/build.py @@ -0,0 +1,397 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import bisect +import copy +import itertools +import logging +import numpy as np +import operator +import pickle +import torch.utils.data +from fvcore.common.file_io import PathManager +from tabulate import tabulate +from termcolor import colored + +from detectron2.structures import BoxMode +from detectron2.utils.comm import get_world_size +from detectron2.utils.env import seed_all_rng +from detectron2.utils.logger import log_first_n + +from . import samplers +from .catalog import DatasetCatalog, MetadataCatalog +from .common import AspectRatioGroupedDataset, DatasetFromList, MapDataset +from .dataset_mapper import DatasetMapper +from .detection_utils import check_metadata_consistency + +""" +This file contains the default logic to build a dataloader for training or testing. +""" + +__all__ = [ + "build_detection_train_loader", + "build_detection_test_loader", + "get_detection_dataset_dicts", + "load_proposals_into_dataset", + "print_instances_class_histogram", +] + + +def filter_images_with_only_crowd_annotations(dataset_dicts): + """ + Filter out images with none annotations or only crowd annotations + (i.e., images without non-crowd annotations). + A common training-time preprocessing on COCO dataset. + + Args: + dataset_dicts (list[dict]): annotations in Detectron2 Dataset format. + + Returns: + list[dict]: the same format, but filtered. + """ + num_before = len(dataset_dicts) + + def valid(anns): + for ann in anns: + if ann.get("iscrowd", 0) == 0: + return True + return False + + dataset_dicts = [x for x in dataset_dicts if valid(x["annotations"])] + num_after = len(dataset_dicts) + logger = logging.getLogger(__name__) + logger.info( + "Removed {} images with no usable annotations. {} images left.".format( + num_before - num_after, num_after + ) + ) + return dataset_dicts + + +def filter_images_with_few_keypoints(dataset_dicts, min_keypoints_per_image): + """ + Filter out images with too few number of keypoints. + + Args: + dataset_dicts (list[dict]): annotations in Detectron2 Dataset format. + + Returns: + list[dict]: the same format as dataset_dicts, but filtered. + """ + num_before = len(dataset_dicts) + + def visible_keypoints_in_image(dic): + # Each keypoints field has the format [x1, y1, v1, ...], where v is visibility + annotations = dic["annotations"] + return sum( + (np.array(ann["keypoints"][2::3]) > 0).sum() + for ann in annotations + if "keypoints" in ann + ) + + dataset_dicts = [ + x for x in dataset_dicts if visible_keypoints_in_image(x) >= min_keypoints_per_image + ] + num_after = len(dataset_dicts) + logger = logging.getLogger(__name__) + logger.info( + "Removed {} images with fewer than {} keypoints.".format( + num_before - num_after, min_keypoints_per_image + ) + ) + return dataset_dicts + + +def load_proposals_into_dataset(dataset_dicts, proposal_file): + """ + Load precomputed object proposals into the dataset. + + The proposal file should be a pickled dict with the following keys: + + - "ids": list[int] or list[str], the image ids + - "boxes": list[np.ndarray], each is an Nx4 array of boxes corresponding to the image id + - "objectness_logits": list[np.ndarray], each is an N sized array of objectness scores + corresponding to the boxes. + - "bbox_mode": the BoxMode of the boxes array. Defaults to ``BoxMode.XYXY_ABS``. + + Args: + dataset_dicts (list[dict]): annotations in Detectron2 Dataset format. + proposal_file (str): file path of pre-computed proposals, in pkl format. + + Returns: + list[dict]: the same format as dataset_dicts, but added proposal field. + """ + logger = logging.getLogger(__name__) + logger.info("Loading proposals from: {}".format(proposal_file)) + + with PathManager.open(proposal_file, "rb") as f: + proposals = pickle.load(f, encoding="latin1") + + # Rename the key names in D1 proposal files + rename_keys = {"indexes": "ids", "scores": "objectness_logits"} + for key in rename_keys: + if key in proposals: + proposals[rename_keys[key]] = proposals.pop(key) + + # Fetch the indexes of all proposals that are in the dataset + # Convert image_id to str since they could be int. + img_ids = set({str(record["image_id"]) for record in dataset_dicts}) + id_to_index = {str(id): i for i, id in enumerate(proposals["ids"]) if str(id) in img_ids} + + # Assuming default bbox_mode of precomputed proposals are 'XYXY_ABS' + bbox_mode = BoxMode(proposals["bbox_mode"]) if "bbox_mode" in proposals else BoxMode.XYXY_ABS + + for record in dataset_dicts: + # Get the index of the proposal + i = id_to_index[str(record["image_id"])] + + boxes = proposals["boxes"][i] + objectness_logits = proposals["objectness_logits"][i] + # Sort the proposals in descending order of the scores + inds = objectness_logits.argsort()[::-1] + record["proposal_boxes"] = boxes[inds] + record["proposal_objectness_logits"] = objectness_logits[inds] + record["proposal_bbox_mode"] = bbox_mode + + return dataset_dicts + + +def _quantize(x, bin_edges): + bin_edges = copy.copy(bin_edges) + bin_edges = sorted(bin_edges) + quantized = list(map(lambda y: bisect.bisect_right(bin_edges, y), x)) + return quantized + + +def print_instances_class_histogram(dataset_dicts, class_names): + """ + Args: + dataset_dicts (list[dict]): list of dataset dicts. + class_names (list[str]): list of class names (zero-indexed). + """ + num_classes = len(class_names) + hist_bins = np.arange(num_classes + 1) + histogram = np.zeros((num_classes,), dtype=np.int) + for entry in dataset_dicts: + annos = entry["annotations"] + classes = [x["category_id"] for x in annos if not x.get("iscrowd", 0)] + histogram += np.histogram(classes, bins=hist_bins)[0] + + N_COLS = min(6, len(class_names) * 2) + + def short_name(x): + # make long class names shorter. useful for lvis + if len(x) > 13: + return x[:11] + ".." + return x + + data = list( + itertools.chain(*[[short_name(class_names[i]), int(v)] for i, v in enumerate(histogram)]) + ) + total_num_instances = sum(data[1::2]) + data.extend([None] * (N_COLS - (len(data) % N_COLS))) + if num_classes > 1: + data.extend(["total", total_num_instances]) + data = itertools.zip_longest(*[data[i::N_COLS] for i in range(N_COLS)]) + table = tabulate( + data, + headers=["category", "#instances"] * (N_COLS // 2), + tablefmt="pipe", + numalign="left", + stralign="center", + ) + log_first_n( + logging.INFO, + "Distribution of instances among all {} categories:\n".format(num_classes) + + colored(table, "cyan"), + key="message", + ) + + +def get_detection_dataset_dicts( + dataset_names, filter_empty=True, min_keypoints=0, proposal_files=None +): + """ + Load and prepare dataset dicts for instance detection/segmentation and semantic segmentation. + + Args: + dataset_names (list[str]): a list of dataset names + filter_empty (bool): whether to filter out images without instance annotations + min_keypoints (int): filter out images with fewer keypoints than + `min_keypoints`. Set to 0 to do nothing. + proposal_files (list[str]): if given, a list of object proposal files + that match each dataset in `dataset_names`. + """ + assert len(dataset_names) + dataset_dicts = [DatasetCatalog.get(dataset_name) for dataset_name in dataset_names] + for dataset_name, dicts in zip(dataset_names, dataset_dicts): + assert len(dicts), "Dataset '{}' is empty!".format(dataset_name) + + if proposal_files is not None: + assert len(dataset_names) == len(proposal_files) + # load precomputed proposals from proposal files + dataset_dicts = [ + load_proposals_into_dataset(dataset_i_dicts, proposal_file) + for dataset_i_dicts, proposal_file in zip(dataset_dicts, proposal_files) + ] + + dataset_dicts = list(itertools.chain.from_iterable(dataset_dicts)) + + has_instances = "annotations" in dataset_dicts[0] + # Keep images without instance-level GT if the dataset has semantic labels. + if filter_empty and has_instances and "sem_seg_file_name" not in dataset_dicts[0]: + dataset_dicts = filter_images_with_only_crowd_annotations(dataset_dicts) + + if min_keypoints > 0 and has_instances: + dataset_dicts = filter_images_with_few_keypoints(dataset_dicts, min_keypoints) + + if has_instances: + try: + class_names = MetadataCatalog.get(dataset_names[0]).thing_classes + check_metadata_consistency("thing_classes", dataset_names) + print_instances_class_histogram(dataset_dicts, class_names) + except AttributeError: # class names are not available for this dataset + pass + return dataset_dicts + + +def build_detection_train_loader(cfg, mapper=None): + """ + A data loader is created by the following steps: + + 1. Use the dataset names in config to query :class:`DatasetCatalog`, and obtain a list of dicts. + 2. Coordinate a random shuffle order shared among all processes (all GPUs) + 3. Each process spawn another few workers to process the dicts. Each worker will: + * Map each metadata dict into another format to be consumed by the model. + * Batch them by simply putting dicts into a list. + + The batched ``list[mapped_dict]`` is what this dataloader will yield. + + Args: + cfg (CfgNode): the config + mapper (callable): a callable which takes a sample (dict) from dataset and + returns the format to be consumed by the model. + By default it will be `DatasetMapper(cfg, True)`. + + Returns: + an infinite iterator of training data + """ + num_workers = get_world_size() + images_per_batch = cfg.SOLVER.IMS_PER_BATCH + assert ( + images_per_batch % num_workers == 0 + ), "SOLVER.IMS_PER_BATCH ({}) must be divisible by the number of workers ({}).".format( + images_per_batch, num_workers + ) + assert ( + images_per_batch >= num_workers + ), "SOLVER.IMS_PER_BATCH ({}) must be larger than the number of workers ({}).".format( + images_per_batch, num_workers + ) + images_per_worker = images_per_batch // num_workers + + dataset_dicts = get_detection_dataset_dicts( + cfg.DATASETS.TRAIN, + filter_empty=cfg.DATALOADER.FILTER_EMPTY_ANNOTATIONS, + min_keypoints=cfg.MODEL.ROI_KEYPOINT_HEAD.MIN_KEYPOINTS_PER_IMAGE + if cfg.MODEL.KEYPOINT_ON + else 0, + proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, + ) + dataset = DatasetFromList(dataset_dicts, copy=False) + + if mapper is None: + mapper = DatasetMapper(cfg, True) + dataset = MapDataset(dataset, mapper) + + sampler_name = cfg.DATALOADER.SAMPLER_TRAIN + logger = logging.getLogger(__name__) + logger.info("Using training sampler {}".format(sampler_name)) + if sampler_name == "TrainingSampler": + sampler = samplers.TrainingSampler(len(dataset)) + elif sampler_name == "RepeatFactorTrainingSampler": + sampler = samplers.RepeatFactorTrainingSampler( + dataset_dicts, cfg.DATALOADER.REPEAT_THRESHOLD + ) + else: + raise ValueError("Unknown training sampler: {}".format(sampler_name)) + + if cfg.DATALOADER.ASPECT_RATIO_GROUPING: + data_loader = torch.utils.data.DataLoader( + dataset, + sampler=sampler, + num_workers=cfg.DATALOADER.NUM_WORKERS, + batch_sampler=None, + collate_fn=operator.itemgetter(0), # don't batch, but yield individual elements + worker_init_fn=worker_init_reset_seed, + ) # yield individual mapped dict + data_loader = AspectRatioGroupedDataset(data_loader, images_per_worker) + else: + batch_sampler = torch.utils.data.sampler.BatchSampler( + sampler, images_per_worker, drop_last=True + ) + # drop_last so the batch always have the same size + data_loader = torch.utils.data.DataLoader( + dataset, + num_workers=cfg.DATALOADER.NUM_WORKERS, + batch_sampler=batch_sampler, + collate_fn=trivial_batch_collator, + worker_init_fn=worker_init_reset_seed, + ) + + return data_loader + + +def build_detection_test_loader(cfg, dataset_name, mapper=None): + """ + Similar to `build_detection_train_loader`. + But this function uses the given `dataset_name` argument (instead of the names in cfg), + and uses batch size 1. + + Args: + cfg: a detectron2 CfgNode + dataset_name (str): a name of the dataset that's available in the DatasetCatalog + mapper (callable): a callable which takes a sample (dict) from dataset + and returns the format to be consumed by the model. + By default it will be `DatasetMapper(cfg, False)`. + + Returns: + DataLoader: a torch DataLoader, that loads the given detection + dataset, with test-time transformation and batching. + """ + dataset_dicts = get_detection_dataset_dicts( + [dataset_name], + filter_empty=False, + proposal_files=[ + cfg.DATASETS.PROPOSAL_FILES_TEST[list(cfg.DATASETS.TEST).index(dataset_name)] + ] + if cfg.MODEL.LOAD_PROPOSALS + else None, + ) + + dataset = DatasetFromList(dataset_dicts) + if mapper is None: + mapper = DatasetMapper(cfg, False) + dataset = MapDataset(dataset, mapper) + + sampler = samplers.InferenceSampler(len(dataset)) + # Always use 1 image per worker during inference since this is the + # standard when reporting inference time in papers. + batch_sampler = torch.utils.data.sampler.BatchSampler(sampler, 1, drop_last=False) + + data_loader = torch.utils.data.DataLoader( + dataset, + num_workers=cfg.DATALOADER.NUM_WORKERS, + batch_sampler=batch_sampler, + collate_fn=trivial_batch_collator, + ) + return data_loader + + +def trivial_batch_collator(batch): + """ + A batch collator that does nothing. + """ + return batch + + +def worker_init_reset_seed(worker_id): + seed_all_rng(np.random.randint(2 ** 31) + worker_id) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/catalog.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/catalog.py new file mode 100644 index 0000000..57f18c8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/catalog.py @@ -0,0 +1,221 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import logging +import types +from typing import List + +from detectron2.utils.logger import log_first_n + +__all__ = ["DatasetCatalog", "MetadataCatalog"] + + +class DatasetCatalog(object): + """ + A catalog that stores information about the data and how to obtain them. + + It contains a mapping from strings + (which are names that identify a dataset, e.g. "coco_2014_train") + to a function which parses the dataset and returns the samples in the + format of `list[dict]`. + + The returned dicts should be in Detectron2 Dataset format (See DATASETS.md for details) + if used with the data loader functionalities in `data/build.py,data/detection_transform.py`. + + The purpose of having this catalog is to make it easy to choose + different data, by just using the strings in the config. + """ + + _REGISTERED = {} + + @staticmethod + def register(name, func): + """ + Args: + name (str): the name that identifies a dataset, e.g. "coco_2014_train". + func (callable): a callable which takes no arguments and returns a list of dicts. + """ + assert callable(func), "You must register a function with `DatasetCatalog.register`!" + assert name not in DatasetCatalog._REGISTERED, "Dataset '{}' is already registered!".format( + name + ) + DatasetCatalog._REGISTERED[name] = func + + @staticmethod + def get(name): + """ + Call the registered function and return its results. + + Args: + name (str): the name that identifies a dataset, e.g. "coco_2014_train". + + Returns: + list[dict]: dataset annotations.0 + """ + try: + f = DatasetCatalog._REGISTERED[name] + except KeyError: + raise KeyError( + "Dataset '{}' is not registered! Available data are: {}".format( + name, ", ".join(DatasetCatalog._REGISTERED.keys()) + ) + ) + return f() + + @staticmethod + def list() -> List[str]: + """ + List all registered data. + + Returns: + list[str] + """ + return list(DatasetCatalog._REGISTERED.keys()) + + @staticmethod + def clear(): + """ + Remove all registered dataset. + """ + DatasetCatalog._REGISTERED.clear() + + +class Metadata(types.SimpleNamespace): + """ + A class that supports simple attribute setter/getter. + It is intended for storing metadata of a dataset and make it accessible globally. + + Examples: + + .. code-block:: python + + # somewhere when you load the data: + MetadataCatalog.get("mydataset").thing_classes = ["person", "dog"] + + # somewhere when you print statistics or visualize: + classes = MetadataCatalog.get("mydataset").thing_classes + """ + + # the name of the dataset + # set default to N/A so that `self.name` in the errors will not trigger getattr again + name: str = "N/A" + + _RENAMED = { + "class_names": "thing_classes", + "dataset_id_to_contiguous_id": "thing_dataset_id_to_contiguous_id", + "stuff_class_names": "stuff_classes", + } + + def __getattr__(self, key): + if key in self._RENAMED: + log_first_n( + logging.WARNING, + "Metadata '{}' was renamed to '{}'!".format(key, self._RENAMED[key]), + n=10, + ) + return getattr(self, self._RENAMED[key]) + + raise AttributeError( + "Attribute '{}' does not exist in the metadata of '{}'. Available keys are {}.".format( + key, self.name, str(self.__dict__.keys()) + ) + ) + + def __setattr__(self, key, val): + if key in self._RENAMED: + log_first_n( + logging.WARNING, + "Metadata '{}' was renamed to '{}'!".format(key, self._RENAMED[key]), + n=10, + ) + setattr(self, self._RENAMED[key], val) + + # Ensure that metadata of the same name stays consistent + try: + oldval = getattr(self, key) + assert oldval == val, ( + "Attribute '{}' in the metadata of '{}' cannot be set " + "to a different value!\n{} != {}".format(key, self.name, oldval, val) + ) + except AttributeError: + super().__setattr__(key, val) + + def as_dict(self): + """ + Returns all the metadata as a dict. + Note that modifications to the returned dict will not reflect on the Metadata object. + """ + return copy.copy(self.__dict__) + + def set(self, **kwargs): + """ + Set multiple metadata with kwargs. + """ + for k, v in kwargs.items(): + setattr(self, k, v) + return self + + def get(self, key, default=None): + """ + Access an attribute and return its value if exists. + Otherwise return default. + """ + try: + return getattr(self, key) + except AttributeError: + return default + + +class MetadataCatalog: + """ + MetadataCatalog provides access to "Metadata" of a given dataset. + + The metadata associated with a certain name is a singleton: once created, + the metadata will stay alive and will be returned by future calls to `get(name)`. + + It's like global variables, so don't abuse it. + It's meant for storing knowledge that's constant and shared across the execution + of the program, e.g.: the class names in COCO. + """ + + _NAME_TO_META = {} + + @staticmethod + def get(name): + """ + Args: + name (str): name of a dataset (e.g. coco_2014_train). + + Returns: + Metadata: The :class:`Metadata` instance associated with this name, + or create an empty one if none is available. + """ + assert len(name) + if name in MetadataCatalog._NAME_TO_META: + ret = MetadataCatalog._NAME_TO_META[name] + # TODO this is for the BC breaking change in D15247032. + # Remove this in the future. + if hasattr(ret, "dataset_name"): + logger = logging.getLogger() + logger.warning( + """ +The 'dataset_name' key in metadata is no longer used for +sharing metadata among splits after D15247032! Add +metadata to each split (now called dataset) separately! + """ + ) + parent_meta = MetadataCatalog.get(ret.dataset_name).as_dict() + ret.set(**parent_meta) + return ret + else: + m = MetadataCatalog._NAME_TO_META[name] = Metadata(name=name) + return m + + @staticmethod + def list(): + """ + List all registered metadata. + + Returns: + list[str]: keys (names of data) of all registered metadata + """ + return list(MetadataCatalog._NAME_TO_META.keys()) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/common.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/common.py new file mode 100644 index 0000000..a42c8b2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/common.py @@ -0,0 +1,149 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import logging +import numpy as np +import pickle +import random +import torch.utils.data as data + +from detectron2.utils.serialize import PicklableWrapper + +__all__ = ["MapDataset", "DatasetFromList", "AspectRatioGroupedDataset"] + + +class MapDataset(data.Dataset): + """ + Map a function over the elements in a dataset. + + Args: + dataset: a dataset where map function is applied. + map_func: a callable which maps the element in dataset. map_func is + responsible for error handling, when error happens, it needs to + return None so the MapDataset will randomly use other + elements from the dataset. + """ + + def __init__(self, dataset, map_func): + self._dataset = dataset + self._map_func = PicklableWrapper(map_func) # wrap so that a lambda will work + + self._rng = random.Random(42) + self._fallback_candidates = set(range(len(dataset))) + + def __len__(self): + return len(self._dataset) + + def __getitem__(self, idx): + retry_count = 0 + cur_idx = int(idx) + + while True: + data = self._map_func(self._dataset[cur_idx]) + if data is not None: + self._fallback_candidates.add(cur_idx) + return data + + # _map_func fails for this idx, use a random new index from the pool + retry_count += 1 + self._fallback_candidates.discard(cur_idx) + cur_idx = self._rng.sample(self._fallback_candidates, k=1)[0] + + if retry_count >= 3: + logger = logging.getLogger(__name__) + logger.warning( + "Failed to apply `_map_func` for idx: {}, retry count: {}".format( + idx, retry_count + ) + ) + + +class DatasetFromList(data.Dataset): + """ + Wrap a list to a torch Dataset. It produces elements of the list as data. + """ + + def __init__(self, lst: list, copy: bool = True, serialize: bool = True): + """ + Args: + lst (list): a list which contains elements to produce. + copy (bool): whether to deepcopy the element when producing it, + so that the result can be modified in place without affecting the + source in the list. + serialize (bool): whether to hold memory using serialized objects, when + enabled, data loader workers can use shared RAM from master + process instead of making a copy. + """ + self._lst = lst + self._copy = copy + self._serialize = serialize + + def _serialize(data): + buffer = pickle.dumps(data, protocol=-1) + return np.frombuffer(buffer, dtype=np.uint8) + + if self._serialize: + logger = logging.getLogger(__name__) + logger.info( + "Serializing {} elements to byte tensors and concatenating them all ...".format( + len(self._lst) + ) + ) + self._lst = [_serialize(x) for x in self._lst] + self._addr = np.asarray([len(x) for x in self._lst], dtype=np.int64) + self._addr = np.cumsum(self._addr) + self._lst = np.concatenate(self._lst) + logger.info("Serialized dataset takes {:.2f} MiB".format(len(self._lst) / 1024 ** 2)) + + def __len__(self): + if self._serialize: + return len(self._addr) + else: + return len(self._lst) + + def __getitem__(self, idx): + if self._serialize: + start_addr = 0 if idx == 0 else self._addr[idx - 1].item() + end_addr = self._addr[idx].item() + bytes = memoryview(self._lst[start_addr:end_addr]) + return pickle.loads(bytes) + elif self._copy: + return copy.deepcopy(self._lst[idx]) + else: + return self._lst[idx] + + +class AspectRatioGroupedDataset(data.IterableDataset): + """ + Batch data that have similar aspect ratio together. + In this implementation, images whose aspect ratio < (or >) 1 will + be batched together. + This improves training speed because the images then need less padding + to form a batch. + + It assumes the underlying dataset produces dicts with "width" and "height" keys. + It will then produce a list of original dicts with length = batch_size, + all with similar aspect ratios. + """ + + def __init__(self, dataset, batch_size): + """ + Args: + dataset: an iterable. Each element must be a dict with keys + "width" and "height", which will be used to batch data. + batch_size (int): + """ + self.dataset = dataset + self.batch_size = batch_size + self._buckets = [[] for _ in range(2)] + # Hard-coded two aspect ratio groups: w > h and w < h. + # Can add support for more aspect ratio groups, but doesn't seem useful + + def __iter__(self): + for d in self.dataset: + w, h = d["width"], d["height"] + bucket_id = 0 if w > h else 1 + bucket = self._buckets[bucket_id] + bucket.append(d) + if len(bucket) == self.batch_size: + yield bucket[:] + del bucket[:] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/dataset_mapper.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/dataset_mapper.py new file mode 100644 index 0000000..db73b37 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/dataset_mapper.py @@ -0,0 +1,149 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import logging +import numpy as np +import torch +from fvcore.common.file_io import PathManager +from PIL import Image + +from . import detection_utils as utils +from . import transforms as T + +""" +This file contains the default mapping that's applied to "dataset dicts". +""" + +__all__ = ["DatasetMapper"] + + +class DatasetMapper: + """ + A callable which takes a dataset dict in Detectron2 Dataset format, + and map it into a format used by the model. + + This is the default callable to be used to map your dataset dict into training data. + You may need to follow it to implement your own one for customized logic, + such as a different way to read or transform images. + See :doc:`/tutorials/data_loading` for details. + + The callable currently does the following: + + 1. Read the image from "file_name" + 2. Applies cropping/geometric transforms to the image and annotations + 3. Prepare data and annotations to Tensor and :class:`Instances` + """ + + def __init__(self, cfg, is_train=True): + if cfg.INPUT.CROP.ENABLED and is_train: + self.crop_gen = T.RandomCrop(cfg.INPUT.CROP.TYPE, cfg.INPUT.CROP.SIZE) + logging.getLogger(__name__).info("CropGen used in training: " + str(self.crop_gen)) + else: + self.crop_gen = None + + self.tfm_gens = utils.build_transform_gen(cfg, is_train) + + # fmt: off + self.img_format = cfg.INPUT.FORMAT + self.mask_on = cfg.MODEL.MASK_ON + self.mask_format = cfg.INPUT.MASK_FORMAT + self.keypoint_on = cfg.MODEL.KEYPOINT_ON + self.load_proposals = cfg.MODEL.LOAD_PROPOSALS + # fmt: on + if self.keypoint_on and is_train: + # Flip only makes sense in training + self.keypoint_hflip_indices = utils.create_keypoint_hflip_indices(cfg.DATASETS.TRAIN) + else: + self.keypoint_hflip_indices = None + + if self.load_proposals: + self.min_box_side_len = cfg.MODEL.PROPOSAL_GENERATOR.MIN_SIZE + self.proposal_topk = ( + cfg.DATASETS.PRECOMPUTED_PROPOSAL_TOPK_TRAIN + if is_train + else cfg.DATASETS.PRECOMPUTED_PROPOSAL_TOPK_TEST + ) + self.is_train = is_train + + def __call__(self, dataset_dict): + """ + Args: + dataset_dict (dict): Metadata of one image, in Detectron2 Dataset format. + + Returns: + dict: a format that builtin models in detectron2 accept + """ + dataset_dict = copy.deepcopy(dataset_dict) # it will be modified by code below + # USER: Write your own image loading if it's not from a file + image = utils.read_image(dataset_dict["file_name"], format=self.img_format) + utils.check_image_size(dataset_dict, image) + + if "annotations" not in dataset_dict: + image, transforms = T.apply_transform_gens( + ([self.crop_gen] if self.crop_gen else []) + self.tfm_gens, image + ) + else: + # Crop around an instance if there are instances in the image. + # USER: Remove if you don't use cropping + if self.crop_gen: + crop_tfm = utils.gen_crop_transform_with_instance( + self.crop_gen.get_crop_size(image.shape[:2]), + image.shape[:2], + np.random.choice(dataset_dict["annotations"]), + ) + image = crop_tfm.apply_image(image) + image, transforms = T.apply_transform_gens(self.tfm_gens, image) + if self.crop_gen: + transforms = crop_tfm + transforms + + image_shape = image.shape[:2] # h, w + + # Pytorch's dataloader is efficient on torch.Tensor due to shared-memory, + # but not efficient on large generic data structures due to the use of pickle & mp.Queue. + # Therefore it's important to use torch.Tensor. + dataset_dict["image"] = torch.as_tensor(np.ascontiguousarray(image.transpose(2, 0, 1))) + + # USER: Remove if you don't use pre-computed proposals. + if self.load_proposals: + utils.transform_proposals( + dataset_dict, image_shape, transforms, self.min_box_side_len, self.proposal_topk + ) + + if not self.is_train: + # USER: Modify this if you want to keep them for some reason. + dataset_dict.pop("annotations", None) + dataset_dict.pop("sem_seg_file_name", None) + return dataset_dict + + if "annotations" in dataset_dict: + # USER: Modify this if you want to keep them for some reason. + for anno in dataset_dict["annotations"]: + if not self.mask_on: + anno.pop("segmentation", None) + if not self.keypoint_on: + anno.pop("keypoints", None) + + # USER: Implement additional transformations if you have other types of data + annos = [ + utils.transform_instance_annotations( + obj, transforms, image_shape, keypoint_hflip_indices=self.keypoint_hflip_indices + ) + for obj in dataset_dict.pop("annotations") + if obj.get("iscrowd", 0) == 0 + ] + instances = utils.annotations_to_instances( + annos, image_shape, mask_format=self.mask_format + ) + # Create a tight bounding box from masks, useful when image is cropped + if self.crop_gen and instances.has("gt_masks"): + instances.gt_boxes = instances.gt_masks.get_bounding_boxes() + dataset_dict["instances"] = utils.filter_empty_instances(instances) + + # USER: Remove if you don't do semantic/panoptic segmentation. + if "sem_seg_file_name" in dataset_dict: + with PathManager.open(dataset_dict.pop("sem_seg_file_name"), "rb") as f: + sem_seg_gt = Image.open(f) + sem_seg_gt = np.asarray(sem_seg_gt, dtype="uint8") + sem_seg_gt = transforms.apply_segmentation(sem_seg_gt) + sem_seg_gt = torch.as_tensor(sem_seg_gt.astype("long")) + dataset_dict["sem_seg"] = sem_seg_gt + return dataset_dict diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/README.md b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/README.md new file mode 100644 index 0000000..9fb3e4f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/README.md @@ -0,0 +1,9 @@ + + +### Common Datasets + +The dataset implemented here do not need to load the data into the final format. +It should provide the minimal data structure needed to use the dataset, so it can be very efficient. + +For example, for an image dataset, just provide the file names and labels, but don't read the images. +Let the downstream decide how to read. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/__init__.py new file mode 100644 index 0000000..9c3f556 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .cityscapes import load_cityscapes_instances +from .coco import load_coco_json, load_sem_seg +from .lvis import load_lvis_json, register_lvis_instances, get_lvis_instances_meta +from .register_coco import register_coco_instances, register_coco_panoptic_separated +from . import builtin # ensure the builtin data are registered + + +__all__ = [k for k in globals().keys() if "builtin" not in k and not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin.py new file mode 100644 index 0000000..21ac222 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + + +""" +This file registers pre-defined data at hard-coded paths, and their metadata. + +We hard-code metadata for common data. This will enable: +1. Consistency check when loading the data +2. Use models on these standard data directly and run demos, + without having to download the dataset annotations + +We hard-code some paths to the dataset that's assumed to +exist in "./data/". + +Users SHOULD NOT use this file to create new dataset / metadata for new dataset. +To add new dataset, refer to the tutorial "docs/DATASETS.md". +""" + +import os + +from detectron2.data import DatasetCatalog, MetadataCatalog + +from .builtin_meta import _get_builtin_metadata +from .cityscapes import load_cityscapes_instances, load_cityscapes_semantic +from .lvis import get_lvis_instances_meta, register_lvis_instances +from .pascal_voc import register_pascal_voc +from .register_coco import register_coco_instances, register_coco_panoptic_separated + +# ==== Predefined data and splits for COCO ========== + +_PREDEFINED_SPLITS_COCO = {} +_PREDEFINED_SPLITS_COCO["coco"] = { + "coco_2014_train": ("coco/train2014", "coco/annotations/instances_train2014.json"), + "coco_2014_val": ("coco/val2014", "coco/annotations/instances_val2014.json"), + "coco_2014_minival": ("coco/val2014", "coco/annotations/instances_minival2014.json"), + "coco_2014_minival_100": ("coco/val2014", "coco/annotations/instances_minival2014_100.json"), + "coco_2014_valminusminival": ( + "coco/val2014", + "coco/annotations/instances_valminusminival2014.json", + ), + "coco_2017_train": ("coco/train2017", "coco/annotations/instances_train2017.json"), + "coco_2017_val": ("coco/val2017", "coco/annotations/instances_val2017.json"), + "coco_2017_test": ("coco/test2017", "coco/annotations/image_info_test2017.json"), + "coco_2017_test-dev": ("coco/test2017", "coco/annotations/image_info_test-dev2017.json"), + "coco_2017_val_100": ("coco/val2017", "coco/annotations/instances_val2017_100.json"), +} + +_PREDEFINED_SPLITS_COCO["coco_person"] = { + "keypoints_coco_2014_train": ( + "coco/train2014", + "coco/annotations/person_keypoints_train2014.json", + ), + "keypoints_coco_2014_val": ("coco/val2014", "coco/annotations/person_keypoints_val2014.json"), + "keypoints_coco_2014_minival": ( + "coco/val2014", + "coco/annotations/person_keypoints_minival2014.json", + ), + "keypoints_coco_2014_valminusminival": ( + "coco/val2014", + "coco/annotations/person_keypoints_valminusminival2014.json", + ), + "keypoints_coco_2014_minival_100": ( + "coco/val2014", + "coco/annotations/person_keypoints_minival2014_100.json", + ), + "keypoints_coco_2017_train": ( + "coco/train2017", + "coco/annotations/person_keypoints_train2017.json", + ), + "keypoints_coco_2017_val": ("coco/val2017", "coco/annotations/person_keypoints_val2017.json"), + "keypoints_coco_2017_val_100": ( + "coco/val2017", + "coco/annotations/person_keypoints_val2017_100.json", + ), +} + + +_PREDEFINED_SPLITS_COCO_PANOPTIC = { + "coco_2017_train_panoptic": ( + # This is the original panoptic annotation directory + "coco/panoptic_train2017", + "coco/annotations/panoptic_train2017.json", + # This directory contains semantic annotations that are + # converted from panoptic annotations. + # It is used by PanopticFPN. + # You can use the script at detectron2/data/prepare_panoptic_fpn.py + # to create these directories. + "coco/panoptic_stuff_train2017", + ), + "coco_2017_val_panoptic": ( + "coco/panoptic_val2017", + "coco/annotations/panoptic_val2017.json", + "coco/panoptic_stuff_val2017", + ), + "coco_2017_val_100_panoptic": ( + "coco/panoptic_val2017_100", + "coco/annotations/panoptic_val2017_100.json", + "coco/panoptic_stuff_val2017_100", + ), +} + + +def register_all_coco(root): + for dataset_name, splits_per_dataset in _PREDEFINED_SPLITS_COCO.items(): + for key, (image_root, json_file) in splits_per_dataset.items(): + # Assume pre-defined data live in `./data`. + register_coco_instances( + key, + _get_builtin_metadata(dataset_name), + os.path.join(root, json_file) if "://" not in json_file else json_file, + os.path.join(root, image_root), + ) + + for ( + prefix, + (panoptic_root, panoptic_json, semantic_root), + ) in _PREDEFINED_SPLITS_COCO_PANOPTIC.items(): + prefix_instances = prefix[: -len("_panoptic")] + instances_meta = MetadataCatalog.get(prefix_instances) + image_root, instances_json = instances_meta.image_root, instances_meta.json_file + register_coco_panoptic_separated( + prefix, + _get_builtin_metadata("coco_panoptic_separated"), + image_root, + os.path.join(root, panoptic_root), + os.path.join(root, panoptic_json), + os.path.join(root, semantic_root), + instances_json, + ) + + +# ==== Predefined data and splits for LVIS ========== + + +_PREDEFINED_SPLITS_LVIS = { + "lvis_v0.5": { + "lvis_v0.5_train": ("coco/train2017", "lvis/lvis_v0.5_train.json"), + "lvis_v0.5_val": ("coco/val2017", "lvis/lvis_v0.5_val.json"), + "lvis_v0.5_val_rand_100": ("coco/val2017", "lvis/lvis_v0.5_val_rand_100.json"), + "lvis_v0.5_test": ("coco/test2017", "lvis/lvis_v0.5_image_info_test.json"), + }, + "lvis_v0.5_cocofied": { + "lvis_v0.5_train_cocofied": ("coco/train2017", "lvis/lvis_v0.5_train_cocofied.json"), + "lvis_v0.5_val_cocofied": ("coco/val2017", "lvis/lvis_v0.5_val_cocofied.json"), + }, +} + + +def register_all_lvis(root): + for dataset_name, splits_per_dataset in _PREDEFINED_SPLITS_LVIS.items(): + for key, (image_root, json_file) in splits_per_dataset.items(): + # Assume pre-defined data live in `./data`. + register_lvis_instances( + key, + get_lvis_instances_meta(dataset_name), + os.path.join(root, json_file) if "://" not in json_file else json_file, + os.path.join(root, image_root), + ) + + +# ==== Predefined splits for raw cityscapes images =========== + + +_RAW_CITYSCAPES_SPLITS = { + "cityscapes_fine_{task}_train": ("cityscapes/leftImg8bit/train", "cityscapes/gtFine/train"), + "cityscapes_fine_{task}_val": ("cityscapes/leftImg8bit/val", "cityscapes/gtFine/val"), + "cityscapes_fine_{task}_test": ("cityscapes/leftImg8bit/test", "cityscapes/gtFine/test"), +} + + +def register_all_cityscapes(root): + for key, (image_dir, gt_dir) in _RAW_CITYSCAPES_SPLITS.items(): + meta = _get_builtin_metadata("cityscapes") + image_dir = os.path.join(root, image_dir) + gt_dir = os.path.join(root, gt_dir) + + inst_key = key.format(task="instance_seg") + DatasetCatalog.register( + inst_key, + lambda x=image_dir, y=gt_dir: load_cityscapes_instances( + x, y, from_json=True, to_polygons=True + ), + ) + MetadataCatalog.get(inst_key).set( + image_dir=image_dir, gt_dir=gt_dir, evaluator_type="cityscapes_instance", **meta + ) + + sem_key = key.format(task="sem_seg") + DatasetCatalog.register( + sem_key, lambda x=image_dir, y=gt_dir: load_cityscapes_semantic(x, y) + ) + MetadataCatalog.get(sem_key).set( + image_dir=image_dir, gt_dir=gt_dir, evaluator_type="cityscapes_sem_seg", **meta + ) + + +# ==== Predefined splits for PASCAL VOC =========== +def register_all_pascal_voc(root): + SPLITS = [ + ("voc_2007_trainval", "VOC2007", "trainval"), + ("voc_2007_train", "VOC2007", "train"), + ("voc_2007_val", "VOC2007", "val"), + ("voc_2007_test", "VOC2007", "test"), + ("voc_2012_trainval", "VOC2012", "trainval"), + ("voc_2012_train", "VOC2012", "train"), + ("voc_2012_val", "VOC2012", "val"), + ] + for name, dirname, split in SPLITS: + year = 2007 if "2007" in name else 2012 + register_pascal_voc(name, os.path.join(root, dirname), split, year) + MetadataCatalog.get(name).evaluator_type = "pascal_voc" + + +# Register them all under "./data" +_root = os.getenv("DETECTRON2_DATASETS", "data") +register_all_coco(_root) +register_all_lvis(_root) +register_all_cityscapes(_root) +register_all_pascal_voc(_root) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin_meta.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin_meta.py new file mode 100644 index 0000000..74c7986 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/builtin_meta.py @@ -0,0 +1,267 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + + +# All coco categories, together with their nice-looking visualization colors +# It's from https://github.com/cocodataset/panopticapi/blob/master/panoptic_coco_categories.json +COCO_CATEGORIES = [ + {"color": [220, 20, 60], "isthing": 1, "id": 1, "name": "person"}, + {"color": [119, 11, 32], "isthing": 1, "id": 2, "name": "bicycle"}, + {"color": [0, 0, 142], "isthing": 1, "id": 3, "name": "car"}, + {"color": [0, 0, 230], "isthing": 1, "id": 4, "name": "motorcycle"}, + {"color": [106, 0, 228], "isthing": 1, "id": 5, "name": "airplane"}, + {"color": [0, 60, 100], "isthing": 1, "id": 6, "name": "bus"}, + {"color": [0, 80, 100], "isthing": 1, "id": 7, "name": "train"}, + {"color": [0, 0, 70], "isthing": 1, "id": 8, "name": "truck"}, + {"color": [0, 0, 192], "isthing": 1, "id": 9, "name": "boat"}, + {"color": [250, 170, 30], "isthing": 1, "id": 10, "name": "traffic light"}, + {"color": [100, 170, 30], "isthing": 1, "id": 11, "name": "fire hydrant"}, + {"color": [220, 220, 0], "isthing": 1, "id": 13, "name": "stop sign"}, + {"color": [175, 116, 175], "isthing": 1, "id": 14, "name": "parking meter"}, + {"color": [250, 0, 30], "isthing": 1, "id": 15, "name": "bench"}, + {"color": [165, 42, 42], "isthing": 1, "id": 16, "name": "bird"}, + {"color": [255, 77, 255], "isthing": 1, "id": 17, "name": "cat"}, + {"color": [0, 226, 252], "isthing": 1, "id": 18, "name": "dog"}, + {"color": [182, 182, 255], "isthing": 1, "id": 19, "name": "horse"}, + {"color": [0, 82, 0], "isthing": 1, "id": 20, "name": "sheep"}, + {"color": [120, 166, 157], "isthing": 1, "id": 21, "name": "cow"}, + {"color": [110, 76, 0], "isthing": 1, "id": 22, "name": "elephant"}, + {"color": [174, 57, 255], "isthing": 1, "id": 23, "name": "bear"}, + {"color": [199, 100, 0], "isthing": 1, "id": 24, "name": "zebra"}, + {"color": [72, 0, 118], "isthing": 1, "id": 25, "name": "giraffe"}, + {"color": [255, 179, 240], "isthing": 1, "id": 27, "name": "backpack"}, + {"color": [0, 125, 92], "isthing": 1, "id": 28, "name": "umbrella"}, + {"color": [209, 0, 151], "isthing": 1, "id": 31, "name": "handbag"}, + {"color": [188, 208, 182], "isthing": 1, "id": 32, "name": "tie"}, + {"color": [0, 220, 176], "isthing": 1, "id": 33, "name": "suitcase"}, + {"color": [255, 99, 164], "isthing": 1, "id": 34, "name": "frisbee"}, + {"color": [92, 0, 73], "isthing": 1, "id": 35, "name": "skis"}, + {"color": [133, 129, 255], "isthing": 1, "id": 36, "name": "snowboard"}, + {"color": [78, 180, 255], "isthing": 1, "id": 37, "name": "sports ball"}, + {"color": [0, 228, 0], "isthing": 1, "id": 38, "name": "kite"}, + {"color": [174, 255, 243], "isthing": 1, "id": 39, "name": "baseball bat"}, + {"color": [45, 89, 255], "isthing": 1, "id": 40, "name": "baseball glove"}, + {"color": [134, 134, 103], "isthing": 1, "id": 41, "name": "skateboard"}, + {"color": [145, 148, 174], "isthing": 1, "id": 42, "name": "surfboard"}, + {"color": [255, 208, 186], "isthing": 1, "id": 43, "name": "tennis racket"}, + {"color": [197, 226, 255], "isthing": 1, "id": 44, "name": "bottle"}, + {"color": [171, 134, 1], "isthing": 1, "id": 46, "name": "wine glass"}, + {"color": [109, 63, 54], "isthing": 1, "id": 47, "name": "cup"}, + {"color": [207, 138, 255], "isthing": 1, "id": 48, "name": "fork"}, + {"color": [151, 0, 95], "isthing": 1, "id": 49, "name": "knife"}, + {"color": [9, 80, 61], "isthing": 1, "id": 50, "name": "spoon"}, + {"color": [84, 105, 51], "isthing": 1, "id": 51, "name": "bowl"}, + {"color": [74, 65, 105], "isthing": 1, "id": 52, "name": "banana"}, + {"color": [166, 196, 102], "isthing": 1, "id": 53, "name": "apple"}, + {"color": [208, 195, 210], "isthing": 1, "id": 54, "name": "sandwich"}, + {"color": [255, 109, 65], "isthing": 1, "id": 55, "name": "orange"}, + {"color": [0, 143, 149], "isthing": 1, "id": 56, "name": "broccoli"}, + {"color": [179, 0, 194], "isthing": 1, "id": 57, "name": "carrot"}, + {"color": [209, 99, 106], "isthing": 1, "id": 58, "name": "hot dog"}, + {"color": [5, 121, 0], "isthing": 1, "id": 59, "name": "pizza"}, + {"color": [227, 255, 205], "isthing": 1, "id": 60, "name": "donut"}, + {"color": [147, 186, 208], "isthing": 1, "id": 61, "name": "cake"}, + {"color": [153, 69, 1], "isthing": 1, "id": 62, "name": "chair"}, + {"color": [3, 95, 161], "isthing": 1, "id": 63, "name": "couch"}, + {"color": [163, 255, 0], "isthing": 1, "id": 64, "name": "potted plant"}, + {"color": [119, 0, 170], "isthing": 1, "id": 65, "name": "bed"}, + {"color": [0, 182, 199], "isthing": 1, "id": 67, "name": "dining table"}, + {"color": [0, 165, 120], "isthing": 1, "id": 70, "name": "toilet"}, + {"color": [183, 130, 88], "isthing": 1, "id": 72, "name": "tv"}, + {"color": [95, 32, 0], "isthing": 1, "id": 73, "name": "laptop"}, + {"color": [130, 114, 135], "isthing": 1, "id": 74, "name": "mouse"}, + {"color": [110, 129, 133], "isthing": 1, "id": 75, "name": "remote"}, + {"color": [166, 74, 118], "isthing": 1, "id": 76, "name": "keyboard"}, + {"color": [219, 142, 185], "isthing": 1, "id": 77, "name": "cell phone"}, + {"color": [79, 210, 114], "isthing": 1, "id": 78, "name": "microwave"}, + {"color": [178, 90, 62], "isthing": 1, "id": 79, "name": "oven"}, + {"color": [65, 70, 15], "isthing": 1, "id": 80, "name": "toaster"}, + {"color": [127, 167, 115], "isthing": 1, "id": 81, "name": "sink"}, + {"color": [59, 105, 106], "isthing": 1, "id": 82, "name": "refrigerator"}, + {"color": [142, 108, 45], "isthing": 1, "id": 84, "name": "book"}, + {"color": [196, 172, 0], "isthing": 1, "id": 85, "name": "clock"}, + {"color": [95, 54, 80], "isthing": 1, "id": 86, "name": "vase"}, + {"color": [128, 76, 255], "isthing": 1, "id": 87, "name": "scissors"}, + {"color": [201, 57, 1], "isthing": 1, "id": 88, "name": "teddy bear"}, + {"color": [246, 0, 122], "isthing": 1, "id": 89, "name": "hair drier"}, + {"color": [191, 162, 208], "isthing": 1, "id": 90, "name": "toothbrush"}, + {"color": [255, 255, 128], "isthing": 0, "id": 92, "name": "banner"}, + {"color": [147, 211, 203], "isthing": 0, "id": 93, "name": "blanket"}, + {"color": [150, 100, 100], "isthing": 0, "id": 95, "name": "bridge"}, + {"color": [168, 171, 172], "isthing": 0, "id": 100, "name": "cardboard"}, + {"color": [146, 112, 198], "isthing": 0, "id": 107, "name": "counter"}, + {"color": [210, 170, 100], "isthing": 0, "id": 109, "name": "curtain"}, + {"color": [92, 136, 89], "isthing": 0, "id": 112, "name": "door-stuff"}, + {"color": [218, 88, 184], "isthing": 0, "id": 118, "name": "floor-wood"}, + {"color": [241, 129, 0], "isthing": 0, "id": 119, "name": "flower"}, + {"color": [217, 17, 255], "isthing": 0, "id": 122, "name": "fruit"}, + {"color": [124, 74, 181], "isthing": 0, "id": 125, "name": "gravel"}, + {"color": [70, 70, 70], "isthing": 0, "id": 128, "name": "house"}, + {"color": [255, 228, 255], "isthing": 0, "id": 130, "name": "light"}, + {"color": [154, 208, 0], "isthing": 0, "id": 133, "name": "mirror-stuff"}, + {"color": [193, 0, 92], "isthing": 0, "id": 138, "name": "net"}, + {"color": [76, 91, 113], "isthing": 0, "id": 141, "name": "pillow"}, + {"color": [255, 180, 195], "isthing": 0, "id": 144, "name": "platform"}, + {"color": [106, 154, 176], "isthing": 0, "id": 145, "name": "playingfield"}, + {"color": [230, 150, 140], "isthing": 0, "id": 147, "name": "railroad"}, + {"color": [60, 143, 255], "isthing": 0, "id": 148, "name": "river"}, + {"color": [128, 64, 128], "isthing": 0, "id": 149, "name": "road"}, + {"color": [92, 82, 55], "isthing": 0, "id": 151, "name": "roof"}, + {"color": [254, 212, 124], "isthing": 0, "id": 154, "name": "sand"}, + {"color": [73, 77, 174], "isthing": 0, "id": 155, "name": "sea"}, + {"color": [255, 160, 98], "isthing": 0, "id": 156, "name": "shelf"}, + {"color": [255, 255, 255], "isthing": 0, "id": 159, "name": "snow"}, + {"color": [104, 84, 109], "isthing": 0, "id": 161, "name": "stairs"}, + {"color": [169, 164, 131], "isthing": 0, "id": 166, "name": "tent"}, + {"color": [225, 199, 255], "isthing": 0, "id": 168, "name": "towel"}, + {"color": [137, 54, 74], "isthing": 0, "id": 171, "name": "wall-brick"}, + {"color": [135, 158, 223], "isthing": 0, "id": 175, "name": "wall-stone"}, + {"color": [7, 246, 231], "isthing": 0, "id": 176, "name": "wall-tile"}, + {"color": [107, 255, 200], "isthing": 0, "id": 177, "name": "wall-wood"}, + {"color": [58, 41, 149], "isthing": 0, "id": 178, "name": "water-other"}, + {"color": [183, 121, 142], "isthing": 0, "id": 180, "name": "window-blind"}, + {"color": [255, 73, 97], "isthing": 0, "id": 181, "name": "window-other"}, + {"color": [107, 142, 35], "isthing": 0, "id": 184, "name": "tree-merged"}, + {"color": [190, 153, 153], "isthing": 0, "id": 185, "name": "fence-merged"}, + {"color": [146, 139, 141], "isthing": 0, "id": 186, "name": "ceiling-merged"}, + {"color": [70, 130, 180], "isthing": 0, "id": 187, "name": "sky-other-merged"}, + {"color": [134, 199, 156], "isthing": 0, "id": 188, "name": "cabinet-merged"}, + {"color": [209, 226, 140], "isthing": 0, "id": 189, "name": "table-merged"}, + {"color": [96, 36, 108], "isthing": 0, "id": 190, "name": "floor-other-merged"}, + {"color": [96, 96, 96], "isthing": 0, "id": 191, "name": "pavement-merged"}, + {"color": [64, 170, 64], "isthing": 0, "id": 192, "name": "mountain-merged"}, + {"color": [152, 251, 152], "isthing": 0, "id": 193, "name": "grass-merged"}, + {"color": [208, 229, 228], "isthing": 0, "id": 194, "name": "dirt-merged"}, + {"color": [206, 186, 171], "isthing": 0, "id": 195, "name": "paper-merged"}, + {"color": [152, 161, 64], "isthing": 0, "id": 196, "name": "food-other-merged"}, + {"color": [116, 112, 0], "isthing": 0, "id": 197, "name": "building-other-merged"}, + {"color": [0, 114, 143], "isthing": 0, "id": 198, "name": "rock-merged"}, + {"color": [102, 102, 156], "isthing": 0, "id": 199, "name": "wall-other-merged"}, + {"color": [250, 141, 255], "isthing": 0, "id": 200, "name": "rug-merged"}, +] + +# fmt: off +COCO_PERSON_KEYPOINT_NAMES = ( + "nose", + "left_eye", "right_eye", + "left_ear", "right_ear", + "left_shoulder", "right_shoulder", + "left_elbow", "right_elbow", + "left_wrist", "right_wrist", + "left_hip", "right_hip", + "left_knee", "right_knee", + "left_ankle", "right_ankle", +) +# fmt: on + +# Pairs of keypoints that should be exchanged under horizontal flipping +COCO_PERSON_KEYPOINT_FLIP_MAP = ( + ("left_eye", "right_eye"), + ("left_ear", "right_ear"), + ("left_shoulder", "right_shoulder"), + ("left_elbow", "right_elbow"), + ("left_wrist", "right_wrist"), + ("left_hip", "right_hip"), + ("left_knee", "right_knee"), + ("left_ankle", "right_ankle"), +) + +# rules for pairs of keypoints to draw a line between, and the line color to use. +KEYPOINT_CONNECTION_RULES = [ + # face + ("left_ear", "left_eye", (102, 204, 255)), + ("right_ear", "right_eye", (51, 153, 255)), + ("left_eye", "nose", (102, 0, 204)), + ("nose", "right_eye", (51, 102, 255)), + # upper-body + ("left_shoulder", "right_shoulder", (255, 128, 0)), + ("left_shoulder", "left_elbow", (153, 255, 204)), + ("right_shoulder", "right_elbow", (128, 229, 255)), + ("left_elbow", "left_wrist", (153, 255, 153)), + ("right_elbow", "right_wrist", (102, 255, 224)), + # lower-body + ("left_hip", "right_hip", (255, 102, 0)), + ("left_hip", "left_knee", (255, 255, 77)), + ("right_hip", "right_knee", (153, 255, 204)), + ("left_knee", "left_ankle", (191, 255, 128)), + ("right_knee", "right_ankle", (255, 195, 77)), +] + + +def _get_coco_instances_meta(): + thing_ids = [k["id"] for k in COCO_CATEGORIES if k["isthing"] == 1] + thing_colors = [k["color"] for k in COCO_CATEGORIES if k["isthing"] == 1] + assert len(thing_ids) == 80, len(thing_ids) + # Mapping from the incontiguous COCO category id to an id in [0, 79] + thing_dataset_id_to_contiguous_id = {k: i for i, k in enumerate(thing_ids)} + thing_classes = [k["name"] for k in COCO_CATEGORIES if k["isthing"] == 1] + ret = { + "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id, + "thing_classes": thing_classes, + "thing_colors": thing_colors, + } + return ret + + +def _get_coco_panoptic_separated_meta(): + """ + Returns metadata for "separated" version of the panoptic segmentation dataset. + """ + stuff_ids = [k["id"] for k in COCO_CATEGORIES if k["isthing"] == 0] + assert len(stuff_ids) == 53, len(stuff_ids) + + # For semantic segmentation, this mapping maps from contiguous stuff id + # (in [0, 53], used in models) to ids in the dataset (used for processing results) + # The id 0 is mapped to an extra category "thing". + stuff_dataset_id_to_contiguous_id = {k: i + 1 for i, k in enumerate(stuff_ids)} + # When converting COCO panoptic annotations to semantic annotations + # We label the "thing" category to 0 + stuff_dataset_id_to_contiguous_id[0] = 0 + + # 54 names for COCO stuff categories (including "things") + stuff_classes = ["things"] + [ + k["name"].replace("-other", "").replace("-merged", "") + for k in COCO_CATEGORIES + if k["isthing"] == 0 + ] + + # NOTE: I randomly picked a color for things + stuff_colors = [[82, 18, 128]] + [k["color"] for k in COCO_CATEGORIES if k["isthing"] == 0] + ret = { + "stuff_dataset_id_to_contiguous_id": stuff_dataset_id_to_contiguous_id, + "stuff_classes": stuff_classes, + "stuff_colors": stuff_colors, + } + ret.update(_get_coco_instances_meta()) + return ret + + +def _get_builtin_metadata(dataset_name): + if dataset_name == "coco": + return _get_coco_instances_meta() + if dataset_name == "coco_panoptic_separated": + return _get_coco_panoptic_separated_meta() + elif dataset_name == "coco_person": + return { + "thing_classes": ["person"], + "keypoint_names": COCO_PERSON_KEYPOINT_NAMES, + "keypoint_flip_map": COCO_PERSON_KEYPOINT_FLIP_MAP, + "keypoint_connection_rules": KEYPOINT_CONNECTION_RULES, + } + elif dataset_name == "cityscapes": + # fmt: off + CITYSCAPES_THING_CLASSES = [ + "person", "rider", "car", "truck", + "bus", "train", "motorcycle", "bicycle", + ] + CITYSCAPES_STUFF_CLASSES = [ + "road", "sidewalk", "building", "wall", "fence", "pole", "traffic light", + "traffic sign", "vegetation", "terrain", "sky", "person", "rider", "car", + "truck", "bus", "train", "motorcycle", "bicycle", "license plate", + ] + # fmt: on + return { + "thing_classes": CITYSCAPES_THING_CLASSES, + "stuff_classes": CITYSCAPES_STUFF_CLASSES, + } + raise KeyError("No built-in metadata for dataset {}".format(dataset_name)) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/cityscapes.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/cityscapes.py new file mode 100644 index 0000000..062a555 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/cityscapes.py @@ -0,0 +1,329 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import functools +import json +import logging +import multiprocessing as mp +import numpy as np +import os +from itertools import chain +import pycocotools.mask as mask_util +from fvcore.common.file_io import PathManager +from PIL import Image + +from detectron2.structures import BoxMode +from detectron2.utils.comm import get_world_size +from detectron2.utils.logger import setup_logger + +try: + import cv2 # noqa +except ImportError: + # OpenCV is an optional dependency at the moment + pass + + +logger = logging.getLogger(__name__) + + +def get_cityscapes_files(image_dir, gt_dir): + files = [] + # scan through the directory + cities = PathManager.ls(image_dir) + logger.info(f"{len(cities)} cities found in '{image_dir}'.") + for city in cities: + city_img_dir = os.path.join(image_dir, city) + city_gt_dir = os.path.join(gt_dir, city) + for basename in PathManager.ls(city_img_dir): + image_file = os.path.join(city_img_dir, basename) + + suffix = "leftImg8bit.png" + assert basename.endswith(suffix) + basename = basename[: -len(suffix)] + + instance_file = os.path.join(city_gt_dir, basename + "gtFine_instanceIds.png") + label_file = os.path.join(city_gt_dir, basename + "gtFine_labelIds.png") + json_file = os.path.join(city_gt_dir, basename + "gtFine_polygons.json") + + files.append((image_file, instance_file, label_file, json_file)) + assert len(files), "No images found in {}".format(image_dir) + for f in files[0]: + assert PathManager.isfile(f), f + return files + + +def load_cityscapes_instances(image_dir, gt_dir, from_json=True, to_polygons=True): + """ + Args: + image_dir (str): path to the raw dataset. e.g., "~/cityscapes/leftImg8bit/train". + gt_dir (str): path to the raw annotations. e.g., "~/cityscapes/gtFine/train". + from_json (bool): whether to read annotations from the raw json file or the png files. + to_polygons (bool): whether to represent the segmentation as polygons + (COCO's format) instead of masks (cityscapes's format). + + Returns: + list[dict]: a list of dicts in Detectron2 standard format. (See + `Using Custom Datasets `_ ) + """ + if from_json: + assert to_polygons, ( + "Cityscapes's json annotations are in polygon format. " + "Converting to mask format is not supported now." + ) + files = get_cityscapes_files(image_dir, gt_dir) + + logger.info("Preprocessing cityscapes annotations ...") + # This is still not fast: all workers will execute duplicate works and will + # take up to 10m on a 8GPU server. + pool = mp.Pool(processes=max(mp.cpu_count() // get_world_size() // 2, 4)) + + ret = pool.map( + functools.partial(cityscapes_files_to_dict, from_json=from_json, to_polygons=to_polygons), + files, + ) + logger.info("Loaded {} images from {}".format(len(ret), image_dir)) + + # Map cityscape ids to contiguous ids + from cityscapesscripts.helpers.labels import labels + + labels = [l for l in labels if l.hasInstances and not l.ignoreInEval] + dataset_id_to_contiguous_id = {l.id: idx for idx, l in enumerate(labels)} + for dict_per_image in ret: + for anno in dict_per_image["annotations"]: + anno["category_id"] = dataset_id_to_contiguous_id[anno["category_id"]] + return ret + + +def load_cityscapes_semantic(image_dir, gt_dir): + """ + Args: + image_dir (str): path to the raw dataset. e.g., "~/cityscapes/leftImg8bit/train". + gt_dir (str): path to the raw annotations. e.g., "~/cityscapes/gtFine/train". + + Returns: + list[dict]: a list of dict, each has "file_name" and + "sem_seg_file_name". + """ + ret = [] + # gt_dir is small and contain many small files. make sense to fetch to local first + gt_dir = PathManager.get_local_path(gt_dir) + for image_file, _, label_file, json_file in get_cityscapes_files(image_dir, gt_dir): + label_file = label_file.replace("labelIds", "labelTrainIds") + + with PathManager.open(json_file, "r") as f: + jsonobj = json.load(f) + ret.append( + { + "file_name": image_file, + "sem_seg_file_name": label_file, + "height": jsonobj["imgHeight"], + "width": jsonobj["imgWidth"], + } + ) + assert len(ret), f"No images found in {image_dir}!" + assert PathManager.isfile( + ret[0]["sem_seg_file_name"] + ), "Please generate labelTrainIds.png with cityscapesscripts/preparation/createTrainIdLabelImgs.py" # noqa + return ret + + +def cityscapes_files_to_dict(files, from_json, to_polygons): + """ + Parse cityscapes annotation files to a instance segmentation dataset dict. + + Args: + files (tuple): consists of (image_file, instance_id_file, label_id_file, json_file) + from_json (bool): whether to read annotations from the raw json file or the png files. + to_polygons (bool): whether to represent the segmentation as polygons + (COCO's format) instead of masks (cityscapes's format). + + Returns: + A dict in Detectron2 Dataset format. + """ + from cityscapesscripts.helpers.labels import id2label, name2label + + image_file, instance_id_file, _, json_file = files + + annos = [] + + if from_json: + from shapely.geometry import MultiPolygon, Polygon + + with PathManager.open(json_file, "r") as f: + jsonobj = json.load(f) + ret = { + "file_name": image_file, + "image_id": os.path.basename(image_file), + "height": jsonobj["imgHeight"], + "width": jsonobj["imgWidth"], + } + + # `polygons_union` contains the union of all valid polygons. + polygons_union = Polygon() + + # CityscapesScripts draw the polygons in sequential order + # and each polygon *overwrites* existing ones. See + # (https://github.com/mcordts/cityscapesScripts/blob/master/cityscapesscripts/preparation/json2instanceImg.py) # noqa + # We use reverse order, and each polygon *avoids* early ones. + # This will resolve the ploygon overlaps in the same way as CityscapesScripts. + for obj in jsonobj["objects"][::-1]: + if "deleted" in obj: # cityscapes data format specific + continue + label_name = obj["label"] + + try: + label = name2label[label_name] + except KeyError: + if label_name.endswith("group"): # crowd area + label = name2label[label_name[: -len("group")]] + else: + raise + if label.id < 0: # cityscapes data format + continue + + # Cityscapes's raw annotations uses integer coordinates + # Therefore +0.5 here + poly_coord = np.asarray(obj["polygon"], dtype="f4") + 0.5 + # CityscapesScript uses PIL.ImageDraw.polygon to rasterize + # polygons for evaluation. This function operates in integer space + # and draws each pixel whose center falls into the polygon. + # Therefore it draws a polygon which is 0.5 "fatter" in expectation. + # We therefore dilate the input polygon by 0.5 as our input. + poly = Polygon(poly_coord).buffer(0.5, resolution=4) + + if not label.hasInstances or label.ignoreInEval: + # even if we won't store the polygon it still contributes to overlaps resolution + polygons_union = polygons_union.union(poly) + continue + + # Take non-overlapping part of the polygon + poly_wo_overlaps = poly.difference(polygons_union) + if poly_wo_overlaps.is_empty: + continue + polygons_union = polygons_union.union(poly) + + anno = {} + anno["iscrowd"] = label_name.endswith("group") + anno["category_id"] = label.id + + if isinstance(poly_wo_overlaps, Polygon): + poly_list = [poly_wo_overlaps] + elif isinstance(poly_wo_overlaps, MultiPolygon): + poly_list = poly_wo_overlaps.geoms + else: + raise NotImplementedError("Unknown geometric structure {}".format(poly_wo_overlaps)) + + poly_coord = [] + for poly_el in poly_list: + # COCO API can work only with exterior boundaries now, hence we store only them. + # TODO: store both exterior and interior boundaries once other parts of the + # codebase support holes in polygons. + poly_coord.append(list(chain(*poly_el.exterior.coords))) + anno["segmentation"] = poly_coord + (xmin, ymin, xmax, ymax) = poly_wo_overlaps.bounds + + anno["bbox"] = (xmin, ymin, xmax, ymax) + anno["bbox_mode"] = BoxMode.XYXY_ABS + + annos.append(anno) + else: + # See also the official annotation parsing scripts at + # https://github.com/mcordts/cityscapesScripts/blob/master/cityscapesscripts/evaluation/instances2dict.py # noqa + with PathManager.open(instance_id_file, "rb") as f: + inst_image = np.asarray(Image.open(f), order="F") + # ids < 24 are stuff labels (filtering them first is about 5% faster) + flattened_ids = np.unique(inst_image[inst_image >= 24]) + + ret = { + "file_name": image_file, + "image_id": os.path.basename(image_file), + "height": inst_image.shape[0], + "width": inst_image.shape[1], + } + + for instance_id in flattened_ids: + # For non-crowd annotations, instance_id // 1000 is the label_id + # Crowd annotations have <1000 instance ids + label_id = instance_id // 1000 if instance_id >= 1000 else instance_id + label = id2label[label_id] + if not label.hasInstances or label.ignoreInEval: + continue + + anno = {} + anno["iscrowd"] = instance_id < 1000 + anno["category_id"] = label.id + + mask = np.asarray(inst_image == instance_id, dtype=np.uint8, order="F") + + inds = np.nonzero(mask) + ymin, ymax = inds[0].min(), inds[0].max() + xmin, xmax = inds[1].min(), inds[1].max() + anno["bbox"] = (xmin, ymin, xmax, ymax) + if xmax <= xmin or ymax <= ymin: + continue + anno["bbox_mode"] = BoxMode.XYXY_ABS + if to_polygons: + # This conversion comes from D4809743 and D5171122, + # when Mask-RCNN was first developed. + contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[ + -2 + ] + polygons = [c.reshape(-1).tolist() for c in contours if len(c) >= 3] + # opencv's can produce invalid polygons + if len(polygons) == 0: + continue + anno["segmentation"] = polygons + else: + anno["segmentation"] = mask_util.encode(mask[:, :, None])[0] + annos.append(anno) + ret["annotations"] = annos + return ret + + +if __name__ == "__main__": + """ + Test the cityscapes dataset loader. + + Usage: + python -m detectron2.data.data.cityscapes \ + cityscapes/leftImg8bit/train cityscapes/gtFine/train + """ + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("image_dir") + parser.add_argument("gt_dir") + parser.add_argument("--type", choices=["instance", "semantic"], default="instance") + args = parser.parse_args() + from detectron2.data.catalog import Metadata + from detectron2.utils.visualizer import Visualizer + from cityscapesscripts.helpers.labels import labels + + logger = setup_logger(name=__name__) + + dirname = "cityscapes-data-vis" + os.makedirs(dirname, exist_ok=True) + + if args.type == "instance": + dicts = load_cityscapes_instances( + args.image_dir, args.gt_dir, from_json=True, to_polygons=True + ) + logger.info("Done loading {} samples.".format(len(dicts))) + + thing_classes = [k.name for k in labels if k.hasInstances and not k.ignoreInEval] + meta = Metadata().set(thing_classes=thing_classes) + + else: + dicts = load_cityscapes_semantic(args.image_dir, args.gt_dir) + logger.info("Done loading {} samples.".format(len(dicts))) + + stuff_names = [k.name for k in labels if k.trainId != 255] + stuff_colors = [k.color for k in labels if k.trainId != 255] + meta = Metadata().set(stuff_names=stuff_names, stuff_colors=stuff_colors) + + for d in dicts: + img = np.array(Image.open(PathManager.open(d["file_name"], "rb"))) + visualizer = Visualizer(img, metadata=meta) + vis = visualizer.draw_dataset_dict(d) + # cv2.imshow("a", vis.get_image()[:, :, ::-1]) + # cv2.waitKey() + fpath = os.path.join(dirname, os.path.basename(d["file_name"])) + vis.save(fpath) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/coco.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/coco.py new file mode 100644 index 0000000..f6f099e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/coco.py @@ -0,0 +1,466 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import contextlib +import datetime +import io +import json +import logging +import numpy as np +import os +import pycocotools.mask as mask_util +from fvcore.common.file_io import PathManager, file_lock +from fvcore.common.timer import Timer +from PIL import Image + +from detectron2.structures import Boxes, BoxMode, PolygonMasks + +from .. import DatasetCatalog, MetadataCatalog + +""" +This file contains functions to parse COCO-format annotations into dicts in "Detectron2 format". +""" + + +logger = logging.getLogger(__name__) + +__all__ = ["load_coco_json", "load_sem_seg", "convert_to_coco_json"] + + +def load_coco_json(json_file, image_root, dataset_name=None, extra_annotation_keys=None): + """ + Load a json file with COCO's instances annotation format. + Currently supports instance detection, instance segmentation, + and person keypoints annotations. + + Args: + json_file (str): full path to the json file in COCO instances annotation format. + image_root (str or path-like): the directory where the images in this json file exists. + dataset_name (str): the name of the dataset (e.g., coco_2017_train). + If provided, this function will also put "thing_classes" into + the metadata associated with this dataset. + extra_annotation_keys (list[str]): list of per-annotation keys that should also be + loaded into the dataset dict (besides "iscrowd", "bbox", "keypoints", + "category_id", "segmentation"). The values for these keys will be returned as-is. + For example, the densepose annotations are loaded in this way. + + Returns: + list[dict]: a list of dicts in Detectron2 standard dataset dicts format. (See + `Using Custom Datasets `_ ) + + Notes: + 1. This function does not read the image files. + The results do not have the "image" field. + """ + from pycocotools.coco import COCO + + timer = Timer() + json_file = PathManager.get_local_path(json_file) + with contextlib.redirect_stdout(io.StringIO()): + coco_api = COCO(json_file) + if timer.seconds() > 1: + logger.info("Loading {} takes {:.2f} seconds.".format(json_file, timer.seconds())) + + id_map = None + if dataset_name is not None: + meta = MetadataCatalog.get(dataset_name) + cat_ids = sorted(coco_api.getCatIds()) + cats = coco_api.loadCats(cat_ids) + # The categories in a custom json file may not be sorted. + thing_classes = [c["name"] for c in sorted(cats, key=lambda x: x["id"])] + meta.thing_classes = thing_classes + + # In COCO, certain category ids are artificially removed, + # and by convention they are always ignored. + # We deal with COCO's id issue and translate + # the category ids to contiguous ids in [0, 80). + + # It works by looking at the "categories" field in the json, therefore + # if users' own json also have incontiguous ids, we'll + # apply this mapping as well but print a warning. + if not (min(cat_ids) == 1 and max(cat_ids) == len(cat_ids)): + if "coco" not in dataset_name: + logger.warning( + """ +Category ids in annotations are not in [1, #categories]! We'll apply a mapping for you. +""" + ) + id_map = {v: i for i, v in enumerate(cat_ids)} + meta.thing_dataset_id_to_contiguous_id = id_map + + # sort indices for reproducible results + img_ids = sorted(coco_api.imgs.keys()) + # imgs is a list of dicts, each looks something like: + # {'license': 4, + # 'url': 'http://farm6.staticflickr.com/5454/9413846304_881d5e5c3b_z.jpg', + # 'file_name': 'COCO_val2014_000000001268.jpg', + # 'height': 427, + # 'width': 640, + # 'date_captured': '2013-11-17 05:57:24', + # 'id': 1268} + imgs = coco_api.loadImgs(img_ids) + # anns is a list[list[dict]], where each dict is an annotation + # record for an object. The inner list enumerates the objects in an image + # and the outer list enumerates over images. Example of anns[0]: + # [{'segmentation': [[192.81, + # 247.09, + # ... + # 219.03, + # 249.06]], + # 'area': 1035.749, + # 'iscrowd': 0, + # 'image_id': 1268, + # 'bbox': [192.81, 224.8, 74.73, 33.43], + # 'category_id': 16, + # 'id': 42986}, + # ...] + anns = [coco_api.imgToAnns[img_id] for img_id in img_ids] + + if "minival" not in json_file: + # The popular valminusminival & minival annotations for COCO2014 contain this bug. + # However the ratio of buggy annotations there is tiny and does not affect accuracy. + # Therefore we explicitly white-list them. + ann_ids = [ann["id"] for anns_per_image in anns for ann in anns_per_image] + assert len(set(ann_ids)) == len(ann_ids), "Annotation ids in '{}' are not unique!".format( + json_file + ) + + imgs_anns = list(zip(imgs, anns)) + + logger.info("Loaded {} images in COCO format from {}".format(len(imgs_anns), json_file)) + + dataset_dicts = [] + + ann_keys = ["iscrowd", "bbox", "keypoints", "category_id"] + (extra_annotation_keys or []) + + num_instances_without_valid_segmentation = 0 + + for (img_dict, anno_dict_list) in imgs_anns: + record = {} + record["file_name"] = os.path.join(image_root, img_dict["file_name"]) + record["height"] = img_dict["height"] + record["width"] = img_dict["width"] + image_id = record["image_id"] = img_dict["id"] + + objs = [] + for anno in anno_dict_list: + # Check that the image_id in this annotation is the same as + # the image_id we're looking at. + # This fails only when the data parsing logic or the annotation file is buggy. + + # The original COCO valminusminival2014 & minival2014 annotation files + # actually contains bugs that, together with certain ways of using COCO API, + # can trigger this assertion. + assert anno["image_id"] == image_id + + assert anno.get("ignore", 0) == 0, '"ignore" in COCO json file is not supported.' + + obj = {key: anno[key] for key in ann_keys if key in anno} + + segm = anno.get("segmentation", None) + if segm: # either list[list[float]] or dict(RLE) + if not isinstance(segm, dict): + # filter out invalid polygons (< 3 points) + segm = [poly for poly in segm if len(poly) % 2 == 0 and len(poly) >= 6] + if len(segm) == 0: + num_instances_without_valid_segmentation += 1 + continue # ignore this instance + obj["segmentation"] = segm + + keypts = anno.get("keypoints", None) + if keypts: # list[int] + for idx, v in enumerate(keypts): + if idx % 3 != 2: + # COCO's segmentation coordinates are floating points in [0, H or W], + # but keypoint coordinates are integers in [0, H-1 or W-1] + # Therefore we assume the coordinates are "pixel indices" and + # add 0.5 to convert to floating point coordinates. + keypts[idx] = v + 0.5 + obj["keypoints"] = keypts + + obj["bbox_mode"] = BoxMode.XYWH_ABS + if id_map: + obj["category_id"] = id_map[obj["category_id"]] + objs.append(obj) + record["annotations"] = objs + dataset_dicts.append(record) + + if num_instances_without_valid_segmentation > 0: + logger.warning( + "Filtered out {} instances without valid segmentation. " + "There might be issues in your dataset generation process.".format( + num_instances_without_valid_segmentation + ) + ) + return dataset_dicts + + +def load_sem_seg(gt_root, image_root, gt_ext="png", image_ext="jpg"): + """ + Load semantic segmentation data. All files under "gt_root" with "gt_ext" extension are + treated as ground truth annotations and all files under "image_root" with "image_ext" extension + as input images. Ground truth and input images are matched using file paths relative to + "gt_root" and "image_root" respectively without taking into account file extensions. + This works for COCO as well as some other data. + + Args: + gt_root (str): full path to ground truth semantic segmentation files. Semantic segmentation + annotations are stored as images with integer values in pixels that represent + corresponding semantic labels. + image_root (str): the directory where the input images are. + gt_ext (str): file extension for ground truth annotations. + image_ext (str): file extension for input images. + + Returns: + list[dict]: + a list of dicts in detectron2 standard format without instance-level + annotation. + + Notes: + 1. This function does not read the image and ground truth files. + The results do not have the "image" and "sem_seg" fields. + """ + + # We match input images with ground truth based on their relative filepaths (without file + # extensions) starting from 'image_root' and 'gt_root' respectively. + def file2id(folder_path, file_path): + # extract relative path starting from `folder_path` + image_id = os.path.normpath(os.path.relpath(file_path, start=folder_path)) + # remove file extension + image_id = os.path.splitext(image_id)[0] + return image_id + + input_files = sorted( + (os.path.join(image_root, f) for f in PathManager.ls(image_root) if f.endswith(image_ext)), + key=lambda file_path: file2id(image_root, file_path), + ) + gt_files = sorted( + (os.path.join(gt_root, f) for f in PathManager.ls(gt_root) if f.endswith(gt_ext)), + key=lambda file_path: file2id(gt_root, file_path), + ) + + assert len(gt_files) > 0, "No annotations found in {}.".format(gt_root) + + # Use the intersection, so that val2017_100 annotations can run smoothly with val2017 images + if len(input_files) != len(gt_files): + logger.warn( + "Directory {} and {} has {} and {} files, respectively.".format( + image_root, gt_root, len(input_files), len(gt_files) + ) + ) + input_basenames = [os.path.basename(f)[: -len(image_ext)] for f in input_files] + gt_basenames = [os.path.basename(f)[: -len(gt_ext)] for f in gt_files] + intersect = list(set(input_basenames) & set(gt_basenames)) + # sort, otherwise each worker may obtain a list[dict] in different order + intersect = sorted(intersect) + logger.warn("Will use their intersection of {} files.".format(len(intersect))) + input_files = [os.path.join(image_root, f + image_ext) for f in intersect] + gt_files = [os.path.join(gt_root, f + gt_ext) for f in intersect] + + logger.info( + "Loaded {} images with semantic segmentation from {}".format(len(input_files), image_root) + ) + + dataset_dicts = [] + for (img_path, gt_path) in zip(input_files, gt_files): + record = {} + record["file_name"] = img_path + record["sem_seg_file_name"] = gt_path + dataset_dicts.append(record) + + return dataset_dicts + + +def convert_to_coco_dict(dataset_name): + """ + Convert an instance detection/segmentation or keypoint detection dataset + in detectron2's standard format into COCO json format. + + Generic dataset description can be found here: + https://detectron2.readthedocs.io/tutorials/datasets.html#register-a-dataset + + COCO data format description can be found here: + http://cocodataset.org/#format-data + + Args: + dataset_name (str): + name of the source dataset + Must be registered in DatastCatalog and in detectron2's standard format. + Must have corresponding metadata "thing_classes" + Returns: + coco_dict: serializable dict in COCO json format + """ + + dataset_dicts = DatasetCatalog.get(dataset_name) + metadata = MetadataCatalog.get(dataset_name) + + # unmap the category mapping ids for COCO + if hasattr(metadata, "thing_dataset_id_to_contiguous_id"): + reverse_id_mapping = {v: k for k, v in metadata.thing_dataset_id_to_contiguous_id.items()} + reverse_id_mapper = lambda contiguous_id: reverse_id_mapping[contiguous_id] # noqa + else: + reverse_id_mapper = lambda contiguous_id: contiguous_id # noqa + + categories = [ + {"id": reverse_id_mapper(id), "name": name} + for id, name in enumerate(metadata.thing_classes) + ] + + logger.info("Converting dataset dicts into COCO format") + coco_images = [] + coco_annotations = [] + + for image_id, image_dict in enumerate(dataset_dicts): + coco_image = { + "id": image_dict.get("image_id", image_id), + "width": image_dict["width"], + "height": image_dict["height"], + "file_name": image_dict["file_name"], + } + coco_images.append(coco_image) + + anns_per_image = image_dict["annotations"] + for annotation in anns_per_image: + # create a new dict with only COCO fields + coco_annotation = {} + + # COCO requirement: XYWH box format + bbox = annotation["bbox"] + bbox_mode = annotation["bbox_mode"] + bbox = BoxMode.convert(bbox, bbox_mode, BoxMode.XYWH_ABS) + + # COCO requirement: instance area + if "segmentation" in annotation: + # Computing areas for instances by counting the pixels + segmentation = annotation["segmentation"] + # TODO: check segmentation type: RLE, BinaryMask or Polygon + if isinstance(segmentation, list): + polygons = PolygonMasks([segmentation]) + area = polygons.area()[0].item() + elif isinstance(segmentation, dict): # RLE + area = mask_util.area(segmentation).item() + else: + raise TypeError(f"Unknown segmentation type {type(segmentation)}!") + else: + # Computing areas using bounding boxes + bbox_xy = BoxMode.convert(bbox, BoxMode.XYWH_ABS, BoxMode.XYXY_ABS) + area = Boxes([bbox_xy]).area()[0].item() + + if "keypoints" in annotation: + keypoints = annotation["keypoints"] # list[int] + for idx, v in enumerate(keypoints): + if idx % 3 != 2: + # COCO's segmentation coordinates are floating points in [0, H or W], + # but keypoint coordinates are integers in [0, H-1 or W-1] + # For COCO format consistency we substract 0.5 + # https://github.com/facebookresearch/detectron2/pull/175#issuecomment-551202163 + keypoints[idx] = v - 0.5 + if "num_keypoints" in annotation: + num_keypoints = annotation["num_keypoints"] + else: + num_keypoints = sum(kp > 0 for kp in keypoints[2::3]) + + # COCO requirement: + # linking annotations to images + # "id" field must start with 1 + coco_annotation["id"] = len(coco_annotations) + 1 + coco_annotation["image_id"] = coco_image["id"] + coco_annotation["bbox"] = [round(float(x), 3) for x in bbox] + coco_annotation["area"] = float(area) + coco_annotation["iscrowd"] = annotation.get("iscrowd", 0) + coco_annotation["category_id"] = reverse_id_mapper(annotation["category_id"]) + + # Add optional fields + if "keypoints" in annotation: + coco_annotation["keypoints"] = keypoints + coco_annotation["num_keypoints"] = num_keypoints + + if "segmentation" in annotation: + coco_annotation["segmentation"] = annotation["segmentation"] + if isinstance(coco_annotation["segmentation"], dict): # RLE + coco_annotation["segmentation"]["counts"] = coco_annotation["segmentation"][ + "counts" + ].decode("ascii") + + coco_annotations.append(coco_annotation) + + logger.info( + "Conversion finished, " + f"#images: {len(coco_images)}, #annotations: {len(coco_annotations)}" + ) + + info = { + "date_created": str(datetime.datetime.now()), + "description": "Automatically generated COCO json file for Detectron2.", + } + coco_dict = { + "info": info, + "images": coco_images, + "annotations": coco_annotations, + "categories": categories, + "licenses": None, + } + return coco_dict + + +def convert_to_coco_json(dataset_name, output_file, allow_cached=True): + """ + Converts dataset into COCO format and saves it to a json file. + dataset_name must be registered in DatasetCatalog and in detectron2's standard format. + + Args: + dataset_name: + reference from the config file to the catalogs + must be registered in DatasetCatalog and in detectron2's standard format + output_file: path of json file that will be saved to + allow_cached: if json file is already present then skip conversion + """ + + # TODO: The dataset or the conversion script *may* change, + # a checksum would be useful for validating the cached data + + PathManager.mkdirs(os.path.dirname(output_file)) + with file_lock(output_file): + if PathManager.exists(output_file) and allow_cached: + logger.warning( + f"Using previously cached COCO format annotations at '{output_file}'. " + "You need to clear the cache file if your dataset has been modified." + ) + else: + logger.info(f"Converting annotations of dataset '{dataset_name}' to COCO format ...)") + coco_dict = convert_to_coco_dict(dataset_name) + + logger.info(f"Caching COCO format annotations at '{output_file}' ...") + with PathManager.open(output_file, "w") as f: + json.dump(coco_dict, f) + + +if __name__ == "__main__": + """ + Test the COCO json dataset loader. + + Usage: + python -m detectron2.data.data.coco \ + path/to/json path/to/image_root dataset_name + + "dataset_name" can be "coco_2014_minival_100", or other + pre-registered ones + """ + from detectron2.utils.logger import setup_logger + from detectron2.utils.visualizer import Visualizer + import detectron2.data.datasets # noqa # add pre-defined metadata + import sys + + logger = setup_logger(name=__name__) + assert sys.argv[3] in DatasetCatalog.list() + meta = MetadataCatalog.get(sys.argv[3]) + + dicts = load_coco_json(sys.argv[1], sys.argv[2], sys.argv[3]) + logger.info("Done loading {} samples.".format(len(dicts))) + + dirname = "coco-data-vis" + os.makedirs(dirname, exist_ok=True) + for d in dicts: + img = np.array(Image.open(d["file_name"])) + visualizer = Visualizer(img, metadata=meta) + vis = visualizer.draw_dataset_dict(d) + fpath = os.path.join(dirname, os.path.basename(d["file_name"])) + vis.save(fpath) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis.py new file mode 100644 index 0000000..7b95be3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis.py @@ -0,0 +1,209 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import os +from fvcore.common.file_io import PathManager +from fvcore.common.timer import Timer + +from detectron2.data import DatasetCatalog, MetadataCatalog +from detectron2.structures import BoxMode + +from .builtin_meta import _get_coco_instances_meta +from .lvis_v0_5_categories import LVIS_CATEGORIES + +""" +This file contains functions to parse LVIS-format annotations into dicts in the +"Detectron2 format". +""" + +logger = logging.getLogger(__name__) + +__all__ = ["load_lvis_json", "register_lvis_instances", "get_lvis_instances_meta"] + + +def register_lvis_instances(name, metadata, json_file, image_root): + """ + Register a dataset in LVIS's json annotation format for instance detection and segmentation. + + Args: + name (str): a name that identifies the dataset, e.g. "lvis_v0.5_train". + metadata (dict): extra metadata associated with this dataset. It can be an empty dict. + json_file (str): path to the json instance annotation file. + image_root (str or path-like): directory which contains all the images. + """ + DatasetCatalog.register(name, lambda: load_lvis_json(json_file, image_root, name)) + MetadataCatalog.get(name).set( + json_file=json_file, image_root=image_root, evaluator_type="lvis", **metadata + ) + + +def load_lvis_json(json_file, image_root, dataset_name=None): + """ + Load a json file in LVIS's annotation format. + + Args: + json_file (str): full path to the LVIS json annotation file. + image_root (str): the directory where the images in this json file exists. + dataset_name (str): the name of the dataset (e.g., "lvis_v0.5_train"). + If provided, this function will put "thing_classes" into the metadata + associated with this dataset. + + Returns: + list[dict]: a list of dicts in Detectron2 standard format. (See + `Using Custom Datasets `_ ) + + Notes: + 1. This function does not read the image files. + The results do not have the "image" field. + """ + from lvis import LVIS + + json_file = PathManager.get_local_path(json_file) + + timer = Timer() + lvis_api = LVIS(json_file) + if timer.seconds() > 1: + logger.info("Loading {} takes {:.2f} seconds.".format(json_file, timer.seconds())) + + if dataset_name is not None: + meta = get_lvis_instances_meta(dataset_name) + MetadataCatalog.get(dataset_name).set(**meta) + + # sort indices for reproducible results + img_ids = sorted(lvis_api.imgs.keys()) + # imgs is a list of dicts, each looks something like: + # {'license': 4, + # 'url': 'http://farm6.staticflickr.com/5454/9413846304_881d5e5c3b_z.jpg', + # 'file_name': 'COCO_val2014_000000001268.jpg', + # 'height': 427, + # 'width': 640, + # 'date_captured': '2013-11-17 05:57:24', + # 'id': 1268} + imgs = lvis_api.load_imgs(img_ids) + # anns is a list[list[dict]], where each dict is an annotation + # record for an object. The inner list enumerates the objects in an image + # and the outer list enumerates over images. Example of anns[0]: + # [{'segmentation': [[192.81, + # 247.09, + # ... + # 219.03, + # 249.06]], + # 'area': 1035.749, + # 'image_id': 1268, + # 'bbox': [192.81, 224.8, 74.73, 33.43], + # 'category_id': 16, + # 'id': 42986}, + # ...] + anns = [lvis_api.img_ann_map[img_id] for img_id in img_ids] + + # Sanity check that each annotation has a unique id + ann_ids = [ann["id"] for anns_per_image in anns for ann in anns_per_image] + assert len(set(ann_ids)) == len(ann_ids), "Annotation ids in '{}' are not unique".format( + json_file + ) + + imgs_anns = list(zip(imgs, anns)) + + logger.info("Loaded {} images in the LVIS format from {}".format(len(imgs_anns), json_file)) + + dataset_dicts = [] + + for (img_dict, anno_dict_list) in imgs_anns: + record = {} + file_name = img_dict["file_name"] + if img_dict["file_name"].startswith("COCO"): + # Convert form the COCO 2014 file naming convention of + # COCO_[train/val/test]2014_000000000000.jpg to the 2017 naming convention of + # 000000000000.jpg (LVIS v1 will fix this naming issue) + file_name = file_name[-16:] + record["file_name"] = os.path.join(image_root, file_name) + record["height"] = img_dict["height"] + record["width"] = img_dict["width"] + record["not_exhaustive_category_ids"] = img_dict.get("not_exhaustive_category_ids", []) + record["neg_category_ids"] = img_dict.get("neg_category_ids", []) + image_id = record["image_id"] = img_dict["id"] + + objs = [] + for anno in anno_dict_list: + # Check that the image_id in this annotation is the same as + # the image_id we're looking at. + # This fails only when the data parsing logic or the annotation file is buggy. + assert anno["image_id"] == image_id + obj = {"bbox": anno["bbox"], "bbox_mode": BoxMode.XYWH_ABS} + obj["category_id"] = anno["category_id"] - 1 # Convert 1-indexed to 0-indexed + segm = anno["segmentation"] # list[list[float]] + # filter out invalid polygons (< 3 points) + valid_segm = [poly for poly in segm if len(poly) % 2 == 0 and len(poly) >= 6] + assert len(segm) == len( + valid_segm + ), "Annotation contains an invalid polygon with < 3 points" + assert len(segm) > 0 + obj["segmentation"] = segm + objs.append(obj) + record["annotations"] = objs + dataset_dicts.append(record) + + return dataset_dicts + + +def get_lvis_instances_meta(dataset_name): + """ + Load LVIS metadata. + + Args: + dataset_name (str): LVIS dataset name without the split name (e.g., "lvis_v0.5"). + + Returns: + dict: LVIS metadata with keys: thing_classes + """ + if "cocofied" in dataset_name: + return _get_coco_instances_meta() + if "v0.5" in dataset_name: + return _get_lvis_instances_meta_v0_5() + # There will be a v1 in the future + # elif dataset_name == "lvis_v1": + # return get_lvis_instances_meta_v1() + raise ValueError("No built-in metadata for dataset {}".format(dataset_name)) + + +def _get_lvis_instances_meta_v0_5(): + assert len(LVIS_CATEGORIES) == 1230 + cat_ids = [k["id"] for k in LVIS_CATEGORIES] + assert min(cat_ids) == 1 and max(cat_ids) == len( + cat_ids + ), "Category ids are not in [1, #categories], as expected" + # Ensure that the category list is sorted by id + lvis_categories = sorted(LVIS_CATEGORIES, key=lambda x: x["id"]) + thing_classes = [k["synonyms"][0] for k in lvis_categories] + meta = {"thing_classes": thing_classes} + return meta + + +if __name__ == "__main__": + """ + Test the LVIS json dataset loader. + + Usage: + python -m detectron2.data.data.lvis \ + path/to/json path/to/image_root dataset_name vis_limit + """ + import sys + import numpy as np + from detectron2.utils.logger import setup_logger + from PIL import Image + import detectron2.data.datasets # noqa # add pre-defined metadata + from detectron2.utils.visualizer import Visualizer + + logger = setup_logger(name=__name__) + meta = MetadataCatalog.get(sys.argv[3]) + + dicts = load_lvis_json(sys.argv[1], sys.argv[2], sys.argv[3]) + logger.info("Done loading {} samples.".format(len(dicts))) + + dirname = "lvis-data-vis" + os.makedirs(dirname, exist_ok=True) + for d in dicts[: int(sys.argv[4])]: + img = np.array(Image.open(d["file_name"])) + visualizer = Visualizer(img, metadata=meta) + vis = visualizer.draw_dataset_dict(d) + fpath = os.path.join(dirname, os.path.basename(d["file_name"])) + vis.save(fpath) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis_v0_5_categories.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis_v0_5_categories.py new file mode 100644 index 0000000..8205e60 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/lvis_v0_5_categories.py @@ -0,0 +1,13 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +# Autogen with +# with open("lvis_v0.5_val.json", "r") as f: +# a = json.load(f) +# c = a["categories"] +# for x in c: +# del x["image_count"] +# del x["instance_count"] +# LVIS_CATEGORIES = repr(c) + " # noqa" + +# fmt: off +LVIS_CATEGORIES = [{'frequency': 'r', 'id': 1, 'synset': 'acorn.n.01', 'synonyms': ['acorn'], 'def': 'nut from an oak tree', 'name': 'acorn'}, {'frequency': 'c', 'id': 2, 'synset': 'aerosol.n.02', 'synonyms': ['aerosol_can', 'spray_can'], 'def': 'a dispenser that holds a substance under pressure', 'name': 'aerosol_can'}, {'frequency': 'f', 'id': 3, 'synset': 'air_conditioner.n.01', 'synonyms': ['air_conditioner'], 'def': 'a machine that keeps air cool and dry', 'name': 'air_conditioner'}, {'frequency': 'f', 'id': 4, 'synset': 'airplane.n.01', 'synonyms': ['airplane', 'aeroplane'], 'def': 'an aircraft that has a fixed wing and is powered by propellers or jets', 'name': 'airplane'}, {'frequency': 'c', 'id': 5, 'synset': 'alarm_clock.n.01', 'synonyms': ['alarm_clock'], 'def': 'a clock that wakes a sleeper at some preset time', 'name': 'alarm_clock'}, {'frequency': 'c', 'id': 6, 'synset': 'alcohol.n.01', 'synonyms': ['alcohol', 'alcoholic_beverage'], 'def': 'a liquor or brew containing alcohol as the active agent', 'name': 'alcohol'}, {'frequency': 'r', 'id': 7, 'synset': 'alligator.n.02', 'synonyms': ['alligator', 'gator'], 'def': 'amphibious reptiles related to crocodiles but with shorter broader snouts', 'name': 'alligator'}, {'frequency': 'c', 'id': 8, 'synset': 'almond.n.02', 'synonyms': ['almond'], 'def': 'oval-shaped edible seed of the almond tree', 'name': 'almond'}, {'frequency': 'c', 'id': 9, 'synset': 'ambulance.n.01', 'synonyms': ['ambulance'], 'def': 'a vehicle that takes people to and from hospitals', 'name': 'ambulance'}, {'frequency': 'r', 'id': 10, 'synset': 'amplifier.n.01', 'synonyms': ['amplifier'], 'def': 'electronic equipment that increases strength of signals', 'name': 'amplifier'}, {'frequency': 'c', 'id': 11, 'synset': 'anklet.n.03', 'synonyms': ['anklet', 'ankle_bracelet'], 'def': 'an ornament worn around the ankle', 'name': 'anklet'}, {'frequency': 'f', 'id': 12, 'synset': 'antenna.n.01', 'synonyms': ['antenna', 'aerial', 'transmitting_aerial'], 'def': 'an electrical device that sends or receives radio or television signals', 'name': 'antenna'}, {'frequency': 'f', 'id': 13, 'synset': 'apple.n.01', 'synonyms': ['apple'], 'def': 'fruit with red or yellow or green skin and sweet to tart crisp whitish flesh', 'name': 'apple'}, {'frequency': 'r', 'id': 14, 'synset': 'apple_juice.n.01', 'synonyms': ['apple_juice'], 'def': 'the juice of apples', 'name': 'apple_juice'}, {'frequency': 'r', 'id': 15, 'synset': 'applesauce.n.01', 'synonyms': ['applesauce'], 'def': 'puree of stewed apples usually sweetened and spiced', 'name': 'applesauce'}, {'frequency': 'r', 'id': 16, 'synset': 'apricot.n.02', 'synonyms': ['apricot'], 'def': 'downy yellow to rosy-colored fruit resembling a small peach', 'name': 'apricot'}, {'frequency': 'f', 'id': 17, 'synset': 'apron.n.01', 'synonyms': ['apron'], 'def': 'a garment of cloth that is tied about the waist and worn to protect clothing', 'name': 'apron'}, {'frequency': 'c', 'id': 18, 'synset': 'aquarium.n.01', 'synonyms': ['aquarium', 'fish_tank'], 'def': 'a tank/pool/bowl filled with water for keeping live fish and underwater animals', 'name': 'aquarium'}, {'frequency': 'c', 'id': 19, 'synset': 'armband.n.02', 'synonyms': ['armband'], 'def': 'a band worn around the upper arm', 'name': 'armband'}, {'frequency': 'f', 'id': 20, 'synset': 'armchair.n.01', 'synonyms': ['armchair'], 'def': 'chair with a support on each side for arms', 'name': 'armchair'}, {'frequency': 'r', 'id': 21, 'synset': 'armoire.n.01', 'synonyms': ['armoire'], 'def': 'a large wardrobe or cabinet', 'name': 'armoire'}, {'frequency': 'r', 'id': 22, 'synset': 'armor.n.01', 'synonyms': ['armor', 'armour'], 'def': 'protective covering made of metal and used in combat', 'name': 'armor'}, {'frequency': 'c', 'id': 23, 'synset': 'artichoke.n.02', 'synonyms': ['artichoke'], 'def': 'a thistlelike flower head with edible fleshy leaves and heart', 'name': 'artichoke'}, {'frequency': 'f', 'id': 24, 'synset': 'ashcan.n.01', 'synonyms': ['trash_can', 'garbage_can', 'wastebin', 'dustbin', 'trash_barrel', 'trash_bin'], 'def': 'a bin that holds rubbish until it is collected', 'name': 'trash_can'}, {'frequency': 'c', 'id': 25, 'synset': 'ashtray.n.01', 'synonyms': ['ashtray'], 'def': "a receptacle for the ash from smokers' cigars or cigarettes", 'name': 'ashtray'}, {'frequency': 'c', 'id': 26, 'synset': 'asparagus.n.02', 'synonyms': ['asparagus'], 'def': 'edible young shoots of the asparagus plant', 'name': 'asparagus'}, {'frequency': 'c', 'id': 27, 'synset': 'atomizer.n.01', 'synonyms': ['atomizer', 'atomiser', 'spray', 'sprayer', 'nebulizer', 'nebuliser'], 'def': 'a dispenser that turns a liquid (such as perfume) into a fine mist', 'name': 'atomizer'}, {'frequency': 'c', 'id': 28, 'synset': 'avocado.n.01', 'synonyms': ['avocado'], 'def': 'a pear-shaped fruit with green or blackish skin and rich yellowish pulp enclosing a single large seed', 'name': 'avocado'}, {'frequency': 'c', 'id': 29, 'synset': 'award.n.02', 'synonyms': ['award', 'accolade'], 'def': 'a tangible symbol signifying approval or distinction', 'name': 'award'}, {'frequency': 'f', 'id': 30, 'synset': 'awning.n.01', 'synonyms': ['awning'], 'def': 'a canopy made of canvas to shelter people or things from rain or sun', 'name': 'awning'}, {'frequency': 'r', 'id': 31, 'synset': 'ax.n.01', 'synonyms': ['ax', 'axe'], 'def': 'an edge tool with a heavy bladed head mounted across a handle', 'name': 'ax'}, {'frequency': 'f', 'id': 32, 'synset': 'baby_buggy.n.01', 'synonyms': ['baby_buggy', 'baby_carriage', 'perambulator', 'pram', 'stroller'], 'def': 'a small vehicle with four wheels in which a baby or child is pushed around', 'name': 'baby_buggy'}, {'frequency': 'c', 'id': 33, 'synset': 'backboard.n.01', 'synonyms': ['basketball_backboard'], 'def': 'a raised vertical board with basket attached; used to play basketball', 'name': 'basketball_backboard'}, {'frequency': 'f', 'id': 34, 'synset': 'backpack.n.01', 'synonyms': ['backpack', 'knapsack', 'packsack', 'rucksack', 'haversack'], 'def': 'a bag carried by a strap on your back or shoulder', 'name': 'backpack'}, {'frequency': 'f', 'id': 35, 'synset': 'bag.n.04', 'synonyms': ['handbag', 'purse', 'pocketbook'], 'def': 'a container used for carrying money and small personal items or accessories', 'name': 'handbag'}, {'frequency': 'f', 'id': 36, 'synset': 'bag.n.06', 'synonyms': ['suitcase', 'baggage', 'luggage'], 'def': 'cases used to carry belongings when traveling', 'name': 'suitcase'}, {'frequency': 'c', 'id': 37, 'synset': 'bagel.n.01', 'synonyms': ['bagel', 'beigel'], 'def': 'glazed yeast-raised doughnut-shaped roll with hard crust', 'name': 'bagel'}, {'frequency': 'r', 'id': 38, 'synset': 'bagpipe.n.01', 'synonyms': ['bagpipe'], 'def': 'a tubular wind instrument; the player blows air into a bag and squeezes it out', 'name': 'bagpipe'}, {'frequency': 'r', 'id': 39, 'synset': 'baguet.n.01', 'synonyms': ['baguet', 'baguette'], 'def': 'narrow French stick loaf', 'name': 'baguet'}, {'frequency': 'r', 'id': 40, 'synset': 'bait.n.02', 'synonyms': ['bait', 'lure'], 'def': 'something used to lure fish or other animals into danger so they can be trapped or killed', 'name': 'bait'}, {'frequency': 'f', 'id': 41, 'synset': 'ball.n.06', 'synonyms': ['ball'], 'def': 'a spherical object used as a plaything', 'name': 'ball'}, {'frequency': 'r', 'id': 42, 'synset': 'ballet_skirt.n.01', 'synonyms': ['ballet_skirt', 'tutu'], 'def': 'very short skirt worn by ballerinas', 'name': 'ballet_skirt'}, {'frequency': 'f', 'id': 43, 'synset': 'balloon.n.01', 'synonyms': ['balloon'], 'def': 'large tough nonrigid bag filled with gas or heated air', 'name': 'balloon'}, {'frequency': 'c', 'id': 44, 'synset': 'bamboo.n.02', 'synonyms': ['bamboo'], 'def': 'woody tropical grass having hollow woody stems', 'name': 'bamboo'}, {'frequency': 'f', 'id': 45, 'synset': 'banana.n.02', 'synonyms': ['banana'], 'def': 'elongated crescent-shaped yellow fruit with soft sweet flesh', 'name': 'banana'}, {'frequency': 'r', 'id': 46, 'synset': 'band_aid.n.01', 'synonyms': ['Band_Aid'], 'def': 'trade name for an adhesive bandage to cover small cuts or blisters', 'name': 'Band_Aid'}, {'frequency': 'c', 'id': 47, 'synset': 'bandage.n.01', 'synonyms': ['bandage'], 'def': 'a piece of soft material that covers and protects an injured part of the body', 'name': 'bandage'}, {'frequency': 'c', 'id': 48, 'synset': 'bandanna.n.01', 'synonyms': ['bandanna', 'bandana'], 'def': 'large and brightly colored handkerchief; often used as a neckerchief', 'name': 'bandanna'}, {'frequency': 'r', 'id': 49, 'synset': 'banjo.n.01', 'synonyms': ['banjo'], 'def': 'a stringed instrument of the guitar family with a long neck and circular body', 'name': 'banjo'}, {'frequency': 'f', 'id': 50, 'synset': 'banner.n.01', 'synonyms': ['banner', 'streamer'], 'def': 'long strip of cloth or paper used for decoration or advertising', 'name': 'banner'}, {'frequency': 'r', 'id': 51, 'synset': 'barbell.n.01', 'synonyms': ['barbell'], 'def': 'a bar to which heavy discs are attached at each end; used in weightlifting', 'name': 'barbell'}, {'frequency': 'r', 'id': 52, 'synset': 'barge.n.01', 'synonyms': ['barge'], 'def': 'a flatbottom boat for carrying heavy loads (especially on canals)', 'name': 'barge'}, {'frequency': 'f', 'id': 53, 'synset': 'barrel.n.02', 'synonyms': ['barrel', 'cask'], 'def': 'a cylindrical container that holds liquids', 'name': 'barrel'}, {'frequency': 'c', 'id': 54, 'synset': 'barrette.n.01', 'synonyms': ['barrette'], 'def': "a pin for holding women's hair in place", 'name': 'barrette'}, {'frequency': 'c', 'id': 55, 'synset': 'barrow.n.03', 'synonyms': ['barrow', 'garden_cart', 'lawn_cart', 'wheelbarrow'], 'def': 'a cart for carrying small loads; has handles and one or more wheels', 'name': 'barrow'}, {'frequency': 'f', 'id': 56, 'synset': 'base.n.03', 'synonyms': ['baseball_base'], 'def': 'a place that the runner must touch before scoring', 'name': 'baseball_base'}, {'frequency': 'f', 'id': 57, 'synset': 'baseball.n.02', 'synonyms': ['baseball'], 'def': 'a ball used in playing baseball', 'name': 'baseball'}, {'frequency': 'f', 'id': 58, 'synset': 'baseball_bat.n.01', 'synonyms': ['baseball_bat'], 'def': 'an implement used in baseball by the batter', 'name': 'baseball_bat'}, {'frequency': 'f', 'id': 59, 'synset': 'baseball_cap.n.01', 'synonyms': ['baseball_cap', 'jockey_cap', 'golf_cap'], 'def': 'a cap with a bill', 'name': 'baseball_cap'}, {'frequency': 'f', 'id': 60, 'synset': 'baseball_glove.n.01', 'synonyms': ['baseball_glove', 'baseball_mitt'], 'def': 'the handwear used by fielders in playing baseball', 'name': 'baseball_glove'}, {'frequency': 'f', 'id': 61, 'synset': 'basket.n.01', 'synonyms': ['basket', 'handbasket'], 'def': 'a container that is usually woven and has handles', 'name': 'basket'}, {'frequency': 'c', 'id': 62, 'synset': 'basket.n.03', 'synonyms': ['basketball_hoop'], 'def': 'metal hoop supporting a net through which players try to throw the basketball', 'name': 'basketball_hoop'}, {'frequency': 'c', 'id': 63, 'synset': 'basketball.n.02', 'synonyms': ['basketball'], 'def': 'an inflated ball used in playing basketball', 'name': 'basketball'}, {'frequency': 'r', 'id': 64, 'synset': 'bass_horn.n.01', 'synonyms': ['bass_horn', 'sousaphone', 'tuba'], 'def': 'the lowest brass wind instrument', 'name': 'bass_horn'}, {'frequency': 'r', 'id': 65, 'synset': 'bat.n.01', 'synonyms': ['bat_(animal)'], 'def': 'nocturnal mouselike mammal with forelimbs modified to form membranous wings', 'name': 'bat_(animal)'}, {'frequency': 'f', 'id': 66, 'synset': 'bath_mat.n.01', 'synonyms': ['bath_mat'], 'def': 'a heavy towel or mat to stand on while drying yourself after a bath', 'name': 'bath_mat'}, {'frequency': 'f', 'id': 67, 'synset': 'bath_towel.n.01', 'synonyms': ['bath_towel'], 'def': 'a large towel; to dry yourself after a bath', 'name': 'bath_towel'}, {'frequency': 'c', 'id': 68, 'synset': 'bathrobe.n.01', 'synonyms': ['bathrobe'], 'def': 'a loose-fitting robe of towelling; worn after a bath or swim', 'name': 'bathrobe'}, {'frequency': 'f', 'id': 69, 'synset': 'bathtub.n.01', 'synonyms': ['bathtub', 'bathing_tub'], 'def': 'a large open container that you fill with water and use to wash the body', 'name': 'bathtub'}, {'frequency': 'r', 'id': 70, 'synset': 'batter.n.02', 'synonyms': ['batter_(food)'], 'def': 'a liquid or semiliquid mixture, as of flour, eggs, and milk, used in cooking', 'name': 'batter_(food)'}, {'frequency': 'c', 'id': 71, 'synset': 'battery.n.02', 'synonyms': ['battery'], 'def': 'a portable device that produces electricity', 'name': 'battery'}, {'frequency': 'r', 'id': 72, 'synset': 'beach_ball.n.01', 'synonyms': ['beachball'], 'def': 'large and light ball; for play at the seaside', 'name': 'beachball'}, {'frequency': 'c', 'id': 73, 'synset': 'bead.n.01', 'synonyms': ['bead'], 'def': 'a small ball with a hole through the middle used for ornamentation, jewellery, etc.', 'name': 'bead'}, {'frequency': 'r', 'id': 74, 'synset': 'beaker.n.01', 'synonyms': ['beaker'], 'def': 'a flatbottomed jar made of glass or plastic; used for chemistry', 'name': 'beaker'}, {'frequency': 'c', 'id': 75, 'synset': 'bean_curd.n.01', 'synonyms': ['bean_curd', 'tofu'], 'def': 'cheeselike food made of curdled soybean milk', 'name': 'bean_curd'}, {'frequency': 'c', 'id': 76, 'synset': 'beanbag.n.01', 'synonyms': ['beanbag'], 'def': 'a bag filled with dried beans or similar items; used in games or to sit on', 'name': 'beanbag'}, {'frequency': 'f', 'id': 77, 'synset': 'beanie.n.01', 'synonyms': ['beanie', 'beany'], 'def': 'a small skullcap; formerly worn by schoolboys and college freshmen', 'name': 'beanie'}, {'frequency': 'f', 'id': 78, 'synset': 'bear.n.01', 'synonyms': ['bear'], 'def': 'large carnivorous or omnivorous mammals with shaggy coats and claws', 'name': 'bear'}, {'frequency': 'f', 'id': 79, 'synset': 'bed.n.01', 'synonyms': ['bed'], 'def': 'a piece of furniture that provides a place to sleep', 'name': 'bed'}, {'frequency': 'c', 'id': 80, 'synset': 'bedspread.n.01', 'synonyms': ['bedspread', 'bedcover', 'bed_covering', 'counterpane', 'spread'], 'def': 'decorative cover for a bed', 'name': 'bedspread'}, {'frequency': 'f', 'id': 81, 'synset': 'beef.n.01', 'synonyms': ['cow'], 'def': 'cattle that are reared for their meat', 'name': 'cow'}, {'frequency': 'c', 'id': 82, 'synset': 'beef.n.02', 'synonyms': ['beef_(food)', 'boeuf_(food)'], 'def': 'meat from an adult domestic bovine', 'name': 'beef_(food)'}, {'frequency': 'r', 'id': 83, 'synset': 'beeper.n.01', 'synonyms': ['beeper', 'pager'], 'def': 'an device that beeps when the person carrying it is being paged', 'name': 'beeper'}, {'frequency': 'f', 'id': 84, 'synset': 'beer_bottle.n.01', 'synonyms': ['beer_bottle'], 'def': 'a bottle that holds beer', 'name': 'beer_bottle'}, {'frequency': 'c', 'id': 85, 'synset': 'beer_can.n.01', 'synonyms': ['beer_can'], 'def': 'a can that holds beer', 'name': 'beer_can'}, {'frequency': 'r', 'id': 86, 'synset': 'beetle.n.01', 'synonyms': ['beetle'], 'def': 'insect with hard wing covers', 'name': 'beetle'}, {'frequency': 'f', 'id': 87, 'synset': 'bell.n.01', 'synonyms': ['bell'], 'def': 'a hollow device made of metal that makes a ringing sound when struck', 'name': 'bell'}, {'frequency': 'f', 'id': 88, 'synset': 'bell_pepper.n.02', 'synonyms': ['bell_pepper', 'capsicum'], 'def': 'large bell-shaped sweet pepper in green or red or yellow or orange or black varieties', 'name': 'bell_pepper'}, {'frequency': 'f', 'id': 89, 'synset': 'belt.n.02', 'synonyms': ['belt'], 'def': 'a band to tie or buckle around the body (usually at the waist)', 'name': 'belt'}, {'frequency': 'f', 'id': 90, 'synset': 'belt_buckle.n.01', 'synonyms': ['belt_buckle'], 'def': 'the buckle used to fasten a belt', 'name': 'belt_buckle'}, {'frequency': 'f', 'id': 91, 'synset': 'bench.n.01', 'synonyms': ['bench'], 'def': 'a long seat for more than one person', 'name': 'bench'}, {'frequency': 'c', 'id': 92, 'synset': 'beret.n.01', 'synonyms': ['beret'], 'def': 'a cap with no brim or bill; made of soft cloth', 'name': 'beret'}, {'frequency': 'c', 'id': 93, 'synset': 'bib.n.02', 'synonyms': ['bib'], 'def': 'a napkin tied under the chin of a child while eating', 'name': 'bib'}, {'frequency': 'r', 'id': 94, 'synset': 'bible.n.01', 'synonyms': ['Bible'], 'def': 'the sacred writings of the Christian religions', 'name': 'Bible'}, {'frequency': 'f', 'id': 95, 'synset': 'bicycle.n.01', 'synonyms': ['bicycle', 'bike_(bicycle)'], 'def': 'a wheeled vehicle that has two wheels and is moved by foot pedals', 'name': 'bicycle'}, {'frequency': 'f', 'id': 96, 'synset': 'bill.n.09', 'synonyms': ['visor', 'vizor'], 'def': 'a brim that projects to the front to shade the eyes', 'name': 'visor'}, {'frequency': 'c', 'id': 97, 'synset': 'binder.n.03', 'synonyms': ['binder', 'ring-binder'], 'def': 'holds loose papers or magazines', 'name': 'binder'}, {'frequency': 'c', 'id': 98, 'synset': 'binoculars.n.01', 'synonyms': ['binoculars', 'field_glasses', 'opera_glasses'], 'def': 'an optical instrument designed for simultaneous use by both eyes', 'name': 'binoculars'}, {'frequency': 'f', 'id': 99, 'synset': 'bird.n.01', 'synonyms': ['bird'], 'def': 'animal characterized by feathers and wings', 'name': 'bird'}, {'frequency': 'r', 'id': 100, 'synset': 'bird_feeder.n.01', 'synonyms': ['birdfeeder'], 'def': 'an outdoor device that supplies food for wild birds', 'name': 'birdfeeder'}, {'frequency': 'r', 'id': 101, 'synset': 'birdbath.n.01', 'synonyms': ['birdbath'], 'def': 'an ornamental basin (usually in a garden) for birds to bathe in', 'name': 'birdbath'}, {'frequency': 'c', 'id': 102, 'synset': 'birdcage.n.01', 'synonyms': ['birdcage'], 'def': 'a cage in which a bird can be kept', 'name': 'birdcage'}, {'frequency': 'c', 'id': 103, 'synset': 'birdhouse.n.01', 'synonyms': ['birdhouse'], 'def': 'a shelter for birds', 'name': 'birdhouse'}, {'frequency': 'f', 'id': 104, 'synset': 'birthday_cake.n.01', 'synonyms': ['birthday_cake'], 'def': 'decorated cake served at a birthday party', 'name': 'birthday_cake'}, {'frequency': 'r', 'id': 105, 'synset': 'birthday_card.n.01', 'synonyms': ['birthday_card'], 'def': 'a card expressing a birthday greeting', 'name': 'birthday_card'}, {'frequency': 'r', 'id': 106, 'synset': 'biscuit.n.01', 'synonyms': ['biscuit_(bread)'], 'def': 'small round bread leavened with baking-powder or soda', 'name': 'biscuit_(bread)'}, {'frequency': 'r', 'id': 107, 'synset': 'black_flag.n.01', 'synonyms': ['pirate_flag'], 'def': 'a flag usually bearing a white skull and crossbones on a black background', 'name': 'pirate_flag'}, {'frequency': 'c', 'id': 108, 'synset': 'black_sheep.n.02', 'synonyms': ['black_sheep'], 'def': 'sheep with a black coat', 'name': 'black_sheep'}, {'frequency': 'c', 'id': 109, 'synset': 'blackboard.n.01', 'synonyms': ['blackboard', 'chalkboard'], 'def': 'sheet of slate; for writing with chalk', 'name': 'blackboard'}, {'frequency': 'f', 'id': 110, 'synset': 'blanket.n.01', 'synonyms': ['blanket'], 'def': 'bedding that keeps a person warm in bed', 'name': 'blanket'}, {'frequency': 'c', 'id': 111, 'synset': 'blazer.n.01', 'synonyms': ['blazer', 'sport_jacket', 'sport_coat', 'sports_jacket', 'sports_coat'], 'def': 'lightweight jacket; often striped in the colors of a club or school', 'name': 'blazer'}, {'frequency': 'f', 'id': 112, 'synset': 'blender.n.01', 'synonyms': ['blender', 'liquidizer', 'liquidiser'], 'def': 'an electrically powered mixer that mix or chop or liquefy foods', 'name': 'blender'}, {'frequency': 'r', 'id': 113, 'synset': 'blimp.n.02', 'synonyms': ['blimp'], 'def': 'a small nonrigid airship used for observation or as a barrage balloon', 'name': 'blimp'}, {'frequency': 'c', 'id': 114, 'synset': 'blinker.n.01', 'synonyms': ['blinker', 'flasher'], 'def': 'a light that flashes on and off; used as a signal or to send messages', 'name': 'blinker'}, {'frequency': 'c', 'id': 115, 'synset': 'blueberry.n.02', 'synonyms': ['blueberry'], 'def': 'sweet edible dark-blue berries of blueberry plants', 'name': 'blueberry'}, {'frequency': 'r', 'id': 116, 'synset': 'boar.n.02', 'synonyms': ['boar'], 'def': 'an uncastrated male hog', 'name': 'boar'}, {'frequency': 'r', 'id': 117, 'synset': 'board.n.09', 'synonyms': ['gameboard'], 'def': 'a flat portable surface (usually rectangular) designed for board games', 'name': 'gameboard'}, {'frequency': 'f', 'id': 118, 'synset': 'boat.n.01', 'synonyms': ['boat', 'ship_(boat)'], 'def': 'a vessel for travel on water', 'name': 'boat'}, {'frequency': 'c', 'id': 119, 'synset': 'bobbin.n.01', 'synonyms': ['bobbin', 'spool', 'reel'], 'def': 'a thing around which thread/tape/film or other flexible materials can be wound', 'name': 'bobbin'}, {'frequency': 'r', 'id': 120, 'synset': 'bobby_pin.n.01', 'synonyms': ['bobby_pin', 'hairgrip'], 'def': 'a flat wire hairpin used to hold bobbed hair in place', 'name': 'bobby_pin'}, {'frequency': 'c', 'id': 121, 'synset': 'boiled_egg.n.01', 'synonyms': ['boiled_egg', 'coddled_egg'], 'def': 'egg cooked briefly in the shell in gently boiling water', 'name': 'boiled_egg'}, {'frequency': 'r', 'id': 122, 'synset': 'bolo_tie.n.01', 'synonyms': ['bolo_tie', 'bolo', 'bola_tie', 'bola'], 'def': 'a cord fastened around the neck with an ornamental clasp and worn as a necktie', 'name': 'bolo_tie'}, {'frequency': 'c', 'id': 123, 'synset': 'bolt.n.03', 'synonyms': ['deadbolt'], 'def': 'the part of a lock that is engaged or withdrawn with a key', 'name': 'deadbolt'}, {'frequency': 'f', 'id': 124, 'synset': 'bolt.n.06', 'synonyms': ['bolt'], 'def': 'a screw that screws into a nut to form a fastener', 'name': 'bolt'}, {'frequency': 'r', 'id': 125, 'synset': 'bonnet.n.01', 'synonyms': ['bonnet'], 'def': 'a hat tied under the chin', 'name': 'bonnet'}, {'frequency': 'f', 'id': 126, 'synset': 'book.n.01', 'synonyms': ['book'], 'def': 'a written work or composition that has been published', 'name': 'book'}, {'frequency': 'r', 'id': 127, 'synset': 'book_bag.n.01', 'synonyms': ['book_bag'], 'def': 'a bag in which students carry their books', 'name': 'book_bag'}, {'frequency': 'c', 'id': 128, 'synset': 'bookcase.n.01', 'synonyms': ['bookcase'], 'def': 'a piece of furniture with shelves for storing books', 'name': 'bookcase'}, {'frequency': 'c', 'id': 129, 'synset': 'booklet.n.01', 'synonyms': ['booklet', 'brochure', 'leaflet', 'pamphlet'], 'def': 'a small book usually having a paper cover', 'name': 'booklet'}, {'frequency': 'r', 'id': 130, 'synset': 'bookmark.n.01', 'synonyms': ['bookmark', 'bookmarker'], 'def': 'a marker (a piece of paper or ribbon) placed between the pages of a book', 'name': 'bookmark'}, {'frequency': 'r', 'id': 131, 'synset': 'boom.n.04', 'synonyms': ['boom_microphone', 'microphone_boom'], 'def': 'a pole carrying an overhead microphone projected over a film or tv set', 'name': 'boom_microphone'}, {'frequency': 'f', 'id': 132, 'synset': 'boot.n.01', 'synonyms': ['boot'], 'def': 'footwear that covers the whole foot and lower leg', 'name': 'boot'}, {'frequency': 'f', 'id': 133, 'synset': 'bottle.n.01', 'synonyms': ['bottle'], 'def': 'a glass or plastic vessel used for storing drinks or other liquids', 'name': 'bottle'}, {'frequency': 'c', 'id': 134, 'synset': 'bottle_opener.n.01', 'synonyms': ['bottle_opener'], 'def': 'an opener for removing caps or corks from bottles', 'name': 'bottle_opener'}, {'frequency': 'c', 'id': 135, 'synset': 'bouquet.n.01', 'synonyms': ['bouquet'], 'def': 'an arrangement of flowers that is usually given as a present', 'name': 'bouquet'}, {'frequency': 'r', 'id': 136, 'synset': 'bow.n.04', 'synonyms': ['bow_(weapon)'], 'def': 'a weapon for shooting arrows', 'name': 'bow_(weapon)'}, {'frequency': 'f', 'id': 137, 'synset': 'bow.n.08', 'synonyms': ['bow_(decorative_ribbons)'], 'def': 'a decorative interlacing of ribbons', 'name': 'bow_(decorative_ribbons)'}, {'frequency': 'f', 'id': 138, 'synset': 'bow_tie.n.01', 'synonyms': ['bow-tie', 'bowtie'], 'def': "a man's tie that ties in a bow", 'name': 'bow-tie'}, {'frequency': 'f', 'id': 139, 'synset': 'bowl.n.03', 'synonyms': ['bowl'], 'def': 'a dish that is round and open at the top for serving foods', 'name': 'bowl'}, {'frequency': 'r', 'id': 140, 'synset': 'bowl.n.08', 'synonyms': ['pipe_bowl'], 'def': 'a small round container that is open at the top for holding tobacco', 'name': 'pipe_bowl'}, {'frequency': 'c', 'id': 141, 'synset': 'bowler_hat.n.01', 'synonyms': ['bowler_hat', 'bowler', 'derby_hat', 'derby', 'plug_hat'], 'def': 'a felt hat that is round and hard with a narrow brim', 'name': 'bowler_hat'}, {'frequency': 'r', 'id': 142, 'synset': 'bowling_ball.n.01', 'synonyms': ['bowling_ball'], 'def': 'a large ball with finger holes used in the sport of bowling', 'name': 'bowling_ball'}, {'frequency': 'r', 'id': 143, 'synset': 'bowling_pin.n.01', 'synonyms': ['bowling_pin'], 'def': 'a club-shaped wooden object used in bowling', 'name': 'bowling_pin'}, {'frequency': 'r', 'id': 144, 'synset': 'boxing_glove.n.01', 'synonyms': ['boxing_glove'], 'def': 'large glove coverings the fists of a fighter worn for the sport of boxing', 'name': 'boxing_glove'}, {'frequency': 'c', 'id': 145, 'synset': 'brace.n.06', 'synonyms': ['suspenders'], 'def': 'elastic straps that hold trousers up (usually used in the plural)', 'name': 'suspenders'}, {'frequency': 'f', 'id': 146, 'synset': 'bracelet.n.02', 'synonyms': ['bracelet', 'bangle'], 'def': 'jewelry worn around the wrist for decoration', 'name': 'bracelet'}, {'frequency': 'r', 'id': 147, 'synset': 'brass.n.07', 'synonyms': ['brass_plaque'], 'def': 'a memorial made of brass', 'name': 'brass_plaque'}, {'frequency': 'c', 'id': 148, 'synset': 'brassiere.n.01', 'synonyms': ['brassiere', 'bra', 'bandeau'], 'def': 'an undergarment worn by women to support their breasts', 'name': 'brassiere'}, {'frequency': 'c', 'id': 149, 'synset': 'bread-bin.n.01', 'synonyms': ['bread-bin', 'breadbox'], 'def': 'a container used to keep bread or cake in', 'name': 'bread-bin'}, {'frequency': 'r', 'id': 150, 'synset': 'breechcloth.n.01', 'synonyms': ['breechcloth', 'breechclout', 'loincloth'], 'def': 'a garment that provides covering for the loins', 'name': 'breechcloth'}, {'frequency': 'c', 'id': 151, 'synset': 'bridal_gown.n.01', 'synonyms': ['bridal_gown', 'wedding_gown', 'wedding_dress'], 'def': 'a gown worn by the bride at a wedding', 'name': 'bridal_gown'}, {'frequency': 'c', 'id': 152, 'synset': 'briefcase.n.01', 'synonyms': ['briefcase'], 'def': 'a case with a handle; for carrying papers or files or books', 'name': 'briefcase'}, {'frequency': 'c', 'id': 153, 'synset': 'bristle_brush.n.01', 'synonyms': ['bristle_brush'], 'def': 'a brush that is made with the short stiff hairs of an animal or plant', 'name': 'bristle_brush'}, {'frequency': 'f', 'id': 154, 'synset': 'broccoli.n.01', 'synonyms': ['broccoli'], 'def': 'plant with dense clusters of tight green flower buds', 'name': 'broccoli'}, {'frequency': 'r', 'id': 155, 'synset': 'brooch.n.01', 'synonyms': ['broach'], 'def': 'a decorative pin worn by women', 'name': 'broach'}, {'frequency': 'c', 'id': 156, 'synset': 'broom.n.01', 'synonyms': ['broom'], 'def': 'bundle of straws or twigs attached to a long handle; used for cleaning', 'name': 'broom'}, {'frequency': 'c', 'id': 157, 'synset': 'brownie.n.03', 'synonyms': ['brownie'], 'def': 'square or bar of very rich chocolate cake usually with nuts', 'name': 'brownie'}, {'frequency': 'c', 'id': 158, 'synset': 'brussels_sprouts.n.01', 'synonyms': ['brussels_sprouts'], 'def': 'the small edible cabbage-like buds growing along a stalk', 'name': 'brussels_sprouts'}, {'frequency': 'r', 'id': 159, 'synset': 'bubble_gum.n.01', 'synonyms': ['bubble_gum'], 'def': 'a kind of chewing gum that can be blown into bubbles', 'name': 'bubble_gum'}, {'frequency': 'f', 'id': 160, 'synset': 'bucket.n.01', 'synonyms': ['bucket', 'pail'], 'def': 'a roughly cylindrical vessel that is open at the top', 'name': 'bucket'}, {'frequency': 'r', 'id': 161, 'synset': 'buggy.n.01', 'synonyms': ['horse_buggy'], 'def': 'a small lightweight carriage; drawn by a single horse', 'name': 'horse_buggy'}, {'frequency': 'c', 'id': 162, 'synset': 'bull.n.11', 'synonyms': ['bull'], 'def': 'mature male cow', 'name': 'bull'}, {'frequency': 'r', 'id': 163, 'synset': 'bulldog.n.01', 'synonyms': ['bulldog'], 'def': 'a thickset short-haired dog with a large head and strong undershot lower jaw', 'name': 'bulldog'}, {'frequency': 'r', 'id': 164, 'synset': 'bulldozer.n.01', 'synonyms': ['bulldozer', 'dozer'], 'def': 'large powerful tractor; a large blade in front flattens areas of ground', 'name': 'bulldozer'}, {'frequency': 'c', 'id': 165, 'synset': 'bullet_train.n.01', 'synonyms': ['bullet_train'], 'def': 'a high-speed passenger train', 'name': 'bullet_train'}, {'frequency': 'c', 'id': 166, 'synset': 'bulletin_board.n.02', 'synonyms': ['bulletin_board', 'notice_board'], 'def': 'a board that hangs on a wall; displays announcements', 'name': 'bulletin_board'}, {'frequency': 'r', 'id': 167, 'synset': 'bulletproof_vest.n.01', 'synonyms': ['bulletproof_vest'], 'def': 'a vest capable of resisting the impact of a bullet', 'name': 'bulletproof_vest'}, {'frequency': 'c', 'id': 168, 'synset': 'bullhorn.n.01', 'synonyms': ['bullhorn', 'megaphone'], 'def': 'a portable loudspeaker with built-in microphone and amplifier', 'name': 'bullhorn'}, {'frequency': 'r', 'id': 169, 'synset': 'bully_beef.n.01', 'synonyms': ['corned_beef', 'corn_beef'], 'def': 'beef cured or pickled in brine', 'name': 'corned_beef'}, {'frequency': 'f', 'id': 170, 'synset': 'bun.n.01', 'synonyms': ['bun', 'roll'], 'def': 'small rounded bread either plain or sweet', 'name': 'bun'}, {'frequency': 'c', 'id': 171, 'synset': 'bunk_bed.n.01', 'synonyms': ['bunk_bed'], 'def': 'beds built one above the other', 'name': 'bunk_bed'}, {'frequency': 'f', 'id': 172, 'synset': 'buoy.n.01', 'synonyms': ['buoy'], 'def': 'a float attached by rope to the seabed to mark channels in a harbor or underwater hazards', 'name': 'buoy'}, {'frequency': 'r', 'id': 173, 'synset': 'burrito.n.01', 'synonyms': ['burrito'], 'def': 'a flour tortilla folded around a filling', 'name': 'burrito'}, {'frequency': 'f', 'id': 174, 'synset': 'bus.n.01', 'synonyms': ['bus_(vehicle)', 'autobus', 'charabanc', 'double-decker', 'motorbus', 'motorcoach'], 'def': 'a vehicle carrying many passengers; used for public transport', 'name': 'bus_(vehicle)'}, {'frequency': 'c', 'id': 175, 'synset': 'business_card.n.01', 'synonyms': ['business_card'], 'def': "a card on which are printed the person's name and business affiliation", 'name': 'business_card'}, {'frequency': 'c', 'id': 176, 'synset': 'butcher_knife.n.01', 'synonyms': ['butcher_knife'], 'def': 'a large sharp knife for cutting or trimming meat', 'name': 'butcher_knife'}, {'frequency': 'c', 'id': 177, 'synset': 'butter.n.01', 'synonyms': ['butter'], 'def': 'an edible emulsion of fat globules made by churning milk or cream; for cooking and table use', 'name': 'butter'}, {'frequency': 'c', 'id': 178, 'synset': 'butterfly.n.01', 'synonyms': ['butterfly'], 'def': 'insect typically having a slender body with knobbed antennae and broad colorful wings', 'name': 'butterfly'}, {'frequency': 'f', 'id': 179, 'synset': 'button.n.01', 'synonyms': ['button'], 'def': 'a round fastener sewn to shirts and coats etc to fit through buttonholes', 'name': 'button'}, {'frequency': 'f', 'id': 180, 'synset': 'cab.n.03', 'synonyms': ['cab_(taxi)', 'taxi', 'taxicab'], 'def': 'a car that takes passengers where they want to go in exchange for money', 'name': 'cab_(taxi)'}, {'frequency': 'r', 'id': 181, 'synset': 'cabana.n.01', 'synonyms': ['cabana'], 'def': 'a small tent used as a dressing room beside the sea or a swimming pool', 'name': 'cabana'}, {'frequency': 'r', 'id': 182, 'synset': 'cabin_car.n.01', 'synonyms': ['cabin_car', 'caboose'], 'def': 'a car on a freight train for use of the train crew; usually the last car on the train', 'name': 'cabin_car'}, {'frequency': 'f', 'id': 183, 'synset': 'cabinet.n.01', 'synonyms': ['cabinet'], 'def': 'a piece of furniture resembling a cupboard with doors and shelves and drawers', 'name': 'cabinet'}, {'frequency': 'r', 'id': 184, 'synset': 'cabinet.n.03', 'synonyms': ['locker', 'storage_locker'], 'def': 'a storage compartment for clothes and valuables; usually it has a lock', 'name': 'locker'}, {'frequency': 'f', 'id': 185, 'synset': 'cake.n.03', 'synonyms': ['cake'], 'def': 'baked goods made from or based on a mixture of flour, sugar, eggs, and fat', 'name': 'cake'}, {'frequency': 'c', 'id': 186, 'synset': 'calculator.n.02', 'synonyms': ['calculator'], 'def': 'a small machine that is used for mathematical calculations', 'name': 'calculator'}, {'frequency': 'f', 'id': 187, 'synset': 'calendar.n.02', 'synonyms': ['calendar'], 'def': 'a list or register of events (appointments/social events/court cases, etc)', 'name': 'calendar'}, {'frequency': 'c', 'id': 188, 'synset': 'calf.n.01', 'synonyms': ['calf'], 'def': 'young of domestic cattle', 'name': 'calf'}, {'frequency': 'c', 'id': 189, 'synset': 'camcorder.n.01', 'synonyms': ['camcorder'], 'def': 'a portable television camera and videocassette recorder', 'name': 'camcorder'}, {'frequency': 'c', 'id': 190, 'synset': 'camel.n.01', 'synonyms': ['camel'], 'def': 'cud-chewing mammal used as a draft or saddle animal in desert regions', 'name': 'camel'}, {'frequency': 'f', 'id': 191, 'synset': 'camera.n.01', 'synonyms': ['camera'], 'def': 'equipment for taking photographs', 'name': 'camera'}, {'frequency': 'c', 'id': 192, 'synset': 'camera_lens.n.01', 'synonyms': ['camera_lens'], 'def': 'a lens that focuses the image in a camera', 'name': 'camera_lens'}, {'frequency': 'c', 'id': 193, 'synset': 'camper.n.02', 'synonyms': ['camper_(vehicle)', 'camping_bus', 'motor_home'], 'def': 'a recreational vehicle equipped for camping out while traveling', 'name': 'camper_(vehicle)'}, {'frequency': 'f', 'id': 194, 'synset': 'can.n.01', 'synonyms': ['can', 'tin_can'], 'def': 'airtight sealed metal container for food or drink or paint etc.', 'name': 'can'}, {'frequency': 'c', 'id': 195, 'synset': 'can_opener.n.01', 'synonyms': ['can_opener', 'tin_opener'], 'def': 'a device for cutting cans open', 'name': 'can_opener'}, {'frequency': 'r', 'id': 196, 'synset': 'candelabrum.n.01', 'synonyms': ['candelabrum', 'candelabra'], 'def': 'branched candlestick; ornamental; has several lights', 'name': 'candelabrum'}, {'frequency': 'f', 'id': 197, 'synset': 'candle.n.01', 'synonyms': ['candle', 'candlestick'], 'def': 'stick of wax with a wick in the middle', 'name': 'candle'}, {'frequency': 'f', 'id': 198, 'synset': 'candlestick.n.01', 'synonyms': ['candle_holder'], 'def': 'a holder with sockets for candles', 'name': 'candle_holder'}, {'frequency': 'r', 'id': 199, 'synset': 'candy_bar.n.01', 'synonyms': ['candy_bar'], 'def': 'a candy shaped as a bar', 'name': 'candy_bar'}, {'frequency': 'c', 'id': 200, 'synset': 'candy_cane.n.01', 'synonyms': ['candy_cane'], 'def': 'a hard candy in the shape of a rod (usually with stripes)', 'name': 'candy_cane'}, {'frequency': 'c', 'id': 201, 'synset': 'cane.n.01', 'synonyms': ['walking_cane'], 'def': 'a stick that people can lean on to help them walk', 'name': 'walking_cane'}, {'frequency': 'c', 'id': 202, 'synset': 'canister.n.02', 'synonyms': ['canister', 'cannister'], 'def': 'metal container for storing dry foods such as tea or flour', 'name': 'canister'}, {'frequency': 'r', 'id': 203, 'synset': 'cannon.n.02', 'synonyms': ['cannon'], 'def': 'heavy gun fired from a tank', 'name': 'cannon'}, {'frequency': 'c', 'id': 204, 'synset': 'canoe.n.01', 'synonyms': ['canoe'], 'def': 'small and light boat; pointed at both ends; propelled with a paddle', 'name': 'canoe'}, {'frequency': 'r', 'id': 205, 'synset': 'cantaloup.n.02', 'synonyms': ['cantaloup', 'cantaloupe'], 'def': 'the fruit of a cantaloup vine; small to medium-sized melon with yellowish flesh', 'name': 'cantaloup'}, {'frequency': 'r', 'id': 206, 'synset': 'canteen.n.01', 'synonyms': ['canteen'], 'def': 'a flask for carrying water; used by soldiers or travelers', 'name': 'canteen'}, {'frequency': 'c', 'id': 207, 'synset': 'cap.n.01', 'synonyms': ['cap_(headwear)'], 'def': 'a tight-fitting headwear', 'name': 'cap_(headwear)'}, {'frequency': 'f', 'id': 208, 'synset': 'cap.n.02', 'synonyms': ['bottle_cap', 'cap_(container_lid)'], 'def': 'a top (as for a bottle)', 'name': 'bottle_cap'}, {'frequency': 'r', 'id': 209, 'synset': 'cape.n.02', 'synonyms': ['cape'], 'def': 'a sleeveless garment like a cloak but shorter', 'name': 'cape'}, {'frequency': 'c', 'id': 210, 'synset': 'cappuccino.n.01', 'synonyms': ['cappuccino', 'coffee_cappuccino'], 'def': 'equal parts of espresso and steamed milk', 'name': 'cappuccino'}, {'frequency': 'f', 'id': 211, 'synset': 'car.n.01', 'synonyms': ['car_(automobile)', 'auto_(automobile)', 'automobile'], 'def': 'a motor vehicle with four wheels', 'name': 'car_(automobile)'}, {'frequency': 'f', 'id': 212, 'synset': 'car.n.02', 'synonyms': ['railcar_(part_of_a_train)', 'railway_car_(part_of_a_train)', 'railroad_car_(part_of_a_train)'], 'def': 'a wheeled vehicle adapted to the rails of railroad', 'name': 'railcar_(part_of_a_train)'}, {'frequency': 'r', 'id': 213, 'synset': 'car.n.04', 'synonyms': ['elevator_car'], 'def': 'where passengers ride up and down', 'name': 'elevator_car'}, {'frequency': 'r', 'id': 214, 'synset': 'car_battery.n.01', 'synonyms': ['car_battery', 'automobile_battery'], 'def': 'a battery in a motor vehicle', 'name': 'car_battery'}, {'frequency': 'c', 'id': 215, 'synset': 'card.n.02', 'synonyms': ['identity_card'], 'def': 'a card certifying the identity of the bearer', 'name': 'identity_card'}, {'frequency': 'c', 'id': 216, 'synset': 'card.n.03', 'synonyms': ['card'], 'def': 'a rectangular piece of paper used to send messages (e.g. greetings or pictures)', 'name': 'card'}, {'frequency': 'r', 'id': 217, 'synset': 'cardigan.n.01', 'synonyms': ['cardigan'], 'def': 'knitted jacket that is fastened up the front with buttons or a zipper', 'name': 'cardigan'}, {'frequency': 'r', 'id': 218, 'synset': 'cargo_ship.n.01', 'synonyms': ['cargo_ship', 'cargo_vessel'], 'def': 'a ship designed to carry cargo', 'name': 'cargo_ship'}, {'frequency': 'r', 'id': 219, 'synset': 'carnation.n.01', 'synonyms': ['carnation'], 'def': 'plant with pink to purple-red spice-scented usually double flowers', 'name': 'carnation'}, {'frequency': 'c', 'id': 220, 'synset': 'carriage.n.02', 'synonyms': ['horse_carriage'], 'def': 'a vehicle with wheels drawn by one or more horses', 'name': 'horse_carriage'}, {'frequency': 'f', 'id': 221, 'synset': 'carrot.n.01', 'synonyms': ['carrot'], 'def': 'deep orange edible root of the cultivated carrot plant', 'name': 'carrot'}, {'frequency': 'c', 'id': 222, 'synset': 'carryall.n.01', 'synonyms': ['tote_bag'], 'def': 'a capacious bag or basket', 'name': 'tote_bag'}, {'frequency': 'c', 'id': 223, 'synset': 'cart.n.01', 'synonyms': ['cart'], 'def': 'a heavy open wagon usually having two wheels and drawn by an animal', 'name': 'cart'}, {'frequency': 'c', 'id': 224, 'synset': 'carton.n.02', 'synonyms': ['carton'], 'def': 'a box made of cardboard; opens by flaps on top', 'name': 'carton'}, {'frequency': 'c', 'id': 225, 'synset': 'cash_register.n.01', 'synonyms': ['cash_register', 'register_(for_cash_transactions)'], 'def': 'a cashbox with an adding machine to register transactions', 'name': 'cash_register'}, {'frequency': 'r', 'id': 226, 'synset': 'casserole.n.01', 'synonyms': ['casserole'], 'def': 'food cooked and served in a casserole', 'name': 'casserole'}, {'frequency': 'r', 'id': 227, 'synset': 'cassette.n.01', 'synonyms': ['cassette'], 'def': 'a container that holds a magnetic tape used for recording or playing sound or video', 'name': 'cassette'}, {'frequency': 'c', 'id': 228, 'synset': 'cast.n.05', 'synonyms': ['cast', 'plaster_cast', 'plaster_bandage'], 'def': 'bandage consisting of a firm covering that immobilizes broken bones while they heal', 'name': 'cast'}, {'frequency': 'f', 'id': 229, 'synset': 'cat.n.01', 'synonyms': ['cat'], 'def': 'a domestic house cat', 'name': 'cat'}, {'frequency': 'c', 'id': 230, 'synset': 'cauliflower.n.02', 'synonyms': ['cauliflower'], 'def': 'edible compact head of white undeveloped flowers', 'name': 'cauliflower'}, {'frequency': 'r', 'id': 231, 'synset': 'caviar.n.01', 'synonyms': ['caviar', 'caviare'], 'def': "salted roe of sturgeon or other large fish; usually served as an hors d'oeuvre", 'name': 'caviar'}, {'frequency': 'c', 'id': 232, 'synset': 'cayenne.n.02', 'synonyms': ['cayenne_(spice)', 'cayenne_pepper_(spice)', 'red_pepper_(spice)'], 'def': 'ground pods and seeds of pungent red peppers of the genus Capsicum', 'name': 'cayenne_(spice)'}, {'frequency': 'c', 'id': 233, 'synset': 'cd_player.n.01', 'synonyms': ['CD_player'], 'def': 'electronic equipment for playing compact discs (CDs)', 'name': 'CD_player'}, {'frequency': 'c', 'id': 234, 'synset': 'celery.n.01', 'synonyms': ['celery'], 'def': 'widely cultivated herb with aromatic leaf stalks that are eaten raw or cooked', 'name': 'celery'}, {'frequency': 'f', 'id': 235, 'synset': 'cellular_telephone.n.01', 'synonyms': ['cellular_telephone', 'cellular_phone', 'cellphone', 'mobile_phone', 'smart_phone'], 'def': 'a hand-held mobile telephone', 'name': 'cellular_telephone'}, {'frequency': 'r', 'id': 236, 'synset': 'chain_mail.n.01', 'synonyms': ['chain_mail', 'ring_mail', 'chain_armor', 'chain_armour', 'ring_armor', 'ring_armour'], 'def': '(Middle Ages) flexible armor made of interlinked metal rings', 'name': 'chain_mail'}, {'frequency': 'f', 'id': 237, 'synset': 'chair.n.01', 'synonyms': ['chair'], 'def': 'a seat for one person, with a support for the back', 'name': 'chair'}, {'frequency': 'r', 'id': 238, 'synset': 'chaise_longue.n.01', 'synonyms': ['chaise_longue', 'chaise', 'daybed'], 'def': 'a long chair; for reclining', 'name': 'chaise_longue'}, {'frequency': 'r', 'id': 239, 'synset': 'champagne.n.01', 'synonyms': ['champagne'], 'def': 'a white sparkling wine produced in Champagne or resembling that produced there', 'name': 'champagne'}, {'frequency': 'f', 'id': 240, 'synset': 'chandelier.n.01', 'synonyms': ['chandelier'], 'def': 'branched lighting fixture; often ornate; hangs from the ceiling', 'name': 'chandelier'}, {'frequency': 'r', 'id': 241, 'synset': 'chap.n.04', 'synonyms': ['chap'], 'def': 'leather leggings without a seat; worn over trousers by cowboys to protect their legs', 'name': 'chap'}, {'frequency': 'r', 'id': 242, 'synset': 'checkbook.n.01', 'synonyms': ['checkbook', 'chequebook'], 'def': 'a book issued to holders of checking accounts', 'name': 'checkbook'}, {'frequency': 'r', 'id': 243, 'synset': 'checkerboard.n.01', 'synonyms': ['checkerboard'], 'def': 'a board having 64 squares of two alternating colors', 'name': 'checkerboard'}, {'frequency': 'c', 'id': 244, 'synset': 'cherry.n.03', 'synonyms': ['cherry'], 'def': 'a red fruit with a single hard stone', 'name': 'cherry'}, {'frequency': 'r', 'id': 245, 'synset': 'chessboard.n.01', 'synonyms': ['chessboard'], 'def': 'a checkerboard used to play chess', 'name': 'chessboard'}, {'frequency': 'r', 'id': 246, 'synset': 'chest_of_drawers.n.01', 'synonyms': ['chest_of_drawers_(furniture)', 'bureau_(furniture)', 'chest_(furniture)'], 'def': 'furniture with drawers for keeping clothes', 'name': 'chest_of_drawers_(furniture)'}, {'frequency': 'c', 'id': 247, 'synset': 'chicken.n.02', 'synonyms': ['chicken_(animal)'], 'def': 'a domestic fowl bred for flesh or eggs', 'name': 'chicken_(animal)'}, {'frequency': 'c', 'id': 248, 'synset': 'chicken_wire.n.01', 'synonyms': ['chicken_wire'], 'def': 'a galvanized wire network with a hexagonal mesh; used to build fences', 'name': 'chicken_wire'}, {'frequency': 'r', 'id': 249, 'synset': 'chickpea.n.01', 'synonyms': ['chickpea', 'garbanzo'], 'def': 'the seed of the chickpea plant; usually dried', 'name': 'chickpea'}, {'frequency': 'r', 'id': 250, 'synset': 'chihuahua.n.03', 'synonyms': ['Chihuahua'], 'def': 'an old breed of tiny short-haired dog with protruding eyes from Mexico', 'name': 'Chihuahua'}, {'frequency': 'r', 'id': 251, 'synset': 'chili.n.02', 'synonyms': ['chili_(vegetable)', 'chili_pepper_(vegetable)', 'chilli_(vegetable)', 'chilly_(vegetable)', 'chile_(vegetable)'], 'def': 'very hot and finely tapering pepper of special pungency', 'name': 'chili_(vegetable)'}, {'frequency': 'r', 'id': 252, 'synset': 'chime.n.01', 'synonyms': ['chime', 'gong'], 'def': 'an instrument consisting of a set of bells that are struck with a hammer', 'name': 'chime'}, {'frequency': 'r', 'id': 253, 'synset': 'chinaware.n.01', 'synonyms': ['chinaware'], 'def': 'dishware made of high quality porcelain', 'name': 'chinaware'}, {'frequency': 'c', 'id': 254, 'synset': 'chip.n.04', 'synonyms': ['crisp_(potato_chip)', 'potato_chip'], 'def': 'a thin crisp slice of potato fried in deep fat', 'name': 'crisp_(potato_chip)'}, {'frequency': 'r', 'id': 255, 'synset': 'chip.n.06', 'synonyms': ['poker_chip'], 'def': 'a small disk-shaped counter used to represent money when gambling', 'name': 'poker_chip'}, {'frequency': 'c', 'id': 256, 'synset': 'chocolate_bar.n.01', 'synonyms': ['chocolate_bar'], 'def': 'a bar of chocolate candy', 'name': 'chocolate_bar'}, {'frequency': 'c', 'id': 257, 'synset': 'chocolate_cake.n.01', 'synonyms': ['chocolate_cake'], 'def': 'cake containing chocolate', 'name': 'chocolate_cake'}, {'frequency': 'r', 'id': 258, 'synset': 'chocolate_milk.n.01', 'synonyms': ['chocolate_milk'], 'def': 'milk flavored with chocolate syrup', 'name': 'chocolate_milk'}, {'frequency': 'r', 'id': 259, 'synset': 'chocolate_mousse.n.01', 'synonyms': ['chocolate_mousse'], 'def': 'dessert mousse made with chocolate', 'name': 'chocolate_mousse'}, {'frequency': 'f', 'id': 260, 'synset': 'choker.n.03', 'synonyms': ['choker', 'collar', 'neckband'], 'def': 'necklace that fits tightly around the neck', 'name': 'choker'}, {'frequency': 'f', 'id': 261, 'synset': 'chopping_board.n.01', 'synonyms': ['chopping_board', 'cutting_board', 'chopping_block'], 'def': 'a wooden board where meats or vegetables can be cut', 'name': 'chopping_board'}, {'frequency': 'c', 'id': 262, 'synset': 'chopstick.n.01', 'synonyms': ['chopstick'], 'def': 'one of a pair of slender sticks used as oriental tableware to eat food with', 'name': 'chopstick'}, {'frequency': 'f', 'id': 263, 'synset': 'christmas_tree.n.05', 'synonyms': ['Christmas_tree'], 'def': 'an ornamented evergreen used as a Christmas decoration', 'name': 'Christmas_tree'}, {'frequency': 'c', 'id': 264, 'synset': 'chute.n.02', 'synonyms': ['slide'], 'def': 'sloping channel through which things can descend', 'name': 'slide'}, {'frequency': 'r', 'id': 265, 'synset': 'cider.n.01', 'synonyms': ['cider', 'cyder'], 'def': 'a beverage made from juice pressed from apples', 'name': 'cider'}, {'frequency': 'r', 'id': 266, 'synset': 'cigar_box.n.01', 'synonyms': ['cigar_box'], 'def': 'a box for holding cigars', 'name': 'cigar_box'}, {'frequency': 'c', 'id': 267, 'synset': 'cigarette.n.01', 'synonyms': ['cigarette'], 'def': 'finely ground tobacco wrapped in paper; for smoking', 'name': 'cigarette'}, {'frequency': 'c', 'id': 268, 'synset': 'cigarette_case.n.01', 'synonyms': ['cigarette_case', 'cigarette_pack'], 'def': 'a small flat case for holding cigarettes', 'name': 'cigarette_case'}, {'frequency': 'f', 'id': 269, 'synset': 'cistern.n.02', 'synonyms': ['cistern', 'water_tank'], 'def': 'a tank that holds the water used to flush a toilet', 'name': 'cistern'}, {'frequency': 'r', 'id': 270, 'synset': 'clarinet.n.01', 'synonyms': ['clarinet'], 'def': 'a single-reed instrument with a straight tube', 'name': 'clarinet'}, {'frequency': 'r', 'id': 271, 'synset': 'clasp.n.01', 'synonyms': ['clasp'], 'def': 'a fastener (as a buckle or hook) that is used to hold two things together', 'name': 'clasp'}, {'frequency': 'c', 'id': 272, 'synset': 'cleansing_agent.n.01', 'synonyms': ['cleansing_agent', 'cleanser', 'cleaner'], 'def': 'a preparation used in cleaning something', 'name': 'cleansing_agent'}, {'frequency': 'r', 'id': 273, 'synset': 'clementine.n.01', 'synonyms': ['clementine'], 'def': 'a variety of mandarin orange', 'name': 'clementine'}, {'frequency': 'c', 'id': 274, 'synset': 'clip.n.03', 'synonyms': ['clip'], 'def': 'any of various small fasteners used to hold loose articles together', 'name': 'clip'}, {'frequency': 'c', 'id': 275, 'synset': 'clipboard.n.01', 'synonyms': ['clipboard'], 'def': 'a small writing board with a clip at the top for holding papers', 'name': 'clipboard'}, {'frequency': 'f', 'id': 276, 'synset': 'clock.n.01', 'synonyms': ['clock', 'timepiece', 'timekeeper'], 'def': 'a timepiece that shows the time of day', 'name': 'clock'}, {'frequency': 'f', 'id': 277, 'synset': 'clock_tower.n.01', 'synonyms': ['clock_tower'], 'def': 'a tower with a large clock visible high up on an outside face', 'name': 'clock_tower'}, {'frequency': 'c', 'id': 278, 'synset': 'clothes_hamper.n.01', 'synonyms': ['clothes_hamper', 'laundry_basket', 'clothes_basket'], 'def': 'a hamper that holds dirty clothes to be washed or wet clothes to be dried', 'name': 'clothes_hamper'}, {'frequency': 'c', 'id': 279, 'synset': 'clothespin.n.01', 'synonyms': ['clothespin', 'clothes_peg'], 'def': 'wood or plastic fastener; for holding clothes on a clothesline', 'name': 'clothespin'}, {'frequency': 'r', 'id': 280, 'synset': 'clutch_bag.n.01', 'synonyms': ['clutch_bag'], 'def': "a woman's strapless purse that is carried in the hand", 'name': 'clutch_bag'}, {'frequency': 'f', 'id': 281, 'synset': 'coaster.n.03', 'synonyms': ['coaster'], 'def': 'a covering (plate or mat) that protects the surface of a table', 'name': 'coaster'}, {'frequency': 'f', 'id': 282, 'synset': 'coat.n.01', 'synonyms': ['coat'], 'def': 'an outer garment that has sleeves and covers the body from shoulder down', 'name': 'coat'}, {'frequency': 'c', 'id': 283, 'synset': 'coat_hanger.n.01', 'synonyms': ['coat_hanger', 'clothes_hanger', 'dress_hanger'], 'def': "a hanger that is shaped like a person's shoulders", 'name': 'coat_hanger'}, {'frequency': 'r', 'id': 284, 'synset': 'coatrack.n.01', 'synonyms': ['coatrack', 'hatrack'], 'def': 'a rack with hooks for temporarily holding coats and hats', 'name': 'coatrack'}, {'frequency': 'c', 'id': 285, 'synset': 'cock.n.04', 'synonyms': ['cock', 'rooster'], 'def': 'adult male chicken', 'name': 'cock'}, {'frequency': 'c', 'id': 286, 'synset': 'coconut.n.02', 'synonyms': ['coconut', 'cocoanut'], 'def': 'large hard-shelled brown oval nut with a fibrous husk', 'name': 'coconut'}, {'frequency': 'r', 'id': 287, 'synset': 'coffee_filter.n.01', 'synonyms': ['coffee_filter'], 'def': 'filter (usually of paper) that passes the coffee and retains the coffee grounds', 'name': 'coffee_filter'}, {'frequency': 'f', 'id': 288, 'synset': 'coffee_maker.n.01', 'synonyms': ['coffee_maker', 'coffee_machine'], 'def': 'a kitchen appliance for brewing coffee automatically', 'name': 'coffee_maker'}, {'frequency': 'f', 'id': 289, 'synset': 'coffee_table.n.01', 'synonyms': ['coffee_table', 'cocktail_table'], 'def': 'low table where magazines can be placed and coffee or cocktails are served', 'name': 'coffee_table'}, {'frequency': 'c', 'id': 290, 'synset': 'coffeepot.n.01', 'synonyms': ['coffeepot'], 'def': 'tall pot in which coffee is brewed', 'name': 'coffeepot'}, {'frequency': 'r', 'id': 291, 'synset': 'coil.n.05', 'synonyms': ['coil'], 'def': 'tubing that is wound in a spiral', 'name': 'coil'}, {'frequency': 'c', 'id': 292, 'synset': 'coin.n.01', 'synonyms': ['coin'], 'def': 'a flat metal piece (usually a disc) used as money', 'name': 'coin'}, {'frequency': 'r', 'id': 293, 'synset': 'colander.n.01', 'synonyms': ['colander', 'cullender'], 'def': 'bowl-shaped strainer; used to wash or drain foods', 'name': 'colander'}, {'frequency': 'c', 'id': 294, 'synset': 'coleslaw.n.01', 'synonyms': ['coleslaw', 'slaw'], 'def': 'basically shredded cabbage', 'name': 'coleslaw'}, {'frequency': 'r', 'id': 295, 'synset': 'coloring_material.n.01', 'synonyms': ['coloring_material', 'colouring_material'], 'def': 'any material used for its color', 'name': 'coloring_material'}, {'frequency': 'r', 'id': 296, 'synset': 'combination_lock.n.01', 'synonyms': ['combination_lock'], 'def': 'lock that can be opened only by turning dials in a special sequence', 'name': 'combination_lock'}, {'frequency': 'c', 'id': 297, 'synset': 'comforter.n.04', 'synonyms': ['pacifier', 'teething_ring'], 'def': 'device used for an infant to suck or bite on', 'name': 'pacifier'}, {'frequency': 'r', 'id': 298, 'synset': 'comic_book.n.01', 'synonyms': ['comic_book'], 'def': 'a magazine devoted to comic strips', 'name': 'comic_book'}, {'frequency': 'f', 'id': 299, 'synset': 'computer_keyboard.n.01', 'synonyms': ['computer_keyboard', 'keyboard_(computer)'], 'def': 'a keyboard that is a data input device for computers', 'name': 'computer_keyboard'}, {'frequency': 'r', 'id': 300, 'synset': 'concrete_mixer.n.01', 'synonyms': ['concrete_mixer', 'cement_mixer'], 'def': 'a machine with a large revolving drum in which cement/concrete is mixed', 'name': 'concrete_mixer'}, {'frequency': 'f', 'id': 301, 'synset': 'cone.n.01', 'synonyms': ['cone', 'traffic_cone'], 'def': 'a cone-shaped object used to direct traffic', 'name': 'cone'}, {'frequency': 'f', 'id': 302, 'synset': 'control.n.09', 'synonyms': ['control', 'controller'], 'def': 'a mechanism that controls the operation of a machine', 'name': 'control'}, {'frequency': 'r', 'id': 303, 'synset': 'convertible.n.01', 'synonyms': ['convertible_(automobile)'], 'def': 'a car that has top that can be folded or removed', 'name': 'convertible_(automobile)'}, {'frequency': 'r', 'id': 304, 'synset': 'convertible.n.03', 'synonyms': ['sofa_bed'], 'def': 'a sofa that can be converted into a bed', 'name': 'sofa_bed'}, {'frequency': 'c', 'id': 305, 'synset': 'cookie.n.01', 'synonyms': ['cookie', 'cooky', 'biscuit_(cookie)'], 'def': "any of various small flat sweet cakes (`biscuit' is the British term)", 'name': 'cookie'}, {'frequency': 'r', 'id': 306, 'synset': 'cookie_jar.n.01', 'synonyms': ['cookie_jar', 'cooky_jar'], 'def': 'a jar in which cookies are kept (and sometimes money is hidden)', 'name': 'cookie_jar'}, {'frequency': 'r', 'id': 307, 'synset': 'cooking_utensil.n.01', 'synonyms': ['cooking_utensil'], 'def': 'a kitchen utensil made of material that does not melt easily; used for cooking', 'name': 'cooking_utensil'}, {'frequency': 'f', 'id': 308, 'synset': 'cooler.n.01', 'synonyms': ['cooler_(for_food)', 'ice_chest'], 'def': 'an insulated box for storing food often with ice', 'name': 'cooler_(for_food)'}, {'frequency': 'c', 'id': 309, 'synset': 'cork.n.04', 'synonyms': ['cork_(bottle_plug)', 'bottle_cork'], 'def': 'the plug in the mouth of a bottle (especially a wine bottle)', 'name': 'cork_(bottle_plug)'}, {'frequency': 'r', 'id': 310, 'synset': 'corkboard.n.01', 'synonyms': ['corkboard'], 'def': 'a sheet consisting of cork granules', 'name': 'corkboard'}, {'frequency': 'r', 'id': 311, 'synset': 'corkscrew.n.01', 'synonyms': ['corkscrew', 'bottle_screw'], 'def': 'a bottle opener that pulls corks', 'name': 'corkscrew'}, {'frequency': 'c', 'id': 312, 'synset': 'corn.n.03', 'synonyms': ['edible_corn', 'corn', 'maize'], 'def': 'ears of corn that can be prepared and served for human food', 'name': 'edible_corn'}, {'frequency': 'r', 'id': 313, 'synset': 'cornbread.n.01', 'synonyms': ['cornbread'], 'def': 'bread made primarily of cornmeal', 'name': 'cornbread'}, {'frequency': 'c', 'id': 314, 'synset': 'cornet.n.01', 'synonyms': ['cornet', 'horn', 'trumpet'], 'def': 'a brass musical instrument with a narrow tube and a flared bell and many valves', 'name': 'cornet'}, {'frequency': 'c', 'id': 315, 'synset': 'cornice.n.01', 'synonyms': ['cornice', 'valance', 'valance_board', 'pelmet'], 'def': 'a decorative framework to conceal curtain fixtures at the top of a window casing', 'name': 'cornice'}, {'frequency': 'r', 'id': 316, 'synset': 'cornmeal.n.01', 'synonyms': ['cornmeal'], 'def': 'coarsely ground corn', 'name': 'cornmeal'}, {'frequency': 'r', 'id': 317, 'synset': 'corset.n.01', 'synonyms': ['corset', 'girdle'], 'def': "a woman's close-fitting foundation garment", 'name': 'corset'}, {'frequency': 'r', 'id': 318, 'synset': 'cos.n.02', 'synonyms': ['romaine_lettuce'], 'def': 'lettuce with long dark-green leaves in a loosely packed elongated head', 'name': 'romaine_lettuce'}, {'frequency': 'c', 'id': 319, 'synset': 'costume.n.04', 'synonyms': ['costume'], 'def': 'the attire characteristic of a country or a time or a social class', 'name': 'costume'}, {'frequency': 'r', 'id': 320, 'synset': 'cougar.n.01', 'synonyms': ['cougar', 'puma', 'catamount', 'mountain_lion', 'panther'], 'def': 'large American feline resembling a lion', 'name': 'cougar'}, {'frequency': 'r', 'id': 321, 'synset': 'coverall.n.01', 'synonyms': ['coverall'], 'def': 'a loose-fitting protective garment that is worn over other clothing', 'name': 'coverall'}, {'frequency': 'r', 'id': 322, 'synset': 'cowbell.n.01', 'synonyms': ['cowbell'], 'def': 'a bell hung around the neck of cow so that the cow can be easily located', 'name': 'cowbell'}, {'frequency': 'f', 'id': 323, 'synset': 'cowboy_hat.n.01', 'synonyms': ['cowboy_hat', 'ten-gallon_hat'], 'def': 'a hat with a wide brim and a soft crown; worn by American ranch hands', 'name': 'cowboy_hat'}, {'frequency': 'r', 'id': 324, 'synset': 'crab.n.01', 'synonyms': ['crab_(animal)'], 'def': 'decapod having eyes on short stalks and a broad flattened shell and pincers', 'name': 'crab_(animal)'}, {'frequency': 'c', 'id': 325, 'synset': 'cracker.n.01', 'synonyms': ['cracker'], 'def': 'a thin crisp wafer', 'name': 'cracker'}, {'frequency': 'r', 'id': 326, 'synset': 'crape.n.01', 'synonyms': ['crape', 'crepe', 'French_pancake'], 'def': 'small very thin pancake', 'name': 'crape'}, {'frequency': 'f', 'id': 327, 'synset': 'crate.n.01', 'synonyms': ['crate'], 'def': 'a rugged box (usually made of wood); used for shipping', 'name': 'crate'}, {'frequency': 'r', 'id': 328, 'synset': 'crayon.n.01', 'synonyms': ['crayon', 'wax_crayon'], 'def': 'writing or drawing implement made of a colored stick of composition wax', 'name': 'crayon'}, {'frequency': 'r', 'id': 329, 'synset': 'cream_pitcher.n.01', 'synonyms': ['cream_pitcher'], 'def': 'a small pitcher for serving cream', 'name': 'cream_pitcher'}, {'frequency': 'r', 'id': 330, 'synset': 'credit_card.n.01', 'synonyms': ['credit_card', 'charge_card', 'debit_card'], 'def': 'a card, usually plastic, used to pay for goods and services', 'name': 'credit_card'}, {'frequency': 'c', 'id': 331, 'synset': 'crescent_roll.n.01', 'synonyms': ['crescent_roll', 'croissant'], 'def': 'very rich flaky crescent-shaped roll', 'name': 'crescent_roll'}, {'frequency': 'c', 'id': 332, 'synset': 'crib.n.01', 'synonyms': ['crib', 'cot'], 'def': 'baby bed with high sides made of slats', 'name': 'crib'}, {'frequency': 'c', 'id': 333, 'synset': 'crock.n.03', 'synonyms': ['crock_pot', 'earthenware_jar'], 'def': 'an earthen jar (made of baked clay)', 'name': 'crock_pot'}, {'frequency': 'f', 'id': 334, 'synset': 'crossbar.n.01', 'synonyms': ['crossbar'], 'def': 'a horizontal bar that goes across something', 'name': 'crossbar'}, {'frequency': 'r', 'id': 335, 'synset': 'crouton.n.01', 'synonyms': ['crouton'], 'def': 'a small piece of toasted or fried bread; served in soup or salads', 'name': 'crouton'}, {'frequency': 'r', 'id': 336, 'synset': 'crow.n.01', 'synonyms': ['crow'], 'def': 'black birds having a raucous call', 'name': 'crow'}, {'frequency': 'c', 'id': 337, 'synset': 'crown.n.04', 'synonyms': ['crown'], 'def': 'an ornamental jeweled headdress signifying sovereignty', 'name': 'crown'}, {'frequency': 'c', 'id': 338, 'synset': 'crucifix.n.01', 'synonyms': ['crucifix'], 'def': 'representation of the cross on which Jesus died', 'name': 'crucifix'}, {'frequency': 'c', 'id': 339, 'synset': 'cruise_ship.n.01', 'synonyms': ['cruise_ship', 'cruise_liner'], 'def': 'a passenger ship used commercially for pleasure cruises', 'name': 'cruise_ship'}, {'frequency': 'c', 'id': 340, 'synset': 'cruiser.n.01', 'synonyms': ['police_cruiser', 'patrol_car', 'police_car', 'squad_car'], 'def': 'a car in which policemen cruise the streets', 'name': 'police_cruiser'}, {'frequency': 'c', 'id': 341, 'synset': 'crumb.n.03', 'synonyms': ['crumb'], 'def': 'small piece of e.g. bread or cake', 'name': 'crumb'}, {'frequency': 'r', 'id': 342, 'synset': 'crutch.n.01', 'synonyms': ['crutch'], 'def': 'a wooden or metal staff that fits under the armpit and reaches to the ground', 'name': 'crutch'}, {'frequency': 'c', 'id': 343, 'synset': 'cub.n.03', 'synonyms': ['cub_(animal)'], 'def': 'the young of certain carnivorous mammals such as the bear or wolf or lion', 'name': 'cub_(animal)'}, {'frequency': 'r', 'id': 344, 'synset': 'cube.n.05', 'synonyms': ['cube', 'square_block'], 'def': 'a block in the (approximate) shape of a cube', 'name': 'cube'}, {'frequency': 'f', 'id': 345, 'synset': 'cucumber.n.02', 'synonyms': ['cucumber', 'cuke'], 'def': 'cylindrical green fruit with thin green rind and white flesh eaten as a vegetable', 'name': 'cucumber'}, {'frequency': 'c', 'id': 346, 'synset': 'cufflink.n.01', 'synonyms': ['cufflink'], 'def': 'jewelry consisting of linked buttons used to fasten the cuffs of a shirt', 'name': 'cufflink'}, {'frequency': 'f', 'id': 347, 'synset': 'cup.n.01', 'synonyms': ['cup'], 'def': 'a small open container usually used for drinking; usually has a handle', 'name': 'cup'}, {'frequency': 'c', 'id': 348, 'synset': 'cup.n.08', 'synonyms': ['trophy_cup'], 'def': 'a metal vessel with handles that is awarded as a trophy to a competition winner', 'name': 'trophy_cup'}, {'frequency': 'c', 'id': 349, 'synset': 'cupcake.n.01', 'synonyms': ['cupcake'], 'def': 'small cake baked in a muffin tin', 'name': 'cupcake'}, {'frequency': 'r', 'id': 350, 'synset': 'curler.n.01', 'synonyms': ['hair_curler', 'hair_roller', 'hair_crimper'], 'def': 'a cylindrical tube around which the hair is wound to curl it', 'name': 'hair_curler'}, {'frequency': 'r', 'id': 351, 'synset': 'curling_iron.n.01', 'synonyms': ['curling_iron'], 'def': 'a cylindrical home appliance that heats hair that has been curled around it', 'name': 'curling_iron'}, {'frequency': 'f', 'id': 352, 'synset': 'curtain.n.01', 'synonyms': ['curtain', 'drapery'], 'def': 'hanging cloth used as a blind (especially for a window)', 'name': 'curtain'}, {'frequency': 'f', 'id': 353, 'synset': 'cushion.n.03', 'synonyms': ['cushion'], 'def': 'a soft bag filled with air or padding such as feathers or foam rubber', 'name': 'cushion'}, {'frequency': 'r', 'id': 354, 'synset': 'custard.n.01', 'synonyms': ['custard'], 'def': 'sweetened mixture of milk and eggs baked or boiled or frozen', 'name': 'custard'}, {'frequency': 'c', 'id': 355, 'synset': 'cutter.n.06', 'synonyms': ['cutting_tool'], 'def': 'a cutting implement; a tool for cutting', 'name': 'cutting_tool'}, {'frequency': 'r', 'id': 356, 'synset': 'cylinder.n.04', 'synonyms': ['cylinder'], 'def': 'a cylindrical container', 'name': 'cylinder'}, {'frequency': 'r', 'id': 357, 'synset': 'cymbal.n.01', 'synonyms': ['cymbal'], 'def': 'a percussion instrument consisting of a concave brass disk', 'name': 'cymbal'}, {'frequency': 'r', 'id': 358, 'synset': 'dachshund.n.01', 'synonyms': ['dachshund', 'dachsie', 'badger_dog'], 'def': 'small long-bodied short-legged breed of dog having a short sleek coat and long drooping ears', 'name': 'dachshund'}, {'frequency': 'r', 'id': 359, 'synset': 'dagger.n.01', 'synonyms': ['dagger'], 'def': 'a short knife with a pointed blade used for piercing or stabbing', 'name': 'dagger'}, {'frequency': 'r', 'id': 360, 'synset': 'dartboard.n.01', 'synonyms': ['dartboard'], 'def': 'a circular board of wood or cork used as the target in the game of darts', 'name': 'dartboard'}, {'frequency': 'r', 'id': 361, 'synset': 'date.n.08', 'synonyms': ['date_(fruit)'], 'def': 'sweet edible fruit of the date palm with a single long woody seed', 'name': 'date_(fruit)'}, {'frequency': 'f', 'id': 362, 'synset': 'deck_chair.n.01', 'synonyms': ['deck_chair', 'beach_chair'], 'def': 'a folding chair for use outdoors; a wooden frame supports a length of canvas', 'name': 'deck_chair'}, {'frequency': 'c', 'id': 363, 'synset': 'deer.n.01', 'synonyms': ['deer', 'cervid'], 'def': "distinguished from Bovidae by the male's having solid deciduous antlers", 'name': 'deer'}, {'frequency': 'c', 'id': 364, 'synset': 'dental_floss.n.01', 'synonyms': ['dental_floss', 'floss'], 'def': 'a soft thread for cleaning the spaces between the teeth', 'name': 'dental_floss'}, {'frequency': 'f', 'id': 365, 'synset': 'desk.n.01', 'synonyms': ['desk'], 'def': 'a piece of furniture with a writing surface and usually drawers or other compartments', 'name': 'desk'}, {'frequency': 'r', 'id': 366, 'synset': 'detergent.n.01', 'synonyms': ['detergent'], 'def': 'a surface-active chemical widely used in industry and laundering', 'name': 'detergent'}, {'frequency': 'c', 'id': 367, 'synset': 'diaper.n.01', 'synonyms': ['diaper'], 'def': 'garment consisting of a folded cloth drawn up between the legs and fastened at the waist', 'name': 'diaper'}, {'frequency': 'r', 'id': 368, 'synset': 'diary.n.01', 'synonyms': ['diary', 'journal'], 'def': 'a daily written record of (usually personal) experiences and observations', 'name': 'diary'}, {'frequency': 'r', 'id': 369, 'synset': 'die.n.01', 'synonyms': ['die', 'dice'], 'def': 'a small cube with 1 to 6 spots on the six faces; used in gambling', 'name': 'die'}, {'frequency': 'r', 'id': 370, 'synset': 'dinghy.n.01', 'synonyms': ['dinghy', 'dory', 'rowboat'], 'def': 'a small boat of shallow draft with seats and oars with which it is propelled', 'name': 'dinghy'}, {'frequency': 'f', 'id': 371, 'synset': 'dining_table.n.01', 'synonyms': ['dining_table'], 'def': 'a table at which meals are served', 'name': 'dining_table'}, {'frequency': 'r', 'id': 372, 'synset': 'dinner_jacket.n.01', 'synonyms': ['tux', 'tuxedo'], 'def': 'semiformal evening dress for men', 'name': 'tux'}, {'frequency': 'c', 'id': 373, 'synset': 'dish.n.01', 'synonyms': ['dish'], 'def': 'a piece of dishware normally used as a container for holding or serving food', 'name': 'dish'}, {'frequency': 'c', 'id': 374, 'synset': 'dish.n.05', 'synonyms': ['dish_antenna'], 'def': 'directional antenna consisting of a parabolic reflector', 'name': 'dish_antenna'}, {'frequency': 'c', 'id': 375, 'synset': 'dishrag.n.01', 'synonyms': ['dishrag', 'dishcloth'], 'def': 'a cloth for washing dishes', 'name': 'dishrag'}, {'frequency': 'c', 'id': 376, 'synset': 'dishtowel.n.01', 'synonyms': ['dishtowel', 'tea_towel'], 'def': 'a towel for drying dishes', 'name': 'dishtowel'}, {'frequency': 'f', 'id': 377, 'synset': 'dishwasher.n.01', 'synonyms': ['dishwasher', 'dishwashing_machine'], 'def': 'a machine for washing dishes', 'name': 'dishwasher'}, {'frequency': 'r', 'id': 378, 'synset': 'dishwasher_detergent.n.01', 'synonyms': ['dishwasher_detergent', 'dishwashing_detergent', 'dishwashing_liquid'], 'def': 'a low-sudsing detergent designed for use in dishwashers', 'name': 'dishwasher_detergent'}, {'frequency': 'r', 'id': 379, 'synset': 'diskette.n.01', 'synonyms': ['diskette', 'floppy', 'floppy_disk'], 'def': 'a small plastic magnetic disk enclosed in a stiff envelope used to store data', 'name': 'diskette'}, {'frequency': 'c', 'id': 380, 'synset': 'dispenser.n.01', 'synonyms': ['dispenser'], 'def': 'a container so designed that the contents can be used in prescribed amounts', 'name': 'dispenser'}, {'frequency': 'c', 'id': 381, 'synset': 'dixie_cup.n.01', 'synonyms': ['Dixie_cup', 'paper_cup'], 'def': 'a disposable cup made of paper; for holding drinks', 'name': 'Dixie_cup'}, {'frequency': 'f', 'id': 382, 'synset': 'dog.n.01', 'synonyms': ['dog'], 'def': 'a common domesticated dog', 'name': 'dog'}, {'frequency': 'f', 'id': 383, 'synset': 'dog_collar.n.01', 'synonyms': ['dog_collar'], 'def': 'a collar for a dog', 'name': 'dog_collar'}, {'frequency': 'c', 'id': 384, 'synset': 'doll.n.01', 'synonyms': ['doll'], 'def': 'a toy replica of a HUMAN (NOT AN ANIMAL)', 'name': 'doll'}, {'frequency': 'r', 'id': 385, 'synset': 'dollar.n.02', 'synonyms': ['dollar', 'dollar_bill', 'one_dollar_bill'], 'def': 'a piece of paper money worth one dollar', 'name': 'dollar'}, {'frequency': 'r', 'id': 386, 'synset': 'dolphin.n.02', 'synonyms': ['dolphin'], 'def': 'any of various small toothed whales with a beaklike snout; larger than porpoises', 'name': 'dolphin'}, {'frequency': 'c', 'id': 387, 'synset': 'domestic_ass.n.01', 'synonyms': ['domestic_ass', 'donkey'], 'def': 'domestic beast of burden descended from the African wild ass; patient but stubborn', 'name': 'domestic_ass'}, {'frequency': 'r', 'id': 388, 'synset': 'domino.n.03', 'synonyms': ['eye_mask'], 'def': 'a mask covering the upper part of the face but with holes for the eyes', 'name': 'eye_mask'}, {'frequency': 'r', 'id': 389, 'synset': 'doorbell.n.01', 'synonyms': ['doorbell', 'buzzer'], 'def': 'a button at an outer door that gives a ringing or buzzing signal when pushed', 'name': 'doorbell'}, {'frequency': 'f', 'id': 390, 'synset': 'doorknob.n.01', 'synonyms': ['doorknob', 'doorhandle'], 'def': "a knob used to open a door (often called `doorhandle' in Great Britain)", 'name': 'doorknob'}, {'frequency': 'c', 'id': 391, 'synset': 'doormat.n.02', 'synonyms': ['doormat', 'welcome_mat'], 'def': 'a mat placed outside an exterior door for wiping the shoes before entering', 'name': 'doormat'}, {'frequency': 'f', 'id': 392, 'synset': 'doughnut.n.02', 'synonyms': ['doughnut', 'donut'], 'def': 'a small ring-shaped friedcake', 'name': 'doughnut'}, {'frequency': 'r', 'id': 393, 'synset': 'dove.n.01', 'synonyms': ['dove'], 'def': 'any of numerous small pigeons', 'name': 'dove'}, {'frequency': 'r', 'id': 394, 'synset': 'dragonfly.n.01', 'synonyms': ['dragonfly'], 'def': 'slender-bodied non-stinging insect having iridescent wings that are outspread at rest', 'name': 'dragonfly'}, {'frequency': 'f', 'id': 395, 'synset': 'drawer.n.01', 'synonyms': ['drawer'], 'def': 'a boxlike container in a piece of furniture; made so as to slide in and out', 'name': 'drawer'}, {'frequency': 'c', 'id': 396, 'synset': 'drawers.n.01', 'synonyms': ['underdrawers', 'boxers', 'boxershorts'], 'def': 'underpants worn by men', 'name': 'underdrawers'}, {'frequency': 'f', 'id': 397, 'synset': 'dress.n.01', 'synonyms': ['dress', 'frock'], 'def': 'a one-piece garment for a woman; has skirt and bodice', 'name': 'dress'}, {'frequency': 'c', 'id': 398, 'synset': 'dress_hat.n.01', 'synonyms': ['dress_hat', 'high_hat', 'opera_hat', 'silk_hat', 'top_hat'], 'def': "a man's hat with a tall crown; usually covered with silk or with beaver fur", 'name': 'dress_hat'}, {'frequency': 'c', 'id': 399, 'synset': 'dress_suit.n.01', 'synonyms': ['dress_suit'], 'def': 'formalwear consisting of full evening dress for men', 'name': 'dress_suit'}, {'frequency': 'c', 'id': 400, 'synset': 'dresser.n.05', 'synonyms': ['dresser'], 'def': 'a cabinet with shelves', 'name': 'dresser'}, {'frequency': 'c', 'id': 401, 'synset': 'drill.n.01', 'synonyms': ['drill'], 'def': 'a tool with a sharp rotating point for making holes in hard materials', 'name': 'drill'}, {'frequency': 'r', 'id': 402, 'synset': 'drinking_fountain.n.01', 'synonyms': ['drinking_fountain'], 'def': 'a public fountain to provide a jet of drinking water', 'name': 'drinking_fountain'}, {'frequency': 'r', 'id': 403, 'synset': 'drone.n.04', 'synonyms': ['drone'], 'def': 'an aircraft without a pilot that is operated by remote control', 'name': 'drone'}, {'frequency': 'r', 'id': 404, 'synset': 'dropper.n.01', 'synonyms': ['dropper', 'eye_dropper'], 'def': 'pipet consisting of a small tube with a vacuum bulb at one end for drawing liquid in and releasing it a drop at a time', 'name': 'dropper'}, {'frequency': 'c', 'id': 405, 'synset': 'drum.n.01', 'synonyms': ['drum_(musical_instrument)'], 'def': 'a musical percussion instrument; usually consists of a hollow cylinder with a membrane stretched across each end', 'name': 'drum_(musical_instrument)'}, {'frequency': 'r', 'id': 406, 'synset': 'drumstick.n.02', 'synonyms': ['drumstick'], 'def': 'a stick used for playing a drum', 'name': 'drumstick'}, {'frequency': 'f', 'id': 407, 'synset': 'duck.n.01', 'synonyms': ['duck'], 'def': 'small web-footed broad-billed swimming bird', 'name': 'duck'}, {'frequency': 'r', 'id': 408, 'synset': 'duckling.n.02', 'synonyms': ['duckling'], 'def': 'young duck', 'name': 'duckling'}, {'frequency': 'c', 'id': 409, 'synset': 'duct_tape.n.01', 'synonyms': ['duct_tape'], 'def': 'a wide silvery adhesive tape', 'name': 'duct_tape'}, {'frequency': 'f', 'id': 410, 'synset': 'duffel_bag.n.01', 'synonyms': ['duffel_bag', 'duffle_bag', 'duffel', 'duffle'], 'def': 'a large cylindrical bag of heavy cloth', 'name': 'duffel_bag'}, {'frequency': 'r', 'id': 411, 'synset': 'dumbbell.n.01', 'synonyms': ['dumbbell'], 'def': 'an exercising weight with two ball-like ends connected by a short handle', 'name': 'dumbbell'}, {'frequency': 'c', 'id': 412, 'synset': 'dumpster.n.01', 'synonyms': ['dumpster'], 'def': 'a container designed to receive and transport and dump waste', 'name': 'dumpster'}, {'frequency': 'r', 'id': 413, 'synset': 'dustpan.n.02', 'synonyms': ['dustpan'], 'def': 'a short-handled receptacle into which dust can be swept', 'name': 'dustpan'}, {'frequency': 'r', 'id': 414, 'synset': 'dutch_oven.n.02', 'synonyms': ['Dutch_oven'], 'def': 'iron or earthenware cooking pot; used for stews', 'name': 'Dutch_oven'}, {'frequency': 'c', 'id': 415, 'synset': 'eagle.n.01', 'synonyms': ['eagle'], 'def': 'large birds of prey noted for their broad wings and strong soaring flight', 'name': 'eagle'}, {'frequency': 'f', 'id': 416, 'synset': 'earphone.n.01', 'synonyms': ['earphone', 'earpiece', 'headphone'], 'def': 'device for listening to audio that is held over or inserted into the ear', 'name': 'earphone'}, {'frequency': 'r', 'id': 417, 'synset': 'earplug.n.01', 'synonyms': ['earplug'], 'def': 'a soft plug that is inserted into the ear canal to block sound', 'name': 'earplug'}, {'frequency': 'f', 'id': 418, 'synset': 'earring.n.01', 'synonyms': ['earring'], 'def': 'jewelry to ornament the ear', 'name': 'earring'}, {'frequency': 'c', 'id': 419, 'synset': 'easel.n.01', 'synonyms': ['easel'], 'def': "an upright tripod for displaying something (usually an artist's canvas)", 'name': 'easel'}, {'frequency': 'r', 'id': 420, 'synset': 'eclair.n.01', 'synonyms': ['eclair'], 'def': 'oblong cream puff', 'name': 'eclair'}, {'frequency': 'r', 'id': 421, 'synset': 'eel.n.01', 'synonyms': ['eel'], 'def': 'an elongate fish with fatty flesh', 'name': 'eel'}, {'frequency': 'f', 'id': 422, 'synset': 'egg.n.02', 'synonyms': ['egg', 'eggs'], 'def': 'oval reproductive body of a fowl (especially a hen) used as food', 'name': 'egg'}, {'frequency': 'r', 'id': 423, 'synset': 'egg_roll.n.01', 'synonyms': ['egg_roll', 'spring_roll'], 'def': 'minced vegetables and meat wrapped in a pancake and fried', 'name': 'egg_roll'}, {'frequency': 'c', 'id': 424, 'synset': 'egg_yolk.n.01', 'synonyms': ['egg_yolk', 'yolk_(egg)'], 'def': 'the yellow spherical part of an egg', 'name': 'egg_yolk'}, {'frequency': 'c', 'id': 425, 'synset': 'eggbeater.n.02', 'synonyms': ['eggbeater', 'eggwhisk'], 'def': 'a mixer for beating eggs or whipping cream', 'name': 'eggbeater'}, {'frequency': 'c', 'id': 426, 'synset': 'eggplant.n.01', 'synonyms': ['eggplant', 'aubergine'], 'def': 'egg-shaped vegetable having a shiny skin typically dark purple', 'name': 'eggplant'}, {'frequency': 'r', 'id': 427, 'synset': 'electric_chair.n.01', 'synonyms': ['electric_chair'], 'def': 'a chair-shaped instrument of execution by electrocution', 'name': 'electric_chair'}, {'frequency': 'f', 'id': 428, 'synset': 'electric_refrigerator.n.01', 'synonyms': ['refrigerator'], 'def': 'a refrigerator in which the coolant is pumped around by an electric motor', 'name': 'refrigerator'}, {'frequency': 'f', 'id': 429, 'synset': 'elephant.n.01', 'synonyms': ['elephant'], 'def': 'a common elephant', 'name': 'elephant'}, {'frequency': 'r', 'id': 430, 'synset': 'elk.n.01', 'synonyms': ['elk', 'moose'], 'def': 'large northern deer with enormous flattened antlers in the male', 'name': 'elk'}, {'frequency': 'c', 'id': 431, 'synset': 'envelope.n.01', 'synonyms': ['envelope'], 'def': 'a flat (usually rectangular) container for a letter, thin package, etc.', 'name': 'envelope'}, {'frequency': 'c', 'id': 432, 'synset': 'eraser.n.01', 'synonyms': ['eraser'], 'def': 'an implement used to erase something', 'name': 'eraser'}, {'frequency': 'r', 'id': 433, 'synset': 'escargot.n.01', 'synonyms': ['escargot'], 'def': 'edible snail usually served in the shell with a sauce of melted butter and garlic', 'name': 'escargot'}, {'frequency': 'r', 'id': 434, 'synset': 'eyepatch.n.01', 'synonyms': ['eyepatch'], 'def': 'a protective cloth covering for an injured eye', 'name': 'eyepatch'}, {'frequency': 'r', 'id': 435, 'synset': 'falcon.n.01', 'synonyms': ['falcon'], 'def': 'birds of prey having long pointed powerful wings adapted for swift flight', 'name': 'falcon'}, {'frequency': 'f', 'id': 436, 'synset': 'fan.n.01', 'synonyms': ['fan'], 'def': 'a device for creating a current of air by movement of a surface or surfaces', 'name': 'fan'}, {'frequency': 'f', 'id': 437, 'synset': 'faucet.n.01', 'synonyms': ['faucet', 'spigot', 'tap'], 'def': 'a regulator for controlling the flow of a liquid from a reservoir', 'name': 'faucet'}, {'frequency': 'r', 'id': 438, 'synset': 'fedora.n.01', 'synonyms': ['fedora'], 'def': 'a hat made of felt with a creased crown', 'name': 'fedora'}, {'frequency': 'r', 'id': 439, 'synset': 'ferret.n.02', 'synonyms': ['ferret'], 'def': 'domesticated albino variety of the European polecat bred for hunting rats and rabbits', 'name': 'ferret'}, {'frequency': 'c', 'id': 440, 'synset': 'ferris_wheel.n.01', 'synonyms': ['Ferris_wheel'], 'def': 'a large wheel with suspended seats that remain upright as the wheel rotates', 'name': 'Ferris_wheel'}, {'frequency': 'r', 'id': 441, 'synset': 'ferry.n.01', 'synonyms': ['ferry', 'ferryboat'], 'def': 'a boat that transports people or vehicles across a body of water and operates on a regular schedule', 'name': 'ferry'}, {'frequency': 'r', 'id': 442, 'synset': 'fig.n.04', 'synonyms': ['fig_(fruit)'], 'def': 'fleshy sweet pear-shaped yellowish or purple fruit eaten fresh or preserved or dried', 'name': 'fig_(fruit)'}, {'frequency': 'c', 'id': 443, 'synset': 'fighter.n.02', 'synonyms': ['fighter_jet', 'fighter_aircraft', 'attack_aircraft'], 'def': 'a high-speed military or naval airplane designed to destroy enemy targets', 'name': 'fighter_jet'}, {'frequency': 'f', 'id': 444, 'synset': 'figurine.n.01', 'synonyms': ['figurine'], 'def': 'a small carved or molded figure', 'name': 'figurine'}, {'frequency': 'c', 'id': 445, 'synset': 'file.n.03', 'synonyms': ['file_cabinet', 'filing_cabinet'], 'def': 'office furniture consisting of a container for keeping papers in order', 'name': 'file_cabinet'}, {'frequency': 'r', 'id': 446, 'synset': 'file.n.04', 'synonyms': ['file_(tool)'], 'def': 'a steel hand tool with small sharp teeth on some or all of its surfaces; used for smoothing wood or metal', 'name': 'file_(tool)'}, {'frequency': 'f', 'id': 447, 'synset': 'fire_alarm.n.02', 'synonyms': ['fire_alarm', 'smoke_alarm'], 'def': 'an alarm that is tripped off by fire or smoke', 'name': 'fire_alarm'}, {'frequency': 'c', 'id': 448, 'synset': 'fire_engine.n.01', 'synonyms': ['fire_engine', 'fire_truck'], 'def': 'large trucks that carry firefighters and equipment to the site of a fire', 'name': 'fire_engine'}, {'frequency': 'c', 'id': 449, 'synset': 'fire_extinguisher.n.01', 'synonyms': ['fire_extinguisher', 'extinguisher'], 'def': 'a manually operated device for extinguishing small fires', 'name': 'fire_extinguisher'}, {'frequency': 'c', 'id': 450, 'synset': 'fire_hose.n.01', 'synonyms': ['fire_hose'], 'def': 'a large hose that carries water from a fire hydrant to the site of the fire', 'name': 'fire_hose'}, {'frequency': 'f', 'id': 451, 'synset': 'fireplace.n.01', 'synonyms': ['fireplace'], 'def': 'an open recess in a wall at the base of a chimney where a fire can be built', 'name': 'fireplace'}, {'frequency': 'f', 'id': 452, 'synset': 'fireplug.n.01', 'synonyms': ['fireplug', 'fire_hydrant', 'hydrant'], 'def': 'an upright hydrant for drawing water to use in fighting a fire', 'name': 'fireplug'}, {'frequency': 'c', 'id': 453, 'synset': 'fish.n.01', 'synonyms': ['fish'], 'def': 'any of various mostly cold-blooded aquatic vertebrates usually having scales and breathing through gills', 'name': 'fish'}, {'frequency': 'r', 'id': 454, 'synset': 'fish.n.02', 'synonyms': ['fish_(food)'], 'def': 'the flesh of fish used as food', 'name': 'fish_(food)'}, {'frequency': 'r', 'id': 455, 'synset': 'fishbowl.n.02', 'synonyms': ['fishbowl', 'goldfish_bowl'], 'def': 'a transparent bowl in which small fish are kept', 'name': 'fishbowl'}, {'frequency': 'r', 'id': 456, 'synset': 'fishing_boat.n.01', 'synonyms': ['fishing_boat', 'fishing_vessel'], 'def': 'a vessel for fishing', 'name': 'fishing_boat'}, {'frequency': 'c', 'id': 457, 'synset': 'fishing_rod.n.01', 'synonyms': ['fishing_rod', 'fishing_pole'], 'def': 'a rod that is used in fishing to extend the fishing line', 'name': 'fishing_rod'}, {'frequency': 'f', 'id': 458, 'synset': 'flag.n.01', 'synonyms': ['flag'], 'def': 'emblem usually consisting of a rectangular piece of cloth of distinctive design (do not include pole)', 'name': 'flag'}, {'frequency': 'f', 'id': 459, 'synset': 'flagpole.n.02', 'synonyms': ['flagpole', 'flagstaff'], 'def': 'a tall staff or pole on which a flag is raised', 'name': 'flagpole'}, {'frequency': 'c', 'id': 460, 'synset': 'flamingo.n.01', 'synonyms': ['flamingo'], 'def': 'large pink web-footed bird with down-bent bill', 'name': 'flamingo'}, {'frequency': 'c', 'id': 461, 'synset': 'flannel.n.01', 'synonyms': ['flannel'], 'def': 'a soft light woolen fabric; used for clothing', 'name': 'flannel'}, {'frequency': 'r', 'id': 462, 'synset': 'flash.n.10', 'synonyms': ['flash', 'flashbulb'], 'def': 'a lamp for providing momentary light to take a photograph', 'name': 'flash'}, {'frequency': 'c', 'id': 463, 'synset': 'flashlight.n.01', 'synonyms': ['flashlight', 'torch'], 'def': 'a small portable battery-powered electric lamp', 'name': 'flashlight'}, {'frequency': 'r', 'id': 464, 'synset': 'fleece.n.03', 'synonyms': ['fleece'], 'def': 'a soft bulky fabric with deep pile; used chiefly for clothing', 'name': 'fleece'}, {'frequency': 'f', 'id': 465, 'synset': 'flip-flop.n.02', 'synonyms': ['flip-flop_(sandal)'], 'def': 'a backless sandal held to the foot by a thong between two toes', 'name': 'flip-flop_(sandal)'}, {'frequency': 'c', 'id': 466, 'synset': 'flipper.n.01', 'synonyms': ['flipper_(footwear)', 'fin_(footwear)'], 'def': 'a shoe to aid a person in swimming', 'name': 'flipper_(footwear)'}, {'frequency': 'f', 'id': 467, 'synset': 'flower_arrangement.n.01', 'synonyms': ['flower_arrangement', 'floral_arrangement'], 'def': 'a decorative arrangement of flowers', 'name': 'flower_arrangement'}, {'frequency': 'c', 'id': 468, 'synset': 'flute.n.02', 'synonyms': ['flute_glass', 'champagne_flute'], 'def': 'a tall narrow wineglass', 'name': 'flute_glass'}, {'frequency': 'r', 'id': 469, 'synset': 'foal.n.01', 'synonyms': ['foal'], 'def': 'a young horse', 'name': 'foal'}, {'frequency': 'c', 'id': 470, 'synset': 'folding_chair.n.01', 'synonyms': ['folding_chair'], 'def': 'a chair that can be folded flat for storage', 'name': 'folding_chair'}, {'frequency': 'c', 'id': 471, 'synset': 'food_processor.n.01', 'synonyms': ['food_processor'], 'def': 'a kitchen appliance for shredding, blending, chopping, or slicing food', 'name': 'food_processor'}, {'frequency': 'c', 'id': 472, 'synset': 'football.n.02', 'synonyms': ['football_(American)'], 'def': 'the inflated oblong ball used in playing American football', 'name': 'football_(American)'}, {'frequency': 'r', 'id': 473, 'synset': 'football_helmet.n.01', 'synonyms': ['football_helmet'], 'def': 'a padded helmet with a face mask to protect the head of football players', 'name': 'football_helmet'}, {'frequency': 'c', 'id': 474, 'synset': 'footstool.n.01', 'synonyms': ['footstool', 'footrest'], 'def': 'a low seat or a stool to rest the feet of a seated person', 'name': 'footstool'}, {'frequency': 'f', 'id': 475, 'synset': 'fork.n.01', 'synonyms': ['fork'], 'def': 'cutlery used for serving and eating food', 'name': 'fork'}, {'frequency': 'r', 'id': 476, 'synset': 'forklift.n.01', 'synonyms': ['forklift'], 'def': 'an industrial vehicle with a power operated fork in front that can be inserted under loads to lift and move them', 'name': 'forklift'}, {'frequency': 'r', 'id': 477, 'synset': 'freight_car.n.01', 'synonyms': ['freight_car'], 'def': 'a railway car that carries freight', 'name': 'freight_car'}, {'frequency': 'r', 'id': 478, 'synset': 'french_toast.n.01', 'synonyms': ['French_toast'], 'def': 'bread slice dipped in egg and milk and fried', 'name': 'French_toast'}, {'frequency': 'c', 'id': 479, 'synset': 'freshener.n.01', 'synonyms': ['freshener', 'air_freshener'], 'def': 'anything that freshens', 'name': 'freshener'}, {'frequency': 'f', 'id': 480, 'synset': 'frisbee.n.01', 'synonyms': ['frisbee'], 'def': 'a light, plastic disk propelled with a flip of the wrist for recreation or competition', 'name': 'frisbee'}, {'frequency': 'c', 'id': 481, 'synset': 'frog.n.01', 'synonyms': ['frog', 'toad', 'toad_frog'], 'def': 'a tailless stout-bodied amphibians with long hind limbs for leaping', 'name': 'frog'}, {'frequency': 'c', 'id': 482, 'synset': 'fruit_juice.n.01', 'synonyms': ['fruit_juice'], 'def': 'drink produced by squeezing or crushing fruit', 'name': 'fruit_juice'}, {'frequency': 'r', 'id': 483, 'synset': 'fruit_salad.n.01', 'synonyms': ['fruit_salad'], 'def': 'salad composed of fruits', 'name': 'fruit_salad'}, {'frequency': 'c', 'id': 484, 'synset': 'frying_pan.n.01', 'synonyms': ['frying_pan', 'frypan', 'skillet'], 'def': 'a pan used for frying foods', 'name': 'frying_pan'}, {'frequency': 'r', 'id': 485, 'synset': 'fudge.n.01', 'synonyms': ['fudge'], 'def': 'soft creamy candy', 'name': 'fudge'}, {'frequency': 'r', 'id': 486, 'synset': 'funnel.n.02', 'synonyms': ['funnel'], 'def': 'a cone-shaped utensil used to channel a substance into a container with a small mouth', 'name': 'funnel'}, {'frequency': 'c', 'id': 487, 'synset': 'futon.n.01', 'synonyms': ['futon'], 'def': 'a pad that is used for sleeping on the floor or on a raised frame', 'name': 'futon'}, {'frequency': 'r', 'id': 488, 'synset': 'gag.n.02', 'synonyms': ['gag', 'muzzle'], 'def': "restraint put into a person's mouth to prevent speaking or shouting", 'name': 'gag'}, {'frequency': 'r', 'id': 489, 'synset': 'garbage.n.03', 'synonyms': ['garbage'], 'def': 'a receptacle where waste can be discarded', 'name': 'garbage'}, {'frequency': 'c', 'id': 490, 'synset': 'garbage_truck.n.01', 'synonyms': ['garbage_truck'], 'def': 'a truck for collecting domestic refuse', 'name': 'garbage_truck'}, {'frequency': 'c', 'id': 491, 'synset': 'garden_hose.n.01', 'synonyms': ['garden_hose'], 'def': 'a hose used for watering a lawn or garden', 'name': 'garden_hose'}, {'frequency': 'c', 'id': 492, 'synset': 'gargle.n.01', 'synonyms': ['gargle', 'mouthwash'], 'def': 'a medicated solution used for gargling and rinsing the mouth', 'name': 'gargle'}, {'frequency': 'r', 'id': 493, 'synset': 'gargoyle.n.02', 'synonyms': ['gargoyle'], 'def': 'an ornament consisting of a grotesquely carved figure of a person or animal', 'name': 'gargoyle'}, {'frequency': 'c', 'id': 494, 'synset': 'garlic.n.02', 'synonyms': ['garlic', 'ail'], 'def': 'aromatic bulb used as seasoning', 'name': 'garlic'}, {'frequency': 'r', 'id': 495, 'synset': 'gasmask.n.01', 'synonyms': ['gasmask', 'respirator', 'gas_helmet'], 'def': 'a protective face mask with a filter', 'name': 'gasmask'}, {'frequency': 'r', 'id': 496, 'synset': 'gazelle.n.01', 'synonyms': ['gazelle'], 'def': 'small swift graceful antelope of Africa and Asia having lustrous eyes', 'name': 'gazelle'}, {'frequency': 'c', 'id': 497, 'synset': 'gelatin.n.02', 'synonyms': ['gelatin', 'jelly'], 'def': 'an edible jelly made with gelatin and used as a dessert or salad base or a coating for foods', 'name': 'gelatin'}, {'frequency': 'r', 'id': 498, 'synset': 'gem.n.02', 'synonyms': ['gemstone'], 'def': 'a crystalline rock that can be cut and polished for jewelry', 'name': 'gemstone'}, {'frequency': 'c', 'id': 499, 'synset': 'giant_panda.n.01', 'synonyms': ['giant_panda', 'panda', 'panda_bear'], 'def': 'large black-and-white herbivorous mammal of bamboo forests of China and Tibet', 'name': 'giant_panda'}, {'frequency': 'c', 'id': 500, 'synset': 'gift_wrap.n.01', 'synonyms': ['gift_wrap'], 'def': 'attractive wrapping paper suitable for wrapping gifts', 'name': 'gift_wrap'}, {'frequency': 'c', 'id': 501, 'synset': 'ginger.n.03', 'synonyms': ['ginger', 'gingerroot'], 'def': 'the root of the common ginger plant; used fresh as a seasoning', 'name': 'ginger'}, {'frequency': 'f', 'id': 502, 'synset': 'giraffe.n.01', 'synonyms': ['giraffe'], 'def': 'tall animal having a spotted coat and small horns and very long neck and legs', 'name': 'giraffe'}, {'frequency': 'c', 'id': 503, 'synset': 'girdle.n.02', 'synonyms': ['cincture', 'sash', 'waistband', 'waistcloth'], 'def': 'a band of material around the waist that strengthens a skirt or trousers', 'name': 'cincture'}, {'frequency': 'f', 'id': 504, 'synset': 'glass.n.02', 'synonyms': ['glass_(drink_container)', 'drinking_glass'], 'def': 'a container for holding liquids while drinking', 'name': 'glass_(drink_container)'}, {'frequency': 'c', 'id': 505, 'synset': 'globe.n.03', 'synonyms': ['globe'], 'def': 'a sphere on which a map (especially of the earth) is represented', 'name': 'globe'}, {'frequency': 'f', 'id': 506, 'synset': 'glove.n.02', 'synonyms': ['glove'], 'def': 'handwear covering the hand', 'name': 'glove'}, {'frequency': 'c', 'id': 507, 'synset': 'goat.n.01', 'synonyms': ['goat'], 'def': 'a common goat', 'name': 'goat'}, {'frequency': 'f', 'id': 508, 'synset': 'goggles.n.01', 'synonyms': ['goggles'], 'def': 'tight-fitting spectacles worn to protect the eyes', 'name': 'goggles'}, {'frequency': 'r', 'id': 509, 'synset': 'goldfish.n.01', 'synonyms': ['goldfish'], 'def': 'small golden or orange-red freshwater fishes used as pond or aquarium pets', 'name': 'goldfish'}, {'frequency': 'r', 'id': 510, 'synset': 'golf_club.n.02', 'synonyms': ['golf_club', 'golf-club'], 'def': 'golf equipment used by a golfer to hit a golf ball', 'name': 'golf_club'}, {'frequency': 'c', 'id': 511, 'synset': 'golfcart.n.01', 'synonyms': ['golfcart'], 'def': 'a small motor vehicle in which golfers can ride between shots', 'name': 'golfcart'}, {'frequency': 'r', 'id': 512, 'synset': 'gondola.n.02', 'synonyms': ['gondola_(boat)'], 'def': 'long narrow flat-bottomed boat propelled by sculling; traditionally used on canals of Venice', 'name': 'gondola_(boat)'}, {'frequency': 'c', 'id': 513, 'synset': 'goose.n.01', 'synonyms': ['goose'], 'def': 'loud, web-footed long-necked aquatic birds usually larger than ducks', 'name': 'goose'}, {'frequency': 'r', 'id': 514, 'synset': 'gorilla.n.01', 'synonyms': ['gorilla'], 'def': 'largest ape', 'name': 'gorilla'}, {'frequency': 'r', 'id': 515, 'synset': 'gourd.n.02', 'synonyms': ['gourd'], 'def': 'any of numerous inedible fruits with hard rinds', 'name': 'gourd'}, {'frequency': 'r', 'id': 516, 'synset': 'gown.n.04', 'synonyms': ['surgical_gown', 'scrubs_(surgical_clothing)'], 'def': 'protective garment worn by surgeons during operations', 'name': 'surgical_gown'}, {'frequency': 'f', 'id': 517, 'synset': 'grape.n.01', 'synonyms': ['grape'], 'def': 'any of various juicy fruit with green or purple skins; grow in clusters', 'name': 'grape'}, {'frequency': 'r', 'id': 518, 'synset': 'grasshopper.n.01', 'synonyms': ['grasshopper'], 'def': 'plant-eating insect with hind legs adapted for leaping', 'name': 'grasshopper'}, {'frequency': 'c', 'id': 519, 'synset': 'grater.n.01', 'synonyms': ['grater'], 'def': 'utensil with sharp perforations for shredding foods (as vegetables or cheese)', 'name': 'grater'}, {'frequency': 'c', 'id': 520, 'synset': 'gravestone.n.01', 'synonyms': ['gravestone', 'headstone', 'tombstone'], 'def': 'a stone that is used to mark a grave', 'name': 'gravestone'}, {'frequency': 'r', 'id': 521, 'synset': 'gravy_boat.n.01', 'synonyms': ['gravy_boat', 'gravy_holder'], 'def': 'a dish (often boat-shaped) for serving gravy or sauce', 'name': 'gravy_boat'}, {'frequency': 'c', 'id': 522, 'synset': 'green_bean.n.02', 'synonyms': ['green_bean'], 'def': 'a common bean plant cultivated for its slender green edible pods', 'name': 'green_bean'}, {'frequency': 'c', 'id': 523, 'synset': 'green_onion.n.01', 'synonyms': ['green_onion', 'spring_onion', 'scallion'], 'def': 'a young onion before the bulb has enlarged', 'name': 'green_onion'}, {'frequency': 'r', 'id': 524, 'synset': 'griddle.n.01', 'synonyms': ['griddle'], 'def': 'cooking utensil consisting of a flat heated surface on which food is cooked', 'name': 'griddle'}, {'frequency': 'r', 'id': 525, 'synset': 'grillroom.n.01', 'synonyms': ['grillroom', 'grill_(restaurant)'], 'def': 'a restaurant where food is cooked on a grill', 'name': 'grillroom'}, {'frequency': 'r', 'id': 526, 'synset': 'grinder.n.04', 'synonyms': ['grinder_(tool)'], 'def': 'a machine tool that polishes metal', 'name': 'grinder_(tool)'}, {'frequency': 'r', 'id': 527, 'synset': 'grits.n.01', 'synonyms': ['grits', 'hominy_grits'], 'def': 'coarsely ground corn boiled as a breakfast dish', 'name': 'grits'}, {'frequency': 'c', 'id': 528, 'synset': 'grizzly.n.01', 'synonyms': ['grizzly', 'grizzly_bear'], 'def': 'powerful brownish-yellow bear of the uplands of western North America', 'name': 'grizzly'}, {'frequency': 'c', 'id': 529, 'synset': 'grocery_bag.n.01', 'synonyms': ['grocery_bag'], 'def': "a sack for holding customer's groceries", 'name': 'grocery_bag'}, {'frequency': 'r', 'id': 530, 'synset': 'guacamole.n.01', 'synonyms': ['guacamole'], 'def': 'a dip made of mashed avocado mixed with chopped onions and other seasonings', 'name': 'guacamole'}, {'frequency': 'f', 'id': 531, 'synset': 'guitar.n.01', 'synonyms': ['guitar'], 'def': 'a stringed instrument usually having six strings; played by strumming or plucking', 'name': 'guitar'}, {'frequency': 'c', 'id': 532, 'synset': 'gull.n.02', 'synonyms': ['gull', 'seagull'], 'def': 'mostly white aquatic bird having long pointed wings and short legs', 'name': 'gull'}, {'frequency': 'c', 'id': 533, 'synset': 'gun.n.01', 'synonyms': ['gun'], 'def': 'a weapon that discharges a bullet at high velocity from a metal tube', 'name': 'gun'}, {'frequency': 'r', 'id': 534, 'synset': 'hair_spray.n.01', 'synonyms': ['hair_spray'], 'def': 'substance sprayed on the hair to hold it in place', 'name': 'hair_spray'}, {'frequency': 'c', 'id': 535, 'synset': 'hairbrush.n.01', 'synonyms': ['hairbrush'], 'def': "a brush used to groom a person's hair", 'name': 'hairbrush'}, {'frequency': 'c', 'id': 536, 'synset': 'hairnet.n.01', 'synonyms': ['hairnet'], 'def': 'a small net that someone wears over their hair to keep it in place', 'name': 'hairnet'}, {'frequency': 'c', 'id': 537, 'synset': 'hairpin.n.01', 'synonyms': ['hairpin'], 'def': "a double pronged pin used to hold women's hair in place", 'name': 'hairpin'}, {'frequency': 'f', 'id': 538, 'synset': 'ham.n.01', 'synonyms': ['ham', 'jambon', 'gammon'], 'def': 'meat cut from the thigh of a hog (usually smoked)', 'name': 'ham'}, {'frequency': 'c', 'id': 539, 'synset': 'hamburger.n.01', 'synonyms': ['hamburger', 'beefburger', 'burger'], 'def': 'a sandwich consisting of a patty of minced beef served on a bun', 'name': 'hamburger'}, {'frequency': 'c', 'id': 540, 'synset': 'hammer.n.02', 'synonyms': ['hammer'], 'def': 'a hand tool with a heavy head and a handle; used to deliver an impulsive force by striking', 'name': 'hammer'}, {'frequency': 'r', 'id': 541, 'synset': 'hammock.n.02', 'synonyms': ['hammock'], 'def': 'a hanging bed of canvas or rope netting (usually suspended between two trees)', 'name': 'hammock'}, {'frequency': 'r', 'id': 542, 'synset': 'hamper.n.02', 'synonyms': ['hamper'], 'def': 'a basket usually with a cover', 'name': 'hamper'}, {'frequency': 'r', 'id': 543, 'synset': 'hamster.n.01', 'synonyms': ['hamster'], 'def': 'short-tailed burrowing rodent with large cheek pouches', 'name': 'hamster'}, {'frequency': 'c', 'id': 544, 'synset': 'hand_blower.n.01', 'synonyms': ['hair_dryer'], 'def': 'a hand-held electric blower that can blow warm air onto the hair', 'name': 'hair_dryer'}, {'frequency': 'r', 'id': 545, 'synset': 'hand_glass.n.01', 'synonyms': ['hand_glass', 'hand_mirror'], 'def': 'a mirror intended to be held in the hand', 'name': 'hand_glass'}, {'frequency': 'f', 'id': 546, 'synset': 'hand_towel.n.01', 'synonyms': ['hand_towel', 'face_towel'], 'def': 'a small towel used to dry the hands or face', 'name': 'hand_towel'}, {'frequency': 'c', 'id': 547, 'synset': 'handcart.n.01', 'synonyms': ['handcart', 'pushcart', 'hand_truck'], 'def': 'wheeled vehicle that can be pushed by a person', 'name': 'handcart'}, {'frequency': 'r', 'id': 548, 'synset': 'handcuff.n.01', 'synonyms': ['handcuff'], 'def': 'shackle that consists of a metal loop that can be locked around the wrist', 'name': 'handcuff'}, {'frequency': 'c', 'id': 549, 'synset': 'handkerchief.n.01', 'synonyms': ['handkerchief'], 'def': 'a square piece of cloth used for wiping the eyes or nose or as a costume accessory', 'name': 'handkerchief'}, {'frequency': 'f', 'id': 550, 'synset': 'handle.n.01', 'synonyms': ['handle', 'grip', 'handgrip'], 'def': 'the appendage to an object that is designed to be held in order to use or move it', 'name': 'handle'}, {'frequency': 'r', 'id': 551, 'synset': 'handsaw.n.01', 'synonyms': ['handsaw', "carpenter's_saw"], 'def': 'a saw used with one hand for cutting wood', 'name': 'handsaw'}, {'frequency': 'r', 'id': 552, 'synset': 'hardback.n.01', 'synonyms': ['hardback_book', 'hardcover_book'], 'def': 'a book with cardboard or cloth or leather covers', 'name': 'hardback_book'}, {'frequency': 'r', 'id': 553, 'synset': 'harmonium.n.01', 'synonyms': ['harmonium', 'organ_(musical_instrument)', 'reed_organ_(musical_instrument)'], 'def': 'a free-reed instrument in which air is forced through the reeds by bellows', 'name': 'harmonium'}, {'frequency': 'f', 'id': 554, 'synset': 'hat.n.01', 'synonyms': ['hat'], 'def': 'headwear that protects the head from bad weather, sun, or worn for fashion', 'name': 'hat'}, {'frequency': 'r', 'id': 555, 'synset': 'hatbox.n.01', 'synonyms': ['hatbox'], 'def': 'a round piece of luggage for carrying hats', 'name': 'hatbox'}, {'frequency': 'r', 'id': 556, 'synset': 'hatch.n.03', 'synonyms': ['hatch'], 'def': 'a movable barrier covering a hatchway', 'name': 'hatch'}, {'frequency': 'c', 'id': 557, 'synset': 'head_covering.n.01', 'synonyms': ['veil'], 'def': 'a garment that covers the head and face', 'name': 'veil'}, {'frequency': 'f', 'id': 558, 'synset': 'headband.n.01', 'synonyms': ['headband'], 'def': 'a band worn around or over the head', 'name': 'headband'}, {'frequency': 'f', 'id': 559, 'synset': 'headboard.n.01', 'synonyms': ['headboard'], 'def': 'a vertical board or panel forming the head of a bedstead', 'name': 'headboard'}, {'frequency': 'f', 'id': 560, 'synset': 'headlight.n.01', 'synonyms': ['headlight', 'headlamp'], 'def': 'a powerful light with reflector; attached to the front of an automobile or locomotive', 'name': 'headlight'}, {'frequency': 'c', 'id': 561, 'synset': 'headscarf.n.01', 'synonyms': ['headscarf'], 'def': 'a kerchief worn over the head and tied under the chin', 'name': 'headscarf'}, {'frequency': 'r', 'id': 562, 'synset': 'headset.n.01', 'synonyms': ['headset'], 'def': 'receiver consisting of a pair of headphones', 'name': 'headset'}, {'frequency': 'c', 'id': 563, 'synset': 'headstall.n.01', 'synonyms': ['headstall_(for_horses)', 'headpiece_(for_horses)'], 'def': "the band that is the part of a bridle that fits around a horse's head", 'name': 'headstall_(for_horses)'}, {'frequency': 'r', 'id': 564, 'synset': 'hearing_aid.n.02', 'synonyms': ['hearing_aid'], 'def': 'an acoustic device used to direct sound to the ear of a hearing-impaired person', 'name': 'hearing_aid'}, {'frequency': 'c', 'id': 565, 'synset': 'heart.n.02', 'synonyms': ['heart'], 'def': 'a muscular organ; its contractions move the blood through the body', 'name': 'heart'}, {'frequency': 'c', 'id': 566, 'synset': 'heater.n.01', 'synonyms': ['heater', 'warmer'], 'def': 'device that heats water or supplies warmth to a room', 'name': 'heater'}, {'frequency': 'c', 'id': 567, 'synset': 'helicopter.n.01', 'synonyms': ['helicopter'], 'def': 'an aircraft without wings that obtains its lift from the rotation of overhead blades', 'name': 'helicopter'}, {'frequency': 'f', 'id': 568, 'synset': 'helmet.n.02', 'synonyms': ['helmet'], 'def': 'a protective headgear made of hard material to resist blows', 'name': 'helmet'}, {'frequency': 'r', 'id': 569, 'synset': 'heron.n.02', 'synonyms': ['heron'], 'def': 'grey or white wading bird with long neck and long legs and (usually) long bill', 'name': 'heron'}, {'frequency': 'c', 'id': 570, 'synset': 'highchair.n.01', 'synonyms': ['highchair', 'feeding_chair'], 'def': 'a chair for feeding a very young child', 'name': 'highchair'}, {'frequency': 'f', 'id': 571, 'synset': 'hinge.n.01', 'synonyms': ['hinge'], 'def': 'a joint that holds two parts together so that one can swing relative to the other', 'name': 'hinge'}, {'frequency': 'r', 'id': 572, 'synset': 'hippopotamus.n.01', 'synonyms': ['hippopotamus'], 'def': 'massive thick-skinned animal living in or around rivers of tropical Africa', 'name': 'hippopotamus'}, {'frequency': 'r', 'id': 573, 'synset': 'hockey_stick.n.01', 'synonyms': ['hockey_stick'], 'def': 'sports implement consisting of a stick used by hockey players to move the puck', 'name': 'hockey_stick'}, {'frequency': 'c', 'id': 574, 'synset': 'hog.n.03', 'synonyms': ['hog', 'pig'], 'def': 'domestic swine', 'name': 'hog'}, {'frequency': 'f', 'id': 575, 'synset': 'home_plate.n.01', 'synonyms': ['home_plate_(baseball)', 'home_base_(baseball)'], 'def': '(baseball) a rubber slab where the batter stands; it must be touched by a base runner in order to score', 'name': 'home_plate_(baseball)'}, {'frequency': 'c', 'id': 576, 'synset': 'honey.n.01', 'synonyms': ['honey'], 'def': 'a sweet yellow liquid produced by bees', 'name': 'honey'}, {'frequency': 'f', 'id': 577, 'synset': 'hood.n.06', 'synonyms': ['fume_hood', 'exhaust_hood'], 'def': 'metal covering leading to a vent that exhausts smoke or fumes', 'name': 'fume_hood'}, {'frequency': 'f', 'id': 578, 'synset': 'hook.n.05', 'synonyms': ['hook'], 'def': 'a curved or bent implement for suspending or pulling something', 'name': 'hook'}, {'frequency': 'f', 'id': 579, 'synset': 'horse.n.01', 'synonyms': ['horse'], 'def': 'a common horse', 'name': 'horse'}, {'frequency': 'f', 'id': 580, 'synset': 'hose.n.03', 'synonyms': ['hose', 'hosepipe'], 'def': 'a flexible pipe for conveying a liquid or gas', 'name': 'hose'}, {'frequency': 'r', 'id': 581, 'synset': 'hot-air_balloon.n.01', 'synonyms': ['hot-air_balloon'], 'def': 'balloon for travel through the air in a basket suspended below a large bag of heated air', 'name': 'hot-air_balloon'}, {'frequency': 'r', 'id': 582, 'synset': 'hot_plate.n.01', 'synonyms': ['hotplate'], 'def': 'a portable electric appliance for heating or cooking or keeping food warm', 'name': 'hotplate'}, {'frequency': 'c', 'id': 583, 'synset': 'hot_sauce.n.01', 'synonyms': ['hot_sauce'], 'def': 'a pungent peppery sauce', 'name': 'hot_sauce'}, {'frequency': 'r', 'id': 584, 'synset': 'hourglass.n.01', 'synonyms': ['hourglass'], 'def': 'a sandglass timer that runs for sixty minutes', 'name': 'hourglass'}, {'frequency': 'r', 'id': 585, 'synset': 'houseboat.n.01', 'synonyms': ['houseboat'], 'def': 'a barge that is designed and equipped for use as a dwelling', 'name': 'houseboat'}, {'frequency': 'r', 'id': 586, 'synset': 'hummingbird.n.01', 'synonyms': ['hummingbird'], 'def': 'tiny American bird having brilliant iridescent plumage and long slender bills', 'name': 'hummingbird'}, {'frequency': 'r', 'id': 587, 'synset': 'hummus.n.01', 'synonyms': ['hummus', 'humus', 'hommos', 'hoummos', 'humous'], 'def': 'a thick spread made from mashed chickpeas', 'name': 'hummus'}, {'frequency': 'c', 'id': 588, 'synset': 'ice_bear.n.01', 'synonyms': ['polar_bear'], 'def': 'white bear of Arctic regions', 'name': 'polar_bear'}, {'frequency': 'c', 'id': 589, 'synset': 'ice_cream.n.01', 'synonyms': ['icecream'], 'def': 'frozen dessert containing cream and sugar and flavoring', 'name': 'icecream'}, {'frequency': 'r', 'id': 590, 'synset': 'ice_lolly.n.01', 'synonyms': ['popsicle'], 'def': 'ice cream or water ice on a small wooden stick', 'name': 'popsicle'}, {'frequency': 'c', 'id': 591, 'synset': 'ice_maker.n.01', 'synonyms': ['ice_maker'], 'def': 'an appliance included in some electric refrigerators for making ice cubes', 'name': 'ice_maker'}, {'frequency': 'r', 'id': 592, 'synset': 'ice_pack.n.01', 'synonyms': ['ice_pack', 'ice_bag'], 'def': 'a waterproof bag filled with ice: applied to the body (especially the head) to cool or reduce swelling', 'name': 'ice_pack'}, {'frequency': 'r', 'id': 593, 'synset': 'ice_skate.n.01', 'synonyms': ['ice_skate'], 'def': 'skate consisting of a boot with a steel blade fitted to the sole', 'name': 'ice_skate'}, {'frequency': 'r', 'id': 594, 'synset': 'ice_tea.n.01', 'synonyms': ['ice_tea', 'iced_tea'], 'def': 'strong tea served over ice', 'name': 'ice_tea'}, {'frequency': 'c', 'id': 595, 'synset': 'igniter.n.01', 'synonyms': ['igniter', 'ignitor', 'lighter'], 'def': 'a substance or device used to start a fire', 'name': 'igniter'}, {'frequency': 'r', 'id': 596, 'synset': 'incense.n.01', 'synonyms': ['incense'], 'def': 'a substance that produces a fragrant odor when burned', 'name': 'incense'}, {'frequency': 'r', 'id': 597, 'synset': 'inhaler.n.01', 'synonyms': ['inhaler', 'inhalator'], 'def': 'a dispenser that produces a chemical vapor to be inhaled through mouth or nose', 'name': 'inhaler'}, {'frequency': 'c', 'id': 598, 'synset': 'ipod.n.01', 'synonyms': ['iPod'], 'def': 'a pocket-sized device used to play music files', 'name': 'iPod'}, {'frequency': 'c', 'id': 599, 'synset': 'iron.n.04', 'synonyms': ['iron_(for_clothing)', 'smoothing_iron_(for_clothing)'], 'def': 'home appliance consisting of a flat metal base that is heated and used to smooth cloth', 'name': 'iron_(for_clothing)'}, {'frequency': 'r', 'id': 600, 'synset': 'ironing_board.n.01', 'synonyms': ['ironing_board'], 'def': 'narrow padded board on collapsible supports; used for ironing clothes', 'name': 'ironing_board'}, {'frequency': 'f', 'id': 601, 'synset': 'jacket.n.01', 'synonyms': ['jacket'], 'def': 'a waist-length coat', 'name': 'jacket'}, {'frequency': 'r', 'id': 602, 'synset': 'jam.n.01', 'synonyms': ['jam'], 'def': 'preserve of crushed fruit', 'name': 'jam'}, {'frequency': 'f', 'id': 603, 'synset': 'jean.n.01', 'synonyms': ['jean', 'blue_jean', 'denim'], 'def': '(usually plural) close-fitting trousers of heavy denim for manual work or casual wear', 'name': 'jean'}, {'frequency': 'c', 'id': 604, 'synset': 'jeep.n.01', 'synonyms': ['jeep', 'landrover'], 'def': 'a car suitable for traveling over rough terrain', 'name': 'jeep'}, {'frequency': 'r', 'id': 605, 'synset': 'jelly_bean.n.01', 'synonyms': ['jelly_bean', 'jelly_egg'], 'def': 'sugar-glazed jellied candy', 'name': 'jelly_bean'}, {'frequency': 'f', 'id': 606, 'synset': 'jersey.n.03', 'synonyms': ['jersey', 'T-shirt', 'tee_shirt'], 'def': 'a close-fitting pullover shirt', 'name': 'jersey'}, {'frequency': 'c', 'id': 607, 'synset': 'jet.n.01', 'synonyms': ['jet_plane', 'jet-propelled_plane'], 'def': 'an airplane powered by one or more jet engines', 'name': 'jet_plane'}, {'frequency': 'c', 'id': 608, 'synset': 'jewelry.n.01', 'synonyms': ['jewelry', 'jewellery'], 'def': 'an adornment (as a bracelet or ring or necklace) made of precious metals and set with gems (or imitation gems)', 'name': 'jewelry'}, {'frequency': 'r', 'id': 609, 'synset': 'joystick.n.02', 'synonyms': ['joystick'], 'def': 'a control device for computers consisting of a vertical handle that can move freely in two directions', 'name': 'joystick'}, {'frequency': 'r', 'id': 610, 'synset': 'jump_suit.n.01', 'synonyms': ['jumpsuit'], 'def': "one-piece garment fashioned after a parachutist's uniform", 'name': 'jumpsuit'}, {'frequency': 'c', 'id': 611, 'synset': 'kayak.n.01', 'synonyms': ['kayak'], 'def': 'a small canoe consisting of a light frame made watertight with animal skins', 'name': 'kayak'}, {'frequency': 'r', 'id': 612, 'synset': 'keg.n.02', 'synonyms': ['keg'], 'def': 'small cask or barrel', 'name': 'keg'}, {'frequency': 'r', 'id': 613, 'synset': 'kennel.n.01', 'synonyms': ['kennel', 'doghouse'], 'def': 'outbuilding that serves as a shelter for a dog', 'name': 'kennel'}, {'frequency': 'c', 'id': 614, 'synset': 'kettle.n.01', 'synonyms': ['kettle', 'boiler'], 'def': 'a metal pot for stewing or boiling; usually has a lid', 'name': 'kettle'}, {'frequency': 'f', 'id': 615, 'synset': 'key.n.01', 'synonyms': ['key'], 'def': 'metal instrument used to unlock a lock', 'name': 'key'}, {'frequency': 'r', 'id': 616, 'synset': 'keycard.n.01', 'synonyms': ['keycard'], 'def': 'a plastic card used to gain access typically to a door', 'name': 'keycard'}, {'frequency': 'r', 'id': 617, 'synset': 'kilt.n.01', 'synonyms': ['kilt'], 'def': 'a knee-length pleated tartan skirt worn by men as part of the traditional dress in the Highlands of northern Scotland', 'name': 'kilt'}, {'frequency': 'c', 'id': 618, 'synset': 'kimono.n.01', 'synonyms': ['kimono'], 'def': 'a loose robe; imitated from robes originally worn by Japanese', 'name': 'kimono'}, {'frequency': 'f', 'id': 619, 'synset': 'kitchen_sink.n.01', 'synonyms': ['kitchen_sink'], 'def': 'a sink in a kitchen', 'name': 'kitchen_sink'}, {'frequency': 'c', 'id': 620, 'synset': 'kitchen_table.n.01', 'synonyms': ['kitchen_table'], 'def': 'a table in the kitchen', 'name': 'kitchen_table'}, {'frequency': 'f', 'id': 621, 'synset': 'kite.n.03', 'synonyms': ['kite'], 'def': 'plaything consisting of a light frame covered with tissue paper; flown in wind at end of a string', 'name': 'kite'}, {'frequency': 'c', 'id': 622, 'synset': 'kitten.n.01', 'synonyms': ['kitten', 'kitty'], 'def': 'young domestic cat', 'name': 'kitten'}, {'frequency': 'c', 'id': 623, 'synset': 'kiwi.n.03', 'synonyms': ['kiwi_fruit'], 'def': 'fuzzy brown egg-shaped fruit with slightly tart green flesh', 'name': 'kiwi_fruit'}, {'frequency': 'f', 'id': 624, 'synset': 'knee_pad.n.01', 'synonyms': ['knee_pad'], 'def': 'protective garment consisting of a pad worn by football or baseball or hockey players', 'name': 'knee_pad'}, {'frequency': 'f', 'id': 625, 'synset': 'knife.n.01', 'synonyms': ['knife'], 'def': 'tool with a blade and point used as a cutting instrument', 'name': 'knife'}, {'frequency': 'r', 'id': 626, 'synset': 'knight.n.02', 'synonyms': ['knight_(chess_piece)', 'horse_(chess_piece)'], 'def': 'a chess game piece shaped to resemble the head of a horse', 'name': 'knight_(chess_piece)'}, {'frequency': 'r', 'id': 627, 'synset': 'knitting_needle.n.01', 'synonyms': ['knitting_needle'], 'def': 'needle consisting of a slender rod with pointed ends; usually used in pairs', 'name': 'knitting_needle'}, {'frequency': 'f', 'id': 628, 'synset': 'knob.n.02', 'synonyms': ['knob'], 'def': 'a round handle often found on a door', 'name': 'knob'}, {'frequency': 'r', 'id': 629, 'synset': 'knocker.n.05', 'synonyms': ['knocker_(on_a_door)', 'doorknocker'], 'def': 'a device (usually metal and ornamental) attached by a hinge to a door', 'name': 'knocker_(on_a_door)'}, {'frequency': 'r', 'id': 630, 'synset': 'koala.n.01', 'synonyms': ['koala', 'koala_bear'], 'def': 'sluggish tailless Australian marsupial with grey furry ears and coat', 'name': 'koala'}, {'frequency': 'r', 'id': 631, 'synset': 'lab_coat.n.01', 'synonyms': ['lab_coat', 'laboratory_coat'], 'def': 'a light coat worn to protect clothing from substances used while working in a laboratory', 'name': 'lab_coat'}, {'frequency': 'f', 'id': 632, 'synset': 'ladder.n.01', 'synonyms': ['ladder'], 'def': 'steps consisting of two parallel members connected by rungs', 'name': 'ladder'}, {'frequency': 'c', 'id': 633, 'synset': 'ladle.n.01', 'synonyms': ['ladle'], 'def': 'a spoon-shaped vessel with a long handle frequently used to transfer liquids', 'name': 'ladle'}, {'frequency': 'r', 'id': 634, 'synset': 'ladybug.n.01', 'synonyms': ['ladybug', 'ladybeetle', 'ladybird_beetle'], 'def': 'small round bright-colored and spotted beetle, typically red and black', 'name': 'ladybug'}, {'frequency': 'c', 'id': 635, 'synset': 'lamb.n.01', 'synonyms': ['lamb_(animal)'], 'def': 'young sheep', 'name': 'lamb_(animal)'}, {'frequency': 'r', 'id': 636, 'synset': 'lamb_chop.n.01', 'synonyms': ['lamb-chop', 'lambchop'], 'def': 'chop cut from a lamb', 'name': 'lamb-chop'}, {'frequency': 'f', 'id': 637, 'synset': 'lamp.n.02', 'synonyms': ['lamp'], 'def': 'a piece of furniture holding one or more electric light bulbs', 'name': 'lamp'}, {'frequency': 'f', 'id': 638, 'synset': 'lamppost.n.01', 'synonyms': ['lamppost'], 'def': 'a metal post supporting an outdoor lamp (such as a streetlight)', 'name': 'lamppost'}, {'frequency': 'f', 'id': 639, 'synset': 'lampshade.n.01', 'synonyms': ['lampshade'], 'def': 'a protective ornamental shade used to screen a light bulb from direct view', 'name': 'lampshade'}, {'frequency': 'c', 'id': 640, 'synset': 'lantern.n.01', 'synonyms': ['lantern'], 'def': 'light in a transparent protective case', 'name': 'lantern'}, {'frequency': 'f', 'id': 641, 'synset': 'lanyard.n.02', 'synonyms': ['lanyard', 'laniard'], 'def': 'a cord worn around the neck to hold a knife or whistle, etc.', 'name': 'lanyard'}, {'frequency': 'f', 'id': 642, 'synset': 'laptop.n.01', 'synonyms': ['laptop_computer', 'notebook_computer'], 'def': 'a portable computer small enough to use in your lap', 'name': 'laptop_computer'}, {'frequency': 'r', 'id': 643, 'synset': 'lasagna.n.01', 'synonyms': ['lasagna', 'lasagne'], 'def': 'baked dish of layers of lasagna pasta with sauce and cheese and meat or vegetables', 'name': 'lasagna'}, {'frequency': 'c', 'id': 644, 'synset': 'latch.n.02', 'synonyms': ['latch'], 'def': 'a bar that can be lowered or slid into a groove to fasten a door or gate', 'name': 'latch'}, {'frequency': 'r', 'id': 645, 'synset': 'lawn_mower.n.01', 'synonyms': ['lawn_mower'], 'def': 'garden tool for mowing grass on lawns', 'name': 'lawn_mower'}, {'frequency': 'r', 'id': 646, 'synset': 'leather.n.01', 'synonyms': ['leather'], 'def': 'an animal skin made smooth and flexible by removing the hair and then tanning', 'name': 'leather'}, {'frequency': 'c', 'id': 647, 'synset': 'legging.n.01', 'synonyms': ['legging_(clothing)', 'leging_(clothing)', 'leg_covering'], 'def': 'a garment covering the leg (usually extending from the knee to the ankle)', 'name': 'legging_(clothing)'}, {'frequency': 'c', 'id': 648, 'synset': 'lego.n.01', 'synonyms': ['Lego', 'Lego_set'], 'def': "a child's plastic construction set for making models from blocks", 'name': 'Lego'}, {'frequency': 'f', 'id': 649, 'synset': 'lemon.n.01', 'synonyms': ['lemon'], 'def': 'yellow oval fruit with juicy acidic flesh', 'name': 'lemon'}, {'frequency': 'r', 'id': 650, 'synset': 'lemonade.n.01', 'synonyms': ['lemonade'], 'def': 'sweetened beverage of diluted lemon juice', 'name': 'lemonade'}, {'frequency': 'f', 'id': 651, 'synset': 'lettuce.n.02', 'synonyms': ['lettuce'], 'def': 'leafy plant commonly eaten in salad or on sandwiches', 'name': 'lettuce'}, {'frequency': 'f', 'id': 652, 'synset': 'license_plate.n.01', 'synonyms': ['license_plate', 'numberplate'], 'def': "a plate mounted on the front and back of car and bearing the car's registration number", 'name': 'license_plate'}, {'frequency': 'f', 'id': 653, 'synset': 'life_buoy.n.01', 'synonyms': ['life_buoy', 'lifesaver', 'life_belt', 'life_ring'], 'def': 'a ring-shaped life preserver used to prevent drowning (NOT a life-jacket or vest)', 'name': 'life_buoy'}, {'frequency': 'f', 'id': 654, 'synset': 'life_jacket.n.01', 'synonyms': ['life_jacket', 'life_vest'], 'def': 'life preserver consisting of a sleeveless jacket of buoyant or inflatable design', 'name': 'life_jacket'}, {'frequency': 'f', 'id': 655, 'synset': 'light_bulb.n.01', 'synonyms': ['lightbulb'], 'def': 'glass bulb or tube shaped electric device that emits light (DO NOT MARK LAMPS AS A WHOLE)', 'name': 'lightbulb'}, {'frequency': 'r', 'id': 656, 'synset': 'lightning_rod.n.02', 'synonyms': ['lightning_rod', 'lightning_conductor'], 'def': 'a metallic conductor that is attached to a high point and leads to the ground', 'name': 'lightning_rod'}, {'frequency': 'c', 'id': 657, 'synset': 'lime.n.06', 'synonyms': ['lime'], 'def': 'the green acidic fruit of any of various lime trees', 'name': 'lime'}, {'frequency': 'r', 'id': 658, 'synset': 'limousine.n.01', 'synonyms': ['limousine'], 'def': 'long luxurious car; usually driven by a chauffeur', 'name': 'limousine'}, {'frequency': 'r', 'id': 659, 'synset': 'linen.n.02', 'synonyms': ['linen_paper'], 'def': 'a high-quality paper made of linen fibers or with a linen finish', 'name': 'linen_paper'}, {'frequency': 'c', 'id': 660, 'synset': 'lion.n.01', 'synonyms': ['lion'], 'def': 'large gregarious predatory cat of Africa and India', 'name': 'lion'}, {'frequency': 'c', 'id': 661, 'synset': 'lip_balm.n.01', 'synonyms': ['lip_balm'], 'def': 'a balm applied to the lips', 'name': 'lip_balm'}, {'frequency': 'c', 'id': 662, 'synset': 'lipstick.n.01', 'synonyms': ['lipstick', 'lip_rouge'], 'def': 'makeup that is used to color the lips', 'name': 'lipstick'}, {'frequency': 'r', 'id': 663, 'synset': 'liquor.n.01', 'synonyms': ['liquor', 'spirits', 'hard_liquor', 'liqueur', 'cordial'], 'def': 'an alcoholic beverage that is distilled rather than fermented', 'name': 'liquor'}, {'frequency': 'r', 'id': 664, 'synset': 'lizard.n.01', 'synonyms': ['lizard'], 'def': 'a reptile with usually two pairs of legs and a tapering tail', 'name': 'lizard'}, {'frequency': 'r', 'id': 665, 'synset': 'loafer.n.02', 'synonyms': ['Loafer_(type_of_shoe)'], 'def': 'a low leather step-in shoe', 'name': 'Loafer_(type_of_shoe)'}, {'frequency': 'f', 'id': 666, 'synset': 'log.n.01', 'synonyms': ['log'], 'def': 'a segment of the trunk of a tree when stripped of branches', 'name': 'log'}, {'frequency': 'c', 'id': 667, 'synset': 'lollipop.n.02', 'synonyms': ['lollipop'], 'def': 'hard candy on a stick', 'name': 'lollipop'}, {'frequency': 'c', 'id': 668, 'synset': 'lotion.n.01', 'synonyms': ['lotion'], 'def': 'any of various cosmetic preparations that are applied to the skin', 'name': 'lotion'}, {'frequency': 'f', 'id': 669, 'synset': 'loudspeaker.n.01', 'synonyms': ['speaker_(stero_equipment)'], 'def': 'electronic device that produces sound often as part of a stereo system', 'name': 'speaker_(stero_equipment)'}, {'frequency': 'c', 'id': 670, 'synset': 'love_seat.n.01', 'synonyms': ['loveseat'], 'def': 'small sofa that seats two people', 'name': 'loveseat'}, {'frequency': 'r', 'id': 671, 'synset': 'machine_gun.n.01', 'synonyms': ['machine_gun'], 'def': 'a rapidly firing automatic gun', 'name': 'machine_gun'}, {'frequency': 'f', 'id': 672, 'synset': 'magazine.n.02', 'synonyms': ['magazine'], 'def': 'a paperback periodic publication', 'name': 'magazine'}, {'frequency': 'f', 'id': 673, 'synset': 'magnet.n.01', 'synonyms': ['magnet'], 'def': 'a device that attracts iron and produces a magnetic field', 'name': 'magnet'}, {'frequency': 'r', 'id': 674, 'synset': 'mail_slot.n.01', 'synonyms': ['mail_slot'], 'def': 'a slot (usually in a door) through which mail can be delivered', 'name': 'mail_slot'}, {'frequency': 'c', 'id': 675, 'synset': 'mailbox.n.01', 'synonyms': ['mailbox_(at_home)', 'letter_box_(at_home)'], 'def': 'a private box for delivery of mail', 'name': 'mailbox_(at_home)'}, {'frequency': 'r', 'id': 676, 'synset': 'mallet.n.01', 'synonyms': ['mallet'], 'def': 'a sports implement with a long handle and a hammer-like head used to hit a ball', 'name': 'mallet'}, {'frequency': 'r', 'id': 677, 'synset': 'mammoth.n.01', 'synonyms': ['mammoth'], 'def': 'any of numerous extinct elephants widely distributed in the Pleistocene', 'name': 'mammoth'}, {'frequency': 'c', 'id': 678, 'synset': 'mandarin.n.05', 'synonyms': ['mandarin_orange'], 'def': 'a somewhat flat reddish-orange loose skinned citrus of China', 'name': 'mandarin_orange'}, {'frequency': 'c', 'id': 679, 'synset': 'manger.n.01', 'synonyms': ['manger', 'trough'], 'def': 'a container (usually in a barn or stable) from which cattle or horses feed', 'name': 'manger'}, {'frequency': 'f', 'id': 680, 'synset': 'manhole.n.01', 'synonyms': ['manhole'], 'def': 'a hole (usually with a flush cover) through which a person can gain access to an underground structure', 'name': 'manhole'}, {'frequency': 'c', 'id': 681, 'synset': 'map.n.01', 'synonyms': ['map'], 'def': "a diagrammatic representation of the earth's surface (or part of it)", 'name': 'map'}, {'frequency': 'c', 'id': 682, 'synset': 'marker.n.03', 'synonyms': ['marker'], 'def': 'a writing implement for making a mark', 'name': 'marker'}, {'frequency': 'r', 'id': 683, 'synset': 'martini.n.01', 'synonyms': ['martini'], 'def': 'a cocktail made of gin (or vodka) with dry vermouth', 'name': 'martini'}, {'frequency': 'r', 'id': 684, 'synset': 'mascot.n.01', 'synonyms': ['mascot'], 'def': 'a person or animal that is adopted by a team or other group as a symbolic figure', 'name': 'mascot'}, {'frequency': 'c', 'id': 685, 'synset': 'mashed_potato.n.01', 'synonyms': ['mashed_potato'], 'def': 'potato that has been peeled and boiled and then mashed', 'name': 'mashed_potato'}, {'frequency': 'r', 'id': 686, 'synset': 'masher.n.02', 'synonyms': ['masher'], 'def': 'a kitchen utensil used for mashing (e.g. potatoes)', 'name': 'masher'}, {'frequency': 'f', 'id': 687, 'synset': 'mask.n.04', 'synonyms': ['mask', 'facemask'], 'def': 'a protective covering worn over the face', 'name': 'mask'}, {'frequency': 'f', 'id': 688, 'synset': 'mast.n.01', 'synonyms': ['mast'], 'def': 'a vertical spar for supporting sails', 'name': 'mast'}, {'frequency': 'c', 'id': 689, 'synset': 'mat.n.03', 'synonyms': ['mat_(gym_equipment)', 'gym_mat'], 'def': 'sports equipment consisting of a piece of thick padding on the floor for gymnastics', 'name': 'mat_(gym_equipment)'}, {'frequency': 'r', 'id': 690, 'synset': 'matchbox.n.01', 'synonyms': ['matchbox'], 'def': 'a box for holding matches', 'name': 'matchbox'}, {'frequency': 'f', 'id': 691, 'synset': 'mattress.n.01', 'synonyms': ['mattress'], 'def': 'a thick pad filled with resilient material used as a bed or part of a bed', 'name': 'mattress'}, {'frequency': 'c', 'id': 692, 'synset': 'measuring_cup.n.01', 'synonyms': ['measuring_cup'], 'def': 'graduated cup used to measure liquid or granular ingredients', 'name': 'measuring_cup'}, {'frequency': 'c', 'id': 693, 'synset': 'measuring_stick.n.01', 'synonyms': ['measuring_stick', 'ruler_(measuring_stick)', 'measuring_rod'], 'def': 'measuring instrument having a sequence of marks at regular intervals', 'name': 'measuring_stick'}, {'frequency': 'c', 'id': 694, 'synset': 'meatball.n.01', 'synonyms': ['meatball'], 'def': 'ground meat formed into a ball and fried or simmered in broth', 'name': 'meatball'}, {'frequency': 'c', 'id': 695, 'synset': 'medicine.n.02', 'synonyms': ['medicine'], 'def': 'something that treats or prevents or alleviates the symptoms of disease', 'name': 'medicine'}, {'frequency': 'r', 'id': 696, 'synset': 'melon.n.01', 'synonyms': ['melon'], 'def': 'fruit of the gourd family having a hard rind and sweet juicy flesh', 'name': 'melon'}, {'frequency': 'f', 'id': 697, 'synset': 'microphone.n.01', 'synonyms': ['microphone'], 'def': 'device for converting sound waves into electrical energy', 'name': 'microphone'}, {'frequency': 'r', 'id': 698, 'synset': 'microscope.n.01', 'synonyms': ['microscope'], 'def': 'magnifier of the image of small objects', 'name': 'microscope'}, {'frequency': 'f', 'id': 699, 'synset': 'microwave.n.02', 'synonyms': ['microwave_oven'], 'def': 'kitchen appliance that cooks food by passing an electromagnetic wave through it', 'name': 'microwave_oven'}, {'frequency': 'r', 'id': 700, 'synset': 'milestone.n.01', 'synonyms': ['milestone', 'milepost'], 'def': 'stone post at side of a road to show distances', 'name': 'milestone'}, {'frequency': 'c', 'id': 701, 'synset': 'milk.n.01', 'synonyms': ['milk'], 'def': 'a white nutritious liquid secreted by mammals and used as food by human beings', 'name': 'milk'}, {'frequency': 'f', 'id': 702, 'synset': 'minivan.n.01', 'synonyms': ['minivan'], 'def': 'a small box-shaped passenger van', 'name': 'minivan'}, {'frequency': 'r', 'id': 703, 'synset': 'mint.n.05', 'synonyms': ['mint_candy'], 'def': 'a candy that is flavored with a mint oil', 'name': 'mint_candy'}, {'frequency': 'f', 'id': 704, 'synset': 'mirror.n.01', 'synonyms': ['mirror'], 'def': 'polished surface that forms images by reflecting light', 'name': 'mirror'}, {'frequency': 'c', 'id': 705, 'synset': 'mitten.n.01', 'synonyms': ['mitten'], 'def': 'glove that encases the thumb separately and the other four fingers together', 'name': 'mitten'}, {'frequency': 'c', 'id': 706, 'synset': 'mixer.n.04', 'synonyms': ['mixer_(kitchen_tool)', 'stand_mixer'], 'def': 'a kitchen utensil that is used for mixing foods', 'name': 'mixer_(kitchen_tool)'}, {'frequency': 'c', 'id': 707, 'synset': 'money.n.03', 'synonyms': ['money'], 'def': 'the official currency issued by a government or national bank', 'name': 'money'}, {'frequency': 'f', 'id': 708, 'synset': 'monitor.n.04', 'synonyms': ['monitor_(computer_equipment) computer_monitor'], 'def': 'a computer monitor', 'name': 'monitor_(computer_equipment) computer_monitor'}, {'frequency': 'c', 'id': 709, 'synset': 'monkey.n.01', 'synonyms': ['monkey'], 'def': 'any of various long-tailed primates', 'name': 'monkey'}, {'frequency': 'f', 'id': 710, 'synset': 'motor.n.01', 'synonyms': ['motor'], 'def': 'machine that converts other forms of energy into mechanical energy and so imparts motion', 'name': 'motor'}, {'frequency': 'f', 'id': 711, 'synset': 'motor_scooter.n.01', 'synonyms': ['motor_scooter', 'scooter'], 'def': 'a wheeled vehicle with small wheels and a low-powered engine', 'name': 'motor_scooter'}, {'frequency': 'r', 'id': 712, 'synset': 'motor_vehicle.n.01', 'synonyms': ['motor_vehicle', 'automotive_vehicle'], 'def': 'a self-propelled wheeled vehicle that does not run on rails', 'name': 'motor_vehicle'}, {'frequency': 'r', 'id': 713, 'synset': 'motorboat.n.01', 'synonyms': ['motorboat', 'powerboat'], 'def': 'a boat propelled by an internal-combustion engine', 'name': 'motorboat'}, {'frequency': 'f', 'id': 714, 'synset': 'motorcycle.n.01', 'synonyms': ['motorcycle'], 'def': 'a motor vehicle with two wheels and a strong frame', 'name': 'motorcycle'}, {'frequency': 'f', 'id': 715, 'synset': 'mound.n.01', 'synonyms': ['mound_(baseball)', "pitcher's_mound"], 'def': '(baseball) the slight elevation on which the pitcher stands', 'name': 'mound_(baseball)'}, {'frequency': 'r', 'id': 716, 'synset': 'mouse.n.01', 'synonyms': ['mouse_(animal_rodent)'], 'def': 'a small rodent with pointed snouts and small ears on elongated bodies with slender usually hairless tails', 'name': 'mouse_(animal_rodent)'}, {'frequency': 'f', 'id': 717, 'synset': 'mouse.n.04', 'synonyms': ['mouse_(computer_equipment)', 'computer_mouse'], 'def': 'a computer input device that controls an on-screen pointer', 'name': 'mouse_(computer_equipment)'}, {'frequency': 'f', 'id': 718, 'synset': 'mousepad.n.01', 'synonyms': ['mousepad'], 'def': 'a small portable pad that provides an operating surface for a computer mouse', 'name': 'mousepad'}, {'frequency': 'c', 'id': 719, 'synset': 'muffin.n.01', 'synonyms': ['muffin'], 'def': 'a sweet quick bread baked in a cup-shaped pan', 'name': 'muffin'}, {'frequency': 'f', 'id': 720, 'synset': 'mug.n.04', 'synonyms': ['mug'], 'def': 'with handle and usually cylindrical', 'name': 'mug'}, {'frequency': 'f', 'id': 721, 'synset': 'mushroom.n.02', 'synonyms': ['mushroom'], 'def': 'a common mushroom', 'name': 'mushroom'}, {'frequency': 'r', 'id': 722, 'synset': 'music_stool.n.01', 'synonyms': ['music_stool', 'piano_stool'], 'def': 'a stool for piano players; usually adjustable in height', 'name': 'music_stool'}, {'frequency': 'r', 'id': 723, 'synset': 'musical_instrument.n.01', 'synonyms': ['musical_instrument', 'instrument_(musical)'], 'def': 'any of various devices or contrivances that can be used to produce musical tones or sounds', 'name': 'musical_instrument'}, {'frequency': 'r', 'id': 724, 'synset': 'nailfile.n.01', 'synonyms': ['nailfile'], 'def': 'a small flat file for shaping the nails', 'name': 'nailfile'}, {'frequency': 'r', 'id': 725, 'synset': 'nameplate.n.01', 'synonyms': ['nameplate'], 'def': 'a plate bearing a name', 'name': 'nameplate'}, {'frequency': 'f', 'id': 726, 'synset': 'napkin.n.01', 'synonyms': ['napkin', 'table_napkin', 'serviette'], 'def': 'a small piece of table linen or paper that is used to wipe the mouth and to cover the lap in order to protect clothing', 'name': 'napkin'}, {'frequency': 'r', 'id': 727, 'synset': 'neckerchief.n.01', 'synonyms': ['neckerchief'], 'def': 'a kerchief worn around the neck', 'name': 'neckerchief'}, {'frequency': 'f', 'id': 728, 'synset': 'necklace.n.01', 'synonyms': ['necklace'], 'def': 'jewelry consisting of a cord or chain (often bearing gems) worn about the neck as an ornament', 'name': 'necklace'}, {'frequency': 'f', 'id': 729, 'synset': 'necktie.n.01', 'synonyms': ['necktie', 'tie_(necktie)'], 'def': 'neckwear consisting of a long narrow piece of material worn under a collar and tied in knot at the front', 'name': 'necktie'}, {'frequency': 'r', 'id': 730, 'synset': 'needle.n.03', 'synonyms': ['needle'], 'def': 'a sharp pointed implement (usually metal)', 'name': 'needle'}, {'frequency': 'c', 'id': 731, 'synset': 'nest.n.01', 'synonyms': ['nest'], 'def': 'a structure in which animals lay eggs or give birth to their young', 'name': 'nest'}, {'frequency': 'r', 'id': 732, 'synset': 'newsstand.n.01', 'synonyms': ['newsstand'], 'def': 'a stall where newspapers and other periodicals are sold', 'name': 'newsstand'}, {'frequency': 'c', 'id': 733, 'synset': 'nightwear.n.01', 'synonyms': ['nightshirt', 'nightwear', 'sleepwear', 'nightclothes'], 'def': 'garments designed to be worn in bed', 'name': 'nightshirt'}, {'frequency': 'r', 'id': 734, 'synset': 'nosebag.n.01', 'synonyms': ['nosebag_(for_animals)', 'feedbag'], 'def': 'a canvas bag that is used to feed an animal (such as a horse); covers the muzzle and fastens at the top of the head', 'name': 'nosebag_(for_animals)'}, {'frequency': 'r', 'id': 735, 'synset': 'noseband.n.01', 'synonyms': ['noseband_(for_animals)', 'nosepiece_(for_animals)'], 'def': "a strap that is the part of a bridle that goes over the animal's nose", 'name': 'noseband_(for_animals)'}, {'frequency': 'f', 'id': 736, 'synset': 'notebook.n.01', 'synonyms': ['notebook'], 'def': 'a book with blank pages for recording notes or memoranda', 'name': 'notebook'}, {'frequency': 'c', 'id': 737, 'synset': 'notepad.n.01', 'synonyms': ['notepad'], 'def': 'a pad of paper for keeping notes', 'name': 'notepad'}, {'frequency': 'c', 'id': 738, 'synset': 'nut.n.03', 'synonyms': ['nut'], 'def': 'a small metal block (usually square or hexagonal) with internal screw thread to be fitted onto a bolt', 'name': 'nut'}, {'frequency': 'r', 'id': 739, 'synset': 'nutcracker.n.01', 'synonyms': ['nutcracker'], 'def': 'a hand tool used to crack nuts open', 'name': 'nutcracker'}, {'frequency': 'c', 'id': 740, 'synset': 'oar.n.01', 'synonyms': ['oar'], 'def': 'an implement used to propel or steer a boat', 'name': 'oar'}, {'frequency': 'r', 'id': 741, 'synset': 'octopus.n.01', 'synonyms': ['octopus_(food)'], 'def': 'tentacles of octopus prepared as food', 'name': 'octopus_(food)'}, {'frequency': 'r', 'id': 742, 'synset': 'octopus.n.02', 'synonyms': ['octopus_(animal)'], 'def': 'bottom-living cephalopod having a soft oval body with eight long tentacles', 'name': 'octopus_(animal)'}, {'frequency': 'c', 'id': 743, 'synset': 'oil_lamp.n.01', 'synonyms': ['oil_lamp', 'kerosene_lamp', 'kerosine_lamp'], 'def': 'a lamp that burns oil (as kerosine) for light', 'name': 'oil_lamp'}, {'frequency': 'c', 'id': 744, 'synset': 'olive_oil.n.01', 'synonyms': ['olive_oil'], 'def': 'oil from olives', 'name': 'olive_oil'}, {'frequency': 'r', 'id': 745, 'synset': 'omelet.n.01', 'synonyms': ['omelet', 'omelette'], 'def': 'beaten eggs cooked until just set; may be folded around e.g. ham or cheese or jelly', 'name': 'omelet'}, {'frequency': 'f', 'id': 746, 'synset': 'onion.n.01', 'synonyms': ['onion'], 'def': 'the bulb of an onion plant', 'name': 'onion'}, {'frequency': 'f', 'id': 747, 'synset': 'orange.n.01', 'synonyms': ['orange_(fruit)'], 'def': 'orange (FRUIT of an orange tree)', 'name': 'orange_(fruit)'}, {'frequency': 'c', 'id': 748, 'synset': 'orange_juice.n.01', 'synonyms': ['orange_juice'], 'def': 'bottled or freshly squeezed juice of oranges', 'name': 'orange_juice'}, {'frequency': 'r', 'id': 749, 'synset': 'oregano.n.01', 'synonyms': ['oregano', 'marjoram'], 'def': 'aromatic Eurasian perennial herb used in cooking and baking', 'name': 'oregano'}, {'frequency': 'c', 'id': 750, 'synset': 'ostrich.n.02', 'synonyms': ['ostrich'], 'def': 'fast-running African flightless bird with two-toed feet; largest living bird', 'name': 'ostrich'}, {'frequency': 'c', 'id': 751, 'synset': 'ottoman.n.03', 'synonyms': ['ottoman', 'pouf', 'pouffe', 'hassock'], 'def': 'thick cushion used as a seat', 'name': 'ottoman'}, {'frequency': 'c', 'id': 752, 'synset': 'overall.n.01', 'synonyms': ['overalls_(clothing)'], 'def': 'work clothing consisting of denim trousers usually with a bib and shoulder straps', 'name': 'overalls_(clothing)'}, {'frequency': 'c', 'id': 753, 'synset': 'owl.n.01', 'synonyms': ['owl'], 'def': 'nocturnal bird of prey with hawk-like beak and claws and large head with front-facing eyes', 'name': 'owl'}, {'frequency': 'c', 'id': 754, 'synset': 'packet.n.03', 'synonyms': ['packet'], 'def': 'a small package or bundle', 'name': 'packet'}, {'frequency': 'r', 'id': 755, 'synset': 'pad.n.03', 'synonyms': ['inkpad', 'inking_pad', 'stamp_pad'], 'def': 'absorbent material saturated with ink used to transfer ink evenly to a rubber stamp', 'name': 'inkpad'}, {'frequency': 'c', 'id': 756, 'synset': 'pad.n.04', 'synonyms': ['pad'], 'def': 'a flat mass of soft material used for protection, stuffing, or comfort', 'name': 'pad'}, {'frequency': 'c', 'id': 757, 'synset': 'paddle.n.04', 'synonyms': ['paddle', 'boat_paddle'], 'def': 'a short light oar used without an oarlock to propel a canoe or small boat', 'name': 'paddle'}, {'frequency': 'c', 'id': 758, 'synset': 'padlock.n.01', 'synonyms': ['padlock'], 'def': 'a detachable, portable lock', 'name': 'padlock'}, {'frequency': 'r', 'id': 759, 'synset': 'paintbox.n.01', 'synonyms': ['paintbox'], 'def': "a box containing a collection of cubes or tubes of artists' paint", 'name': 'paintbox'}, {'frequency': 'c', 'id': 760, 'synset': 'paintbrush.n.01', 'synonyms': ['paintbrush'], 'def': 'a brush used as an applicator to apply paint', 'name': 'paintbrush'}, {'frequency': 'f', 'id': 761, 'synset': 'painting.n.01', 'synonyms': ['painting'], 'def': 'graphic art consisting of an artistic composition made by applying paints to a surface', 'name': 'painting'}, {'frequency': 'c', 'id': 762, 'synset': 'pajama.n.02', 'synonyms': ['pajamas', 'pyjamas'], 'def': 'loose-fitting nightclothes worn for sleeping or lounging', 'name': 'pajamas'}, {'frequency': 'c', 'id': 763, 'synset': 'palette.n.02', 'synonyms': ['palette', 'pallet'], 'def': 'board that provides a flat surface on which artists mix paints and the range of colors used', 'name': 'palette'}, {'frequency': 'f', 'id': 764, 'synset': 'pan.n.01', 'synonyms': ['pan_(for_cooking)', 'cooking_pan'], 'def': 'cooking utensil consisting of a wide metal vessel', 'name': 'pan_(for_cooking)'}, {'frequency': 'r', 'id': 765, 'synset': 'pan.n.03', 'synonyms': ['pan_(metal_container)'], 'def': 'shallow container made of metal', 'name': 'pan_(metal_container)'}, {'frequency': 'c', 'id': 766, 'synset': 'pancake.n.01', 'synonyms': ['pancake'], 'def': 'a flat cake of thin batter fried on both sides on a griddle', 'name': 'pancake'}, {'frequency': 'r', 'id': 767, 'synset': 'pantyhose.n.01', 'synonyms': ['pantyhose'], 'def': "a woman's tights consisting of underpants and stockings", 'name': 'pantyhose'}, {'frequency': 'r', 'id': 768, 'synset': 'papaya.n.02', 'synonyms': ['papaya'], 'def': 'large oval melon-like tropical fruit with yellowish flesh', 'name': 'papaya'}, {'frequency': 'r', 'id': 769, 'synset': 'paper_clip.n.01', 'synonyms': ['paperclip'], 'def': 'a wire or plastic clip for holding sheets of paper together', 'name': 'paperclip'}, {'frequency': 'f', 'id': 770, 'synset': 'paper_plate.n.01', 'synonyms': ['paper_plate'], 'def': 'a disposable plate made of cardboard', 'name': 'paper_plate'}, {'frequency': 'f', 'id': 771, 'synset': 'paper_towel.n.01', 'synonyms': ['paper_towel'], 'def': 'a disposable towel made of absorbent paper', 'name': 'paper_towel'}, {'frequency': 'r', 'id': 772, 'synset': 'paperback_book.n.01', 'synonyms': ['paperback_book', 'paper-back_book', 'softback_book', 'soft-cover_book'], 'def': 'a book with paper covers', 'name': 'paperback_book'}, {'frequency': 'r', 'id': 773, 'synset': 'paperweight.n.01', 'synonyms': ['paperweight'], 'def': 'a weight used to hold down a stack of papers', 'name': 'paperweight'}, {'frequency': 'c', 'id': 774, 'synset': 'parachute.n.01', 'synonyms': ['parachute'], 'def': 'rescue equipment consisting of a device that fills with air and retards your fall', 'name': 'parachute'}, {'frequency': 'r', 'id': 775, 'synset': 'parakeet.n.01', 'synonyms': ['parakeet', 'parrakeet', 'parroket', 'paraquet', 'paroquet', 'parroquet'], 'def': 'any of numerous small slender long-tailed parrots', 'name': 'parakeet'}, {'frequency': 'c', 'id': 776, 'synset': 'parasail.n.01', 'synonyms': ['parasail_(sports)'], 'def': 'parachute that will lift a person up into the air when it is towed by a motorboat or a car', 'name': 'parasail_(sports)'}, {'frequency': 'r', 'id': 777, 'synset': 'parchment.n.01', 'synonyms': ['parchment'], 'def': 'a superior paper resembling sheepskin', 'name': 'parchment'}, {'frequency': 'r', 'id': 778, 'synset': 'parka.n.01', 'synonyms': ['parka', 'anorak'], 'def': "a kind of heavy jacket (`windcheater' is a British term)", 'name': 'parka'}, {'frequency': 'f', 'id': 779, 'synset': 'parking_meter.n.01', 'synonyms': ['parking_meter'], 'def': 'a coin-operated timer located next to a parking space', 'name': 'parking_meter'}, {'frequency': 'c', 'id': 780, 'synset': 'parrot.n.01', 'synonyms': ['parrot'], 'def': 'usually brightly colored tropical birds with short hooked beaks and the ability to mimic sounds', 'name': 'parrot'}, {'frequency': 'c', 'id': 781, 'synset': 'passenger_car.n.01', 'synonyms': ['passenger_car_(part_of_a_train)', 'coach_(part_of_a_train)'], 'def': 'a railcar where passengers ride', 'name': 'passenger_car_(part_of_a_train)'}, {'frequency': 'r', 'id': 782, 'synset': 'passenger_ship.n.01', 'synonyms': ['passenger_ship'], 'def': 'a ship built to carry passengers', 'name': 'passenger_ship'}, {'frequency': 'r', 'id': 783, 'synset': 'passport.n.02', 'synonyms': ['passport'], 'def': 'a document issued by a country to a citizen allowing that person to travel abroad and re-enter the home country', 'name': 'passport'}, {'frequency': 'f', 'id': 784, 'synset': 'pastry.n.02', 'synonyms': ['pastry'], 'def': 'any of various baked foods made of dough or batter', 'name': 'pastry'}, {'frequency': 'r', 'id': 785, 'synset': 'patty.n.01', 'synonyms': ['patty_(food)'], 'def': 'small flat mass of chopped food', 'name': 'patty_(food)'}, {'frequency': 'c', 'id': 786, 'synset': 'pea.n.01', 'synonyms': ['pea_(food)'], 'def': 'seed of a pea plant used for food', 'name': 'pea_(food)'}, {'frequency': 'c', 'id': 787, 'synset': 'peach.n.03', 'synonyms': ['peach'], 'def': 'downy juicy fruit with sweet yellowish or whitish flesh', 'name': 'peach'}, {'frequency': 'c', 'id': 788, 'synset': 'peanut_butter.n.01', 'synonyms': ['peanut_butter'], 'def': 'a spread made from ground peanuts', 'name': 'peanut_butter'}, {'frequency': 'c', 'id': 789, 'synset': 'pear.n.01', 'synonyms': ['pear'], 'def': 'sweet juicy gritty-textured fruit available in many varieties', 'name': 'pear'}, {'frequency': 'r', 'id': 790, 'synset': 'peeler.n.03', 'synonyms': ['peeler_(tool_for_fruit_and_vegetables)'], 'def': 'a device for peeling vegetables or fruits', 'name': 'peeler_(tool_for_fruit_and_vegetables)'}, {'frequency': 'r', 'id': 791, 'synset': 'pegboard.n.01', 'synonyms': ['pegboard'], 'def': 'a board perforated with regularly spaced holes into which pegs can be fitted', 'name': 'pegboard'}, {'frequency': 'c', 'id': 792, 'synset': 'pelican.n.01', 'synonyms': ['pelican'], 'def': 'large long-winged warm-water seabird having a large bill with a distensible pouch for fish', 'name': 'pelican'}, {'frequency': 'f', 'id': 793, 'synset': 'pen.n.01', 'synonyms': ['pen'], 'def': 'a writing implement with a point from which ink flows', 'name': 'pen'}, {'frequency': 'c', 'id': 794, 'synset': 'pencil.n.01', 'synonyms': ['pencil'], 'def': 'a thin cylindrical pointed writing implement made of wood and graphite', 'name': 'pencil'}, {'frequency': 'r', 'id': 795, 'synset': 'pencil_box.n.01', 'synonyms': ['pencil_box', 'pencil_case'], 'def': 'a box for holding pencils', 'name': 'pencil_box'}, {'frequency': 'r', 'id': 796, 'synset': 'pencil_sharpener.n.01', 'synonyms': ['pencil_sharpener'], 'def': 'a rotary implement for sharpening the point on pencils', 'name': 'pencil_sharpener'}, {'frequency': 'r', 'id': 797, 'synset': 'pendulum.n.01', 'synonyms': ['pendulum'], 'def': 'an apparatus consisting of an object mounted so that it swings freely under the influence of gravity', 'name': 'pendulum'}, {'frequency': 'c', 'id': 798, 'synset': 'penguin.n.01', 'synonyms': ['penguin'], 'def': 'short-legged flightless birds of cold southern regions having webbed feet and wings modified as flippers', 'name': 'penguin'}, {'frequency': 'r', 'id': 799, 'synset': 'pennant.n.02', 'synonyms': ['pennant'], 'def': 'a flag longer than it is wide (and often tapering)', 'name': 'pennant'}, {'frequency': 'r', 'id': 800, 'synset': 'penny.n.02', 'synonyms': ['penny_(coin)'], 'def': 'a coin worth one-hundredth of the value of the basic unit', 'name': 'penny_(coin)'}, {'frequency': 'c', 'id': 801, 'synset': 'pepper.n.03', 'synonyms': ['pepper', 'peppercorn'], 'def': 'pungent seasoning from the berry of the common pepper plant; whole or ground', 'name': 'pepper'}, {'frequency': 'c', 'id': 802, 'synset': 'pepper_mill.n.01', 'synonyms': ['pepper_mill', 'pepper_grinder'], 'def': 'a mill for grinding pepper', 'name': 'pepper_mill'}, {'frequency': 'c', 'id': 803, 'synset': 'perfume.n.02', 'synonyms': ['perfume'], 'def': 'a toiletry that emits and diffuses a fragrant odor', 'name': 'perfume'}, {'frequency': 'r', 'id': 804, 'synset': 'persimmon.n.02', 'synonyms': ['persimmon'], 'def': 'orange fruit resembling a plum; edible when fully ripe', 'name': 'persimmon'}, {'frequency': 'f', 'id': 805, 'synset': 'person.n.01', 'synonyms': ['baby', 'child', 'boy', 'girl', 'man', 'woman', 'person', 'human'], 'def': 'a human being', 'name': 'baby'}, {'frequency': 'r', 'id': 806, 'synset': 'pet.n.01', 'synonyms': ['pet'], 'def': 'a domesticated animal kept for companionship or amusement', 'name': 'pet'}, {'frequency': 'r', 'id': 807, 'synset': 'petfood.n.01', 'synonyms': ['petfood', 'pet-food'], 'def': 'food prepared for animal pets', 'name': 'petfood'}, {'frequency': 'r', 'id': 808, 'synset': 'pew.n.01', 'synonyms': ['pew_(church_bench)', 'church_bench'], 'def': 'long bench with backs; used in church by the congregation', 'name': 'pew_(church_bench)'}, {'frequency': 'r', 'id': 809, 'synset': 'phonebook.n.01', 'synonyms': ['phonebook', 'telephone_book', 'telephone_directory'], 'def': 'a directory containing an alphabetical list of telephone subscribers and their telephone numbers', 'name': 'phonebook'}, {'frequency': 'c', 'id': 810, 'synset': 'phonograph_record.n.01', 'synonyms': ['phonograph_record', 'phonograph_recording', 'record_(phonograph_recording)'], 'def': 'sound recording consisting of a typically black disk with a continuous groove', 'name': 'phonograph_record'}, {'frequency': 'c', 'id': 811, 'synset': 'piano.n.01', 'synonyms': ['piano'], 'def': 'a keyboard instrument that is played by depressing keys that cause hammers to strike tuned strings and produce sounds', 'name': 'piano'}, {'frequency': 'f', 'id': 812, 'synset': 'pickle.n.01', 'synonyms': ['pickle'], 'def': 'vegetables (especially cucumbers) preserved in brine or vinegar', 'name': 'pickle'}, {'frequency': 'f', 'id': 813, 'synset': 'pickup.n.01', 'synonyms': ['pickup_truck'], 'def': 'a light truck with an open body and low sides and a tailboard', 'name': 'pickup_truck'}, {'frequency': 'c', 'id': 814, 'synset': 'pie.n.01', 'synonyms': ['pie'], 'def': 'dish baked in pastry-lined pan often with a pastry top', 'name': 'pie'}, {'frequency': 'c', 'id': 815, 'synset': 'pigeon.n.01', 'synonyms': ['pigeon'], 'def': 'wild and domesticated birds having a heavy body and short legs', 'name': 'pigeon'}, {'frequency': 'r', 'id': 816, 'synset': 'piggy_bank.n.01', 'synonyms': ['piggy_bank', 'penny_bank'], 'def': "a child's coin bank (often shaped like a pig)", 'name': 'piggy_bank'}, {'frequency': 'f', 'id': 817, 'synset': 'pillow.n.01', 'synonyms': ['pillow'], 'def': 'a cushion to support the head of a sleeping person', 'name': 'pillow'}, {'frequency': 'r', 'id': 818, 'synset': 'pin.n.09', 'synonyms': ['pin_(non_jewelry)'], 'def': 'a small slender (often pointed) piece of wood or metal used to support or fasten or attach things', 'name': 'pin_(non_jewelry)'}, {'frequency': 'f', 'id': 819, 'synset': 'pineapple.n.02', 'synonyms': ['pineapple'], 'def': 'large sweet fleshy tropical fruit with a tuft of stiff leaves', 'name': 'pineapple'}, {'frequency': 'c', 'id': 820, 'synset': 'pinecone.n.01', 'synonyms': ['pinecone'], 'def': 'the seed-producing cone of a pine tree', 'name': 'pinecone'}, {'frequency': 'r', 'id': 821, 'synset': 'ping-pong_ball.n.01', 'synonyms': ['ping-pong_ball'], 'def': 'light hollow ball used in playing table tennis', 'name': 'ping-pong_ball'}, {'frequency': 'r', 'id': 822, 'synset': 'pinwheel.n.03', 'synonyms': ['pinwheel'], 'def': 'a toy consisting of vanes of colored paper or plastic that is pinned to a stick and spins when it is pointed into the wind', 'name': 'pinwheel'}, {'frequency': 'r', 'id': 823, 'synset': 'pipe.n.01', 'synonyms': ['tobacco_pipe'], 'def': 'a tube with a small bowl at one end; used for smoking tobacco', 'name': 'tobacco_pipe'}, {'frequency': 'f', 'id': 824, 'synset': 'pipe.n.02', 'synonyms': ['pipe', 'piping'], 'def': 'a long tube made of metal or plastic that is used to carry water or oil or gas etc.', 'name': 'pipe'}, {'frequency': 'r', 'id': 825, 'synset': 'pistol.n.01', 'synonyms': ['pistol', 'handgun'], 'def': 'a firearm that is held and fired with one hand', 'name': 'pistol'}, {'frequency': 'r', 'id': 826, 'synset': 'pita.n.01', 'synonyms': ['pita_(bread)', 'pocket_bread'], 'def': 'usually small round bread that can open into a pocket for filling', 'name': 'pita_(bread)'}, {'frequency': 'f', 'id': 827, 'synset': 'pitcher.n.02', 'synonyms': ['pitcher_(vessel_for_liquid)', 'ewer'], 'def': 'an open vessel with a handle and a spout for pouring', 'name': 'pitcher_(vessel_for_liquid)'}, {'frequency': 'r', 'id': 828, 'synset': 'pitchfork.n.01', 'synonyms': ['pitchfork'], 'def': 'a long-handled hand tool with sharp widely spaced prongs for lifting and pitching hay', 'name': 'pitchfork'}, {'frequency': 'f', 'id': 829, 'synset': 'pizza.n.01', 'synonyms': ['pizza'], 'def': 'Italian open pie made of thin bread dough spread with a spiced mixture of e.g. tomato sauce and cheese', 'name': 'pizza'}, {'frequency': 'f', 'id': 830, 'synset': 'place_mat.n.01', 'synonyms': ['place_mat'], 'def': 'a mat placed on a table for an individual place setting', 'name': 'place_mat'}, {'frequency': 'f', 'id': 831, 'synset': 'plate.n.04', 'synonyms': ['plate'], 'def': 'dish on which food is served or from which food is eaten', 'name': 'plate'}, {'frequency': 'c', 'id': 832, 'synset': 'platter.n.01', 'synonyms': ['platter'], 'def': 'a large shallow dish used for serving food', 'name': 'platter'}, {'frequency': 'r', 'id': 833, 'synset': 'playing_card.n.01', 'synonyms': ['playing_card'], 'def': 'one of a pack of cards that are used to play card games', 'name': 'playing_card'}, {'frequency': 'r', 'id': 834, 'synset': 'playpen.n.01', 'synonyms': ['playpen'], 'def': 'a portable enclosure in which babies may be left to play', 'name': 'playpen'}, {'frequency': 'c', 'id': 835, 'synset': 'pliers.n.01', 'synonyms': ['pliers', 'plyers'], 'def': 'a gripping hand tool with two hinged arms and (usually) serrated jaws', 'name': 'pliers'}, {'frequency': 'r', 'id': 836, 'synset': 'plow.n.01', 'synonyms': ['plow_(farm_equipment)', 'plough_(farm_equipment)'], 'def': 'a farm tool having one or more heavy blades to break the soil and cut a furrow prior to sowing', 'name': 'plow_(farm_equipment)'}, {'frequency': 'r', 'id': 837, 'synset': 'pocket_watch.n.01', 'synonyms': ['pocket_watch'], 'def': 'a watch that is carried in a small watch pocket', 'name': 'pocket_watch'}, {'frequency': 'c', 'id': 838, 'synset': 'pocketknife.n.01', 'synonyms': ['pocketknife'], 'def': 'a knife with a blade that folds into the handle; suitable for carrying in the pocket', 'name': 'pocketknife'}, {'frequency': 'c', 'id': 839, 'synset': 'poker.n.01', 'synonyms': ['poker_(fire_stirring_tool)', 'stove_poker', 'fire_hook'], 'def': 'fire iron consisting of a metal rod with a handle; used to stir a fire', 'name': 'poker_(fire_stirring_tool)'}, {'frequency': 'f', 'id': 840, 'synset': 'pole.n.01', 'synonyms': ['pole', 'post'], 'def': 'a long (usually round) rod of wood or metal or plastic', 'name': 'pole'}, {'frequency': 'r', 'id': 841, 'synset': 'police_van.n.01', 'synonyms': ['police_van', 'police_wagon', 'paddy_wagon', 'patrol_wagon'], 'def': 'van used by police to transport prisoners', 'name': 'police_van'}, {'frequency': 'f', 'id': 842, 'synset': 'polo_shirt.n.01', 'synonyms': ['polo_shirt', 'sport_shirt'], 'def': 'a shirt with short sleeves designed for comfort and casual wear', 'name': 'polo_shirt'}, {'frequency': 'r', 'id': 843, 'synset': 'poncho.n.01', 'synonyms': ['poncho'], 'def': 'a blanket-like cloak with a hole in the center for the head', 'name': 'poncho'}, {'frequency': 'c', 'id': 844, 'synset': 'pony.n.05', 'synonyms': ['pony'], 'def': 'any of various breeds of small gentle horses usually less than five feet high at the shoulder', 'name': 'pony'}, {'frequency': 'r', 'id': 845, 'synset': 'pool_table.n.01', 'synonyms': ['pool_table', 'billiard_table', 'snooker_table'], 'def': 'game equipment consisting of a heavy table on which pool is played', 'name': 'pool_table'}, {'frequency': 'f', 'id': 846, 'synset': 'pop.n.02', 'synonyms': ['pop_(soda)', 'soda_(pop)', 'tonic', 'soft_drink'], 'def': 'a sweet drink containing carbonated water and flavoring', 'name': 'pop_(soda)'}, {'frequency': 'r', 'id': 847, 'synset': 'portrait.n.02', 'synonyms': ['portrait', 'portrayal'], 'def': 'any likeness of a person, in any medium', 'name': 'portrait'}, {'frequency': 'c', 'id': 848, 'synset': 'postbox.n.01', 'synonyms': ['postbox_(public)', 'mailbox_(public)'], 'def': 'public box for deposit of mail', 'name': 'postbox_(public)'}, {'frequency': 'c', 'id': 849, 'synset': 'postcard.n.01', 'synonyms': ['postcard', 'postal_card', 'mailing-card'], 'def': 'a card for sending messages by post without an envelope', 'name': 'postcard'}, {'frequency': 'f', 'id': 850, 'synset': 'poster.n.01', 'synonyms': ['poster', 'placard'], 'def': 'a sign posted in a public place as an advertisement', 'name': 'poster'}, {'frequency': 'f', 'id': 851, 'synset': 'pot.n.01', 'synonyms': ['pot'], 'def': 'metal or earthenware cooking vessel that is usually round and deep; often has a handle and lid', 'name': 'pot'}, {'frequency': 'f', 'id': 852, 'synset': 'pot.n.04', 'synonyms': ['flowerpot'], 'def': 'a container in which plants are cultivated', 'name': 'flowerpot'}, {'frequency': 'f', 'id': 853, 'synset': 'potato.n.01', 'synonyms': ['potato'], 'def': 'an edible tuber native to South America', 'name': 'potato'}, {'frequency': 'c', 'id': 854, 'synset': 'potholder.n.01', 'synonyms': ['potholder'], 'def': 'an insulated pad for holding hot pots', 'name': 'potholder'}, {'frequency': 'c', 'id': 855, 'synset': 'pottery.n.01', 'synonyms': ['pottery', 'clayware'], 'def': 'ceramic ware made from clay and baked in a kiln', 'name': 'pottery'}, {'frequency': 'c', 'id': 856, 'synset': 'pouch.n.01', 'synonyms': ['pouch'], 'def': 'a small or medium size container for holding or carrying things', 'name': 'pouch'}, {'frequency': 'r', 'id': 857, 'synset': 'power_shovel.n.01', 'synonyms': ['power_shovel', 'excavator', 'digger'], 'def': 'a machine for excavating', 'name': 'power_shovel'}, {'frequency': 'c', 'id': 858, 'synset': 'prawn.n.01', 'synonyms': ['prawn', 'shrimp'], 'def': 'any of various edible decapod crustaceans', 'name': 'prawn'}, {'frequency': 'f', 'id': 859, 'synset': 'printer.n.03', 'synonyms': ['printer', 'printing_machine'], 'def': 'a machine that prints', 'name': 'printer'}, {'frequency': 'c', 'id': 860, 'synset': 'projectile.n.01', 'synonyms': ['projectile_(weapon)', 'missile'], 'def': 'a weapon that is forcibly thrown or projected at a targets', 'name': 'projectile_(weapon)'}, {'frequency': 'c', 'id': 861, 'synset': 'projector.n.02', 'synonyms': ['projector'], 'def': 'an optical instrument that projects an enlarged image onto a screen', 'name': 'projector'}, {'frequency': 'f', 'id': 862, 'synset': 'propeller.n.01', 'synonyms': ['propeller', 'propellor'], 'def': 'a mechanical device that rotates to push against air or water', 'name': 'propeller'}, {'frequency': 'r', 'id': 863, 'synset': 'prune.n.01', 'synonyms': ['prune'], 'def': 'dried plum', 'name': 'prune'}, {'frequency': 'r', 'id': 864, 'synset': 'pudding.n.01', 'synonyms': ['pudding'], 'def': 'any of various soft thick unsweetened baked dishes', 'name': 'pudding'}, {'frequency': 'r', 'id': 865, 'synset': 'puffer.n.02', 'synonyms': ['puffer_(fish)', 'pufferfish', 'blowfish', 'globefish'], 'def': 'fishes whose elongated spiny body can inflate itself with water or air to form a globe', 'name': 'puffer_(fish)'}, {'frequency': 'r', 'id': 866, 'synset': 'puffin.n.01', 'synonyms': ['puffin'], 'def': 'seabirds having short necks and brightly colored compressed bills', 'name': 'puffin'}, {'frequency': 'r', 'id': 867, 'synset': 'pug.n.01', 'synonyms': ['pug-dog'], 'def': 'small compact smooth-coated breed of Asiatic origin having a tightly curled tail and broad flat wrinkled muzzle', 'name': 'pug-dog'}, {'frequency': 'c', 'id': 868, 'synset': 'pumpkin.n.02', 'synonyms': ['pumpkin'], 'def': 'usually large pulpy deep-yellow round fruit of the squash family maturing in late summer or early autumn', 'name': 'pumpkin'}, {'frequency': 'r', 'id': 869, 'synset': 'punch.n.03', 'synonyms': ['puncher'], 'def': 'a tool for making holes or indentations', 'name': 'puncher'}, {'frequency': 'r', 'id': 870, 'synset': 'puppet.n.01', 'synonyms': ['puppet', 'marionette'], 'def': 'a small figure of a person operated from above with strings by a puppeteer', 'name': 'puppet'}, {'frequency': 'r', 'id': 871, 'synset': 'puppy.n.01', 'synonyms': ['puppy'], 'def': 'a young dog', 'name': 'puppy'}, {'frequency': 'r', 'id': 872, 'synset': 'quesadilla.n.01', 'synonyms': ['quesadilla'], 'def': 'a tortilla that is filled with cheese and heated', 'name': 'quesadilla'}, {'frequency': 'r', 'id': 873, 'synset': 'quiche.n.02', 'synonyms': ['quiche'], 'def': 'a tart filled with rich unsweetened custard; often contains other ingredients (as cheese or ham or seafood or vegetables)', 'name': 'quiche'}, {'frequency': 'f', 'id': 874, 'synset': 'quilt.n.01', 'synonyms': ['quilt', 'comforter'], 'def': 'bedding made of two layers of cloth filled with stuffing and stitched together', 'name': 'quilt'}, {'frequency': 'c', 'id': 875, 'synset': 'rabbit.n.01', 'synonyms': ['rabbit'], 'def': 'any of various burrowing animals of the family Leporidae having long ears and short tails', 'name': 'rabbit'}, {'frequency': 'r', 'id': 876, 'synset': 'racer.n.02', 'synonyms': ['race_car', 'racing_car'], 'def': 'a fast car that competes in races', 'name': 'race_car'}, {'frequency': 'c', 'id': 877, 'synset': 'racket.n.04', 'synonyms': ['racket', 'racquet'], 'def': 'a sports implement used to strike a ball in various games', 'name': 'racket'}, {'frequency': 'r', 'id': 878, 'synset': 'radar.n.01', 'synonyms': ['radar'], 'def': 'measuring instrument in which the echo of a pulse of microwave radiation is used to detect and locate distant objects', 'name': 'radar'}, {'frequency': 'c', 'id': 879, 'synset': 'radiator.n.03', 'synonyms': ['radiator'], 'def': 'a mechanism consisting of a metal honeycomb through which hot fluids circulate', 'name': 'radiator'}, {'frequency': 'c', 'id': 880, 'synset': 'radio_receiver.n.01', 'synonyms': ['radio_receiver', 'radio_set', 'radio', 'tuner_(radio)'], 'def': 'an electronic receiver that detects and demodulates and amplifies transmitted radio signals', 'name': 'radio_receiver'}, {'frequency': 'c', 'id': 881, 'synset': 'radish.n.03', 'synonyms': ['radish', 'daikon'], 'def': 'pungent edible root of any of various cultivated radish plants', 'name': 'radish'}, {'frequency': 'c', 'id': 882, 'synset': 'raft.n.01', 'synonyms': ['raft'], 'def': 'a flat float (usually made of logs or planks) that can be used for transport or as a platform for swimmers', 'name': 'raft'}, {'frequency': 'r', 'id': 883, 'synset': 'rag_doll.n.01', 'synonyms': ['rag_doll'], 'def': 'a cloth doll that is stuffed and (usually) painted', 'name': 'rag_doll'}, {'frequency': 'c', 'id': 884, 'synset': 'raincoat.n.01', 'synonyms': ['raincoat', 'waterproof_jacket'], 'def': 'a water-resistant coat', 'name': 'raincoat'}, {'frequency': 'c', 'id': 885, 'synset': 'ram.n.05', 'synonyms': ['ram_(animal)'], 'def': 'uncastrated adult male sheep', 'name': 'ram_(animal)'}, {'frequency': 'c', 'id': 886, 'synset': 'raspberry.n.02', 'synonyms': ['raspberry'], 'def': 'red or black edible aggregate berries usually smaller than the related blackberries', 'name': 'raspberry'}, {'frequency': 'r', 'id': 887, 'synset': 'rat.n.01', 'synonyms': ['rat'], 'def': 'any of various long-tailed rodents similar to but larger than a mouse', 'name': 'rat'}, {'frequency': 'c', 'id': 888, 'synset': 'razorblade.n.01', 'synonyms': ['razorblade'], 'def': 'a blade that has very sharp edge', 'name': 'razorblade'}, {'frequency': 'c', 'id': 889, 'synset': 'reamer.n.01', 'synonyms': ['reamer_(juicer)', 'juicer', 'juice_reamer'], 'def': 'a squeezer with a conical ridged center that is used for squeezing juice from citrus fruit', 'name': 'reamer_(juicer)'}, {'frequency': 'f', 'id': 890, 'synset': 'rearview_mirror.n.01', 'synonyms': ['rearview_mirror'], 'def': 'car mirror that reflects the view out of the rear window', 'name': 'rearview_mirror'}, {'frequency': 'c', 'id': 891, 'synset': 'receipt.n.02', 'synonyms': ['receipt'], 'def': 'an acknowledgment (usually tangible) that payment has been made', 'name': 'receipt'}, {'frequency': 'c', 'id': 892, 'synset': 'recliner.n.01', 'synonyms': ['recliner', 'reclining_chair', 'lounger_(chair)'], 'def': 'an armchair whose back can be lowered and foot can be raised to allow the sitter to recline in it', 'name': 'recliner'}, {'frequency': 'r', 'id': 893, 'synset': 'record_player.n.01', 'synonyms': ['record_player', 'phonograph_(record_player)', 'turntable'], 'def': 'machine in which rotating records cause a stylus to vibrate and the vibrations are amplified acoustically or electronically', 'name': 'record_player'}, {'frequency': 'r', 'id': 894, 'synset': 'red_cabbage.n.02', 'synonyms': ['red_cabbage'], 'def': 'compact head of purplish-red leaves', 'name': 'red_cabbage'}, {'frequency': 'f', 'id': 895, 'synset': 'reflector.n.01', 'synonyms': ['reflector'], 'def': 'device that reflects light, radiation, etc.', 'name': 'reflector'}, {'frequency': 'f', 'id': 896, 'synset': 'remote_control.n.01', 'synonyms': ['remote_control'], 'def': 'a device that can be used to control a machine or apparatus from a distance', 'name': 'remote_control'}, {'frequency': 'c', 'id': 897, 'synset': 'rhinoceros.n.01', 'synonyms': ['rhinoceros'], 'def': 'massive powerful herbivorous odd-toed ungulate of southeast Asia and Africa having very thick skin and one or two horns on the snout', 'name': 'rhinoceros'}, {'frequency': 'r', 'id': 898, 'synset': 'rib.n.03', 'synonyms': ['rib_(food)'], 'def': 'cut of meat including one or more ribs', 'name': 'rib_(food)'}, {'frequency': 'r', 'id': 899, 'synset': 'rifle.n.01', 'synonyms': ['rifle'], 'def': 'a shoulder firearm with a long barrel', 'name': 'rifle'}, {'frequency': 'f', 'id': 900, 'synset': 'ring.n.08', 'synonyms': ['ring'], 'def': 'jewelry consisting of a circlet of precious metal (often set with jewels) worn on the finger', 'name': 'ring'}, {'frequency': 'r', 'id': 901, 'synset': 'river_boat.n.01', 'synonyms': ['river_boat'], 'def': 'a boat used on rivers or to ply a river', 'name': 'river_boat'}, {'frequency': 'r', 'id': 902, 'synset': 'road_map.n.02', 'synonyms': ['road_map'], 'def': '(NOT A ROAD) a MAP showing roads (for automobile travel)', 'name': 'road_map'}, {'frequency': 'c', 'id': 903, 'synset': 'robe.n.01', 'synonyms': ['robe'], 'def': 'any loose flowing garment', 'name': 'robe'}, {'frequency': 'c', 'id': 904, 'synset': 'rocking_chair.n.01', 'synonyms': ['rocking_chair'], 'def': 'a chair mounted on rockers', 'name': 'rocking_chair'}, {'frequency': 'r', 'id': 905, 'synset': 'roller_skate.n.01', 'synonyms': ['roller_skate'], 'def': 'a shoe with pairs of rollers (small hard wheels) fixed to the sole', 'name': 'roller_skate'}, {'frequency': 'r', 'id': 906, 'synset': 'rollerblade.n.01', 'synonyms': ['Rollerblade'], 'def': 'an in-line variant of a roller skate', 'name': 'Rollerblade'}, {'frequency': 'c', 'id': 907, 'synset': 'rolling_pin.n.01', 'synonyms': ['rolling_pin'], 'def': 'utensil consisting of a cylinder (usually of wood) with a handle at each end; used to roll out dough', 'name': 'rolling_pin'}, {'frequency': 'r', 'id': 908, 'synset': 'root_beer.n.01', 'synonyms': ['root_beer'], 'def': 'carbonated drink containing extracts of roots and herbs', 'name': 'root_beer'}, {'frequency': 'c', 'id': 909, 'synset': 'router.n.02', 'synonyms': ['router_(computer_equipment)'], 'def': 'a device that forwards data packets between computer networks', 'name': 'router_(computer_equipment)'}, {'frequency': 'f', 'id': 910, 'synset': 'rubber_band.n.01', 'synonyms': ['rubber_band', 'elastic_band'], 'def': 'a narrow band of elastic rubber used to hold things (such as papers) together', 'name': 'rubber_band'}, {'frequency': 'c', 'id': 911, 'synset': 'runner.n.08', 'synonyms': ['runner_(carpet)'], 'def': 'a long narrow carpet', 'name': 'runner_(carpet)'}, {'frequency': 'f', 'id': 912, 'synset': 'sack.n.01', 'synonyms': ['plastic_bag', 'paper_bag'], 'def': "a bag made of paper or plastic for holding customer's purchases", 'name': 'plastic_bag'}, {'frequency': 'f', 'id': 913, 'synset': 'saddle.n.01', 'synonyms': ['saddle_(on_an_animal)'], 'def': 'a seat for the rider of a horse or camel', 'name': 'saddle_(on_an_animal)'}, {'frequency': 'f', 'id': 914, 'synset': 'saddle_blanket.n.01', 'synonyms': ['saddle_blanket', 'saddlecloth', 'horse_blanket'], 'def': 'stable gear consisting of a blanket placed under the saddle', 'name': 'saddle_blanket'}, {'frequency': 'c', 'id': 915, 'synset': 'saddlebag.n.01', 'synonyms': ['saddlebag'], 'def': 'a large bag (or pair of bags) hung over a saddle', 'name': 'saddlebag'}, {'frequency': 'r', 'id': 916, 'synset': 'safety_pin.n.01', 'synonyms': ['safety_pin'], 'def': 'a pin in the form of a clasp; has a guard so the point of the pin will not stick the user', 'name': 'safety_pin'}, {'frequency': 'c', 'id': 917, 'synset': 'sail.n.01', 'synonyms': ['sail'], 'def': 'a large piece of fabric by means of which wind is used to propel a sailing vessel', 'name': 'sail'}, {'frequency': 'c', 'id': 918, 'synset': 'salad.n.01', 'synonyms': ['salad'], 'def': 'food mixtures either arranged on a plate or tossed and served with a moist dressing; usually consisting of or including greens', 'name': 'salad'}, {'frequency': 'r', 'id': 919, 'synset': 'salad_plate.n.01', 'synonyms': ['salad_plate', 'salad_bowl'], 'def': 'a plate or bowl for individual servings of salad', 'name': 'salad_plate'}, {'frequency': 'r', 'id': 920, 'synset': 'salami.n.01', 'synonyms': ['salami'], 'def': 'highly seasoned fatty sausage of pork and beef usually dried', 'name': 'salami'}, {'frequency': 'r', 'id': 921, 'synset': 'salmon.n.01', 'synonyms': ['salmon_(fish)'], 'def': 'any of various large food and game fishes of northern waters', 'name': 'salmon_(fish)'}, {'frequency': 'r', 'id': 922, 'synset': 'salmon.n.03', 'synonyms': ['salmon_(food)'], 'def': 'flesh of any of various marine or freshwater fish of the family Salmonidae', 'name': 'salmon_(food)'}, {'frequency': 'r', 'id': 923, 'synset': 'salsa.n.01', 'synonyms': ['salsa'], 'def': 'spicy sauce of tomatoes and onions and chili peppers to accompany Mexican foods', 'name': 'salsa'}, {'frequency': 'f', 'id': 924, 'synset': 'saltshaker.n.01', 'synonyms': ['saltshaker'], 'def': 'a shaker with a perforated top for sprinkling salt', 'name': 'saltshaker'}, {'frequency': 'f', 'id': 925, 'synset': 'sandal.n.01', 'synonyms': ['sandal_(type_of_shoe)'], 'def': 'a shoe consisting of a sole fastened by straps to the foot', 'name': 'sandal_(type_of_shoe)'}, {'frequency': 'f', 'id': 926, 'synset': 'sandwich.n.01', 'synonyms': ['sandwich'], 'def': 'two (or more) slices of bread with a filling between them', 'name': 'sandwich'}, {'frequency': 'r', 'id': 927, 'synset': 'satchel.n.01', 'synonyms': ['satchel'], 'def': 'luggage consisting of a small case with a flat bottom and (usually) a shoulder strap', 'name': 'satchel'}, {'frequency': 'r', 'id': 928, 'synset': 'saucepan.n.01', 'synonyms': ['saucepan'], 'def': 'a deep pan with a handle; used for stewing or boiling', 'name': 'saucepan'}, {'frequency': 'f', 'id': 929, 'synset': 'saucer.n.02', 'synonyms': ['saucer'], 'def': 'a small shallow dish for holding a cup at the table', 'name': 'saucer'}, {'frequency': 'f', 'id': 930, 'synset': 'sausage.n.01', 'synonyms': ['sausage'], 'def': 'highly seasoned minced meat stuffed in casings', 'name': 'sausage'}, {'frequency': 'r', 'id': 931, 'synset': 'sawhorse.n.01', 'synonyms': ['sawhorse', 'sawbuck'], 'def': 'a framework for holding wood that is being sawed', 'name': 'sawhorse'}, {'frequency': 'r', 'id': 932, 'synset': 'sax.n.02', 'synonyms': ['saxophone'], 'def': "a wind instrument with a `J'-shaped form typically made of brass", 'name': 'saxophone'}, {'frequency': 'f', 'id': 933, 'synset': 'scale.n.07', 'synonyms': ['scale_(measuring_instrument)'], 'def': 'a measuring instrument for weighing; shows amount of mass', 'name': 'scale_(measuring_instrument)'}, {'frequency': 'r', 'id': 934, 'synset': 'scarecrow.n.01', 'synonyms': ['scarecrow', 'strawman'], 'def': 'an effigy in the shape of a man to frighten birds away from seeds', 'name': 'scarecrow'}, {'frequency': 'f', 'id': 935, 'synset': 'scarf.n.01', 'synonyms': ['scarf'], 'def': 'a garment worn around the head or neck or shoulders for warmth or decoration', 'name': 'scarf'}, {'frequency': 'c', 'id': 936, 'synset': 'school_bus.n.01', 'synonyms': ['school_bus'], 'def': 'a bus used to transport children to or from school', 'name': 'school_bus'}, {'frequency': 'f', 'id': 937, 'synset': 'scissors.n.01', 'synonyms': ['scissors'], 'def': 'a tool having two crossed pivoting blades with looped handles', 'name': 'scissors'}, {'frequency': 'c', 'id': 938, 'synset': 'scoreboard.n.01', 'synonyms': ['scoreboard'], 'def': 'a large board for displaying the score of a contest (and some other information)', 'name': 'scoreboard'}, {'frequency': 'c', 'id': 939, 'synset': 'scrambled_eggs.n.01', 'synonyms': ['scrambled_eggs'], 'def': 'eggs beaten and cooked to a soft firm consistency while stirring', 'name': 'scrambled_eggs'}, {'frequency': 'r', 'id': 940, 'synset': 'scraper.n.01', 'synonyms': ['scraper'], 'def': 'any of various hand tools for scraping', 'name': 'scraper'}, {'frequency': 'r', 'id': 941, 'synset': 'scratcher.n.03', 'synonyms': ['scratcher'], 'def': 'a device used for scratching', 'name': 'scratcher'}, {'frequency': 'c', 'id': 942, 'synset': 'screwdriver.n.01', 'synonyms': ['screwdriver'], 'def': 'a hand tool for driving screws; has a tip that fits into the head of a screw', 'name': 'screwdriver'}, {'frequency': 'c', 'id': 943, 'synset': 'scrub_brush.n.01', 'synonyms': ['scrubbing_brush'], 'def': 'a brush with short stiff bristles for heavy cleaning', 'name': 'scrubbing_brush'}, {'frequency': 'c', 'id': 944, 'synset': 'sculpture.n.01', 'synonyms': ['sculpture'], 'def': 'a three-dimensional work of art', 'name': 'sculpture'}, {'frequency': 'r', 'id': 945, 'synset': 'seabird.n.01', 'synonyms': ['seabird', 'seafowl'], 'def': 'a bird that frequents coastal waters and the open ocean: gulls; pelicans; gannets; cormorants; albatrosses; petrels; etc.', 'name': 'seabird'}, {'frequency': 'r', 'id': 946, 'synset': 'seahorse.n.02', 'synonyms': ['seahorse'], 'def': 'small fish with horse-like heads bent sharply downward and curled tails', 'name': 'seahorse'}, {'frequency': 'r', 'id': 947, 'synset': 'seaplane.n.01', 'synonyms': ['seaplane', 'hydroplane'], 'def': 'an airplane that can land on or take off from water', 'name': 'seaplane'}, {'frequency': 'c', 'id': 948, 'synset': 'seashell.n.01', 'synonyms': ['seashell'], 'def': 'the shell of a marine organism', 'name': 'seashell'}, {'frequency': 'r', 'id': 949, 'synset': 'seedling.n.01', 'synonyms': ['seedling'], 'def': 'young plant or tree grown from a seed', 'name': 'seedling'}, {'frequency': 'c', 'id': 950, 'synset': 'serving_dish.n.01', 'synonyms': ['serving_dish'], 'def': 'a dish used for serving food', 'name': 'serving_dish'}, {'frequency': 'r', 'id': 951, 'synset': 'sewing_machine.n.01', 'synonyms': ['sewing_machine'], 'def': 'a textile machine used as a home appliance for sewing', 'name': 'sewing_machine'}, {'frequency': 'r', 'id': 952, 'synset': 'shaker.n.03', 'synonyms': ['shaker'], 'def': 'a container in which something can be shaken', 'name': 'shaker'}, {'frequency': 'c', 'id': 953, 'synset': 'shampoo.n.01', 'synonyms': ['shampoo'], 'def': 'cleansing agent consisting of soaps or detergents used for washing the hair', 'name': 'shampoo'}, {'frequency': 'r', 'id': 954, 'synset': 'shark.n.01', 'synonyms': ['shark'], 'def': 'typically large carnivorous fishes with sharpe teeth', 'name': 'shark'}, {'frequency': 'r', 'id': 955, 'synset': 'sharpener.n.01', 'synonyms': ['sharpener'], 'def': 'any implement that is used to make something (an edge or a point) sharper', 'name': 'sharpener'}, {'frequency': 'r', 'id': 956, 'synset': 'sharpie.n.03', 'synonyms': ['Sharpie'], 'def': 'a pen with indelible ink that will write on any surface', 'name': 'Sharpie'}, {'frequency': 'r', 'id': 957, 'synset': 'shaver.n.03', 'synonyms': ['shaver_(electric)', 'electric_shaver', 'electric_razor'], 'def': 'a razor powered by an electric motor', 'name': 'shaver_(electric)'}, {'frequency': 'c', 'id': 958, 'synset': 'shaving_cream.n.01', 'synonyms': ['shaving_cream', 'shaving_soap'], 'def': 'toiletry consisting that forms a rich lather for softening the beard before shaving', 'name': 'shaving_cream'}, {'frequency': 'r', 'id': 959, 'synset': 'shawl.n.01', 'synonyms': ['shawl'], 'def': 'cloak consisting of an oblong piece of cloth used to cover the head and shoulders', 'name': 'shawl'}, {'frequency': 'r', 'id': 960, 'synset': 'shears.n.01', 'synonyms': ['shears'], 'def': 'large scissors with strong blades', 'name': 'shears'}, {'frequency': 'f', 'id': 961, 'synset': 'sheep.n.01', 'synonyms': ['sheep'], 'def': 'woolly usually horned ruminant mammal related to the goat', 'name': 'sheep'}, {'frequency': 'r', 'id': 962, 'synset': 'shepherd_dog.n.01', 'synonyms': ['shepherd_dog', 'sheepdog'], 'def': 'any of various usually long-haired breeds of dog reared to herd and guard sheep', 'name': 'shepherd_dog'}, {'frequency': 'r', 'id': 963, 'synset': 'sherbert.n.01', 'synonyms': ['sherbert', 'sherbet'], 'def': 'a frozen dessert made primarily of fruit juice and sugar', 'name': 'sherbert'}, {'frequency': 'r', 'id': 964, 'synset': 'shield.n.02', 'synonyms': ['shield'], 'def': 'armor carried on the arm to intercept blows', 'name': 'shield'}, {'frequency': 'f', 'id': 965, 'synset': 'shirt.n.01', 'synonyms': ['shirt'], 'def': 'a garment worn on the upper half of the body', 'name': 'shirt'}, {'frequency': 'f', 'id': 966, 'synset': 'shoe.n.01', 'synonyms': ['shoe', 'sneaker_(type_of_shoe)', 'tennis_shoe'], 'def': 'common footwear covering the foot', 'name': 'shoe'}, {'frequency': 'c', 'id': 967, 'synset': 'shopping_bag.n.01', 'synonyms': ['shopping_bag'], 'def': 'a bag made of plastic or strong paper (often with handles); used to transport goods after shopping', 'name': 'shopping_bag'}, {'frequency': 'c', 'id': 968, 'synset': 'shopping_cart.n.01', 'synonyms': ['shopping_cart'], 'def': 'a handcart that holds groceries or other goods while shopping', 'name': 'shopping_cart'}, {'frequency': 'f', 'id': 969, 'synset': 'short_pants.n.01', 'synonyms': ['short_pants', 'shorts_(clothing)', 'trunks_(clothing)'], 'def': 'trousers that end at or above the knee', 'name': 'short_pants'}, {'frequency': 'r', 'id': 970, 'synset': 'shot_glass.n.01', 'synonyms': ['shot_glass'], 'def': 'a small glass adequate to hold a single swallow of whiskey', 'name': 'shot_glass'}, {'frequency': 'c', 'id': 971, 'synset': 'shoulder_bag.n.01', 'synonyms': ['shoulder_bag'], 'def': 'a large handbag that can be carried by a strap looped over the shoulder', 'name': 'shoulder_bag'}, {'frequency': 'c', 'id': 972, 'synset': 'shovel.n.01', 'synonyms': ['shovel'], 'def': 'a hand tool for lifting loose material such as snow, dirt, etc.', 'name': 'shovel'}, {'frequency': 'f', 'id': 973, 'synset': 'shower.n.01', 'synonyms': ['shower_head'], 'def': 'a plumbing fixture that sprays water over you', 'name': 'shower_head'}, {'frequency': 'f', 'id': 974, 'synset': 'shower_curtain.n.01', 'synonyms': ['shower_curtain'], 'def': 'a curtain that keeps water from splashing out of the shower area', 'name': 'shower_curtain'}, {'frequency': 'r', 'id': 975, 'synset': 'shredder.n.01', 'synonyms': ['shredder_(for_paper)'], 'def': 'a device that shreds documents', 'name': 'shredder_(for_paper)'}, {'frequency': 'r', 'id': 976, 'synset': 'sieve.n.01', 'synonyms': ['sieve', 'screen_(sieve)'], 'def': 'a strainer for separating lumps from powdered material or grading particles', 'name': 'sieve'}, {'frequency': 'f', 'id': 977, 'synset': 'signboard.n.01', 'synonyms': ['signboard'], 'def': 'structure displaying a board on which advertisements can be posted', 'name': 'signboard'}, {'frequency': 'c', 'id': 978, 'synset': 'silo.n.01', 'synonyms': ['silo'], 'def': 'a cylindrical tower used for storing goods', 'name': 'silo'}, {'frequency': 'f', 'id': 979, 'synset': 'sink.n.01', 'synonyms': ['sink'], 'def': 'plumbing fixture consisting of a water basin fixed to a wall or floor and having a drainpipe', 'name': 'sink'}, {'frequency': 'f', 'id': 980, 'synset': 'skateboard.n.01', 'synonyms': ['skateboard'], 'def': 'a board with wheels that is ridden in a standing or crouching position and propelled by foot', 'name': 'skateboard'}, {'frequency': 'c', 'id': 981, 'synset': 'skewer.n.01', 'synonyms': ['skewer'], 'def': 'a long pin for holding meat in position while it is being roasted', 'name': 'skewer'}, {'frequency': 'f', 'id': 982, 'synset': 'ski.n.01', 'synonyms': ['ski'], 'def': 'sports equipment for skiing on snow', 'name': 'ski'}, {'frequency': 'f', 'id': 983, 'synset': 'ski_boot.n.01', 'synonyms': ['ski_boot'], 'def': 'a stiff boot that is fastened to a ski with a ski binding', 'name': 'ski_boot'}, {'frequency': 'f', 'id': 984, 'synset': 'ski_parka.n.01', 'synonyms': ['ski_parka', 'ski_jacket'], 'def': 'a parka to be worn while skiing', 'name': 'ski_parka'}, {'frequency': 'f', 'id': 985, 'synset': 'ski_pole.n.01', 'synonyms': ['ski_pole'], 'def': 'a pole with metal points used as an aid in skiing', 'name': 'ski_pole'}, {'frequency': 'f', 'id': 986, 'synset': 'skirt.n.02', 'synonyms': ['skirt'], 'def': 'a garment hanging from the waist; worn mainly by girls and women', 'name': 'skirt'}, {'frequency': 'c', 'id': 987, 'synset': 'sled.n.01', 'synonyms': ['sled', 'sledge', 'sleigh'], 'def': 'a vehicle or flat object for transportation over snow by sliding or pulled by dogs, etc.', 'name': 'sled'}, {'frequency': 'c', 'id': 988, 'synset': 'sleeping_bag.n.01', 'synonyms': ['sleeping_bag'], 'def': 'large padded bag designed to be slept in outdoors', 'name': 'sleeping_bag'}, {'frequency': 'r', 'id': 989, 'synset': 'sling.n.05', 'synonyms': ['sling_(bandage)', 'triangular_bandage'], 'def': 'bandage to support an injured forearm; slung over the shoulder or neck', 'name': 'sling_(bandage)'}, {'frequency': 'c', 'id': 990, 'synset': 'slipper.n.01', 'synonyms': ['slipper_(footwear)', 'carpet_slipper_(footwear)'], 'def': 'low footwear that can be slipped on and off easily; usually worn indoors', 'name': 'slipper_(footwear)'}, {'frequency': 'r', 'id': 991, 'synset': 'smoothie.n.02', 'synonyms': ['smoothie'], 'def': 'a thick smooth drink consisting of fresh fruit pureed with ice cream or yoghurt or milk', 'name': 'smoothie'}, {'frequency': 'r', 'id': 992, 'synset': 'snake.n.01', 'synonyms': ['snake', 'serpent'], 'def': 'limbless scaly elongate reptile; some are venomous', 'name': 'snake'}, {'frequency': 'f', 'id': 993, 'synset': 'snowboard.n.01', 'synonyms': ['snowboard'], 'def': 'a board that resembles a broad ski or a small surfboard; used in a standing position to slide down snow-covered slopes', 'name': 'snowboard'}, {'frequency': 'c', 'id': 994, 'synset': 'snowman.n.01', 'synonyms': ['snowman'], 'def': 'a figure of a person made of packed snow', 'name': 'snowman'}, {'frequency': 'c', 'id': 995, 'synset': 'snowmobile.n.01', 'synonyms': ['snowmobile'], 'def': 'tracked vehicle for travel on snow having skis in front', 'name': 'snowmobile'}, {'frequency': 'f', 'id': 996, 'synset': 'soap.n.01', 'synonyms': ['soap'], 'def': 'a cleansing agent made from the salts of vegetable or animal fats', 'name': 'soap'}, {'frequency': 'f', 'id': 997, 'synset': 'soccer_ball.n.01', 'synonyms': ['soccer_ball'], 'def': "an inflated ball used in playing soccer (called `football' outside of the United States)", 'name': 'soccer_ball'}, {'frequency': 'f', 'id': 998, 'synset': 'sock.n.01', 'synonyms': ['sock'], 'def': 'cloth covering for the foot; worn inside the shoe; reaches to between the ankle and the knee', 'name': 'sock'}, {'frequency': 'r', 'id': 999, 'synset': 'soda_fountain.n.02', 'synonyms': ['soda_fountain'], 'def': 'an apparatus for dispensing soda water', 'name': 'soda_fountain'}, {'frequency': 'r', 'id': 1000, 'synset': 'soda_water.n.01', 'synonyms': ['carbonated_water', 'club_soda', 'seltzer', 'sparkling_water'], 'def': 'effervescent beverage artificially charged with carbon dioxide', 'name': 'carbonated_water'}, {'frequency': 'f', 'id': 1001, 'synset': 'sofa.n.01', 'synonyms': ['sofa', 'couch', 'lounge'], 'def': 'an upholstered seat for more than one person', 'name': 'sofa'}, {'frequency': 'r', 'id': 1002, 'synset': 'softball.n.01', 'synonyms': ['softball'], 'def': 'ball used in playing softball', 'name': 'softball'}, {'frequency': 'c', 'id': 1003, 'synset': 'solar_array.n.01', 'synonyms': ['solar_array', 'solar_battery', 'solar_panel'], 'def': 'electrical device consisting of a large array of connected solar cells', 'name': 'solar_array'}, {'frequency': 'r', 'id': 1004, 'synset': 'sombrero.n.02', 'synonyms': ['sombrero'], 'def': 'a straw hat with a tall crown and broad brim; worn in American southwest and in Mexico', 'name': 'sombrero'}, {'frequency': 'c', 'id': 1005, 'synset': 'soup.n.01', 'synonyms': ['soup'], 'def': 'liquid food especially of meat or fish or vegetable stock often containing pieces of solid food', 'name': 'soup'}, {'frequency': 'r', 'id': 1006, 'synset': 'soup_bowl.n.01', 'synonyms': ['soup_bowl'], 'def': 'a bowl for serving soup', 'name': 'soup_bowl'}, {'frequency': 'c', 'id': 1007, 'synset': 'soupspoon.n.01', 'synonyms': ['soupspoon'], 'def': 'a spoon with a rounded bowl for eating soup', 'name': 'soupspoon'}, {'frequency': 'c', 'id': 1008, 'synset': 'sour_cream.n.01', 'synonyms': ['sour_cream', 'soured_cream'], 'def': 'soured light cream', 'name': 'sour_cream'}, {'frequency': 'r', 'id': 1009, 'synset': 'soya_milk.n.01', 'synonyms': ['soya_milk', 'soybean_milk', 'soymilk'], 'def': 'a milk substitute containing soybean flour and water; used in some infant formulas and in making tofu', 'name': 'soya_milk'}, {'frequency': 'r', 'id': 1010, 'synset': 'space_shuttle.n.01', 'synonyms': ['space_shuttle'], 'def': "a reusable spacecraft with wings for a controlled descent through the Earth's atmosphere", 'name': 'space_shuttle'}, {'frequency': 'r', 'id': 1011, 'synset': 'sparkler.n.02', 'synonyms': ['sparkler_(fireworks)'], 'def': 'a firework that burns slowly and throws out a shower of sparks', 'name': 'sparkler_(fireworks)'}, {'frequency': 'f', 'id': 1012, 'synset': 'spatula.n.02', 'synonyms': ['spatula'], 'def': 'a hand tool with a thin flexible blade used to mix or spread soft substances', 'name': 'spatula'}, {'frequency': 'r', 'id': 1013, 'synset': 'spear.n.01', 'synonyms': ['spear', 'lance'], 'def': 'a long pointed rod used as a tool or weapon', 'name': 'spear'}, {'frequency': 'f', 'id': 1014, 'synset': 'spectacles.n.01', 'synonyms': ['spectacles', 'specs', 'eyeglasses', 'glasses'], 'def': 'optical instrument consisting of a frame that holds a pair of lenses for correcting defective vision', 'name': 'spectacles'}, {'frequency': 'c', 'id': 1015, 'synset': 'spice_rack.n.01', 'synonyms': ['spice_rack'], 'def': 'a rack for displaying containers filled with spices', 'name': 'spice_rack'}, {'frequency': 'r', 'id': 1016, 'synset': 'spider.n.01', 'synonyms': ['spider'], 'def': 'predatory arachnid with eight legs, two poison fangs, two feelers, and usually two silk-spinning organs at the back end of the body', 'name': 'spider'}, {'frequency': 'c', 'id': 1017, 'synset': 'sponge.n.01', 'synonyms': ['sponge'], 'def': 'a porous mass usable to absorb water typically used for cleaning', 'name': 'sponge'}, {'frequency': 'f', 'id': 1018, 'synset': 'spoon.n.01', 'synonyms': ['spoon'], 'def': 'a piece of cutlery with a shallow bowl-shaped container and a handle', 'name': 'spoon'}, {'frequency': 'c', 'id': 1019, 'synset': 'sportswear.n.01', 'synonyms': ['sportswear', 'athletic_wear', 'activewear'], 'def': 'attire worn for sport or for casual wear', 'name': 'sportswear'}, {'frequency': 'c', 'id': 1020, 'synset': 'spotlight.n.02', 'synonyms': ['spotlight'], 'def': 'a lamp that produces a strong beam of light to illuminate a restricted area; used to focus attention of a stage performer', 'name': 'spotlight'}, {'frequency': 'r', 'id': 1021, 'synset': 'squirrel.n.01', 'synonyms': ['squirrel'], 'def': 'a kind of arboreal rodent having a long bushy tail', 'name': 'squirrel'}, {'frequency': 'c', 'id': 1022, 'synset': 'stapler.n.01', 'synonyms': ['stapler_(stapling_machine)'], 'def': 'a machine that inserts staples into sheets of paper in order to fasten them together', 'name': 'stapler_(stapling_machine)'}, {'frequency': 'r', 'id': 1023, 'synset': 'starfish.n.01', 'synonyms': ['starfish', 'sea_star'], 'def': 'echinoderms characterized by five arms extending from a central disk', 'name': 'starfish'}, {'frequency': 'f', 'id': 1024, 'synset': 'statue.n.01', 'synonyms': ['statue_(sculpture)'], 'def': 'a sculpture representing a human or animal', 'name': 'statue_(sculpture)'}, {'frequency': 'c', 'id': 1025, 'synset': 'steak.n.01', 'synonyms': ['steak_(food)'], 'def': 'a slice of meat cut from the fleshy part of an animal or large fish', 'name': 'steak_(food)'}, {'frequency': 'r', 'id': 1026, 'synset': 'steak_knife.n.01', 'synonyms': ['steak_knife'], 'def': 'a sharp table knife used in eating steak', 'name': 'steak_knife'}, {'frequency': 'r', 'id': 1027, 'synset': 'steamer.n.02', 'synonyms': ['steamer_(kitchen_appliance)'], 'def': 'a cooking utensil that can be used to cook food by steaming it', 'name': 'steamer_(kitchen_appliance)'}, {'frequency': 'f', 'id': 1028, 'synset': 'steering_wheel.n.01', 'synonyms': ['steering_wheel'], 'def': 'a handwheel that is used for steering', 'name': 'steering_wheel'}, {'frequency': 'r', 'id': 1029, 'synset': 'stencil.n.01', 'synonyms': ['stencil'], 'def': 'a sheet of material (metal, plastic, etc.) that has been perforated with a pattern; ink or paint can pass through the perforations to create the printed pattern on the surface below', 'name': 'stencil'}, {'frequency': 'r', 'id': 1030, 'synset': 'step_ladder.n.01', 'synonyms': ['stepladder'], 'def': 'a folding portable ladder hinged at the top', 'name': 'stepladder'}, {'frequency': 'c', 'id': 1031, 'synset': 'step_stool.n.01', 'synonyms': ['step_stool'], 'def': 'a stool that has one or two steps that fold under the seat', 'name': 'step_stool'}, {'frequency': 'c', 'id': 1032, 'synset': 'stereo.n.01', 'synonyms': ['stereo_(sound_system)'], 'def': 'electronic device for playing audio', 'name': 'stereo_(sound_system)'}, {'frequency': 'r', 'id': 1033, 'synset': 'stew.n.02', 'synonyms': ['stew'], 'def': 'food prepared by stewing especially meat or fish with vegetables', 'name': 'stew'}, {'frequency': 'r', 'id': 1034, 'synset': 'stirrer.n.02', 'synonyms': ['stirrer'], 'def': 'an implement used for stirring', 'name': 'stirrer'}, {'frequency': 'f', 'id': 1035, 'synset': 'stirrup.n.01', 'synonyms': ['stirrup'], 'def': "support consisting of metal loops into which rider's feet go", 'name': 'stirrup'}, {'frequency': 'c', 'id': 1036, 'synset': 'stocking.n.01', 'synonyms': ['stockings_(leg_wear)'], 'def': 'close-fitting hosiery to cover the foot and leg; come in matched pairs', 'name': 'stockings_(leg_wear)'}, {'frequency': 'f', 'id': 1037, 'synset': 'stool.n.01', 'synonyms': ['stool'], 'def': 'a simple seat without a back or arms', 'name': 'stool'}, {'frequency': 'f', 'id': 1038, 'synset': 'stop_sign.n.01', 'synonyms': ['stop_sign'], 'def': 'a traffic sign to notify drivers that they must come to a complete stop', 'name': 'stop_sign'}, {'frequency': 'f', 'id': 1039, 'synset': 'stoplight.n.01', 'synonyms': ['brake_light'], 'def': 'a red light on the rear of a motor vehicle that signals when the brakes are applied', 'name': 'brake_light'}, {'frequency': 'f', 'id': 1040, 'synset': 'stove.n.01', 'synonyms': ['stove', 'kitchen_stove', 'range_(kitchen_appliance)', 'kitchen_range', 'cooking_stove'], 'def': 'a kitchen appliance used for cooking food', 'name': 'stove'}, {'frequency': 'c', 'id': 1041, 'synset': 'strainer.n.01', 'synonyms': ['strainer'], 'def': 'a filter to retain larger pieces while smaller pieces and liquids pass through', 'name': 'strainer'}, {'frequency': 'f', 'id': 1042, 'synset': 'strap.n.01', 'synonyms': ['strap'], 'def': 'an elongated strip of material for binding things together or holding', 'name': 'strap'}, {'frequency': 'f', 'id': 1043, 'synset': 'straw.n.04', 'synonyms': ['straw_(for_drinking)', 'drinking_straw'], 'def': 'a thin paper or plastic tube used to suck liquids into the mouth', 'name': 'straw_(for_drinking)'}, {'frequency': 'f', 'id': 1044, 'synset': 'strawberry.n.01', 'synonyms': ['strawberry'], 'def': 'sweet fleshy red fruit', 'name': 'strawberry'}, {'frequency': 'f', 'id': 1045, 'synset': 'street_sign.n.01', 'synonyms': ['street_sign'], 'def': 'a sign visible from the street', 'name': 'street_sign'}, {'frequency': 'f', 'id': 1046, 'synset': 'streetlight.n.01', 'synonyms': ['streetlight', 'street_lamp'], 'def': 'a lamp supported on a lamppost; for illuminating a street', 'name': 'streetlight'}, {'frequency': 'r', 'id': 1047, 'synset': 'string_cheese.n.01', 'synonyms': ['string_cheese'], 'def': 'cheese formed in long strings twisted together', 'name': 'string_cheese'}, {'frequency': 'r', 'id': 1048, 'synset': 'stylus.n.02', 'synonyms': ['stylus'], 'def': 'a pointed tool for writing or drawing or engraving', 'name': 'stylus'}, {'frequency': 'r', 'id': 1049, 'synset': 'subwoofer.n.01', 'synonyms': ['subwoofer'], 'def': 'a loudspeaker that is designed to reproduce very low bass frequencies', 'name': 'subwoofer'}, {'frequency': 'r', 'id': 1050, 'synset': 'sugar_bowl.n.01', 'synonyms': ['sugar_bowl'], 'def': 'a dish in which sugar is served', 'name': 'sugar_bowl'}, {'frequency': 'r', 'id': 1051, 'synset': 'sugarcane.n.01', 'synonyms': ['sugarcane_(plant)'], 'def': 'juicy canes whose sap is a source of molasses and commercial sugar; fresh canes are sometimes chewed for the juice', 'name': 'sugarcane_(plant)'}, {'frequency': 'c', 'id': 1052, 'synset': 'suit.n.01', 'synonyms': ['suit_(clothing)'], 'def': 'a set of garments (usually including a jacket and trousers or skirt) for outerwear all of the same fabric and color', 'name': 'suit_(clothing)'}, {'frequency': 'c', 'id': 1053, 'synset': 'sunflower.n.01', 'synonyms': ['sunflower'], 'def': 'any plant of the genus Helianthus having large flower heads with dark disk florets and showy yellow rays', 'name': 'sunflower'}, {'frequency': 'f', 'id': 1054, 'synset': 'sunglasses.n.01', 'synonyms': ['sunglasses'], 'def': 'spectacles that are darkened or polarized to protect the eyes from the glare of the sun', 'name': 'sunglasses'}, {'frequency': 'c', 'id': 1055, 'synset': 'sunhat.n.01', 'synonyms': ['sunhat'], 'def': 'a hat with a broad brim that protects the face from direct exposure to the sun', 'name': 'sunhat'}, {'frequency': 'r', 'id': 1056, 'synset': 'sunscreen.n.01', 'synonyms': ['sunscreen', 'sunblock'], 'def': 'a cream spread on the skin; contains a chemical to filter out ultraviolet light and so protect from sunburn', 'name': 'sunscreen'}, {'frequency': 'f', 'id': 1057, 'synset': 'surfboard.n.01', 'synonyms': ['surfboard'], 'def': 'a narrow buoyant board for riding surf', 'name': 'surfboard'}, {'frequency': 'c', 'id': 1058, 'synset': 'sushi.n.01', 'synonyms': ['sushi'], 'def': 'rice (with raw fish) wrapped in seaweed', 'name': 'sushi'}, {'frequency': 'c', 'id': 1059, 'synset': 'swab.n.02', 'synonyms': ['mop'], 'def': 'cleaning implement consisting of absorbent material fastened to a handle; for cleaning floors', 'name': 'mop'}, {'frequency': 'c', 'id': 1060, 'synset': 'sweat_pants.n.01', 'synonyms': ['sweat_pants'], 'def': 'loose-fitting trousers with elastic cuffs; worn by athletes', 'name': 'sweat_pants'}, {'frequency': 'c', 'id': 1061, 'synset': 'sweatband.n.02', 'synonyms': ['sweatband'], 'def': 'a band of material tied around the forehead or wrist to absorb sweat', 'name': 'sweatband'}, {'frequency': 'f', 'id': 1062, 'synset': 'sweater.n.01', 'synonyms': ['sweater'], 'def': 'a crocheted or knitted garment covering the upper part of the body', 'name': 'sweater'}, {'frequency': 'f', 'id': 1063, 'synset': 'sweatshirt.n.01', 'synonyms': ['sweatshirt'], 'def': 'cotton knit pullover with long sleeves worn during athletic activity', 'name': 'sweatshirt'}, {'frequency': 'c', 'id': 1064, 'synset': 'sweet_potato.n.02', 'synonyms': ['sweet_potato'], 'def': 'the edible tuberous root of the sweet potato vine', 'name': 'sweet_potato'}, {'frequency': 'f', 'id': 1065, 'synset': 'swimsuit.n.01', 'synonyms': ['swimsuit', 'swimwear', 'bathing_suit', 'swimming_costume', 'bathing_costume', 'swimming_trunks', 'bathing_trunks'], 'def': 'garment worn for swimming', 'name': 'swimsuit'}, {'frequency': 'c', 'id': 1066, 'synset': 'sword.n.01', 'synonyms': ['sword'], 'def': 'a cutting or thrusting weapon that has a long metal blade', 'name': 'sword'}, {'frequency': 'r', 'id': 1067, 'synset': 'syringe.n.01', 'synonyms': ['syringe'], 'def': 'a medical instrument used to inject or withdraw fluids', 'name': 'syringe'}, {'frequency': 'r', 'id': 1068, 'synset': 'tabasco.n.02', 'synonyms': ['Tabasco_sauce'], 'def': 'very spicy sauce (trade name Tabasco) made from fully-aged red peppers', 'name': 'Tabasco_sauce'}, {'frequency': 'r', 'id': 1069, 'synset': 'table-tennis_table.n.01', 'synonyms': ['table-tennis_table', 'ping-pong_table'], 'def': 'a table used for playing table tennis', 'name': 'table-tennis_table'}, {'frequency': 'f', 'id': 1070, 'synset': 'table.n.02', 'synonyms': ['table'], 'def': 'a piece of furniture having a smooth flat top that is usually supported by one or more vertical legs', 'name': 'table'}, {'frequency': 'c', 'id': 1071, 'synset': 'table_lamp.n.01', 'synonyms': ['table_lamp'], 'def': 'a lamp that sits on a table', 'name': 'table_lamp'}, {'frequency': 'f', 'id': 1072, 'synset': 'tablecloth.n.01', 'synonyms': ['tablecloth'], 'def': 'a covering spread over a dining table', 'name': 'tablecloth'}, {'frequency': 'r', 'id': 1073, 'synset': 'tachometer.n.01', 'synonyms': ['tachometer'], 'def': 'measuring instrument for indicating speed of rotation', 'name': 'tachometer'}, {'frequency': 'r', 'id': 1074, 'synset': 'taco.n.02', 'synonyms': ['taco'], 'def': 'a small tortilla cupped around a filling', 'name': 'taco'}, {'frequency': 'f', 'id': 1075, 'synset': 'tag.n.02', 'synonyms': ['tag'], 'def': 'a label associated with something for the purpose of identification or information', 'name': 'tag'}, {'frequency': 'f', 'id': 1076, 'synset': 'taillight.n.01', 'synonyms': ['taillight', 'rear_light'], 'def': 'lamp (usually red) mounted at the rear of a motor vehicle', 'name': 'taillight'}, {'frequency': 'r', 'id': 1077, 'synset': 'tambourine.n.01', 'synonyms': ['tambourine'], 'def': 'a shallow drum with a single drumhead and with metallic disks in the sides', 'name': 'tambourine'}, {'frequency': 'r', 'id': 1078, 'synset': 'tank.n.01', 'synonyms': ['army_tank', 'armored_combat_vehicle', 'armoured_combat_vehicle'], 'def': 'an enclosed armored military vehicle; has a cannon and moves on caterpillar treads', 'name': 'army_tank'}, {'frequency': 'c', 'id': 1079, 'synset': 'tank.n.02', 'synonyms': ['tank_(storage_vessel)', 'storage_tank'], 'def': 'a large (usually metallic) vessel for holding gases or liquids', 'name': 'tank_(storage_vessel)'}, {'frequency': 'f', 'id': 1080, 'synset': 'tank_top.n.01', 'synonyms': ['tank_top_(clothing)'], 'def': 'a tight-fitting sleeveless shirt with wide shoulder straps and low neck and no front opening', 'name': 'tank_top_(clothing)'}, {'frequency': 'c', 'id': 1081, 'synset': 'tape.n.01', 'synonyms': ['tape_(sticky_cloth_or_paper)'], 'def': 'a long thin piece of cloth or paper as used for binding or fastening', 'name': 'tape_(sticky_cloth_or_paper)'}, {'frequency': 'c', 'id': 1082, 'synset': 'tape.n.04', 'synonyms': ['tape_measure', 'measuring_tape'], 'def': 'measuring instrument consisting of a narrow strip (cloth or metal) marked in inches or centimeters and used for measuring lengths', 'name': 'tape_measure'}, {'frequency': 'c', 'id': 1083, 'synset': 'tapestry.n.02', 'synonyms': ['tapestry'], 'def': 'a heavy textile with a woven design; used for curtains and upholstery', 'name': 'tapestry'}, {'frequency': 'f', 'id': 1084, 'synset': 'tarpaulin.n.01', 'synonyms': ['tarp'], 'def': 'waterproofed canvas', 'name': 'tarp'}, {'frequency': 'c', 'id': 1085, 'synset': 'tartan.n.01', 'synonyms': ['tartan', 'plaid'], 'def': 'a cloth having a crisscross design', 'name': 'tartan'}, {'frequency': 'c', 'id': 1086, 'synset': 'tassel.n.01', 'synonyms': ['tassel'], 'def': 'adornment consisting of a bunch of cords fastened at one end', 'name': 'tassel'}, {'frequency': 'r', 'id': 1087, 'synset': 'tea_bag.n.01', 'synonyms': ['tea_bag'], 'def': 'a measured amount of tea in a bag for an individual serving of tea', 'name': 'tea_bag'}, {'frequency': 'c', 'id': 1088, 'synset': 'teacup.n.02', 'synonyms': ['teacup'], 'def': 'a cup from which tea is drunk', 'name': 'teacup'}, {'frequency': 'c', 'id': 1089, 'synset': 'teakettle.n.01', 'synonyms': ['teakettle'], 'def': 'kettle for boiling water to make tea', 'name': 'teakettle'}, {'frequency': 'c', 'id': 1090, 'synset': 'teapot.n.01', 'synonyms': ['teapot'], 'def': 'pot for brewing tea; usually has a spout and handle', 'name': 'teapot'}, {'frequency': 'f', 'id': 1091, 'synset': 'teddy.n.01', 'synonyms': ['teddy_bear'], 'def': "plaything consisting of a child's toy bear (usually plush and stuffed with soft materials)", 'name': 'teddy_bear'}, {'frequency': 'f', 'id': 1092, 'synset': 'telephone.n.01', 'synonyms': ['telephone', 'phone', 'telephone_set'], 'def': 'electronic device for communicating by voice over long distances', 'name': 'telephone'}, {'frequency': 'c', 'id': 1093, 'synset': 'telephone_booth.n.01', 'synonyms': ['telephone_booth', 'phone_booth', 'call_box', 'telephone_box', 'telephone_kiosk'], 'def': 'booth for using a telephone', 'name': 'telephone_booth'}, {'frequency': 'f', 'id': 1094, 'synset': 'telephone_pole.n.01', 'synonyms': ['telephone_pole', 'telegraph_pole', 'telegraph_post'], 'def': 'tall pole supporting telephone wires', 'name': 'telephone_pole'}, {'frequency': 'r', 'id': 1095, 'synset': 'telephoto_lens.n.01', 'synonyms': ['telephoto_lens', 'zoom_lens'], 'def': 'a camera lens that magnifies the image', 'name': 'telephoto_lens'}, {'frequency': 'c', 'id': 1096, 'synset': 'television_camera.n.01', 'synonyms': ['television_camera', 'tv_camera'], 'def': 'television equipment for capturing and recording video', 'name': 'television_camera'}, {'frequency': 'f', 'id': 1097, 'synset': 'television_receiver.n.01', 'synonyms': ['television_set', 'tv', 'tv_set'], 'def': 'an electronic device that receives television signals and displays them on a screen', 'name': 'television_set'}, {'frequency': 'f', 'id': 1098, 'synset': 'tennis_ball.n.01', 'synonyms': ['tennis_ball'], 'def': 'ball about the size of a fist used in playing tennis', 'name': 'tennis_ball'}, {'frequency': 'f', 'id': 1099, 'synset': 'tennis_racket.n.01', 'synonyms': ['tennis_racket'], 'def': 'a racket used to play tennis', 'name': 'tennis_racket'}, {'frequency': 'r', 'id': 1100, 'synset': 'tequila.n.01', 'synonyms': ['tequila'], 'def': 'Mexican liquor made from fermented juices of an agave plant', 'name': 'tequila'}, {'frequency': 'c', 'id': 1101, 'synset': 'thermometer.n.01', 'synonyms': ['thermometer'], 'def': 'measuring instrument for measuring temperature', 'name': 'thermometer'}, {'frequency': 'c', 'id': 1102, 'synset': 'thermos.n.01', 'synonyms': ['thermos_bottle'], 'def': 'vacuum flask that preserves temperature of hot or cold drinks', 'name': 'thermos_bottle'}, {'frequency': 'c', 'id': 1103, 'synset': 'thermostat.n.01', 'synonyms': ['thermostat'], 'def': 'a regulator for automatically regulating temperature by starting or stopping the supply of heat', 'name': 'thermostat'}, {'frequency': 'r', 'id': 1104, 'synset': 'thimble.n.02', 'synonyms': ['thimble'], 'def': 'a small metal cap to protect the finger while sewing; can be used as a small container', 'name': 'thimble'}, {'frequency': 'c', 'id': 1105, 'synset': 'thread.n.01', 'synonyms': ['thread', 'yarn'], 'def': 'a fine cord of twisted fibers (of cotton or silk or wool or nylon etc.) used in sewing and weaving', 'name': 'thread'}, {'frequency': 'c', 'id': 1106, 'synset': 'thumbtack.n.01', 'synonyms': ['thumbtack', 'drawing_pin', 'pushpin'], 'def': 'a tack for attaching papers to a bulletin board or drawing board', 'name': 'thumbtack'}, {'frequency': 'c', 'id': 1107, 'synset': 'tiara.n.01', 'synonyms': ['tiara'], 'def': 'a jeweled headdress worn by women on formal occasions', 'name': 'tiara'}, {'frequency': 'c', 'id': 1108, 'synset': 'tiger.n.02', 'synonyms': ['tiger'], 'def': 'large feline of forests in most of Asia having a tawny coat with black stripes', 'name': 'tiger'}, {'frequency': 'c', 'id': 1109, 'synset': 'tights.n.01', 'synonyms': ['tights_(clothing)', 'leotards'], 'def': 'skintight knit hose covering the body from the waist to the feet worn by acrobats and dancers and as stockings by women and girls', 'name': 'tights_(clothing)'}, {'frequency': 'c', 'id': 1110, 'synset': 'timer.n.01', 'synonyms': ['timer', 'stopwatch'], 'def': 'a timepiece that measures a time interval and signals its end', 'name': 'timer'}, {'frequency': 'f', 'id': 1111, 'synset': 'tinfoil.n.01', 'synonyms': ['tinfoil'], 'def': 'foil made of tin or an alloy of tin and lead', 'name': 'tinfoil'}, {'frequency': 'r', 'id': 1112, 'synset': 'tinsel.n.01', 'synonyms': ['tinsel'], 'def': 'a showy decoration that is basically valueless', 'name': 'tinsel'}, {'frequency': 'f', 'id': 1113, 'synset': 'tissue.n.02', 'synonyms': ['tissue_paper'], 'def': 'a soft thin (usually translucent) paper', 'name': 'tissue_paper'}, {'frequency': 'c', 'id': 1114, 'synset': 'toast.n.01', 'synonyms': ['toast_(food)'], 'def': 'slice of bread that has been toasted', 'name': 'toast_(food)'}, {'frequency': 'f', 'id': 1115, 'synset': 'toaster.n.02', 'synonyms': ['toaster'], 'def': 'a kitchen appliance (usually electric) for toasting bread', 'name': 'toaster'}, {'frequency': 'c', 'id': 1116, 'synset': 'toaster_oven.n.01', 'synonyms': ['toaster_oven'], 'def': 'kitchen appliance consisting of a small electric oven for toasting or warming food', 'name': 'toaster_oven'}, {'frequency': 'f', 'id': 1117, 'synset': 'toilet.n.02', 'synonyms': ['toilet'], 'def': 'a plumbing fixture for defecation and urination', 'name': 'toilet'}, {'frequency': 'f', 'id': 1118, 'synset': 'toilet_tissue.n.01', 'synonyms': ['toilet_tissue', 'toilet_paper', 'bathroom_tissue'], 'def': 'a soft thin absorbent paper for use in toilets', 'name': 'toilet_tissue'}, {'frequency': 'f', 'id': 1119, 'synset': 'tomato.n.01', 'synonyms': ['tomato'], 'def': 'mildly acid red or yellow pulpy fruit eaten as a vegetable', 'name': 'tomato'}, {'frequency': 'c', 'id': 1120, 'synset': 'tongs.n.01', 'synonyms': ['tongs'], 'def': 'any of various devices for taking hold of objects; usually have two hinged legs with handles above and pointed hooks below', 'name': 'tongs'}, {'frequency': 'c', 'id': 1121, 'synset': 'toolbox.n.01', 'synonyms': ['toolbox'], 'def': 'a box or chest or cabinet for holding hand tools', 'name': 'toolbox'}, {'frequency': 'f', 'id': 1122, 'synset': 'toothbrush.n.01', 'synonyms': ['toothbrush'], 'def': 'small brush; has long handle; used to clean teeth', 'name': 'toothbrush'}, {'frequency': 'f', 'id': 1123, 'synset': 'toothpaste.n.01', 'synonyms': ['toothpaste'], 'def': 'a dentifrice in the form of a paste', 'name': 'toothpaste'}, {'frequency': 'c', 'id': 1124, 'synset': 'toothpick.n.01', 'synonyms': ['toothpick'], 'def': 'pick consisting of a small strip of wood or plastic; used to pick food from between the teeth', 'name': 'toothpick'}, {'frequency': 'c', 'id': 1125, 'synset': 'top.n.09', 'synonyms': ['cover'], 'def': 'covering for a hole (especially a hole in the top of a container)', 'name': 'cover'}, {'frequency': 'c', 'id': 1126, 'synset': 'tortilla.n.01', 'synonyms': ['tortilla'], 'def': 'thin unleavened pancake made from cornmeal or wheat flour', 'name': 'tortilla'}, {'frequency': 'c', 'id': 1127, 'synset': 'tow_truck.n.01', 'synonyms': ['tow_truck'], 'def': 'a truck equipped to hoist and pull wrecked cars (or to remove cars from no-parking zones)', 'name': 'tow_truck'}, {'frequency': 'f', 'id': 1128, 'synset': 'towel.n.01', 'synonyms': ['towel'], 'def': 'a rectangular piece of absorbent cloth (or paper) for drying or wiping', 'name': 'towel'}, {'frequency': 'f', 'id': 1129, 'synset': 'towel_rack.n.01', 'synonyms': ['towel_rack', 'towel_rail', 'towel_bar'], 'def': 'a rack consisting of one or more bars on which towels can be hung', 'name': 'towel_rack'}, {'frequency': 'f', 'id': 1130, 'synset': 'toy.n.03', 'synonyms': ['toy'], 'def': 'a device regarded as providing amusement', 'name': 'toy'}, {'frequency': 'c', 'id': 1131, 'synset': 'tractor.n.01', 'synonyms': ['tractor_(farm_equipment)'], 'def': 'a wheeled vehicle with large wheels; used in farming and other applications', 'name': 'tractor_(farm_equipment)'}, {'frequency': 'f', 'id': 1132, 'synset': 'traffic_light.n.01', 'synonyms': ['traffic_light'], 'def': 'a device to control vehicle traffic often consisting of three or more lights', 'name': 'traffic_light'}, {'frequency': 'r', 'id': 1133, 'synset': 'trail_bike.n.01', 'synonyms': ['dirt_bike'], 'def': 'a lightweight motorcycle equipped with rugged tires and suspension for off-road use', 'name': 'dirt_bike'}, {'frequency': 'c', 'id': 1134, 'synset': 'trailer_truck.n.01', 'synonyms': ['trailer_truck', 'tractor_trailer', 'trucking_rig', 'articulated_lorry', 'semi_truck'], 'def': 'a truck consisting of a tractor and trailer together', 'name': 'trailer_truck'}, {'frequency': 'f', 'id': 1135, 'synset': 'train.n.01', 'synonyms': ['train_(railroad_vehicle)', 'railroad_train'], 'def': 'public or private transport provided by a line of railway cars coupled together and drawn by a locomotive', 'name': 'train_(railroad_vehicle)'}, {'frequency': 'r', 'id': 1136, 'synset': 'trampoline.n.01', 'synonyms': ['trampoline'], 'def': 'gymnastic apparatus consisting of a strong canvas sheet attached with springs to a metal frame', 'name': 'trampoline'}, {'frequency': 'f', 'id': 1137, 'synset': 'tray.n.01', 'synonyms': ['tray'], 'def': 'an open receptacle for holding or displaying or serving articles or food', 'name': 'tray'}, {'frequency': 'r', 'id': 1138, 'synset': 'tree_house.n.01', 'synonyms': ['tree_house'], 'def': '(NOT A TREE) a PLAYHOUSE built in the branches of a tree', 'name': 'tree_house'}, {'frequency': 'r', 'id': 1139, 'synset': 'trench_coat.n.01', 'synonyms': ['trench_coat'], 'def': 'a military style raincoat; belted with deep pockets', 'name': 'trench_coat'}, {'frequency': 'r', 'id': 1140, 'synset': 'triangle.n.05', 'synonyms': ['triangle_(musical_instrument)'], 'def': 'a percussion instrument consisting of a metal bar bent in the shape of an open triangle', 'name': 'triangle_(musical_instrument)'}, {'frequency': 'r', 'id': 1141, 'synset': 'tricycle.n.01', 'synonyms': ['tricycle'], 'def': 'a vehicle with three wheels that is moved by foot pedals', 'name': 'tricycle'}, {'frequency': 'c', 'id': 1142, 'synset': 'tripod.n.01', 'synonyms': ['tripod'], 'def': 'a three-legged rack used for support', 'name': 'tripod'}, {'frequency': 'f', 'id': 1143, 'synset': 'trouser.n.01', 'synonyms': ['trousers', 'pants_(clothing)'], 'def': 'a garment extending from the waist to the knee or ankle, covering each leg separately', 'name': 'trousers'}, {'frequency': 'f', 'id': 1144, 'synset': 'truck.n.01', 'synonyms': ['truck'], 'def': 'an automotive vehicle suitable for hauling', 'name': 'truck'}, {'frequency': 'r', 'id': 1145, 'synset': 'truffle.n.03', 'synonyms': ['truffle_(chocolate)', 'chocolate_truffle'], 'def': 'creamy chocolate candy', 'name': 'truffle_(chocolate)'}, {'frequency': 'c', 'id': 1146, 'synset': 'trunk.n.02', 'synonyms': ['trunk'], 'def': 'luggage consisting of a large strong case used when traveling or for storage', 'name': 'trunk'}, {'frequency': 'r', 'id': 1147, 'synset': 'tub.n.02', 'synonyms': ['vat'], 'def': 'a large open vessel for holding or storing liquids', 'name': 'vat'}, {'frequency': 'c', 'id': 1148, 'synset': 'turban.n.01', 'synonyms': ['turban'], 'def': 'a traditional headdress consisting of a long scarf wrapped around the head', 'name': 'turban'}, {'frequency': 'r', 'id': 1149, 'synset': 'turkey.n.01', 'synonyms': ['turkey_(bird)'], 'def': 'large gallinaceous bird with fan-shaped tail; widely domesticated for food', 'name': 'turkey_(bird)'}, {'frequency': 'c', 'id': 1150, 'synset': 'turkey.n.04', 'synonyms': ['turkey_(food)'], 'def': 'flesh of large domesticated fowl usually roasted', 'name': 'turkey_(food)'}, {'frequency': 'r', 'id': 1151, 'synset': 'turnip.n.01', 'synonyms': ['turnip'], 'def': 'widely cultivated plant having a large fleshy edible white or yellow root', 'name': 'turnip'}, {'frequency': 'c', 'id': 1152, 'synset': 'turtle.n.02', 'synonyms': ['turtle'], 'def': 'any of various aquatic and land reptiles having a bony shell and flipper-like limbs for swimming', 'name': 'turtle'}, {'frequency': 'r', 'id': 1153, 'synset': 'turtleneck.n.01', 'synonyms': ['turtleneck_(clothing)', 'polo-neck'], 'def': 'a sweater or jersey with a high close-fitting collar', 'name': 'turtleneck_(clothing)'}, {'frequency': 'r', 'id': 1154, 'synset': 'typewriter.n.01', 'synonyms': ['typewriter'], 'def': 'hand-operated character printer for printing written messages one character at a time', 'name': 'typewriter'}, {'frequency': 'f', 'id': 1155, 'synset': 'umbrella.n.01', 'synonyms': ['umbrella'], 'def': 'a lightweight handheld collapsible canopy', 'name': 'umbrella'}, {'frequency': 'c', 'id': 1156, 'synset': 'underwear.n.01', 'synonyms': ['underwear', 'underclothes', 'underclothing', 'underpants'], 'def': 'undergarment worn next to the skin and under the outer garments', 'name': 'underwear'}, {'frequency': 'r', 'id': 1157, 'synset': 'unicycle.n.01', 'synonyms': ['unicycle'], 'def': 'a vehicle with a single wheel that is driven by pedals', 'name': 'unicycle'}, {'frequency': 'c', 'id': 1158, 'synset': 'urinal.n.01', 'synonyms': ['urinal'], 'def': 'a plumbing fixture (usually attached to the wall) used by men to urinate', 'name': 'urinal'}, {'frequency': 'r', 'id': 1159, 'synset': 'urn.n.01', 'synonyms': ['urn'], 'def': 'a large vase that usually has a pedestal or feet', 'name': 'urn'}, {'frequency': 'c', 'id': 1160, 'synset': 'vacuum.n.04', 'synonyms': ['vacuum_cleaner'], 'def': 'an electrical home appliance that cleans by suction', 'name': 'vacuum_cleaner'}, {'frequency': 'c', 'id': 1161, 'synset': 'valve.n.03', 'synonyms': ['valve'], 'def': 'control consisting of a mechanical device for controlling the flow of a fluid', 'name': 'valve'}, {'frequency': 'f', 'id': 1162, 'synset': 'vase.n.01', 'synonyms': ['vase'], 'def': 'an open jar of glass or porcelain used as an ornament or to hold flowers', 'name': 'vase'}, {'frequency': 'c', 'id': 1163, 'synset': 'vending_machine.n.01', 'synonyms': ['vending_machine'], 'def': 'a slot machine for selling goods', 'name': 'vending_machine'}, {'frequency': 'f', 'id': 1164, 'synset': 'vent.n.01', 'synonyms': ['vent', 'blowhole', 'air_vent'], 'def': 'a hole for the escape of gas or air', 'name': 'vent'}, {'frequency': 'c', 'id': 1165, 'synset': 'videotape.n.01', 'synonyms': ['videotape'], 'def': 'a video recording made on magnetic tape', 'name': 'videotape'}, {'frequency': 'r', 'id': 1166, 'synset': 'vinegar.n.01', 'synonyms': ['vinegar'], 'def': 'sour-tasting liquid produced usually by oxidation of the alcohol in wine or cider and used as a condiment or food preservative', 'name': 'vinegar'}, {'frequency': 'r', 'id': 1167, 'synset': 'violin.n.01', 'synonyms': ['violin', 'fiddle'], 'def': 'bowed stringed instrument that is the highest member of the violin family', 'name': 'violin'}, {'frequency': 'r', 'id': 1168, 'synset': 'vodka.n.01', 'synonyms': ['vodka'], 'def': 'unaged colorless liquor originating in Russia', 'name': 'vodka'}, {'frequency': 'r', 'id': 1169, 'synset': 'volleyball.n.02', 'synonyms': ['volleyball'], 'def': 'an inflated ball used in playing volleyball', 'name': 'volleyball'}, {'frequency': 'r', 'id': 1170, 'synset': 'vulture.n.01', 'synonyms': ['vulture'], 'def': 'any of various large birds of prey having naked heads and weak claws and feeding chiefly on carrion', 'name': 'vulture'}, {'frequency': 'c', 'id': 1171, 'synset': 'waffle.n.01', 'synonyms': ['waffle'], 'def': 'pancake batter baked in a waffle iron', 'name': 'waffle'}, {'frequency': 'r', 'id': 1172, 'synset': 'waffle_iron.n.01', 'synonyms': ['waffle_iron'], 'def': 'a kitchen appliance for baking waffles', 'name': 'waffle_iron'}, {'frequency': 'c', 'id': 1173, 'synset': 'wagon.n.01', 'synonyms': ['wagon'], 'def': 'any of various kinds of wheeled vehicles drawn by an animal or a tractor', 'name': 'wagon'}, {'frequency': 'c', 'id': 1174, 'synset': 'wagon_wheel.n.01', 'synonyms': ['wagon_wheel'], 'def': 'a wheel of a wagon', 'name': 'wagon_wheel'}, {'frequency': 'c', 'id': 1175, 'synset': 'walking_stick.n.01', 'synonyms': ['walking_stick'], 'def': 'a stick carried in the hand for support in walking', 'name': 'walking_stick'}, {'frequency': 'c', 'id': 1176, 'synset': 'wall_clock.n.01', 'synonyms': ['wall_clock'], 'def': 'a clock mounted on a wall', 'name': 'wall_clock'}, {'frequency': 'f', 'id': 1177, 'synset': 'wall_socket.n.01', 'synonyms': ['wall_socket', 'wall_plug', 'electric_outlet', 'electrical_outlet', 'outlet', 'electric_receptacle'], 'def': 'receptacle providing a place in a wiring system where current can be taken to run electrical devices', 'name': 'wall_socket'}, {'frequency': 'c', 'id': 1178, 'synset': 'wallet.n.01', 'synonyms': ['wallet', 'billfold'], 'def': 'a pocket-size case for holding papers and paper money', 'name': 'wallet'}, {'frequency': 'r', 'id': 1179, 'synset': 'walrus.n.01', 'synonyms': ['walrus'], 'def': 'either of two large northern marine mammals having ivory tusks and tough hide over thick blubber', 'name': 'walrus'}, {'frequency': 'r', 'id': 1180, 'synset': 'wardrobe.n.01', 'synonyms': ['wardrobe'], 'def': 'a tall piece of furniture that provides storage space for clothes; has a door and rails or hooks for hanging clothes', 'name': 'wardrobe'}, {'frequency': 'r', 'id': 1181, 'synset': 'wasabi.n.02', 'synonyms': ['wasabi'], 'def': 'the thick green root of the wasabi plant that the Japanese use in cooking and that tastes like strong horseradish', 'name': 'wasabi'}, {'frequency': 'c', 'id': 1182, 'synset': 'washer.n.03', 'synonyms': ['automatic_washer', 'washing_machine'], 'def': 'a home appliance for washing clothes and linens automatically', 'name': 'automatic_washer'}, {'frequency': 'f', 'id': 1183, 'synset': 'watch.n.01', 'synonyms': ['watch', 'wristwatch'], 'def': 'a small, portable timepiece', 'name': 'watch'}, {'frequency': 'f', 'id': 1184, 'synset': 'water_bottle.n.01', 'synonyms': ['water_bottle'], 'def': 'a bottle for holding water', 'name': 'water_bottle'}, {'frequency': 'c', 'id': 1185, 'synset': 'water_cooler.n.01', 'synonyms': ['water_cooler'], 'def': 'a device for cooling and dispensing drinking water', 'name': 'water_cooler'}, {'frequency': 'c', 'id': 1186, 'synset': 'water_faucet.n.01', 'synonyms': ['water_faucet', 'water_tap', 'tap_(water_faucet)'], 'def': 'a faucet for drawing water from a pipe or cask', 'name': 'water_faucet'}, {'frequency': 'r', 'id': 1187, 'synset': 'water_filter.n.01', 'synonyms': ['water_filter'], 'def': 'a filter to remove impurities from the water supply', 'name': 'water_filter'}, {'frequency': 'r', 'id': 1188, 'synset': 'water_heater.n.01', 'synonyms': ['water_heater', 'hot-water_heater'], 'def': 'a heater and storage tank to supply heated water', 'name': 'water_heater'}, {'frequency': 'r', 'id': 1189, 'synset': 'water_jug.n.01', 'synonyms': ['water_jug'], 'def': 'a jug that holds water', 'name': 'water_jug'}, {'frequency': 'r', 'id': 1190, 'synset': 'water_pistol.n.01', 'synonyms': ['water_gun', 'squirt_gun'], 'def': 'plaything consisting of a toy pistol that squirts water', 'name': 'water_gun'}, {'frequency': 'c', 'id': 1191, 'synset': 'water_scooter.n.01', 'synonyms': ['water_scooter', 'sea_scooter', 'jet_ski'], 'def': 'a motorboat resembling a motor scooter (NOT A SURFBOARD OR WATER SKI)', 'name': 'water_scooter'}, {'frequency': 'c', 'id': 1192, 'synset': 'water_ski.n.01', 'synonyms': ['water_ski'], 'def': 'broad ski for skimming over water towed by a speedboat (DO NOT MARK WATER)', 'name': 'water_ski'}, {'frequency': 'c', 'id': 1193, 'synset': 'water_tower.n.01', 'synonyms': ['water_tower'], 'def': 'a large reservoir for water', 'name': 'water_tower'}, {'frequency': 'c', 'id': 1194, 'synset': 'watering_can.n.01', 'synonyms': ['watering_can'], 'def': 'a container with a handle and a spout with a perforated nozzle; used to sprinkle water over plants', 'name': 'watering_can'}, {'frequency': 'c', 'id': 1195, 'synset': 'watermelon.n.02', 'synonyms': ['watermelon'], 'def': 'large oblong or roundish melon with a hard green rind and sweet watery red or occasionally yellowish pulp', 'name': 'watermelon'}, {'frequency': 'f', 'id': 1196, 'synset': 'weathervane.n.01', 'synonyms': ['weathervane', 'vane_(weathervane)', 'wind_vane'], 'def': 'mechanical device attached to an elevated structure; rotates freely to show the direction of the wind', 'name': 'weathervane'}, {'frequency': 'c', 'id': 1197, 'synset': 'webcam.n.01', 'synonyms': ['webcam'], 'def': 'a digital camera designed to take digital photographs and transmit them over the internet', 'name': 'webcam'}, {'frequency': 'c', 'id': 1198, 'synset': 'wedding_cake.n.01', 'synonyms': ['wedding_cake', 'bridecake'], 'def': 'a rich cake with two or more tiers and covered with frosting and decorations; served at a wedding reception', 'name': 'wedding_cake'}, {'frequency': 'c', 'id': 1199, 'synset': 'wedding_ring.n.01', 'synonyms': ['wedding_ring', 'wedding_band'], 'def': 'a ring given to the bride and/or groom at the wedding', 'name': 'wedding_ring'}, {'frequency': 'f', 'id': 1200, 'synset': 'wet_suit.n.01', 'synonyms': ['wet_suit'], 'def': 'a close-fitting garment made of a permeable material; worn in cold water to retain body heat', 'name': 'wet_suit'}, {'frequency': 'f', 'id': 1201, 'synset': 'wheel.n.01', 'synonyms': ['wheel'], 'def': 'a circular frame with spokes (or a solid disc) that can rotate on a shaft or axle', 'name': 'wheel'}, {'frequency': 'c', 'id': 1202, 'synset': 'wheelchair.n.01', 'synonyms': ['wheelchair'], 'def': 'a movable chair mounted on large wheels', 'name': 'wheelchair'}, {'frequency': 'c', 'id': 1203, 'synset': 'whipped_cream.n.01', 'synonyms': ['whipped_cream'], 'def': 'cream that has been beaten until light and fluffy', 'name': 'whipped_cream'}, {'frequency': 'r', 'id': 1204, 'synset': 'whiskey.n.01', 'synonyms': ['whiskey'], 'def': 'a liquor made from fermented mash of grain', 'name': 'whiskey'}, {'frequency': 'r', 'id': 1205, 'synset': 'whistle.n.03', 'synonyms': ['whistle'], 'def': 'a small wind instrument that produces a whistling sound by blowing into it', 'name': 'whistle'}, {'frequency': 'r', 'id': 1206, 'synset': 'wick.n.02', 'synonyms': ['wick'], 'def': 'a loosely woven cord in a candle or oil lamp that is lit on fire', 'name': 'wick'}, {'frequency': 'c', 'id': 1207, 'synset': 'wig.n.01', 'synonyms': ['wig'], 'def': 'hairpiece covering the head and made of real or synthetic hair', 'name': 'wig'}, {'frequency': 'c', 'id': 1208, 'synset': 'wind_chime.n.01', 'synonyms': ['wind_chime'], 'def': 'a decorative arrangement of pieces of metal or glass or pottery that hang together loosely so the wind can cause them to tinkle', 'name': 'wind_chime'}, {'frequency': 'c', 'id': 1209, 'synset': 'windmill.n.01', 'synonyms': ['windmill'], 'def': 'a mill that is powered by the wind', 'name': 'windmill'}, {'frequency': 'c', 'id': 1210, 'synset': 'window_box.n.01', 'synonyms': ['window_box_(for_plants)'], 'def': 'a container for growing plants on a windowsill', 'name': 'window_box_(for_plants)'}, {'frequency': 'f', 'id': 1211, 'synset': 'windshield_wiper.n.01', 'synonyms': ['windshield_wiper', 'windscreen_wiper', 'wiper_(for_windshield/screen)'], 'def': 'a mechanical device that cleans the windshield', 'name': 'windshield_wiper'}, {'frequency': 'c', 'id': 1212, 'synset': 'windsock.n.01', 'synonyms': ['windsock', 'air_sock', 'air-sleeve', 'wind_sleeve', 'wind_cone'], 'def': 'a truncated cloth cone mounted on a mast/pole; shows wind direction', 'name': 'windsock'}, {'frequency': 'f', 'id': 1213, 'synset': 'wine_bottle.n.01', 'synonyms': ['wine_bottle'], 'def': 'a bottle for holding wine', 'name': 'wine_bottle'}, {'frequency': 'r', 'id': 1214, 'synset': 'wine_bucket.n.01', 'synonyms': ['wine_bucket', 'wine_cooler'], 'def': 'a bucket of ice used to chill a bottle of wine', 'name': 'wine_bucket'}, {'frequency': 'f', 'id': 1215, 'synset': 'wineglass.n.01', 'synonyms': ['wineglass'], 'def': 'a glass that has a stem and in which wine is served', 'name': 'wineglass'}, {'frequency': 'r', 'id': 1216, 'synset': 'wing_chair.n.01', 'synonyms': ['wing_chair'], 'def': 'easy chair having wings on each side of a high back', 'name': 'wing_chair'}, {'frequency': 'c', 'id': 1217, 'synset': 'winker.n.02', 'synonyms': ['blinder_(for_horses)'], 'def': 'blinds that prevent a horse from seeing something on either side', 'name': 'blinder_(for_horses)'}, {'frequency': 'c', 'id': 1218, 'synset': 'wok.n.01', 'synonyms': ['wok'], 'def': 'pan with a convex bottom; used for frying in Chinese cooking', 'name': 'wok'}, {'frequency': 'r', 'id': 1219, 'synset': 'wolf.n.01', 'synonyms': ['wolf'], 'def': 'a wild carnivorous mammal of the dog family, living and hunting in packs', 'name': 'wolf'}, {'frequency': 'c', 'id': 1220, 'synset': 'wooden_spoon.n.02', 'synonyms': ['wooden_spoon'], 'def': 'a spoon made of wood', 'name': 'wooden_spoon'}, {'frequency': 'c', 'id': 1221, 'synset': 'wreath.n.01', 'synonyms': ['wreath'], 'def': 'an arrangement of flowers, leaves, or stems fastened in a ring', 'name': 'wreath'}, {'frequency': 'c', 'id': 1222, 'synset': 'wrench.n.03', 'synonyms': ['wrench', 'spanner'], 'def': 'a hand tool that is used to hold or twist a nut or bolt', 'name': 'wrench'}, {'frequency': 'c', 'id': 1223, 'synset': 'wristband.n.01', 'synonyms': ['wristband'], 'def': 'band consisting of a part of a sleeve that covers the wrist', 'name': 'wristband'}, {'frequency': 'f', 'id': 1224, 'synset': 'wristlet.n.01', 'synonyms': ['wristlet', 'wrist_band'], 'def': 'a band or bracelet worn around the wrist', 'name': 'wristlet'}, {'frequency': 'r', 'id': 1225, 'synset': 'yacht.n.01', 'synonyms': ['yacht'], 'def': 'an expensive vessel propelled by sail or power and used for cruising or racing', 'name': 'yacht'}, {'frequency': 'r', 'id': 1226, 'synset': 'yak.n.02', 'synonyms': ['yak'], 'def': 'large long-haired wild ox of Tibet often domesticated', 'name': 'yak'}, {'frequency': 'c', 'id': 1227, 'synset': 'yogurt.n.01', 'synonyms': ['yogurt', 'yoghurt', 'yoghourt'], 'def': 'a custard-like food made from curdled milk', 'name': 'yogurt'}, {'frequency': 'r', 'id': 1228, 'synset': 'yoke.n.07', 'synonyms': ['yoke_(animal_equipment)'], 'def': 'gear joining two animals at the neck; NOT egg yolk', 'name': 'yoke_(animal_equipment)'}, {'frequency': 'f', 'id': 1229, 'synset': 'zebra.n.01', 'synonyms': ['zebra'], 'def': 'any of several fleet black-and-white striped African equines', 'name': 'zebra'}, {'frequency': 'c', 'id': 1230, 'synset': 'zucchini.n.02', 'synonyms': ['zucchini', 'courgette'], 'def': 'small cucumber-shaped vegetable marrow; typically dark green', 'name': 'zucchini'}] # noqa +# fmt: on diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/pascal_voc.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/pascal_voc.py new file mode 100644 index 0000000..5872d96 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/pascal_voc.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import numpy as np +import os +import xml.etree.ElementTree as ET +from fvcore.common.file_io import PathManager + +from detectron2.data import DatasetCatalog, MetadataCatalog +from detectron2.structures import BoxMode + +__all__ = ["register_pascal_voc"] + + +# fmt: off +CLASS_NAMES = [ + "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", + "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", + "pottedplant", "sheep", "sofa", "train", "tvmonitor", +] +# fmt: on + + +def load_voc_instances(dirname: str, split: str): + """ + Load Pascal VOC detection annotations to Detectron2 format. + + Args: + dirname: Contain "Annotations", "ImageSets", "JPEGImages" + split (str): one of "train", "test", "val", "trainval" + """ + with PathManager.open(os.path.join(dirname, "ImageSets", "Main", split + ".txt")) as f: + fileids = np.loadtxt(f, dtype=np.str) + + # Needs to read many small annotation files. Makes sense at local + annotation_dirname = PathManager.get_local_path(os.path.join(dirname, "Annotations/")) + dicts = [] + for fileid in fileids: + anno_file = os.path.join(annotation_dirname, fileid + ".xml") + jpeg_file = os.path.join(dirname, "JPEGImages", fileid + ".jpg") + + with PathManager.open(anno_file) as f: + tree = ET.parse(f) + + r = { + "file_name": jpeg_file, + "image_id": fileid, + "height": int(tree.findall("./size/height")[0].text), + "width": int(tree.findall("./size/width")[0].text), + } + instances = [] + + for obj in tree.findall("object"): + cls = obj.find("name").text + # We include "difficult" samples in training. + # Based on limited experiments, they don't hurt accuracy. + # difficult = int(obj.find("difficult").text) + # if difficult == 1: + # continue + bbox = obj.find("bndbox") + bbox = [float(bbox.find(x).text) for x in ["xmin", "ymin", "xmax", "ymax"]] + # Original annotations are integers in the range [1, W or H] + # Assuming they mean 1-based pixel indices (inclusive), + # a box with annotation (xmin=1, xmax=W) covers the whole image. + # In coordinate space this is represented by (xmin=0, xmax=W) + bbox[0] -= 1.0 + bbox[1] -= 1.0 + instances.append( + {"category_id": CLASS_NAMES.index(cls), "bbox": bbox, "bbox_mode": BoxMode.XYXY_ABS} + ) + r["annotations"] = instances + dicts.append(r) + return dicts + + +def register_pascal_voc(name, dirname, split, year): + DatasetCatalog.register(name, lambda: load_voc_instances(dirname, split)) + MetadataCatalog.get(name).set( + thing_classes=CLASS_NAMES, dirname=dirname, year=year, split=split + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/register_coco.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/register_coco.py new file mode 100644 index 0000000..a0a4db6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/datasets/register_coco.py @@ -0,0 +1,129 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import os + +from detectron2.data import DatasetCatalog, MetadataCatalog + +from .coco import load_coco_json, load_sem_seg + +""" +This file contains functions to register a COCO-format dataset to the DatasetCatalog. +""" + +__all__ = ["register_coco_instances", "register_coco_panoptic_separated"] + + +def register_coco_instances(name, metadata, json_file, image_root): + """ + Register a dataset in COCO's json annotation format for + instance detection, instance segmentation and keypoint detection. + (i.e., Type 1 and 2 in http://cocodataset.org/#format-data. + `instances*.json` and `person_keypoints*.json` in the dataset). + + This is an example of how to register a new dataset. + You can do something similar to this function, to register new data. + + Args: + name (str): the name that identifies a dataset, e.g. "coco_2014_train". + metadata (dict): extra metadata associated with this dataset. You can + leave it as an empty dict. + json_file (str): path to the json instance annotation file. + image_root (str or path-like): directory which contains all the images. + """ + assert isinstance(name, str), name + assert isinstance(json_file, (str, os.PathLike)), json_file + assert isinstance(image_root, (str, os.PathLike)), image_root + # 1. register a function which returns dicts + DatasetCatalog.register(name, lambda: load_coco_json(json_file, image_root, name)) + + # 2. Optionally, add metadata about this dataset, + # since they might be useful in evaluation, visualization or logging + MetadataCatalog.get(name).set( + json_file=json_file, image_root=image_root, evaluator_type="coco", **metadata + ) + + +def register_coco_panoptic_separated( + name, metadata, image_root, panoptic_root, panoptic_json, sem_seg_root, instances_json +): + """ + Register a COCO panoptic segmentation dataset named `name`. + The annotations in this registered dataset will contain both instance annotations and + semantic annotations, each with its own contiguous ids. Hence it's called "separated". + + It follows the setting used by the PanopticFPN paper: + + 1. The instance annotations directly come from polygons in the COCO + instances annotation task, rather than from the masks in the COCO panoptic annotations. + + The two format have small differences: + Polygons in the instance annotations may have overlaps. + The mask annotations are produced by labeling the overlapped polygons + with depth ordering. + + 2. The semantic annotations are converted from panoptic annotations, where + all "things" are assigned a semantic id of 0. + All semantic categories will therefore have ids in contiguous + range [1, #stuff_categories]. + + This function will also register a pure semantic segmentation dataset + named ``name + '_stuffonly'``. + + Args: + name (str): the name that identifies a dataset, + e.g. "coco_2017_train_panoptic" + metadata (dict): extra metadata associated with this dataset. + image_root (str): directory which contains all the images + panoptic_root (str): directory which contains panoptic annotation images + panoptic_json (str): path to the json panoptic annotation file + sem_seg_root (str): directory which contains all the ground truth segmentation annotations. + instances_json (str): path to the json instance annotation file + """ + panoptic_name = name + "_separated" + DatasetCatalog.register( + panoptic_name, + lambda: merge_to_panoptic( + load_coco_json(instances_json, image_root, panoptic_name), + load_sem_seg(sem_seg_root, image_root), + ), + ) + MetadataCatalog.get(panoptic_name).set( + panoptic_root=panoptic_root, + image_root=image_root, + panoptic_json=panoptic_json, + sem_seg_root=sem_seg_root, + json_file=instances_json, # TODO rename + evaluator_type="coco_panoptic_seg", + **metadata + ) + + semantic_name = name + "_stuffonly" + DatasetCatalog.register(semantic_name, lambda: load_sem_seg(sem_seg_root, image_root)) + MetadataCatalog.get(semantic_name).set( + sem_seg_root=sem_seg_root, image_root=image_root, evaluator_type="sem_seg", **metadata + ) + + +def merge_to_panoptic(detection_dicts, sem_seg_dicts): + """ + Create dataset dicts for panoptic segmentation, by + merging two dicts using "file_name" field to match their entries. + + Args: + detection_dicts (list[dict]): lists of dicts for object detection or instance segmentation. + sem_seg_dicts (list[dict]): lists of dicts for semantic segmentation. + + Returns: + list[dict] (one per input image): Each dict contains all (key, value) pairs from dicts in + both detection_dicts and sem_seg_dicts that correspond to the same image. + The function assumes that the same key in different dicts has the same value. + """ + results = [] + sem_seg_file_to_entry = {x["file_name"]: x for x in sem_seg_dicts} + assert len(sem_seg_file_to_entry) > 0 + + for det_dict in detection_dicts: + dic = copy.copy(det_dict) + dic.update(sem_seg_file_to_entry[dic["file_name"]]) + results.append(dic) + return results diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/detection_utils.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/detection_utils.py new file mode 100644 index 0000000..e19c7e2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/detection_utils.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +""" +Common data processing utilities that are used in a +typical object detection data pipeline. +""" +import logging +import numpy as np +import pycocotools.mask as mask_util +import torch +from fvcore.common.file_io import PathManager +from PIL import Image, ImageOps + +from detectron2.structures import ( + BitMasks, + Boxes, + BoxMode, + Instances, + Keypoints, + PolygonMasks, + RotatedBoxes, + polygons_to_bitmask, +) + +from . import transforms as T +from .catalog import MetadataCatalog + + +class SizeMismatchError(ValueError): + """ + When loaded image has difference width/height compared with annotation. + """ + + +# https://en.wikipedia.org/wiki/YUV#SDTV_with_BT.601 +_M_RGB2YUV = [[0.299, 0.587, 0.114], [-0.14713, -0.28886, 0.436], [0.615, -0.51499, -0.10001]] +_M_YUV2RGB = [[1.0, 0.0, 1.13983], [1.0, -0.39465, -0.58060], [1.0, 2.03211, 0.0]] + + +def convert_PIL_to_numpy(image, format): + """ + Convert PIL image to numpy array of target format. + + Args: + image (PIL.Image): a PIL image + format (str): the format of output image + + Returns: + (np.ndarray): also see `read_image` + """ + if format is not None: + # PIL only supports RGB, so convert to RGB and flip channels over below + conversion_format = format + if format in ["BGR", "YUV-BT.601"]: + conversion_format = "RGB" + image = image.convert(conversion_format) + image = np.asarray(image) + # PIL squeezes out the channel dimension for "L", so make it HWC + if format == "L": + image = np.expand_dims(image, -1) + + # handle formats not supported by PIL + elif format == "BGR": + # flip channels if needed + image = image[:, :, ::-1] + elif format == "YUV-BT.601": + image = image / 255.0 + image = np.dot(image, np.array(_M_RGB2YUV).T) + + return image + + +def convert_image_to_rgb(image, format): + """ + Convert numpy image from given format to RGB. + + Args: + image (np.ndarray): a numpy image + format (str): the format of input image, also see `read_image` + + Returns: + (np.ndarray): HWC RGB image in 0-255 range, can be either float or uint8 + """ + if format == "BGR": + image = image[:, :, [2, 1, 0]] + elif format == "YUV-BT.601": + image = np.dot(image, np.array(_M_YUV2RGB).T) + image = image * 255.0 + else: + if format == "L": + image = image[:, :, 0] + image = image.astype(np.uint8) + image = np.asarray(Image.fromarray(image, mode=format).convert("RGB")) + return image + + +def read_image(file_name, format=None): + """ + Read an image into the given format. + Will apply rotation and flipping if the image has such exif information. + + Args: + file_name (str): image file path + format (str): one of the supported image modes in PIL, or "BGR" or "YUV-BT.601" + + Returns: + image (np.ndarray): an HWC image in the given format, which is 0-255, uint8 for + supported image modes in PIL or "BGR"; float (0-1 for Y) for YUV-BT.601. + """ + with PathManager.open(file_name, "rb") as f: + image = Image.open(f) + + # capture and ignore this bug: https://github.com/python-pillow/Pillow/issues/3973 + try: + image = ImageOps.exif_transpose(image) + except Exception: + pass + + return convert_PIL_to_numpy(image, format) + + +def check_image_size(dataset_dict, image): + """ + Raise an error if the image does not match the size specified in the dict. + """ + if "width" in dataset_dict or "height" in dataset_dict: + image_wh = (image.shape[1], image.shape[0]) + expected_wh = (dataset_dict["width"], dataset_dict["height"]) + if not image_wh == expected_wh: + raise SizeMismatchError( + "Mismatched (W,H){}, got {}, expect {}".format( + " for image " + dataset_dict["file_name"] + if "file_name" in dataset_dict + else "", + image_wh, + expected_wh, + ) + ) + + # To ensure bbox always remap to original image size + if "width" not in dataset_dict: + dataset_dict["width"] = image.shape[1] + if "height" not in dataset_dict: + dataset_dict["height"] = image.shape[0] + + +def transform_proposals(dataset_dict, image_shape, transforms, min_box_side_len, proposal_topk): + """ + Apply transformations to the proposals in dataset_dict, if any. + + Args: + dataset_dict (dict): a dict read from the dataset, possibly + contains fields "proposal_boxes", "proposal_objectness_logits", "proposal_bbox_mode" + image_shape (tuple): height, width + transforms (TransformList): + min_box_side_len (int): keep proposals with at least this size + proposal_topk (int): only keep top-K scoring proposals + + The input dict is modified in-place, with abovementioned keys removed. A new + key "proposals" will be added. Its value is an `Instances` + object which contains the transformed proposals in its field + "proposal_boxes" and "objectness_logits". + """ + if "proposal_boxes" in dataset_dict: + # Transform proposal boxes + boxes = transforms.apply_box( + BoxMode.convert( + dataset_dict.pop("proposal_boxes"), + dataset_dict.pop("proposal_bbox_mode"), + BoxMode.XYXY_ABS, + ) + ) + boxes = Boxes(boxes) + objectness_logits = torch.as_tensor( + dataset_dict.pop("proposal_objectness_logits").astype("float32") + ) + + boxes.clip(image_shape) + keep = boxes.nonempty(threshold=min_box_side_len) + boxes = boxes[keep] + objectness_logits = objectness_logits[keep] + + proposals = Instances(image_shape) + proposals.proposal_boxes = boxes[:proposal_topk] + proposals.objectness_logits = objectness_logits[:proposal_topk] + dataset_dict["proposals"] = proposals + + +def transform_instance_annotations( + annotation, transforms, image_size, *, keypoint_hflip_indices=None +): + """ + Apply transforms to box, segmentation and keypoints annotations of a single instance. + + It will use `transforms.apply_box` for the box, and + `transforms.apply_coords` for segmentation polygons & keypoints. + If you need anything more specially designed for each data structure, + you'll need to implement your own version of this function or the transforms. + + Args: + annotation (dict): dict of instance annotations for a single instance. + It will be modified in-place. + transforms (TransformList): + image_size (tuple): the height, width of the transformed image + keypoint_hflip_indices (ndarray[int]): see `create_keypoint_hflip_indices`. + + Returns: + dict: + the same input dict with fields "bbox", "segmentation", "keypoints" + transformed according to `transforms`. + The "bbox_mode" field will be set to XYXY_ABS. + """ + bbox = BoxMode.convert(annotation["bbox"], annotation["bbox_mode"], BoxMode.XYXY_ABS) + # Note that bbox is 1d (per-instance bounding box) + annotation["bbox"] = transforms.apply_box([bbox])[0] + annotation["bbox_mode"] = BoxMode.XYXY_ABS + + if "segmentation" in annotation: + # each instance contains 1 or more polygons + segm = annotation["segmentation"] + if isinstance(segm, list): + # polygons + polygons = [np.asarray(p).reshape(-1, 2) for p in segm] + annotation["segmentation"] = [ + p.reshape(-1) for p in transforms.apply_polygons(polygons) + ] + elif isinstance(segm, dict): + # RLE + mask = mask_util.decode(segm) + mask = transforms.apply_segmentation(mask) + assert tuple(mask.shape[:2]) == image_size + annotation["segmentation"] = mask + else: + raise ValueError( + "Cannot transform segmentation of type '{}'!" + "Supported types are: polygons as list[list[float] or ndarray]," + " COCO-style RLE as a dict.".format(type(segm)) + ) + + if "keypoints" in annotation: + keypoints = transform_keypoint_annotations( + annotation["keypoints"], transforms, image_size, keypoint_hflip_indices + ) + annotation["keypoints"] = keypoints + + return annotation + + +def transform_keypoint_annotations(keypoints, transforms, image_size, keypoint_hflip_indices=None): + """ + Transform keypoint annotations of an image. + + Args: + keypoints (list[float]): Nx3 float in Detectron2 Dataset format. + transforms (TransformList): + image_size (tuple): the height, width of the transformed image + keypoint_hflip_indices (ndarray[int]): see `create_keypoint_hflip_indices`. + """ + # (N*3,) -> (N, 3) + keypoints = np.asarray(keypoints, dtype="float64").reshape(-1, 3) + keypoints[:, :2] = transforms.apply_coords(keypoints[:, :2]) + + # This assumes that HorizFlipTransform is the only one that does flip + do_hflip = sum(isinstance(t, T.HFlipTransform) for t in transforms.transforms) % 2 == 1 + + # Alternative way: check if probe points was horizontally flipped. + # probe = np.asarray([[0.0, 0.0], [image_width, 0.0]]) + # probe_aug = transforms.apply_coords(probe.copy()) + # do_hflip = np.sign(probe[1][0] - probe[0][0]) != np.sign(probe_aug[1][0] - probe_aug[0][0]) # noqa + + # If flipped, swap each keypoint with its opposite-handed equivalent + if do_hflip: + assert keypoint_hflip_indices is not None + keypoints = keypoints[keypoint_hflip_indices, :] + + # Maintain COCO convention that if visibility == 0, then x, y = 0 + # TODO may need to reset visibility for cropped keypoints, + # but it does not matter for our existing algorithms + keypoints[keypoints[:, 2] == 0] = 0 + return keypoints + + +def annotations_to_instances(annos, image_size, mask_format="polygon"): + """ + Create an :class:`Instances` object used by the models, + from instance annotations in the dataset dict. + + Args: + annos (list[dict]): a list of instance annotations in one image, each + element for one instance. + image_size (tuple): height, width + + Returns: + Instances: + It will contain fields "gt_boxes", "gt_classes", + "gt_masks", "gt_keypoints", if they can be obtained from `annos`. + This is the format that builtin models expect. + """ + boxes = [BoxMode.convert(obj["bbox"], obj["bbox_mode"], BoxMode.XYXY_ABS) for obj in annos] + target = Instances(image_size) + boxes = target.gt_boxes = Boxes(boxes) + boxes.clip(image_size) + + classes = [obj["category_id"] for obj in annos] + classes = torch.tensor(classes, dtype=torch.int64) + target.gt_classes = classes + + if len(annos) and "segmentation" in annos[0]: + segms = [obj["segmentation"] for obj in annos] + if mask_format == "polygon": + masks = PolygonMasks(segms) + else: + assert mask_format == "bitmask", mask_format + masks = [] + for segm in segms: + if isinstance(segm, list): + # polygon + masks.append(polygons_to_bitmask(segm, *image_size)) + elif isinstance(segm, dict): + # COCO RLE + masks.append(mask_util.decode(segm)) + elif isinstance(segm, np.ndarray): + assert segm.ndim == 2, "Expect segmentation of 2 dimensions, got {}.".format( + segm.ndim + ) + # mask array + masks.append(segm) + else: + raise ValueError( + "Cannot convert segmentation of type '{}' to BitMasks!" + "Supported types are: polygons as list[list[float] or ndarray]," + " COCO-style RLE as a dict, or a full-image segmentation mask " + "as a 2D ndarray.".format(type(segm)) + ) + # torch.from_numpy does not support array with negative stride. + masks = BitMasks( + torch.stack([torch.from_numpy(np.ascontiguousarray(x)) for x in masks]) + ) + target.gt_masks = masks + + if len(annos) and "keypoints" in annos[0]: + kpts = [obj.get("keypoints", []) for obj in annos] + target.gt_keypoints = Keypoints(kpts) + + return target + + +def annotations_to_instances_rotated(annos, image_size): + """ + Create an :class:`Instances` object used by the models, + from instance annotations in the dataset dict. + Compared to `annotations_to_instances`, this function is for rotated boxes only + + Args: + annos (list[dict]): a list of instance annotations in one image, each + element for one instance. + image_size (tuple): height, width + + Returns: + Instances: + Containing fields "gt_boxes", "gt_classes", + if they can be obtained from `annos`. + This is the format that builtin models expect. + """ + boxes = [obj["bbox"] for obj in annos] + target = Instances(image_size) + boxes = target.gt_boxes = RotatedBoxes(boxes) + boxes.clip(image_size) + + classes = [obj["category_id"] for obj in annos] + classes = torch.tensor(classes, dtype=torch.int64) + target.gt_classes = classes + + return target + + +def filter_empty_instances(instances, by_box=True, by_mask=True, box_threshold=1e-5): + """ + Filter out empty instances in an `Instances` object. + + Args: + instances (Instances): + by_box (bool): whether to filter out instances with empty boxes + by_mask (bool): whether to filter out instances with empty masks + box_threshold (float): minimum width and height to be considered non-empty + + Returns: + Instances: the filtered instances. + """ + assert by_box or by_mask + r = [] + if by_box: + r.append(instances.gt_boxes.nonempty(threshold=box_threshold)) + if instances.has("gt_masks") and by_mask: + r.append(instances.gt_masks.nonempty()) + + # TODO: can also filter visible keypoints + + if not r: + return instances + m = r[0] + for x in r[1:]: + m = m & x + return instances[m] + + +def create_keypoint_hflip_indices(dataset_names): + """ + Args: + dataset_names (list[str]): list of dataset names + Returns: + ndarray[int]: a vector of size=#keypoints, storing the + horizontally-flipped keypoint indices. + """ + + check_metadata_consistency("keypoint_names", dataset_names) + check_metadata_consistency("keypoint_flip_map", dataset_names) + + meta = MetadataCatalog.get(dataset_names[0]) + names = meta.keypoint_names + # TODO flip -> hflip + flip_map = dict(meta.keypoint_flip_map) + flip_map.update({v: k for k, v in flip_map.items()}) + flipped_names = [i if i not in flip_map else flip_map[i] for i in names] + flip_indices = [names.index(i) for i in flipped_names] + return np.asarray(flip_indices) + + +def gen_crop_transform_with_instance(crop_size, image_size, instance): + """ + Generate a CropTransform so that the cropping region contains + the center of the given instance. + + Args: + crop_size (tuple): h, w in pixels + image_size (tuple): h, w + instance (dict): an annotation dict of one instance, in Detectron2's + dataset format. + """ + crop_size = np.asarray(crop_size, dtype=np.int32) + bbox = BoxMode.convert(instance["bbox"], instance["bbox_mode"], BoxMode.XYXY_ABS) + center_yx = (bbox[1] + bbox[3]) * 0.5, (bbox[0] + bbox[2]) * 0.5 + assert ( + image_size[0] >= center_yx[0] and image_size[1] >= center_yx[1] + ), "The annotation bounding box is outside of the image!" + assert ( + image_size[0] >= crop_size[0] and image_size[1] >= crop_size[1] + ), "Crop size is larger than image size!" + + min_yx = np.maximum(np.floor(center_yx).astype(np.int32) - crop_size, 0) + max_yx = np.maximum(np.asarray(image_size, dtype=np.int32) - crop_size, 0) + max_yx = np.minimum(max_yx, np.ceil(center_yx).astype(np.int32)) + + y0 = np.random.randint(min_yx[0], max_yx[0] + 1) + x0 = np.random.randint(min_yx[1], max_yx[1] + 1) + return T.CropTransform(x0, y0, crop_size[1], crop_size[0]) + + +def check_metadata_consistency(key, dataset_names): + """ + Check that the data have consistent metadata. + + Args: + key (str): a metadata key + dataset_names (list[str]): a list of dataset names + + Raises: + AttributeError: if the key does not exist in the metadata + ValueError: if the given data do not have the same metadata values defined by key + """ + if len(dataset_names) == 0: + return + logger = logging.getLogger(__name__) + entries_per_dataset = [getattr(MetadataCatalog.get(d), key) for d in dataset_names] + for idx, entry in enumerate(entries_per_dataset): + if entry != entries_per_dataset[0]: + logger.error( + "Metadata '{}' for dataset '{}' is '{}'".format(key, dataset_names[idx], str(entry)) + ) + logger.error( + "Metadata '{}' for dataset '{}' is '{}'".format( + key, dataset_names[0], str(entries_per_dataset[0]) + ) + ) + raise ValueError("Datasets have different metadata '{}'!".format(key)) + + +def build_transform_gen(cfg, is_train): + """ + Create a list of :class:`TransformGen` from config. + Now it includes resizing and flipping. + + Returns: + list[TransformGen] + """ + if is_train: + min_size = cfg.INPUT.MIN_SIZE_TRAIN + max_size = cfg.INPUT.MAX_SIZE_TRAIN + sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING + else: + min_size = cfg.INPUT.MIN_SIZE_TEST + max_size = cfg.INPUT.MAX_SIZE_TEST + sample_style = "choice" + if sample_style == "range": + assert len(min_size) == 2, "more than 2 ({}) min_size(s) are provided for ranges".format( + len(min_size) + ) + + logger = logging.getLogger(__name__) + tfm_gens = [] + tfm_gens.append(T.ResizeShortestEdge(min_size, max_size, sample_style)) + if is_train: + tfm_gens.append(T.RandomFlip()) + logger.info("TransformGens used in training: " + str(tfm_gens)) + return tfm_gens diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/__init__.py new file mode 100644 index 0000000..9cfa8a6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .distributed_sampler import InferenceSampler, RepeatFactorTrainingSampler, TrainingSampler +from .grouped_batch_sampler import GroupedBatchSampler + +__all__ = [ + "GroupedBatchSampler", + "TrainingSampler", + "InferenceSampler", + "RepeatFactorTrainingSampler", +] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/distributed_sampler.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/distributed_sampler.py new file mode 100644 index 0000000..4ac57bb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/distributed_sampler.py @@ -0,0 +1,199 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import itertools +import math +from collections import defaultdict +from typing import Optional +import torch +from torch.utils.data.sampler import Sampler + +from detectron2.utils import comm + + +class TrainingSampler(Sampler): + """ + In training, we only care about the "infinite stream" of training data. + So this sampler produces an infinite stream of indices and + all workers cooperate to correctly shuffle the indices and sample different indices. + + The samplers in each worker effectively produces `indices[worker_id::num_workers]` + where `indices` is an infinite stream of indices consisting of + `shuffle(range(size)) + shuffle(range(size)) + ...` (if shuffle is True) + or `range(size) + range(size) + ...` (if shuffle is False) + """ + + def __init__(self, size: int, shuffle: bool = True, seed: Optional[int] = None): + """ + Args: + size (int): the total number of data of the underlying dataset to sample from + shuffle (bool): whether to shuffle the indices or not + seed (int): the initial seed of the shuffle. Must be the same + across all workers. If None, will use a random seed shared + among workers (require synchronization among all workers). + """ + self._size = size + assert size > 0 + self._shuffle = shuffle + if seed is None: + seed = comm.shared_random_seed() + self._seed = int(seed) + + self._rank = comm.get_rank() + self._world_size = comm.get_world_size() + + def __iter__(self): + start = self._rank + yield from itertools.islice(self._infinite_indices(), start, None, self._world_size) + + def _infinite_indices(self): + g = torch.Generator() + g.manual_seed(self._seed) + while True: + if self._shuffle: + yield from torch.randperm(self._size, generator=g) + else: + yield from torch.arange(self._size) + + +class RepeatFactorTrainingSampler(Sampler): + """ + Similar to TrainingSampler, but suitable for training on class imbalanced data + like LVIS. In each epoch, an image may appear multiple times based on its "repeat + factor". The repeat factor for an image is a function of the frequency the rarest + category labeled in that image. The "frequency of category c" in [0, 1] is defined + as the fraction of images in the training set (without repeats) in which category c + appears. + + See :paper:`lvis` (>= v2) Appendix B.2. + """ + + def __init__(self, dataset_dicts, repeat_thresh, shuffle=True, seed=None): + """ + Args: + dataset_dicts (list[dict]): annotations in Detectron2 dataset format. + repeat_thresh (float): frequency threshold below which data is repeated. + shuffle (bool): whether to shuffle the indices or not + seed (int): the initial seed of the shuffle. Must be the same + across all workers. If None, will use a random seed shared + among workers (require synchronization among all workers). + """ + self._shuffle = shuffle + if seed is None: + seed = comm.shared_random_seed() + self._seed = int(seed) + + self._rank = comm.get_rank() + self._world_size = comm.get_world_size() + + # Get fractional repeat factors and split into whole number (_int_part) + # and fractional (_frac_part) parts. + rep_factors = self._get_repeat_factors(dataset_dicts, repeat_thresh) + self._int_part = torch.trunc(rep_factors) + self._frac_part = rep_factors - self._int_part + + def _get_repeat_factors(self, dataset_dicts, repeat_thresh): + """ + Compute (fractional) per-image repeat factors. + + Args: + See __init__. + + Returns: + torch.Tensor: the i-th element is the repeat factor for the dataset image + at index i. + """ + # 1. For each category c, compute the fraction of images that contain it: f(c) + category_freq = defaultdict(int) + for dataset_dict in dataset_dicts: # For each image (without repeats) + cat_ids = {ann["category_id"] for ann in dataset_dict["annotations"]} + for cat_id in cat_ids: + category_freq[cat_id] += 1 + num_images = len(dataset_dicts) + for k, v in category_freq.items(): + category_freq[k] = v / num_images + + # 2. For each category c, compute the category-level repeat factor: + # r(c) = max(1, sqrt(t / f(c))) + category_rep = { + cat_id: max(1.0, math.sqrt(repeat_thresh / cat_freq)) + for cat_id, cat_freq in category_freq.items() + } + + # 3. For each image I, compute the image-level repeat factor: + # r(I) = max_{c in I} r(c) + rep_factors = [] + for dataset_dict in dataset_dicts: + cat_ids = {ann["category_id"] for ann in dataset_dict["annotations"]} + rep_factor = max({category_rep[cat_id] for cat_id in cat_ids}) + rep_factors.append(rep_factor) + + return torch.tensor(rep_factors, dtype=torch.float32) + + def _get_epoch_indices(self, generator): + """ + Create a list of dataset indices (with repeats) to use for one epoch. + + Args: + generator (torch.Generator): pseudo random number generator used for + stochastic rounding. + + Returns: + torch.Tensor: list of dataset indices to use in one epoch. Each index + is repeated based on its calculated repeat factor. + """ + # Since repeat factors are fractional, we use stochastic rounding so + # that the target repeat factor is achieved in expectation over the + # course of training + rands = torch.rand(len(self._frac_part), generator=generator) + rep_factors = self._int_part + (rands < self._frac_part).float() + # Construct a list of indices in which we repeat images as specified + indices = [] + for dataset_index, rep_factor in enumerate(rep_factors): + indices.extend([dataset_index] * int(rep_factor.item())) + return torch.tensor(indices, dtype=torch.int64) + + def __iter__(self): + start = self._rank + yield from itertools.islice(self._infinite_indices(), start, None, self._world_size) + + def _infinite_indices(self): + g = torch.Generator() + g.manual_seed(self._seed) + while True: + # Sample indices with repeats determined by stochastic rounding; each + # "epoch" may have a slightly different size due to the rounding. + indices = self._get_epoch_indices(g) + if self._shuffle: + randperm = torch.randperm(len(indices), generator=g) + yield from indices[randperm] + else: + yield from indices + + +class InferenceSampler(Sampler): + """ + Produce indices for inference. + Inference needs to run on the __exact__ set of samples, + therefore when the total number of samples is not divisible by the number of workers, + this sampler produces different number of samples on different workers. + """ + + def __init__(self, size: int): + """ + Args: + size (int): the total number of data of the underlying dataset to sample from + """ + self._size = size + assert size > 0 + self._rank = comm.get_rank() + self._world_size = comm.get_world_size() + + shard_size = (self._size - 1) // self._world_size + 1 + begin = shard_size * self._rank + end = min(shard_size * (self._rank + 1), self._size) + self._local_indices = range(begin, end) + + def __iter__(self): + yield from self._local_indices + + def __len__(self): + return len(self._local_indices) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/grouped_batch_sampler.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/grouped_batch_sampler.py new file mode 100644 index 0000000..138e106 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/samplers/grouped_batch_sampler.py @@ -0,0 +1,47 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +from torch.utils.data.sampler import BatchSampler, Sampler + + +class GroupedBatchSampler(BatchSampler): + """ + Wraps another sampler to yield a mini-batch of indices. + It enforces that the batch only contain elements from the same group. + It also tries to provide mini-batches which follows an ordering which is + as close as possible to the ordering from the original sampler. + """ + + def __init__(self, sampler, group_ids, batch_size): + """ + Args: + sampler (Sampler): Base sampler. + group_ids (list[int]): If the sampler produces indices in range [0, N), + `group_ids` must be a list of `N` ints which contains the group id of each sample. + The group ids must be a set of integers in the range [0, num_groups). + batch_size (int): Size of mini-batch. + """ + if not isinstance(sampler, Sampler): + raise ValueError( + "sampler should be an instance of " + "torch.utils.data.Sampler, but got sampler={}".format(sampler) + ) + self.sampler = sampler + self.group_ids = np.asarray(group_ids) + assert self.group_ids.ndim == 1 + self.batch_size = batch_size + groups = np.unique(self.group_ids).tolist() + + # buffer the indices of each group until batch size is reached + self.buffer_per_group = {k: [] for k in groups} + + def __iter__(self): + for idx in self.sampler: + group_id = self.group_ids[idx] + group_buffer = self.buffer_per_group[group_id] + group_buffer.append(idx) + if len(group_buffer) == self.batch_size: + yield group_buffer[:] # yield a copy of the list + del group_buffer[:] + + def __len__(self): + raise NotImplementedError("len() of GroupedBatchSampler is not well-defined.") diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/__init__.py new file mode 100644 index 0000000..f7638bb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .transform import * +from fvcore.transforms.transform import * +from .transform_gen import * + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform.py new file mode 100644 index 0000000..bd93753 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +# File: transform.py + +import numpy as np +import torch +import torch.nn.functional as F +from fvcore.transforms.transform import HFlipTransform, NoOpTransform, Transform +from PIL import Image + +try: + import cv2 # noqa +except ImportError: + # OpenCV is an optional dependency at the moment + pass + +__all__ = ["ExtentTransform", "ResizeTransform", "RotationTransform"] + + +class ExtentTransform(Transform): + """ + Extracts a subregion from the source image and scales it to the output size. + + The fill color is used to map pixels from the source rect that fall outside + the source image. + + See: https://pillow.readthedocs.io/en/latest/PIL.html#PIL.ImageTransform.ExtentTransform + """ + + def __init__(self, src_rect, output_size, interp=Image.LINEAR, fill=0): + """ + Args: + src_rect (x0, y0, x1, y1): src coordinates + output_size (h, w): dst image size + interp: PIL interpolation methods + fill: Fill color used when src_rect extends outside image + """ + super().__init__() + self._set_attributes(locals()) + + def apply_image(self, img, interp=None): + h, w = self.output_size + ret = Image.fromarray(img).transform( + size=(w, h), + method=Image.EXTENT, + data=self.src_rect, + resample=interp if interp else self.interp, + fill=self.fill, + ) + return np.asarray(ret) + + def apply_coords(self, coords): + # Transform image center from source coordinates into output coordinates + # and then map the new origin to the corner of the output image. + h, w = self.output_size + x0, y0, x1, y1 = self.src_rect + new_coords = coords.astype(np.float32) + new_coords[:, 0] -= 0.5 * (x0 + x1) + new_coords[:, 1] -= 0.5 * (y0 + y1) + new_coords[:, 0] *= w / (x1 - x0) + new_coords[:, 1] *= h / (y1 - y0) + new_coords[:, 0] += 0.5 * w + new_coords[:, 1] += 0.5 * h + return new_coords + + def apply_segmentation(self, segmentation): + segmentation = self.apply_image(segmentation, interp=Image.NEAREST) + return segmentation + + +class ResizeTransform(Transform): + """ + Resize the image to a target size. + """ + + def __init__(self, h, w, new_h, new_w, interp=None): + """ + Args: + h, w (int): original image size + new_h, new_w (int): new image size + interp: PIL interpolation methods, defaults to bilinear. + """ + # TODO decide on PIL vs opencv + super().__init__() + if interp is None: + interp = Image.BILINEAR + self._set_attributes(locals()) + + def apply_image(self, img, interp=None): + assert img.shape[:2] == (self.h, self.w) + assert len(img.shape) <= 4 + + if img.dtype == np.uint8: + pil_image = Image.fromarray(img) + interp_method = interp if interp is not None else self.interp + pil_image = pil_image.resize((self.new_w, self.new_h), interp_method) + ret = np.asarray(pil_image) + else: + # PIL only supports uint8 + img = torch.from_numpy(img) + shape = list(img.shape) + shape_4d = shape[:2] + [1] * (4 - len(shape)) + shape[2:] + img = img.view(shape_4d).permute(2, 3, 0, 1) # hw(c) -> nchw + _PIL_RESIZE_TO_INTERPOLATE_MODE = {Image.BILINEAR: "bilinear", Image.BICUBIC: "bicubic"} + mode = _PIL_RESIZE_TO_INTERPOLATE_MODE[self.interp] + img = F.interpolate(img, (self.new_h, self.new_w), mode=mode, align_corners=False) + shape[:2] = (self.new_h, self.new_w) + ret = img.permute(2, 3, 0, 1).view(shape).numpy() # nchw -> hw(c) + + return ret + + def apply_coords(self, coords): + coords[:, 0] = coords[:, 0] * (self.new_w * 1.0 / self.w) + coords[:, 1] = coords[:, 1] * (self.new_h * 1.0 / self.h) + return coords + + def apply_segmentation(self, segmentation): + segmentation = self.apply_image(segmentation, interp=Image.NEAREST) + return segmentation + + def inverse(self): + return ResizeTransform(self.new_h, self.new_w, self.h, self.w, self.interp) + + +class RotationTransform(Transform): + """ + This method returns a copy of this image, rotated the given + number of degrees counter clockwise around its center. + """ + + def __init__(self, h, w, angle, expand=True, center=None, interp=None): + """ + Args: + h, w (int): original image size + angle (float): degrees for rotation + expand (bool): choose if the image should be resized to fit the whole + rotated image (default), or simply cropped + center (tuple (width, height)): coordinates of the rotation center + if left to None, the center will be fit to the center of each image + center has no effect if expand=True because it only affects shifting + interp: cv2 interpolation method, default cv2.INTER_LINEAR + """ + super().__init__() + image_center = np.array((w / 2, h / 2)) + if center is None: + center = image_center + if interp is None: + interp = cv2.INTER_LINEAR + abs_cos, abs_sin = abs(np.cos(np.deg2rad(angle))), abs(np.sin(np.deg2rad(angle))) + if expand: + # find the new width and height bounds + bound_w, bound_h = np.rint( + [h * abs_sin + w * abs_cos, h * abs_cos + w * abs_sin] + ).astype(int) + else: + bound_w, bound_h = w, h + + self._set_attributes(locals()) + self.rm_coords = self.create_rotation_matrix() + # Needed because of this problem https://github.com/opencv/opencv/issues/11784 + self.rm_image = self.create_rotation_matrix(offset=-0.5) + + def apply_image(self, img, interp=None): + """ + demo should be a numpy array, formatted as Height * Width * Nchannels + """ + if len(img) == 0 or self.angle % 360 == 0: + return img + assert img.shape[:2] == (self.h, self.w) + interp = interp if interp is not None else self.interp + return cv2.warpAffine(img, self.rm_image, (self.bound_w, self.bound_h), flags=interp) + + def apply_coords(self, coords): + """ + coords should be a N * 2 array-like, containing N couples of (x, y) points + """ + coords = np.asarray(coords, dtype=float) + if len(coords) == 0 or self.angle % 360 == 0: + return coords + return cv2.transform(coords[:, np.newaxis, :], self.rm_coords)[:, 0, :] + + def apply_segmentation(self, segmentation): + segmentation = self.apply_image(segmentation, interp=cv2.INTER_NEAREST) + return segmentation + + def create_rotation_matrix(self, offset=0): + center = (self.center[0] + offset, self.center[1] + offset) + rm = cv2.getRotationMatrix2D(tuple(center), self.angle, 1) + if self.expand: + # Find the coordinates of the center of rotation in the new image + # The only point for which we know the future coordinates is the center of the image + rot_im_center = cv2.transform(self.image_center[None, None, :] + offset, rm)[0, 0, :] + new_center = np.array([self.bound_w / 2, self.bound_h / 2]) + offset - rot_im_center + # shift the rotation center to the new coordinates + rm[:, 2] += new_center + return rm + + +def HFlip_rotated_box(transform, rotated_boxes): + """ + Apply the horizontal flip transform on rotated boxes. + + Args: + rotated_boxes (ndarray): Nx5 floating point array of + (x_center, y_center, width, height, angle_degrees) format + in absolute coordinates. + """ + # Transform x_center + rotated_boxes[:, 0] = transform.width - rotated_boxes[:, 0] + # Transform angle + rotated_boxes[:, 4] = -rotated_boxes[:, 4] + return rotated_boxes + + +def Resize_rotated_box(transform, rotated_boxes): + """ + Apply the resizing transform on rotated boxes. For details of how these (approximation) + formulas are derived, please refer to :meth:`RotatedBoxes.scale`. + + Args: + rotated_boxes (ndarray): Nx5 floating point array of + (x_center, y_center, width, height, angle_degrees) format + in absolute coordinates. + """ + scale_factor_x = transform.new_w * 1.0 / transform.w + scale_factor_y = transform.new_h * 1.0 / transform.h + rotated_boxes[:, 0] *= scale_factor_x + rotated_boxes[:, 1] *= scale_factor_y + theta = rotated_boxes[:, 4] * np.pi / 180.0 + c = np.cos(theta) + s = np.sin(theta) + rotated_boxes[:, 2] *= np.sqrt(np.square(scale_factor_x * c) + np.square(scale_factor_y * s)) + rotated_boxes[:, 3] *= np.sqrt(np.square(scale_factor_x * s) + np.square(scale_factor_y * c)) + rotated_boxes[:, 4] = np.arctan2(scale_factor_x * s, scale_factor_y * c) * 180 / np.pi + + return rotated_boxes + + +HFlipTransform.register_type("rotated_box", HFlip_rotated_box) +NoOpTransform.register_type("rotated_box", lambda t, x: x) +ResizeTransform.register_type("rotated_box", Resize_rotated_box) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform_gen.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform_gen.py new file mode 100644 index 0000000..197a0eb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/data/transforms/transform_gen.py @@ -0,0 +1,534 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +# File: transformer.py + +import inspect +import numpy as np +import pprint +import sys +from abc import ABCMeta, abstractmethod +from fvcore.transforms.transform import ( + BlendTransform, + CropTransform, + HFlipTransform, + NoOpTransform, + Transform, + TransformList, + VFlipTransform, +) +from PIL import Image + +from .transform import ExtentTransform, ResizeTransform, RotationTransform + +__all__ = [ + "RandomApply", + "RandomBrightness", + "RandomContrast", + "RandomCrop", + "RandomExtent", + "RandomFlip", + "RandomSaturation", + "RandomLighting", + "RandomRotation", + "Resize", + "ResizeShortestEdge", + "TransformGen", + "apply_transform_gens", +] + + +def check_dtype(img): + assert isinstance(img, np.ndarray), "[TransformGen] Needs an numpy array, but got a {}!".format( + type(img) + ) + assert not isinstance(img.dtype, np.integer) or ( + img.dtype == np.uint8 + ), "[TransformGen] Got image of type {}, use uint8 or floating points instead!".format( + img.dtype + ) + assert img.ndim in [2, 3], img.ndim + + +class TransformGen(metaclass=ABCMeta): + """ + TransformGen takes an image of type uint8 in range [0, 255], or + floating point in range [0, 1] or [0, 255] as input. + + It creates a :class:`Transform` based on the given image, sometimes with randomness. + The transform can then be used to transform images + or other data (boxes, points, annotations, etc.) associated with it. + + The assumption made in this class + is that the image itself is sufficient to instantiate a transform. + When this assumption is not true, you need to create the transforms by your own. + + A list of `TransformGen` can be applied with :func:`apply_transform_gens`. + """ + + def _init(self, params=None): + if params: + for k, v in params.items(): + if k != "self" and not k.startswith("_"): + setattr(self, k, v) + + @abstractmethod + def get_transform(self, img): + pass + + def _rand_range(self, low=1.0, high=None, size=None): + """ + Uniform float random number between low and high. + """ + if high is None: + low, high = 0, low + if size is None: + size = [] + return np.random.uniform(low, high, size) + + def __repr__(self): + """ + Produce something like: + "MyTransformGen(field1={self.field1}, field2={self.field2})" + """ + try: + sig = inspect.signature(self.__init__) + classname = type(self).__name__ + argstr = [] + for name, param in sig.parameters.items(): + assert ( + param.kind != param.VAR_POSITIONAL and param.kind != param.VAR_KEYWORD + ), "The default __repr__ doesn't support *args or **kwargs" + assert hasattr(self, name), ( + "Attribute {} not found! " + "Default __repr__ only works if attributes match the constructor.".format(name) + ) + attr = getattr(self, name) + default = param.default + if default is attr: + continue + argstr.append("{}={}".format(name, pprint.pformat(attr))) + return "{}({})".format(classname, ", ".join(argstr)) + except AssertionError: + return super().__repr__() + + __str__ = __repr__ + + +class RandomApply(TransformGen): + """ + Randomly apply the wrapper transformation with a given probability. + """ + + def __init__(self, transform, prob=0.5): + """ + Args: + transform (Transform, TransformGen): the transform to be wrapped + by the `RandomApply`. The `transform` can either be a + `Transform` or `TransformGen` instance. + prob (float): probability between 0.0 and 1.0 that + the wrapper transformation is applied + """ + super().__init__() + assert isinstance(transform, (Transform, TransformGen)), ( + f"The given transform must either be a Transform or TransformGen instance. " + f"Not {type(transform)}" + ) + assert 0.0 <= prob <= 1.0, f"Probablity must be between 0.0 and 1.0 (given: {prob})" + self.prob = prob + self.transform = transform + + def get_transform(self, img): + do = self._rand_range() < self.prob + if do: + if isinstance(self.transform, TransformGen): + return self.transform.get_transform(img) + else: + return self.transform + else: + return NoOpTransform() + + +class RandomFlip(TransformGen): + """ + Flip the image horizontally or vertically with the given probability. + """ + + def __init__(self, prob=0.5, *, horizontal=True, vertical=False): + """ + Args: + prob (float): probability of flip. + horizontal (boolean): whether to apply horizontal flipping + vertical (boolean): whether to apply vertical flipping + """ + super().__init__() + + if horizontal and vertical: + raise ValueError("Cannot do both horiz and vert. Please use two Flip instead.") + if not horizontal and not vertical: + raise ValueError("At least one of horiz or vert has to be True!") + self._init(locals()) + + def get_transform(self, img): + h, w = img.shape[:2] + do = self._rand_range() < self.prob + if do: + if self.horizontal: + return HFlipTransform(w) + elif self.vertical: + return VFlipTransform(h) + else: + return NoOpTransform() + + +class Resize(TransformGen): + """ Resize image to a target size""" + + def __init__(self, shape, interp=Image.BILINEAR): + """ + Args: + shape: (h, w) tuple or a int + interp: PIL interpolation method + """ + if isinstance(shape, int): + shape = (shape, shape) + shape = tuple(shape) + self._init(locals()) + + def get_transform(self, img): + return ResizeTransform( + img.shape[0], img.shape[1], self.shape[0], self.shape[1], self.interp + ) + + +class ResizeShortestEdge(TransformGen): + """ + Scale the shorter edge to the given size, with a limit of `max_size` on the longer edge. + If `max_size` is reached, then downscale so that the longer edge does not exceed max_size. + """ + + def __init__( + self, short_edge_length, max_size=sys.maxsize, sample_style="range", interp=Image.BILINEAR + ): + """ + Args: + short_edge_length (list[int]): If ``sample_style=="range"``, + a [min, max] interval from which to sample the shortest edge length. + If ``sample_style=="choice"``, a list of shortest edge lengths to sample from. + max_size (int): maximum allowed longest edge length. + sample_style (str): either "range" or "choice". + """ + super().__init__() + assert sample_style in ["range", "choice"], sample_style + + self.is_range = sample_style == "range" + if isinstance(short_edge_length, int): + short_edge_length = (short_edge_length, short_edge_length) + self._init(locals()) + + def get_transform(self, img): + h, w = img.shape[:2] + + if self.is_range: + size = np.random.randint(self.short_edge_length[0], self.short_edge_length[1] + 1) + else: + size = np.random.choice(self.short_edge_length) + if size == 0: + return NoOpTransform() + + scale = size * 1.0 / min(h, w) + if h < w: + newh, neww = size, scale * w + else: + newh, neww = scale * h, size + if max(newh, neww) > self.max_size: + scale = self.max_size * 1.0 / max(newh, neww) + newh = newh * scale + neww = neww * scale + neww = int(neww + 0.5) + newh = int(newh + 0.5) + return ResizeTransform(h, w, newh, neww, self.interp) + + +class RandomRotation(TransformGen): + """ + This method returns a copy of this image, rotated the given + number of degrees counter clockwise around the given center. + """ + + def __init__(self, angle, expand=True, center=None, sample_style="range", interp=None): + """ + Args: + angle (list[float]): If ``sample_style=="range"``, + a [min, max] interval from which to sample the angle (in degrees). + If ``sample_style=="choice"``, a list of angles to sample from + expand (bool): choose if the image should be resized to fit the whole + rotated image (default), or simply cropped + center (list[[float, float]]): If ``sample_style=="range"``, + a [[minx, miny], [maxx, maxy]] relative interval from which to sample the center, + [0, 0] being the top left of the image and [1, 1] the bottom right. + If ``sample_style=="choice"``, a list of centers to sample from + Default: None, which means that the center of rotation is the center of the image + center has no effect if expand=True because it only affects shifting + """ + super().__init__() + assert sample_style in ["range", "choice"], sample_style + self.is_range = sample_style == "range" + if isinstance(angle, (float, int)): + angle = (angle, angle) + if center is not None and isinstance(center[0], (float, int)): + center = (center, center) + self._init(locals()) + + def get_transform(self, img): + h, w = img.shape[:2] + center = None + if self.is_range: + angle = np.random.uniform(self.angle[0], self.angle[1]) + if self.center is not None: + center = ( + np.random.uniform(self.center[0][0], self.center[1][0]), + np.random.uniform(self.center[0][1], self.center[1][1]), + ) + else: + angle = np.random.choice(self.angle) + if self.center is not None: + center = np.random.choice(self.center) + + if center is not None: + center = (w * center[0], h * center[1]) # Convert to absolute coordinates + + return RotationTransform(h, w, angle, expand=self.expand, center=center, interp=self.interp) + + +class RandomCrop(TransformGen): + """ + Randomly crop a subimage out of an image. + """ + + def __init__(self, crop_type: str, crop_size): + """ + Args: + crop_type (str): one of "relative_range", "relative", "absolute". + See `config/defaults.py` for explanation. + crop_size (tuple[float]): the relative ratio or absolute pixels of + height and width + """ + super().__init__() + assert crop_type in ["relative_range", "relative", "absolute"] + self._init(locals()) + + def get_transform(self, img): + h, w = img.shape[:2] + croph, cropw = self.get_crop_size((h, w)) + assert h >= croph and w >= cropw, "Shape computation in {} has bugs.".format(self) + h0 = np.random.randint(h - croph + 1) + w0 = np.random.randint(w - cropw + 1) + return CropTransform(w0, h0, cropw, croph) + + def get_crop_size(self, image_size): + """ + Args: + image_size (tuple): height, width + + Returns: + crop_size (tuple): height, width in absolute pixels + """ + h, w = image_size + if self.crop_type == "relative": + ch, cw = self.crop_size + return int(h * ch + 0.5), int(w * cw + 0.5) + elif self.crop_type == "relative_range": + crop_size = np.asarray(self.crop_size, dtype=np.float32) + ch, cw = crop_size + np.random.rand(2) * (1 - crop_size) + return int(h * ch + 0.5), int(w * cw + 0.5) + elif self.crop_type == "absolute": + return (min(self.crop_size[0], h), min(self.crop_size[1], w)) + else: + NotImplementedError("Unknown crop type {}".format(self.crop_type)) + + +class RandomExtent(TransformGen): + """ + Outputs an image by cropping a random "subrect" of the source image. + + The subrect can be parameterized to include pixels outside the source image, + in which case they will be set to zeros (i.e. black). The size of the output + image will vary with the size of the random subrect. + """ + + def __init__(self, scale_range, shift_range): + """ + Args: + output_size (h, w): Dimensions of output image + scale_range (l, h): Range of input-to-output size scaling factor + shift_range (x, y): Range of shifts of the cropped subrect. The rect + is shifted by [w / 2 * Uniform(-x, x), h / 2 * Uniform(-y, y)], + where (w, h) is the (width, height) of the input image. Set each + component to zero to crop at the image's center. + """ + super().__init__() + self._init(locals()) + + def get_transform(self, img): + img_h, img_w = img.shape[:2] + + # Initialize src_rect to fit the input image. + src_rect = np.array([-0.5 * img_w, -0.5 * img_h, 0.5 * img_w, 0.5 * img_h]) + + # Apply a random scaling to the src_rect. + src_rect *= np.random.uniform(self.scale_range[0], self.scale_range[1]) + + # Apply a random shift to the coordinates origin. + src_rect[0::2] += self.shift_range[0] * img_w * (np.random.rand() - 0.5) + src_rect[1::2] += self.shift_range[1] * img_h * (np.random.rand() - 0.5) + + # Map src_rect coordinates into image coordinates (center at corner). + src_rect[0::2] += 0.5 * img_w + src_rect[1::2] += 0.5 * img_h + + return ExtentTransform( + src_rect=(src_rect[0], src_rect[1], src_rect[2], src_rect[3]), + output_size=(int(src_rect[3] - src_rect[1]), int(src_rect[2] - src_rect[0])), + ) + + +class RandomContrast(TransformGen): + """ + Randomly transforms image contrast. + + Contrast intensity is uniformly sampled in (intensity_min, intensity_max). + - intensity < 1 will reduce contrast + - intensity = 1 will preserve the input image + - intensity > 1 will increase contrast + + See: https://pillow.readthedocs.io/en/3.0.x/reference/ImageEnhance.html + """ + + def __init__(self, intensity_min, intensity_max): + """ + Args: + intensity_min (float): Minimum augmentation + intensity_max (float): Maximum augmentation + """ + super().__init__() + self._init(locals()) + + def get_transform(self, img): + w = np.random.uniform(self.intensity_min, self.intensity_max) + return BlendTransform(src_image=img.mean(), src_weight=1 - w, dst_weight=w) + + +class RandomBrightness(TransformGen): + """ + Randomly transforms image brightness. + + Brightness intensity is uniformly sampled in (intensity_min, intensity_max). + - intensity < 1 will reduce brightness + - intensity = 1 will preserve the input image + - intensity > 1 will increase brightness + + See: https://pillow.readthedocs.io/en/3.0.x/reference/ImageEnhance.html + """ + + def __init__(self, intensity_min, intensity_max): + """ + Args: + intensity_min (float): Minimum augmentation + intensity_max (float): Maximum augmentation + """ + super().__init__() + self._init(locals()) + + def get_transform(self, img): + w = np.random.uniform(self.intensity_min, self.intensity_max) + return BlendTransform(src_image=0, src_weight=1 - w, dst_weight=w) + + +class RandomSaturation(TransformGen): + """ + Randomly transforms image saturation. + + Saturation intensity is uniformly sampled in (intensity_min, intensity_max). + - intensity < 1 will reduce saturation (make the image more grayscale) + - intensity = 1 will preserve the input image + - intensity > 1 will increase saturation + + See: https://pillow.readthedocs.io/en/3.0.x/reference/ImageEnhance.html + """ + + def __init__(self, intensity_min, intensity_max): + """ + Args: + intensity_min (float): Minimum augmentation (1 preserves input). + intensity_max (float): Maximum augmentation (1 preserves input). + """ + super().__init__() + self._init(locals()) + + def get_transform(self, img): + assert img.shape[-1] == 3, "Saturation only works on RGB images" + w = np.random.uniform(self.intensity_min, self.intensity_max) + grayscale = img.dot([0.299, 0.587, 0.114])[:, :, np.newaxis] + return BlendTransform(src_image=grayscale, src_weight=1 - w, dst_weight=w) + + +class RandomLighting(TransformGen): + """ + Randomly transforms image color using fixed PCA over ImageNet. + + The degree of color jittering is randomly sampled via a normal distribution, + with standard deviation given by the scale parameter. + """ + + def __init__(self, scale): + """ + Args: + scale (float): Standard deviation of principal component weighting. + """ + super().__init__() + self._init(locals()) + self.eigen_vecs = np.array( + [[-0.5675, 0.7192, 0.4009], [-0.5808, -0.0045, -0.8140], [-0.5836, -0.6948, 0.4203]] + ) + self.eigen_vals = np.array([0.2175, 0.0188, 0.0045]) + + def get_transform(self, img): + assert img.shape[-1] == 3, "Saturation only works on RGB images" + weights = np.random.normal(scale=self.scale, size=3) + return BlendTransform( + src_image=self.eigen_vecs.dot(weights * self.eigen_vals), src_weight=1.0, dst_weight=1.0 + ) + + +def apply_transform_gens(transform_gens, img): + """ + Apply a list of :class:`TransformGen` or :class:`Transform` on the input image, and + returns the transformed image and a list of transforms. + + We cannot simply create and return all transforms without + applying it to the image, because a subsequent transform may + need the output of the previous one. + + Args: + transform_gens (list): list of :class:`TransformGen` or :class:`Transform` instance to + be applied. + img (ndarray): uint8 or floating point images with 1 or 3 channels. + + Returns: + ndarray: the transformed image + TransformList: contain the transforms that's used. + """ + for g in transform_gens: + assert isinstance(g, (Transform, TransformGen)), g + + check_dtype(img) + + tfms = [] + for g in transform_gens: + tfm = g.get_transform(img) if isinstance(g, TransformGen) else g + assert isinstance( + tfm, Transform + ), "TransformGen {} must return an instance of Transform! Got {} instead".format(g, tfm) + img = tfm.apply_image(img) + tfms.append(tfm) + return img, TransformList(tfms) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/__init__.py new file mode 100644 index 0000000..6a4538d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +from .launch import * +from .train_loop import * + +__all__ = [k for k in globals().keys() if not k.startswith("_")] + + +# prefer to let hooks and defaults live in separate namespaces (therefore not in __all__) +# but still make them available here +from .hooks import * +from .defaults import * diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/defaults.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/defaults.py new file mode 100644 index 0000000..db9ab68 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/defaults.py @@ -0,0 +1,531 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +""" +This file contains components with some default boilerplate logic user may need +in training / testing. They will not work for everyone, but many users may find them useful. + +The behavior of functions/classes in this file is subject to change, +since they are meant to represent the "common default behavior" people need in their projects. +""" + +import argparse +import logging +import os +import sys +from collections import OrderedDict +import torch +from fvcore.common.file_io import PathManager +from fvcore.nn.precise_bn import get_bn_modules +from torch.nn.parallel import DistributedDataParallel + +import detectron2.data.transforms as T +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.data import ( + MetadataCatalog, + build_detection_test_loader, + build_detection_train_loader, +) +from detectron2.evaluation import ( + DatasetEvaluator, + inference_on_dataset, + print_csv_format, + verify_results, +) +from detectron2.modeling import build_model +from detectron2.solver import build_lr_scheduler, build_optimizer +from detectron2.utils import comm +from detectron2.utils.collect_env import collect_env_info +from detectron2.utils.env import seed_all_rng +from detectron2.utils.events import CommonMetricPrinter, JSONWriter, TensorboardXWriter +from detectron2.utils.logger import setup_logger + +from . import hooks +from .train_loop import SimpleTrainer + +__all__ = ["default_argument_parser", "default_setup", "DefaultPredictor", "DefaultTrainer"] + + +def default_argument_parser(epilog=None): + """ + Create a parser with some common arguments used by detectron2 users. + + Args: + epilog (str): epilog passed to ArgumentParser describing the usage. + + Returns: + argparse.ArgumentParser: + """ + parser = argparse.ArgumentParser( + epilog=epilog + or f""" +Examples: + +Run on single machine: + $ {sys.argv[0]} --num-gpus 8 --config-file cfg.yaml MODEL.WEIGHTS /path/to/weight.pth + +Run on multiple machines: + (machine0)$ {sys.argv[0]} --machine-rank 0 --num-machines 2 --dist-url [--other-flags] + (machine1)$ {sys.argv[0]} --machine-rank 1 --num-machines 2 --dist-url [--other-flags] +""", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("--config-file", default="", metavar="FILE", help="path to config file") + parser.add_argument( + "--resume", + action="store_true", + help="whether to attempt to resume from the checkpoint directory", + ) + parser.add_argument("--eval-only", action="store_true", help="perform evaluation only") + parser.add_argument("--num-gpus", type=int, default=1, help="number of gpus *per machine*") + parser.add_argument("--num-machines", type=int, default=1, help="total number of machines") + parser.add_argument( + "--machine-rank", type=int, default=0, help="the rank of this machine (unique per machine)" + ) + + # PyTorch still may leave orphan processes in multi-gpu training. + # Therefore we use a deterministic way to obtain port, + # so that users are aware of orphan processes by seeing the port occupied. + port = 2 ** 15 + 2 ** 14 + hash(os.getuid() if sys.platform != "win32" else 1) % 2 ** 14 + parser.add_argument( + "--dist-url", + default="tcp://127.0.0.1:{}".format(port), + help="initialization URL for pytorch distributed backend. See " + "https://pytorch.org/docs/stable/distributed.html for details.", + ) + parser.add_argument( + "opts", + help="Modify config options using the command-line", + default=None, + nargs=argparse.REMAINDER, + ) + return parser + + +def default_setup(cfg, args): + """ + Perform some basic common setups at the beginning of a job, including: + + 1. Set up the detectron2 logger + 2. Log basic information about environment, cmdline arguments, and config + 3. Backup the config to the output directory + + Args: + cfg (CfgNode): the full config to be used + args (argparse.NameSpace): the command line arguments to be logged + """ + output_dir = cfg.OUTPUT_DIR + if comm.is_main_process() and output_dir: + PathManager.mkdirs(output_dir) + + rank = comm.get_rank() + setup_logger(output_dir, distributed_rank=rank, name="fvcore") + logger = setup_logger(output_dir, distributed_rank=rank) + + logger.info("Rank of current process: {}. World size: {}".format(rank, comm.get_world_size())) + logger.info("Environment info:\n" + collect_env_info()) + + logger.info("Command line arguments: " + str(args)) + if hasattr(args, "config_file") and args.config_file != "": + logger.info( + "Contents of args.config_file={}:\n{}".format( + args.config_file, PathManager.open(args.config_file, "r").read() + ) + ) + + logger.info("Running with full config:\n{}".format(cfg)) + if comm.is_main_process() and output_dir: + # Note: some of our scripts may expect the existence of + # config.yaml in output directory + path = os.path.join(output_dir, "config.yaml") + with PathManager.open(path, "w") as f: + f.write(cfg.dump()) + logger.info("Full config saved to {}".format(path)) + + # make sure each worker has a different, yet deterministic seed if specified + seed_all_rng(None if cfg.SEED < 0 else cfg.SEED + rank) + + # cudnn benchmark has large overhead. It shouldn't be used considering the small size of + # typical validation set. + if not (hasattr(args, "eval_only") and args.eval_only): + torch.backends.cudnn.benchmark = cfg.CUDNN_BENCHMARK + + +class DefaultPredictor: + """ + Create a simple end-to-end predictor with the given config that runs on + single device for a single input image. + + Compared to using the model directly, this class does the following additions: + + 1. Load checkpoint from `cfg.MODEL.WEIGHTS`. + 2. Always take BGR image as the input and apply conversion defined by `cfg.INPUT.FORMAT`. + 3. Apply resizing defined by `cfg.INPUT.{MIN,MAX}_SIZE_TEST`. + 4. Take one input image and produce a single output, instead of a batch. + + If you'd like to do anything more fancy, please refer to its source code + as examples to build and use the model manually. + + Attributes: + metadata (Metadata): the metadata of the underlying dataset, obtained from + cfg.DATASETS.TEST. + + Examples: + + .. code-block:: python + + pred = DefaultPredictor(cfg) + inputs = cv2.imread("input.jpg") + outputs = pred(inputs) + """ + + def __init__(self, cfg): + self.cfg = cfg.clone() # cfg can be modified by model + self.model = build_model(self.cfg) + self.model.eval() + self.metadata = MetadataCatalog.get(cfg.DATASETS.TEST[0]) + + checkpointer = DetectionCheckpointer(self.model) + checkpointer.load(cfg.MODEL.WEIGHTS) + + self.transform_gen = T.ResizeShortestEdge( + [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST], cfg.INPUT.MAX_SIZE_TEST + ) + + self.input_format = cfg.INPUT.FORMAT + assert self.input_format in ["RGB", "BGR"], self.input_format + + def __call__(self, original_image): + """ + Args: + original_image (np.ndarray): an image of shape (H, W, C) (in BGR order). + + Returns: + predictions (dict): + the output of the model for one image only. + See :doc:`/tutorials/models` for details about the format. + """ + with torch.no_grad(): # https://github.com/sphinx-doc/sphinx/issues/4258 + # Apply pre-processing to image. + if self.input_format == "RGB": + # whether the model expects BGR inputs or RGB + original_image = original_image[:, :, ::-1] + height, width = original_image.shape[:2] + image = self.transform_gen.get_transform(original_image).apply_image(original_image) + image = torch.as_tensor(image.astype("float32").transpose(2, 0, 1)) + + inputs = {"image": image, "height": height, "width": width} + predictions = self.model([inputs])[0] + return predictions + + +class DefaultTrainer(SimpleTrainer): + """ + A trainer with default training logic. Compared to `SimpleTrainer`, it + contains the following logic in addition: + + 1. Create model, optimizer, scheduler, dataloader from the given config. + 2. Load a checkpoint or `cfg.MODEL.WEIGHTS`, if exists, when + `resume_or_load` is called. + 3. Register a few common hooks. + + It is created to simplify the **standard model training workflow** and reduce code boilerplate + for users who only need the standard training workflow, with standard features. + It means this class makes *many assumptions* about your training logic that + may easily become invalid in a new research. In fact, any assumptions beyond those made in the + :class:`SimpleTrainer` are too much for research. + + The code of this class has been annotated about restrictive assumptions it mades. + When they do not work for you, you're encouraged to: + + 1. Overwrite methods of this class, OR: + 2. Use :class:`SimpleTrainer`, which only does minimal SGD training and + nothing else. You can then add your own hooks if needed. OR: + 3. Write your own training loop similar to `tools/plain_train_net.py`. + + Also note that the behavior of this class, like other functions/classes in + this file, is not stable, since it is meant to represent the "common default behavior". + It is only guaranteed to work well with the standard models and training workflow in detectron2. + To obtain more stable behavior, write your own training logic with other public APIs. + + Examples: + + .. code-block:: python + + trainer = DefaultTrainer(cfg) + trainer.resume_or_load() # load last checkpoint or MODEL.WEIGHTS + trainer.train() + + Attributes: + scheduler: + checkpointer (DetectionCheckpointer): + cfg (CfgNode): + """ + + def __init__(self, cfg): + """ + Args: + cfg (CfgNode): + """ + logger = logging.getLogger("detectron2") + if not logger.isEnabledFor(logging.INFO): # setup_logger is not called for d2 + setup_logger() + # Assume these objects must be constructed in this order. + model = self.build_model(cfg) + optimizer = self.build_optimizer(cfg, model) + data_loader = self.build_train_loader(cfg) + + # For training, wrap with DDP. But don't need this for inference. + if comm.get_world_size() > 1: + model = DistributedDataParallel( + model, device_ids=[comm.get_local_rank()], broadcast_buffers=False + ) + super().__init__(model, data_loader, optimizer) + + self.scheduler = self.build_lr_scheduler(cfg, optimizer) + # Assume no other objects need to be checkpointed. + # We can later make it checkpoint the stateful hooks + self.checkpointer = DetectionCheckpointer( + # Assume you want to save checkpoints together with logs/statistics + model, + cfg.OUTPUT_DIR, + optimizer=optimizer, + scheduler=self.scheduler, + ) + self.start_iter = 0 + self.max_iter = cfg.SOLVER.MAX_ITER + self.cfg = cfg + + self.register_hooks(self.build_hooks()) + + def resume_or_load(self, resume=True): + """ + If `resume==True`, and last checkpoint exists, resume from it and load all + checkpointables (eg. optimizer and scheduler). + + Otherwise, load the model specified by the config (skip all checkpointables). + + Args: + resume (bool): whether to do resume or not + """ + checkpoint = self.checkpointer.resume_or_load(self.cfg.MODEL.WEIGHTS, resume=resume) + self.start_iter = checkpoint.get("iteration", -1) if resume else -1 + # The checkpoint stores the training iteration that just finished, thus we start + # at the next iteration (or iter zero if there's no checkpoint). + self.start_iter += 1 + + def build_hooks(self): + """ + Build a list of default hooks, including timing, evaluation, + checkpointing, lr scheduling, precise BN, writing events. + + Returns: + list[HookBase]: + """ + cfg = self.cfg.clone() + cfg.defrost() + cfg.DATALOADER.NUM_WORKERS = 0 # save some memory and time for PreciseBN + + ret = [ + hooks.IterationTimer(), + hooks.LRScheduler(self.optimizer, self.scheduler), + hooks.PreciseBN( + # Run at the same freq as (but before) evaluation. + cfg.TEST.EVAL_PERIOD, + self.model, + # Build a new data loader to not affect training + self.build_train_loader(cfg), + cfg.TEST.PRECISE_BN.NUM_ITER, + ) + if cfg.TEST.PRECISE_BN.ENABLED and get_bn_modules(self.model) + else None, + ] + + # Do PreciseBN before checkpointer, because it updates the model and need to + # be saved by checkpointer. + # This is not always the best: if checkpointing has a different frequency, + # some checkpoints may have more precise statistics than others. + if comm.is_main_process(): + ret.append(hooks.PeriodicCheckpointer(self.checkpointer, cfg.SOLVER.CHECKPOINT_PERIOD)) + + def test_and_save_results(): + self._last_eval_results = self.test(self.cfg, self.model) + return self._last_eval_results + + # Do evaluation after checkpointer, because then if it fails, + # we can use the saved checkpoint to debug. + ret.append(hooks.EvalHook(cfg.TEST.EVAL_PERIOD, test_and_save_results)) + + if comm.is_main_process(): + # run writers in the end, so that evaluation metrics are written + ret.append(hooks.PeriodicWriter(self.build_writers(), period=20)) + return ret + + def build_writers(self): + """ + Build a list of writers to be used. By default it contains + writers that write metrics to the screen, + a json file, and a tensorboard event file respectively. + If you'd like a different list of writers, you can overwrite it in + your trainer. + + Returns: + list[EventWriter]: a list of :class:`EventWriter` objects. + + It is now implemented by: + + .. code-block:: python + + return [ + CommonMetricPrinter(self.max_iter), + JSONWriter(os.path.join(self.cfg.OUTPUT_DIR, "metrics.json")), + TensorboardXWriter(self.cfg.OUTPUT_DIR), + ] + + """ + # Here the default print/log frequency of each writer is used. + return [ + # It may not always print what you want to see, since it prints "common" metrics only. + CommonMetricPrinter(self.max_iter), + JSONWriter(os.path.join(self.cfg.OUTPUT_DIR, "metrics.json")), + TensorboardXWriter(self.cfg.OUTPUT_DIR), + ] + + def train(self): + """ + Run training. + + Returns: + OrderedDict of results, if evaluation is enabled. Otherwise None. + """ + super().train(self.start_iter, self.max_iter) + if len(self.cfg.TEST.EXPECTED_RESULTS) and comm.is_main_process(): + assert hasattr( + self, "_last_eval_results" + ), "No evaluation results obtained during training!" + verify_results(self.cfg, self._last_eval_results) + return self._last_eval_results + + @classmethod + def build_model(cls, cfg): + """ + Returns: + torch.nn.Module: + + It now calls :func:`detectron2.modeling.build_model`. + Overwrite it if you'd like a different model. + """ + model = build_model(cfg) + logger = logging.getLogger(__name__) + logger.info("Model:\n{}".format(model)) + return model + + @classmethod + def build_optimizer(cls, cfg, model): + """ + Returns: + torch.optim.Optimizer: + + It now calls :func:`detectron2.solver.build_optimizer`. + Overwrite it if you'd like a different optimizer. + """ + return build_optimizer(cfg, model) + + @classmethod + def build_lr_scheduler(cls, cfg, optimizer): + """ + It now calls :func:`detectron2.solver.build_lr_scheduler`. + Overwrite it if you'd like a different scheduler. + """ + return build_lr_scheduler(cfg, optimizer) + + @classmethod + def build_train_loader(cls, cfg): + """ + Returns: + iterable + + It now calls :func:`detectron2.data.build_detection_train_loader`. + Overwrite it if you'd like a different data loader. + """ + return build_detection_train_loader(cfg) + + @classmethod + def build_test_loader(cls, cfg, dataset_name): + """ + Returns: + iterable + + It now calls :func:`detectron2.data.build_detection_test_loader`. + Overwrite it if you'd like a different data loader. + """ + return build_detection_test_loader(cfg, dataset_name) + + @classmethod + def build_evaluator(cls, cfg, dataset_name): + """ + Returns: + DatasetEvaluator or None + + It is not implemented by default. + """ + raise NotImplementedError( + """ +If you want DefaultTrainer to automatically run evaluation, +please implement `build_evaluator()` in subclasses (see train_net.py for example). +Alternatively, you can call evaluation functions yourself (see Colab balloon tutorial for example). +""" + ) + + @classmethod + def test(cls, cfg, model, evaluators=None): + """ + Args: + cfg (CfgNode): + model (nn.Module): + evaluators (list[DatasetEvaluator] or None): if None, will call + :meth:`build_evaluator`. Otherwise, must have the same length as + `cfg.DATASETS.TEST`. + + Returns: + dict: a dict of result metrics + """ + logger = logging.getLogger(__name__) + if isinstance(evaluators, DatasetEvaluator): + evaluators = [evaluators] + if evaluators is not None: + assert len(cfg.DATASETS.TEST) == len(evaluators), "{} != {}".format( + len(cfg.DATASETS.TEST), len(evaluators) + ) + + results = OrderedDict() + for idx, dataset_name in enumerate(cfg.DATASETS.TEST): + data_loader = cls.build_test_loader(cfg, dataset_name) + # When evaluators are passed in as arguments, + # implicitly assume that evaluators can be created before data_loader. + if evaluators is not None: + evaluator = evaluators[idx] + else: + try: + evaluator = cls.build_evaluator(cfg, dataset_name) + except NotImplementedError: + logger.warn( + "No evaluator found. Use `DefaultTrainer.test(evaluators=)`, " + "or implement its `build_evaluator` method." + ) + results[dataset_name] = {} + continue + results_i = inference_on_dataset(model, data_loader, evaluator) + results[dataset_name] = results_i + if comm.is_main_process(): + assert isinstance( + results_i, dict + ), "Evaluator must return a dict on the main process. Got {} instead.".format( + results_i + ) + logger.info("Evaluation results for {} in csv format:".format(dataset_name)) + print_csv_format(results_i) + + if len(results) == 1: + results = list(results.values())[0] + return results diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/hooks.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/hooks.py new file mode 100644 index 0000000..e5085b4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/hooks.py @@ -0,0 +1,427 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import datetime +import itertools +import logging +import os +import tempfile +import time +from collections import Counter +import torch +from fvcore.common.checkpoint import PeriodicCheckpointer as _PeriodicCheckpointer +from fvcore.common.file_io import PathManager +from fvcore.common.timer import Timer +from fvcore.nn.precise_bn import get_bn_modules, update_bn_stats + +import detectron2.utils.comm as comm +from detectron2.evaluation.testing import flatten_results_dict +from detectron2.utils.events import EventStorage, EventWriter + +from .train_loop import HookBase + +__all__ = [ + "CallbackHook", + "IterationTimer", + "PeriodicWriter", + "PeriodicCheckpointer", + "LRScheduler", + "AutogradProfiler", + "EvalHook", + "PreciseBN", +] + + +""" +Implement some common hooks. +""" + + +class CallbackHook(HookBase): + """ + Create a hook using callback functions provided by the user. + """ + + def __init__(self, *, before_train=None, after_train=None, before_step=None, after_step=None): + """ + Each argument is a function that takes one argument: the trainer. + """ + self._before_train = before_train + self._before_step = before_step + self._after_step = after_step + self._after_train = after_train + + def before_train(self): + if self._before_train: + self._before_train(self.trainer) + + def after_train(self): + if self._after_train: + self._after_train(self.trainer) + # The functions may be closures that hold reference to the trainer + # Therefore, delete them to avoid circular reference. + del self._before_train, self._after_train + del self._before_step, self._after_step + + def before_step(self): + if self._before_step: + self._before_step(self.trainer) + + def after_step(self): + if self._after_step: + self._after_step(self.trainer) + + +class IterationTimer(HookBase): + """ + Track the time spent for each iteration (each run_step call in the trainer). + Print a summary in the end of training. + + This hook uses the time between the call to its :meth:`before_step` + and :meth:`after_step` methods. + Under the convention that :meth:`before_step` of all hooks should only + take negligible amount of time, the :class:`IterationTimer` hook should be + placed at the beginning of the list of hooks to obtain accurate timing. + """ + + def __init__(self, warmup_iter=3): + """ + Args: + warmup_iter (int): the number of iterations at the beginning to exclude + from timing. + """ + self._warmup_iter = warmup_iter + self._step_timer = Timer() + self._start_time = time.perf_counter() + self._total_timer = Timer() + + def before_train(self): + self._start_time = time.perf_counter() + self._total_timer.reset() + self._total_timer.pause() + + def after_train(self): + logger = logging.getLogger(__name__) + total_time = time.perf_counter() - self._start_time + total_time_minus_hooks = self._total_timer.seconds() + hook_time = total_time - total_time_minus_hooks + + num_iter = self.trainer.iter + 1 - self.trainer.start_iter - self._warmup_iter + + if num_iter > 0 and total_time_minus_hooks > 0: + # Speed is meaningful only after warmup + # NOTE this format is parsed by grep in some scripts + logger.info( + "Overall training speed: {} iterations in {} ({:.4f} s / it)".format( + num_iter, + str(datetime.timedelta(seconds=int(total_time_minus_hooks))), + total_time_minus_hooks / num_iter, + ) + ) + + logger.info( + "Total training time: {} ({} on hooks)".format( + str(datetime.timedelta(seconds=int(total_time))), + str(datetime.timedelta(seconds=int(hook_time))), + ) + ) + + def before_step(self): + self._step_timer.reset() + self._total_timer.resume() + + def after_step(self): + # +1 because we're in after_step + iter_done = self.trainer.iter - self.trainer.start_iter + 1 + if iter_done >= self._warmup_iter: + sec = self._step_timer.seconds() + self.trainer.storage.put_scalars(time=sec) + else: + self._start_time = time.perf_counter() + self._total_timer.reset() + + self._total_timer.pause() + + +class PeriodicWriter(HookBase): + """ + Write events to EventStorage periodically. + + It is executed every ``period`` iterations and after the last iteration. + """ + + def __init__(self, writers, period=20): + """ + Args: + writers (list[EventWriter]): a list of EventWriter objects + period (int): + """ + self._writers = writers + for w in writers: + assert isinstance(w, EventWriter), w + self._period = period + + def after_step(self): + if (self.trainer.iter + 1) % self._period == 0 or ( + self.trainer.iter == self.trainer.max_iter - 1 + ): + for writer in self._writers: + writer.write() + + def after_train(self): + for writer in self._writers: + writer.close() + + +class PeriodicCheckpointer(_PeriodicCheckpointer, HookBase): + """ + Same as :class:`detectron2.checkpoint.PeriodicCheckpointer`, but as a hook. + + Note that when used as a hook, + it is unable to save additional data other than what's defined + by the given `checkpointer`. + + It is executed every ``period`` iterations and after the last iteration. + """ + + def before_train(self): + self.max_iter = self.trainer.max_iter + + def after_step(self): + # No way to use **kwargs + self.step(self.trainer.iter) + + +class LRScheduler(HookBase): + """ + A hook which executes a torch builtin LR scheduler and summarizes the LR. + It is executed after every iteration. + """ + + def __init__(self, optimizer, scheduler): + """ + Args: + optimizer (torch.optim.Optimizer): + scheduler (torch.optim._LRScheduler) + """ + self._optimizer = optimizer + self._scheduler = scheduler + + # NOTE: some heuristics on what LR to summarize + # summarize the param group with most parameters + largest_group = max(len(g["params"]) for g in optimizer.param_groups) + + if largest_group == 1: + # If all groups have one parameter, + # then find the most common initial LR, and use it for summary + lr_count = Counter([g["lr"] for g in optimizer.param_groups]) + lr = lr_count.most_common()[0][0] + for i, g in enumerate(optimizer.param_groups): + if g["lr"] == lr: + self._best_param_group_id = i + break + else: + for i, g in enumerate(optimizer.param_groups): + if len(g["params"]) == largest_group: + self._best_param_group_id = i + break + + def after_step(self): + lr = self._optimizer.param_groups[self._best_param_group_id]["lr"] + self.trainer.storage.put_scalar("lr", lr, smoothing_hint=False) + self._scheduler.step() + + +class AutogradProfiler(HookBase): + """ + A hook which runs `torch.autograd.profiler.profile`. + + Examples: + + .. code-block:: python + + hooks.AutogradProfiler( + lambda trainer: trainer.iter > 10 and trainer.iter < 20, self.cfg.OUTPUT_DIR + ) + + The above example will run the profiler for iteration 10~20 and dump + results to ``OUTPUT_DIR``. We did not profile the first few iterations + because they are typically slower than the rest. + The result files can be loaded in the ``chrome://tracing`` page in chrome browser. + + Note: + When used together with NCCL on older version of GPUs, + autograd profiler may cause deadlock because it unnecessarily allocates + memory on every device it sees. The memory management calls, if + interleaved with NCCL calls, lead to deadlock on GPUs that do not + support `cudaLaunchCooperativeKernelMultiDevice`. + """ + + def __init__(self, enable_predicate, output_dir, *, use_cuda=True): + """ + Args: + enable_predicate (callable[trainer -> bool]): a function which takes a trainer, + and returns whether to enable the profiler. + It will be called once every step, and can be used to select which steps to profile. + output_dir (str): the output directory to dump tracing files. + use_cuda (bool): same as in `torch.autograd.profiler.profile`. + """ + self._enable_predicate = enable_predicate + self._use_cuda = use_cuda + self._output_dir = output_dir + + def before_step(self): + if self._enable_predicate(self.trainer): + self._profiler = torch.autograd.profiler.profile(use_cuda=self._use_cuda) + self._profiler.__enter__() + else: + self._profiler = None + + def after_step(self): + if self._profiler is None: + return + self._profiler.__exit__(None, None, None) + PathManager.mkdirs(self._output_dir) + out_file = os.path.join( + self._output_dir, "profiler-trace-iter{}.json".format(self.trainer.iter) + ) + if "://" not in out_file: + self._profiler.export_chrome_trace(out_file) + else: + # Support non-posix filesystems + with tempfile.TemporaryDirectory(prefix="detectron2_profiler") as d: + tmp_file = os.path.join(d, "tmp.json") + self._profiler.export_chrome_trace(tmp_file) + with open(tmp_file) as f: + content = f.read() + with PathManager.open(out_file, "w") as f: + f.write(content) + + +class EvalHook(HookBase): + """ + Run an evaluation function periodically, and at the end of training. + + It is executed every ``eval_period`` iterations and after the last iteration. + """ + + def __init__(self, eval_period, eval_function): + """ + Args: + eval_period (int): the period to run `eval_function`. + eval_function (callable): a function which takes no arguments, and + returns a nested dict of evaluation metrics. + + Note: + This hook must be enabled in all or none workers. + If you would like only certain workers to perform evaluation, + give other workers a no-op function (`eval_function=lambda: None`). + """ + self._period = eval_period + self._func = eval_function + + def _do_eval(self): + results = self._func() + + if results: + assert isinstance( + results, dict + ), "Eval function must return a dict. Got {} instead.".format(results) + + flattened_results = flatten_results_dict(results) + for k, v in flattened_results.items(): + try: + v = float(v) + except Exception: + raise ValueError( + "[EvalHook] eval_function should return a nested dict of float. " + "Got '{}: {}' instead.".format(k, v) + ) + self.trainer.storage.put_scalars(**flattened_results, smoothing_hint=False) + + # Evaluation may take different time among workers. + # A barrier make them start the next iteration together. + comm.synchronize() + + def after_step(self): + next_iter = self.trainer.iter + 1 + is_final = next_iter == self.trainer.max_iter + if is_final or (self._period > 0 and next_iter % self._period == 0): + self._do_eval() + + def after_train(self): + # func is likely a closure that holds reference to the trainer + # therefore we clean it to avoid circular reference in the end + del self._func + + +class PreciseBN(HookBase): + """ + The standard implementation of BatchNorm uses EMA in inference, which is + sometimes suboptimal. + This class computes the true average of statistics rather than the moving average, + and put true averages to every BN layer in the given model. + + It is executed every ``period`` iterations and after the last iteration. + """ + + def __init__(self, period, model, data_loader, num_iter): + """ + Args: + period (int): the period this hook is run, or 0 to not run during training. + The hook will always run in the end of training. + model (nn.Module): a module whose all BN layers in training mode will be + updated by precise BN. + Note that user is responsible for ensuring the BN layers to be + updated are in training mode when this hook is triggered. + data_loader (iterable): it will produce data to be run by `model(data)`. + num_iter (int): number of iterations used to compute the precise + statistics. + """ + self._logger = logging.getLogger(__name__) + if len(get_bn_modules(model)) == 0: + self._logger.info( + "PreciseBN is disabled because model does not contain BN layers in training mode." + ) + self._disabled = True + return + + self._model = model + self._data_loader = data_loader + self._num_iter = num_iter + self._period = period + self._disabled = False + + self._data_iter = None + + def after_step(self): + next_iter = self.trainer.iter + 1 + is_final = next_iter == self.trainer.max_iter + if is_final or (self._period > 0 and next_iter % self._period == 0): + self.update_stats() + + def update_stats(self): + """ + Update the model with precise statistics. Users can manually call this method. + """ + if self._disabled: + return + + if self._data_iter is None: + self._data_iter = iter(self._data_loader) + + def data_loader(): + for num_iter in itertools.count(1): + if num_iter % 100 == 0: + self._logger.info( + "Running precise-BN ... {}/{} iterations.".format(num_iter, self._num_iter) + ) + # This way we can reuse the same iterator + yield next(self._data_iter) + + with EventStorage(): # capture events in a new storage to discard them + self._logger.info( + "Running precise-BN for {} iterations... ".format(self._num_iter) + + "Note that this could produce different statistics every time." + ) + update_bn_stats(self._model, data_loader(), self._num_iter) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/launch.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/launch.py new file mode 100644 index 0000000..9efbb03 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/launch.py @@ -0,0 +1,89 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import torch +import torch.distributed as dist +import torch.multiprocessing as mp + +from detectron2.utils import comm + +__all__ = ["launch"] + + +def _find_free_port(): + import socket + + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Binding to port 0 will cause the OS to find an available port for us + sock.bind(("", 0)) + port = sock.getsockname()[1] + sock.close() + # NOTE: there is still a chance the port could be taken by other processes. + return port + + +def launch(main_func, num_gpus_per_machine, num_machines=1, machine_rank=0, dist_url=None, args=()): + """ + Args: + main_func: a function that will be called by `main_func(*args)` + num_machines (int): the total number of machines + machine_rank (int): the rank of this machine (one per machine) + dist_url (str): url to connect to for distributed jobs, including protocol + e.g. "tcp://127.0.0.1:8686". + Can be set to "auto" to automatically select a free port on localhost + args (tuple): arguments passed to main_func + """ + world_size = num_machines * num_gpus_per_machine + if world_size > 1: + # https://github.com/pytorch/pytorch/pull/14391 + # TODO prctl in spawned processes + + if dist_url == "auto": + assert num_machines == 1, "dist_url=auto not supported in multi-machine jobs." + port = _find_free_port() + dist_url = f"tcp://127.0.0.1:{port}" + if num_machines > 1 and dist_url.startswith("file://"): + logger = logging.getLogger(__name__) + logger.warning( + "file:// is not a reliable init_method in multi-machine jobs. Prefer tcp://" + ) + + mp.spawn( + _distributed_worker, + nprocs=num_gpus_per_machine, + args=(main_func, world_size, num_gpus_per_machine, machine_rank, dist_url, args), + daemon=False, + ) + else: + main_func(*args) + + +def _distributed_worker( + local_rank, main_func, world_size, num_gpus_per_machine, machine_rank, dist_url, args +): + assert torch.cuda.is_available(), "cuda is not available. Please check your installation." + global_rank = machine_rank * num_gpus_per_machine + local_rank + try: + dist.init_process_group( + backend="NCCL", init_method=dist_url, world_size=world_size, rank=global_rank + ) + except Exception as e: + logger = logging.getLogger(__name__) + logger.error("Process group URL: {}".format(dist_url)) + raise e + # synchronize is needed here to prevent a possible timeout after calling init_process_group + # See: https://github.com/facebookresearch/maskrcnn-benchmark/issues/172 + comm.synchronize() + + assert num_gpus_per_machine <= torch.cuda.device_count() + torch.cuda.set_device(local_rank) + + # Setup the local process group (which contains ranks within the same machine) + assert comm._LOCAL_PROCESS_GROUP is None + num_machines = world_size // num_gpus_per_machine + for i in range(num_machines): + ranks_on_i = list(range(i * num_gpus_per_machine, (i + 1) * num_gpus_per_machine)) + pg = dist.new_group(ranks_on_i) + if i == machine_rank: + comm._LOCAL_PROCESS_GROUP = pg + + main_func(*args) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/train_loop.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/train_loop.py new file mode 100644 index 0000000..453c9ac --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/engine/train_loop.py @@ -0,0 +1,273 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import logging +import numpy as np +import time +import weakref +import torch + +import detectron2.utils.comm as comm +from detectron2.utils.events import EventStorage + +__all__ = ["HookBase", "TrainerBase", "SimpleTrainer"] + + +class HookBase: + """ + Base class for hooks that can be registered with :class:`TrainerBase`. + + Each hook can implement 4 methods. The way they are called is demonstrated + in the following snippet: + + .. code-block:: python + + hook.before_train() + for iter in range(start_iter, max_iter): + hook.before_step() + trainer.run_step() + hook.after_step() + hook.after_train() + + Notes: + 1. In the hook method, users can access `self.trainer` to access more + properties about the context (e.g., current iteration). + + 2. A hook that does something in :meth:`before_step` can often be + implemented equivalently in :meth:`after_step`. + If the hook takes non-trivial time, it is strongly recommended to + implement the hook in :meth:`after_step` instead of :meth:`before_step`. + The convention is that :meth:`before_step` should only take negligible time. + + Following this convention will allow hooks that do care about the difference + between :meth:`before_step` and :meth:`after_step` (e.g., timer) to + function properly. + + Attributes: + trainer: A weak reference to the trainer object. Set by the trainer when the hook is + registered. + """ + + def before_train(self): + """ + Called before the first iteration. + """ + pass + + def after_train(self): + """ + Called after the last iteration. + """ + pass + + def before_step(self): + """ + Called before each iteration. + """ + pass + + def after_step(self): + """ + Called after each iteration. + """ + pass + + +class TrainerBase: + """ + Base class for iterative trainer with hooks. + + The only assumption we made here is: the training runs in a loop. + A subclass can implement what the loop is. + We made no assumptions about the existence of dataloader, optimizer, model, etc. + + Attributes: + iter(int): the current iteration. + + start_iter(int): The iteration to start with. + By convention the minimum possible value is 0. + + max_iter(int): The iteration to end training. + + storage(EventStorage): An EventStorage that's opened during the course of training. + """ + + def __init__(self): + self._hooks = [] + + def register_hooks(self, hooks): + """ + Register hooks to the trainer. The hooks are executed in the order + they are registered. + + Args: + hooks (list[Optional[HookBase]]): list of hooks + """ + hooks = [h for h in hooks if h is not None] + for h in hooks: + assert isinstance(h, HookBase) + # To avoid circular reference, hooks and trainer cannot own each other. + # This normally does not matter, but will cause memory leak if the + # involved objects contain __del__: + # See http://engineering.hearsaysocial.com/2013/06/16/circular-references-in-python/ + h.trainer = weakref.proxy(self) + self._hooks.extend(hooks) + + def train(self, start_iter: int, max_iter: int): + """ + Args: + start_iter, max_iter (int): See docs above + """ + logger = logging.getLogger(__name__) + logger.info("Starting training from iteration {}".format(start_iter)) + + self.iter = self.start_iter = start_iter + self.max_iter = max_iter + + with EventStorage(start_iter) as self.storage: + try: + self.before_train() + for self.iter in range(start_iter, max_iter): + self.before_step() + self.run_step() + self.after_step() + except Exception: + logger.exception("Exception during training:") + raise + finally: + self.after_train() + + def before_train(self): + for h in self._hooks: + h.before_train() + + def after_train(self): + for h in self._hooks: + h.after_train() + + def before_step(self): + for h in self._hooks: + h.before_step() + + def after_step(self): + for h in self._hooks: + h.after_step() + # this guarantees, that in each hook's after_step, storage.iter == trainer.iter + self.storage.step() + + def run_step(self): + raise NotImplementedError + + +class SimpleTrainer(TrainerBase): + """ + A simple trainer for the most common type of task: + single-cost single-optimizer single-data-source iterative optimization. + It assumes that every step, you: + + 1. Compute the loss with a data from the data_loader. + 2. Compute the gradients with the above loss. + 3. Update the model with the optimizer. + + If you want to do anything fancier than this, + either subclass TrainerBase and implement your own `run_step`, + or write your own training loop. + """ + + def __init__(self, model, data_loader, optimizer): + """ + Args: + model: a torch Module. Takes a data from data_loader and returns a + dict of losses. + data_loader: an iterable. Contains data to be used to call model. + optimizer: a torch optimizer. + """ + super().__init__() + + """ + We set the model to training mode in the trainer. + However it's valid to train a model that's in eval mode. + If you want your model (or a submodule of it) to behave + like evaluation during training, you can overwrite its train() method. + """ + model.train() + + self.model = model + self.data_loader = data_loader + self._data_loader_iter = iter(data_loader) + self.optimizer = optimizer + + def run_step(self): + """ + Implement the standard training logic described above. + """ + assert self.model.training, "[SimpleTrainer] model was changed to eval mode!" + start = time.perf_counter() + """ + If you want to do something with the data, you can wrap the dataloader. + """ + data = next(self._data_loader_iter) + data_time = time.perf_counter() - start + + """ + If you want to do something with the losses, you can wrap the model. + """ + loss_dict = self.model(data) + losses = sum(loss_dict.values()) + self._detect_anomaly(losses, loss_dict) + + metrics_dict = loss_dict + metrics_dict["data_time"] = data_time + self._write_metrics(metrics_dict) + + """ + If you need to accumulate gradients or something similar, you can + wrap the optimizer with your custom `zero_grad()` method. + """ + self.optimizer.zero_grad() + losses.backward() + + """ + If you need gradient clipping/scaling or other processing, you can + wrap the optimizer with your custom `step()` method. + """ + self.optimizer.step() + + def _detect_anomaly(self, losses, loss_dict): + if not torch.isfinite(losses).all(): + raise FloatingPointError( + "Loss became infinite or NaN at iteration={}!\nloss_dict = {}".format( + self.iter, loss_dict + ) + ) + + def _write_metrics(self, metrics_dict: dict): + """ + Args: + metrics_dict (dict): dict of scalar metrics + """ + metrics_dict = { + k: v.detach().cpu().item() if isinstance(v, torch.Tensor) else float(v) + for k, v in metrics_dict.items() + } + # gather metrics among all workers for logging + # This assumes we do DDP-style training, which is currently the only + # supported method in detectron2. + all_metrics_dict = comm.gather(metrics_dict) + + if comm.is_main_process(): + if "data_time" in all_metrics_dict[0]: + # data_time among workers can have high variance. The actual latency + # caused by data_time is the maximum among workers. + data_time = np.max([x.pop("data_time") for x in all_metrics_dict]) + self.storage.put_scalar("data_time", data_time) + + # average the rest metrics + metrics_dict = { + k: np.mean([x[k] for x in all_metrics_dict]) for k in all_metrics_dict[0].keys() + } + total_losses_reduced = sum(loss for loss in metrics_dict.values()) + + self.storage.put_scalar("total_loss", total_losses_reduced) + if len(metrics_dict) > 1: + self.storage.put_scalars(**metrics_dict) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/__init__.py new file mode 100644 index 0000000..f1d2f10 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .cityscapes_evaluation import CityscapesInstanceEvaluator, CityscapesSemSegEvaluator +from .coco_evaluation import COCOEvaluator +from .rotated_coco_evaluation import RotatedCOCOEvaluator +from .evaluator import DatasetEvaluator, DatasetEvaluators, inference_context, inference_on_dataset +from .lvis_evaluation import LVISEvaluator +from .panoptic_evaluation import COCOPanopticEvaluator +from .pascal_voc_evaluation import PascalVOCDetectionEvaluator +from .sem_seg_evaluation import SemSegEvaluator +from .testing import print_csv_format, verify_results + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/cityscapes_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/cityscapes_evaluation.py new file mode 100644 index 0000000..f6287a8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/cityscapes_evaluation.py @@ -0,0 +1,187 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import glob +import logging +import numpy as np +import os +import tempfile +from collections import OrderedDict +import torch +from fvcore.common.file_io import PathManager +from PIL import Image + +from detectron2.data import MetadataCatalog +from detectron2.utils import comm + +from .evaluator import DatasetEvaluator + + +class CityscapesEvaluator(DatasetEvaluator): + """ + Base class for evaluation using cityscapes API. + """ + + def __init__(self, dataset_name): + """ + Args: + dataset_name (str): the name of the dataset. + It must have the following metadata associated with it: + "thing_classes", "gt_dir". + """ + self._metadata = MetadataCatalog.get(dataset_name) + self._cpu_device = torch.device("cpu") + self._logger = logging.getLogger(__name__) + + def reset(self): + self._working_dir = tempfile.TemporaryDirectory(prefix="cityscapes_eval_") + self._temp_dir = self._working_dir.name + # All workers will write to the same results directory + # TODO this does not work in distributed training + self._temp_dir = comm.all_gather(self._temp_dir)[0] + if self._temp_dir != self._working_dir.name: + self._working_dir.cleanup() + self._logger.info( + "Writing cityscapes results to temporary directory {} ...".format(self._temp_dir) + ) + + +class CityscapesInstanceEvaluator(CityscapesEvaluator): + """ + Evaluate instance segmentation results using cityscapes API. + + Note: + * It does not work in multi-machine distributed training. + * It contains a synchronization, therefore has to be used on all ranks. + * Only the main process runs evaluation. + """ + + def process(self, inputs, outputs): + from cityscapesscripts.helpers.labels import name2label + + for input, output in zip(inputs, outputs): + file_name = input["file_name"] + basename = os.path.splitext(os.path.basename(file_name))[0] + pred_txt = os.path.join(self._temp_dir, basename + "_pred.txt") + + output = output["instances"].to(self._cpu_device) + num_instances = len(output) + with open(pred_txt, "w") as fout: + for i in range(num_instances): + pred_class = output.pred_classes[i] + classes = self._metadata.thing_classes[pred_class] + class_id = name2label[classes].id + score = output.scores[i] + mask = output.pred_masks[i].numpy().astype("uint8") + png_filename = os.path.join( + self._temp_dir, basename + "_{}_{}.png".format(i, classes) + ) + + Image.fromarray(mask * 255).save(png_filename) + fout.write("{} {} {}\n".format(os.path.basename(png_filename), class_id, score)) + + def evaluate(self): + """ + Returns: + dict: has a key "segm", whose value is a dict of "AP" and "AP50". + """ + comm.synchronize() + if comm.get_rank() > 0: + return + import cityscapesscripts.evaluation.evalInstanceLevelSemanticLabeling as cityscapes_eval + + self._logger.info("Evaluating results under {} ...".format(self._temp_dir)) + + # set some global states in cityscapes evaluation API, before evaluating + cityscapes_eval.args.predictionPath = os.path.abspath(self._temp_dir) + cityscapes_eval.args.predictionWalk = None + cityscapes_eval.args.JSONOutput = False + cityscapes_eval.args.colorized = False + cityscapes_eval.args.gtInstancesFile = os.path.join(self._temp_dir, "gtInstances.json") + + # These lines are adopted from + # https://github.com/mcordts/cityscapesScripts/blob/master/cityscapesscripts/evaluation/evalInstanceLevelSemanticLabeling.py # noqa + gt_dir = PathManager.get_local_path(self._metadata.gt_dir) + groundTruthImgList = glob.glob(os.path.join(gt_dir, "*", "*_gtFine_instanceIds.png")) + assert len( + groundTruthImgList + ), "Cannot find any ground truth images to use for evaluation. Searched for: {}".format( + cityscapes_eval.args.groundTruthSearch + ) + predictionImgList = [] + for gt in groundTruthImgList: + predictionImgList.append(cityscapes_eval.getPrediction(gt, cityscapes_eval.args)) + results = cityscapes_eval.evaluateImgLists( + predictionImgList, groundTruthImgList, cityscapes_eval.args + )["averages"] + + ret = OrderedDict() + ret["segm"] = {"AP": results["allAp"] * 100, "AP50": results["allAp50%"] * 100} + self._working_dir.cleanup() + return ret + + +class CityscapesSemSegEvaluator(CityscapesEvaluator): + """ + Evaluate semantic segmentation results using cityscapes API. + + Note: + * It does not work in multi-machine distributed training. + * It contains a synchronization, therefore has to be used on all ranks. + * Only the main process runs evaluation. + """ + + def process(self, inputs, outputs): + from cityscapesscripts.helpers.labels import trainId2label + + for input, output in zip(inputs, outputs): + file_name = input["file_name"] + basename = os.path.splitext(os.path.basename(file_name))[0] + pred_filename = os.path.join(self._temp_dir, basename + "_pred.png") + + output = output["sem_seg"].argmax(dim=0).to(self._cpu_device).numpy() + pred = 255 * np.ones(output.shape, dtype=np.uint8) + for train_id, label in trainId2label.items(): + if label.ignoreInEval: + continue + pred[output == train_id] = label.id + Image.fromarray(pred).save(pred_filename) + + def evaluate(self): + comm.synchronize() + if comm.get_rank() > 0: + return + # Load the Cityscapes eval script *after* setting the required env var, + # since the script reads CITYSCAPES_DATASET into global variables at load time. + import cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as cityscapes_eval + + self._logger.info("Evaluating results under {} ...".format(self._temp_dir)) + + # set some global states in cityscapes evaluation API, before evaluating + cityscapes_eval.args.predictionPath = os.path.abspath(self._temp_dir) + cityscapes_eval.args.predictionWalk = None + cityscapes_eval.args.JSONOutput = False + cityscapes_eval.args.colorized = False + + # These lines are adopted from + # https://github.com/mcordts/cityscapesScripts/blob/master/cityscapesscripts/evaluation/evalPixelLevelSemanticLabeling.py # noqa + gt_dir = PathManager.get_local_path(self._metadata.gt_dir) + groundTruthImgList = glob.glob(os.path.join(gt_dir, "*", "*_gtFine_labelIds.png")) + assert len( + groundTruthImgList + ), "Cannot find any ground truth images to use for evaluation. Searched for: {}".format( + cityscapes_eval.args.groundTruthSearch + ) + predictionImgList = [] + for gt in groundTruthImgList: + predictionImgList.append(cityscapes_eval.getPrediction(cityscapes_eval.args, gt)) + results = cityscapes_eval.evaluateImgLists( + predictionImgList, groundTruthImgList, cityscapes_eval.args + ) + ret = OrderedDict() + ret["sem_seg"] = { + "IoU": 100.0 * results["averageScoreClasses"], + "iIoU": 100.0 * results["averageScoreInstClasses"], + "IoU_sup": 100.0 * results["averageScoreCategories"], + "iIoU_sup": 100.0 * results["averageScoreInstCategories"], + } + self._working_dir.cleanup() + return ret diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/coco_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/coco_evaluation.py new file mode 100644 index 0000000..64b0903 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/coco_evaluation.py @@ -0,0 +1,512 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import contextlib +import copy +import io +import itertools +import json +import logging +import numpy as np +import os +import pickle +from collections import OrderedDict +import pycocotools.mask as mask_util +import torch +from fvcore.common.file_io import PathManager +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval +from tabulate import tabulate + +import detectron2.utils.comm as comm +from detectron2.data import MetadataCatalog +from detectron2.data.datasets.coco import convert_to_coco_json +from detectron2.structures import Boxes, BoxMode, pairwise_iou +from detectron2.utils.logger import create_small_table + +from .evaluator import DatasetEvaluator + + +class COCOEvaluator(DatasetEvaluator): + """ + Evaluate object proposal, instance detection/segmentation, keypoint detection + outputs using COCO's metrics and APIs. + """ + + def __init__(self, dataset_name, cfg, distributed, output_dir=None): + """ + Args: + dataset_name (str): name of the dataset to be evaluated. + It must have either the following corresponding metadata: + + "json_file": the path to the COCO format annotation + + Or it must be in detectron2's standard dataset format + so it can be converted to COCO format automatically. + cfg (CfgNode): config instance + distributed (True): if True, will collect results from all ranks and run evaluation + in the main process. + Otherwise, will evaluate the results in the current process. + output_dir (str): optional, an output directory to dump all + results predicted on the dataset. The dump contains two files: + + 1. "instance_predictions.pth" a file in torch serialization + format that contains all the raw original predictions. + 2. "coco_instances_results.json" a json file in COCO's result + format. + """ + self._tasks = self._tasks_from_config(cfg) + self._distributed = distributed + self._output_dir = output_dir + + self._cpu_device = torch.device("cpu") + self._logger = logging.getLogger(__name__) + + self._metadata = MetadataCatalog.get(dataset_name) + if not hasattr(self._metadata, "json_file"): + self._logger.warning( + f"json_file was not found in MetaDataCatalog for '{dataset_name}'." + " Trying to convert it to COCO format ..." + ) + + cache_path = os.path.join(output_dir, f"{dataset_name}_coco_format.json") + self._metadata.json_file = cache_path + convert_to_coco_json(dataset_name, cache_path) + + json_file = PathManager.get_local_path(self._metadata.json_file) + with contextlib.redirect_stdout(io.StringIO()): + self._coco_api = COCO(json_file) + + self._kpt_oks_sigmas = cfg.TEST.KEYPOINT_OKS_SIGMAS + # Test set json files do not contain annotations (evaluation must be + # performed using the COCO evaluation server). + self._do_evaluation = "annotations" in self._coco_api.split_name + + def reset(self): + self._predictions = [] + + def _tasks_from_config(self, cfg): + """ + Returns: + tuple[str]: tasks that can be evaluated under the given configuration. + """ + tasks = ("bbox",) + if cfg.MODEL.MASK_ON: + tasks = tasks + ("segm",) + if cfg.MODEL.KEYPOINT_ON: + tasks = tasks + ("keypoints",) + return tasks + + def process(self, inputs, outputs): + """ + Args: + inputs: the inputs to a COCO model (e.g., GeneralizedRCNN). + It is a list of dict. Each dict corresponds to an image and + contains keys like "height", "width", "file_name", "image_id". + outputs: the outputs of a COCO model. It is a list of dicts with key + "instances" that contains :class:`Instances`. + """ + for input, output in zip(inputs, outputs): + prediction = {"image_id": input["image_id"]} + + # TODO this is ugly + if "instances" in output: + instances = output["instances"].to(self._cpu_device) + prediction["instances"] = instances_to_coco_json(instances, input["image_id"]) + if "proposals" in output: + prediction["proposals"] = output["proposals"].to(self._cpu_device) + self._predictions.append(prediction) + + def evaluate(self): + if self._distributed: + comm.synchronize() + predictions = comm.gather(self._predictions, dst=0) + predictions = list(itertools.chain(*predictions)) + + if not comm.is_main_process(): + return {} + else: + predictions = self._predictions + + if len(predictions) == 0: + self._logger.warning("[COCOEvaluator] Did not receive valid predictions.") + return {} + + if self._output_dir: + PathManager.mkdirs(self._output_dir) + file_path = os.path.join(self._output_dir, "instances_predictions.pth") + with PathManager.open(file_path, "wb") as f: + torch.save(predictions, f) + + self._results = OrderedDict() + if "proposals" in predictions[0]: + self._eval_box_proposals(predictions) + if "instances" in predictions[0]: + self._eval_predictions(set(self._tasks), predictions) + # Copy so the caller can do whatever with results + return copy.deepcopy(self._results) + + def _eval_predictions(self, tasks, predictions): + """ + Evaluate predictions on the given tasks. + Fill self._results with the metrics of the tasks. + """ + self._logger.info("Preparing results for COCO format ...") + coco_results = list(itertools.chain(*[x["instances"] for x in predictions])) + + # unmap the category ids for COCO + if hasattr(self._metadata, "thing_dataset_id_to_contiguous_id"): + reverse_id_mapping = { + v: k for k, v in self._metadata.thing_dataset_id_to_contiguous_id.items() + } + for result in coco_results: + category_id = result["category_id"] + assert ( + category_id in reverse_id_mapping + ), "A prediction has category_id={}, which is not available in the dataset.".format( + category_id + ) + result["category_id"] = reverse_id_mapping[category_id] + + if self._output_dir: + file_path = os.path.join(self._output_dir, "coco_instances_results.json") + self._logger.info("Saving results to {}".format(file_path)) + with PathManager.open(file_path, "w") as f: + f.write(json.dumps(coco_results)) + f.flush() + + if not self._do_evaluation: + self._logger.info("Annotations are not available for evaluation.") + return + + self._logger.info("Evaluating predictions ...") + for task in sorted(tasks): + coco_eval = ( + _evaluate_predictions_on_coco( + self._coco_api, coco_results, task, kpt_oks_sigmas=self._kpt_oks_sigmas + ) + if len(coco_results) > 0 + else None # cocoapi does not handle empty results very well + ) + + res = self._derive_coco_results( + coco_eval, task, class_names=self._metadata.get("thing_classes") + ) + self._results[task] = res + + def _eval_box_proposals(self, predictions): + """ + Evaluate the box proposals in predictions. + Fill self._results with the metrics for "box_proposals" task. + """ + if self._output_dir: + # Saving generated box proposals to file. + # Predicted box_proposals are in XYXY_ABS mode. + bbox_mode = BoxMode.XYXY_ABS.value + ids, boxes, objectness_logits = [], [], [] + for prediction in predictions: + ids.append(prediction["image_id"]) + boxes.append(prediction["proposals"].proposal_boxes.tensor.numpy()) + objectness_logits.append(prediction["proposals"].objectness_logits.numpy()) + + proposal_data = { + "boxes": boxes, + "objectness_logits": objectness_logits, + "ids": ids, + "bbox_mode": bbox_mode, + } + with PathManager.open(os.path.join(self._output_dir, "box_proposals.pkl"), "wb") as f: + pickle.dump(proposal_data, f) + + if not self._do_evaluation: + self._logger.info("Annotations are not available for evaluation.") + return + + self._logger.info("Evaluating bbox proposals ...") + res = {} + areas = {"all": "", "small": "s", "medium": "m", "large": "l"} + for limit in [100, 1000]: + for area, suffix in areas.items(): + stats = _evaluate_box_proposals(predictions, self._coco_api, area=area, limit=limit) + key = "AR{}@{:d}".format(suffix, limit) + res[key] = float(stats["ar"].item() * 100) + self._logger.info("Proposal metrics: \n" + create_small_table(res)) + self._results["box_proposals"] = res + + def _derive_coco_results(self, coco_eval, iou_type, class_names=None): + """ + Derive the desired score numbers from summarized COCOeval. + + Args: + coco_eval (None or COCOEval): None represents no predictions from model. + iou_type (str): + class_names (None or list[str]): if provided, will use it to predict + per-category AP. + + Returns: + a dict of {metric name: score} + """ + + metrics = { + "bbox": ["AP", "AP50", "AP75", "APs", "APm", "APl"], + "segm": ["AP", "AP50", "AP75", "APs", "APm", "APl"], + "keypoints": ["AP", "AP50", "AP75", "APm", "APl"], + }[iou_type] + + if coco_eval is None: + self._logger.warn("No predictions from the model!") + return {metric: float("nan") for metric in metrics} + + # the standard metrics + results = { + metric: float(coco_eval.stats[idx] * 100 if coco_eval.stats[idx] >= 0 else "nan") + for idx, metric in enumerate(metrics) + } + self._logger.info( + "Evaluation results for {}: \n".format(iou_type) + create_small_table(results) + ) + if not np.isfinite(sum(results.values())): + self._logger.info("Note that some metrics cannot be computed.") + + if class_names is None or len(class_names) <= 1: + return results + # Compute per-category AP + # from https://github.com/facebookresearch/Detectron/blob/a6a835f5b8208c45d0dce217ce9bbda915f44df7/detectron/datasets/json_dataset_evaluator.py#L222-L252 # noqa + precisions = coco_eval.eval["precision"] + # precision has dims (iou, recall, cls, area range, max dets) + assert len(class_names) == precisions.shape[2] + + results_per_category = [] + for idx, name in enumerate(class_names): + # area range index 0: all area ranges + # max dets index -1: typically 100 per image + precision = precisions[:, :, idx, 0, -1] + precision = precision[precision > -1] + ap = np.mean(precision) if precision.size else float("nan") + results_per_category.append(("{}".format(name), float(ap * 100))) + + # tabulate it + N_COLS = min(6, len(results_per_category) * 2) + results_flatten = list(itertools.chain(*results_per_category)) + results_2d = itertools.zip_longest(*[results_flatten[i::N_COLS] for i in range(N_COLS)]) + table = tabulate( + results_2d, + tablefmt="pipe", + floatfmt=".3f", + headers=["category", "AP"] * (N_COLS // 2), + numalign="left", + ) + self._logger.info("Per-category {} AP: \n".format(iou_type) + table) + + results.update({"AP-" + name: ap for name, ap in results_per_category}) + return results + + +def instances_to_coco_json(instances, img_id): + """ + Dump an "Instances" object to a COCO-format json that's used for evaluation. + + Args: + instances (Instances): + img_id (int): the image id + + Returns: + list[dict]: list of json annotations in COCO format. + """ + num_instance = len(instances) + if num_instance == 0: + return [] + + boxes = instances.pred_boxes.tensor.numpy() + boxes = BoxMode.convert(boxes, BoxMode.XYXY_ABS, BoxMode.XYWH_ABS) + boxes = boxes.tolist() + scores = instances.scores.tolist() + classes = instances.pred_classes.tolist() + + has_mask = instances.has("pred_masks") + if has_mask: + # use RLE to encode the masks, because they are too large and takes memory + # since this evaluator stores outputs of the entire dataset + rles = [ + mask_util.encode(np.array(mask[:, :, None], order="F", dtype="uint8"))[0] + for mask in instances.pred_masks + ] + for rle in rles: + # "counts" is an array encoded by mask_util as a byte-stream. Python3's + # json writer which always produces strings cannot serialize a bytestream + # unless you decode it. Thankfully, utf-8 works out (which is also what + # the pycocotools/_mask.pyx does). + rle["counts"] = rle["counts"].decode("utf-8") + + has_keypoints = instances.has("pred_keypoints") + if has_keypoints: + keypoints = instances.pred_keypoints + + results = [] + for k in range(num_instance): + result = { + "image_id": img_id, + "category_id": classes[k], + "bbox": boxes[k], + "score": scores[k], + } + if has_mask: + result["segmentation"] = rles[k] + if has_keypoints: + # In COCO annotations, + # keypoints coordinates are pixel indices. + # However our predictions are floating point coordinates. + # Therefore we subtract 0.5 to be consistent with the annotation format. + # This is the inverse of data loading logic in `data/coco.py`. + keypoints[k][:, :2] -= 0.5 + result["keypoints"] = keypoints[k].flatten().tolist() + results.append(result) + return results + + +# inspired from Detectron: +# https://github.com/facebookresearch/Detectron/blob/a6a835f5b8208c45d0dce217ce9bbda915f44df7/detectron/datasets/json_dataset_evaluator.py#L255 # noqa +def _evaluate_box_proposals(dataset_predictions, coco_api, thresholds=None, area="all", limit=None): + """ + Evaluate detection proposal recall metrics. This function is a much + faster alternative to the official COCO API recall evaluation code. However, + it produces slightly different results. + """ + # Record max overlap value for each gt box + # Return vector of overlap values + areas = { + "all": 0, + "small": 1, + "medium": 2, + "large": 3, + "96-128": 4, + "128-256": 5, + "256-512": 6, + "512-inf": 7, + } + area_ranges = [ + [0 ** 2, 1e5 ** 2], # all + [0 ** 2, 32 ** 2], # small + [32 ** 2, 96 ** 2], # medium + [96 ** 2, 1e5 ** 2], # large + [96 ** 2, 128 ** 2], # 96-128 + [128 ** 2, 256 ** 2], # 128-256 + [256 ** 2, 512 ** 2], # 256-512 + [512 ** 2, 1e5 ** 2], + ] # 512-inf + assert area in areas, "Unknown area range: {}".format(area) + area_range = area_ranges[areas[area]] + gt_overlaps = [] + num_pos = 0 + + for prediction_dict in dataset_predictions: + predictions = prediction_dict["proposals"] + + # sort predictions in descending order + # TODO maybe remove this and make it explicit in the documentation + inds = predictions.objectness_logits.sort(descending=True)[1] + predictions = predictions[inds] + + ann_ids = coco_api.getAnnIds(imgIds=prediction_dict["image_id"]) + anno = coco_api.loadAnns(ann_ids) + gt_boxes = [ + BoxMode.convert(obj["bbox"], BoxMode.XYWH_ABS, BoxMode.XYXY_ABS) + for obj in anno + if obj["iscrowd"] == 0 + ] + gt_boxes = torch.as_tensor(gt_boxes).reshape(-1, 4) # guard against no boxes + gt_boxes = Boxes(gt_boxes) + gt_areas = torch.as_tensor([obj["area"] for obj in anno if obj["iscrowd"] == 0]) + + if len(gt_boxes) == 0 or len(predictions) == 0: + continue + + valid_gt_inds = (gt_areas >= area_range[0]) & (gt_areas <= area_range[1]) + gt_boxes = gt_boxes[valid_gt_inds] + + num_pos += len(gt_boxes) + + if len(gt_boxes) == 0: + continue + + if limit is not None and len(predictions) > limit: + predictions = predictions[:limit] + + overlaps = pairwise_iou(predictions.proposal_boxes, gt_boxes) + + _gt_overlaps = torch.zeros(len(gt_boxes)) + for j in range(min(len(predictions), len(gt_boxes))): + # find which proposal box maximally covers each gt box + # and get the iou amount of coverage for each gt box + max_overlaps, argmax_overlaps = overlaps.max(dim=0) + + # find which gt box is 'best' covered (i.e. 'best' = most iou) + gt_ovr, gt_ind = max_overlaps.max(dim=0) + assert gt_ovr >= 0 + # find the proposal box that covers the best covered gt box + box_ind = argmax_overlaps[gt_ind] + # record the iou coverage of this gt box + _gt_overlaps[j] = overlaps[box_ind, gt_ind] + assert _gt_overlaps[j] == gt_ovr + # mark the proposal box and the gt box as used + overlaps[box_ind, :] = -1 + overlaps[:, gt_ind] = -1 + + # append recorded iou coverage level + gt_overlaps.append(_gt_overlaps) + gt_overlaps = ( + torch.cat(gt_overlaps, dim=0) if len(gt_overlaps) else torch.zeros(0, dtype=torch.float32) + ) + gt_overlaps, _ = torch.sort(gt_overlaps) + + if thresholds is None: + step = 0.05 + thresholds = torch.arange(0.5, 0.95 + 1e-5, step, dtype=torch.float32) + recalls = torch.zeros_like(thresholds) + # compute recall for each iou threshold + for i, t in enumerate(thresholds): + recalls[i] = (gt_overlaps >= t).float().sum() / float(num_pos) + # ar = 2 * np.trapz(recalls, thresholds) + ar = recalls.mean() + return { + "ar": ar, + "recalls": recalls, + "thresholds": thresholds, + "gt_overlaps": gt_overlaps, + "num_pos": num_pos, + } + + +def _evaluate_predictions_on_coco(coco_gt, coco_results, iou_type, kpt_oks_sigmas=None): + """ + Evaluate the coco results using COCOEval API. + """ + assert len(coco_results) > 0 + + if iou_type == "segm": + coco_results = copy.deepcopy(coco_results) + # When evaluating mask AP, if the results contain bbox, cocoapi will + # use the box area as the area of the instance, instead of the mask area. + # This leads to a different definition of small/medium/large. + # We remove the bbox field to let mask AP use mask area. + for c in coco_results: + c.pop("bbox", None) + + coco_dt = coco_gt.loadRes(coco_results) + coco_eval = COCOeval(coco_gt, coco_dt, iou_type) + # Use the COCO default keypoint OKS sigmas unless overrides are specified + if kpt_oks_sigmas: + coco_eval.params.kpt_oks_sigmas = np.array(kpt_oks_sigmas) + + if iou_type == "keypoints": + num_keypoints = len(coco_results[0]["keypoints"]) // 3 + assert len(coco_eval.params.kpt_oks_sigmas) == num_keypoints, ( + "[COCOEvaluator] The length of cfg.TEST.KEYPOINT_OKS_SIGMAS (default: 17) " + "must be equal to the number of keypoints. However the prediction has {} " + "keypoints! For more information please refer to " + "http://cocodataset.org/#keypoints-eval.".format(num_keypoints) + ) + + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + + return coco_eval diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/evaluator.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/evaluator.py new file mode 100644 index 0000000..dcb9804 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/evaluator.py @@ -0,0 +1,196 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import datetime +import logging +import time +from collections import OrderedDict +from contextlib import contextmanager +import torch + +from detectron2.utils.comm import get_world_size, is_main_process +from detectron2.utils.logger import log_every_n_seconds + + +class DatasetEvaluator: + """ + Base class for a dataset evaluator. + + The function :func:`inference_on_dataset` runs the model over + all samples in the dataset, and have a DatasetEvaluator to process the inputs/outputs. + + This class will accumulate information of the inputs/outputs (by :meth:`process`), + and produce evaluation results in the end (by :meth:`evaluate`). + """ + + def reset(self): + """ + Preparation for a new round of evaluation. + Should be called before starting a round of evaluation. + """ + pass + + def process(self, inputs, outputs): + """ + Process the pair of inputs and outputs. + If they contain batches, the pairs can be consumed one-by-one using `zip`: + + .. code-block:: python + + for input_, output in zip(inputs, outputs): + # do evaluation on single input/output pair + ... + + Args: + inputs (list): the inputs that's used to call the model. + outputs (list): the return value of `model(inputs)` + """ + pass + + def evaluate(self): + """ + Evaluate/summarize the performance, after processing all input/output pairs. + + Returns: + dict: + A new evaluator class can return a dict of arbitrary format + as long as the user can process the results. + In our train_net.py, we expect the following format: + + * key: the name of the task (e.g., bbox) + * value: a dict of {metric name: score}, e.g.: {"AP50": 80} + """ + pass + + +class DatasetEvaluators(DatasetEvaluator): + """ + Wrapper class to combine multiple :class:`DatasetEvaluator` instances. + + This class dispatches every evaluation call to + all of its :class:`DatasetEvaluator`. + """ + + def __init__(self, evaluators): + """ + Args: + evaluators (list): the evaluators to combine. + """ + super().__init__() + self._evaluators = evaluators + + def reset(self): + for evaluator in self._evaluators: + evaluator.reset() + + def process(self, inputs, outputs): + for evaluator in self._evaluators: + evaluator.process(inputs, outputs) + + def evaluate(self): + results = OrderedDict() + for evaluator in self._evaluators: + result = evaluator.evaluate() + if is_main_process() and result is not None: + for k, v in result.items(): + assert ( + k not in results + ), "Different evaluators produce results with the same key {}".format(k) + results[k] = v + return results + + +def inference_on_dataset(model, data_loader, evaluator): + """ + Run model on the data_loader and evaluate the metrics with evaluator. + Also benchmark the inference speed of `model.forward` accurately. + The model will be used in eval mode. + + Args: + model (nn.Module): a module which accepts an object from + `data_loader` and returns some outputs. It will be temporarily set to `eval` mode. + + If you wish to evaluate a model in `training` mode instead, you can + wrap the given model and override its behavior of `.eval()` and `.train()`. + data_loader: an iterable object with a length. + The elements it generates will be the inputs to the model. + evaluator (DatasetEvaluator): the evaluator to run. Use `None` if you only want + to benchmark, but don't want to do any evaluation. + + Returns: + The return value of `evaluator.evaluate()` + """ + num_devices = get_world_size() + logger = logging.getLogger(__name__) + logger.info("Start inference on {} images".format(len(data_loader))) + + total = len(data_loader) # inference data loader must have a fixed length + if evaluator is None: + # create a no-op evaluator + evaluator = DatasetEvaluators([]) + evaluator.reset() + + num_warmup = min(5, total - 1) + start_time = time.perf_counter() + total_compute_time = 0 + with inference_context(model), torch.no_grad(): + for idx, inputs in enumerate(data_loader): + if idx == num_warmup: + start_time = time.perf_counter() + total_compute_time = 0 + + start_compute_time = time.perf_counter() + outputs = model(inputs) + if torch.cuda.is_available(): + torch.cuda.synchronize() + total_compute_time += time.perf_counter() - start_compute_time + evaluator.process(inputs, outputs) + + iters_after_start = idx + 1 - num_warmup * int(idx >= num_warmup) + seconds_per_img = total_compute_time / iters_after_start + if idx >= num_warmup * 2 or seconds_per_img > 5: + total_seconds_per_img = (time.perf_counter() - start_time) / iters_after_start + eta = datetime.timedelta(seconds=int(total_seconds_per_img * (total - idx - 1))) + log_every_n_seconds( + logging.INFO, + "Inference done {}/{}. {:.4f} s / demo. ETA={}".format( + idx + 1, total, seconds_per_img, str(eta) + ), + n=5, + ) + + # Measure the time only for this worker (before the synchronization barrier) + total_time = time.perf_counter() - start_time + total_time_str = str(datetime.timedelta(seconds=total_time)) + # NOTE this format is parsed by grep + logger.info( + "Total inference time: {} ({:.6f} s / demo per device, on {} devices)".format( + total_time_str, total_time / (total - num_warmup), num_devices + ) + ) + total_compute_time_str = str(datetime.timedelta(seconds=int(total_compute_time))) + logger.info( + "Total inference pure compute time: {} ({:.6f} s / demo per device, on {} devices)".format( + total_compute_time_str, total_compute_time / (total - num_warmup), num_devices + ) + ) + + results = evaluator.evaluate() + # An evaluator may return None when not in main process. + # Replace it by an empty dict instead to make it easier for downstream code to handle + if results is None: + results = {} + return results + + +@contextmanager +def inference_context(model): + """ + A context where the model is temporarily changed to eval mode, + and restored to previous mode afterwards. + + Args: + model: a torch Module + """ + training_mode = model.training + model.eval() + yield + model.train(training_mode) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/lvis_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/lvis_evaluation.py new file mode 100644 index 0000000..e55f50f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/lvis_evaluation.py @@ -0,0 +1,350 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import itertools +import json +import logging +import os +import pickle +from collections import OrderedDict +import torch +from fvcore.common.file_io import PathManager + +import detectron2.utils.comm as comm +from detectron2.data import MetadataCatalog +from detectron2.structures import Boxes, BoxMode, pairwise_iou +from detectron2.utils.logger import create_small_table + +from .coco_evaluation import instances_to_coco_json +from .evaluator import DatasetEvaluator + + +class LVISEvaluator(DatasetEvaluator): + """ + Evaluate object proposal and instance detection/segmentation outputs using + LVIS's metrics and evaluation API. + """ + + def __init__(self, dataset_name, cfg, distributed, output_dir=None): + """ + Args: + dataset_name (str): name of the dataset to be evaluated. + It must have the following corresponding metadata: + "json_file": the path to the LVIS format annotation + cfg (CfgNode): config instance + distributed (True): if True, will collect results from all ranks for evaluation. + Otherwise, will evaluate the results in the current process. + output_dir (str): optional, an output directory to dump results. + """ + from lvis import LVIS + + self._tasks = self._tasks_from_config(cfg) + self._distributed = distributed + self._output_dir = output_dir + + self._cpu_device = torch.device("cpu") + self._logger = logging.getLogger(__name__) + + self._metadata = MetadataCatalog.get(dataset_name) + json_file = PathManager.get_local_path(self._metadata.json_file) + self._lvis_api = LVIS(json_file) + # Test set json files do not contain annotations (evaluation must be + # performed using the LVIS evaluation server). + self._do_evaluation = len(self._lvis_api.get_ann_ids()) > 0 + + def reset(self): + self._predictions = [] + + def _tasks_from_config(self, cfg): + """ + Returns: + tuple[str]: tasks that can be evaluated under the given configuration. + """ + tasks = ("bbox",) + if cfg.MODEL.MASK_ON: + tasks = tasks + ("segm",) + return tasks + + def process(self, inputs, outputs): + """ + Args: + inputs: the inputs to a LVIS model (e.g., GeneralizedRCNN). + It is a list of dict. Each dict corresponds to an image and + contains keys like "height", "width", "file_name", "image_id". + outputs: the outputs of a LVIS model. It is a list of dicts with key + "instances" that contains :class:`Instances`. + """ + for input, output in zip(inputs, outputs): + prediction = {"image_id": input["image_id"]} + + if "instances" in output: + instances = output["instances"].to(self._cpu_device) + prediction["instances"] = instances_to_coco_json(instances, input["image_id"]) + if "proposals" in output: + prediction["proposals"] = output["proposals"].to(self._cpu_device) + self._predictions.append(prediction) + + def evaluate(self): + if self._distributed: + comm.synchronize() + predictions = comm.gather(self._predictions, dst=0) + predictions = list(itertools.chain(*predictions)) + + if not comm.is_main_process(): + return + else: + predictions = self._predictions + + if len(predictions) == 0: + self._logger.warning("[LVISEvaluator] Did not receive valid predictions.") + return {} + + if self._output_dir: + PathManager.mkdirs(self._output_dir) + file_path = os.path.join(self._output_dir, "instances_predictions.pth") + with PathManager.open(file_path, "wb") as f: + torch.save(predictions, f) + + self._results = OrderedDict() + if "proposals" in predictions[0]: + self._eval_box_proposals(predictions) + if "instances" in predictions[0]: + self._eval_predictions(set(self._tasks), predictions) + # Copy so the caller can do whatever with results + return copy.deepcopy(self._results) + + def _eval_predictions(self, tasks, predictions): + """ + Evaluate predictions on the given tasks. + Fill self._results with the metrics of the tasks. + + Args: + predictions (list[dict]): list of outputs from the model + """ + self._logger.info("Preparing results in the LVIS format ...") + lvis_results = list(itertools.chain(*[x["instances"] for x in predictions])) + + # LVIS evaluator can be used to evaluate results for COCO dataset categories. + # In this case `_metadata` variable will have a field with COCO-specific category mapping. + if hasattr(self._metadata, "thing_dataset_id_to_contiguous_id"): + reverse_id_mapping = { + v: k for k, v in self._metadata.thing_dataset_id_to_contiguous_id.items() + } + for result in lvis_results: + result["category_id"] = reverse_id_mapping[result["category_id"]] + else: + # unmap the category ids for LVIS (from 0-indexed to 1-indexed) + for result in lvis_results: + result["category_id"] += 1 + + if self._output_dir: + file_path = os.path.join(self._output_dir, "lvis_instances_results.json") + self._logger.info("Saving results to {}".format(file_path)) + with PathManager.open(file_path, "w") as f: + f.write(json.dumps(lvis_results)) + f.flush() + + if not self._do_evaluation: + self._logger.info("Annotations are not available for evaluation.") + return + + self._logger.info("Evaluating predictions ...") + for task in sorted(tasks): + res = _evaluate_predictions_on_lvis( + self._lvis_api, lvis_results, task, class_names=self._metadata.get("thing_classes") + ) + self._results[task] = res + + def _eval_box_proposals(self, predictions): + """ + Evaluate the box proposals in predictions. + Fill self._results with the metrics for "box_proposals" task. + """ + if self._output_dir: + # Saving generated box proposals to file. + # Predicted box_proposals are in XYXY_ABS mode. + bbox_mode = BoxMode.XYXY_ABS.value + ids, boxes, objectness_logits = [], [], [] + for prediction in predictions: + ids.append(prediction["image_id"]) + boxes.append(prediction["proposals"].proposal_boxes.tensor.numpy()) + objectness_logits.append(prediction["proposals"].objectness_logits.numpy()) + + proposal_data = { + "boxes": boxes, + "objectness_logits": objectness_logits, + "ids": ids, + "bbox_mode": bbox_mode, + } + with PathManager.open(os.path.join(self._output_dir, "box_proposals.pkl"), "wb") as f: + pickle.dump(proposal_data, f) + + if not self._do_evaluation: + self._logger.info("Annotations are not available for evaluation.") + return + + self._logger.info("Evaluating bbox proposals ...") + res = {} + areas = {"all": "", "small": "s", "medium": "m", "large": "l"} + for limit in [100, 1000]: + for area, suffix in areas.items(): + stats = _evaluate_box_proposals(predictions, self._lvis_api, area=area, limit=limit) + key = "AR{}@{:d}".format(suffix, limit) + res[key] = float(stats["ar"].item() * 100) + self._logger.info("Proposal metrics: \n" + create_small_table(res)) + self._results["box_proposals"] = res + + +# inspired from Detectron: +# https://github.com/facebookresearch/Detectron/blob/a6a835f5b8208c45d0dce217ce9bbda915f44df7/detectron/datasets/json_dataset_evaluator.py#L255 # noqa +def _evaluate_box_proposals(dataset_predictions, lvis_api, thresholds=None, area="all", limit=None): + """ + Evaluate detection proposal recall metrics. This function is a much + faster alternative to the official LVIS API recall evaluation code. However, + it produces slightly different results. + """ + # Record max overlap value for each gt box + # Return vector of overlap values + areas = { + "all": 0, + "small": 1, + "medium": 2, + "large": 3, + "96-128": 4, + "128-256": 5, + "256-512": 6, + "512-inf": 7, + } + area_ranges = [ + [0 ** 2, 1e5 ** 2], # all + [0 ** 2, 32 ** 2], # small + [32 ** 2, 96 ** 2], # medium + [96 ** 2, 1e5 ** 2], # large + [96 ** 2, 128 ** 2], # 96-128 + [128 ** 2, 256 ** 2], # 128-256 + [256 ** 2, 512 ** 2], # 256-512 + [512 ** 2, 1e5 ** 2], + ] # 512-inf + assert area in areas, "Unknown area range: {}".format(area) + area_range = area_ranges[areas[area]] + gt_overlaps = [] + num_pos = 0 + + for prediction_dict in dataset_predictions: + predictions = prediction_dict["proposals"] + + # sort predictions in descending order + # TODO maybe remove this and make it explicit in the documentation + inds = predictions.objectness_logits.sort(descending=True)[1] + predictions = predictions[inds] + + ann_ids = lvis_api.get_ann_ids(img_ids=[prediction_dict["image_id"]]) + anno = lvis_api.load_anns(ann_ids) + gt_boxes = [ + BoxMode.convert(obj["bbox"], BoxMode.XYWH_ABS, BoxMode.XYXY_ABS) for obj in anno + ] + gt_boxes = torch.as_tensor(gt_boxes).reshape(-1, 4) # guard against no boxes + gt_boxes = Boxes(gt_boxes) + gt_areas = torch.as_tensor([obj["area"] for obj in anno]) + + if len(gt_boxes) == 0 or len(predictions) == 0: + continue + + valid_gt_inds = (gt_areas >= area_range[0]) & (gt_areas <= area_range[1]) + gt_boxes = gt_boxes[valid_gt_inds] + + num_pos += len(gt_boxes) + + if len(gt_boxes) == 0: + continue + + if limit is not None and len(predictions) > limit: + predictions = predictions[:limit] + + overlaps = pairwise_iou(predictions.proposal_boxes, gt_boxes) + + _gt_overlaps = torch.zeros(len(gt_boxes)) + for j in range(min(len(predictions), len(gt_boxes))): + # find which proposal box maximally covers each gt box + # and get the iou amount of coverage for each gt box + max_overlaps, argmax_overlaps = overlaps.max(dim=0) + + # find which gt box is 'best' covered (i.e. 'best' = most iou) + gt_ovr, gt_ind = max_overlaps.max(dim=0) + assert gt_ovr >= 0 + # find the proposal box that covers the best covered gt box + box_ind = argmax_overlaps[gt_ind] + # record the iou coverage of this gt box + _gt_overlaps[j] = overlaps[box_ind, gt_ind] + assert _gt_overlaps[j] == gt_ovr + # mark the proposal box and the gt box as used + overlaps[box_ind, :] = -1 + overlaps[:, gt_ind] = -1 + + # append recorded iou coverage level + gt_overlaps.append(_gt_overlaps) + gt_overlaps = ( + torch.cat(gt_overlaps, dim=0) if len(gt_overlaps) else torch.zeros(0, dtype=torch.float32) + ) + gt_overlaps, _ = torch.sort(gt_overlaps) + + if thresholds is None: + step = 0.05 + thresholds = torch.arange(0.5, 0.95 + 1e-5, step, dtype=torch.float32) + recalls = torch.zeros_like(thresholds) + # compute recall for each iou threshold + for i, t in enumerate(thresholds): + recalls[i] = (gt_overlaps >= t).float().sum() / float(num_pos) + # ar = 2 * np.trapz(recalls, thresholds) + ar = recalls.mean() + return { + "ar": ar, + "recalls": recalls, + "thresholds": thresholds, + "gt_overlaps": gt_overlaps, + "num_pos": num_pos, + } + + +def _evaluate_predictions_on_lvis(lvis_gt, lvis_results, iou_type, class_names=None): + """ + Args: + iou_type (str): + kpt_oks_sigmas (list[float]): + class_names (None or list[str]): if provided, will use it to predict + per-category AP. + + Returns: + a dict of {metric name: score} + """ + metrics = { + "bbox": ["AP", "AP50", "AP75", "APs", "APm", "APl", "APr", "APc", "APf"], + "segm": ["AP", "AP50", "AP75", "APs", "APm", "APl", "APr", "APc", "APf"], + }[iou_type] + + logger = logging.getLogger(__name__) + + if len(lvis_results) == 0: # TODO: check if needed + logger.warn("No predictions from the model!") + return {metric: float("nan") for metric in metrics} + + if iou_type == "segm": + lvis_results = copy.deepcopy(lvis_results) + # When evaluating mask AP, if the results contain bbox, LVIS API will + # use the box area as the area of the instance, instead of the mask area. + # This leads to a different definition of small/medium/large. + # We remove the bbox field to let mask AP use mask area. + for c in lvis_results: + c.pop("bbox", None) + + from lvis import LVISEval, LVISResults + + lvis_results = LVISResults(lvis_gt, lvis_results) + lvis_eval = LVISEval(lvis_gt, lvis_results, iou_type) + lvis_eval.run() + lvis_eval.print_results() + + # Pull the standard metrics from the LVIS results + results = lvis_eval.get_results() + results = {metric: float(results[metric] * 100) for metric in metrics} + logger.info("Evaluation results for {}: \n".format(iou_type) + create_small_table(results)) + return results diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/panoptic_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/panoptic_evaluation.py new file mode 100644 index 0000000..fb5e7ab --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/panoptic_evaluation.py @@ -0,0 +1,167 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import contextlib +import io +import itertools +import json +import logging +import os +import tempfile +from collections import OrderedDict +from fvcore.common.file_io import PathManager +from PIL import Image +from tabulate import tabulate + +from detectron2.data import MetadataCatalog +from detectron2.utils import comm + +from .evaluator import DatasetEvaluator + +logger = logging.getLogger(__name__) + + +class COCOPanopticEvaluator(DatasetEvaluator): + """ + Evaluate Panoptic Quality metrics on COCO using PanopticAPI. + It saves panoptic segmentation prediction in `output_dir` + + It contains a synchronize call and has to be called from all workers. + """ + + def __init__(self, dataset_name, output_dir): + """ + Args: + dataset_name (str): name of the dataset + output_dir (str): output directory to save results for evaluation + """ + self._metadata = MetadataCatalog.get(dataset_name) + self._thing_contiguous_id_to_dataset_id = { + v: k for k, v in self._metadata.thing_dataset_id_to_contiguous_id.items() + } + self._stuff_contiguous_id_to_dataset_id = { + v: k for k, v in self._metadata.stuff_dataset_id_to_contiguous_id.items() + } + + self._predictions_json = os.path.join(output_dir, "predictions.json") + + def reset(self): + self._predictions = [] + + def _convert_category_id(self, segment_info): + isthing = segment_info.pop("isthing", None) + if isthing is None: + # the model produces panoptic category id directly. No more conversion needed + return segment_info + if isthing is True: + segment_info["category_id"] = self._thing_contiguous_id_to_dataset_id[ + segment_info["category_id"] + ] + else: + segment_info["category_id"] = self._stuff_contiguous_id_to_dataset_id[ + segment_info["category_id"] + ] + return segment_info + + def process(self, inputs, outputs): + from panopticapi.utils import id2rgb + + for input, output in zip(inputs, outputs): + panoptic_img, segments_info = output["panoptic_seg"] + panoptic_img = panoptic_img.cpu().numpy() + + file_name = os.path.basename(input["file_name"]) + file_name_png = os.path.splitext(file_name)[0] + ".png" + with io.BytesIO() as out: + Image.fromarray(id2rgb(panoptic_img)).save(out, format="PNG") + segments_info = [self._convert_category_id(x) for x in segments_info] + self._predictions.append( + { + "image_id": input["image_id"], + "file_name": file_name_png, + "png_string": out.getvalue(), + "segments_info": segments_info, + } + ) + + def evaluate(self): + comm.synchronize() + + self._predictions = comm.gather(self._predictions) + self._predictions = list(itertools.chain(*self._predictions)) + if not comm.is_main_process(): + return + + # PanopticApi requires local files + gt_json = PathManager.get_local_path(self._metadata.panoptic_json) + gt_folder = PathManager.get_local_path(self._metadata.panoptic_root) + + with tempfile.TemporaryDirectory(prefix="panoptic_eval") as pred_dir: + logger.info("Writing all panoptic predictions to {} ...".format(pred_dir)) + for p in self._predictions: + with open(os.path.join(pred_dir, p["file_name"]), "wb") as f: + f.write(p.pop("png_string")) + + with open(gt_json, "r") as f: + json_data = json.load(f) + json_data["annotations"] = self._predictions + with PathManager.open(self._predictions_json, "w") as f: + f.write(json.dumps(json_data)) + + from panopticapi.evaluation import pq_compute + + with contextlib.redirect_stdout(io.StringIO()): + pq_res = pq_compute( + gt_json, + PathManager.get_local_path(self._predictions_json), + gt_folder=gt_folder, + pred_folder=pred_dir, + ) + + res = {} + res["PQ"] = 100 * pq_res["All"]["pq"] + res["SQ"] = 100 * pq_res["All"]["sq"] + res["RQ"] = 100 * pq_res["All"]["rq"] + res["PQ_th"] = 100 * pq_res["Things"]["pq"] + res["SQ_th"] = 100 * pq_res["Things"]["sq"] + res["RQ_th"] = 100 * pq_res["Things"]["rq"] + res["PQ_st"] = 100 * pq_res["Stuff"]["pq"] + res["SQ_st"] = 100 * pq_res["Stuff"]["sq"] + res["RQ_st"] = 100 * pq_res["Stuff"]["rq"] + + results = OrderedDict({"panoptic_seg": res}) + _print_panoptic_results(pq_res) + + return results + + +def _print_panoptic_results(pq_res): + headers = ["", "PQ", "SQ", "RQ", "#categories"] + data = [] + for name in ["All", "Things", "Stuff"]: + row = [name] + [pq_res[name][k] * 100 for k in ["pq", "sq", "rq"]] + [pq_res[name]["n"]] + data.append(row) + table = tabulate( + data, headers=headers, tablefmt="pipe", floatfmt=".3f", stralign="center", numalign="center" + ) + logger.info("Panoptic Evaluation Results:\n" + table) + + +if __name__ == "__main__": + from detectron2.utils.logger import setup_logger + + logger = setup_logger() + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("--gt-json") + parser.add_argument("--gt-dir") + parser.add_argument("--pred-json") + parser.add_argument("--pred-dir") + args = parser.parse_args() + + from panopticapi.evaluation import pq_compute + + with contextlib.redirect_stdout(io.StringIO()): + pq_res = pq_compute( + args.gt_json, args.pred_json, gt_folder=args.gt_dir, pred_folder=args.pred_dir + ) + _print_panoptic_results(pq_res) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/pascal_voc_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/pascal_voc_evaluation.py new file mode 100644 index 0000000..22d2e52 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/pascal_voc_evaluation.py @@ -0,0 +1,294 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import logging +import numpy as np +import os +import tempfile +import xml.etree.ElementTree as ET +from collections import OrderedDict, defaultdict +from functools import lru_cache +import torch +from fvcore.common.file_io import PathManager + +from detectron2.data import MetadataCatalog +from detectron2.utils import comm + +from .evaluator import DatasetEvaluator + + +class PascalVOCDetectionEvaluator(DatasetEvaluator): + """ + Evaluate Pascal VOC AP. + It contains a synchronization, therefore has to be called from all ranks. + + Note that this is a rewrite of the official Matlab API. + The results should be similar, but not identical to the one produced by + the official API. + """ + + def __init__(self, dataset_name): + """ + Args: + dataset_name (str): name of the dataset, e.g., "voc_2007_test" + """ + self._dataset_name = dataset_name + meta = MetadataCatalog.get(dataset_name) + self._anno_file_template = os.path.join(meta.dirname, "Annotations", "{}.xml") + self._image_set_path = os.path.join(meta.dirname, "ImageSets", "Main", meta.split + ".txt") + self._class_names = meta.thing_classes + assert meta.year in [2007, 2012], meta.year + self._is_2007 = meta.year == 2007 + self._cpu_device = torch.device("cpu") + self._logger = logging.getLogger(__name__) + + def reset(self): + self._predictions = defaultdict(list) # class name -> list of prediction strings + + def process(self, inputs, outputs): + for input, output in zip(inputs, outputs): + image_id = input["image_id"] + instances = output["instances"].to(self._cpu_device) + boxes = instances.pred_boxes.tensor.numpy() + scores = instances.scores.tolist() + classes = instances.pred_classes.tolist() + for box, score, cls in zip(boxes, scores, classes): + xmin, ymin, xmax, ymax = box + # The inverse of data loading logic in `data/pascal_voc.py` + xmin += 1 + ymin += 1 + self._predictions[cls].append( + f"{image_id} {score:.3f} {xmin:.1f} {ymin:.1f} {xmax:.1f} {ymax:.1f}" + ) + + def evaluate(self): + """ + Returns: + dict: has a key "segm", whose value is a dict of "AP", "AP50", and "AP75". + """ + all_predictions = comm.gather(self._predictions, dst=0) + if not comm.is_main_process(): + return + predictions = defaultdict(list) + for predictions_per_rank in all_predictions: + for clsid, lines in predictions_per_rank.items(): + predictions[clsid].extend(lines) + del all_predictions + + self._logger.info( + "Evaluating {} using {} metric. " + "Note that results do not use the official Matlab API.".format( + self._dataset_name, 2007 if self._is_2007 else 2012 + ) + ) + + with tempfile.TemporaryDirectory(prefix="pascal_voc_eval_") as dirname: + res_file_template = os.path.join(dirname, "{}.txt") + + aps = defaultdict(list) # iou -> ap per class + for cls_id, cls_name in enumerate(self._class_names): + lines = predictions.get(cls_id, [""]) + + with open(res_file_template.format(cls_name), "w") as f: + f.write("\n".join(lines)) + + for thresh in range(50, 100, 5): + rec, prec, ap = voc_eval( + res_file_template, + self._anno_file_template, + self._image_set_path, + cls_name, + ovthresh=thresh / 100.0, + use_07_metric=self._is_2007, + ) + aps[thresh].append(ap * 100) + + ret = OrderedDict() + mAP = {iou: np.mean(x) for iou, x in aps.items()} + ret["bbox"] = {"AP": np.mean(list(mAP.values())), "AP50": mAP[50], "AP75": mAP[75]} + return ret + + +############################################################################## +# +# Below code is modified from +# https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/voc_eval.py +# -------------------------------------------------------- +# Fast/er R-CNN +# Licensed under The MIT License [see LICENSE for details] +# Written by Bharath Hariharan +# -------------------------------------------------------- + +"""Python implementation of the PASCAL VOC devkit's AP evaluation code.""" + + +@lru_cache(maxsize=None) +def parse_rec(filename): + """Parse a PASCAL VOC xml file.""" + with PathManager.open(filename) as f: + tree = ET.parse(f) + objects = [] + for obj in tree.findall("object"): + obj_struct = {} + obj_struct["name"] = obj.find("name").text + obj_struct["pose"] = obj.find("pose").text + obj_struct["truncated"] = int(obj.find("truncated").text) + obj_struct["difficult"] = int(obj.find("difficult").text) + bbox = obj.find("bndbox") + obj_struct["bbox"] = [ + int(bbox.find("xmin").text), + int(bbox.find("ymin").text), + int(bbox.find("xmax").text), + int(bbox.find("ymax").text), + ] + objects.append(obj_struct) + + return objects + + +def voc_ap(rec, prec, use_07_metric=False): + """Compute VOC AP given precision and recall. If use_07_metric is true, uses + the VOC 07 11-point method (default:False). + """ + if use_07_metric: + # 11 point metric + ap = 0.0 + for t in np.arange(0.0, 1.1, 0.1): + if np.sum(rec >= t) == 0: + p = 0 + else: + p = np.max(prec[rec >= t]) + ap = ap + p / 11.0 + else: + # correct AP calculation + # first append sentinel values at the end + mrec = np.concatenate(([0.0], rec, [1.0])) + mpre = np.concatenate(([0.0], prec, [0.0])) + + # compute the precision envelope + for i in range(mpre.size - 1, 0, -1): + mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i]) + + # to calculate area under PR curve, look for points + # where X axis (recall) changes value + i = np.where(mrec[1:] != mrec[:-1])[0] + + # and sum (\Delta recall) * prec + ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1]) + return ap + + +def voc_eval(detpath, annopath, imagesetfile, classname, ovthresh=0.5, use_07_metric=False): + """rec, prec, ap = voc_eval(detpath, + annopath, + imagesetfile, + classname, + [ovthresh], + [use_07_metric]) + + Top level function that does the PASCAL VOC evaluation. + + detpath: Path to detections + detpath.format(classname) should produce the detection results file. + annopath: Path to annotations + annopath.format(imagename) should be the xml annotations file. + imagesetfile: Text file containing the list of images, one image per line. + classname: Category name (duh) + [ovthresh]: Overlap threshold (default = 0.5) + [use_07_metric]: Whether to use VOC07's 11 point AP computation + (default False) + """ + # assumes detections are in detpath.format(classname) + # assumes annotations are in annopath.format(imagename) + # assumes imagesetfile is a text file with each line an image name + + # first load gt + # read list of images + with PathManager.open(imagesetfile, "r") as f: + lines = f.readlines() + imagenames = [x.strip() for x in lines] + + # load annots + recs = {} + for imagename in imagenames: + recs[imagename] = parse_rec(annopath.format(imagename)) + + # extract gt objects for this class + class_recs = {} + npos = 0 + for imagename in imagenames: + R = [obj for obj in recs[imagename] if obj["name"] == classname] + bbox = np.array([x["bbox"] for x in R]) + difficult = np.array([x["difficult"] for x in R]).astype(np.bool) + # difficult = np.array([False for x in R]).astype(np.bool) # treat all "difficult" as GT + det = [False] * len(R) + npos = npos + sum(~difficult) + class_recs[imagename] = {"bbox": bbox, "difficult": difficult, "det": det} + + # read dets + detfile = detpath.format(classname) + with open(detfile, "r") as f: + lines = f.readlines() + + splitlines = [x.strip().split(" ") for x in lines] + image_ids = [x[0] for x in splitlines] + confidence = np.array([float(x[1]) for x in splitlines]) + BB = np.array([[float(z) for z in x[2:]] for x in splitlines]).reshape(-1, 4) + + # sort by confidence + sorted_ind = np.argsort(-confidence) + BB = BB[sorted_ind, :] + image_ids = [image_ids[x] for x in sorted_ind] + + # go down dets and mark TPs and FPs + nd = len(image_ids) + tp = np.zeros(nd) + fp = np.zeros(nd) + for d in range(nd): + R = class_recs[image_ids[d]] + bb = BB[d, :].astype(float) + ovmax = -np.inf + BBGT = R["bbox"].astype(float) + + if BBGT.size > 0: + # compute overlaps + # intersection + ixmin = np.maximum(BBGT[:, 0], bb[0]) + iymin = np.maximum(BBGT[:, 1], bb[1]) + ixmax = np.minimum(BBGT[:, 2], bb[2]) + iymax = np.minimum(BBGT[:, 3], bb[3]) + iw = np.maximum(ixmax - ixmin + 1.0, 0.0) + ih = np.maximum(iymax - iymin + 1.0, 0.0) + inters = iw * ih + + # union + uni = ( + (bb[2] - bb[0] + 1.0) * (bb[3] - bb[1] + 1.0) + + (BBGT[:, 2] - BBGT[:, 0] + 1.0) * (BBGT[:, 3] - BBGT[:, 1] + 1.0) + - inters + ) + + overlaps = inters / uni + ovmax = np.max(overlaps) + jmax = np.argmax(overlaps) + + if ovmax > ovthresh: + if not R["difficult"][jmax]: + if not R["det"][jmax]: + tp[d] = 1.0 + R["det"][jmax] = 1 + else: + fp[d] = 1.0 + else: + fp[d] = 1.0 + + # compute precision recall + fp = np.cumsum(fp) + tp = np.cumsum(tp) + rec = tp / float(npos) + # avoid divide by zero in case the first detection matches a difficult + # ground truth + prec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps) + ap = voc_ap(rec, prec, use_07_metric) + + return rec, prec, ap diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/rotated_coco_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/rotated_coco_evaluation.py new file mode 100644 index 0000000..30746e1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/rotated_coco_evaluation.py @@ -0,0 +1,204 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import itertools +import json +import numpy as np +import os +import torch +from fvcore.common.file_io import PathManager +from pycocotools.cocoeval import COCOeval, maskUtils + +from detectron2.structures import BoxMode, RotatedBoxes, pairwise_iou_rotated + +from .coco_evaluation import COCOEvaluator + + +class RotatedCOCOeval(COCOeval): + @staticmethod + def is_rotated(box_list): + if type(box_list) == np.ndarray: + return box_list.shape[1] == 5 + elif type(box_list) == list: + if box_list == []: # cannot decide the box_dim + return False + return np.all( + np.array( + [ + (len(obj) == 5) and ((type(obj) == list) or (type(obj) == np.ndarray)) + for obj in box_list + ] + ) + ) + return False + + @staticmethod + def boxlist_to_tensor(boxlist, output_box_dim): + if type(boxlist) == np.ndarray: + box_tensor = torch.from_numpy(boxlist) + elif type(boxlist) == list: + if boxlist == []: + return torch.zeros((0, output_box_dim), dtype=torch.float32) + else: + box_tensor = torch.FloatTensor(boxlist) + else: + raise Exception("Unrecognized boxlist type") + + input_box_dim = box_tensor.shape[1] + if input_box_dim != output_box_dim: + if input_box_dim == 4 and output_box_dim == 5: + box_tensor = BoxMode.convert(box_tensor, BoxMode.XYWH_ABS, BoxMode.XYWHA_ABS) + else: + raise Exception( + "Unable to convert from {}-dim box to {}-dim box".format( + input_box_dim, output_box_dim + ) + ) + return box_tensor + + def compute_iou_dt_gt(self, dt, gt, is_crowd): + if self.is_rotated(dt) or self.is_rotated(gt): + # TODO: take is_crowd into consideration + assert all(c == 0 for c in is_crowd) + dt = RotatedBoxes(self.boxlist_to_tensor(dt, output_box_dim=5)) + gt = RotatedBoxes(self.boxlist_to_tensor(gt, output_box_dim=5)) + return pairwise_iou_rotated(dt, gt) + else: + # This is the same as the classical COCO evaluation + return maskUtils.iou(dt, gt, is_crowd) + + def computeIoU(self, imgId, catId): + p = self.params + if p.useCats: + gt = self._gts[imgId, catId] + dt = self._dts[imgId, catId] + else: + gt = [_ for cId in p.catIds for _ in self._gts[imgId, cId]] + dt = [_ for cId in p.catIds for _ in self._dts[imgId, cId]] + if len(gt) == 0 and len(dt) == 0: + return [] + inds = np.argsort([-d["score"] for d in dt], kind="mergesort") + dt = [dt[i] for i in inds] + if len(dt) > p.maxDets[-1]: + dt = dt[0 : p.maxDets[-1]] + + assert p.iouType == "bbox", "unsupported iouType for iou computation" + + g = [g["bbox"] for g in gt] + d = [d["bbox"] for d in dt] + + # compute iou between each dt and gt region + iscrowd = [int(o["iscrowd"]) for o in gt] + + # Note: this function is copied from cocoeval.py in cocoapi + # and the major difference is here. + ious = self.compute_iou_dt_gt(d, g, iscrowd) + return ious + + +class RotatedCOCOEvaluator(COCOEvaluator): + """ + Evaluate object proposal/instance detection outputs using COCO-like metrics and APIs, + with rotated boxes support. + Note: this uses IOU only and does not consider angle differences. + """ + + def process(self, inputs, outputs): + """ + Args: + inputs: the inputs to a COCO model (e.g., GeneralizedRCNN). + It is a list of dict. Each dict corresponds to an image and + contains keys like "height", "width", "file_name", "image_id". + outputs: the outputs of a COCO model. It is a list of dicts with key + "instances" that contains :class:`Instances`. + """ + for input, output in zip(inputs, outputs): + prediction = {"image_id": input["image_id"]} + + if "instances" in output: + instances = output["instances"].to(self._cpu_device) + + prediction["instances"] = self.instances_to_json(instances, input["image_id"]) + if "proposals" in output: + prediction["proposals"] = output["proposals"].to(self._cpu_device) + self._predictions.append(prediction) + + def instances_to_json(self, instances, img_id): + num_instance = len(instances) + if num_instance == 0: + return [] + + boxes = instances.pred_boxes.tensor.numpy() + if boxes.shape[1] == 4: + boxes = BoxMode.convert(boxes, BoxMode.XYXY_ABS, BoxMode.XYWH_ABS) + boxes = boxes.tolist() + scores = instances.scores.tolist() + classes = instances.pred_classes.tolist() + + results = [] + for k in range(num_instance): + result = { + "image_id": img_id, + "category_id": classes[k], + "bbox": boxes[k], + "score": scores[k], + } + + results.append(result) + return results + + def _eval_predictions(self, tasks, predictions): + """ + Evaluate predictions on the given tasks. + Fill self._results with the metrics of the tasks. + """ + self._logger.info("Preparing results for COCO format ...") + coco_results = list(itertools.chain(*[x["instances"] for x in predictions])) + + # unmap the category ids for COCO + if hasattr(self._metadata, "thing_dataset_id_to_contiguous_id"): + reverse_id_mapping = { + v: k for k, v in self._metadata.thing_dataset_id_to_contiguous_id.items() + } + for result in coco_results: + result["category_id"] = reverse_id_mapping[result["category_id"]] + + if self._output_dir: + file_path = os.path.join(self._output_dir, "coco_instances_results.json") + self._logger.info("Saving results to {}".format(file_path)) + with PathManager.open(file_path, "w") as f: + f.write(json.dumps(coco_results)) + f.flush() + + if not self._do_evaluation: + self._logger.info("Annotations are not available for evaluation.") + return + + self._logger.info("Evaluating predictions ...") + for task in sorted(tasks): + assert task == "bbox", "Task {} is not supported".format(task) + coco_eval = ( + self._evaluate_predictions_on_coco(self._coco_api, coco_results) + if len(coco_results) > 0 + else None # cocoapi does not handle empty results very well + ) + + res = self._derive_coco_results( + coco_eval, task, class_names=self._metadata.get("thing_classes") + ) + self._results[task] = res + + def _evaluate_predictions_on_coco(self, coco_gt, coco_results): + """ + Evaluate the coco results using COCOEval API. + """ + assert len(coco_results) > 0 + + coco_dt = coco_gt.loadRes(coco_results) + + # Only bbox is supported for now + coco_eval = RotatedCOCOeval(coco_gt, coco_dt, iouType="bbox") + + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + + return coco_eval diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/sem_seg_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/sem_seg_evaluation.py new file mode 100644 index 0000000..fb3b28d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/sem_seg_evaluation.py @@ -0,0 +1,168 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import itertools +import json +import logging +import numpy as np +import os +from collections import OrderedDict +import PIL.Image as Image +import pycocotools.mask as mask_util +import torch +from fvcore.common.file_io import PathManager + +from detectron2.data import DatasetCatalog, MetadataCatalog +from detectron2.utils.comm import all_gather, is_main_process, synchronize + +from .evaluator import DatasetEvaluator + + +class SemSegEvaluator(DatasetEvaluator): + """ + Evaluate semantic segmentation + """ + + def __init__(self, dataset_name, distributed, num_classes, ignore_label=255, output_dir=None): + """ + Args: + dataset_name (str): name of the dataset to be evaluated. + distributed (True): if True, will collect results from all ranks for evaluation. + Otherwise, will evaluate the results in the current process. + num_classes (int): number of classes + ignore_label (int): value in semantic segmentation ground truth. Predictions for the + corresponding pixels should be ignored. + output_dir (str): an output directory to dump results. + """ + self._dataset_name = dataset_name + self._distributed = distributed + self._output_dir = output_dir + self._num_classes = num_classes + self._ignore_label = ignore_label + self._N = num_classes + 1 + + self._cpu_device = torch.device("cpu") + self._logger = logging.getLogger(__name__) + + self.input_file_to_gt_file = { + dataset_record["file_name"]: dataset_record["sem_seg_file_name"] + for dataset_record in DatasetCatalog.get(dataset_name) + } + + meta = MetadataCatalog.get(dataset_name) + # Dict that maps contiguous training ids to COCO category ids + try: + c2d = meta.stuff_dataset_id_to_contiguous_id + self._contiguous_id_to_dataset_id = {v: k for k, v in c2d.items()} + except AttributeError: + self._contiguous_id_to_dataset_id = None + self._class_names = meta.stuff_classes + + def reset(self): + self._conf_matrix = np.zeros((self._N, self._N), dtype=np.int64) + self._predictions = [] + + def process(self, inputs, outputs): + """ + Args: + inputs: the inputs to a model. + It is a list of dicts. Each dict corresponds to an image and + contains keys like "height", "width", "file_name". + outputs: the outputs of a model. It is either list of semantic segmentation predictions + (Tensor [H, W]) or list of dicts with key "sem_seg" that contains semantic + segmentation prediction in the same format. + """ + for input, output in zip(inputs, outputs): + output = output["sem_seg"].argmax(dim=0).to(self._cpu_device) + pred = np.array(output, dtype=np.int) + with PathManager.open(self.input_file_to_gt_file[input["file_name"]], "rb") as f: + gt = np.array(Image.open(f), dtype=np.int) + + gt[gt == self._ignore_label] = self._num_classes + + self._conf_matrix += np.bincount( + self._N * pred.reshape(-1) + gt.reshape(-1), minlength=self._N ** 2 + ).reshape(self._N, self._N) + + self._predictions.extend(self.encode_json_sem_seg(pred, input["file_name"])) + + def evaluate(self): + """ + Evaluates standard semantic segmentation metrics (http://cocodataset.org/#stuff-eval): + + * Mean intersection-over-union averaged across classes (mIoU) + * Frequency Weighted IoU (fwIoU) + * Mean pixel accuracy averaged across classes (mACC) + * Pixel Accuracy (pACC) + """ + if self._distributed: + synchronize() + conf_matrix_list = all_gather(self._conf_matrix) + self._predictions = all_gather(self._predictions) + self._predictions = list(itertools.chain(*self._predictions)) + if not is_main_process(): + return + + self._conf_matrix = np.zeros_like(self._conf_matrix) + for conf_matrix in conf_matrix_list: + self._conf_matrix += conf_matrix + + if self._output_dir: + PathManager.mkdirs(self._output_dir) + file_path = os.path.join(self._output_dir, "sem_seg_predictions.json") + with PathManager.open(file_path, "w") as f: + f.write(json.dumps(self._predictions)) + + acc = np.full(self._num_classes, np.nan, dtype=np.float) + iou = np.full(self._num_classes, np.nan, dtype=np.float) + tp = self._conf_matrix.diagonal()[:-1].astype(np.float) + pos_gt = np.sum(self._conf_matrix[:-1, :-1], axis=0).astype(np.float) + class_weights = pos_gt / np.sum(pos_gt) + pos_pred = np.sum(self._conf_matrix[:-1, :-1], axis=1).astype(np.float) + acc_valid = pos_gt > 0 + acc[acc_valid] = tp[acc_valid] / pos_gt[acc_valid] + iou_valid = (pos_gt + pos_pred) > 0 + union = pos_gt + pos_pred - tp + iou[acc_valid] = tp[acc_valid] / union[acc_valid] + macc = np.sum(acc[acc_valid]) / np.sum(acc_valid) + miou = np.sum(iou[acc_valid]) / np.sum(iou_valid) + fiou = np.sum(iou[acc_valid] * class_weights[acc_valid]) + pacc = np.sum(tp) / np.sum(pos_gt) + + res = {} + res["mIoU"] = 100 * miou + res["fwIoU"] = 100 * fiou + for i, name in enumerate(self._class_names): + res["IoU-{}".format(name)] = 100 * iou[i] + res["mACC"] = 100 * macc + res["pACC"] = 100 * pacc + for i, name in enumerate(self._class_names): + res["ACC-{}".format(name)] = 100 * acc[i] + + if self._output_dir: + file_path = os.path.join(self._output_dir, "sem_seg_evaluation.pth") + with PathManager.open(file_path, "wb") as f: + torch.save(res, f) + results = OrderedDict({"sem_seg": res}) + self._logger.info(results) + return results + + def encode_json_sem_seg(self, sem_seg, input_file_name): + """ + Convert semantic segmentation to COCO stuff format with segments encoded as RLEs. + See http://cocodataset.org/#format-results + """ + json_list = [] + for label in np.unique(sem_seg): + if self._contiguous_id_to_dataset_id is not None: + assert ( + label in self._contiguous_id_to_dataset_id + ), "Label {} is not in the metadata info for {}".format(label, self._dataset_name) + dataset_id = self._contiguous_id_to_dataset_id[label] + else: + dataset_id = int(label) + mask = (sem_seg == label).astype(np.uint8) + mask_rle = mask_util.encode(np.array(mask[:, :, None], order="F"))[0] + mask_rle["counts"] = mask_rle["counts"].decode("utf-8") + json_list.append( + {"file_name": input_file_name, "category_id": dataset_id, "segmentation": mask_rle} + ) + return json_list diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/testing.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/testing.py new file mode 100644 index 0000000..95addeb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/evaluation/testing.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import numpy as np +import pprint +import sys +from collections import OrderedDict +from collections.abc import Mapping + + +def print_csv_format(results): + """ + Print main metrics in a format similar to Detectron, + so that they are easy to copypaste into a spreadsheet. + + Args: + results (OrderedDict[dict]): task_name -> {metric -> score} + """ + assert isinstance(results, OrderedDict), results # unordered results cannot be properly printed + logger = logging.getLogger(__name__) + for task, res in results.items(): + # Don't print "AP-category" metrics since they are usually not tracked. + important_res = [(k, v) for k, v in res.items() if "-" not in k] + logger.info("copypaste: Task: {}".format(task)) + logger.info("copypaste: " + ",".join([k[0] for k in important_res])) + logger.info("copypaste: " + ",".join(["{0:.4f}".format(k[1]) for k in important_res])) + + +def verify_results(cfg, results): + """ + Args: + results (OrderedDict[dict]): task_name -> {metric -> score} + + Returns: + bool: whether the verification succeeds or not + """ + expected_results = cfg.TEST.EXPECTED_RESULTS + if not len(expected_results): + return True + + ok = True + for task, metric, expected, tolerance in expected_results: + actual = results[task][metric] + if not np.isfinite(actual): + ok = False + diff = abs(actual - expected) + if diff > tolerance: + ok = False + + logger = logging.getLogger(__name__) + if not ok: + logger.error("Result verification failed!") + logger.error("Expected Results: " + str(expected_results)) + logger.error("Actual Results: " + pprint.pformat(results)) + + sys.exit(1) + else: + logger.info("Results verification passed.") + return ok + + +def flatten_results_dict(results): + """ + Expand a hierarchical dict of scalars into a flat dict of scalars. + If results[k1][k2][k3] = v, the returned dict will have the entry + {"k1/k2/k3": v}. + + Args: + results (dict): + """ + r = {} + for k, v in results.items(): + if isinstance(v, Mapping): + v = flatten_results_dict(v) + for kk, vv in v.items(): + r[k + "/" + kk] = vv + else: + r[k] = v + return r diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/README.md b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/README.md new file mode 100644 index 0000000..9bd8b57 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/README.md @@ -0,0 +1,10 @@ + +This directory contains code to prepare a detectron2 model for deployment. +Currently it supports exporting a detectron2 model to Caffe2 format through ONNX. + +Please see [documentation](https://detectron2.readthedocs.io/tutorials/deployment.html) for its usage. + + +### Acknowledgements + +Thanks to Mobile Vision team at Facebook for developing the conversion tools. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/__init__.py new file mode 100644 index 0000000..1e2bf4d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from .api import * + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/api.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/api.py new file mode 100644 index 0000000..a760071 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/api.py @@ -0,0 +1,277 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +import copy +import logging +import os +import torch +from caffe2.proto import caffe2_pb2 +from torch import nn + +from detectron2.config import CfgNode as CN + +from .caffe2_export import export_caffe2_detection_model +from .caffe2_export import export_onnx_model as export_onnx_model_impl +from .caffe2_export import run_and_save_graph +from .caffe2_inference import ProtobufDetectionModel +from .caffe2_modeling import META_ARCH_CAFFE2_EXPORT_TYPE_MAP, convert_batched_inputs_to_c2_format +from .shared import get_pb_arg_vali, get_pb_arg_vals, save_graph + +__all__ = [ + "add_export_config", + "export_caffe2_model", + "Caffe2Model", + "export_onnx_model", + "Caffe2Tracer", +] + + +def add_export_config(cfg): + """ + Args: + cfg (CfgNode): a detectron2 config + + Returns: + CfgNode: an updated config with new options that will be used + by :class:`Caffe2Tracer`. + """ + is_frozen = cfg.is_frozen() + cfg.defrost() + cfg.EXPORT_CAFFE2 = CN() + cfg.EXPORT_CAFFE2.USE_HEATMAP_MAX_KEYPOINT = False + if is_frozen: + cfg.freeze() + return cfg + + +class Caffe2Tracer: + """ + Make a detectron2 model traceable with caffe2 style. + + An original detectron2 model may not be traceable, or + cannot be deployed directly after being traced, due to some reasons: + 1. control flow in some ops + 2. custom ops + 3. complicated pre/post processing + + This class provides a traceable version of a detectron2 model by: + 1. Rewrite parts of the model using ops in caffe2. Note that some ops do + not have GPU implementation. + 2. Define the inputs "after pre-processing" as inputs to the model + 3. Remove post-processing and produce raw layer outputs + + More specifically about inputs: all builtin models take two input tensors. + (1) NCHW float "data" which is an image (usually in [0, 255]) + (2) Nx3 float "im_info", each row of which is (height, width, 1.0) + + After making a traceable model, the class provide methods to export such a + model to different deployment formats. + + The class currently only supports models using builtin meta architectures. + """ + + def __init__(self, cfg, model, inputs): + """ + Args: + cfg (CfgNode): a detectron2 config, with extra export-related options + added by :func:`add_export_config`. + model (nn.Module): a model built by + :func:`detectron2.modeling.build_model`. + inputs: sample inputs that the given model takes for inference. + Will be used to trace the model. + """ + assert isinstance(cfg, CN), cfg + assert isinstance(model, torch.nn.Module), type(model) + if "EXPORT_CAFFE2" not in cfg: + cfg = add_export_config(cfg) # will just the defaults + + self.cfg = cfg + self.model = model + self.inputs = inputs + + def _get_traceable(self): + # TODO how to make it extensible to support custom models + C2MetaArch = META_ARCH_CAFFE2_EXPORT_TYPE_MAP[self.cfg.MODEL.META_ARCHITECTURE] + traceable_model = C2MetaArch(self.cfg, copy.deepcopy(self.model)) + traceable_inputs = traceable_model.get_caffe2_inputs(self.inputs) + return traceable_model, traceable_inputs + + def export_caffe2(self): + """ + Export the model to Caffe2's protobuf format. + The returned object can be saved with `.save_protobuf()` method. + The result can be loaded and executed using Caffe2 runtime. + + Returns: + Caffe2Model + """ + model, inputs = self._get_traceable() + predict_net, init_net = export_caffe2_detection_model(model, inputs) + return Caffe2Model(predict_net, init_net) + + def export_onnx(self): + """ + Export the model to ONNX format. + Note that the exported model contains custom ops only available in caffe2, therefore it + cannot be directly executed by other runtime. Post-processing or transformation passes + may be applied on the model to accommodate different runtimes. + + Returns: + onnx.ModelProto: an onnx model. + """ + model, inputs = self._get_traceable() + return export_onnx_model_impl(model, (inputs,)) + + def export_torchscript(self): + """ + Export the model to a `torch.jit.TracedModule` by tracing. + The returned object can be saved to a file by ".save()". + + Returns: + torch.jit.TracedModule: a torch TracedModule + """ + model, inputs = self._get_traceable() + logger = logging.getLogger(__name__) + logger.info("Tracing the model with torch.jit.trace ...") + with torch.no_grad(): + return torch.jit.trace(model, (inputs,), optimize=True) + + +def export_caffe2_model(cfg, model, inputs): + """ + Export a detectron2 model to caffe2 format. + + Args: + cfg (CfgNode): a detectron2 config, with extra export-related options + added by :func:`add_export_config`. + model (nn.Module): a model built by + :func:`detectron2.modeling.build_model`. + It will be modified by this function. + inputs: sample inputs that the given model takes for inference. + Will be used to trace the model. + + Returns: + Caffe2Model + """ + return Caffe2Tracer(cfg, model, inputs).export_caffe2() + + +def export_onnx_model(cfg, model, inputs): + """ + Export a detectron2 model to ONNX format. + Note that the exported model contains custom ops only available in caffe2, therefore it + cannot be directly executed by other runtime. Post-processing or transformation passes + may be applied on the model to accommodate different runtimes. + Args: + cfg (CfgNode): a detectron2 config, with extra export-related options + added by :func:`add_export_config`. + model (nn.Module): a model built by + :func:`detectron2.modeling.build_model`. + It will be modified by this function. + inputs: sample inputs that the given model takes for inference. + Will be used to trace the model. + Returns: + onnx.ModelProto: an onnx model. + """ + return Caffe2Tracer(cfg, model, inputs).export_onnx() + + +class Caffe2Model(nn.Module): + """ + A wrapper around the traced model in caffe2's pb format. + """ + + def __init__(self, predict_net, init_net): + super().__init__() + self.eval() # always in eval mode + self._predict_net = predict_net + self._init_net = init_net + self._predictor = None + + @property + def predict_net(self): + """ + Returns: + core.Net: the underlying caffe2 predict net + """ + return self._predict_net + + @property + def init_net(self): + """ + Returns: + core.Net: the underlying caffe2 init net + """ + return self._init_net + + __init__.__HIDE_SPHINX_DOC__ = True + + def save_protobuf(self, output_dir): + """ + Save the model as caffe2's protobuf format. + + Args: + output_dir (str): the output directory to save protobuf files. + """ + logger = logging.getLogger(__name__) + logger.info("Saving model to {} ...".format(output_dir)) + os.makedirs(output_dir, exist_ok=True) + + with open(os.path.join(output_dir, "model.pb"), "wb") as f: + f.write(self._predict_net.SerializeToString()) + with open(os.path.join(output_dir, "model.pbtxt"), "w") as f: + f.write(str(self._predict_net)) + with open(os.path.join(output_dir, "model_init.pb"), "wb") as f: + f.write(self._init_net.SerializeToString()) + + def save_graph(self, output_file, inputs=None): + """ + Save the graph as SVG format. + + Args: + output_file (str): a SVG file + inputs: optional inputs given to the model. + If given, the inputs will be used to run the graph to record + shape of every tensor. The shape information will be + saved together with the graph. + """ + if inputs is None: + save_graph(self._predict_net, output_file, op_only=False) + else: + size_divisibility = get_pb_arg_vali(self._predict_net, "size_divisibility", 0) + device = get_pb_arg_vals(self._predict_net, "device", b"cpu").decode("ascii") + inputs = convert_batched_inputs_to_c2_format(inputs, size_divisibility, device) + inputs = [x.cpu().numpy() for x in inputs] + run_and_save_graph(self._predict_net, self._init_net, inputs, output_file) + + @staticmethod + def load_protobuf(dir): + """ + Args: + dir (str): a directory used to save Caffe2Model with + :meth:`save_protobuf`. + The files "model.pb" and "model_init.pb" are needed. + + Returns: + Caffe2Model: the caffe2 model loaded from this directory. + """ + predict_net = caffe2_pb2.NetDef() + with open(os.path.join(dir, "model.pb"), "rb") as f: + predict_net.ParseFromString(f.read()) + + init_net = caffe2_pb2.NetDef() + with open(os.path.join(dir, "model_init.pb"), "rb") as f: + init_net.ParseFromString(f.read()) + + return Caffe2Model(predict_net, init_net) + + def __call__(self, inputs): + """ + An interface that wraps around a caffe2 model and mimics detectron2's models' + input & output format. This is used to compare the outputs of caffe2 model + with its original torch model. + + Due to the extra conversion between torch/caffe2, + this method is not meant for benchmark. + """ + if self._predictor is None: + self._predictor = ProtobufDetectionModel(self._predict_net, self._init_net) + return self._predictor(inputs) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/c10.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/c10.py new file mode 100644 index 0000000..6e3cbe3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/c10.py @@ -0,0 +1,503 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import math +import torch +import torch.nn.functional as F + +from detectron2.layers import cat +from detectron2.layers.roi_align_rotated import ROIAlignRotated +from detectron2.modeling import poolers +from detectron2.modeling.proposal_generator import rpn +from detectron2.modeling.roi_heads.mask_head import mask_rcnn_inference +from detectron2.structures import Boxes, ImageList, Instances, Keypoints + +from .shared import alias, to_device + + +""" +This file contains caffe2-compatible implementation of several detectrno2 components. +""" + + +class Caffe2Boxes(Boxes): + """ + Representing a list of detectron2.structures.Boxes from minibatch, each box + is represented by a 5d vector (batch index + 4 coordinates), or a 6d vector + (batch index + 5 coordinates) for RotatedBoxes. + """ + + def __init__(self, tensor): + assert isinstance(tensor, torch.Tensor) + assert tensor.dim() == 2 and tensor.size(-1) in [4, 5, 6], tensor.size() + # TODO: make tensor immutable when dim is Nx5 for Boxes, + # and Nx6 for RotatedBoxes? + self.tensor = tensor + + +# TODO clean up this class, maybe just extend Instances +class InstancesList(object): + """ + Tensor representation of a list of Instances object for a batch of images. + + When dealing with a batch of images with Caffe2 ops, a list of bboxes + (instances) are usually represented by single Tensor with size + (sigma(Ni), 5) or (sigma(Ni), 4) plus a batch split Tensor. This class is + for providing common functions to convert between these two representations. + """ + + def __init__(self, im_info, indices, extra_fields=None): + # [N, 3] -> (H, W, Scale) + self.im_info = im_info + # [N,] -> indice of batch to which the instance belongs + self.indices = indices + # [N, ...] + self.batch_extra_fields = extra_fields or {} + + self.image_size = self.im_info + + def get_fields(self): + """ like `get_fields` in the Instances object, + but return each field in tensor representations """ + ret = {} + for k, v in self.batch_extra_fields.items(): + # if isinstance(v, torch.Tensor): + # tensor_rep = v + # elif isinstance(v, (Boxes, Keypoints)): + # tensor_rep = v.tensor + # else: + # raise ValueError("Can't find tensor representation for: {}".format()) + ret[k] = v + return ret + + def has(self, name): + return name in self.batch_extra_fields + + def set(self, name, value): + data_len = len(value) + if len(self.batch_extra_fields): + assert ( + len(self) == data_len + ), "Adding a field of length {} to a Instances of length {}".format(data_len, len(self)) + self.batch_extra_fields[name] = value + + def __setattr__(self, name, val): + if name in ["im_info", "indices", "batch_extra_fields", "image_size"]: + super().__setattr__(name, val) + else: + self.set(name, val) + + def __getattr__(self, name): + if name not in self.batch_extra_fields: + raise AttributeError("Cannot find field '{}' in the given Instances!".format(name)) + return self.batch_extra_fields[name] + + def __len__(self): + return len(self.indices) + + def flatten(self): + ret = [] + for _, v in self.batch_extra_fields.items(): + if isinstance(v, (Boxes, Keypoints)): + ret.append(v.tensor) + else: + ret.append(v) + return ret + + @staticmethod + def to_d2_instances_list(instances_list): + """ + Convert InstancesList to List[Instances]. The input `instances_list` can + also be a List[Instances], in this case this method is a non-op. + """ + if not isinstance(instances_list, InstancesList): + assert all(isinstance(x, Instances) for x in instances_list) + return instances_list + + ret = [] + for i, info in enumerate(instances_list.im_info): + instances = Instances(torch.Size([int(info[0].item()), int(info[1].item())])) + + ids = instances_list.indices == i + for k, v in instances_list.batch_extra_fields.items(): + if isinstance(v, torch.Tensor): + instances.set(k, v[ids]) + continue + elif isinstance(v, Boxes): + instances.set(k, v[ids, -4:]) + continue + + target_type, tensor_source = v + assert isinstance(tensor_source, torch.Tensor) + assert tensor_source.shape[0] == instances_list.indices.shape[0] + tensor_source = tensor_source[ids] + + if issubclass(target_type, Boxes): + instances.set(k, Boxes(tensor_source[:, -4:])) + elif issubclass(target_type, Keypoints): + instances.set(k, Keypoints(tensor_source)) + elif issubclass(target_type, torch.Tensor): + instances.set(k, tensor_source) + else: + raise ValueError("Can't handle targe type: {}".format(target_type)) + + ret.append(instances) + return ret + + +class Caffe2Compatible(object): + def _get_tensor_mode(self): + return self._tensor_mode + + def _set_tensor_mode(self, v): + self._tensor_mode = v + + tensor_mode = property(_get_tensor_mode, _set_tensor_mode) + """ + If true, the model expects C2-style tensor only inputs/outputs format. + """ + + +class Caffe2RPN(Caffe2Compatible, rpn.RPN): + def forward(self, images, features, gt_instances=None): + assert not self.training + + features = [features[f] for f in self.in_features] + objectness_logits_pred, anchor_deltas_pred = self.rpn_head(features) + + assert isinstance(images, ImageList) + if self.tensor_mode: + im_info = images.image_sizes + else: + im_info = torch.Tensor( + [[im_sz[0], im_sz[1], torch.Tensor([1.0])] for im_sz in images.image_sizes] + ).to(images.tensor.device) + assert isinstance(im_info, torch.Tensor) + + rpn_rois_list = [] + rpn_roi_probs_list = [] + for scores, bbox_deltas, cell_anchors_tensor, feat_stride in zip( + objectness_logits_pred, + anchor_deltas_pred, + iter(self.anchor_generator.cell_anchors), + self.anchor_generator.strides, + ): + scores = scores.detach() + bbox_deltas = bbox_deltas.detach() + + rpn_rois, rpn_roi_probs = torch.ops._caffe2.GenerateProposals( + scores, + bbox_deltas, + im_info, + cell_anchors_tensor, + spatial_scale=1.0 / feat_stride, + pre_nms_topN=self.pre_nms_topk[self.training], + post_nms_topN=self.post_nms_topk[self.training], + nms_thresh=self.nms_thresh, + min_size=self.min_box_side_len, + # correct_transform_coords=True, # deprecated argument + angle_bound_on=True, # Default + angle_bound_lo=-180, + angle_bound_hi=180, + clip_angle_thresh=1.0, # Default + legacy_plus_one=False, + ) + rpn_rois_list.append(rpn_rois) + rpn_roi_probs_list.append(rpn_roi_probs) + + # For FPN in D2, in RPN all proposals from different levels are concated + # together, ranked and picked by top post_nms_topk. Then in ROIPooler + # it calculates level_assignments and calls the RoIAlign from + # the corresponding level. + + if len(objectness_logits_pred) == 1: + rpn_rois = rpn_rois_list[0] + rpn_roi_probs = rpn_roi_probs_list[0] + else: + assert len(rpn_rois_list) == len(rpn_roi_probs_list) + rpn_post_nms_topN = self.post_nms_topk[self.training] + + device = rpn_rois_list[0].device + input_list = [to_device(x, "cpu") for x in (rpn_rois_list + rpn_roi_probs_list)] + + # TODO remove this after confirming rpn_max_level/rpn_min_level + # is not needed in CollectRpnProposals. + feature_strides = list(self.anchor_generator.strides) + rpn_min_level = int(math.log2(feature_strides[0])) + rpn_max_level = int(math.log2(feature_strides[-1])) + assert (rpn_max_level - rpn_min_level + 1) == len( + rpn_rois_list + ), "CollectRpnProposals requires continuous levels" + + rpn_rois = torch.ops._caffe2.CollectRpnProposals( + input_list, + # NOTE: in current implementation, rpn_max_level and rpn_min_level + # are not needed, only the subtraction of two matters and it + # can be infer from the number of inputs. Keep them now for + # consistency. + rpn_max_level=2 + len(rpn_rois_list) - 1, + rpn_min_level=2, + rpn_post_nms_topN=rpn_post_nms_topN, + ) + rpn_rois = to_device(rpn_rois, device) + rpn_roi_probs = [] + + proposals = self.c2_postprocess(im_info, rpn_rois, rpn_roi_probs, self.tensor_mode) + return proposals, {} + + @staticmethod + def c2_postprocess(im_info, rpn_rois, rpn_roi_probs, tensor_mode): + proposals = InstancesList( + im_info=im_info, + indices=rpn_rois[:, 0], + extra_fields={ + "proposal_boxes": Caffe2Boxes(rpn_rois), + "objectness_logits": (torch.Tensor, rpn_roi_probs), + }, + ) + if not tensor_mode: + proposals = InstancesList.to_d2_instances_list(proposals) + else: + proposals = [proposals] + return proposals + + +class Caffe2ROIPooler(Caffe2Compatible, poolers.ROIPooler): + @staticmethod + def c2_preprocess(box_lists): + assert all(isinstance(x, Boxes) for x in box_lists) + if all(isinstance(x, Caffe2Boxes) for x in box_lists): + # input is pure-tensor based + assert len(box_lists) == 1 + pooler_fmt_boxes = box_lists[0].tensor + else: + pooler_fmt_boxes = poolers.convert_boxes_to_pooler_format(box_lists) + return pooler_fmt_boxes + + def forward(self, x, box_lists): + assert not self.training + + pooler_fmt_boxes = self.c2_preprocess(box_lists) + num_level_assignments = len(self.level_poolers) + + if num_level_assignments == 1: + if isinstance(self.level_poolers[0], ROIAlignRotated): + c2_roi_align = torch.ops._caffe2.RoIAlignRotated + aligned = True + else: + c2_roi_align = torch.ops._caffe2.RoIAlign + aligned = self.level_poolers[0].aligned + + out = c2_roi_align( + x[0], + pooler_fmt_boxes, + order="NCHW", + spatial_scale=float(self.level_poolers[0].spatial_scale), + pooled_h=int(self.output_size[0]), + pooled_w=int(self.output_size[1]), + sampling_ratio=int(self.level_poolers[0].sampling_ratio), + aligned=aligned, + ) + return out + + device = pooler_fmt_boxes.device + assert ( + self.max_level - self.min_level + 1 == 4 + ), "Currently DistributeFpnProposals only support 4 levels" + fpn_outputs = torch.ops._caffe2.DistributeFpnProposals( + to_device(pooler_fmt_boxes, "cpu"), + roi_canonical_scale=self.canonical_box_size, + roi_canonical_level=self.canonical_level, + roi_max_level=self.max_level, + roi_min_level=self.min_level, + legacy_plus_one=False, + ) + fpn_outputs = [to_device(x, device) for x in fpn_outputs] + + rois_fpn_list = fpn_outputs[:-1] + rois_idx_restore_int32 = fpn_outputs[-1] + + roi_feat_fpn_list = [] + for roi_fpn, x_level, pooler in zip(rois_fpn_list, x, self.level_poolers): + if isinstance(pooler, ROIAlignRotated): + c2_roi_align = torch.ops._caffe2.RoIAlignRotated + aligned = True + else: + c2_roi_align = torch.ops._caffe2.RoIAlign + aligned = bool(pooler.aligned) + + roi_feat_fpn = c2_roi_align( + x_level, + roi_fpn, + order="NCHW", + spatial_scale=float(pooler.spatial_scale), + pooled_h=int(self.output_size[0]), + pooled_w=int(self.output_size[1]), + sampling_ratio=int(pooler.sampling_ratio), + aligned=aligned, + ) + roi_feat_fpn_list.append(roi_feat_fpn) + + roi_feat_shuffled = cat(roi_feat_fpn_list, dim=0) + roi_feat = torch.ops._caffe2.BatchPermutation(roi_feat_shuffled, rois_idx_restore_int32) + return roi_feat + + +class Caffe2FastRCNNOutputsInference: + def __init__(self, tensor_mode): + self.tensor_mode = tensor_mode # whether the output is caffe2 tensor mode + + def __call__(self, box_predictor, predictions, proposals): + """ equivalent to FastRCNNOutputLayers.inference """ + score_thresh = box_predictor.test_score_thresh + nms_thresh = box_predictor.test_nms_thresh + topk_per_image = box_predictor.test_topk_per_image + is_rotated = len(box_predictor.box2box_transform.weights) == 5 + + if is_rotated: + box_dim = 5 + assert box_predictor.box2box_transform.weights[4] == 1, ( + "The weights for Rotated BBoxTransform in C2 have only 4 dimensions," + + " thus enforcing the angle weight to be 1 for now" + ) + box2box_transform_weights = box_predictor.box2box_transform.weights[:4] + else: + box_dim = 4 + box2box_transform_weights = box_predictor.box2box_transform.weights + + class_logits, box_regression = predictions + class_prob = F.softmax(class_logits, -1) + + assert box_regression.shape[1] % box_dim == 0 + cls_agnostic_bbox_reg = box_regression.shape[1] // box_dim == 1 + + input_tensor_mode = proposals[0].proposal_boxes.tensor.shape[1] == box_dim + 1 + + rois = type(proposals[0].proposal_boxes).cat([p.proposal_boxes for p in proposals]) + device, dtype = rois.tensor.device, rois.tensor.dtype + if input_tensor_mode: + im_info = proposals[0].image_size + rois = rois.tensor + else: + im_info = torch.Tensor( + [[sz[0], sz[1], 1.0] for sz in [x.image_size for x in proposals]] + ) + batch_ids = cat( + [ + torch.full((b, 1), i, dtype=dtype, device=device) + for i, b in enumerate(len(p) for p in proposals) + ], + dim=0, + ) + rois = torch.cat([batch_ids, rois.tensor], dim=1) + + roi_pred_bbox, roi_batch_splits = torch.ops._caffe2.BBoxTransform( + to_device(rois, "cpu"), + to_device(box_regression, "cpu"), + to_device(im_info, "cpu"), + weights=box2box_transform_weights, + apply_scale=True, + rotated=is_rotated, + angle_bound_on=True, + angle_bound_lo=-180, + angle_bound_hi=180, + clip_angle_thresh=1.0, + legacy_plus_one=False, + ) + roi_pred_bbox = to_device(roi_pred_bbox, device) + roi_batch_splits = to_device(roi_batch_splits, device) + + nms_outputs = torch.ops._caffe2.BoxWithNMSLimit( + to_device(class_prob, "cpu"), + to_device(roi_pred_bbox, "cpu"), + to_device(roi_batch_splits, "cpu"), + score_thresh=float(score_thresh), + nms=float(nms_thresh), + detections_per_im=int(topk_per_image), + soft_nms_enabled=False, + soft_nms_method="linear", + soft_nms_sigma=0.5, + soft_nms_min_score_thres=0.001, + rotated=is_rotated, + cls_agnostic_bbox_reg=cls_agnostic_bbox_reg, + input_boxes_include_bg_cls=False, + output_classes_include_bg_cls=False, + legacy_plus_one=False, + ) + roi_score_nms = to_device(nms_outputs[0], device) + roi_bbox_nms = to_device(nms_outputs[1], device) + roi_class_nms = to_device(nms_outputs[2], device) + roi_batch_splits_nms = to_device(nms_outputs[3], device) + roi_keeps_nms = to_device(nms_outputs[4], device) + roi_keeps_size_nms = to_device(nms_outputs[5], device) + if not self.tensor_mode: + roi_class_nms = roi_class_nms.to(torch.int64) + + roi_batch_ids = cat( + [ + torch.full((b, 1), i, dtype=dtype, device=device) + for i, b in enumerate(int(x.item()) for x in roi_batch_splits_nms) + ], + dim=0, + ) + + roi_class_nms = alias(roi_class_nms, "class_nms") + roi_score_nms = alias(roi_score_nms, "score_nms") + roi_bbox_nms = alias(roi_bbox_nms, "bbox_nms") + roi_batch_splits_nms = alias(roi_batch_splits_nms, "batch_splits_nms") + roi_keeps_nms = alias(roi_keeps_nms, "keeps_nms") + roi_keeps_size_nms = alias(roi_keeps_size_nms, "keeps_size_nms") + + results = InstancesList( + im_info=im_info, + indices=roi_batch_ids[:, 0], + extra_fields={ + "pred_boxes": Caffe2Boxes(roi_bbox_nms), + "scores": roi_score_nms, + "pred_classes": roi_class_nms, + }, + ) + + if not self.tensor_mode: + results = InstancesList.to_d2_instances_list(results) + batch_splits = roi_batch_splits_nms.int().tolist() + kept_indices = list(roi_keeps_nms.to(torch.int64).split(batch_splits)) + else: + results = [results] + kept_indices = [roi_keeps_nms] + + return results, kept_indices + + +class Caffe2MaskRCNNInference: + def __call__(self, pred_mask_logits, pred_instances): + """ equivalent to mask_head.mask_rcnn_inference """ + if all(isinstance(x, InstancesList) for x in pred_instances): + assert len(pred_instances) == 1 + mask_probs_pred = pred_mask_logits.sigmoid() + mask_probs_pred = alias(mask_probs_pred, "mask_fcn_probs") + pred_instances[0].pred_masks = mask_probs_pred + else: + mask_rcnn_inference(pred_mask_logits, pred_instances) + + +class Caffe2KeypointRCNNInference: + def __init__(self, use_heatmap_max_keypoint): + self.use_heatmap_max_keypoint = use_heatmap_max_keypoint + + def __call__(self, pred_keypoint_logits, pred_instances): + # just return the keypoint heatmap for now, + # there will be option to call HeatmapMaxKeypointOp + output = alias(pred_keypoint_logits, "kps_score") + if all(isinstance(x, InstancesList) for x in pred_instances): + assert len(pred_instances) == 1 + if self.use_heatmap_max_keypoint: + device = output.device + output = torch.ops._caffe2.HeatmapMaxKeypoint( + to_device(output, "cpu"), + pred_instances[0].pred_boxes.tensor, + should_output_softmax=True, # worth make it configerable? + ) + output = to_device(output, device) + output = alias(output, "keypoints_out") + pred_instances[0].pred_keypoints = output + return pred_keypoint_logits diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_export.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_export.py new file mode 100644 index 0000000..ccac809 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_export.py @@ -0,0 +1,204 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import copy +import io +import logging +import numpy as np +from typing import List +import onnx +import torch +from caffe2.proto import caffe2_pb2 +from caffe2.python import core +from caffe2.python.onnx.backend import Caffe2Backend +from tabulate import tabulate +from termcolor import colored +from torch.onnx import OperatorExportTypes + +from .shared import ( + ScopedWS, + construct_init_net_from_params, + fuse_alias_placeholder, + fuse_copy_between_cpu_and_gpu, + get_params_from_init_net, + group_norm_replace_aten_with_caffe2, + infer_device_type, + remove_dead_end_ops, + remove_reshape_for_fc, + save_graph, +) + +logger = logging.getLogger(__name__) + + +def export_onnx_model(model, inputs): + """ + Trace and export a model to onnx format. + + Args: + model (nn.Module): + inputs (tuple[args]): the model will be called by `model(*inputs)` + + Returns: + an onnx model + """ + assert isinstance(model, torch.nn.Module) + + # make sure all modules are in eval mode, onnx may change the training state + # of the module if the states are not consistent + def _check_eval(module): + assert not module.training + + model.apply(_check_eval) + + # Export the model to ONNX + with torch.no_grad(): + with io.BytesIO() as f: + torch.onnx.export( + model, + inputs, + f, + operator_export_type=OperatorExportTypes.ONNX_ATEN_FALLBACK, + # verbose=True, # NOTE: uncomment this for debugging + # export_params=True, + ) + onnx_model = onnx.load_from_string(f.getvalue()) + + # Apply ONNX's Optimization + all_passes = onnx.optimizer.get_available_passes() + passes = ["fuse_bn_into_conv"] + assert all(p in all_passes for p in passes) + onnx_model = onnx.optimizer.optimize(onnx_model, passes) + return onnx_model + + +def _op_stats(net_def): + type_count = {} + for t in [op.type for op in net_def.op]: + type_count[t] = type_count.get(t, 0) + 1 + type_count_list = sorted(type_count.items(), key=lambda kv: kv[0]) # alphabet + type_count_list = sorted(type_count_list, key=lambda kv: -kv[1]) # count + return "\n".join("{:>4}x {}".format(count, name) for name, count in type_count_list) + + +def _assign_device_option( + predict_net: caffe2_pb2.NetDef, init_net: caffe2_pb2.NetDef, tensor_inputs: List[torch.Tensor] +): + """ + ONNX exported network doesn't have concept of device, assign necessary + device option for each op in order to make it runable on GPU runtime. + """ + + def _get_device_type(torch_tensor): + assert torch_tensor.device.type in ["cpu", "cuda"] + assert torch_tensor.device.index == 0 + return torch_tensor.device.type + + def _assign_op_device_option(net_proto, net_ssa, blob_device_types): + for op, ssa_i in zip(net_proto.op, net_ssa): + if op.type in ["CopyCPUToGPU", "CopyGPUToCPU"]: + op.device_option.CopyFrom(core.DeviceOption(caffe2_pb2.CUDA, 0)) + else: + devices = [blob_device_types[b] for b in ssa_i[0] + ssa_i[1]] + assert all(d == devices[0] for d in devices) + if devices[0] == "cuda": + op.device_option.CopyFrom(core.DeviceOption(caffe2_pb2.CUDA, 0)) + + # update ops in predict_net + predict_net_input_device_types = { + (name, 0): _get_device_type(tensor) + for name, tensor in zip(predict_net.external_input, tensor_inputs) + } + predict_net_device_types = infer_device_type( + predict_net, known_status=predict_net_input_device_types, device_name_style="pytorch" + ) + predict_net_ssa, _ = core.get_ssa(predict_net) + _assign_op_device_option(predict_net, predict_net_ssa, predict_net_device_types) + + # update ops in init_net + init_net_ssa, versions = core.get_ssa(init_net) + init_net_output_device_types = { + (name, versions[name]): predict_net_device_types[(name, 0)] + for name in init_net.external_output + } + init_net_device_types = infer_device_type( + init_net, known_status=init_net_output_device_types, device_name_style="pytorch" + ) + _assign_op_device_option(init_net, init_net_ssa, init_net_device_types) + + +def export_caffe2_detection_model(model: torch.nn.Module, tensor_inputs: List[torch.Tensor]): + """ + Export a caffe2-compatible Detectron2 model to caffe2 format via ONNX. + + Arg: + model: a caffe2-compatible version of detectron2 model, defined in caffe2_modeling.py + tensor_inputs: a list of tensors that caffe2 model takes as input. + """ + model = copy.deepcopy(model) + assert isinstance(model, torch.nn.Module) + assert hasattr(model, "encode_additional_info") + + # Export via ONNX + logger.info("Exporting a {} model via ONNX ...".format(type(model).__name__)) + onnx_model = export_onnx_model(model, (tensor_inputs,)) + # Convert ONNX model to Caffe2 protobuf + init_net, predict_net = Caffe2Backend.onnx_graph_to_caffe2_net(onnx_model) + ops_table = [[op.type, op.input, op.output] for op in predict_net.op] + table = tabulate(ops_table, headers=["type", "input", "output"], tablefmt="pipe") + logger.info( + "ONNX export Done. Exported predict_net (before optimizations):\n" + colored(table, "cyan") + ) + + # Apply protobuf optimization + fuse_alias_placeholder(predict_net, init_net) + if any(t.device.type != "cpu" for t in tensor_inputs): + fuse_copy_between_cpu_and_gpu(predict_net) + remove_dead_end_ops(init_net) + _assign_device_option(predict_net, init_net, tensor_inputs) + params, device_options = get_params_from_init_net(init_net) + predict_net, params = remove_reshape_for_fc(predict_net, params) + init_net = construct_init_net_from_params(params, device_options) + group_norm_replace_aten_with_caffe2(predict_net) + + # Record necessary information for running the pb model in Detectron2 system. + model.encode_additional_info(predict_net, init_net) + + logger.info("Operators used in predict_net: \n{}".format(_op_stats(predict_net))) + logger.info("Operators used in init_net: \n{}".format(_op_stats(init_net))) + + return predict_net, init_net + + +def run_and_save_graph(predict_net, init_net, tensor_inputs, graph_save_path): + """ + Run the caffe2 model on given inputs, recording the shape and draw the graph. + + predict_net/init_net: caffe2 model. + tensor_inputs: a list of tensors that caffe2 model takes as input. + graph_save_path: path for saving graph of exported model. + """ + + logger.info("Saving graph of ONNX exported model to {} ...".format(graph_save_path)) + save_graph(predict_net, graph_save_path, op_only=False) + + # Run the exported Caffe2 net + logger.info("Running ONNX exported model ...") + with ScopedWS("__ws_tmp__", True) as ws: + ws.RunNetOnce(init_net) + initialized_blobs = set(ws.Blobs()) + uninitialized = [inp for inp in predict_net.external_input if inp not in initialized_blobs] + for name, blob in zip(uninitialized, tensor_inputs): + ws.FeedBlob(name, blob) + + try: + ws.RunNetOnce(predict_net) + except RuntimeError as e: + logger.warning("Encountered RuntimeError: \n{}".format(str(e))) + + ws_blobs = {b: ws.FetchBlob(b) for b in ws.Blobs()} + blob_sizes = {b: ws_blobs[b].shape for b in ws_blobs if isinstance(ws_blobs[b], np.ndarray)} + + logger.info("Saving graph with blob shapes to {} ...".format(graph_save_path)) + save_graph(predict_net, graph_save_path, op_only=False, blob_sizes=blob_sizes) + + return ws_blobs diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_inference.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_inference.py new file mode 100644 index 0000000..92718d0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_inference.py @@ -0,0 +1,136 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import collections +import logging +import numpy as np +import torch +from caffe2.proto import caffe2_pb2 +from caffe2.python import core + +from .caffe2_modeling import META_ARCH_CAFFE2_EXPORT_TYPE_MAP, convert_batched_inputs_to_c2_format +from .shared import ScopedWS, get_pb_arg_vali, get_pb_arg_vals, infer_device_type + +logger = logging.getLogger(__name__) + + +class ProtobufModel(torch.nn.Module): + """ + A class works just like nn.Module in terms of inference, but running + caffe2 model under the hood. Input/Output are Dict[str, tensor] whose keys + are in external_input/output. + """ + + def __init__(self, predict_net, init_net): + logger.info("Initializing ProtobufModel ...") + super().__init__() + assert isinstance(predict_net, caffe2_pb2.NetDef) + assert isinstance(init_net, caffe2_pb2.NetDef) + self.ws_name = "__ws_tmp__" + self.net = core.Net(predict_net) + + with ScopedWS(self.ws_name, is_reset=True, is_cleanup=False) as ws: + ws.RunNetOnce(init_net) + for blob in self.net.Proto().external_input: + if blob not in ws.Blobs(): + ws.CreateBlob(blob) + ws.CreateNet(self.net) + + self._error_msgs = set() + + def forward(self, inputs_dict): + assert all(inp in self.net.Proto().external_input for inp in inputs_dict) + with ScopedWS(self.ws_name, is_reset=False, is_cleanup=False) as ws: + for b, tensor in inputs_dict.items(): + ws.FeedBlob(b, tensor) + try: + ws.RunNet(self.net.Proto().name) + except RuntimeError as e: + if not str(e) in self._error_msgs: + self._error_msgs.add(str(e)) + logger.warning("Encountered new RuntimeError: \n{}".format(str(e))) + logger.warning("Catch the error and use partial results.") + + outputs_dict = collections.OrderedDict( + [(b, ws.FetchBlob(b)) for b in self.net.Proto().external_output] + ) + # Remove outputs of current run, this is necessary in order to + # prevent fetching the result from previous run if the model fails + # in the middle. + for b in self.net.Proto().external_output: + # Needs to create uninitialized blob to make the net runable. + # This is "equivalent" to: ws.RemoveBlob(b) then ws.CreateBlob(b), + # but there'no such API. + ws.FeedBlob(b, "{}, a C++ native class of type nullptr (uninitialized).".format(b)) + + return outputs_dict + + +class ProtobufDetectionModel(torch.nn.Module): + """ + A class works just like a pytorch meta arch in terms of inference, but running + caffe2 model under the hood. + """ + + def __init__(self, predict_net, init_net, *, convert_outputs=None): + """ + Args: + predict_net, init_net (core.Net): caffe2 nets + convert_outptus (callable): a function that converts caffe2 + outputs to the same format of the original pytorch model. + By default, use the one defined in the caffe2 meta_arch. + """ + super().__init__() + self.protobuf_model = ProtobufModel(predict_net, init_net) + self.size_divisibility = get_pb_arg_vali(predict_net, "size_divisibility", 0) + self.device = get_pb_arg_vals(predict_net, "device", b"cpu").decode("ascii") + + if convert_outputs is None: + meta_arch = get_pb_arg_vals(predict_net, "meta_architecture", b"GeneralizedRCNN") + meta_arch = META_ARCH_CAFFE2_EXPORT_TYPE_MAP[meta_arch.decode("ascii")] + self._convert_outputs = meta_arch.get_outputs_converter(predict_net, init_net) + else: + self._convert_outputs = convert_outputs + + def _infer_output_devices(self, inputs_dict): + def _get_device_type(torch_tensor): + assert torch_tensor.device.type in ["cpu", "cuda"] + assert torch_tensor.device.index == 0 + return torch_tensor.device.type + + predict_net = self.protobuf_model.net.Proto() + input_device_types = { + (name, 0): _get_device_type(tensor) for name, tensor in inputs_dict.items() + } + device_type_map = infer_device_type( + predict_net, known_status=input_device_types, device_name_style="pytorch" + ) + ssa, versions = core.get_ssa(predict_net) + versioned_outputs = [(name, versions[name]) for name in predict_net.external_output] + output_devices = [device_type_map[outp] for outp in versioned_outputs] + return output_devices + + def _convert_inputs(self, batched_inputs): + # currently all models convert inputs in the same way + data, im_info = convert_batched_inputs_to_c2_format( + batched_inputs, self.size_divisibility, self.device + ) + return {"data": data, "im_info": im_info} + + def forward(self, batched_inputs): + c2_inputs = self._convert_inputs(batched_inputs) + c2_results = self.protobuf_model(c2_inputs) + + if any(t.device.type != "cpu" for _, t in c2_inputs.items()): + output_devices = self._infer_output_devices(c2_inputs) + else: + output_devices = ["cpu" for _ in self.protobuf_model.net.Proto().external_output] + + def _cast_caffe2_blob_to_torch_tensor(blob, device): + return torch.Tensor(blob).to(device) if isinstance(blob, np.ndarray) else None + + c2_results = { + name: _cast_caffe2_blob_to_torch_tensor(c2_results[name], device) + for name, device in zip(self.protobuf_model.net.Proto().external_output, output_devices) + } + + return self._convert_outputs(batched_inputs, c2_inputs, c2_results) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_modeling.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_modeling.py new file mode 100644 index 0000000..1732b32 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/caffe2_modeling.py @@ -0,0 +1,493 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import functools +import io +import struct +import types +import torch + +from detectron2.modeling import meta_arch +from detectron2.modeling.box_regression import Box2BoxTransform +from detectron2.modeling.meta_arch.panoptic_fpn import combine_semantic_and_instance_outputs +from detectron2.modeling.postprocessing import detector_postprocess, sem_seg_postprocess +from detectron2.modeling.roi_heads import keypoint_head +from detectron2.structures import Boxes, ImageList, Instances, RotatedBoxes + +from .c10 import Caffe2Compatible +from .patcher import ROIHeadsPatcher, patch_generalized_rcnn +from .shared import ( + alias, + check_set_pb_arg, + get_pb_arg_floats, + get_pb_arg_valf, + get_pb_arg_vali, + get_pb_arg_vals, + mock_torch_nn_functional_interpolate, +) + + +def assemble_rcnn_outputs_by_name(image_sizes, tensor_outputs, force_mask_on=False): + """ + A function to assemble caffe2 model's outputs (i.e. Dict[str, Tensor]) + to detectron2's format (i.e. list of Instances instance). + This only works when the model follows the Caffe2 detectron's naming convention. + + Args: + image_sizes (List[List[int, int]]): [H, W] of every image. + tensor_outputs (Dict[str, Tensor]): external_output to its tensor. + + force_mask_on (Bool): if true, the it make sure there'll be pred_masks even + if the mask is not found from tensor_outputs (usually due to model crash) + """ + + results = [Instances(image_size) for image_size in image_sizes] + + batch_splits = tensor_outputs.get("batch_splits", None) + if batch_splits: + raise NotImplementedError() + assert len(image_sizes) == 1 + result = results[0] + + bbox_nms = tensor_outputs["bbox_nms"] + score_nms = tensor_outputs["score_nms"] + class_nms = tensor_outputs["class_nms"] + # Detection will always success because Conv support 0-batch + assert bbox_nms is not None + assert score_nms is not None + assert class_nms is not None + if bbox_nms.shape[1] == 5: + result.pred_boxes = RotatedBoxes(bbox_nms) + else: + result.pred_boxes = Boxes(bbox_nms) + result.scores = score_nms + result.pred_classes = class_nms.to(torch.int64) + + mask_fcn_probs = tensor_outputs.get("mask_fcn_probs", None) + if mask_fcn_probs is not None: + # finish the mask pred + mask_probs_pred = mask_fcn_probs + num_masks = mask_probs_pred.shape[0] + class_pred = result.pred_classes + indices = torch.arange(num_masks, device=class_pred.device) + mask_probs_pred = mask_probs_pred[indices, class_pred][:, None] + result.pred_masks = mask_probs_pred + elif force_mask_on: + # NOTE: there's no way to know the height/width of mask here, it won't be + # used anyway when batch size is 0, so just set them to 0. + result.pred_masks = torch.zeros([0, 1, 0, 0], dtype=torch.uint8) + + keypoints_out = tensor_outputs.get("keypoints_out", None) + kps_score = tensor_outputs.get("kps_score", None) + if keypoints_out is not None: + # keypoints_out: [N, 4, #kypoints], where 4 is in order of (x, y, score, prob) + keypoints_tensor = keypoints_out + # NOTE: it's possible that prob is not calculated if "should_output_softmax" + # is set to False in HeatmapMaxKeypoint, so just using raw score, seems + # it doesn't affect mAP. TODO: check more carefully. + keypoint_xyp = keypoints_tensor.transpose(1, 2)[:, :, [0, 1, 2]] + result.pred_keypoints = keypoint_xyp + elif kps_score is not None: + # keypoint heatmap to sparse data structure + pred_keypoint_logits = kps_score + keypoint_head.keypoint_rcnn_inference(pred_keypoint_logits, [result]) + + return results + + +def _cast_to_f32(f64): + return struct.unpack("f", struct.pack("f", f64))[0] + + +def set_caffe2_compatible_tensor_mode(model, enable=True): + def _fn(m): + if isinstance(m, Caffe2Compatible): + m.tensor_mode = enable + + model.apply(_fn) + + +def convert_batched_inputs_to_c2_format(batched_inputs, size_divisibility, device): + """ + See get_caffe2_inputs() below. + """ + assert all(isinstance(x, dict) for x in batched_inputs) + assert all(x["image"].dim() == 3 for x in batched_inputs) + + images = [x["image"] for x in batched_inputs] + images = ImageList.from_tensors(images, size_divisibility) + + im_info = [] + for input_per_image, image_size in zip(batched_inputs, images.image_sizes): + target_height = input_per_image.get("height", image_size[0]) + target_width = input_per_image.get("width", image_size[1]) # noqa + # NOTE: The scale inside im_info is kept as convention and for providing + # post-processing information if further processing is needed. For + # current Caffe2 model definitions that don't include post-processing inside + # the model, this number is not used. + # NOTE: There can be a slight difference between width and height + # scales, using a single number can results in numerical difference + # compared with D2's post-processing. + scale = target_height / image_size[0] + im_info.append([image_size[0], image_size[1], scale]) + im_info = torch.Tensor(im_info) + + return images.tensor.to(device), im_info.to(device) + + +class Caffe2MetaArch(Caffe2Compatible, torch.nn.Module): + """ + Base class for caffe2-compatible implementation of a meta architecture. + The forward is traceable and its traced graph can be converted to caffe2 + graph through ONNX. + """ + + def __init__(self, cfg, torch_model): + """ + Args: + cfg (CfgNode): + torch_model (nn.Module): the detectron2 model (meta_arch) to be + converted. + """ + super().__init__() + self._wrapped_model = torch_model + self.eval() + set_caffe2_compatible_tensor_mode(self, True) + + def get_caffe2_inputs(self, batched_inputs): + """ + Convert pytorch-style structured inputs to caffe2-style inputs that + are tuples of tensors. + + Args: + batched_inputs (list[dict]): inputs to a detectron2 model + in its standard format. Each dict has "image" (CHW tensor), and optionally + "height" and "width". + + Returns: + tuple[Tensor]: + tuple of tensors that will be the inputs to the + :meth:`forward` method. For existing models, the first + is an NCHW tensor (padded and batched); the second is + a im_info Nx3 tensor, where the rows are + (height, width, unused legacy parameter) + """ + return convert_batched_inputs_to_c2_format( + batched_inputs, + self._wrapped_model.backbone.size_divisibility, + self._wrapped_model.device, + ) + + def encode_additional_info(self, predict_net, init_net): + """ + Save extra metadata that will be used by inference in the output protobuf. + """ + pass + + def forward(self, inputs): + """ + Run the forward in caffe2-style. It has to use caffe2-compatible ops + and the method will be used for tracing. + + Args: + inputs (tuple[Tensor]): inputs defined by :meth:`get_caffe2_input`. + They will be the inputs of the converted caffe2 graph. + + Returns: + tuple[Tensor]: output tensors. They will be the outputs of the + converted caffe2 graph. + """ + raise NotImplementedError + + def _caffe2_preprocess_image(self, inputs): + """ + Caffe2 implementation of preprocess_image, which is called inside each MetaArch's forward. + It normalizes the input images, and the final caffe2 graph assumes the + inputs have been batched already. + """ + data, im_info = inputs + data = alias(data, "data") + im_info = alias(im_info, "im_info") + mean, std = self._wrapped_model.pixel_mean, self._wrapped_model.pixel_std + normalized_data = (data - mean) / std + normalized_data = alias(normalized_data, "normalized_data") + + # Pack (data, im_info) into ImageList which is recognized by self.inference. + images = ImageList(tensor=normalized_data, image_sizes=im_info) + return images + + @staticmethod + def get_outputs_converter(predict_net, init_net): + """ + Creates a function that converts outputs of the caffe2 model to + detectron2's standard format. + The function uses information in `predict_net` and `init_net` that are + available at inferene time. Therefore the function logic can be used in inference. + + The returned function has the following signature: + + def convert(batched_inputs, c2_inputs, c2_results) -> detectron2_outputs + + Where + + * batched_inputs (list[dict]): the original input format of the meta arch + * c2_inputs (dict[str, Tensor]): the caffe2 inputs. + * c2_results (dict[str, Tensor]): the caffe2 output format, + corresponding to the outputs of the :meth:`forward` function. + * detectron2_outputs: the original output format of the meta arch. + + This function can be used to compare the outputs of the original meta arch and + the converted caffe2 graph. + + Returns: + callable: a callable of the above signature. + """ + raise NotImplementedError + + +class Caffe2GeneralizedRCNN(Caffe2MetaArch): + def __init__(self, cfg, torch_model): + assert isinstance(torch_model, meta_arch.GeneralizedRCNN) + torch_model = patch_generalized_rcnn(torch_model) + super().__init__(cfg, torch_model) + + self.roi_heads_patcher = ROIHeadsPatcher(cfg, self._wrapped_model.roi_heads) + + def encode_additional_info(self, predict_net, init_net): + size_divisibility = self._wrapped_model.backbone.size_divisibility + check_set_pb_arg(predict_net, "size_divisibility", "i", size_divisibility) + check_set_pb_arg( + predict_net, "device", "s", str.encode(str(self._wrapped_model.device), "ascii") + ) + check_set_pb_arg(predict_net, "meta_architecture", "s", b"GeneralizedRCNN") + + @mock_torch_nn_functional_interpolate() + def forward(self, inputs): + if not self.tensor_mode: + return self._wrapped_model.inference(inputs) + images = self._caffe2_preprocess_image(inputs) + features = self._wrapped_model.backbone(images.tensor) + proposals, _ = self._wrapped_model.proposal_generator(images, features) + with self.roi_heads_patcher.mock_roi_heads(): + detector_results, _ = self._wrapped_model.roi_heads(images, features, proposals) + return tuple(detector_results[0].flatten()) + + @staticmethod + def get_outputs_converter(predict_net, init_net): + def f(batched_inputs, c2_inputs, c2_results): + image_sizes = [[int(im[0]), int(im[1])] for im in c2_inputs["im_info"]] + results = assemble_rcnn_outputs_by_name(image_sizes, c2_results) + return meta_arch.GeneralizedRCNN._postprocess(results, batched_inputs, image_sizes) + + return f + + +class Caffe2PanopticFPN(Caffe2MetaArch): + def __init__(self, cfg, torch_model): + assert isinstance(torch_model, meta_arch.PanopticFPN) + torch_model = patch_generalized_rcnn(torch_model) + super().__init__(cfg, torch_model) + + self.roi_heads_patcher = ROIHeadsPatcher(cfg, self._wrapped_model.roi_heads) + + @mock_torch_nn_functional_interpolate() + def forward(self, inputs): + assert self.tensor_mode + images = self._caffe2_preprocess_image(inputs) + features = self._wrapped_model.backbone(images.tensor) + + sem_seg_results, _ = self._wrapped_model.sem_seg_head(features) + sem_seg_results = alias(sem_seg_results, "sem_seg") + + proposals, _ = self._wrapped_model.proposal_generator(images, features) + + with self.roi_heads_patcher.mock_roi_heads(self.tensor_mode): + detector_results, _ = self._wrapped_model.roi_heads(images, features, proposals) + + return tuple(detector_results[0].flatten()) + (sem_seg_results,) + + def encode_additional_info(self, predict_net, init_net): + size_divisibility = self._wrapped_model.backbone.size_divisibility + check_set_pb_arg(predict_net, "size_divisibility", "i", size_divisibility) + check_set_pb_arg( + predict_net, "device", "s", str.encode(str(self._wrapped_model.device), "ascii") + ) + check_set_pb_arg(predict_net, "meta_architecture", "s", b"PanopticFPN") + + # Inference parameters: + check_set_pb_arg(predict_net, "combine_on", "i", self._wrapped_model.combine_on) + check_set_pb_arg( + predict_net, + "combine_overlap_threshold", + "f", + _cast_to_f32(self._wrapped_model.combine_overlap_threshold), + ) + check_set_pb_arg( + predict_net, + "combine_stuff_area_limit", + "i", + self._wrapped_model.combine_stuff_area_limit, + ) + check_set_pb_arg( + predict_net, + "combine_instances_confidence_threshold", + "f", + _cast_to_f32(self._wrapped_model.combine_instances_confidence_threshold), + ) + + @staticmethod + def get_outputs_converter(predict_net, init_net): + combine_on = get_pb_arg_vali(predict_net, "combine_on", None) + combine_overlap_threshold = get_pb_arg_valf(predict_net, "combine_overlap_threshold", None) + combine_stuff_area_limit = get_pb_arg_vali(predict_net, "combine_stuff_area_limit", None) + combine_instances_confidence_threshold = get_pb_arg_valf( + predict_net, "combine_instances_confidence_threshold", None + ) + + def f(batched_inputs, c2_inputs, c2_results): + image_sizes = [[int(im[0]), int(im[1])] for im in c2_inputs["im_info"]] + detector_results = assemble_rcnn_outputs_by_name( + image_sizes, c2_results, force_mask_on=True + ) + sem_seg_results = c2_results["sem_seg"] + + # copied from meta_arch/panoptic_fpn.py ... + processed_results = [] + for sem_seg_result, detector_result, input_per_image, image_size in zip( + sem_seg_results, detector_results, batched_inputs, image_sizes + ): + height = input_per_image.get("height", image_size[0]) + width = input_per_image.get("width", image_size[1]) + sem_seg_r = sem_seg_postprocess(sem_seg_result, image_size, height, width) + detector_r = detector_postprocess(detector_result, height, width) + + processed_results.append({"sem_seg": sem_seg_r, "instances": detector_r}) + + if combine_on: + panoptic_r = combine_semantic_and_instance_outputs( + detector_r, + sem_seg_r.argmax(dim=0), + combine_overlap_threshold, + combine_stuff_area_limit, + combine_instances_confidence_threshold, + ) + processed_results[-1]["panoptic_seg"] = panoptic_r + return processed_results + + return f + + +class Caffe2RetinaNet(Caffe2MetaArch): + def __init__(self, cfg, torch_model): + assert isinstance(torch_model, meta_arch.RetinaNet) + super().__init__(cfg, torch_model) + + @mock_torch_nn_functional_interpolate() + def forward(self, inputs): + assert self.tensor_mode + images = self._caffe2_preprocess_image(inputs) + + # explicitly return the images sizes to avoid removing "im_info" by ONNX + # since it's not used in the forward path + return_tensors = [images.image_sizes] + + features = self._wrapped_model.backbone(images.tensor) + features = [features[f] for f in self._wrapped_model.in_features] + for i, feature_i in enumerate(features): + features[i] = alias(feature_i, "feature_{}".format(i), is_backward=True) + return_tensors.append(features[i]) + + box_cls, box_delta = self._wrapped_model.head(features) + for i, (box_cls_i, box_delta_i) in enumerate(zip(box_cls, box_delta)): + return_tensors.append(alias(box_cls_i, "box_cls_{}".format(i))) + return_tensors.append(alias(box_delta_i, "box_delta_{}".format(i))) + + return tuple(return_tensors) + + def encode_additional_info(self, predict_net, init_net): + size_divisibility = self._wrapped_model.backbone.size_divisibility + check_set_pb_arg(predict_net, "size_divisibility", "i", size_divisibility) + check_set_pb_arg( + predict_net, "device", "s", str.encode(str(self._wrapped_model.device), "ascii") + ) + check_set_pb_arg(predict_net, "meta_architecture", "s", b"RetinaNet") + + # Inference parameters: + check_set_pb_arg( + predict_net, "score_threshold", "f", _cast_to_f32(self._wrapped_model.score_threshold) + ) + check_set_pb_arg(predict_net, "topk_candidates", "i", self._wrapped_model.topk_candidates) + check_set_pb_arg( + predict_net, "nms_threshold", "f", _cast_to_f32(self._wrapped_model.nms_threshold) + ) + check_set_pb_arg( + predict_net, + "max_detections_per_image", + "i", + self._wrapped_model.max_detections_per_image, + ) + + check_set_pb_arg( + predict_net, + "bbox_reg_weights", + "floats", + [_cast_to_f32(w) for w in self._wrapped_model.box2box_transform.weights], + ) + self._encode_anchor_generator_cfg(predict_net) + + def _encode_anchor_generator_cfg(self, predict_net): + # serialize anchor_generator for future use + serialized_anchor_generator = io.BytesIO() + torch.save(self._wrapped_model.anchor_generator, serialized_anchor_generator) + # Ideally we can put anchor generating inside the model, then we don't + # need to store this information. + bytes = serialized_anchor_generator.getvalue() + check_set_pb_arg(predict_net, "serialized_anchor_generator", "s", bytes) + + @staticmethod + def get_outputs_converter(predict_net, init_net): + self = types.SimpleNamespace() + serialized_anchor_generator = io.BytesIO( + get_pb_arg_vals(predict_net, "serialized_anchor_generator", None) + ) + self.anchor_generator = torch.load(serialized_anchor_generator) + bbox_reg_weights = get_pb_arg_floats(predict_net, "bbox_reg_weights", None) + self.box2box_transform = Box2BoxTransform(weights=tuple(bbox_reg_weights)) + self.score_threshold = get_pb_arg_valf(predict_net, "score_threshold", None) + self.topk_candidates = get_pb_arg_vali(predict_net, "topk_candidates", None) + self.nms_threshold = get_pb_arg_valf(predict_net, "nms_threshold", None) + self.max_detections_per_image = get_pb_arg_vali( + predict_net, "max_detections_per_image", None + ) + + # hack to reuse inference code from RetinaNet + self.inference = functools.partial(meta_arch.RetinaNet.inference, self) + self.inference_single_image = functools.partial( + meta_arch.RetinaNet.inference_single_image, self + ) + + def f(batched_inputs, c2_inputs, c2_results): + image_sizes = [[int(im[0]), int(im[1])] for im in c2_inputs["im_info"]] + + num_features = len([x for x in c2_results.keys() if x.startswith("box_cls_")]) + box_cls = [c2_results["box_cls_{}".format(i)] for i in range(num_features)] + box_delta = [c2_results["box_delta_{}".format(i)] for i in range(num_features)] + + # For each feature level, feature should have the same batch size and + # spatial dimension as the box_cls and box_delta. + dummy_features = [box_delta[i].clone()[:, 0:0, :, :] for i in range(num_features)] + anchors = self.anchor_generator(dummy_features) + + # self.num_classess can be inferred + self.num_classes = box_cls[0].shape[1] // (box_delta[0].shape[1] // 4) + + results = self.inference(box_cls, box_delta, anchors, image_sizes) + return meta_arch.GeneralizedRCNN._postprocess(results, batched_inputs, image_sizes) + + return f + + +META_ARCH_CAFFE2_EXPORT_TYPE_MAP = { + "GeneralizedRCNN": Caffe2GeneralizedRCNN, + "PanopticFPN": Caffe2PanopticFPN, + "RetinaNet": Caffe2RetinaNet, +} diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/patcher.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/patcher.py new file mode 100644 index 0000000..3f0b0fd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/patcher.py @@ -0,0 +1,153 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import contextlib +import mock +import torch + +from detectron2.modeling import poolers +from detectron2.modeling.proposal_generator import rpn +from detectron2.modeling.roi_heads import keypoint_head, mask_head +from detectron2.modeling.roi_heads.fast_rcnn import FastRCNNOutputLayers + +from .c10 import ( + Caffe2Compatible, + Caffe2FastRCNNOutputsInference, + Caffe2KeypointRCNNInference, + Caffe2MaskRCNNInference, + Caffe2ROIPooler, + Caffe2RPN, +) + + +class GenericMixin(object): + pass + + +class Caffe2CompatibleConverter(object): + """ + A GenericUpdater which implements the `create_from` interface, by modifying + module object and assign it with another class replaceCls. + """ + + def __init__(self, replaceCls): + self.replaceCls = replaceCls + + def create_from(self, module): + # update module's class to the new class + assert isinstance(module, torch.nn.Module) + if issubclass(self.replaceCls, GenericMixin): + # replaceCls should act as mixin, create a new class on-the-fly + new_class = type( + "{}MixedWith{}".format(self.replaceCls.__name__, module.__class__.__name__), + (self.replaceCls, module.__class__), + {}, # {"new_method": lambda self: ...}, + ) + module.__class__ = new_class + else: + # replaceCls is complete class, this allow arbitrary class swap + module.__class__ = self.replaceCls + + # initialize Caffe2Compatible + if isinstance(module, Caffe2Compatible): + module.tensor_mode = False + + return module + + +def patch(model, target, updater, *args, **kwargs): + """ + recursively (post-order) update all modules with the target type and its + subclasses, make a initialization/composition/inheritance/... via the + updater.create_from. + """ + for name, module in model.named_children(): + model._modules[name] = patch(module, target, updater, *args, **kwargs) + if isinstance(model, target): + return updater.create_from(model, *args, **kwargs) + return model + + +def patch_generalized_rcnn(model): + ccc = Caffe2CompatibleConverter + model = patch(model, rpn.RPN, ccc(Caffe2RPN)) + model = patch(model, poolers.ROIPooler, ccc(Caffe2ROIPooler)) + + return model + + +@contextlib.contextmanager +def mock_fastrcnn_outputs_inference( + tensor_mode, check=True, box_predictor_type=FastRCNNOutputLayers +): + with mock.patch.object( + box_predictor_type, + "inference", + autospec=True, + side_effect=Caffe2FastRCNNOutputsInference(tensor_mode), + ) as mocked_func: + yield + if check: + assert mocked_func.call_count > 0 + + +@contextlib.contextmanager +def mock_mask_rcnn_inference(tensor_mode, patched_module, check=True): + with mock.patch( + "{}.mask_rcnn_inference".format(patched_module), side_effect=Caffe2MaskRCNNInference() + ) as mocked_func: + yield + if check: + assert mocked_func.call_count > 0 + + +@contextlib.contextmanager +def mock_keypoint_rcnn_inference(tensor_mode, patched_module, use_heatmap_max_keypoint, check=True): + with mock.patch( + "{}.keypoint_rcnn_inference".format(patched_module), + side_effect=Caffe2KeypointRCNNInference(use_heatmap_max_keypoint), + ) as mocked_func: + yield + if check: + assert mocked_func.call_count > 0 + + +class ROIHeadsPatcher: + def __init__(self, cfg, heads): + self.heads = heads + + self.use_heatmap_max_keypoint = cfg.EXPORT_CAFFE2.USE_HEATMAP_MAX_KEYPOINT + + @contextlib.contextmanager + def mock_roi_heads(self, tensor_mode=True): + """ + Patching several inference functions inside ROIHeads and its subclasses + + Args: + tensor_mode (bool): whether the inputs/outputs are caffe2's tensor + format or not. Default to True. + """ + # NOTE: this requries the `keypoint_rcnn_inference` and `mask_rcnn_inference` + # are called inside the same file as BaseXxxHead due to using mock.patch. + kpt_heads_mod = keypoint_head.BaseKeypointRCNNHead.__module__ + mask_head_mod = mask_head.BaseMaskRCNNHead.__module__ + + mock_ctx_managers = [ + mock_fastrcnn_outputs_inference( + tensor_mode=tensor_mode, + check=True, + box_predictor_type=type(self.heads.box_predictor), + ) + ] + if getattr(self.heads, "keypoint_on", False): + mock_ctx_managers += [ + mock_keypoint_rcnn_inference( + tensor_mode, kpt_heads_mod, self.use_heatmap_max_keypoint + ) + ] + if getattr(self.heads, "mask_on", False): + mock_ctx_managers += [mock_mask_rcnn_inference(tensor_mode, mask_head_mod)] + + with contextlib.ExitStack() as stack: # python 3.3+ + for mgr in mock_ctx_managers: + stack.enter_context(mgr) + yield diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/shared.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/shared.py new file mode 100644 index 0000000..cb7ffeb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/export/shared.py @@ -0,0 +1,1034 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import collections +import contextlib +import copy +import functools +import logging +import mock +import numpy as np +import os +from typing import Any, Callable, Dict, List, Optional, Tuple, Union +import caffe2.python.utils as putils +import torch +import torch.nn.functional as F +from caffe2.proto import caffe2_pb2 +from caffe2.python import core, net_drawer, workspace +from torch.nn.functional import interpolate as interp + +logger = logging.getLogger(__name__) + + +# ==== torch/utils_toffee/cast.py ======================================= + + +def to_device(t, device_str): + """ + This function is a replacement of .to(another_device) such that it allows the + casting to be traced properly by explicitly calling the underlying copy ops. + It also avoids introducing unncessary op when casting to the same device. + """ + src = t.device + dst = torch.device(device_str) + + if src == dst: + return t + elif src.type == "cuda" and dst.type == "cpu": + return torch.ops._caffe2.CopyGPUToCPU(t) + elif src.type == "cpu" and dst.type == "cuda": + return torch.ops._caffe2.CopyCPUToGPU(t) + else: + raise RuntimeError("Can't cast tensor from device {} to device {}".format(src, dst)) + + +# ==== torch/utils_toffee/interpolate.py ======================================= + + +# Note: borrowed from vision/detection/fair/detectron/detectron/modeling/detector.py +def BilinearInterpolation(tensor_in, up_scale): + assert up_scale % 2 == 0, "Scale should be even" + + def upsample_filt(size): + factor = (size + 1) // 2 + if size % 2 == 1: + center = factor - 1 + else: + center = factor - 0.5 + + og = np.ogrid[:size, :size] + return (1 - abs(og[0] - center) / factor) * (1 - abs(og[1] - center) / factor) + + kernel_size = int(up_scale) * 2 + bil_filt = upsample_filt(kernel_size) + + dim = int(tensor_in.shape[1]) + kernel = np.zeros((dim, dim, kernel_size, kernel_size), dtype=np.float32) + kernel[range(dim), range(dim), :, :] = bil_filt + + tensor_out = F.conv_transpose2d( + tensor_in, + weight=to_device(torch.Tensor(kernel), tensor_in.device), + bias=None, + stride=int(up_scale), + padding=int(up_scale / 2), + ) + + return tensor_out + + +# NOTE: ONNX is incompatible with traced torch.nn.functional.interpolate if +# using dynamic `scale_factor` rather than static `size`. (T43166860) +# NOTE: Caffe2 Int8 conversion might not be able to quantize `size` properly. +def onnx_compatibale_interpolate( + input, size=None, scale_factor=None, mode="nearest", align_corners=None +): + # NOTE: The input dimensions are interpreted in the form: + # `mini-batch x channels x [optional depth] x [optional height] x width`. + if size is None and scale_factor is not None: + if input.dim() == 4: + if isinstance(scale_factor, (int, float)): + height_scale, width_scale = (scale_factor, scale_factor) + else: + assert isinstance(scale_factor, (tuple, list)) + assert len(scale_factor) == 2 + height_scale, width_scale = scale_factor + + assert not align_corners, "No matching C2 op for align_corners == True" + if mode == "nearest": + return torch.ops._caffe2.ResizeNearest( + input, order="NCHW", width_scale=width_scale, height_scale=height_scale + ) + elif mode == "bilinear": + logger.warning( + "Use F.conv_transpose2d for bilinear interpolate" + " because there's no such C2 op, this may cause significant" + " slowdown and the boundary pixels won't be as same as" + " using F.interpolate due to padding." + ) + assert height_scale == width_scale + return BilinearInterpolation(input, up_scale=height_scale) + logger.warning("Output size is not static, it might cause ONNX conversion issue") + + return interp(input, size, scale_factor, mode, align_corners) + + +@contextlib.contextmanager +def mock_torch_nn_functional_interpolate(): + if torch.onnx.is_in_onnx_export(): + with mock.patch( + "torch.nn.functional.interpolate", side_effect=onnx_compatibale_interpolate + ): + yield + else: + yield + + +# ==== torch/utils_caffe2/ws_utils.py ========================================== + + +class ScopedWS(object): + def __init__(self, ws_name, is_reset, is_cleanup=False): + self.ws_name = ws_name + self.is_reset = is_reset + self.is_cleanup = is_cleanup + self.org_ws = "" + + def __enter__(self): + self.org_ws = workspace.CurrentWorkspace() + if self.ws_name is not None: + workspace.SwitchWorkspace(self.ws_name, True) + if self.is_reset: + workspace.ResetWorkspace() + + return workspace + + def __exit__(self, *args): + if self.is_cleanup: + workspace.ResetWorkspace() + if self.ws_name is not None: + workspace.SwitchWorkspace(self.org_ws) + + +def fetch_any_blob(name): + bb = None + try: + bb = workspace.FetchBlob(name) + except TypeError: + bb = workspace.FetchInt8Blob(name) + except Exception as e: + logger.error("Get blob {} error: {}".format(name, e)) + + return bb + + +# ==== torch/utils_caffe2/protobuf.py ========================================== + + +def get_pb_arg(pb, arg_name): + for x in pb.arg: + if x.name == arg_name: + return x + return None + + +def get_pb_arg_valf(pb, arg_name, default_val): + arg = get_pb_arg(pb, arg_name) + return arg.f if arg is not None else default_val + + +def get_pb_arg_floats(pb, arg_name, default_val): + arg = get_pb_arg(pb, arg_name) + return list(map(float, arg.floats)) if arg is not None else default_val + + +def get_pb_arg_ints(pb, arg_name, default_val): + arg = get_pb_arg(pb, arg_name) + return list(map(int, arg.ints)) if arg is not None else default_val + + +def get_pb_arg_vali(pb, arg_name, default_val): + arg = get_pb_arg(pb, arg_name) + return arg.i if arg is not None else default_val + + +def get_pb_arg_vals(pb, arg_name, default_val): + arg = get_pb_arg(pb, arg_name) + return arg.s if arg is not None else default_val + + +def get_pb_arg_valstrings(pb, arg_name, default_val): + arg = get_pb_arg(pb, arg_name) + return list(arg.strings) if arg is not None else default_val + + +def check_set_pb_arg(pb, arg_name, arg_attr, arg_value, allow_override=False): + arg = get_pb_arg(pb, arg_name) + if arg is None: + arg = putils.MakeArgument(arg_name, arg_value) + assert hasattr(arg, arg_attr) + pb.arg.extend([arg]) + if allow_override and getattr(arg, arg_attr) != arg_value: + logger.warning( + "Override argument {}: {} -> {}".format(arg_name, getattr(arg, arg_attr), arg_value) + ) + setattr(arg, arg_attr, arg_value) + else: + assert arg is not None + assert getattr(arg, arg_attr) == arg_value, "Existing value {}, new value {}".format( + getattr(arg, arg_attr), arg_value + ) + + +def _create_const_fill_op_from_numpy(name, tensor, device_option=None): + assert type(tensor) == np.ndarray + kTypeNameMapper = { + np.dtype("float32"): "GivenTensorFill", + np.dtype("int32"): "GivenTensorIntFill", + np.dtype("int64"): "GivenTensorInt64Fill", + np.dtype("uint8"): "GivenTensorStringFill", + } + + args_dict = {} + if tensor.dtype == np.dtype("uint8"): + args_dict.update({"values": [str(tensor.data)], "shape": [1]}) + else: + args_dict.update({"values": tensor, "shape": tensor.shape}) + + if device_option is not None: + args_dict["device_option"] = device_option + + return core.CreateOperator(kTypeNameMapper[tensor.dtype], [], [name], **args_dict) + + +def _create_const_fill_op_from_c2_int8_tensor(name, int8_tensor): + assert type(int8_tensor) == workspace.Int8Tensor + kTypeNameMapper = { + np.dtype("int32"): "Int8GivenIntTensorFill", + np.dtype("uint8"): "Int8GivenTensorFill", + } + + tensor = int8_tensor.data + assert tensor.dtype in [np.dtype("uint8"), np.dtype("int32")] + values = tensor.tobytes() if tensor.dtype == np.dtype("uint8") else tensor + + return core.CreateOperator( + kTypeNameMapper[tensor.dtype], + [], + [name], + values=values, + shape=tensor.shape, + Y_scale=int8_tensor.scale, + Y_zero_point=int8_tensor.zero_point, + ) + + +def create_const_fill_op( + name: str, + blob: Union[np.ndarray, workspace.Int8Tensor], + device_option: Optional[caffe2_pb2.DeviceOption] = None, +) -> caffe2_pb2.OperatorDef: + """ + Given a blob object, return the Caffe2 operator that creates this blob + as constant. Currently support NumPy tensor and Caffe2 Int8Tensor. + """ + + tensor_type = type(blob) + assert tensor_type in [ + np.ndarray, + workspace.Int8Tensor, + ], 'Error when creating const fill op for "{}", unsupported blob type: {}'.format( + name, type(blob) + ) + + if tensor_type == np.ndarray: + return _create_const_fill_op_from_numpy(name, blob, device_option) + elif tensor_type == workspace.Int8Tensor: + assert device_option is None + return _create_const_fill_op_from_c2_int8_tensor(name, blob) + + +def construct_init_net_from_params( + params: Dict[str, Any], device_options: Optional[Dict[str, caffe2_pb2.DeviceOption]] = None +) -> caffe2_pb2.NetDef: + """ + Construct the init_net from params dictionary + """ + init_net = caffe2_pb2.NetDef() + device_options = device_options or {} + for name, blob in params.items(): + if isinstance(blob, str): + logger.warning( + ( + "Blob {} with type {} is not supported in generating init net," + " skipped.".format(name, type(blob)) + ) + ) + continue + init_net.op.extend( + [create_const_fill_op(name, blob, device_option=device_options.get(name, None))] + ) + init_net.external_output.append(name) + return init_net + + +def get_producer_map(ssa): + """ + Return dict from versioned blob to (i, j), + where i is index of producer op, j is the index of output of that op. + """ + producer_map = {} + for i in range(len(ssa)): + outputs = ssa[i][1] + for j, outp in enumerate(outputs): + producer_map[outp] = (i, j) + return producer_map + + +def get_consumer_map(ssa): + """ + Return dict from versioned blob to list of (i, j), + where i is index of consumer op, j is the index of input of that op. + """ + consumer_map = collections.defaultdict(list) + for i in range(len(ssa)): + inputs = ssa[i][0] + for j, inp in enumerate(inputs): + consumer_map[inp].append((i, j)) + return consumer_map + + +def get_params_from_init_net( + init_net: caffe2_pb2.NetDef, +) -> [Dict[str, Any], Dict[str, caffe2_pb2.DeviceOption]]: + """ + Take the output blobs from init_net by running it. + Outputs: + params: dict from blob name to numpy array + device_options: dict from blob name to the device option of its creating op + """ + # NOTE: this assumes that the params is determined by producer op with the + # only exception be CopyGPUToCPU which is CUDA op but returns CPU tensor. + def _get_device_option(producer_op): + if producer_op.type == "CopyGPUToCPU": + return caffe2_pb2.DeviceOption() + else: + return producer_op.device_option + + with ScopedWS("__get_params_from_init_net__", is_reset=True, is_cleanup=True) as ws: + ws.RunNetOnce(init_net) + params = {b: fetch_any_blob(b) for b in init_net.external_output} + ssa, versions = core.get_ssa(init_net) + producer_map = get_producer_map(ssa) + device_options = { + b: _get_device_option(init_net.op[producer_map[(b, versions[b])][0]]) + for b in init_net.external_output + } + return params, device_options + + +def _updater_raise(op, input_types, output_types): + raise RuntimeError( + "Failed to apply updater for op {} given input_types {} and" + " output_types {}".format(op, input_types, output_types) + ) + + +def _generic_status_identifier( + predict_net: caffe2_pb2.NetDef, + status_updater: Callable, + known_status: Dict[Tuple[str, int], Any], +) -> Dict[Tuple[str, int], Any]: + """ + Statically infer the status of each blob, the status can be such as device type + (CPU/GPU), layout (NCHW/NHWC), data type (float32/int8), etc. "Blob" here + is versioned blob (Tuple[str, int]) in the format compatible with ssa. + Inputs: + predict_net: the caffe2 network + status_updater: a callable, given an op and the status of its input/output, + it returns the updated status of input/output. `None` is used for + representing unknown status. + known_status: a dict containing known status, used as initialization. + Outputs: + A dict mapping from versioned blob to its status + """ + ssa, versions = core.get_ssa(predict_net) + versioned_ext_input = [(b, 0) for b in predict_net.external_input] + versioned_ext_output = [(b, versions[b]) for b in predict_net.external_output] + all_versioned_blobs = set().union(*[set(x[0] + x[1]) for x in ssa]) + + allowed_vbs = all_versioned_blobs.union(versioned_ext_input).union(versioned_ext_output) + assert all(k in allowed_vbs for k in known_status) + assert all(v is not None for v in known_status.values()) + _known_status = copy.deepcopy(known_status) + + def _check_and_update(key, value): + assert value is not None + if key in _known_status: + if not _known_status[key] == value: + raise RuntimeError( + "Confilict status for {}, existing status {}, new status {}".format( + key, _known_status[key], value + ) + ) + _known_status[key] = value + + def _update_i(op, ssa_i): + versioned_inputs = ssa_i[0] + versioned_outputs = ssa_i[1] + + inputs_status = [_known_status.get(b, None) for b in versioned_inputs] + outputs_status = [_known_status.get(b, None) for b in versioned_outputs] + + new_inputs_status, new_outputs_status = status_updater(op, inputs_status, outputs_status) + + for versioned_blob, status in zip( + versioned_inputs + versioned_outputs, new_inputs_status + new_outputs_status + ): + if status is not None: + _check_and_update(versioned_blob, status) + + for op, ssa_i in zip(predict_net.op, ssa): + _update_i(op, ssa_i) + for op, ssa_i in zip(reversed(predict_net.op), reversed(ssa)): + _update_i(op, ssa_i) + + # NOTE: This strictly checks all the blob from predict_net must be assgined + # a known status. However sometimes it's impossible (eg. having deadend op), + # we may relax this constraint if + for k in all_versioned_blobs: + if k not in _known_status: + raise NotImplementedError( + "Can not infer the status for {}. Currently only support the case where" + " a single forward and backward pass can identify status for all blobs.".format(k) + ) + + return _known_status + + +def infer_device_type( + predict_net: caffe2_pb2.NetDef, + known_status: Dict[Tuple[str, int], Any], + device_name_style: str = "caffe2", +) -> Dict[Tuple[str, int], str]: + """ Return the device type ("cpu" or "gpu"/"cuda") of each (versioned) blob """ + + assert device_name_style in ["caffe2", "pytorch"] + _CPU_STR = "cpu" + _GPU_STR = "gpu" if device_name_style == "caffe2" else "cuda" + + def _copy_cpu_to_gpu_updater(op, input_types, output_types): + if input_types[0] == _GPU_STR or output_types[0] == _CPU_STR: + _updater_raise(op, input_types, output_types) + return ([_CPU_STR], [_GPU_STR]) + + def _copy_gpu_to_cpu_updater(op, input_types, output_types): + if input_types[0] == _CPU_STR or output_types[0] == _GPU_STR: + _updater_raise(op, input_types, output_types) + return ([_GPU_STR], [_CPU_STR]) + + def _other_ops_updater(op, input_types, output_types): + non_none_types = [x for x in input_types + output_types if x is not None] + if len(non_none_types) > 0: + the_type = non_none_types[0] + if not all(x == the_type for x in non_none_types): + _updater_raise(op, input_types, output_types) + else: + the_type = None + return ([the_type for _ in op.input], [the_type for _ in op.output]) + + def _device_updater(op, *args, **kwargs): + return { + "CopyCPUToGPU": _copy_cpu_to_gpu_updater, + "CopyGPUToCPU": _copy_gpu_to_cpu_updater, + }.get(op.type, _other_ops_updater)(op, *args, **kwargs) + + return _generic_status_identifier(predict_net, _device_updater, known_status) + + +# ==== torch/utils_caffe2/vis.py =============================================== + + +def _modify_blob_names(ops, blob_rename_f): + ret = [] + + def _replace_list(blob_list, replaced_list): + del blob_list[:] + blob_list.extend(replaced_list) + + for x in ops: + cur = copy.deepcopy(x) + _replace_list(cur.input, list(map(blob_rename_f, cur.input))) + _replace_list(cur.output, list(map(blob_rename_f, cur.output))) + ret.append(cur) + + return ret + + +def _rename_blob(name, blob_sizes, blob_ranges): + def _list_to_str(bsize): + ret = ", ".join([str(x) for x in bsize]) + ret = "[" + ret + "]" + return ret + + ret = name + if blob_sizes is not None and name in blob_sizes: + ret += "\n" + _list_to_str(blob_sizes[name]) + if blob_ranges is not None and name in blob_ranges: + ret += "\n" + _list_to_str(blob_ranges[name]) + + return ret + + +# graph_name could not contain word 'graph' +def save_graph(net, file_name, graph_name="net", op_only=True, blob_sizes=None, blob_ranges=None): + blob_rename_f = functools.partial(_rename_blob, blob_sizes=blob_sizes, blob_ranges=blob_ranges) + return save_graph_base(net, file_name, graph_name, op_only, blob_rename_f) + + +def save_graph_base(net, file_name, graph_name="net", op_only=True, blob_rename_func=None): + graph = None + ops = net.op + if blob_rename_func is not None: + ops = _modify_blob_names(ops, blob_rename_func) + if not op_only: + graph = net_drawer.GetPydotGraph(ops, graph_name, rankdir="TB") + else: + graph = net_drawer.GetPydotGraphMinimal( + ops, graph_name, rankdir="TB", minimal_dependency=True + ) + + try: + par_dir = os.path.dirname(file_name) + if not os.path.exists(par_dir): + os.makedirs(par_dir) + + format = os.path.splitext(os.path.basename(file_name))[-1] + if format == ".png": + graph.write_png(file_name) + elif format == ".pdf": + graph.write_pdf(file_name) + elif format == ".svg": + graph.write_svg(file_name) + else: + print("Incorrect format {}".format(format)) + except Exception as e: + print("Error when writing graph to image {}".format(e)) + + return graph + + +# ==== torch/utils_toffee/aten_to_caffe2.py ==================================== + + +def group_norm_replace_aten_with_caffe2(predict_net: caffe2_pb2.NetDef): + """ + For ONNX exported model, GroupNorm will be represented as ATen op, + this can be a drop in replacement from ATen to GroupNorm + """ + count = 0 + for op in predict_net.op: + if op.type == "ATen": + op_name = get_pb_arg_vals(op, "operator", None) # return byte in py3 + if op_name and op_name.decode() == "group_norm": + op.arg.remove(get_pb_arg(op, "operator")) + + if get_pb_arg_vali(op, "cudnn_enabled", None): + op.arg.remove(get_pb_arg(op, "cudnn_enabled")) + + num_groups = get_pb_arg_vali(op, "num_groups", None) + if num_groups is not None: + op.arg.remove(get_pb_arg(op, "num_groups")) + check_set_pb_arg(op, "group", "i", num_groups) + + op.type = "GroupNorm" + count += 1 + if count > 1: + logger.info("Replaced {} ATen operator to GroupNormOp".format(count)) + + +# ==== torch/utils_toffee/alias.py ============================================= + + +def alias(x, name, is_backward=False): + if not torch.onnx.is_in_onnx_export(): + return x + assert isinstance(x, torch.Tensor) + return torch.ops._caffe2.AliasWithName(x, name, is_backward=is_backward) + + +def fuse_alias_placeholder(predict_net, init_net): + """ Remove AliasWithName placeholder and rename the input/output of it """ + # First we finish all the re-naming + for i, op in enumerate(predict_net.op): + if op.type == "AliasWithName": + assert len(op.input) == 1 + assert len(op.output) == 1 + name = get_pb_arg_vals(op, "name", None).decode() + is_backward = bool(get_pb_arg_vali(op, "is_backward", 0)) + rename_op_input(predict_net, init_net, i, 0, name, from_producer=is_backward) + rename_op_output(predict_net, i, 0, name) + + # Remove AliasWithName, should be very safe since it's a non-op + new_ops = [] + for op in predict_net.op: + if op.type != "AliasWithName": + new_ops.append(op) + else: + # safety check + assert op.input == op.output + assert op.input[0] == op.arg[0].s.decode() + del predict_net.op[:] + predict_net.op.extend(new_ops) + + +# ==== torch/utils_caffe2/graph_transform.py =================================== + + +class IllegalGraphTransformError(ValueError): + """ When a graph transform function call can't be executed. """ + + +def _rename_versioned_blob_in_proto( + proto: caffe2_pb2.NetDef, + old_name: str, + new_name: str, + version: int, + ssa: List[Tuple[List[Tuple[str, int]], List[Tuple[str, int]]]], + start_versions: Dict[str, int], + end_versions: Dict[str, int], +): + """ In given proto, rename all blobs with matched version """ + # Operater list + for op, i_th_ssa in zip(proto.op, ssa): + versioned_inputs, versioned_outputs = i_th_ssa + for i in range(len(op.input)): + if versioned_inputs[i] == (old_name, version): + op.input[i] = new_name + for i in range(len(op.output)): + if versioned_outputs[i] == (old_name, version): + op.output[i] = new_name + # external_input + if start_versions.get(old_name, 0) == version: + for i in range(len(proto.external_input)): + if proto.external_input[i] == old_name: + proto.external_input[i] = new_name + # external_output + if end_versions.get(old_name, 0) == version: + for i in range(len(proto.external_output)): + if proto.external_output[i] == old_name: + proto.external_output[i] = new_name + + +def rename_op_input( + predict_net: caffe2_pb2.NetDef, + init_net: caffe2_pb2.NetDef, + op_id: int, + input_id: int, + new_name: str, + from_producer: bool = False, +): + """ + Rename the op_id-th operator in predict_net, change it's input_id-th input's + name to the new_name. It also does automatic re-route and change + external_input and init_net if necessary. + - It requires the input is only consumed by this op. + - This function modifies predict_net and init_net in-place. + - When from_producer is enable, this also updates other operators that consumes + the same input. Be cautious because may trigger unintended behavior. + """ + assert isinstance(predict_net, caffe2_pb2.NetDef) + assert isinstance(init_net, caffe2_pb2.NetDef) + + init_net_ssa, init_net_versions = core.get_ssa(init_net) + predict_net_ssa, predict_net_versions = core.get_ssa( + predict_net, copy.deepcopy(init_net_versions) + ) + + versioned_inputs, versioned_outputs = predict_net_ssa[op_id] + old_name, version = versioned_inputs[input_id] + + if from_producer: + producer_map = get_producer_map(predict_net_ssa) + if not (old_name, version) in producer_map: + raise NotImplementedError( + "Can't find producer, the input {} is probably from" + " init_net, this is not supported yet.".format(old_name) + ) + producer = producer_map[(old_name, version)] + rename_op_output(predict_net, producer[0], producer[1], new_name) + return + + def contain_targets(op_ssa): + return (old_name, version) in op_ssa[0] + + is_consumer = [contain_targets(op_ssa) for op_ssa in predict_net_ssa] + if sum(is_consumer) > 1: + raise IllegalGraphTransformError( + ( + "Input '{}' of operator(#{}) are consumed by other ops, please use" + + " rename_op_output on the producer instead. Offending op: \n{}" + ).format(old_name, op_id, predict_net.op[op_id]) + ) + + # update init_net + _rename_versioned_blob_in_proto( + init_net, old_name, new_name, version, init_net_ssa, {}, init_net_versions + ) + # update predict_net + _rename_versioned_blob_in_proto( + predict_net, + old_name, + new_name, + version, + predict_net_ssa, + init_net_versions, + predict_net_versions, + ) + + +def rename_op_output(predict_net: caffe2_pb2.NetDef, op_id: int, output_id: int, new_name: str): + """ + Rename the op_id-th operator in predict_net, change it's output_id-th input's + name to the new_name. It also does automatic re-route and change + external_output and if necessary. + - It allows multiple consumers of its output. + - This function modifies predict_net in-place, doesn't need init_net. + """ + assert isinstance(predict_net, caffe2_pb2.NetDef) + + ssa, blob_versions = core.get_ssa(predict_net) + + versioned_inputs, versioned_outputs = ssa[op_id] + old_name, version = versioned_outputs[output_id] + + # update predict_net + _rename_versioned_blob_in_proto( + predict_net, old_name, new_name, version, ssa, {}, blob_versions + ) + + +def get_sub_graph_external_input_output( + predict_net: caffe2_pb2.NetDef, sub_graph_op_indices: List[int] +) -> Tuple[List[Tuple[str, int]], List[Tuple[str, int]]]: + """ + Return the list of external input/output of sub-graph, + each element is tuple of the name and corresponding version in predict_net. + + external input/output is defined the same way as caffe2 NetDef. + """ + ssa, versions = core.get_ssa(predict_net) + + all_inputs = [] + all_outputs = [] + for op_id in sub_graph_op_indices: + all_inputs += [inp for inp in ssa[op_id][0] if inp not in all_inputs] + all_outputs += list(ssa[op_id][1]) # ssa output won't repeat + + # for versioned blobs, external inputs are just those blob in all_inputs + # but not in all_outputs + ext_inputs = [inp for inp in all_inputs if inp not in all_outputs] + + # external outputs are essentially outputs of this subgraph that are used + # outside of this sub-graph (including predict_net.external_output) + all_other_inputs = sum( + (ssa[i][0] for i in range(len(ssa)) if i not in sub_graph_op_indices), + [(outp, versions[outp]) for outp in predict_net.external_output], + ) + ext_outputs = [outp for outp in all_outputs if outp in set(all_other_inputs)] + + return ext_inputs, ext_outputs + + +class DiGraph: + """ A DAG representation of caffe2 graph, each vertice is a versioned blob. """ + + def __init__(self): + self.vertices = set() + self.graph = collections.defaultdict(list) + + def add_edge(self, u, v): + self.graph[u].append(v) + self.vertices.add(u) + self.vertices.add(v) + + # grab from https://www.geeksforgeeks.org/find-paths-given-source-destination/ + def get_all_paths(self, s, d): + visited = {k: False for k in self.vertices} + path = [] + all_paths = [] + + def _get_all_paths_util(graph, u, d, visited, path): + visited[u] = True + path.append(u) + if u == d: + all_paths.append(copy.deepcopy(path)) + else: + for i in graph[u]: + if not visited[i]: + _get_all_paths_util(graph, i, d, visited, path) + path.pop() + visited[u] = False + + _get_all_paths_util(self.graph, s, d, visited, path) + return all_paths + + @staticmethod + def from_ssa(ssa): + graph = DiGraph() + for op_id in range(len(ssa)): + for inp in ssa[op_id][0]: + for outp in ssa[op_id][1]: + graph.add_edge(inp, outp) + return graph + + +def _get_dependency_chain(ssa, versioned_target, versioned_source): + """ + Return the index list of relevant operator to produce target blob from source blob, + if there's no dependency, return empty list. + """ + + # finding all paths between nodes can be O(N!), thus we can only search + # in the subgraph using the op starting from the first consumer of source blob + # to the producer of the target blob. + consumer_map = get_consumer_map(ssa) + producer_map = get_producer_map(ssa) + start_op = min(x[0] for x in consumer_map[versioned_source]) - 15 + end_op = ( + producer_map[versioned_target][0] + 15 if versioned_target in producer_map else start_op + ) + sub_graph_ssa = ssa[start_op : end_op + 1] + if len(sub_graph_ssa) > 30: + logger.warning( + "Subgraph bebetween {} and {} is large (from op#{} to op#{}), it" + " might take non-trival time to find all paths between them.".format( + versioned_source, versioned_target, start_op, end_op + ) + ) + + dag = DiGraph.from_ssa(sub_graph_ssa) + paths = dag.get_all_paths(versioned_source, versioned_target) # include two ends + ops_in_paths = [[producer_map[blob][0] for blob in path[1:]] for path in paths] + return sorted(set().union(*[set(ops) for ops in ops_in_paths])) + + +def identify_reshape_sub_graph(predict_net: caffe2_pb2.NetDef) -> List[List[int]]: + """ + Idenfity the reshape sub-graph in a protobuf. + The reshape sub-graph is defined as matching the following pattern: + + (input_blob) -> Op_1 -> ... -> Op_N -> (new_shape) -─┐ + └-------------------------------------------> Reshape -> (output_blob) + + Return: + List of sub-graphs, each sub-graph is represented as a list of indices + of the relavent ops, [Op_1, Op_2, ..., Op_N, Reshape] + """ + + ssa, _ = core.get_ssa(predict_net) + + ret = [] + for i, op in enumerate(predict_net.op): + if op.type == "Reshape": + assert len(op.input) == 2 + input_ssa = ssa[i][0] + data_source = input_ssa[0] + shape_source = input_ssa[1] + op_indices = _get_dependency_chain(ssa, shape_source, data_source) + ret.append(op_indices + [i]) + return ret + + +def remove_reshape_for_fc(predict_net, params): + """ + In PyTorch nn.Linear has to take 2D tensor, this often leads to reshape + a 4D tensor to 2D by calling .view(). However this (dynamic) reshaping + doesn't work well with ONNX and Int8 tools, and cause using extra + ops (eg. ExpandDims) that might not be available on mobile. + Luckily Caffe2 supports 4D tensor for FC, so we can remove those reshape + after exporting ONNX model. + """ + from caffe2.python import core + + # find all reshape sub-graph that can be removed, which is now all Reshape + # sub-graph whose output is only consumed by FC. + # TODO: to make it safer, we may need the actually value to better determine + # if a Reshape before FC is removable. + reshape_sub_graphs = identify_reshape_sub_graph(predict_net) + sub_graphs_to_remove = [] + for reshape_sub_graph in reshape_sub_graphs: + reshape_op_id = reshape_sub_graph[-1] + assert predict_net.op[reshape_op_id].type == "Reshape" + ssa, _ = core.get_ssa(predict_net) + reshape_output = ssa[reshape_op_id][1][0] + consumers = [i for i in range(len(ssa)) if reshape_output in ssa[i][0]] + if all(predict_net.op[consumer].type == "FC" for consumer in consumers): + # safety check if the sub-graph is isolated, for this reshape sub-graph, + # it means it has one non-param external input and one external output. + ext_inputs, ext_outputs = get_sub_graph_external_input_output( + predict_net, reshape_sub_graph + ) + non_params_ext_inputs = [inp for inp in ext_inputs if inp[1] != 0] + if len(non_params_ext_inputs) == 1 and len(ext_outputs) == 1: + sub_graphs_to_remove.append(reshape_sub_graph) + + # perform removing subgraph by: + # 1: rename the Reshape's output to its input, then the graph can be + # seen as in-place itentify, meaning whose external input/output are the same. + # 2: simply remove those ops. + remove_op_ids = [] + params_to_remove = [] + for sub_graph in sub_graphs_to_remove: + logger.info( + "Remove Reshape sub-graph:\n{}".format( + "".join(["(#{:>4})\n{}".format(i, predict_net.op[i]) for i in sub_graph]) + ) + ) + reshape_op_id = sub_graph[-1] + new_reshap_output = predict_net.op[reshape_op_id].input[0] + rename_op_output(predict_net, reshape_op_id, 0, new_reshap_output) + ext_inputs, ext_outputs = get_sub_graph_external_input_output(predict_net, sub_graph) + non_params_ext_inputs = [inp for inp in ext_inputs if inp[1] != 0] + params_ext_inputs = [inp for inp in ext_inputs if inp[1] == 0] + assert len(non_params_ext_inputs) == 1 and len(ext_outputs) == 1 + assert ext_outputs[0][0] == non_params_ext_inputs[0][0] + assert ext_outputs[0][1] == non_params_ext_inputs[0][1] + 1 + remove_op_ids.extend(sub_graph) + params_to_remove.extend(params_ext_inputs) + + predict_net = copy.deepcopy(predict_net) + new_ops = [op for i, op in enumerate(predict_net.op) if i not in remove_op_ids] + del predict_net.op[:] + predict_net.op.extend(new_ops) + for versioned_params in params_to_remove: + name = versioned_params[0] + logger.info("Remove params: {} from init_net and predict_net.external_input".format(name)) + del params[name] + predict_net.external_input.remove(name) + + return predict_net, params + + +def fuse_copy_between_cpu_and_gpu(predict_net: caffe2_pb2.NetDef): + """ + In-place fuse extra copy ops between cpu/gpu for the following case: + a -CopyAToB-> b -CopyBToA> c1 -NextOp1-> d1 + -CopyBToA> c2 -NextOp2-> d2 + The fused network will look like: + a -NextOp1-> d1 + -NextOp2-> d2 + """ + + _COPY_OPS = ["CopyCPUToGPU", "CopyGPUToCPU"] + + def _fuse_once(predict_net): + ssa, blob_versions = core.get_ssa(predict_net) + consumer_map = get_consumer_map(ssa) + versioned_external_output = [ + (name, blob_versions[name]) for name in predict_net.external_output + ] + + for op_id, op in enumerate(predict_net.op): + if op.type in _COPY_OPS: + fw_copy_versioned_output = ssa[op_id][1][0] + consumer_ids = [x[0] for x in consumer_map[fw_copy_versioned_output]] + reverse_op_type = _COPY_OPS[1 - _COPY_OPS.index(op.type)] + + is_fusable = ( + len(consumer_ids) > 0 + and fw_copy_versioned_output not in versioned_external_output + and all( + predict_net.op[_op_id].type == reverse_op_type + and ssa[_op_id][1][0] not in versioned_external_output + for _op_id in consumer_ids + ) + ) + + if is_fusable: + for rv_copy_op_id in consumer_ids: + # making each NextOp uses "a" directly and removing Copy ops + rs_copy_versioned_output = ssa[rv_copy_op_id][1][0] + next_op_id, inp_id = consumer_map[rs_copy_versioned_output][0] + predict_net.op[next_op_id].input[inp_id] = op.input[0] + # remove CopyOps + new_ops = [ + op + for i, op in enumerate(predict_net.op) + if i != op_id and i not in consumer_ids + ] + del predict_net.op[:] + predict_net.op.extend(new_ops) + return True + + return False + + # _fuse_once returns False is nothing can be fused + while _fuse_once(predict_net): + pass + + +def remove_dead_end_ops(net_def: caffe2_pb2.NetDef): + """ remove ops if its output is not used or not in external_output """ + ssa, versions = core.get_ssa(net_def) + versioned_external_output = [(name, versions[name]) for name in net_def.external_output] + consumer_map = get_consumer_map(ssa) + removed_op_ids = set() + + def _is_dead_end(versioned_blob): + return not ( + versioned_blob in versioned_external_output + or ( + len(consumer_map[versioned_blob]) > 0 + and all(x[0] not in removed_op_ids for x in consumer_map[versioned_blob]) + ) + ) + + for i, ssa_i in reversed(list(enumerate(ssa))): + versioned_outputs = ssa_i[1] + if all(_is_dead_end(outp) for outp in versioned_outputs): + removed_op_ids.add(i) + + # simply removing those deadend ops should have no effect to external_output + new_ops = [op for i, op in enumerate(net_def.op) if i not in removed_op_ids] + del net_def.op[:] + net_def.op.extend(new_ops) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/__init__.py new file mode 100644 index 0000000..2753739 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .batch_norm import FrozenBatchNorm2d, get_norm, NaiveSyncBatchNorm +from .deform_conv import DeformConv, ModulatedDeformConv +from .mask_ops import paste_masks_in_image +from .nms import batched_nms, batched_nms_rotated, nms, nms_rotated +from .roi_align import ROIAlign, roi_align +from .roi_align_rotated import ROIAlignRotated, roi_align_rotated +from .shape_spec import ShapeSpec +from .wrappers import BatchNorm2d, Conv2d, ConvTranspose2d, cat, interpolate, Linear +from .blocks import CNNBlockBase + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/batch_norm.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/batch_norm.py new file mode 100644 index 0000000..1339c6e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/batch_norm.py @@ -0,0 +1,242 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import torch +import torch.distributed as dist +from torch import nn +from torch.autograd.function import Function +from torch.nn import functional as F + +from detectron2.utils import comm + +from .wrappers import BatchNorm2d + +TORCH_VERSION = tuple(int(x) for x in torch.__version__.split(".")[:2]) + + +class FrozenBatchNorm2d(nn.Module): + """ + BatchNorm2d where the batch statistics and the affine parameters are fixed. + + It contains non-trainable buffers called + "weight" and "bias", "running_mean", "running_var", + initialized to perform identity transformation. + + The pre-trained backbone models from Caffe2 only contain "weight" and "bias", + which are computed from the original four parameters of BN. + The affine transform `x * weight + bias` will perform the equivalent + computation of `(x - running_mean) / sqrt(running_var) * weight + bias`. + When loading a backbone model from Caffe2, "running_mean" and "running_var" + will be left unchanged as identity transformation. + + Other pre-trained backbone models may contain all 4 parameters. + + The forward is implemented by `F.batch_norm(..., training=False)`. + """ + + _version = 3 + + def __init__(self, num_features, eps=1e-5): + super().__init__() + self.num_features = num_features + self.eps = eps + self.register_buffer("weight", torch.ones(num_features)) + self.register_buffer("bias", torch.zeros(num_features)) + self.register_buffer("running_mean", torch.zeros(num_features)) + self.register_buffer("running_var", torch.ones(num_features) - eps) + + def forward(self, x): + if x.requires_grad: + # When gradients are needed, F.batch_norm will use extra memory + # because its backward op computes gradients for weight/bias as well. + scale = self.weight * (self.running_var + self.eps).rsqrt() + bias = self.bias - self.running_mean * scale + scale = scale.reshape(1, -1, 1, 1) + bias = bias.reshape(1, -1, 1, 1) + return x * scale + bias + else: + # When gradients are not needed, F.batch_norm is a single fused op + # and provide more optimization opportunities. + return F.batch_norm( + x, + self.running_mean, + self.running_var, + self.weight, + self.bias, + training=False, + eps=self.eps, + ) + + def _load_from_state_dict( + self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs + ): + version = local_metadata.get("version", None) + + if version is None or version < 2: + # No running_mean/var in early versions + # This will silent the warnings + if prefix + "running_mean" not in state_dict: + state_dict[prefix + "running_mean"] = torch.zeros_like(self.running_mean) + if prefix + "running_var" not in state_dict: + state_dict[prefix + "running_var"] = torch.ones_like(self.running_var) + + if version is not None and version < 3: + logger = logging.getLogger(__name__) + logger.info("FrozenBatchNorm {} is upgraded to version 3.".format(prefix.rstrip("."))) + # In version < 3, running_var are used without +eps. + state_dict[prefix + "running_var"] -= self.eps + + super()._load_from_state_dict( + state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs + ) + + def __repr__(self): + return "FrozenBatchNorm2d(num_features={}, eps={})".format(self.num_features, self.eps) + + @classmethod + def convert_frozen_batchnorm(cls, module): + """ + Convert BatchNorm/SyncBatchNorm in module into FrozenBatchNorm. + + Args: + module (torch.nn.Module): + + Returns: + If module is BatchNorm/SyncBatchNorm, returns a new module. + Otherwise, in-place convert module and return it. + + Similar to convert_sync_batchnorm in + https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/batchnorm.py + """ + bn_module = nn.modules.batchnorm + bn_module = (bn_module.BatchNorm2d, bn_module.SyncBatchNorm) + res = module + if isinstance(module, bn_module): + res = cls(module.num_features) + if module.affine: + res.weight.data = module.weight.data.clone().detach() + res.bias.data = module.bias.data.clone().detach() + res.running_mean.data = module.running_mean.data + res.running_var.data = module.running_var.data + res.eps = module.eps + else: + for name, child in module.named_children(): + new_child = cls.convert_frozen_batchnorm(child) + if new_child is not child: + res.add_module(name, new_child) + return res + + +def get_norm(norm, out_channels): + """ + Args: + norm (str or callable): either one of BN, SyncBN, FrozenBN, GN; + or a callable that takes a channel number and returns + the normalization layer as a nn.Module. + + Returns: + nn.Module or None: the normalization layer + """ + if isinstance(norm, str): + if len(norm) == 0: + return None + norm = { + "BN": BatchNorm2d, + # Fixed in https://github.com/pytorch/pytorch/pull/36382 + "SyncBN": NaiveSyncBatchNorm if TORCH_VERSION <= (1, 5) else nn.SyncBatchNorm, + "FrozenBN": FrozenBatchNorm2d, + "GN": lambda channels: nn.GroupNorm(32, channels), + # for debugging: + "nnSyncBN": nn.SyncBatchNorm, + "naiveSyncBN": NaiveSyncBatchNorm, + }[norm] + return norm(out_channels) + + +class AllReduce(Function): + @staticmethod + def forward(ctx, input): + input_list = [torch.zeros_like(input) for k in range(dist.get_world_size())] + # Use allgather instead of allreduce since I don't trust in-place operations .. + dist.all_gather(input_list, input, async_op=False) + inputs = torch.stack(input_list, dim=0) + return torch.sum(inputs, dim=0) + + @staticmethod + def backward(ctx, grad_output): + dist.all_reduce(grad_output, async_op=False) + return grad_output + + +class NaiveSyncBatchNorm(BatchNorm2d): + """ + In PyTorch<=1.5, `nn.SyncBatchNorm` has incorrect gradient + when the batch size on each worker is different. + (e.g., when scale augmentation is used, or when it is applied to mask head). + + This is a slower but correct alternative to `nn.SyncBatchNorm`. + + Note: + There isn't a single definition of Sync BatchNorm. + + When ``stats_mode==""``, this module computes overall statistics by using + statistics of each worker with equal weight. The result is true statistics + of all samples (as if they are all on one worker) only when all workers + have the same (N, H, W). This mode does not support inputs with zero batch size. + + When ``stats_mode=="N"``, this module computes overall statistics by weighting + the statistics of each worker by their ``N``. The result is true statistics + of all samples (as if they are all on one worker) only when all workers + have the same (H, W). It is slower than ``stats_mode==""``. + + Even though the result of this module may not be the true statistics of all samples, + it may still be reasonable because it might be preferrable to assign equal weights + to all workers, regardless of their (H, W) dimension, instead of putting larger weight + on larger images. From preliminary experiments, little difference is found between such + a simplified implementation and an accurate computation of overall mean & variance. + """ + + def __init__(self, *args, stats_mode="", **kwargs): + super().__init__(*args, **kwargs) + assert stats_mode in ["", "N"] + self._stats_mode = stats_mode + + def forward(self, input): + if comm.get_world_size() == 1 or not self.training: + return super().forward(input) + + B, C = input.shape[0], input.shape[1] + + mean = torch.mean(input, dim=[0, 2, 3]) + meansqr = torch.mean(input * input, dim=[0, 2, 3]) + + if self._stats_mode == "": + assert B > 0, 'SyncBatchNorm(stats_mode="") does not support zero batch size.' + vec = torch.cat([mean, meansqr], dim=0) + vec = AllReduce.apply(vec) * (1.0 / dist.get_world_size()) + mean, meansqr = torch.split(vec, C) + momentum = self.momentum + else: + if B == 0: + vec = torch.zeros([2 * C + 1], device=mean.device, dtype=mean.dtype) + vec = vec + input.sum() # make sure there is gradient w.r.t input + else: + vec = torch.cat( + [mean, meansqr, torch.ones([1], device=mean.device, dtype=mean.dtype)], dim=0 + ) + vec = AllReduce.apply(vec * B) + + total_batch = vec[-1].detach() + momentum = total_batch.clamp(max=1) * self.momentum # no update if total_batch is 0 + total_batch = torch.max(total_batch, torch.ones_like(total_batch)) # avoid div-by-zero + mean, meansqr, _ = torch.split(vec / total_batch, C) + + var = meansqr - mean * mean + invstd = torch.rsqrt(var + self.eps) + scale = self.weight * invstd + bias = self.bias - mean * scale + scale = scale.reshape(1, -1, 1, 1) + bias = bias.reshape(1, -1, 1, 1) + + self.running_mean += momentum * (mean.detach() - self.running_mean) + self.running_var += momentum * (var.detach() - self.running_var) + return input * scale + bias diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/blocks.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/blocks.py new file mode 100644 index 0000000..1d06fec --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/blocks.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from torch import nn + +from .batch_norm import FrozenBatchNorm2d + + +class CNNBlockBase(nn.Module): + """ + A CNN block is assumed to have input channels, output channels and a stride. + The input and output of `forward()` method must be NCHW tensors. + The method can perform arbitrary computation but must match the given + channels and stride specification. + + Attribute: + in_channels (int): + out_channels (int): + stride (int): + """ + + def __init__(self, in_channels, out_channels, stride): + """ + The `__init__` method of any subclass should also contain these arguments. + + Args: + in_channels (int): + out_channels (int): + stride (int): + """ + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.stride = stride + + def freeze(self): + """ + Make this block not trainable. + This method sets all parameters to `requires_grad=False`, + and convert all BatchNorm layers to FrozenBatchNorm + + Returns: + the block itself + """ + for p in self.parameters(): + p.requires_grad = False + FrozenBatchNorm2d.convert_frozen_batchnorm(self) + return self diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/README.md b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/README.md new file mode 100644 index 0000000..778ed3d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/README.md @@ -0,0 +1,7 @@ + + +To add a new Op: + +1. Create a new directory +2. Implement new ops there +3. Delcare its Python interface in `vision.cpp`. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign.h b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign.h new file mode 100644 index 0000000..2d95eac --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign.h @@ -0,0 +1,130 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#pragma once +#include + +namespace detectron2 { + +at::Tensor ROIAlign_forward_cpu( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + bool aligned); + +at::Tensor ROIAlign_backward_cpu( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio, + bool aligned); + +#ifdef WITH_CUDA +at::Tensor ROIAlign_forward_cuda( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + bool aligned); + +at::Tensor ROIAlign_backward_cuda( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio, + bool aligned); +#endif + +// Interface for Python +inline at::Tensor ROIAlign_forward( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + bool aligned) { + if (input.is_cuda()) { +#ifdef WITH_CUDA + return ROIAlign_forward_cuda( + input, + rois, + spatial_scale, + pooled_height, + pooled_width, + sampling_ratio, + aligned); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + return ROIAlign_forward_cpu( + input, + rois, + spatial_scale, + pooled_height, + pooled_width, + sampling_ratio, + aligned); +} + +inline at::Tensor ROIAlign_backward( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio, + bool aligned) { + if (grad.is_cuda()) { +#ifdef WITH_CUDA + return ROIAlign_backward_cuda( + grad, + rois, + spatial_scale, + pooled_height, + pooled_width, + batch_size, + channels, + height, + width, + sampling_ratio, + aligned); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + return ROIAlign_backward_cpu( + grad, + rois, + spatial_scale, + pooled_height, + pooled_width, + batch_size, + channels, + height, + width, + sampling_ratio, + aligned); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cpu.cpp b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cpu.cpp new file mode 100644 index 0000000..52fc83f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cpu.cpp @@ -0,0 +1,508 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include +#include "ROIAlign.h" + +namespace { + +// implementation taken from Caffe2 +template +struct PreCalc { + int pos1; + int pos2; + int pos3; + int pos4; + T w1; + T w2; + T w3; + T w4; +}; + +template +void pre_calc_for_bilinear_interpolate( + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int iy_upper, + const int ix_upper, + T roi_start_h, + T roi_start_w, + T bin_size_h, + T bin_size_w, + int roi_bin_grid_h, + int roi_bin_grid_w, + std::vector>& pre_calc) { + int pre_calc_index = 0; + for (int ph = 0; ph < pooled_height; ph++) { + for (int pw = 0; pw < pooled_width; pw++) { + for (int iy = 0; iy < iy_upper; iy++) { + const T yy = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < ix_upper; ix++) { + const T xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T x = xx; + T y = yy; + // deal with: inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + PreCalc pc; + pc.pos1 = 0; + pc.pos2 = 0; + pc.pos3 = 0; + pc.pos4 = 0; + pc.w1 = 0; + pc.w2 = 0; + pc.w3 = 0; + pc.w4 = 0; + pre_calc[pre_calc_index] = pc; + pre_calc_index += 1; + continue; + } + + if (y <= 0) { + y = 0; + } + if (x <= 0) { + x = 0; + } + + int y_low = (int)y; + int x_low = (int)x; + int y_high; + int x_high; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + // save weights and indices + PreCalc pc; + pc.pos1 = y_low * width + x_low; + pc.pos2 = y_low * width + x_high; + pc.pos3 = y_high * width + x_low; + pc.pos4 = y_high * width + x_high; + pc.w1 = w1; + pc.w2 = w2; + pc.w3 = w3; + pc.w4 = w4; + pre_calc[pre_calc_index] = pc; + + pre_calc_index += 1; + } + } + } + } +} + +template +void ROIAlignForward( + const int nthreads, + const T* input, + const T& spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + const T* rois, + T* output, + bool aligned) { + int n_rois = nthreads / channels / pooled_width / pooled_height; + // (n, c, ph, pw) is an element in the pooled output + // can be parallelized using omp + // #pragma omp parallel for num_threads(32) + for (int n = 0; n < n_rois; n++) { + int index_n = n * channels * pooled_width * pooled_height; + + const T* offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + + // Do not use rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + T roi_start_w = offset_rois[1] * spatial_scale - offset; + T roi_start_h = offset_rois[2] * spatial_scale - offset; + T roi_end_w = offset_rois[3] * spatial_scale - offset; + T roi_end_h = offset_rois[4] * spatial_scale - offset; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + if (aligned) { + AT_ASSERTM( + roi_width >= 0 && roi_height >= 0, + "ROIs in ROIAlign cannot have non-negative size!"); + } else { // for backward-compatibility only + roi_width = std::max(roi_width, (T)1.); + roi_height = std::max(roi_height, (T)1.); + } + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // We do average (integral) pooling inside a bin + // When the grid is empty, output zeros == 0/1, instead of NaN. + const T count = std::max(roi_bin_grid_h * roi_bin_grid_w, 1); // e.g. = 4 + + // we want to precalculate indices and weights shared by all channels, + // this is the key point of optimization + std::vector> pre_calc( + roi_bin_grid_h * roi_bin_grid_w * pooled_width * pooled_height); + pre_calc_for_bilinear_interpolate( + height, + width, + pooled_height, + pooled_width, + roi_bin_grid_h, + roi_bin_grid_w, + roi_start_h, + roi_start_w, + bin_size_h, + bin_size_w, + roi_bin_grid_h, + roi_bin_grid_w, + pre_calc); + + for (int c = 0; c < channels; c++) { + int index_n_c = index_n + c * pooled_width * pooled_height; + const T* offset_input = + input + (roi_batch_ind * channels + c) * height * width; + int pre_calc_index = 0; + + for (int ph = 0; ph < pooled_height; ph++) { + for (int pw = 0; pw < pooled_width; pw++) { + int index = index_n_c + ph * pooled_width + pw; + + T output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + PreCalc pc = pre_calc[pre_calc_index]; + output_val += pc.w1 * offset_input[pc.pos1] + + pc.w2 * offset_input[pc.pos2] + + pc.w3 * offset_input[pc.pos3] + pc.w4 * offset_input[pc.pos4]; + + pre_calc_index += 1; + } + } + output_val /= count; + + output[index] = output_val; + } // for pw + } // for ph + } // for c + } // for n +} + +template +void bilinear_interpolate_gradient( + const int height, + const int width, + T y, + T x, + T& w1, + T& w2, + T& w3, + T& w4, + int& x_low, + int& x_high, + int& y_low, + int& y_high, + const int index /* index for debug only*/) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + w1 = w2 = w3 = w4 = 0.; + x_low = x_high = y_low = y_high = -1; + return; + } + + if (y <= 0) + y = 0; + if (x <= 0) + x = 0; + + y_low = (int)y; + x_low = (int)x; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + + // reference in forward + // T v1 = input[y_low * width + x_low]; + // T v2 = input[y_low * width + x_high]; + // T v3 = input[y_high * width + x_low]; + // T v4 = input[y_high * width + x_high]; + // T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + return; +} + +template +inline void add(T* address, const T& val) { + *address += val; +} + +template +void ROIAlignBackward( + const int nthreads, + // may not be contiguous, and should be indexed using n_stride, etc + const T* grad_output, + const T& spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + T* grad_input, + const T* rois, + const int n_stride, + const int c_stride, + const int h_stride, + const int w_stride, + bool aligned) { + for (int index = 0; index < nthreads; index++) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* offset_rois = rois + n * 5; + int roi_batch_ind = offset_rois[0]; + + // Do not use rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + T roi_start_w = offset_rois[1] * spatial_scale - offset; + T roi_start_h = offset_rois[2] * spatial_scale - offset; + T roi_end_w = offset_rois[3] * spatial_scale - offset; + T roi_end_h = offset_rois[4] * spatial_scale - offset; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + if (aligned) { + AT_ASSERTM( + roi_width >= 0 && roi_height >= 0, + "ROIs in ROIAlign do not have non-negative size!"); + } else { // for backward-compatibility only + roi_width = std::max(roi_width, (T)1.); + roi_height = std::max(roi_height, (T)1.); + } + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + T* offset_grad_input = + grad_input + ((roi_batch_ind * channels + c) * height * width); + + int output_offset = n * n_stride + c * c_stride; + const T* offset_grad_output = grad_output + output_offset; + const T grad_output_this_bin = + offset_grad_output[ph * h_stride + pw * w_stride]; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // We do average (integral) pooling inside a bin + const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient( + height, + width, + y, + x, + w1, + w2, + w3, + w4, + x_low, + x_high, + y_low, + y_high, + index); + + T g1 = grad_output_this_bin * w1 / count; + T g2 = grad_output_this_bin * w2 / count; + T g3 = grad_output_this_bin * w3 / count; + T g4 = grad_output_this_bin * w4 / count; + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + // atomic add is not needed for now since it is single threaded + add(offset_grad_input + y_low * width + x_low, static_cast(g1)); + add(offset_grad_input + y_low * width + x_high, static_cast(g2)); + add(offset_grad_input + y_high * width + x_low, static_cast(g3)); + add(offset_grad_input + y_high * width + x_high, static_cast(g4)); + } // if + } // ix + } // iy + } // for +} // ROIAlignBackward + +} // namespace + +namespace detectron2 { + +at::Tensor ROIAlign_forward_cpu( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + bool aligned) { + AT_ASSERTM(input.device().is_cpu(), "input must be a CPU tensor"); + AT_ASSERTM(rois.device().is_cpu(), "rois must be a CPU tensor"); + + at::TensorArg input_t{input, "input", 1}, rois_t{rois, "rois", 2}; + + at::CheckedFrom c = "ROIAlign_forward_cpu"; + at::checkAllSameType(c, {input_t, rois_t}); + + auto num_rois = rois.size(0); + auto channels = input.size(1); + auto height = input.size(2); + auto width = input.size(3); + + at::Tensor output = at::zeros( + {num_rois, channels, pooled_height, pooled_width}, input.options()); + + auto output_size = num_rois * pooled_height * pooled_width * channels; + + if (output.numel() == 0) + return output; + + auto input_ = input.contiguous(), rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + input.scalar_type(), "ROIAlign_forward", [&] { + ROIAlignForward( + output_size, + input_.data_ptr(), + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + rois_.data_ptr(), + output.data_ptr(), + aligned); + }); + return output; +} + +at::Tensor ROIAlign_backward_cpu( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio, + bool aligned) { + AT_ASSERTM(grad.device().is_cpu(), "grad must be a CPU tensor"); + AT_ASSERTM(rois.device().is_cpu(), "rois must be a CPU tensor"); + + at::TensorArg grad_t{grad, "grad", 1}, rois_t{rois, "rois", 2}; + + at::CheckedFrom c = "ROIAlign_backward_cpu"; + at::checkAllSameType(c, {grad_t, rois_t}); + + at::Tensor grad_input = + at::zeros({batch_size, channels, height, width}, grad.options()); + + // handle possibly empty gradients + if (grad.numel() == 0) { + return grad_input; + } + + // get stride values to ensure indexing into gradients is correct. + int n_stride = grad.stride(0); + int c_stride = grad.stride(1); + int h_stride = grad.stride(2); + int w_stride = grad.stride(3); + + auto rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + grad.scalar_type(), "ROIAlign_forward", [&] { + ROIAlignBackward( + grad.numel(), + grad.data_ptr(), + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + grad_input.data_ptr(), + rois_.data_ptr(), + n_stride, + c_stride, + h_stride, + w_stride, + aligned); + }); + return grad_input; +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cuda.cu b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cuda.cu new file mode 100644 index 0000000..2e05953 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlign/ROIAlign_cuda.cu @@ -0,0 +1,430 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include +#include +#include +#include + +// TODO make it in a common file +#define CUDA_1D_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ + i += blockDim.x * gridDim.x) + +template +__device__ T bilinear_interpolate( + const T* bottom_data, + const int height, + const int width, + T y, + T x, + const int index /* index for debug only*/) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + return 0; + } + + if (y <= 0) + y = 0; + if (x <= 0) + x = 0; + + int y_low = (int)y; + int x_low = (int)x; + int y_high; + int x_high; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + // do bilinear interpolation + T v1 = bottom_data[y_low * width + x_low]; + T v2 = bottom_data[y_low * width + x_high]; + T v3 = bottom_data[y_high * width + x_low]; + T v4 = bottom_data[y_high * width + x_high]; + T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + return val; +} + +template +__global__ void RoIAlignForward( + const int nthreads, + const T* bottom_data, + const T spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + const T* bottom_rois, + T* top_data, + bool aligned) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* offset_bottom_rois = bottom_rois + n * 5; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not use rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + T roi_start_w = offset_bottom_rois[1] * spatial_scale - offset; + T roi_start_h = offset_bottom_rois[2] * spatial_scale - offset; + T roi_end_w = offset_bottom_rois[3] * spatial_scale - offset; + T roi_end_h = offset_bottom_rois[4] * spatial_scale - offset; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + if (!aligned) { // for backward-compatibility only + roi_width = max(roi_width, (T)1.); + roi_height = max(roi_height, (T)1.); + } + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + const T* offset_bottom_data = + bottom_data + (roi_batch_ind * channels + c) * height * width; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // We do average (integral) pooling inside a bin + // When the grid is empty, output zeros == 0/1, instead of NaN. + const T count = max(roi_bin_grid_h * roi_bin_grid_w, 1); // e.g. = 4 + + T output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) // e.g., iy = 0, 1 + { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T val = bilinear_interpolate( + offset_bottom_data, height, width, y, x, index); + output_val += val; + } + } + output_val /= count; + + top_data[index] = output_val; + } +} + +template +__device__ void bilinear_interpolate_gradient( + const int height, + const int width, + T y, + T x, + T& w1, + T& w2, + T& w3, + T& w4, + int& x_low, + int& x_high, + int& y_low, + int& y_high, + const int index /* index for debug only*/) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + w1 = w2 = w3 = w4 = 0.; + x_low = x_high = y_low = y_high = -1; + return; + } + + if (y <= 0) + y = 0; + if (x <= 0) + x = 0; + + y_low = (int)y; + x_low = (int)x; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + + // reference in forward + // T v1 = bottom_data[y_low * width + x_low]; + // T v2 = bottom_data[y_low * width + x_high]; + // T v3 = bottom_data[y_high * width + x_low]; + // T v4 = bottom_data[y_high * width + x_high]; + // T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + return; +} + +template +__global__ void RoIAlignBackwardFeature( + const int nthreads, + const T* top_diff, + const int num_rois, + const T spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + T* bottom_diff, + const T* bottom_rois, + bool aligned) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* offset_bottom_rois = bottom_rois + n * 5; + int roi_batch_ind = offset_bottom_rois[0]; + + // Do not use rounding; this implementation detail is critical + T offset = aligned ? (T)0.5 : (T)0.0; + T roi_start_w = offset_bottom_rois[1] * spatial_scale - offset; + T roi_start_h = offset_bottom_rois[2] * spatial_scale - offset; + T roi_end_w = offset_bottom_rois[3] * spatial_scale - offset; + T roi_end_h = offset_bottom_rois[4] * spatial_scale - offset; + + T roi_width = roi_end_w - roi_start_w; + T roi_height = roi_end_h - roi_start_h; + if (!aligned) { // for backward-compatibility only + roi_width = max(roi_width, (T)1.); + roi_height = max(roi_height, (T)1.); + } + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + T* offset_bottom_diff = + bottom_diff + (roi_batch_ind * channels + c) * height * width; + + int top_offset = (n * channels + c) * pooled_height * pooled_width; + const T* offset_top_diff = top_diff + top_offset; + const T top_diff_this_bin = offset_top_diff[ph * pooled_width + pw]; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // We do average (integral) pooling inside a bin + const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) // e.g., iy = 0, 1 + { + const T y = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T x = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient( + height, + width, + y, + x, + w1, + w2, + w3, + w4, + x_low, + x_high, + y_low, + y_high, + index); + + T g1 = top_diff_this_bin * w1 / count; + T g2 = top_diff_this_bin * w2 / count; + T g3 = top_diff_this_bin * w3 / count; + T g4 = top_diff_this_bin * w4 / count; + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd( + offset_bottom_diff + y_low * width + x_low, static_cast(g1)); + atomicAdd( + offset_bottom_diff + y_low * width + x_high, static_cast(g2)); + atomicAdd( + offset_bottom_diff + y_high * width + x_low, static_cast(g3)); + atomicAdd( + offset_bottom_diff + y_high * width + x_high, static_cast(g4)); + } // if + } // ix + } // iy + } // CUDA_1D_KERNEL_LOOP +} // RoIAlignBackward + +namespace detectron2 { + +at::Tensor ROIAlign_forward_cuda( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + bool aligned) { + AT_ASSERTM(input.device().is_cuda(), "input must be a CUDA tensor"); + AT_ASSERTM(rois.device().is_cuda(), "rois must be a CUDA tensor"); + at::TensorArg input_t{input, "input", 1}, rois_t{rois, "rois", 2}; + + at::CheckedFrom c = "ROIAlign_forward_cuda"; + at::checkAllSameGPU(c, {input_t, rois_t}); + at::checkAllSameType(c, {input_t, rois_t}); + at::cuda::CUDAGuard device_guard(input.device()); + + auto num_rois = rois.size(0); + auto channels = input.size(1); + auto height = input.size(2); + auto width = input.size(3); + + auto output = at::empty( + {num_rois, channels, pooled_height, pooled_width}, input.options()); + auto output_size = num_rois * pooled_height * pooled_width * channels; + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + dim3 grid(std::min( + at::cuda::ATenCeilDiv( + static_cast(output_size), static_cast(512)), + static_cast(4096))); + dim3 block(512); + + if (output.numel() == 0) { + AT_CUDA_CHECK(cudaGetLastError()); + return output; + } + + auto input_ = input.contiguous(), rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "ROIAlign_forward", [&] { + RoIAlignForward<<>>( + output_size, + input_.data_ptr(), + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + rois_.data_ptr(), + output.data_ptr(), + aligned); + }); + cudaDeviceSynchronize(); + AT_CUDA_CHECK(cudaGetLastError()); + return output; +} + +// TODO remove the dependency on input and use instead its sizes -> save memory +at::Tensor ROIAlign_backward_cuda( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio, + bool aligned) { + AT_ASSERTM(grad.device().is_cuda(), "grad must be a CUDA tensor"); + AT_ASSERTM(rois.device().is_cuda(), "rois must be a CUDA tensor"); + + at::TensorArg grad_t{grad, "grad", 1}, rois_t{rois, "rois", 2}; + at::CheckedFrom c = "ROIAlign_backward_cuda"; + at::checkAllSameGPU(c, {grad_t, rois_t}); + at::checkAllSameType(c, {grad_t, rois_t}); + at::cuda::CUDAGuard device_guard(grad.device()); + + auto num_rois = rois.size(0); + auto grad_input = + at::zeros({batch_size, channels, height, width}, grad.options()); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + dim3 grid(std::min( + at::cuda::ATenCeilDiv( + static_cast(grad.numel()), static_cast(512)), + static_cast(4096))); + dim3 block(512); + + // handle possibly empty gradients + if (grad.numel() == 0) { + AT_CUDA_CHECK(cudaGetLastError()); + return grad_input; + } + + auto grad_ = grad.contiguous(), rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES(grad.scalar_type(), "ROIAlign_backward", [&] { + RoIAlignBackwardFeature<<>>( + grad.numel(), + grad_.data_ptr(), + num_rois, + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + grad_input.data_ptr(), + rois_.data_ptr(), + aligned); + }); + AT_CUDA_CHECK(cudaGetLastError()); + return grad_input; +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated.h b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated.h new file mode 100644 index 0000000..a99c8eb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated.h @@ -0,0 +1,115 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#pragma once +#include + +namespace detectron2 { + +at::Tensor ROIAlignRotated_forward_cpu( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio); + +at::Tensor ROIAlignRotated_backward_cpu( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio); + +#ifdef WITH_CUDA +at::Tensor ROIAlignRotated_forward_cuda( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio); + +at::Tensor ROIAlignRotated_backward_cuda( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio); +#endif + +// Interface for Python +inline at::Tensor ROIAlignRotated_forward( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio) { + if (input.is_cuda()) { +#ifdef WITH_CUDA + return ROIAlignRotated_forward_cuda( + input, + rois, + spatial_scale, + pooled_height, + pooled_width, + sampling_ratio); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + return ROIAlignRotated_forward_cpu( + input, rois, spatial_scale, pooled_height, pooled_width, sampling_ratio); +} + +inline at::Tensor ROIAlignRotated_backward( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio) { + if (grad.is_cuda()) { +#ifdef WITH_CUDA + return ROIAlignRotated_backward_cuda( + grad, + rois, + spatial_scale, + pooled_height, + pooled_width, + batch_size, + channels, + height, + width, + sampling_ratio); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + return ROIAlignRotated_backward_cpu( + grad, + rois, + spatial_scale, + pooled_height, + pooled_width, + batch_size, + channels, + height, + width, + sampling_ratio); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cpu.cpp b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cpu.cpp new file mode 100644 index 0000000..7e5e1ff --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cpu.cpp @@ -0,0 +1,522 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include +#include "ROIAlignRotated.h" + +// Note: this implementation originates from the Caffe2 ROIAlignRotated Op +// and PyTorch ROIAlign (non-rotated) Op implementations. +// The key difference between this implementation and those ones is +// we don't do "legacy offset" in this version, as there aren't many previous +// works, if any, using the "legacy" ROIAlignRotated Op. +// This would make the interface a bit cleaner. + +namespace detectron2 { + +namespace { +template +struct PreCalc { + int pos1; + int pos2; + int pos3; + int pos4; + T w1; + T w2; + T w3; + T w4; +}; + +template +void pre_calc_for_bilinear_interpolate( + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int iy_upper, + const int ix_upper, + T roi_start_h, + T roi_start_w, + T bin_size_h, + T bin_size_w, + int roi_bin_grid_h, + int roi_bin_grid_w, + T roi_center_h, + T roi_center_w, + T cos_theta, + T sin_theta, + std::vector>& pre_calc) { + int pre_calc_index = 0; + for (int ph = 0; ph < pooled_height; ph++) { + for (int pw = 0; pw < pooled_width; pw++) { + for (int iy = 0; iy < iy_upper; iy++) { + const T yy = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < ix_upper; ix++) { + const T xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta around the center and translate + // In image space, (y, x) is the order for Right Handed System, + // and this is essentially multiplying the point by a rotation matrix + // to rotate it counterclockwise through angle theta. + T y = yy * cos_theta - xx * sin_theta + roi_center_h; + T x = yy * sin_theta + xx * cos_theta + roi_center_w; + // deal with: inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + PreCalc pc; + pc.pos1 = 0; + pc.pos2 = 0; + pc.pos3 = 0; + pc.pos4 = 0; + pc.w1 = 0; + pc.w2 = 0; + pc.w3 = 0; + pc.w4 = 0; + pre_calc[pre_calc_index] = pc; + pre_calc_index += 1; + continue; + } + + if (y < 0) { + y = 0; + } + if (x < 0) { + x = 0; + } + + int y_low = (int)y; + int x_low = (int)x; + int y_high; + int x_high; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + // save weights and indices + PreCalc pc; + pc.pos1 = y_low * width + x_low; + pc.pos2 = y_low * width + x_high; + pc.pos3 = y_high * width + x_low; + pc.pos4 = y_high * width + x_high; + pc.w1 = w1; + pc.w2 = w2; + pc.w3 = w3; + pc.w4 = w4; + pre_calc[pre_calc_index] = pc; + + pre_calc_index += 1; + } + } + } + } +} + +template +void bilinear_interpolate_gradient( + const int height, + const int width, + T y, + T x, + T& w1, + T& w2, + T& w3, + T& w4, + int& x_low, + int& x_high, + int& y_low, + int& y_high) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + w1 = w2 = w3 = w4 = 0.; + x_low = x_high = y_low = y_high = -1; + return; + } + + if (y < 0) { + y = 0; + } + + if (x < 0) { + x = 0; + } + + y_low = (int)y; + x_low = (int)x; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + + // reference in forward + // T v1 = input[y_low * width + x_low]; + // T v2 = input[y_low * width + x_high]; + // T v3 = input[y_high * width + x_low]; + // T v4 = input[y_high * width + x_high]; + // T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + return; +} + +template +inline void add(T* address, const T& val) { + *address += val; +} + +} // namespace + +template +void ROIAlignRotatedForward( + const int nthreads, + const T* input, + const T& spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + const T* rois, + T* output) { + int n_rois = nthreads / channels / pooled_width / pooled_height; + // (n, c, ph, pw) is an element in the pooled output + // can be parallelized using omp + // #pragma omp parallel for num_threads(32) + for (int n = 0; n < n_rois; n++) { + int index_n = n * channels * pooled_width * pooled_height; + + const T* current_roi = rois + n * 6; + int roi_batch_ind = current_roi[0]; + + // Do not use rounding; this implementation detail is critical + // ROIAlignRotated supports align == true, i.e., continuous coordinate + // by default, thus the 0.5 offset + T offset = (T)0.5; + T roi_center_w = current_roi[1] * spatial_scale - offset; + T roi_center_h = current_roi[2] * spatial_scale - offset; + T roi_width = current_roi[3] * spatial_scale; + T roi_height = current_roi[4] * spatial_scale; + T theta = current_roi[5] * M_PI / 180.0; + T cos_theta = cos(theta); + T sin_theta = sin(theta); + + AT_ASSERTM( + roi_width >= 0 && roi_height >= 0, + "ROIs in ROIAlignRotated do not have non-negative size!"); + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // We do average (integral) pooling inside a bin + const T count = std::max(roi_bin_grid_h * roi_bin_grid_w, 1); // e.g. = 4 + + // we want to precalculate indices and weights shared by all channels, + // this is the key point of optimization + std::vector> pre_calc( + roi_bin_grid_h * roi_bin_grid_w * pooled_width * pooled_height); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + T roi_start_h = -roi_height / 2.0; + T roi_start_w = -roi_width / 2.0; + + pre_calc_for_bilinear_interpolate( + height, + width, + pooled_height, + pooled_width, + roi_bin_grid_h, + roi_bin_grid_w, + roi_start_h, + roi_start_w, + bin_size_h, + bin_size_w, + roi_bin_grid_h, + roi_bin_grid_w, + roi_center_h, + roi_center_w, + cos_theta, + sin_theta, + pre_calc); + + for (int c = 0; c < channels; c++) { + int index_n_c = index_n + c * pooled_width * pooled_height; + const T* offset_input = + input + (roi_batch_ind * channels + c) * height * width; + int pre_calc_index = 0; + + for (int ph = 0; ph < pooled_height; ph++) { + for (int pw = 0; pw < pooled_width; pw++) { + int index = index_n_c + ph * pooled_width + pw; + + T output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + PreCalc pc = pre_calc[pre_calc_index]; + output_val += pc.w1 * offset_input[pc.pos1] + + pc.w2 * offset_input[pc.pos2] + + pc.w3 * offset_input[pc.pos3] + pc.w4 * offset_input[pc.pos4]; + + pre_calc_index += 1; + } + } + output_val /= count; + + output[index] = output_val; + } // for pw + } // for ph + } // for c + } // for n +} + +template +void ROIAlignRotatedBackward( + const int nthreads, + // may not be contiguous. should index using n_stride, etc + const T* grad_output, + const T& spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + T* grad_input, + const T* rois, + const int n_stride, + const int c_stride, + const int h_stride, + const int w_stride) { + for (int index = 0; index < nthreads; index++) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* current_roi = rois + n * 6; + int roi_batch_ind = current_roi[0]; + + // Do not use rounding; this implementation detail is critical + // ROIAlignRotated supports align == true, i.e., continuous coordinate + // by default, thus the 0.5 offset + T offset = (T)0.5; + T roi_center_w = current_roi[1] * spatial_scale - offset; + T roi_center_h = current_roi[2] * spatial_scale - offset; + T roi_width = current_roi[3] * spatial_scale; + T roi_height = current_roi[4] * spatial_scale; + T theta = current_roi[5] * M_PI / 180.0; + T cos_theta = cos(theta); + T sin_theta = sin(theta); + + AT_ASSERTM( + roi_width >= 0 && roi_height >= 0, + "ROIs in ROIAlignRotated do not have non-negative size!"); + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + T* offset_grad_input = + grad_input + ((roi_batch_ind * channels + c) * height * width); + + int output_offset = n * n_stride + c * c_stride; + const T* offset_grad_output = grad_output + output_offset; + const T grad_output_this_bin = + offset_grad_output[ph * h_stride + pw * w_stride]; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + T roi_start_h = -roi_height / 2.0; + T roi_start_w = -roi_width / 2.0; + + // We do average (integral) pooling inside a bin + const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) { + const T yy = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta around the center and translate + T y = yy * cos_theta - xx * sin_theta + roi_center_h; + T x = yy * sin_theta + xx * cos_theta + roi_center_w; + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient( + height, width, y, x, w1, w2, w3, w4, x_low, x_high, y_low, y_high); + + T g1 = grad_output_this_bin * w1 / count; + T g2 = grad_output_this_bin * w2 / count; + T g3 = grad_output_this_bin * w3 / count; + T g4 = grad_output_this_bin * w4 / count; + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + // atomic add is not needed for now since it is single threaded + add(offset_grad_input + y_low * width + x_low, static_cast(g1)); + add(offset_grad_input + y_low * width + x_high, static_cast(g2)); + add(offset_grad_input + y_high * width + x_low, static_cast(g3)); + add(offset_grad_input + y_high * width + x_high, static_cast(g4)); + } // if + } // ix + } // iy + } // for +} // ROIAlignRotatedBackward + +at::Tensor ROIAlignRotated_forward_cpu( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio) { + AT_ASSERTM(input.device().is_cpu(), "input must be a CPU tensor"); + AT_ASSERTM(rois.device().is_cpu(), "rois must be a CPU tensor"); + + at::TensorArg input_t{input, "input", 1}, rois_t{rois, "rois", 2}; + + at::CheckedFrom c = "ROIAlign_forward_cpu"; + at::checkAllSameType(c, {input_t, rois_t}); + + auto num_rois = rois.size(0); + auto channels = input.size(1); + auto height = input.size(2); + auto width = input.size(3); + + at::Tensor output = at::zeros( + {num_rois, channels, pooled_height, pooled_width}, input.options()); + + auto output_size = num_rois * pooled_height * pooled_width * channels; + + if (output.numel() == 0) { + return output; + } + + auto input_ = input.contiguous(), rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + input.scalar_type(), "ROIAlignRotated_forward", [&] { + ROIAlignRotatedForward( + output_size, + input_.data_ptr(), + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + rois_.data_ptr(), + output.data_ptr()); + }); + return output; +} + +at::Tensor ROIAlignRotated_backward_cpu( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio) { + AT_ASSERTM(grad.device().is_cpu(), "grad must be a CPU tensor"); + AT_ASSERTM(rois.device().is_cpu(), "rois must be a CPU tensor"); + + at::TensorArg grad_t{grad, "grad", 1}, rois_t{rois, "rois", 2}; + + at::CheckedFrom c = "ROIAlignRotated_backward_cpu"; + at::checkAllSameType(c, {grad_t, rois_t}); + + at::Tensor grad_input = + at::zeros({batch_size, channels, height, width}, grad.options()); + + // handle possibly empty gradients + if (grad.numel() == 0) { + return grad_input; + } + + // get stride values to ensure indexing into gradients is correct. + int n_stride = grad.stride(0); + int c_stride = grad.stride(1); + int h_stride = grad.stride(2); + int w_stride = grad.stride(3); + + auto rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + grad.scalar_type(), "ROIAlignRotated_forward", [&] { + ROIAlignRotatedBackward( + grad.numel(), + grad.data_ptr(), + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + grad_input.data_ptr(), + rois_.data_ptr(), + n_stride, + c_stride, + h_stride, + w_stride); + }); + return grad_input; +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cuda.cu b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cuda.cu new file mode 100644 index 0000000..9c376fc --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/ROIAlignRotated/ROIAlignRotated_cuda.cu @@ -0,0 +1,443 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include +#include +#include +#include + +// TODO make it in a common file +#define CUDA_1D_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ + i += blockDim.x * gridDim.x) + +// Note: this implementation originates from the Caffe2 ROIAlignRotated Op +// and PyTorch ROIAlign (non-rotated) Op implementations. +// The key difference between this implementation and those ones is +// we don't do "legacy offset" in this version, as there aren't many previous +// works, if any, using the "legacy" ROIAlignRotated Op. +// This would make the interface a bit cleaner. + +namespace detectron2 { + +namespace { + +template +__device__ T bilinear_interpolate( + const T* input, + const int height, + const int width, + T y, + T x) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + return 0; + } + + if (y < 0) { + y = 0; + } + + if (x < 0) { + x = 0; + } + + int y_low = (int)y; + int x_low = (int)x; + int y_high; + int x_high; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + // do bilinear interpolation + T v1 = input[y_low * width + x_low]; + T v2 = input[y_low * width + x_high]; + T v3 = input[y_high * width + x_low]; + T v4 = input[y_high * width + x_high]; + T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + return val; +} + +template +__device__ void bilinear_interpolate_gradient( + const int height, + const int width, + T y, + T x, + T& w1, + T& w2, + T& w3, + T& w4, + int& x_low, + int& x_high, + int& y_low, + int& y_high) { + // deal with cases that inverse elements are out of feature map boundary + if (y < -1.0 || y > height || x < -1.0 || x > width) { + // empty + w1 = w2 = w3 = w4 = 0.; + x_low = x_high = y_low = y_high = -1; + return; + } + + if (y < 0) { + y = 0; + } + + if (x < 0) { + x = 0; + } + + y_low = (int)y; + x_low = (int)x; + + if (y_low >= height - 1) { + y_high = y_low = height - 1; + y = (T)y_low; + } else { + y_high = y_low + 1; + } + + if (x_low >= width - 1) { + x_high = x_low = width - 1; + x = (T)x_low; + } else { + x_high = x_low + 1; + } + + T ly = y - y_low; + T lx = x - x_low; + T hy = 1. - ly, hx = 1. - lx; + + // reference in forward + // T v1 = input[y_low * width + x_low]; + // T v2 = input[y_low * width + x_high]; + // T v3 = input[y_high * width + x_low]; + // T v4 = input[y_high * width + x_high]; + // T val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + + w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx; + + return; +} + +} // namespace + +template +__global__ void RoIAlignRotatedForward( + const int nthreads, + const T* input, + const T spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + const T* rois, + T* top_data) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* current_roi = rois + n * 6; + int roi_batch_ind = current_roi[0]; + + // Do not use rounding; this implementation detail is critical + // ROIAlignRotated supports align == true, i.e., continuous coordinate + // by default, thus the 0.5 offset + T offset = (T)0.5; + T roi_center_w = current_roi[1] * spatial_scale - offset; + T roi_center_h = current_roi[2] * spatial_scale - offset; + T roi_width = current_roi[3] * spatial_scale; + T roi_height = current_roi[4] * spatial_scale; + T theta = current_roi[5] * M_PI / 180.0; + T cos_theta = cos(theta); + T sin_theta = sin(theta); + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + const T* offset_input = + input + (roi_batch_ind * channels + c) * height * width; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + T roi_start_h = -roi_height / 2.0; + T roi_start_w = -roi_width / 2.0; + + // We do average (inte gral) pooling inside a bin + const T count = max(roi_bin_grid_h * roi_bin_grid_w, 1); // e.g. = 4 + + T output_val = 0.; + for (int iy = 0; iy < roi_bin_grid_h; iy++) // e.g., iy = 0, 1 + { + const T yy = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta around the center and translate + T y = yy * cos_theta - xx * sin_theta + roi_center_h; + T x = yy * sin_theta + xx * cos_theta + roi_center_w; + + T val = bilinear_interpolate(offset_input, height, width, y, x); + output_val += val; + } + } + output_val /= count; + + top_data[index] = output_val; + } +} + +template +__global__ void RoIAlignRotatedBackwardFeature( + const int nthreads, + const T* top_diff, + const int num_rois, + const T spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + T* bottom_diff, + const T* rois) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + // (n, c, ph, pw) is an element in the pooled output + int pw = index % pooled_width; + int ph = (index / pooled_width) % pooled_height; + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + + const T* current_roi = rois + n * 6; + int roi_batch_ind = current_roi[0]; + + // Do not use rounding; this implementation detail is critical + // ROIAlignRotated supports align == true, i.e., continuous coordinate + // by default, thus the 0.5 offset + T offset = (T)0.5; + T roi_center_w = current_roi[1] * spatial_scale - offset; + T roi_center_h = current_roi[2] * spatial_scale - offset; + T roi_width = current_roi[3] * spatial_scale; + T roi_height = current_roi[4] * spatial_scale; + T theta = current_roi[5] * M_PI / 180.0; + T cos_theta = cos(theta); + T sin_theta = sin(theta); + + T bin_size_h = static_cast(roi_height) / static_cast(pooled_height); + T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); + + T* offset_bottom_diff = + bottom_diff + (roi_batch_ind * channels + c) * height * width; + + int top_offset = (n * channels + c) * pooled_height * pooled_width; + const T* offset_top_diff = top_diff + top_offset; + const T top_diff_this_bin = offset_top_diff[ph * pooled_width + pw]; + + // We use roi_bin_grid to sample the grid and mimic integral + int roi_bin_grid_h = (sampling_ratio > 0) + ? sampling_ratio + : ceil(roi_height / pooled_height); // e.g., = 2 + int roi_bin_grid_w = + (sampling_ratio > 0) ? sampling_ratio : ceil(roi_width / pooled_width); + + // roi_start_h and roi_start_w are computed wrt the center of RoI (x, y). + // Appropriate translation needs to be applied after. + T roi_start_h = -roi_height / 2.0; + T roi_start_w = -roi_width / 2.0; + + // We do average (integral) pooling inside a bin + const T count = roi_bin_grid_h * roi_bin_grid_w; // e.g. = 4 + + for (int iy = 0; iy < roi_bin_grid_h; iy++) // e.g., iy = 0, 1 + { + const T yy = roi_start_h + ph * bin_size_h + + static_cast(iy + .5f) * bin_size_h / + static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + for (int ix = 0; ix < roi_bin_grid_w; ix++) { + const T xx = roi_start_w + pw * bin_size_w + + static_cast(ix + .5f) * bin_size_w / + static_cast(roi_bin_grid_w); + + // Rotate by theta around the center and translate + T y = yy * cos_theta - xx * sin_theta + roi_center_h; + T x = yy * sin_theta + xx * cos_theta + roi_center_w; + + T w1, w2, w3, w4; + int x_low, x_high, y_low, y_high; + + bilinear_interpolate_gradient( + height, width, y, x, w1, w2, w3, w4, x_low, x_high, y_low, y_high); + + T g1 = top_diff_this_bin * w1 / count; + T g2 = top_diff_this_bin * w2 / count; + T g3 = top_diff_this_bin * w3 / count; + T g4 = top_diff_this_bin * w4 / count; + + if (x_low >= 0 && x_high >= 0 && y_low >= 0 && y_high >= 0) { + atomicAdd( + offset_bottom_diff + y_low * width + x_low, static_cast(g1)); + atomicAdd( + offset_bottom_diff + y_low * width + x_high, static_cast(g2)); + atomicAdd( + offset_bottom_diff + y_high * width + x_low, static_cast(g3)); + atomicAdd( + offset_bottom_diff + y_high * width + x_high, static_cast(g4)); + } // if + } // ix + } // iy + } // CUDA_1D_KERNEL_LOOP +} // RoIAlignRotatedBackward + +at::Tensor ROIAlignRotated_forward_cuda( + const at::Tensor& input, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int sampling_ratio) { + AT_ASSERTM(input.device().is_cuda(), "input must be a CUDA tensor"); + AT_ASSERTM(rois.device().is_cuda(), "rois must be a CUDA tensor"); + at::TensorArg input_t{input, "input", 1}, rois_t{rois, "rois", 2}; + + at::CheckedFrom c = "ROIAlignRotated_forward_cuda"; + at::checkAllSameGPU(c, {input_t, rois_t}); + at::checkAllSameType(c, {input_t, rois_t}); + at::cuda::CUDAGuard device_guard(input.device()); + + auto num_rois = rois.size(0); + auto channels = input.size(1); + auto height = input.size(2); + auto width = input.size(3); + + auto output = at::empty( + {num_rois, channels, pooled_height, pooled_width}, input.options()); + auto output_size = num_rois * pooled_height * pooled_width * channels; + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + dim3 grid(std::min( + at::cuda::ATenCeilDiv( + static_cast(output_size), static_cast(512)), + static_cast(4096))); + dim3 block(512); + + if (output.numel() == 0) { + AT_CUDA_CHECK(cudaGetLastError()); + return output; + } + + auto input_ = input.contiguous(), rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES( + input.scalar_type(), "ROIAlignRotated_forward", [&] { + RoIAlignRotatedForward<<>>( + output_size, + input_.data_ptr(), + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + rois_.data_ptr(), + output.data_ptr()); + }); + cudaDeviceSynchronize(); + AT_CUDA_CHECK(cudaGetLastError()); + return output; +} + +// TODO remove the dependency on input and use instead its sizes -> save memory +at::Tensor ROIAlignRotated_backward_cuda( + const at::Tensor& grad, + const at::Tensor& rois, + const float spatial_scale, + const int pooled_height, + const int pooled_width, + const int batch_size, + const int channels, + const int height, + const int width, + const int sampling_ratio) { + AT_ASSERTM(grad.device().is_cuda(), "grad must be a CUDA tensor"); + AT_ASSERTM(rois.device().is_cuda(), "rois must be a CUDA tensor"); + + at::TensorArg grad_t{grad, "grad", 1}, rois_t{rois, "rois", 2}; + at::CheckedFrom c = "ROIAlign_backward_cuda"; + at::checkAllSameGPU(c, {grad_t, rois_t}); + at::checkAllSameType(c, {grad_t, rois_t}); + at::cuda::CUDAGuard device_guard(grad.device()); + + auto num_rois = rois.size(0); + auto grad_input = + at::zeros({batch_size, channels, height, width}, grad.options()); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + dim3 grid(std::min( + at::cuda::ATenCeilDiv( + static_cast(grad.numel()), static_cast(512)), + static_cast(4096))); + dim3 block(512); + + // handle possibly empty gradients + if (grad.numel() == 0) { + AT_CUDA_CHECK(cudaGetLastError()); + return grad_input; + } + + auto grad_ = grad.contiguous(), rois_ = rois.contiguous(); + AT_DISPATCH_FLOATING_TYPES( + grad.scalar_type(), "ROIAlignRotated_backward", [&] { + RoIAlignRotatedBackwardFeature<<>>( + grad.numel(), + grad_.data_ptr(), + num_rois, + spatial_scale, + channels, + height, + width, + pooled_height, + pooled_width, + sampling_ratio, + grad_input.data_ptr(), + rois_.data_ptr()); + }); + AT_CUDA_CHECK(cudaGetLastError()); + return grad_input; +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated.h b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated.h new file mode 100644 index 0000000..7c389c6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated.h @@ -0,0 +1,35 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#pragma once +#include + +namespace detectron2 { + +at::Tensor box_iou_rotated_cpu( + const at::Tensor& boxes1, + const at::Tensor& boxes2); + +#ifdef WITH_CUDA +at::Tensor box_iou_rotated_cuda( + const at::Tensor& boxes1, + const at::Tensor& boxes2); +#endif + +// Interface for Python +// inline is needed to prevent multiple function definitions when this header is +// included by different cpps +inline at::Tensor box_iou_rotated( + const at::Tensor& boxes1, + const at::Tensor& boxes2) { + assert(boxes1.device().is_cuda() == boxes2.device().is_cuda()); + if (boxes1.device().is_cuda()) { +#ifdef WITH_CUDA + return box_iou_rotated_cuda(boxes1.contiguous(), boxes2.contiguous()); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + + return box_iou_rotated_cpu(boxes1.contiguous(), boxes2.contiguous()); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cpu.cpp b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cpu.cpp new file mode 100644 index 0000000..f2b02d1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cpu.cpp @@ -0,0 +1,39 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include "box_iou_rotated.h" +#include "box_iou_rotated_utils.h" + +namespace detectron2 { + +template +void box_iou_rotated_cpu_kernel( + const at::Tensor& boxes1, + const at::Tensor& boxes2, + at::Tensor& ious) { + auto num_boxes1 = boxes1.size(0); + auto num_boxes2 = boxes2.size(0); + + for (int i = 0; i < num_boxes1; i++) { + for (int j = 0; j < num_boxes2; j++) { + ious[i * num_boxes2 + j] = single_box_iou_rotated( + boxes1[i].data_ptr(), boxes2[j].data_ptr()); + } + } +} + +at::Tensor box_iou_rotated_cpu( + // input must be contiguous: + const at::Tensor& boxes1, + const at::Tensor& boxes2) { + auto num_boxes1 = boxes1.size(0); + auto num_boxes2 = boxes2.size(0); + at::Tensor ious = + at::empty({num_boxes1 * num_boxes2}, boxes1.options().dtype(at::kFloat)); + + box_iou_rotated_cpu_kernel(boxes1, boxes2, ious); + + // reshape from 1d array to 2d array + auto shape = std::vector{num_boxes1, num_boxes2}; + return ious.reshape(shape); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cuda.cu b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cuda.cu new file mode 100644 index 0000000..e3403c1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_cuda.cu @@ -0,0 +1,130 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include +#include +#include +#include +#include "box_iou_rotated_utils.h" + +namespace detectron2 { + +// 2D block with 32 * 16 = 512 threads per block +const int BLOCK_DIM_X = 32; +const int BLOCK_DIM_Y = 16; + +template +__global__ void box_iou_rotated_cuda_kernel( + const int n_boxes1, + const int n_boxes2, + const T* dev_boxes1, + const T* dev_boxes2, + T* dev_ious) { + const int row_start = blockIdx.x * blockDim.x; + const int col_start = blockIdx.y * blockDim.y; + + const int row_size = min(n_boxes1 - row_start, blockDim.x); + const int col_size = min(n_boxes2 - col_start, blockDim.y); + + __shared__ float block_boxes1[BLOCK_DIM_X * 5]; + __shared__ float block_boxes2[BLOCK_DIM_Y * 5]; + + // It's safe to copy using threadIdx.x since BLOCK_DIM_X >= BLOCK_DIM_Y + if (threadIdx.x < row_size && threadIdx.y == 0) { + block_boxes1[threadIdx.x * 5 + 0] = + dev_boxes1[(row_start + threadIdx.x) * 5 + 0]; + block_boxes1[threadIdx.x * 5 + 1] = + dev_boxes1[(row_start + threadIdx.x) * 5 + 1]; + block_boxes1[threadIdx.x * 5 + 2] = + dev_boxes1[(row_start + threadIdx.x) * 5 + 2]; + block_boxes1[threadIdx.x * 5 + 3] = + dev_boxes1[(row_start + threadIdx.x) * 5 + 3]; + block_boxes1[threadIdx.x * 5 + 4] = + dev_boxes1[(row_start + threadIdx.x) * 5 + 4]; + } + + if (threadIdx.x < col_size && threadIdx.y == 0) { + block_boxes2[threadIdx.x * 5 + 0] = + dev_boxes2[(col_start + threadIdx.x) * 5 + 0]; + block_boxes2[threadIdx.x * 5 + 1] = + dev_boxes2[(col_start + threadIdx.x) * 5 + 1]; + block_boxes2[threadIdx.x * 5 + 2] = + dev_boxes2[(col_start + threadIdx.x) * 5 + 2]; + block_boxes2[threadIdx.x * 5 + 3] = + dev_boxes2[(col_start + threadIdx.x) * 5 + 3]; + block_boxes2[threadIdx.x * 5 + 4] = + dev_boxes2[(col_start + threadIdx.x) * 5 + 4]; + } + __syncthreads(); + + if (threadIdx.x < row_size && threadIdx.y < col_size) { + int offset = (row_start + threadIdx.x) * n_boxes2 + col_start + threadIdx.y; + dev_ious[offset] = single_box_iou_rotated( + block_boxes1 + threadIdx.x * 5, block_boxes2 + threadIdx.y * 5); + } +} + +at::Tensor box_iou_rotated_cuda( + // input must be contiguous + const at::Tensor& boxes1, + const at::Tensor& boxes2) { + using scalar_t = float; + AT_ASSERTM( + boxes1.scalar_type() == at::kFloat, "boxes1 must be a float tensor"); + AT_ASSERTM( + boxes2.scalar_type() == at::kFloat, "boxes2 must be a float tensor"); + AT_ASSERTM(boxes1.is_cuda(), "boxes1 must be a CUDA tensor"); + AT_ASSERTM(boxes2.is_cuda(), "boxes2 must be a CUDA tensor"); + at::cuda::CUDAGuard device_guard(boxes1.device()); + + auto num_boxes1 = boxes1.size(0); + auto num_boxes2 = boxes2.size(0); + + at::Tensor ious = + at::empty({num_boxes1 * num_boxes2}, boxes1.options().dtype(at::kFloat)); + + bool transpose = false; + if (num_boxes1 > 0 && num_boxes2 > 0) { + scalar_t *data1 = boxes1.data_ptr(), + *data2 = boxes2.data_ptr(); + + if (num_boxes2 > 65535 * BLOCK_DIM_Y) { + AT_ASSERTM( + num_boxes1 <= 65535 * BLOCK_DIM_Y, + "Too many boxes for box_iou_rotated_cuda!"); + // x dim is allowed to be large, but y dim cannot, + // so we transpose the two to avoid "invalid configuration argument" + // error. We assume one of them is small. Otherwise the result is hard to + // fit in memory anyway. + std::swap(num_boxes1, num_boxes2); + std::swap(data1, data2); + transpose = true; + } + + const int blocks_x = + at::cuda::ATenCeilDiv(static_cast(num_boxes1), BLOCK_DIM_X); + const int blocks_y = + at::cuda::ATenCeilDiv(static_cast(num_boxes2), BLOCK_DIM_Y); + + dim3 blocks(blocks_x, blocks_y); + dim3 threads(BLOCK_DIM_X, BLOCK_DIM_Y); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + box_iou_rotated_cuda_kernel<<>>( + num_boxes1, + num_boxes2, + data1, + data2, + (scalar_t*)ious.data_ptr()); + + AT_CUDA_CHECK(cudaGetLastError()); + } + + // reshape from 1d array to 2d array + auto shape = std::vector{num_boxes1, num_boxes2}; + if (transpose) { + return ious.view(shape).t(); + } else { + return ious.view(shape); + } +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_utils.h b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_utils.h new file mode 100644 index 0000000..d8757ec --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/box_iou_rotated/box_iou_rotated_utils.h @@ -0,0 +1,363 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#pragma once + +#include +#include + +#ifdef __CUDACC__ +// Designates functions callable from the host (CPU) and the device (GPU) +#define HOST_DEVICE __host__ __device__ +#define HOST_DEVICE_INLINE HOST_DEVICE __forceinline__ +#else +#include +#define HOST_DEVICE +#define HOST_DEVICE_INLINE HOST_DEVICE inline +#endif + +namespace detectron2 { + +namespace { + +template +struct RotatedBox { + T x_ctr, y_ctr, w, h, a; +}; + +template +struct Point { + T x, y; + HOST_DEVICE_INLINE Point(const T& px = 0, const T& py = 0) : x(px), y(py) {} + HOST_DEVICE_INLINE Point operator+(const Point& p) const { + return Point(x + p.x, y + p.y); + } + HOST_DEVICE_INLINE Point& operator+=(const Point& p) { + x += p.x; + y += p.y; + return *this; + } + HOST_DEVICE_INLINE Point operator-(const Point& p) const { + return Point(x - p.x, y - p.y); + } + HOST_DEVICE_INLINE Point operator*(const T coeff) const { + return Point(x * coeff, y * coeff); + } +}; + +template +HOST_DEVICE_INLINE T dot_2d(const Point& A, const Point& B) { + return A.x * B.x + A.y * B.y; +} + +// R: result type. can be different from input type +template +HOST_DEVICE_INLINE R cross_2d(const Point& A, const Point& B) { + return static_cast(A.x) * static_cast(B.y) - + static_cast(B.x) * static_cast(A.y); +} + +template +HOST_DEVICE_INLINE void get_rotated_vertices( + const RotatedBox& box, + Point (&pts)[4]) { + // M_PI / 180. == 0.01745329251 + double theta = box.a * 0.01745329251; + T cosTheta2 = (T)cos(theta) * 0.5f; + T sinTheta2 = (T)sin(theta) * 0.5f; + + // y: top --> down; x: left --> right + pts[0].x = box.x_ctr + sinTheta2 * box.h + cosTheta2 * box.w; + pts[0].y = box.y_ctr + cosTheta2 * box.h - sinTheta2 * box.w; + pts[1].x = box.x_ctr - sinTheta2 * box.h + cosTheta2 * box.w; + pts[1].y = box.y_ctr - cosTheta2 * box.h - sinTheta2 * box.w; + pts[2].x = 2 * box.x_ctr - pts[0].x; + pts[2].y = 2 * box.y_ctr - pts[0].y; + pts[3].x = 2 * box.x_ctr - pts[1].x; + pts[3].y = 2 * box.y_ctr - pts[1].y; +} + +template +HOST_DEVICE_INLINE int get_intersection_points( + const Point (&pts1)[4], + const Point (&pts2)[4], + Point (&intersections)[24]) { + // Line vector + // A line from p1 to p2 is: p1 + (p2-p1)*t, t=[0,1] + Point vec1[4], vec2[4]; + for (int i = 0; i < 4; i++) { + vec1[i] = pts1[(i + 1) % 4] - pts1[i]; + vec2[i] = pts2[(i + 1) % 4] - pts2[i]; + } + + // Line test - test all line combos for intersection + int num = 0; // number of intersections + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + // Solve for 2x2 Ax=b + T det = cross_2d(vec2[j], vec1[i]); + + // This takes care of parallel lines + if (fabs(det) <= 1e-14) { + continue; + } + + auto vec12 = pts2[j] - pts1[i]; + + T t1 = cross_2d(vec2[j], vec12) / det; + T t2 = cross_2d(vec1[i], vec12) / det; + + if (t1 >= 0.0f && t1 <= 1.0f && t2 >= 0.0f && t2 <= 1.0f) { + intersections[num++] = pts1[i] + vec1[i] * t1; + } + } + } + + // Check for vertices of rect1 inside rect2 + { + const auto& AB = vec2[0]; + const auto& DA = vec2[3]; + auto ABdotAB = dot_2d(AB, AB); + auto ADdotAD = dot_2d(DA, DA); + for (int i = 0; i < 4; i++) { + // assume ABCD is the rectangle, and P is the point to be judged + // P is inside ABCD iff. P's projection on AB lies within AB + // and P's projection on AD lies within AD + + auto AP = pts1[i] - pts2[0]; + + auto APdotAB = dot_2d(AP, AB); + auto APdotAD = -dot_2d(AP, DA); + + if ((APdotAB >= 0) && (APdotAD >= 0) && (APdotAB <= ABdotAB) && + (APdotAD <= ADdotAD)) { + intersections[num++] = pts1[i]; + } + } + } + + // Reverse the check - check for vertices of rect2 inside rect1 + { + const auto& AB = vec1[0]; + const auto& DA = vec1[3]; + auto ABdotAB = dot_2d(AB, AB); + auto ADdotAD = dot_2d(DA, DA); + for (int i = 0; i < 4; i++) { + auto AP = pts2[i] - pts1[0]; + + auto APdotAB = dot_2d(AP, AB); + auto APdotAD = -dot_2d(AP, DA); + + if ((APdotAB >= 0) && (APdotAD >= 0) && (APdotAB <= ABdotAB) && + (APdotAD <= ADdotAD)) { + intersections[num++] = pts2[i]; + } + } + } + + return num; +} + +template +HOST_DEVICE_INLINE int convex_hull_graham( + const Point (&p)[24], + const int& num_in, + Point (&q)[24], + bool shift_to_zero = false) { + assert(num_in >= 2); + + // Step 1: + // Find point with minimum y + // if more than 1 points have the same minimum y, + // pick the one with the minimum x. + int t = 0; + for (int i = 1; i < num_in; i++) { + if (p[i].y < p[t].y || (p[i].y == p[t].y && p[i].x < p[t].x)) { + t = i; + } + } + auto& start = p[t]; // starting point + + // Step 2: + // Subtract starting point from every points (for sorting in the next step) + for (int i = 0; i < num_in; i++) { + q[i] = p[i] - start; + } + + // Swap the starting point to position 0 + auto tmp = q[0]; + q[0] = q[t]; + q[t] = tmp; + + // Step 3: + // Sort point 1 ~ num_in according to their relative cross-product values + // (essentially sorting according to angles) + // If the angles are the same, sort according to their distance to origin + T dist[24]; +#ifdef __CUDACC__ + // compute distance to origin before sort, and sort them together with the + // points + for (int i = 0; i < num_in; i++) { + dist[i] = dot_2d(q[i], q[i]); + } + + // CUDA version + // In the future, we can potentially use thrust + // for sorting here to improve speed (though not guaranteed) + for (int i = 1; i < num_in - 1; i++) { + for (int j = i + 1; j < num_in; j++) { + T crossProduct = cross_2d(q[i], q[j]); + if ((crossProduct < -1e-6) || + (fabs(crossProduct) < 1e-6 && dist[i] > dist[j])) { + auto q_tmp = q[i]; + q[i] = q[j]; + q[j] = q_tmp; + auto dist_tmp = dist[i]; + dist[i] = dist[j]; + dist[j] = dist_tmp; + } + } + } +#else + // CPU version + std::sort( + q + 1, q + num_in, [](const Point& A, const Point& B) -> bool { + T temp = cross_2d(A, B); + if (fabs(temp) < 1e-6) { + return dot_2d(A, A) < dot_2d(B, B); + } else { + return temp > 0; + } + }); + // compute distance to origin after sort, since the points are now different. + for (int i = 0; i < num_in; i++) { + dist[i] = dot_2d(q[i], q[i]); + } +#endif + + // Step 4: + // Make sure there are at least 2 points (that don't overlap with each other) + // in the stack + int k; // index of the non-overlapped second point + for (k = 1; k < num_in; k++) { + if (dist[k] > 1e-8) { + break; + } + } + if (k == num_in) { + // We reach the end, which means the convex hull is just one point + q[0] = p[t]; + return 1; + } + q[1] = q[k]; + int m = 2; // 2 points in the stack + // Step 5: + // Finally we can start the scanning process. + // When a non-convex relationship between the 3 points is found + // (either concave shape or duplicated points), + // we pop the previous point from the stack + // until the 3-point relationship is convex again, or + // until the stack only contains two points + for (int i = k + 1; i < num_in; i++) { + while (m > 1) { + auto q1 = q[i] - q[m - 2], q2 = q[m - 1] - q[m - 2]; + // cross_2d() uses FMA and therefore computes round(round(q1.x*q2.y) - + // q2.x*q1.y) So it may not return 0 even when q1==q2. Therefore we + // compare round(q1.x*q2.y) and round(q2.x*q1.y) directly. (round means + // round to nearest floating point). + if (q1.x * q2.y >= q2.x * q1.y) + m--; + else + break; + } + // Using double also helps, but float can solve the issue for now. + // while (m > 1 && cross_2d(q[i] - q[m - 2], q[m - 1] - q[m - 2]) + // >= 0) { + // m--; + // } + q[m++] = q[i]; + } + + // Step 6 (Optional): + // In general sense we need the original coordinates, so we + // need to shift the points back (reverting Step 2) + // But if we're only interested in getting the area/perimeter of the shape + // We can simply return. + if (!shift_to_zero) { + for (int i = 0; i < m; i++) { + q[i] += start; + } + } + + return m; +} + +template +HOST_DEVICE_INLINE T polygon_area(const Point (&q)[24], const int& m) { + if (m <= 2) { + return 0; + } + + T area = 0; + for (int i = 1; i < m - 1; i++) { + area += fabs(cross_2d(q[i] - q[0], q[i + 1] - q[0])); + } + + return area / 2.0; +} + +template +HOST_DEVICE_INLINE T rotated_boxes_intersection( + const RotatedBox& box1, + const RotatedBox& box2) { + // There are up to 4 x 4 + 4 + 4 = 24 intersections (including dups) returned + // from rotated_rect_intersection_pts + Point intersectPts[24], orderedPts[24]; + + Point pts1[4]; + Point pts2[4]; + get_rotated_vertices(box1, pts1); + get_rotated_vertices(box2, pts2); + + int num = get_intersection_points(pts1, pts2, intersectPts); + + if (num <= 2) { + return 0.0; + } + + // Convex Hull to order the intersection points in clockwise order and find + // the contour area. + int num_convex = convex_hull_graham(intersectPts, num, orderedPts, true); + return polygon_area(orderedPts, num_convex); +} + +} // namespace + +template +HOST_DEVICE_INLINE T +single_box_iou_rotated(T const* const box1_raw, T const* const box2_raw) { + // shift center to the middle point to achieve higher precision in result + RotatedBox box1, box2; + auto center_shift_x = (box1_raw[0] + box2_raw[0]) / 2.0; + auto center_shift_y = (box1_raw[1] + box2_raw[1]) / 2.0; + box1.x_ctr = box1_raw[0] - center_shift_x; + box1.y_ctr = box1_raw[1] - center_shift_y; + box1.w = box1_raw[2]; + box1.h = box1_raw[3]; + box1.a = box1_raw[4]; + box2.x_ctr = box2_raw[0] - center_shift_x; + box2.y_ctr = box2_raw[1] - center_shift_y; + box2.w = box2_raw[2]; + box2.h = box2_raw[3]; + box2.a = box2_raw[4]; + + T area1 = box1.w * box1.h; + T area2 = box2.w * box2.h; + if (area1 < 1e-14 || area2 < 1e-14) { + return 0.f; + } + + T intersection = rotated_boxes_intersection(box1, box2); + T iou = intersection / (area1 + area2 - intersection); + return iou; +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/cuda_version.cu b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/cuda_version.cu new file mode 100644 index 0000000..af088e7 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/cuda_version.cu @@ -0,0 +1,9 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +#include + +namespace detectron2 { +int get_cudart_version() { + return CUDART_VERSION; +} +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv.h b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv.h new file mode 100644 index 0000000..49ccd86 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv.h @@ -0,0 +1,377 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#pragma once +#include + +namespace detectron2 { + +#ifdef WITH_CUDA +int deform_conv_forward_cuda( + at::Tensor input, + at::Tensor weight, + at::Tensor offset, + at::Tensor output, + at::Tensor columns, + at::Tensor ones, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + int im2col_step); + +int deform_conv_backward_input_cuda( + at::Tensor input, + at::Tensor offset, + at::Tensor gradOutput, + at::Tensor gradInput, + at::Tensor gradOffset, + at::Tensor weight, + at::Tensor columns, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + int im2col_step); + +int deform_conv_backward_parameters_cuda( + at::Tensor input, + at::Tensor offset, + at::Tensor gradOutput, + at::Tensor gradWeight, // at::Tensor gradBias, + at::Tensor columns, + at::Tensor ones, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + float scale, + int im2col_step); + +void modulated_deform_conv_cuda_forward( + at::Tensor input, + at::Tensor weight, + at::Tensor bias, + at::Tensor ones, + at::Tensor offset, + at::Tensor mask, + at::Tensor output, + at::Tensor columns, + int kernel_h, + int kernel_w, + const int stride_h, + const int stride_w, + const int pad_h, + const int pad_w, + const int dilation_h, + const int dilation_w, + const int group, + const int deformable_group, + const bool with_bias); + +void modulated_deform_conv_cuda_backward( + at::Tensor input, + at::Tensor weight, + at::Tensor bias, + at::Tensor ones, + at::Tensor offset, + at::Tensor mask, + at::Tensor columns, + at::Tensor grad_input, + at::Tensor grad_weight, + at::Tensor grad_bias, + at::Tensor grad_offset, + at::Tensor grad_mask, + at::Tensor grad_output, + int kernel_h, + int kernel_w, + int stride_h, + int stride_w, + int pad_h, + int pad_w, + int dilation_h, + int dilation_w, + int group, + int deformable_group, + const bool with_bias); + +#endif + +inline int deform_conv_forward( + at::Tensor input, + at::Tensor weight, + at::Tensor offset, + at::Tensor output, + at::Tensor columns, + at::Tensor ones, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + int im2col_step) { + if (input.is_cuda()) { +#ifdef WITH_CUDA + TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!"); + TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!"); + return deform_conv_forward_cuda( + input, + weight, + offset, + output, + columns, + ones, + kW, + kH, + dW, + dH, + padW, + padH, + dilationW, + dilationH, + group, + deformable_group, + im2col_step); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + AT_ERROR("Not implemented on the CPU"); +} + +inline int deform_conv_backward_input( + at::Tensor input, + at::Tensor offset, + at::Tensor gradOutput, + at::Tensor gradInput, + at::Tensor gradOffset, + at::Tensor weight, + at::Tensor columns, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + int im2col_step) { + if (gradOutput.is_cuda()) { +#ifdef WITH_CUDA + TORCH_CHECK(input.is_cuda(), "input tensor is not on GPU!"); + TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!"); + TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!"); + return deform_conv_backward_input_cuda( + input, + offset, + gradOutput, + gradInput, + gradOffset, + weight, + columns, + kW, + kH, + dW, + dH, + padW, + padH, + dilationW, + dilationH, + group, + deformable_group, + im2col_step); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + AT_ERROR("Not implemented on the CPU"); +} + +inline int deform_conv_backward_filter( + at::Tensor input, + at::Tensor offset, + at::Tensor gradOutput, + at::Tensor gradWeight, // at::Tensor gradBias, + at::Tensor columns, + at::Tensor ones, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + float scale, + int im2col_step) { + if (gradOutput.is_cuda()) { +#ifdef WITH_CUDA + TORCH_CHECK(input.is_cuda(), "input tensor is not on GPU!"); + TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!"); + return deform_conv_backward_parameters_cuda( + input, + offset, + gradOutput, + gradWeight, + columns, + ones, + kW, + kH, + dW, + dH, + padW, + padH, + dilationW, + dilationH, + group, + deformable_group, + scale, + im2col_step); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + AT_ERROR("Not implemented on the CPU"); +} + +inline void modulated_deform_conv_forward( + at::Tensor input, + at::Tensor weight, + at::Tensor bias, + at::Tensor ones, + at::Tensor offset, + at::Tensor mask, + at::Tensor output, + at::Tensor columns, + int kernel_h, + int kernel_w, + const int stride_h, + const int stride_w, + const int pad_h, + const int pad_w, + const int dilation_h, + const int dilation_w, + const int group, + const int deformable_group, + const bool with_bias) { + if (input.is_cuda()) { +#ifdef WITH_CUDA + TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!"); + TORCH_CHECK(bias.is_cuda(), "bias tensor is not on GPU!"); + TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!"); + return modulated_deform_conv_cuda_forward( + input, + weight, + bias, + ones, + offset, + mask, + output, + columns, + kernel_h, + kernel_w, + stride_h, + stride_w, + pad_h, + pad_w, + dilation_h, + dilation_w, + group, + deformable_group, + with_bias); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + AT_ERROR("Not implemented on the CPU"); +} + +inline void modulated_deform_conv_backward( + at::Tensor input, + at::Tensor weight, + at::Tensor bias, + at::Tensor ones, + at::Tensor offset, + at::Tensor mask, + at::Tensor columns, + at::Tensor grad_input, + at::Tensor grad_weight, + at::Tensor grad_bias, + at::Tensor grad_offset, + at::Tensor grad_mask, + at::Tensor grad_output, + int kernel_h, + int kernel_w, + int stride_h, + int stride_w, + int pad_h, + int pad_w, + int dilation_h, + int dilation_w, + int group, + int deformable_group, + const bool with_bias) { + if (grad_output.is_cuda()) { +#ifdef WITH_CUDA + TORCH_CHECK(input.is_cuda(), "input tensor is not on GPU!"); + TORCH_CHECK(weight.is_cuda(), "weight tensor is not on GPU!"); + TORCH_CHECK(bias.is_cuda(), "bias tensor is not on GPU!"); + TORCH_CHECK(offset.is_cuda(), "offset tensor is not on GPU!"); + return modulated_deform_conv_cuda_backward( + input, + weight, + bias, + ones, + offset, + mask, + columns, + grad_input, + grad_weight, + grad_bias, + grad_offset, + grad_mask, + grad_output, + kernel_h, + kernel_w, + stride_h, + stride_w, + pad_h, + pad_w, + dilation_h, + dilation_w, + group, + deformable_group, + with_bias); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + AT_ERROR("Not implemented on the CPU"); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda.cu b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda.cu new file mode 100644 index 0000000..5376db0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda.cu @@ -0,0 +1,1131 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +// modified from +// https://github.com/open-mmlab/mmdetection/blob/master/mmdet/ops/dcn/src/deform_conv_cuda.cpp +// Original license: Apache 2.0 + +// modify from +// https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/deform_conv_cuda.c +// Original license: Apache 2.0 + +#include + +#include "deform_conv.h" + +#include +#include + +namespace detectron2 { + +void deformable_im2col( + const at::Tensor data_im, + const at::Tensor data_offset, + const int channels, + const int height, + const int width, + const int ksize_h, + const int ksize_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int parallel_imgs, + const int deformable_group, + at::Tensor data_col); + +void deformable_col2im( + const at::Tensor data_col, + const at::Tensor data_offset, + const int channels, + const int height, + const int width, + const int ksize_h, + const int ksize_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int parallel_imgs, + const int deformable_group, + at::Tensor grad_im); + +void deformable_col2im_coord( + const at::Tensor data_col, + const at::Tensor data_im, + const at::Tensor data_offset, + const int channels, + const int height, + const int width, + const int ksize_h, + const int ksize_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int parallel_imgs, + const int deformable_group, + at::Tensor grad_offset); + +void modulated_deformable_im2col_cuda( + const at::Tensor data_im, + const at::Tensor data_offset, + const at::Tensor data_mask, + const int batch_size, + const int channels, + const int height_im, + const int width_im, + const int height_col, + const int width_col, + const int kernel_h, + const int kenerl_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int deformable_group, + at::Tensor data_col); + +void modulated_deformable_col2im_cuda( + const at::Tensor data_col, + const at::Tensor data_offset, + const at::Tensor data_mask, + const int batch_size, + const int channels, + const int height_im, + const int width_im, + const int height_col, + const int width_col, + const int kernel_h, + const int kenerl_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int deformable_group, + at::Tensor grad_im); + +void modulated_deformable_col2im_coord_cuda( + const at::Tensor data_col, + const at::Tensor data_im, + const at::Tensor data_offset, + const at::Tensor data_mask, + const int batch_size, + const int channels, + const int height_im, + const int width_im, + const int height_col, + const int width_col, + const int kernel_h, + const int kenerl_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int deformable_group, + at::Tensor grad_offset, + at::Tensor grad_mask); + +void shape_check( + at::Tensor input, + at::Tensor offset, + at::Tensor* gradOutput, + at::Tensor weight, + int kH, + int kW, + int dH, + int dW, + int padH, + int padW, + int dilationH, + int dilationW, + int group, + int deformable_group) { + TORCH_CHECK( + weight.ndimension() == 4, + "4D weight tensor (nOutputPlane,nInputPlane,kH,kW) expected, " + "but got: %s", + weight.ndimension()); + + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + TORCH_CHECK( + kW > 0 && kH > 0, + "kernel size should be greater than zero, but got kH: %d kW: %d", + kH, + kW); + + TORCH_CHECK( + (weight.size(2) == kH && weight.size(3) == kW), + "kernel size should be consistent with weight, ", + "but got kH: %d kW: %d weight.size(2): %d, weight.size(3): %d", + kH, + kW, + weight.size(2), + weight.size(3)); + + TORCH_CHECK( + dW > 0 && dH > 0, + "stride should be greater than zero, but got dH: %d dW: %d", + dH, + dW); + + TORCH_CHECK( + dilationW > 0 && dilationH > 0, + "dilation should be greater than 0, but got dilationH: %d dilationW: %d", + dilationH, + dilationW); + + int ndim = input.ndimension(); + int dimf = 0; + int dimh = 1; + int dimw = 2; + + if (ndim == 4) { + dimf++; + dimh++; + dimw++; + } + + TORCH_CHECK( + ndim == 3 || ndim == 4, + "3D or 4D input tensor expected but got: %s", + ndim); + + long nInputPlane = weight.size(1) * group; + long inputHeight = input.size(dimh); + long inputWidth = input.size(dimw); + long nOutputPlane = weight.size(0); + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + + TORCH_CHECK( + nInputPlane % deformable_group == 0, + "input channels must divide deformable group size"); + + if (outputWidth < 1 || outputHeight < 1) + AT_ERROR( + "Given input size: (%ld x %ld x %ld). " + "Calculated output size: (%ld x %ld x %ld). Output size is too small", + nInputPlane, + inputHeight, + inputWidth, + nOutputPlane, + outputHeight, + outputWidth); + + TORCH_CHECK( + input.size(1) == nInputPlane, + "invalid number of input planes, expected: %d, but got: %d", + nInputPlane, + input.size(1)); + + TORCH_CHECK( + (inputHeight >= kH && inputWidth >= kW), + "input image is smaller than kernel"); + + TORCH_CHECK( + (offset.size(2) == outputHeight && offset.size(3) == outputWidth), + "invalid spatial size of offset, expected height: %d width: %d, but " + "got height: %d width: %d", + outputHeight, + outputWidth, + offset.size(2), + offset.size(3)); + + TORCH_CHECK( + (offset.size(1) == deformable_group * 2 * kH * kW), + "invalid number of channels of offset"); + + if (gradOutput != NULL) { + TORCH_CHECK( + gradOutput->size(dimf) == nOutputPlane, + "invalid number of gradOutput planes, expected: %d, but got: %d", + nOutputPlane, + gradOutput->size(dimf)); + + TORCH_CHECK( + (gradOutput->size(dimh) == outputHeight && + gradOutput->size(dimw) == outputWidth), + "invalid size of gradOutput, expected height: %d width: %d , but " + "got height: %d width: %d", + outputHeight, + outputWidth, + gradOutput->size(dimh), + gradOutput->size(dimw)); + } +} + +int deform_conv_forward_cuda( + at::Tensor input, + at::Tensor weight, + at::Tensor offset, + at::Tensor output, + at::Tensor columns, + at::Tensor ones, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + int im2col_step) { + // todo: resize columns to include im2col: done + // todo: add im2col_step as input + // todo: add new output buffer and transpose it to output (or directly + // transpose output) todo: possibly change data indexing because of + // parallel_imgs + + shape_check( + input, + offset, + NULL, + weight, + kH, + kW, + dH, + dW, + padH, + padW, + dilationH, + dilationW, + group, + deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + weight = weight.contiguous(); + + int batch = 1; + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input.unsqueeze_(0); + offset.unsqueeze_(0); + } + + // todo: assert batchsize dividable by im2col_step + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = weight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), "invalid batch size of offset"); + + output = output.view({batchSize / im2col_step, + im2col_step, + nOutputPlane, + outputHeight, + outputWidth}); + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < outputHeight * outputWidth) { + ones = at::ones({outputHeight, outputWidth}, input.options()); + } + + input = input.view({batchSize / im2col_step, + im2col_step, + nInputPlane, + inputHeight, + inputWidth}); + offset = offset.view({batchSize / im2col_step, + im2col_step, + deformable_group * 2 * kH * kW, + outputHeight, + outputWidth}); + + at::Tensor output_buffer = at::zeros( + {batchSize / im2col_step, + nOutputPlane, + im2col_step * outputHeight, + outputWidth}, + output.options()); + + output_buffer = output_buffer.view({output_buffer.size(0), + group, + output_buffer.size(1) / group, + output_buffer.size(2), + output_buffer.size(3)}); + + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + deformable_im2col( + input[elt], + offset[elt], + nInputPlane, + inputHeight, + inputWidth, + kH, + kW, + padH, + padW, + dH, + dW, + dilationH, + dilationW, + im2col_step, + deformable_group, + columns); + + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, + weight.size(0) / group, + weight.size(1), + weight.size(2), + weight.size(3)}); + + for (int g = 0; g < group; g++) { + output_buffer[elt][g] = output_buffer[elt][g] + .flatten(1) + .addmm_(weight[g].flatten(1), columns[g]) + .view_as(output_buffer[elt][g]); + } + } + + output_buffer = + output_buffer.view({output_buffer.size(0), + output_buffer.size(1) * output_buffer.size(2), + output_buffer.size(3), + output_buffer.size(4)}); + + output_buffer = output_buffer.view({batchSize / im2col_step, + nOutputPlane, + im2col_step, + outputHeight, + outputWidth}); + output_buffer.transpose_(1, 2); + output.copy_(output_buffer); + output = output.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + output = output.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + offset = offset.view({offset.size(1), offset.size(2), offset.size(3)}); + } + + return 1; +} + +int deform_conv_backward_input_cuda( + at::Tensor input, + at::Tensor offset, + at::Tensor gradOutput, + at::Tensor gradInput, + at::Tensor gradOffset, + at::Tensor weight, + at::Tensor columns, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + int im2col_step) { + shape_check( + input, + offset, + &gradOutput, + weight, + kH, + kW, + dH, + dW, + padH, + padW, + dilationH, + dilationW, + group, + deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + gradOutput = gradOutput.contiguous(); + weight = weight.contiguous(); + + int batch = 1; + + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input = input.view({1, input.size(0), input.size(1), input.size(2)}); + offset = offset.view({1, offset.size(0), offset.size(1), offset.size(2)}); + gradOutput = gradOutput.view( + {1, gradOutput.size(0), gradOutput.size(1), gradOutput.size(2)}); + } + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = weight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), 3, "invalid batch size of offset"); + gradInput = gradInput.view({batchSize, nInputPlane, inputHeight, inputWidth}); + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + // change order of grad output + gradOutput = gradOutput.view({batchSize / im2col_step, + im2col_step, + nOutputPlane, + outputHeight, + outputWidth}); + gradOutput.transpose_(1, 2); + + gradInput = gradInput.view({batchSize / im2col_step, + im2col_step, + nInputPlane, + inputHeight, + inputWidth}); + input = input.view({batchSize / im2col_step, + im2col_step, + nInputPlane, + inputHeight, + inputWidth}); + gradOffset = gradOffset.view({batchSize / im2col_step, + im2col_step, + deformable_group * 2 * kH * kW, + outputHeight, + outputWidth}); + offset = offset.view({batchSize / im2col_step, + im2col_step, + deformable_group * 2 * kH * kW, + outputHeight, + outputWidth}); + + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + // divide into groups + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, + weight.size(0) / group, + weight.size(1), + weight.size(2), + weight.size(3)}); + gradOutput = gradOutput.view({gradOutput.size(0), + group, + gradOutput.size(1) / group, + gradOutput.size(2), + gradOutput.size(3), + gradOutput.size(4)}); + + for (int g = 0; g < group; g++) { + columns[g] = columns[g].addmm_( + weight[g].flatten(1).transpose(0, 1), + gradOutput[elt][g].flatten(1), + 0.0f, + 1.0f); + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + gradOutput = gradOutput.view({gradOutput.size(0), + gradOutput.size(1) * gradOutput.size(2), + gradOutput.size(3), + gradOutput.size(4), + gradOutput.size(5)}); + + deformable_col2im_coord( + columns, + input[elt], + offset[elt], + nInputPlane, + inputHeight, + inputWidth, + kH, + kW, + padH, + padW, + dH, + dW, + dilationH, + dilationW, + im2col_step, + deformable_group, + gradOffset[elt]); + + deformable_col2im( + columns, + offset[elt], + nInputPlane, + inputHeight, + inputWidth, + kH, + kW, + padH, + padW, + dH, + dW, + dilationH, + dilationW, + im2col_step, + deformable_group, + gradInput[elt]); + } + + gradOutput.transpose_(1, 2); + gradOutput = + gradOutput.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + gradInput = gradInput.view({batchSize, nInputPlane, inputHeight, inputWidth}); + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + gradOffset = gradOffset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + gradOutput = gradOutput.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + gradInput = gradInput.view({nInputPlane, inputHeight, inputWidth}); + offset = offset.view({offset.size(1), offset.size(2), offset.size(3)}); + gradOffset = + gradOffset.view({offset.size(1), offset.size(2), offset.size(3)}); + } + + return 1; +} + +int deform_conv_backward_parameters_cuda( + at::Tensor input, + at::Tensor offset, + at::Tensor gradOutput, + at::Tensor gradWeight, // at::Tensor gradBias, + at::Tensor columns, + at::Tensor ones, + int kW, + int kH, + int dW, + int dH, + int padW, + int padH, + int dilationW, + int dilationH, + int group, + int deformable_group, + float scale, + int im2col_step) { + // todo: transpose and reshape outGrad + // todo: reshape columns + // todo: add im2col_step as input + + shape_check( + input, + offset, + &gradOutput, + gradWeight, + kH, + kW, + dH, + dW, + padH, + padW, + dilationH, + dilationW, + group, + deformable_group); + + input = input.contiguous(); + offset = offset.contiguous(); + gradOutput = gradOutput.contiguous(); + + int batch = 1; + + if (input.ndimension() == 3) { + // Force batch + batch = 0; + input = input.view( + at::IntList({1, input.size(0), input.size(1), input.size(2)})); + gradOutput = gradOutput.view( + {1, gradOutput.size(0), gradOutput.size(1), gradOutput.size(2)}); + } + + long batchSize = input.size(0); + long nInputPlane = input.size(1); + long inputHeight = input.size(2); + long inputWidth = input.size(3); + + long nOutputPlane = gradWeight.size(0); + + long outputWidth = + (inputWidth + 2 * padW - (dilationW * (kW - 1) + 1)) / dW + 1; + long outputHeight = + (inputHeight + 2 * padH - (dilationH * (kH - 1) + 1)) / dH + 1; + + TORCH_CHECK((offset.size(0) == batchSize), "invalid batch size of offset"); + + columns = at::zeros( + {nInputPlane * kW * kH, im2col_step * outputHeight * outputWidth}, + input.options()); + + gradOutput = gradOutput.view({batchSize / im2col_step, + im2col_step, + nOutputPlane, + outputHeight, + outputWidth}); + gradOutput.transpose_(1, 2); + + at::Tensor gradOutputBuffer = at::zeros_like(gradOutput); + gradOutputBuffer = gradOutputBuffer.view({batchSize / im2col_step, + nOutputPlane, + im2col_step, + outputHeight, + outputWidth}); + gradOutputBuffer.copy_(gradOutput); + // gradOutput is not contiguous, so we do reshape (instead of view) next + gradOutputBuffer = gradOutputBuffer.reshape({batchSize / im2col_step, + nOutputPlane, + im2col_step * outputHeight, + outputWidth}); + + gradOutput.transpose_(1, 2); + gradOutput = + gradOutput.view({batchSize, nOutputPlane, outputHeight, outputWidth}); + + input = input.view({batchSize / im2col_step, + im2col_step, + nInputPlane, + inputHeight, + inputWidth}); + offset = offset.view({batchSize / im2col_step, + im2col_step, + deformable_group * 2 * kH * kW, + outputHeight, + outputWidth}); + + for (int elt = 0; elt < batchSize / im2col_step; elt++) { + deformable_im2col( + input[elt], + offset[elt], + nInputPlane, + inputHeight, + inputWidth, + kH, + kW, + padH, + padW, + dH, + dW, + dilationH, + dilationW, + im2col_step, + deformable_group, + columns); + + // divide into group + gradOutputBuffer = gradOutputBuffer.view({gradOutputBuffer.size(0), + group, + gradOutputBuffer.size(1) / group, + gradOutputBuffer.size(2), + gradOutputBuffer.size(3)}); + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + gradWeight = gradWeight.view({group, + gradWeight.size(0) / group, + gradWeight.size(1), + gradWeight.size(2), + gradWeight.size(3)}); + + for (int g = 0; g < group; g++) { + gradWeight[g] = gradWeight[g] + .flatten(1) + .addmm_( + gradOutputBuffer[elt][g].flatten(1), + columns[g].transpose(1, 0), + 1.0, + scale) + .view_as(gradWeight[g]); + } + gradOutputBuffer = gradOutputBuffer.view( + {gradOutputBuffer.size(0), + gradOutputBuffer.size(1) * gradOutputBuffer.size(2), + gradOutputBuffer.size(3), + gradOutputBuffer.size(4)}); + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + gradWeight = gradWeight.view({gradWeight.size(0) * gradWeight.size(1), + gradWeight.size(2), + gradWeight.size(3), + gradWeight.size(4)}); + } + + input = input.view({batchSize, nInputPlane, inputHeight, inputWidth}); + offset = offset.view( + {batchSize, deformable_group * 2 * kH * kW, outputHeight, outputWidth}); + + if (batch == 0) { + gradOutput = gradOutput.view({nOutputPlane, outputHeight, outputWidth}); + input = input.view({nInputPlane, inputHeight, inputWidth}); + } + + return 1; +} + +void modulated_deform_conv_cuda_forward( + at::Tensor input, + at::Tensor weight, + at::Tensor bias, + at::Tensor ones, + at::Tensor offset, + at::Tensor mask, + at::Tensor output, + at::Tensor columns, + int kernel_h, + int kernel_w, + const int stride_h, + const int stride_w, + const int pad_h, + const int pad_w, + const int dilation_h, + const int dilation_w, + const int group, + const int deformable_group, + const bool with_bias) { + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + + const int channels_out = weight.size(0); + const int channels_kernel = weight.size(1); + const int kernel_h_ = weight.size(2); + const int kernel_w_ = weight.size(3); + + if (kernel_h_ != kernel_h || kernel_w_ != kernel_w) + AT_ERROR( + "Input shape and kernel shape wont match: (%d x %d vs %d x %d).", + kernel_h_, + kernel_w, + kernel_h_, + kernel_w_); + if (channels != channels_kernel * group) + AT_ERROR( + "Input shape and kernel channels wont match: (%d vs %d).", + channels, + channels_kernel * group); + + const int height_out = + (height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1; + const int width_out = + (width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1; + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < height_out * width_out) { + // Resize plane and fill with ones... + ones = at::ones({height_out, width_out}, input.options()); + } + + // resize output + output = output.view({batch, channels_out, height_out, width_out}).zero_(); + // resize temporary columns + columns = at::zeros( + {channels * kernel_h * kernel_w, 1 * height_out * width_out}, + input.options()); + + output = output.view({output.size(0), + group, + output.size(1) / group, + output.size(2), + output.size(3)}); + + for (int b = 0; b < batch; b++) { + modulated_deformable_im2col_cuda( + input[b], + offset[b], + mask[b], + 1, + channels, + height, + width, + height_out, + width_out, + kernel_h, + kernel_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + deformable_group, + columns); + + // divide into group + weight = weight.view({group, + weight.size(0) / group, + weight.size(1), + weight.size(2), + weight.size(3)}); + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + + for (int g = 0; g < group; g++) { + output[b][g] = output[b][g] + .flatten(1) + .addmm_(weight[g].flatten(1), columns[g]) + .view_as(output[b][g]); + } + + weight = weight.view({weight.size(0) * weight.size(1), + weight.size(2), + weight.size(3), + weight.size(4)}); + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + } + + output = output.view({output.size(0), + output.size(1) * output.size(2), + output.size(3), + output.size(4)}); + + if (with_bias) { + output += bias.view({1, bias.size(0), 1, 1}); + } +} + +void modulated_deform_conv_cuda_backward( + at::Tensor input, + at::Tensor weight, + at::Tensor bias, + at::Tensor ones, + at::Tensor offset, + at::Tensor mask, + at::Tensor columns, + at::Tensor grad_input, + at::Tensor grad_weight, + at::Tensor grad_bias, + at::Tensor grad_offset, + at::Tensor grad_mask, + at::Tensor grad_output, + int kernel_h, + int kernel_w, + int stride_h, + int stride_w, + int pad_h, + int pad_w, + int dilation_h, + int dilation_w, + int group, + int deformable_group, + const bool with_bias) { + TORCH_CHECK(input.is_contiguous(), "input tensor has to be contiguous"); + TORCH_CHECK(weight.is_contiguous(), "weight tensor has to be contiguous"); + + const int batch = input.size(0); + const int channels = input.size(1); + const int height = input.size(2); + const int width = input.size(3); + + const int channels_kernel = weight.size(1); + const int kernel_h_ = weight.size(2); + const int kernel_w_ = weight.size(3); + if (kernel_h_ != kernel_h || kernel_w_ != kernel_w) + AT_ERROR( + "Input shape and kernel shape wont match: (%d x %d vs %d x %d).", + kernel_h_, + kernel_w, + kernel_h_, + kernel_w_); + if (channels != channels_kernel * group) + AT_ERROR( + "Input shape and kernel channels wont match: (%d vs %d).", + channels, + channels_kernel * group); + + const int height_out = + (height + 2 * pad_h - (dilation_h * (kernel_h - 1) + 1)) / stride_h + 1; + const int width_out = + (width + 2 * pad_w - (dilation_w * (kernel_w - 1) + 1)) / stride_w + 1; + + if (ones.ndimension() != 2 || + ones.size(0) * ones.size(1) < height_out * width_out) { + // Resize plane and fill with ones... + ones = at::ones({height_out, width_out}, input.options()); + } + + grad_input = grad_input.view({batch, channels, height, width}); + columns = at::zeros( + {channels * kernel_h * kernel_w, height_out * width_out}, + input.options()); + + grad_output = grad_output.view({grad_output.size(0), + group, + grad_output.size(1) / group, + grad_output.size(2), + grad_output.size(3)}); + + for (int b = 0; b < batch; b++) { + // divide int group + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + weight = weight.view({group, + weight.size(0) / group, + weight.size(1), + weight.size(2), + weight.size(3)}); + + for (int g = 0; g < group; g++) { + columns[g].addmm_( + weight[g].flatten(1).transpose(0, 1), + grad_output[b][g].flatten(1), + 0.0f, + 1.0f); + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + weight = weight.view({weight.size(0) * weight.size(1), + weight.size(2), + weight.size(3), + weight.size(4)}); + + // gradient w.r.t. input coordinate data + modulated_deformable_col2im_coord_cuda( + columns, + input[b], + offset[b], + mask[b], + 1, + channels, + height, + width, + height_out, + width_out, + kernel_h, + kernel_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + deformable_group, + grad_offset[b], + grad_mask[b]); + // gradient w.r.t. input data + modulated_deformable_col2im_cuda( + columns, + offset[b], + mask[b], + 1, + channels, + height, + width, + height_out, + width_out, + kernel_h, + kernel_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + deformable_group, + grad_input[b]); + + // gradient w.r.t. weight, dWeight should accumulate across the batch and + // group + modulated_deformable_im2col_cuda( + input[b], + offset[b], + mask[b], + 1, + channels, + height, + width, + height_out, + width_out, + kernel_h, + kernel_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + deformable_group, + columns); + + columns = columns.view({group, columns.size(0) / group, columns.size(1)}); + grad_weight = grad_weight.view({group, + grad_weight.size(0) / group, + grad_weight.size(1), + grad_weight.size(2), + grad_weight.size(3)}); + if (with_bias) + grad_bias = grad_bias.view({group, grad_bias.size(0) / group}); + + for (int g = 0; g < group; g++) { + grad_weight[g] = + grad_weight[g] + .flatten(1) + .addmm_(grad_output[b][g].flatten(1), columns[g].transpose(0, 1)) + .view_as(grad_weight[g]); + if (with_bias) { + grad_bias[g] = + grad_bias[g] + .view({-1, 1}) + .addmm_(grad_output[b][g].flatten(1), ones.view({-1, 1})) + .view(-1); + } + } + + columns = + columns.view({columns.size(0) * columns.size(1), columns.size(2)}); + grad_weight = grad_weight.view({grad_weight.size(0) * grad_weight.size(1), + grad_weight.size(2), + grad_weight.size(3), + grad_weight.size(4)}); + if (with_bias) + grad_bias = grad_bias.view({grad_bias.size(0) * grad_bias.size(1)}); + } + grad_output = grad_output.view({grad_output.size(0) * grad_output.size(1), + grad_output.size(2), + grad_output.size(3), + grad_output.size(4)}); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda_kernel.cu b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda_kernel.cu new file mode 100644 index 0000000..841f316 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/deformable/deform_conv_cuda_kernel.cu @@ -0,0 +1,1288 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +// modified from +// https://github.com/open-mmlab/mmdetection/blob/master/mmdet/ops/dcn/src/deform_conv_cuda_kernel.cu +// Original license: Apache 2.0 +// clang-format off + +// modify from +// https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/blob/mmdetection/mmdet/ops/dcn/src/deform_conv_cuda_kernel.cu + +/*! + ******************* BEGIN Caffe Copyright Notice and Disclaimer ***************** + * + * COPYRIGHT + * + * All contributions by the University of California: + * Copyright (c) 2014-2017 The Regents of the University of California (Regents) + * All rights reserved. + * + * All other contributions: + * Copyright (c) 2014-2017, the respective contributors + * All rights reserved. + * + * Caffe uses a shared copyright model: each contributor holds copyright over + * their contributions to Caffe. The project versioning records all such + * contribution and copyright details. If a contributor wants to further mark + * their specific copyright on a particular contribution, they should indicate + * their copyright solely in the commit message of the change when it is + * committed. + * + * LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + *AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + *IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + *DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + *SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + *CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + *OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + *OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * CONTRIBUTION AGREEMENT + * + * By contributing to the BVLC/caffe repository through pull-request, comment, + * or otherwise, the contributor releases their content to the + * license and copyright terms herein. + * + ***************** END Caffe Copyright Notice and Disclaimer ********************* + * + * Copyright (c) 2018 Microsoft + * Licensed under The MIT License [see LICENSE for details] + * \file modulated_deformable_im2col.cuh + * \brief Function definitions of converting an image to + * column matrix based on kernel, padding, dilation, and offset. + * These functions are mainly used in deformable convolution operators. + * \ref: https://arxiv.org/abs/1703.06211 + * \author Yuwen Xiong, Haozhi Qi, Jifeng Dai, Xizhou Zhu, Han Hu, Dazhi Cheng + */ + +#include +#include +#include +#include +#include +#include + +using namespace at; + +#define CUDA_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < (n); \ + i += blockDim.x * gridDim.x) + + +namespace { + +const int CUDA_NUM_THREADS = 1024; +const int kMaxGridNum = 65535; + +inline int GET_BLOCKS(const int N) { + return std::min(kMaxGridNum, (N + CUDA_NUM_THREADS - 1) / CUDA_NUM_THREADS); +} + +} + +template +__device__ scalar_t deformable_im2col_bilinear( + const scalar_t* bottom_data, + const int data_width, + const int height, + const int width, + scalar_t h, + scalar_t w) { + int h_low = floor(h); + int w_low = floor(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + scalar_t lh = h - h_low; + scalar_t lw = w - w_low; + scalar_t hh = 1 - lh, hw = 1 - lw; + + scalar_t v1 = 0; + if (h_low >= 0 && w_low >= 0) + v1 = bottom_data[h_low * data_width + w_low]; + scalar_t v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = bottom_data[h_low * data_width + w_high]; + scalar_t v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = bottom_data[h_high * data_width + w_low]; + scalar_t v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = bottom_data[h_high * data_width + w_high]; + + scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +template +__device__ scalar_t get_gradient_weight( + scalar_t argmax_h, + scalar_t argmax_w, + const int h, + const int w, + const int height, + const int width) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +template +__device__ scalar_t get_coordinate_weight( + scalar_t argmax_h, + scalar_t argmax_w, + const int height, + const int width, + const scalar_t* im_data, + const int data_width, + const int bp_dir) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + + if (bp_dir == 0) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } else if (bp_dir == 1) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +template +__global__ void deformable_im2col_gpu_kernel( + const int n, + const scalar_t* data_im, + const scalar_t* data_offset, + const int height, + const int width, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, + const int num_channels, + const int deformable_group, + const int height_col, + const int width_col, + scalar_t* data_col) { + CUDA_KERNEL_LOOP(index, n) { + // index index of output matrix + const int w_col = index % width_col; + const int h_col = (index / width_col) % height_col; + const int b_col = (index / width_col / height_col) % batch_size; + const int c_im = (index / width_col / height_col) / batch_size; + const int c_col = c_im * kernel_h * kernel_w; + + // compute deformable group index + const int deformable_group_index = c_im / channel_per_deformable_group; + + const int h_in = h_col * stride_h - pad_h; + const int w_in = w_col * stride_w - pad_w; + scalar_t* data_col_ptr = data_col + + ((c_col * batch_size + b_col) * height_col + h_col) * width_col + w_col; + // const scalar_t* data_im_ptr = data_im + ((b_col * num_channels + c_im) * + // height + h_in) * width + w_in; + const scalar_t* data_im_ptr = + data_im + (b_col * num_channels + c_im) * height * width; + const scalar_t* data_offset_ptr = data_offset + + (b_col * deformable_group + deformable_group_index) * 2 * kernel_h * + kernel_w * height_col * width_col; + + for (int i = 0; i < kernel_h; ++i) { + for (int j = 0; j < kernel_w; ++j) { + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_col) * width_col + w_col; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_col) * width_col + + w_col; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + scalar_t val = static_cast(0); + const scalar_t h_im = h_in + i * dilation_h + offset_h; + const scalar_t w_im = w_in + j * dilation_w + offset_w; + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) { + // const scalar_t map_h = i * dilation_h + offset_h; + // const scalar_t map_w = j * dilation_w + offset_w; + // const int cur_height = height - h_in; + // const int cur_width = width - w_in; + // val = deformable_im2col_bilinear(data_im_ptr, width, cur_height, + // cur_width, map_h, map_w); + val = deformable_im2col_bilinear( + data_im_ptr, width, height, width, h_im, w_im); + } + *data_col_ptr = val; + data_col_ptr += batch_size * height_col * width_col; + } + } + } +} + + +template +__global__ void deformable_col2im_gpu_kernel( + const int n, + const scalar_t* data_col, + const scalar_t* data_offset, + const int channels, + const int height, + const int width, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, + const int deformable_group, + const int height_col, + const int width_col, + scalar_t* grad_im) { + CUDA_KERNEL_LOOP(index, n) { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = + (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = + index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const scalar_t* data_offset_ptr = data_offset + + (b * deformable_group + deformable_group_index) * 2 * kernel_h * + kernel_w * height_col * width_col; + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t cur_inv_h_data = h_in + i * dilation_h + offset_h; + const scalar_t cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const scalar_t cur_top_grad = data_col[index]; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + for (int dy = -2; dy <= 2; dy++) { + for (int dx = -2; dx <= 2; dx++) { + if (cur_h + dy >= 0 && cur_h + dy < height && cur_w + dx >= 0 && + cur_w + dx < width && abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) { + int cur_bottom_grad_pos = + ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + scalar_t weight = get_gradient_weight( + cur_inv_h_data, + cur_inv_w_data, + cur_h + dy, + cur_w + dx, + height, + width); + atomicAdd(grad_im + cur_bottom_grad_pos, weight * cur_top_grad); + } + } + } + } +} + + +template +__global__ void deformable_col2im_coord_gpu_kernel( + const int n, + const scalar_t* data_col, + const scalar_t* data_im, + const scalar_t* data_offset, + const int channels, + const int height, + const int width, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, + const int offset_channels, + const int deformable_group, + const int height_col, + const int width_col, + scalar_t* grad_offset) { + CUDA_KERNEL_LOOP(index, n) { + scalar_t val = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const scalar_t* data_col_ptr = data_col + + deformable_group_index * channel_per_deformable_group * batch_size * + width_col * height_col; + const scalar_t* data_im_ptr = data_im + + (b * deformable_group + deformable_group_index) * + channel_per_deformable_group / kernel_h / kernel_w * height * width; + const scalar_t* data_offset_ptr = data_offset + + (b * deformable_group + deformable_group_index) * 2 * kernel_h * + kernel_w * height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; + col_c += col_step) { + const int col_pos = + (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = + (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = + (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = + (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + + w_out); + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + scalar_t inv_h = h_in + i * dilation_h + offset_h; + scalar_t inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) { + inv_h = inv_w = -2; + } + const scalar_t weight = get_coordinate_weight( + inv_h, + inv_w, + height, + width, + data_im_ptr + cnt * height * width, + width, + bp_dir); + val += weight * data_col_ptr[col_pos]; + cnt += 1; + } + + grad_offset[index] = val; + } +} + + +namespace detectron2 { + +void deformable_im2col( + const at::Tensor data_im, + const at::Tensor data_offset, + const int channels, + const int height, + const int width, + const int ksize_h, + const int ksize_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int parallel_imgs, + const int deformable_group, + at::Tensor data_col) { + // num_axes should be smaller than block size + // todo: check parallel_imgs is correctly passed in + int height_col = + (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = + (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = channels * height_col * width_col * parallel_imgs; + int channel_per_deformable_group = channels / deformable_group; + + at::cuda::CUDAGuard device_guard(data_im.device()); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_im.scalar_type(), "deformable_im2col_gpu", ([&] { + const scalar_t* data_im_ = data_im.data_ptr(); + const scalar_t* data_offset_ = data_offset.data_ptr(); + scalar_t* data_col_ = data_col.data_ptr(); + + deformable_im2col_gpu_kernel<<< + GET_BLOCKS(num_kernels), + CUDA_NUM_THREADS, + 0, + stream>>>( + num_kernels, + data_im_, + data_offset_, + height, + width, + ksize_h, + ksize_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + channel_per_deformable_group, + parallel_imgs, + channels, + deformable_group, + height_col, + width_col, + data_col_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf("error in deformable_im2col: %s\n", cudaGetErrorString(err)); + } +} + + +void deformable_col2im( + const at::Tensor data_col, + const at::Tensor data_offset, + const int channels, + const int height, + const int width, + const int ksize_h, + const int ksize_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int parallel_imgs, + const int deformable_group, + at::Tensor grad_im) { + // todo: make sure parallel_imgs is passed in correctly + int height_col = + (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = + (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = + channels * ksize_h * ksize_w * height_col * width_col * parallel_imgs; + int channel_per_deformable_group = channels / deformable_group; + + at::cuda::CUDAGuard device_guard(data_col.device()); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.scalar_type(), "deformable_col2im_gpu", ([&] { + const scalar_t* data_col_ = data_col.data_ptr(); + const scalar_t* data_offset_ = data_offset.data_ptr(); + scalar_t* grad_im_ = grad_im.data_ptr(); + + deformable_col2im_gpu_kernel<<< + GET_BLOCKS(num_kernels), + CUDA_NUM_THREADS, + 0, + stream>>>( + num_kernels, + data_col_, + data_offset_, + channels, + height, + width, + ksize_h, + ksize_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + channel_per_deformable_group, + parallel_imgs, + deformable_group, + height_col, + width_col, + grad_im_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf("error in deformable_col2im: %s\n", cudaGetErrorString(err)); + } +} + + +void deformable_col2im_coord( + const at::Tensor data_col, + const at::Tensor data_im, + const at::Tensor data_offset, + const int channels, + const int height, + const int width, + const int ksize_h, + const int ksize_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int parallel_imgs, + const int deformable_group, + at::Tensor grad_offset) { + int height_col = + (height + 2 * pad_h - (dilation_h * (ksize_h - 1) + 1)) / stride_h + 1; + int width_col = + (width + 2 * pad_w - (dilation_w * (ksize_w - 1) + 1)) / stride_w + 1; + int num_kernels = height_col * width_col * 2 * ksize_h * ksize_w * + deformable_group * parallel_imgs; + int channel_per_deformable_group = + channels * ksize_h * ksize_w / deformable_group; + + at::cuda::CUDAGuard device_guard(data_col.device()); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.scalar_type(), "deformable_col2im_coord_gpu", ([&] { + const scalar_t* data_col_ = data_col.data_ptr(); + const scalar_t* data_im_ = data_im.data_ptr(); + const scalar_t* data_offset_ = data_offset.data_ptr(); + scalar_t* grad_offset_ = grad_offset.data_ptr(); + + deformable_col2im_coord_gpu_kernel<<< + GET_BLOCKS(num_kernels), + CUDA_NUM_THREADS, + 0, + stream>>>( + num_kernels, + data_col_, + data_im_, + data_offset_, + channels, + height, + width, + ksize_h, + ksize_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + channel_per_deformable_group, + parallel_imgs, + 2 * ksize_h * ksize_w * deformable_group, + deformable_group, + height_col, + width_col, + grad_offset_); + })); +} + +} // namespace detectron2 + + +template +__device__ scalar_t dmcn_im2col_bilinear( + const scalar_t* bottom_data, + const int data_width, + const int height, + const int width, + scalar_t h, + scalar_t w) { + int h_low = floor(h); + int w_low = floor(w); + int h_high = h_low + 1; + int w_high = w_low + 1; + + scalar_t lh = h - h_low; + scalar_t lw = w - w_low; + scalar_t hh = 1 - lh, hw = 1 - lw; + + scalar_t v1 = 0; + if (h_low >= 0 && w_low >= 0) + v1 = bottom_data[h_low * data_width + w_low]; + scalar_t v2 = 0; + if (h_low >= 0 && w_high <= width - 1) + v2 = bottom_data[h_low * data_width + w_high]; + scalar_t v3 = 0; + if (h_high <= height - 1 && w_low >= 0) + v3 = bottom_data[h_high * data_width + w_low]; + scalar_t v4 = 0; + if (h_high <= height - 1 && w_high <= width - 1) + v4 = bottom_data[h_high * data_width + w_high]; + + scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; + + scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); + return val; +} + +template +__device__ scalar_t dmcn_get_gradient_weight( + scalar_t argmax_h, + scalar_t argmax_w, + const int h, + const int w, + const int height, + const int width) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + if (h == argmax_h_low && w == argmax_w_low) + weight = (h + 1 - argmax_h) * (w + 1 - argmax_w); + if (h == argmax_h_low && w == argmax_w_high) + weight = (h + 1 - argmax_h) * (argmax_w + 1 - w); + if (h == argmax_h_high && w == argmax_w_low) + weight = (argmax_h + 1 - h) * (w + 1 - argmax_w); + if (h == argmax_h_high && w == argmax_w_high) + weight = (argmax_h + 1 - h) * (argmax_w + 1 - w); + return weight; +} + +template +__device__ scalar_t dmcn_get_coordinate_weight( + scalar_t argmax_h, + scalar_t argmax_w, + const int height, + const int width, + const scalar_t* im_data, + const int data_width, + const int bp_dir) { + if (argmax_h <= -1 || argmax_h >= height || argmax_w <= -1 || + argmax_w >= width) { + // empty + return 0; + } + + int argmax_h_low = floor(argmax_h); + int argmax_w_low = floor(argmax_w); + int argmax_h_high = argmax_h_low + 1; + int argmax_w_high = argmax_w_low + 1; + + scalar_t weight = 0; + + if (bp_dir == 0) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += -1 * (argmax_w - argmax_w_low) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += (argmax_w_low + 1 - argmax_w) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_w - argmax_w_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } else if (bp_dir == 1) { + if (argmax_h_low >= 0 && argmax_w_low >= 0) + weight += -1 * (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_low]; + if (argmax_h_low >= 0 && argmax_w_high <= width - 1) + weight += (argmax_h_low + 1 - argmax_h) * + im_data[argmax_h_low * data_width + argmax_w_high]; + if (argmax_h_high <= height - 1 && argmax_w_low >= 0) + weight += -1 * (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_low]; + if (argmax_h_high <= height - 1 && argmax_w_high <= width - 1) + weight += (argmax_h - argmax_h_low) * + im_data[argmax_h_high * data_width + argmax_w_high]; + } + + return weight; +} + +template +__global__ void modulated_deformable_im2col_gpu_kernel( + const int n, + const scalar_t* data_im, + const scalar_t* data_offset, + const scalar_t* data_mask, + const int height, + const int width, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, + const int num_channels, + const int deformable_group, + const int height_col, + const int width_col, + scalar_t* data_col) { + CUDA_KERNEL_LOOP(index, n) { + // index index of output matrix + const int w_col = index % width_col; + const int h_col = (index / width_col) % height_col; + const int b_col = (index / width_col / height_col) % batch_size; + const int c_im = (index / width_col / height_col) / batch_size; + const int c_col = c_im * kernel_h * kernel_w; + + // compute deformable group index + const int deformable_group_index = c_im / channel_per_deformable_group; + + const int h_in = h_col * stride_h - pad_h; + const int w_in = w_col * stride_w - pad_w; + + scalar_t* data_col_ptr = data_col + + ((c_col * batch_size + b_col) * height_col + h_col) * width_col + w_col; + // const float* data_im_ptr = data_im + ((b_col * num_channels + c_im) * + // height + h_in) * width + w_in; + const scalar_t* data_im_ptr = + data_im + (b_col * num_channels + c_im) * height * width; + const scalar_t* data_offset_ptr = data_offset + + (b_col * deformable_group + deformable_group_index) * 2 * kernel_h * + kernel_w * height_col * width_col; + + const scalar_t* data_mask_ptr = data_mask + + (b_col * deformable_group + deformable_group_index) * kernel_h * + kernel_w * height_col * width_col; + + for (int i = 0; i < kernel_h; ++i) { + for (int j = 0; j < kernel_w; ++j) { + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_col) * width_col + w_col; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_col) * width_col + + w_col; + const int data_mask_hw_ptr = + ((i * kernel_w + j) * height_col + h_col) * width_col + w_col; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t mask = data_mask_ptr[data_mask_hw_ptr]; + scalar_t val = static_cast(0); + const scalar_t h_im = h_in + i * dilation_h + offset_h; + const scalar_t w_im = w_in + j * dilation_w + offset_w; + // if (h_im >= 0 && w_im >= 0 && h_im < height && w_im < width) { + if (h_im > -1 && w_im > -1 && h_im < height && w_im < width) { + // const float map_h = i * dilation_h + offset_h; + // const float map_w = j * dilation_w + offset_w; + // const int cur_height = height - h_in; + // const int cur_width = width - w_in; + // val = dmcn_im2col_bilinear(data_im_ptr, width, cur_height, + // cur_width, map_h, map_w); + val = dmcn_im2col_bilinear( + data_im_ptr, width, height, width, h_im, w_im); + } + *data_col_ptr = val * mask; + data_col_ptr += batch_size * height_col * width_col; + // data_col_ptr += height_col * width_col; + } + } + } +} + +template +__global__ void modulated_deformable_col2im_gpu_kernel( + const int n, + const scalar_t* data_col, + const scalar_t* data_offset, + const scalar_t* data_mask, + const int channels, + const int height, + const int width, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, + const int deformable_group, + const int height_col, + const int width_col, + scalar_t* grad_im) { + CUDA_KERNEL_LOOP(index, n) { + const int j = (index / width_col / height_col / batch_size) % kernel_w; + const int i = + (index / width_col / height_col / batch_size / kernel_w) % kernel_h; + const int c = + index / width_col / height_col / batch_size / kernel_w / kernel_h; + // compute the start and end of the output + + const int deformable_group_index = c / channel_per_deformable_group; + + int w_out = index % width_col; + int h_out = (index / width_col) % height_col; + int b = (index / width_col / height_col) % batch_size; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + + const scalar_t* data_offset_ptr = data_offset + + (b * deformable_group + deformable_group_index) * 2 * kernel_h * + kernel_w * height_col * width_col; + const scalar_t* data_mask_ptr = data_mask + + (b * deformable_group + deformable_group_index) * kernel_h * kernel_w * + height_col * width_col; + const int data_offset_h_ptr = + ((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out; + const int data_offset_w_ptr = + ((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + w_out; + const int data_mask_hw_ptr = + ((i * kernel_w + j) * height_col + h_out) * width_col + w_out; + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t mask = data_mask_ptr[data_mask_hw_ptr]; + const scalar_t cur_inv_h_data = h_in + i * dilation_h + offset_h; + const scalar_t cur_inv_w_data = w_in + j * dilation_w + offset_w; + + const scalar_t cur_top_grad = data_col[index] * mask; + const int cur_h = (int)cur_inv_h_data; + const int cur_w = (int)cur_inv_w_data; + for (int dy = -2; dy <= 2; dy++) { + for (int dx = -2; dx <= 2; dx++) { + if (cur_h + dy >= 0 && cur_h + dy < height && cur_w + dx >= 0 && + cur_w + dx < width && abs(cur_inv_h_data - (cur_h + dy)) < 1 && + abs(cur_inv_w_data - (cur_w + dx)) < 1) { + int cur_bottom_grad_pos = + ((b * channels + c) * height + cur_h + dy) * width + cur_w + dx; + scalar_t weight = dmcn_get_gradient_weight( + cur_inv_h_data, + cur_inv_w_data, + cur_h + dy, + cur_w + dx, + height, + width); + atomicAdd(grad_im + cur_bottom_grad_pos, weight * cur_top_grad); + } + } + } + } +} + +template +__global__ void modulated_deformable_col2im_coord_gpu_kernel( + const int n, + const scalar_t* data_col, + const scalar_t* data_im, + const scalar_t* data_offset, + const scalar_t* data_mask, + const int channels, + const int height, + const int width, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int channel_per_deformable_group, + const int batch_size, + const int offset_channels, + const int deformable_group, + const int height_col, + const int width_col, + scalar_t* grad_offset, + scalar_t* grad_mask) { + CUDA_KERNEL_LOOP(index, n) { + scalar_t val = 0, mval = 0; + int w = index % width_col; + int h = (index / width_col) % height_col; + int c = (index / width_col / height_col) % offset_channels; + int b = (index / width_col / height_col) / offset_channels; + // compute the start and end of the output + + const int deformable_group_index = c / (2 * kernel_h * kernel_w); + const int col_step = kernel_h * kernel_w; + int cnt = 0; + const scalar_t* data_col_ptr = data_col + + deformable_group_index * channel_per_deformable_group * batch_size * + width_col * height_col; + const scalar_t* data_im_ptr = data_im + + (b * deformable_group + deformable_group_index) * + channel_per_deformable_group / kernel_h / kernel_w * height * width; + const scalar_t* data_offset_ptr = data_offset + + (b * deformable_group + deformable_group_index) * 2 * kernel_h * + kernel_w * height_col * width_col; + const scalar_t* data_mask_ptr = data_mask + + (b * deformable_group + deformable_group_index) * kernel_h * kernel_w * + height_col * width_col; + + const int offset_c = c - deformable_group_index * 2 * kernel_h * kernel_w; + + for (int col_c = (offset_c / 2); col_c < channel_per_deformable_group; + col_c += col_step) { + const int col_pos = + (((col_c * batch_size + b) * height_col) + h) * width_col + w; + const int bp_dir = offset_c % 2; + + int j = (col_pos / width_col / height_col / batch_size) % kernel_w; + int i = + (col_pos / width_col / height_col / batch_size / kernel_w) % kernel_h; + int w_out = col_pos % width_col; + int h_out = (col_pos / width_col) % height_col; + int w_in = w_out * stride_w - pad_w; + int h_in = h_out * stride_h - pad_h; + const int data_offset_h_ptr = + (((2 * (i * kernel_w + j)) * height_col + h_out) * width_col + w_out); + const int data_offset_w_ptr = + (((2 * (i * kernel_w + j) + 1) * height_col + h_out) * width_col + + w_out); + const int data_mask_hw_ptr = + (((i * kernel_w + j) * height_col + h_out) * width_col + w_out); + const scalar_t offset_h = data_offset_ptr[data_offset_h_ptr]; + const scalar_t offset_w = data_offset_ptr[data_offset_w_ptr]; + const scalar_t mask = data_mask_ptr[data_mask_hw_ptr]; + scalar_t inv_h = h_in + i * dilation_h + offset_h; + scalar_t inv_w = w_in + j * dilation_w + offset_w; + if (inv_h <= -1 || inv_w <= -1 || inv_h >= height || inv_w >= width) { + inv_h = inv_w = -2; + } else { + mval += data_col_ptr[col_pos] * + dmcn_im2col_bilinear( + data_im_ptr + cnt * height * width, + width, + height, + width, + inv_h, + inv_w); + } + const scalar_t weight = dmcn_get_coordinate_weight( + inv_h, + inv_w, + height, + width, + data_im_ptr + cnt * height * width, + width, + bp_dir); + val += weight * data_col_ptr[col_pos] * mask; + cnt += 1; + } + // KERNEL_ASSIGN(grad_offset[index], offset_req, val); + grad_offset[index] = val; + if (offset_c % 2 == 0) + // KERNEL_ASSIGN(grad_mask[(((b * deformable_group + + // deformable_group_index) * kernel_h * kernel_w + offset_c / 2) * + // height_col + h) * width_col + w], mask_req, mval); + grad_mask + [(((b * deformable_group + deformable_group_index) * kernel_h * + kernel_w + + offset_c / 2) * + height_col + + h) * + width_col + + w] = mval; + } +} + + +namespace detectron2 { + +void modulated_deformable_im2col_cuda( + const at::Tensor data_im, + const at::Tensor data_offset, + const at::Tensor data_mask, + const int batch_size, + const int channels, + const int height_im, + const int width_im, + const int height_col, + const int width_col, + const int kernel_h, + const int kenerl_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int deformable_group, + at::Tensor data_col) { + // num_axes should be smaller than block size + const int channel_per_deformable_group = channels / deformable_group; + const int num_kernels = channels * batch_size * height_col * width_col; + + at::cuda::CUDAGuard device_guard(data_im.device()); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_im.scalar_type(), "modulated_deformable_im2col_gpu", ([&] { + const scalar_t* data_im_ = data_im.data_ptr(); + const scalar_t* data_offset_ = data_offset.data_ptr(); + const scalar_t* data_mask_ = data_mask.data_ptr(); + scalar_t* data_col_ = data_col.data_ptr(); + + modulated_deformable_im2col_gpu_kernel<<< + GET_BLOCKS(num_kernels), + CUDA_NUM_THREADS, + 0, + stream>>>( + num_kernels, + data_im_, + data_offset_, + data_mask_, + height_im, + width_im, + kernel_h, + kenerl_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + channel_per_deformable_group, + batch_size, + channels, + deformable_group, + height_col, + width_col, + data_col_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf( + "error in modulated_deformable_im2col_cuda: %s\n", + cudaGetErrorString(err)); + } +} + +void modulated_deformable_col2im_cuda( + const at::Tensor data_col, + const at::Tensor data_offset, + const at::Tensor data_mask, + const int batch_size, + const int channels, + const int height_im, + const int width_im, + const int height_col, + const int width_col, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int deformable_group, + at::Tensor grad_im) { + const int channel_per_deformable_group = channels / deformable_group; + const int num_kernels = + channels * kernel_h * kernel_w * batch_size * height_col * width_col; + + at::cuda::CUDAGuard device_guard(data_col.device()); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.scalar_type(), "modulated_deformable_col2im_gpu", ([&] { + const scalar_t* data_col_ = data_col.data_ptr(); + const scalar_t* data_offset_ = data_offset.data_ptr(); + const scalar_t* data_mask_ = data_mask.data_ptr(); + scalar_t* grad_im_ = grad_im.data_ptr(); + + modulated_deformable_col2im_gpu_kernel<<< + GET_BLOCKS(num_kernels), + CUDA_NUM_THREADS, + 0, + stream>>>( + num_kernels, + data_col_, + data_offset_, + data_mask_, + channels, + height_im, + width_im, + kernel_h, + kernel_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + channel_per_deformable_group, + batch_size, + deformable_group, + height_col, + width_col, + grad_im_); + })); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf( + "error in modulated_deformable_col2im_cuda: %s\n", + cudaGetErrorString(err)); + } +} + +void modulated_deformable_col2im_coord_cuda( + const at::Tensor data_col, + const at::Tensor data_im, + const at::Tensor data_offset, + const at::Tensor data_mask, + const int batch_size, + const int channels, + const int height_im, + const int width_im, + const int height_col, + const int width_col, + const int kernel_h, + const int kernel_w, + const int pad_h, + const int pad_w, + const int stride_h, + const int stride_w, + const int dilation_h, + const int dilation_w, + const int deformable_group, + at::Tensor grad_offset, + at::Tensor grad_mask) { + const int num_kernels = batch_size * height_col * width_col * 2 * kernel_h * + kernel_w * deformable_group; + const int channel_per_deformable_group = + channels * kernel_h * kernel_w / deformable_group; + + at::cuda::CUDAGuard device_guard(data_col.device()); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES_AND_HALF( + data_col.scalar_type(), "modulated_deformable_col2im_coord_gpu", ([&] { + const scalar_t* data_col_ = data_col.data_ptr(); + const scalar_t* data_im_ = data_im.data_ptr(); + const scalar_t* data_offset_ = data_offset.data_ptr(); + const scalar_t* data_mask_ = data_mask.data_ptr(); + scalar_t* grad_offset_ = grad_offset.data_ptr(); + scalar_t* grad_mask_ = grad_mask.data_ptr(); + + modulated_deformable_col2im_coord_gpu_kernel<<< + GET_BLOCKS(num_kernels), + CUDA_NUM_THREADS, + 0, + stream>>>( + num_kernels, + data_col_, + data_im_, + data_offset_, + data_mask_, + channels, + height_im, + width_im, + kernel_h, + kernel_w, + pad_h, + pad_w, + stride_h, + stride_w, + dilation_h, + dilation_w, + channel_per_deformable_group, + batch_size, + 2 * kernel_h * kernel_w * deformable_group, + deformable_group, + height_col, + width_col, + grad_offset_, + grad_mask_); + })); + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf( + "error in modulated_deformable_col2im_coord_cuda: %s\n", + cudaGetErrorString(err)); + } +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated.h b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated.h new file mode 100644 index 0000000..9c86c8d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated.h @@ -0,0 +1,39 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#pragma once +#include + +namespace detectron2 { + +at::Tensor nms_rotated_cpu( + const at::Tensor& dets, + const at::Tensor& scores, + const float iou_threshold); + +#ifdef WITH_CUDA +at::Tensor nms_rotated_cuda( + const at::Tensor& dets, + const at::Tensor& scores, + const float iou_threshold); +#endif + +// Interface for Python +// inline is needed to prevent multiple function definitions when this header is +// included by different cpps +inline at::Tensor nms_rotated( + const at::Tensor& dets, + const at::Tensor& scores, + const float iou_threshold) { + assert(dets.device().is_cuda() == scores.device().is_cuda()); + if (dets.device().is_cuda()) { +#ifdef WITH_CUDA + return nms_rotated_cuda( + dets.contiguous(), scores.contiguous(), iou_threshold); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + + return nms_rotated_cpu(dets.contiguous(), scores.contiguous(), iou_threshold); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cpu.cpp b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cpu.cpp new file mode 100644 index 0000000..0658e38 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cpu.cpp @@ -0,0 +1,75 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include "../box_iou_rotated/box_iou_rotated_utils.h" +#include "nms_rotated.h" + +namespace detectron2 { + +template +at::Tensor nms_rotated_cpu_kernel( + const at::Tensor& dets, + const at::Tensor& scores, + const float iou_threshold) { + // nms_rotated_cpu_kernel is modified from torchvision's nms_cpu_kernel, + // however, the code in this function is much shorter because + // we delegate the IoU computation for rotated boxes to + // the single_box_iou_rotated function in box_iou_rotated_utils.h + AT_ASSERTM(dets.device().is_cpu(), "dets must be a CPU tensor"); + AT_ASSERTM(scores.device().is_cpu(), "scores must be a CPU tensor"); + AT_ASSERTM( + dets.scalar_type() == scores.scalar_type(), + "dets should have the same type as scores"); + + if (dets.numel() == 0) { + return at::empty({0}, dets.options().dtype(at::kLong)); + } + + auto order_t = std::get<1>(scores.sort(0, /* descending=*/true)); + + auto ndets = dets.size(0); + at::Tensor suppressed_t = at::zeros({ndets}, dets.options().dtype(at::kByte)); + at::Tensor keep_t = at::zeros({ndets}, dets.options().dtype(at::kLong)); + + auto suppressed = suppressed_t.data_ptr(); + auto keep = keep_t.data_ptr(); + auto order = order_t.data_ptr(); + + int64_t num_to_keep = 0; + + for (int64_t _i = 0; _i < ndets; _i++) { + auto i = order[_i]; + if (suppressed[i] == 1) { + continue; + } + + keep[num_to_keep++] = i; + + for (int64_t _j = _i + 1; _j < ndets; _j++) { + auto j = order[_j]; + if (suppressed[j] == 1) { + continue; + } + + auto ovr = single_box_iou_rotated( + dets[i].data_ptr(), dets[j].data_ptr()); + if (ovr >= iou_threshold) { + suppressed[j] = 1; + } + } + } + return keep_t.narrow(/*dim=*/0, /*start=*/0, /*length=*/num_to_keep); +} + +at::Tensor nms_rotated_cpu( + // input must be contiguous + const at::Tensor& dets, + const at::Tensor& scores, + const float iou_threshold) { + auto result = at::empty({0}, dets.options()); + + AT_DISPATCH_FLOATING_TYPES(dets.scalar_type(), "nms_rotated", [&] { + result = nms_rotated_cpu_kernel(dets, scores, iou_threshold); + }); + return result; +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cuda.cu b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cuda.cu new file mode 100644 index 0000000..40977a0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/nms_rotated/nms_rotated_cuda.cu @@ -0,0 +1,139 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include +#include +#include +#include +#include "../box_iou_rotated/box_iou_rotated_utils.h" + +using namespace detectron2; + +namespace { +int const threadsPerBlock = sizeof(unsigned long long) * 8; +} + +template +__global__ void nms_rotated_cuda_kernel( + const int n_boxes, + const float iou_threshold, + const T* dev_boxes, + unsigned long long* dev_mask) { + // nms_rotated_cuda_kernel is modified from torchvision's nms_cuda_kernel + + const int row_start = blockIdx.y; + const int col_start = blockIdx.x; + + // if (row_start > col_start) return; + + const int row_size = + min(n_boxes - row_start * threadsPerBlock, threadsPerBlock); + const int col_size = + min(n_boxes - col_start * threadsPerBlock, threadsPerBlock); + + // Compared to nms_cuda_kernel, where each box is represented with 4 values + // (x1, y1, x2, y2), each rotated box is represented with 5 values + // (x_center, y_center, width, height, angle_degrees) here. + __shared__ T block_boxes[threadsPerBlock * 5]; + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 5 + 0] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 0]; + block_boxes[threadIdx.x * 5 + 1] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 1]; + block_boxes[threadIdx.x * 5 + 2] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 2]; + block_boxes[threadIdx.x * 5 + 3] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 3]; + block_boxes[threadIdx.x * 5 + 4] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 4]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = threadsPerBlock * row_start + threadIdx.x; + const T* cur_box = dev_boxes + cur_box_idx * 5; + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + // Instead of devIoU used by original horizontal nms, here + // we use the single_box_iou_rotated function from box_iou_rotated_utils.h + if (single_box_iou_rotated(cur_box, block_boxes + i * 5) > + iou_threshold) { + t |= 1ULL << i; + } + } + const int col_blocks = at::cuda::ATenCeilDiv(n_boxes, threadsPerBlock); + dev_mask[cur_box_idx * col_blocks + col_start] = t; + } +} + +namespace detectron2 { + +at::Tensor nms_rotated_cuda( + // input must be contiguous + const at::Tensor& dets, + const at::Tensor& scores, + float iou_threshold) { + // using scalar_t = float; + AT_ASSERTM(dets.is_cuda(), "dets must be a CUDA tensor"); + AT_ASSERTM(scores.is_cuda(), "scores must be a CUDA tensor"); + at::cuda::CUDAGuard device_guard(dets.device()); + + auto order_t = std::get<1>(scores.sort(0, /* descending=*/true)); + auto dets_sorted = dets.index_select(0, order_t); + + auto dets_num = dets.size(0); + + const int col_blocks = + at::cuda::ATenCeilDiv(static_cast(dets_num), threadsPerBlock); + + at::Tensor mask = + at::empty({dets_num * col_blocks}, dets.options().dtype(at::kLong)); + + dim3 blocks(col_blocks, col_blocks); + dim3 threads(threadsPerBlock); + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + AT_DISPATCH_FLOATING_TYPES( + dets_sorted.scalar_type(), "nms_rotated_kernel_cuda", [&] { + nms_rotated_cuda_kernel<<>>( + dets_num, + iou_threshold, + dets_sorted.data_ptr(), + (unsigned long long*)mask.data_ptr()); + }); + + at::Tensor mask_cpu = mask.to(at::kCPU); + unsigned long long* mask_host = + (unsigned long long*)mask_cpu.data_ptr(); + + std::vector remv(col_blocks); + memset(&remv[0], 0, sizeof(unsigned long long) * col_blocks); + + at::Tensor keep = + at::empty({dets_num}, dets.options().dtype(at::kLong).device(at::kCPU)); + int64_t* keep_out = keep.data_ptr(); + + int num_to_keep = 0; + for (int i = 0; i < dets_num; i++) { + int nblock = i / threadsPerBlock; + int inblock = i % threadsPerBlock; + + if (!(remv[nblock] & (1ULL << inblock))) { + keep_out[num_to_keep++] = i; + unsigned long long* p = mask_host + i * col_blocks; + for (int j = nblock; j < col_blocks; j++) { + remv[j] |= p[j]; + } + } + } + + AT_CUDA_CHECK(cudaGetLastError()); + return order_t.index( + {keep.narrow(/*dim=*/0, /*start=*/0, /*length=*/num_to_keep) + .to(order_t.device(), keep.scalar_type())}); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/vision.cpp b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/vision.cpp new file mode 100644 index 0000000..fa7942e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/csrc/vision.cpp @@ -0,0 +1,102 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +#include +#include "ROIAlign/ROIAlign.h" +#include "ROIAlignRotated/ROIAlignRotated.h" +#include "box_iou_rotated/box_iou_rotated.h" +#include "deformable/deform_conv.h" +#include "nms_rotated/nms_rotated.h" + +namespace detectron2 { + +#ifdef WITH_CUDA +extern int get_cudart_version(); +#endif + +std::string get_cuda_version() { +#ifdef WITH_CUDA + std::ostringstream oss; + + // copied from + // https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/cuda/detail/CUDAHooks.cpp#L231 + auto printCudaStyleVersion = [&](int v) { + oss << (v / 1000) << "." << (v / 10 % 100); + if (v % 10 != 0) { + oss << "." << (v % 10); + } + }; + printCudaStyleVersion(get_cudart_version()); + return oss.str(); +#else + return std::string("not available"); +#endif +} + +// similar to +// https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/Version.cpp +std::string get_compiler_version() { + std::ostringstream ss; +#if defined(__GNUC__) +#ifndef __clang__ + +#if ((__GNUC__ <= 4) && (__GNUC_MINOR__ <= 8)) +#error "GCC >= 4.9 is required!" +#endif + + { ss << "GCC " << __GNUC__ << "." << __GNUC_MINOR__; } +#endif +#endif + +#if defined(__clang_major__) + { + ss << "clang " << __clang_major__ << "." << __clang_minor__ << "." + << __clang_patchlevel__; + } +#endif + +#if defined(_MSC_VER) + { ss << "MSVC " << _MSC_FULL_VER; } +#endif + return ss.str(); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("get_compiler_version", &get_compiler_version, "get_compiler_version"); + m.def("get_cuda_version", &get_cuda_version, "get_cuda_version"); + + m.def("box_iou_rotated", &box_iou_rotated, "IoU for rotated boxes"); + + m.def("deform_conv_forward", &deform_conv_forward, "deform_conv_forward"); + m.def( + "deform_conv_backward_input", + &deform_conv_backward_input, + "deform_conv_backward_input"); + m.def( + "deform_conv_backward_filter", + &deform_conv_backward_filter, + "deform_conv_backward_filter"); + m.def( + "modulated_deform_conv_forward", + &modulated_deform_conv_forward, + "modulated_deform_conv_forward"); + m.def( + "modulated_deform_conv_backward", + &modulated_deform_conv_backward, + "modulated_deform_conv_backward"); + + m.def("nms_rotated", &nms_rotated, "NMS for rotated boxes"); + + m.def("roi_align_forward", &ROIAlign_forward, "ROIAlign_forward"); + m.def("roi_align_backward", &ROIAlign_backward, "ROIAlign_backward"); + + m.def( + "roi_align_rotated_forward", + &ROIAlignRotated_forward, + "Forward pass for Rotated ROI-Align Operator"); + m.def( + "roi_align_rotated_backward", + &ROIAlignRotated_backward, + "Backward pass for Rotated ROI-Align Operator"); +} + +} // namespace detectron2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/deform_conv.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/deform_conv.py new file mode 100644 index 0000000..ba8c649 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/deform_conv.py @@ -0,0 +1,494 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +from functools import lru_cache +import torch +from torch import nn +from torch.autograd import Function +from torch.autograd.function import once_differentiable +from torch.nn.modules.utils import _pair + +from detectron2 import _C + +from .wrappers import _NewEmptyTensorOp + + +class _DeformConv(Function): + @staticmethod + def forward( + ctx, + input, + offset, + weight, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1, + im2col_step=64, + ): + if input is not None and input.dim() != 4: + raise ValueError( + "Expected 4D tensor as input, got {}D tensor instead.".format(input.dim()) + ) + ctx.stride = _pair(stride) + ctx.padding = _pair(padding) + ctx.dilation = _pair(dilation) + ctx.groups = groups + ctx.deformable_groups = deformable_groups + ctx.im2col_step = im2col_step + + ctx.save_for_backward(input, offset, weight) + + output = input.new_empty( + _DeformConv._output_size(input, weight, ctx.padding, ctx.dilation, ctx.stride) + ) + + ctx.bufs_ = [input.new_empty(0), input.new_empty(0)] # columns, ones + + if not input.is_cuda: + raise NotImplementedError + else: + cur_im2col_step = _DeformConv._cal_im2col_step(input.shape[0], ctx.im2col_step) + assert (input.shape[0] % cur_im2col_step) == 0, "im2col step must divide batchsize" + + _C.deform_conv_forward( + input, + weight, + offset, + output, + ctx.bufs_[0], + ctx.bufs_[1], + weight.size(3), + weight.size(2), + ctx.stride[1], + ctx.stride[0], + ctx.padding[1], + ctx.padding[0], + ctx.dilation[1], + ctx.dilation[0], + ctx.groups, + ctx.deformable_groups, + cur_im2col_step, + ) + return output + + @staticmethod + @once_differentiable + def backward(ctx, grad_output): + input, offset, weight = ctx.saved_tensors + + grad_input = grad_offset = grad_weight = None + + if not grad_output.is_cuda: + raise NotImplementedError + else: + cur_im2col_step = _DeformConv._cal_im2col_step(input.shape[0], ctx.im2col_step) + assert (input.shape[0] % cur_im2col_step) == 0, "im2col step must divide batchsize" + + if ctx.needs_input_grad[0] or ctx.needs_input_grad[1]: + grad_input = torch.zeros_like(input) + grad_offset = torch.zeros_like(offset) + _C.deform_conv_backward_input( + input, + offset, + grad_output, + grad_input, + grad_offset, + weight, + ctx.bufs_[0], + weight.size(3), + weight.size(2), + ctx.stride[1], + ctx.stride[0], + ctx.padding[1], + ctx.padding[0], + ctx.dilation[1], + ctx.dilation[0], + ctx.groups, + ctx.deformable_groups, + cur_im2col_step, + ) + + if ctx.needs_input_grad[2]: + grad_weight = torch.zeros_like(weight) + _C.deform_conv_backward_filter( + input, + offset, + grad_output, + grad_weight, + ctx.bufs_[0], + ctx.bufs_[1], + weight.size(3), + weight.size(2), + ctx.stride[1], + ctx.stride[0], + ctx.padding[1], + ctx.padding[0], + ctx.dilation[1], + ctx.dilation[0], + ctx.groups, + ctx.deformable_groups, + 1, + cur_im2col_step, + ) + + return grad_input, grad_offset, grad_weight, None, None, None, None, None, None + + @staticmethod + def _output_size(input, weight, padding, dilation, stride): + channels = weight.size(0) + output_size = (input.size(0), channels) + for d in range(input.dim() - 2): + in_size = input.size(d + 2) + pad = padding[d] + kernel = dilation[d] * (weight.size(d + 2) - 1) + 1 + stride_ = stride[d] + output_size += ((in_size + (2 * pad) - kernel) // stride_ + 1,) + if not all(map(lambda s: s > 0, output_size)): + raise ValueError( + "convolution input is too small (output would be {})".format( + "x".join(map(str, output_size)) + ) + ) + return output_size + + @staticmethod + @lru_cache(maxsize=128) + def _cal_im2col_step(input_size, default_size): + """ + Calculate proper im2col step size, which should be divisible by input_size and not larger + than prefer_size. Meanwhile the step size should be as large as possible to be more + efficient. So we choose the largest one among all divisors of input_size which are smaller + than prefer_size. + :param input_size: input batch size . + :param default_size: default preferred im2col step size. + :return: the largest proper step size. + """ + if input_size <= default_size: + return input_size + best_step = 1 + for step in range(2, min(int(math.sqrt(input_size)) + 1, default_size)): + if input_size % step == 0: + if input_size // step <= default_size: + return input_size // step + best_step = step + + return best_step + + +class _ModulatedDeformConv(Function): + @staticmethod + def forward( + ctx, + input, + offset, + mask, + weight, + bias=None, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1, + ): + ctx.stride = stride + ctx.padding = padding + ctx.dilation = dilation + ctx.groups = groups + ctx.deformable_groups = deformable_groups + ctx.with_bias = bias is not None + if not ctx.with_bias: + bias = input.new_empty(1) # fake tensor + if not input.is_cuda: + raise NotImplementedError + if ( + weight.requires_grad + or mask.requires_grad + or offset.requires_grad + or input.requires_grad + ): + ctx.save_for_backward(input, offset, mask, weight, bias) + output = input.new_empty(_ModulatedDeformConv._infer_shape(ctx, input, weight)) + ctx._bufs = [input.new_empty(0), input.new_empty(0)] + _C.modulated_deform_conv_forward( + input, + weight, + bias, + ctx._bufs[0], + offset, + mask, + output, + ctx._bufs[1], + weight.shape[2], + weight.shape[3], + ctx.stride, + ctx.stride, + ctx.padding, + ctx.padding, + ctx.dilation, + ctx.dilation, + ctx.groups, + ctx.deformable_groups, + ctx.with_bias, + ) + return output + + @staticmethod + @once_differentiable + def backward(ctx, grad_output): + if not grad_output.is_cuda: + raise NotImplementedError + input, offset, mask, weight, bias = ctx.saved_tensors + grad_input = torch.zeros_like(input) + grad_offset = torch.zeros_like(offset) + grad_mask = torch.zeros_like(mask) + grad_weight = torch.zeros_like(weight) + grad_bias = torch.zeros_like(bias) + _C.modulated_deform_conv_backward( + input, + weight, + bias, + ctx._bufs[0], + offset, + mask, + ctx._bufs[1], + grad_input, + grad_weight, + grad_bias, + grad_offset, + grad_mask, + grad_output, + weight.shape[2], + weight.shape[3], + ctx.stride, + ctx.stride, + ctx.padding, + ctx.padding, + ctx.dilation, + ctx.dilation, + ctx.groups, + ctx.deformable_groups, + ctx.with_bias, + ) + if not ctx.with_bias: + grad_bias = None + + return ( + grad_input, + grad_offset, + grad_mask, + grad_weight, + grad_bias, + None, + None, + None, + None, + None, + ) + + @staticmethod + def _infer_shape(ctx, input, weight): + n = input.size(0) + channels_out = weight.size(0) + height, width = input.shape[2:4] + kernel_h, kernel_w = weight.shape[2:4] + height_out = ( + height + 2 * ctx.padding - (ctx.dilation * (kernel_h - 1) + 1) + ) // ctx.stride + 1 + width_out = ( + width + 2 * ctx.padding - (ctx.dilation * (kernel_w - 1) + 1) + ) // ctx.stride + 1 + return n, channels_out, height_out, width_out + + +deform_conv = _DeformConv.apply +modulated_deform_conv = _ModulatedDeformConv.apply + + +class DeformConv(nn.Module): + def __init__( + self, + in_channels, + out_channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1, + bias=False, + norm=None, + activation=None, + ): + """ + Deformable convolution from :paper:`deformconv`. + + Arguments are similar to :class:`Conv2D`. Extra arguments: + + Args: + deformable_groups (int): number of groups used in deformable convolution. + norm (nn.Module, optional): a normalization layer + activation (callable(Tensor) -> Tensor): a callable activation function + """ + super(DeformConv, self).__init__() + + assert not bias + assert in_channels % groups == 0, "in_channels {} cannot be divisible by groups {}".format( + in_channels, groups + ) + assert ( + out_channels % groups == 0 + ), "out_channels {} cannot be divisible by groups {}".format(out_channels, groups) + + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = _pair(kernel_size) + self.stride = _pair(stride) + self.padding = _pair(padding) + self.dilation = _pair(dilation) + self.groups = groups + self.deformable_groups = deformable_groups + self.norm = norm + self.activation = activation + + self.weight = nn.Parameter( + torch.Tensor(out_channels, in_channels // self.groups, *self.kernel_size) + ) + self.bias = None + + nn.init.kaiming_uniform_(self.weight, nonlinearity="relu") + + def forward(self, x, offset): + if x.numel() == 0: + # When input is empty, we want to return a empty tensor with "correct" shape, + # So that the following operations will not panic + # if they check for the shape of the tensor. + # This computes the height and width of the output tensor + output_shape = [ + (i + 2 * p - (di * (k - 1) + 1)) // s + 1 + for i, p, di, k, s in zip( + x.shape[-2:], self.padding, self.dilation, self.kernel_size, self.stride + ) + ] + output_shape = [x.shape[0], self.weight.shape[0]] + output_shape + return _NewEmptyTensorOp.apply(x, output_shape) + + x = deform_conv( + x, + offset, + self.weight, + self.stride, + self.padding, + self.dilation, + self.groups, + self.deformable_groups, + ) + if self.norm is not None: + x = self.norm(x) + if self.activation is not None: + x = self.activation(x) + return x + + def extra_repr(self): + tmpstr = "in_channels=" + str(self.in_channels) + tmpstr += ", out_channels=" + str(self.out_channels) + tmpstr += ", kernel_size=" + str(self.kernel_size) + tmpstr += ", stride=" + str(self.stride) + tmpstr += ", padding=" + str(self.padding) + tmpstr += ", dilation=" + str(self.dilation) + tmpstr += ", groups=" + str(self.groups) + tmpstr += ", deformable_groups=" + str(self.deformable_groups) + tmpstr += ", bias=False" + return tmpstr + + +class ModulatedDeformConv(nn.Module): + def __init__( + self, + in_channels, + out_channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + deformable_groups=1, + bias=True, + norm=None, + activation=None, + ): + """ + Modulated deformable convolution from :paper:`deformconv2`. + + Arguments are similar to :class:`Conv2D`. Extra arguments: + + Args: + deformable_groups (int): number of groups used in deformable convolution. + norm (nn.Module, optional): a normalization layer + activation (callable(Tensor) -> Tensor): a callable activation function + """ + super(ModulatedDeformConv, self).__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = _pair(kernel_size) + self.stride = stride + self.padding = padding + self.dilation = dilation + self.groups = groups + self.deformable_groups = deformable_groups + self.with_bias = bias + self.norm = norm + self.activation = activation + + self.weight = nn.Parameter( + torch.Tensor(out_channels, in_channels // groups, *self.kernel_size) + ) + if bias: + self.bias = nn.Parameter(torch.Tensor(out_channels)) + else: + self.bias = None + + nn.init.kaiming_uniform_(self.weight, nonlinearity="relu") + if self.bias is not None: + nn.init.constant_(self.bias, 0) + + def forward(self, x, offset, mask): + if x.numel() == 0: + output_shape = [ + (i + 2 * p - (di * (k - 1) + 1)) // s + 1 + for i, p, di, k, s in zip( + x.shape[-2:], self.padding, self.dilation, self.kernel_size, self.stride + ) + ] + output_shape = [x.shape[0], self.weight.shape[0]] + output_shape + return _NewEmptyTensorOp.apply(x, output_shape) + + x = modulated_deform_conv( + x, + offset, + mask, + self.weight, + self.bias, + self.stride, + self.padding, + self.dilation, + self.groups, + self.deformable_groups, + ) + if self.norm is not None: + x = self.norm(x) + if self.activation is not None: + x = self.activation(x) + return x + + def extra_repr(self): + tmpstr = "in_channels=" + str(self.in_channels) + tmpstr += ", out_channels=" + str(self.out_channels) + tmpstr += ", kernel_size=" + str(self.kernel_size) + tmpstr += ", stride=" + str(self.stride) + tmpstr += ", padding=" + str(self.padding) + tmpstr += ", dilation=" + str(self.dilation) + tmpstr += ", groups=" + str(self.groups) + tmpstr += ", deformable_groups=" + str(self.deformable_groups) + tmpstr += ", bias=" + str(self.with_bias) + return tmpstr diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/mask_ops.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/mask_ops.py new file mode 100644 index 0000000..0fe115d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/mask_ops.py @@ -0,0 +1,248 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +import torch +from PIL import Image +from torch.nn import functional as F + +__all__ = ["paste_masks_in_image"] + + +BYTES_PER_FLOAT = 4 +# TODO: This memory limit may be too much or too little. It would be better to +# determine it based on available resources. +GPU_MEM_LIMIT = 1024 ** 3 # 1 GB memory limit + + +def _do_paste_mask(masks, boxes, img_h, img_w, skip_empty=True): + """ + Args: + masks: N, 1, H, W + boxes: N, 4 + img_h, img_w (int): + skip_empty (bool): only paste masks within the region that + tightly bound all boxes, and returns the results this region only. + An important optimization for CPU. + + Returns: + if skip_empty == False, a mask of shape (N, img_h, img_w) + if skip_empty == True, a mask of shape (N, h', w'), and the slice + object for the corresponding region. + """ + # On GPU, paste all masks together (up to chunk size) + # by using the entire image to sample the masks + # Compared to pasting them one by one, + # this has more operations but is faster on COCO-scale dataset. + device = masks.device + if skip_empty: + x0_int, y0_int = torch.clamp(boxes.min(dim=0).values.floor()[:2] - 1, min=0).to( + dtype=torch.int32 + ) + x1_int = torch.clamp(boxes[:, 2].max().ceil() + 1, max=img_w).to(dtype=torch.int32) + y1_int = torch.clamp(boxes[:, 3].max().ceil() + 1, max=img_h).to(dtype=torch.int32) + else: + x0_int, y0_int = 0, 0 + x1_int, y1_int = img_w, img_h + x0, y0, x1, y1 = torch.split(boxes, 1, dim=1) # each is Nx1 + + N = masks.shape[0] + + img_y = torch.arange(y0_int, y1_int, device=device, dtype=torch.float32) + 0.5 + img_x = torch.arange(x0_int, x1_int, device=device, dtype=torch.float32) + 0.5 + img_y = (img_y - y0) / (y1 - y0) * 2 - 1 + img_x = (img_x - x0) / (x1 - x0) * 2 - 1 + # img_x, img_y have shapes (N, w), (N, h) + + gx = img_x[:, None, :].expand(N, img_y.size(1), img_x.size(1)) + gy = img_y[:, :, None].expand(N, img_y.size(1), img_x.size(1)) + grid = torch.stack([gx, gy], dim=3) + + img_masks = F.grid_sample(masks.to(dtype=torch.float32), grid, align_corners=False) + + if skip_empty: + return img_masks[:, 0], (slice(y0_int, y1_int), slice(x0_int, x1_int)) + else: + return img_masks[:, 0], () + + +def paste_masks_in_image(masks, boxes, image_shape, threshold=0.5): + """ + Paste a set of masks that are of a fixed resolution (e.g., 28 x 28) into an image. + The location, height, and width for pasting each mask is determined by their + corresponding bounding boxes in boxes. + + Note: + This is a complicated but more accurate implementation. In actual deployment, it is + often enough to use a faster but less accurate implementation. + See :func:`paste_mask_in_image_old` in this file for an alternative implementation. + + Args: + masks (tensor): Tensor of shape (Bimg, Hmask, Wmask), where Bimg is the number of + detected object instances in the image and Hmask, Wmask are the mask width and mask + height of the predicted mask (e.g., Hmask = Wmask = 28). Values are in [0, 1]. + boxes (Boxes or Tensor): A Boxes of length Bimg or Tensor of shape (Bimg, 4). + boxes[i] and masks[i] correspond to the same object instance. + image_shape (tuple): height, width + threshold (float): A threshold in [0, 1] for converting the (soft) masks to + binary masks. + + Returns: + img_masks (Tensor): A tensor of shape (Bimg, Himage, Wimage), where Bimg is the + number of detected object instances and Himage, Wimage are the image width + and height. img_masks[i] is a binary mask for object instance i. + """ + + assert masks.shape[-1] == masks.shape[-2], "Only square mask predictions are supported" + N = len(masks) + if N == 0: + return masks.new_empty((0,) + image_shape, dtype=torch.uint8) + if not isinstance(boxes, torch.Tensor): + boxes = boxes.tensor + device = boxes.device + assert len(boxes) == N, boxes.shape + + img_h, img_w = image_shape + + # The actual implementation split the input into chunks, + # and paste them chunk by chunk. + if device.type == "cpu": + # CPU is most efficient when they are pasted one by one with skip_empty=True + # so that it performs minimal number of operations. + num_chunks = N + else: + # GPU benefits from parallelism for larger chunks, but may have memory issue + # int(img_h) because shape may be tensors in tracing + num_chunks = int(np.ceil(N * int(img_h) * int(img_w) * BYTES_PER_FLOAT / GPU_MEM_LIMIT)) + assert ( + num_chunks <= N + ), "Default GPU_MEM_LIMIT in mask_ops.py is too small; try increasing it" + chunks = torch.chunk(torch.arange(N, device=device), num_chunks) + + img_masks = torch.zeros( + N, img_h, img_w, device=device, dtype=torch.bool if threshold >= 0 else torch.uint8 + ) + for inds in chunks: + masks_chunk, spatial_inds = _do_paste_mask( + masks[inds, None, :, :], boxes[inds], img_h, img_w, skip_empty=device.type == "cpu" + ) + + if threshold >= 0: + masks_chunk = (masks_chunk >= threshold).to(dtype=torch.bool) + else: + # for visualization and debugging + masks_chunk = (masks_chunk * 255).to(dtype=torch.uint8) + + img_masks[(inds,) + spatial_inds] = masks_chunk + return img_masks + + +# The below are the original paste function (from Detectron1) which has +# larger quantization error. +# It is faster on CPU, while the aligned one is faster on GPU thanks to grid_sample. + + +def paste_mask_in_image_old(mask, box, img_h, img_w, threshold): + """ + Paste a single mask in an image. + This is a per-box implementation of :func:`paste_masks_in_image`. + This function has larger quantization error due to incorrect pixel + modeling and is not used any more. + + Args: + mask (Tensor): A tensor of shape (Hmask, Wmask) storing the mask of a single + object instance. Values are in [0, 1]. + box (Tensor): A tensor of shape (4, ) storing the x0, y0, x1, y1 box corners + of the object instance. + img_h, img_w (int): Image height and width. + threshold (float): Mask binarization threshold in [0, 1]. + + Returns: + im_mask (Tensor): + The resized and binarized object mask pasted into the original + image plane (a tensor of shape (img_h, img_w)). + """ + # Conversion from continuous box coordinates to discrete pixel coordinates + # via truncation (cast to int32). This determines which pixels to paste the + # mask onto. + box = box.to(dtype=torch.int32) # Continuous to discrete coordinate conversion + # An example (1D) box with continuous coordinates (x0=0.7, x1=4.3) will map to + # a discrete coordinates (x0=0, x1=4). Note that box is mapped to 5 = x1 - x0 + 1 + # pixels (not x1 - x0 pixels). + samples_w = box[2] - box[0] + 1 # Number of pixel samples, *not* geometric width + samples_h = box[3] - box[1] + 1 # Number of pixel samples, *not* geometric height + + # Resample the mask from it's original grid to the new samples_w x samples_h grid + mask = Image.fromarray(mask.cpu().numpy()) + mask = mask.resize((samples_w, samples_h), resample=Image.BILINEAR) + mask = np.array(mask, copy=False) + + if threshold >= 0: + mask = np.array(mask > threshold, dtype=np.uint8) + mask = torch.from_numpy(mask) + else: + # for visualization and debugging, we also + # allow it to return an unmodified mask + mask = torch.from_numpy(mask * 255).to(torch.uint8) + + im_mask = torch.zeros((img_h, img_w), dtype=torch.uint8) + x_0 = max(box[0], 0) + x_1 = min(box[2] + 1, img_w) + y_0 = max(box[1], 0) + y_1 = min(box[3] + 1, img_h) + + im_mask[y_0:y_1, x_0:x_1] = mask[ + (y_0 - box[1]) : (y_1 - box[1]), (x_0 - box[0]) : (x_1 - box[0]) + ] + return im_mask + + +# Our pixel modeling requires extrapolation for any continuous +# coordinate < 0.5 or > length - 0.5. When sampling pixels on the masks, +# we would like this extrapolation to be an interpolation between boundary values and zero, +# instead of using absolute zero or boundary values. +# Therefore `paste_mask_in_image_old` is often used with zero padding around the masks like this: +# masks, scale = pad_masks(masks[:, 0, :, :], 1) +# boxes = scale_boxes(boxes.tensor, scale) + + +def pad_masks(masks, padding): + """ + Args: + masks (tensor): A tensor of shape (B, M, M) representing B masks. + padding (int): Number of cells to pad on all sides. + + Returns: + The padded masks and the scale factor of the padding size / original size. + """ + B = masks.shape[0] + M = masks.shape[-1] + pad2 = 2 * padding + scale = float(M + pad2) / M + padded_masks = masks.new_zeros((B, M + pad2, M + pad2)) + padded_masks[:, padding:-padding, padding:-padding] = masks + return padded_masks, scale + + +def scale_boxes(boxes, scale): + """ + Args: + boxes (tensor): A tensor of shape (B, 4) representing B boxes with 4 + coords representing the corners x0, y0, x1, y1, + scale (float): The box scaling factor. + + Returns: + Scaled boxes. + """ + w_half = (boxes[:, 2] - boxes[:, 0]) * 0.5 + h_half = (boxes[:, 3] - boxes[:, 1]) * 0.5 + x_c = (boxes[:, 2] + boxes[:, 0]) * 0.5 + y_c = (boxes[:, 3] + boxes[:, 1]) * 0.5 + + w_half *= scale + h_half *= scale + + scaled_boxes = torch.zeros_like(boxes) + scaled_boxes[:, 0] = x_c - w_half + scaled_boxes[:, 2] = x_c + w_half + scaled_boxes[:, 1] = y_c - h_half + scaled_boxes[:, 3] = y_c + h_half + return scaled_boxes diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/nms.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/nms.py new file mode 100644 index 0000000..aafe29b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/nms.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import torch +from torchvision.ops import boxes as box_ops +from torchvision.ops import nms # BC-compat + + +def batched_nms(boxes, scores, idxs, iou_threshold): + """ + Same as torchvision.ops.boxes.batched_nms, but safer. + """ + assert boxes.shape[-1] == 4 + # TODO may need better strategy. + # Investigate after having a fully-cuda NMS op. + if len(boxes) < 40000: + return box_ops.batched_nms(boxes, scores, idxs, iou_threshold) + + result_mask = scores.new_zeros(scores.size(), dtype=torch.bool) + for id in torch.unique(idxs).cpu().tolist(): + mask = (idxs == id).nonzero().view(-1) + keep = nms(boxes[mask], scores[mask], iou_threshold) + result_mask[mask[keep]] = True + keep = result_mask.nonzero().view(-1) + keep = keep[scores[keep].argsort(descending=True)] + return keep + + +# Note: this function (nms_rotated) might be moved into +# torchvision/ops/boxes.py in the future +def nms_rotated(boxes, scores, iou_threshold): + """ + Performs non-maximum suppression (NMS) on the rotated boxes according + to their intersection-over-union (IoU). + + Rotated NMS iteratively removes lower scoring rotated boxes which have an + IoU greater than iou_threshold with another (higher scoring) rotated box. + + Note that RotatedBox (5, 3, 4, 2, -90) covers exactly the same region as + RotatedBox (5, 3, 4, 2, 90) does, and their IoU will be 1. However, they + can be representing completely different objects in certain tasks, e.g., OCR. + + As for the question of whether rotated-NMS should treat them as faraway boxes + even though their IOU is 1, it depends on the application and/or ground truth annotation. + + As an extreme example, consider a single character v and the square box around it. + + If the angle is 0 degree, the object (text) would be read as 'v'; + + If the angle is 90 degrees, the object (text) would become '>'; + + If the angle is 180 degrees, the object (text) would become '^'; + + If the angle is 270/-90 degrees, the object (text) would become '<' + + All of these cases have IoU of 1 to each other, and rotated NMS that only + uses IoU as criterion would only keep one of them with the highest score - + which, practically, still makes sense in most cases because typically + only one of theses orientations is the correct one. Also, it does not matter + as much if the box is only used to classify the object (instead of transcribing + them with a sequential OCR recognition model) later. + + On the other hand, when we use IoU to filter proposals that are close to the + ground truth during training, we should definitely take the angle into account if + we know the ground truth is labeled with the strictly correct orientation (as in, + upside-down words are annotated with -180 degrees even though they can be covered + with a 0/90/-90 degree box, etc.) + + The way the original dataset is annotated also matters. For example, if the dataset + is a 4-point polygon dataset that does not enforce ordering of vertices/orientation, + we can estimate a minimum rotated bounding box to this polygon, but there's no way + we can tell the correct angle with 100% confidence (as shown above, there could be 4 different + rotated boxes, with angles differed by 90 degrees to each other, covering the exactly + same region). In that case we have to just use IoU to determine the box + proximity (as many detection benchmarks (even for text) do) unless there're other + assumptions we can make (like width is always larger than height, or the object is not + rotated by more than 90 degrees CCW/CW, etc.) + + In summary, not considering angles in rotated NMS seems to be a good option for now, + but we should be aware of its implications. + + Args: + boxes (Tensor[N, 5]): Rotated boxes to perform NMS on. They are expected to be in + (x_center, y_center, width, height, angle_degrees) format. + scores (Tensor[N]): Scores for each one of the rotated boxes + iou_threshold (float): Discards all overlapping rotated boxes with IoU < iou_threshold + + Returns: + keep (Tensor): int64 tensor with the indices of the elements that have been kept + by Rotated NMS, sorted in decreasing order of scores + """ + from detectron2 import _C + + return _C.nms_rotated(boxes, scores, iou_threshold) + + +# Note: this function (batched_nms_rotated) might be moved into +# torchvision/ops/boxes.py in the future +def batched_nms_rotated(boxes, scores, idxs, iou_threshold): + """ + Performs non-maximum suppression in a batched fashion. + + Each index value correspond to a category, and NMS + will not be applied between elements of different categories. + + Args: + boxes (Tensor[N, 5]): + boxes where NMS will be performed. They + are expected to be in (x_ctr, y_ctr, width, height, angle_degrees) format + scores (Tensor[N]): + scores for each one of the boxes + idxs (Tensor[N]): + indices of the categories for each one of the boxes. + iou_threshold (float): + discards all overlapping boxes + with IoU < iou_threshold + + Returns: + Tensor: + int64 tensor with the indices of the elements that have been kept + by NMS, sorted in decreasing order of scores + """ + assert boxes.shape[-1] == 5 + + if boxes.numel() == 0: + return torch.empty((0,), dtype=torch.int64, device=boxes.device) + # Strategy: in order to perform NMS independently per class, + # we add an offset to all the boxes. The offset is dependent + # only on the class idx, and is large enough so that boxes + # from different classes do not overlap + + # Note that batched_nms in torchvision/ops/boxes.py only uses max_coordinate, + # which won't handle negative coordinates correctly. + # Here by using min_coordinate we can make sure the negative coordinates are + # correctly handled. + max_coordinate = ( + torch.max(boxes[:, 0], boxes[:, 1]) + torch.max(boxes[:, 2], boxes[:, 3]) / 2 + ).max() + min_coordinate = ( + torch.min(boxes[:, 0], boxes[:, 1]) - torch.max(boxes[:, 2], boxes[:, 3]) / 2 + ).min() + offsets = idxs.to(boxes) * (max_coordinate - min_coordinate + 1) + boxes_for_nms = boxes.clone() # avoid modifying the original values in boxes + boxes_for_nms[:, :2] += offsets[:, None] + keep = nms_rotated(boxes_for_nms, scores, iou_threshold) + return keep diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align.py new file mode 100644 index 0000000..f8c4ce1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align.py @@ -0,0 +1,105 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from torch import nn +from torch.autograd import Function +from torch.autograd.function import once_differentiable +from torch.nn.modules.utils import _pair + +from detectron2 import _C + + +class _ROIAlign(Function): + @staticmethod + def forward(ctx, input, roi, output_size, spatial_scale, sampling_ratio, aligned): + ctx.save_for_backward(roi) + ctx.output_size = _pair(output_size) + ctx.spatial_scale = spatial_scale + ctx.sampling_ratio = sampling_ratio + ctx.input_shape = input.size() + ctx.aligned = aligned + output = _C.roi_align_forward( + input, roi, spatial_scale, output_size[0], output_size[1], sampling_ratio, aligned + ) + return output + + @staticmethod + @once_differentiable + def backward(ctx, grad_output): + (rois,) = ctx.saved_tensors + output_size = ctx.output_size + spatial_scale = ctx.spatial_scale + sampling_ratio = ctx.sampling_ratio + bs, ch, h, w = ctx.input_shape + grad_input = _C.roi_align_backward( + grad_output, + rois, + spatial_scale, + output_size[0], + output_size[1], + bs, + ch, + h, + w, + sampling_ratio, + ctx.aligned, + ) + return grad_input, None, None, None, None, None + + +roi_align = _ROIAlign.apply + + +class ROIAlign(nn.Module): + def __init__(self, output_size, spatial_scale, sampling_ratio, aligned=True): + """ + Args: + output_size (tuple): h, w + spatial_scale (float): scale the input boxes by this number + sampling_ratio (int): number of inputs samples to take for each output + sample. 0 to take samples densely. + aligned (bool): if False, use the legacy implementation in + Detectron. If True, align the results more perfectly. + + Note: + The meaning of aligned=True: + + Given a continuous coordinate c, its two neighboring pixel indices (in our + pixel model) are computed by floor(c - 0.5) and ceil(c - 0.5). For example, + c=1.3 has pixel neighbors with discrete indices [0] and [1] (which are sampled + from the underlying signal at continuous coordinates 0.5 and 1.5). But the original + roi_align (aligned=False) does not subtract the 0.5 when computing neighboring + pixel indices and therefore it uses pixels with a slightly incorrect alignment + (relative to our pixel model) when performing bilinear interpolation. + + With `aligned=True`, + we first appropriately scale the ROI and then shift it by -0.5 + prior to calling roi_align. This produces the correct neighbors; see + detectron2/tests/test_roi_align.py for verification. + + The difference does not make a difference to the model's performance if + ROIAlign is used together with conv layers. + """ + super(ROIAlign, self).__init__() + self.output_size = output_size + self.spatial_scale = spatial_scale + self.sampling_ratio = sampling_ratio + self.aligned = aligned + + def forward(self, input, rois): + """ + Args: + input: NCHW images + rois: Bx5 boxes. First column is the index into N. The other 4 columns are xyxy. + """ + assert rois.dim() == 2 and rois.size(1) == 5 + return roi_align( + input, rois, self.output_size, self.spatial_scale, self.sampling_ratio, self.aligned + ) + + def __repr__(self): + tmpstr = self.__class__.__name__ + "(" + tmpstr += "output_size=" + str(self.output_size) + tmpstr += ", spatial_scale=" + str(self.spatial_scale) + tmpstr += ", sampling_ratio=" + str(self.sampling_ratio) + tmpstr += ", aligned=" + str(self.aligned) + tmpstr += ")" + return tmpstr diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align_rotated.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align_rotated.py new file mode 100644 index 0000000..6ed87e6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/roi_align_rotated.py @@ -0,0 +1,88 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from torch import nn +from torch.autograd import Function +from torch.autograd.function import once_differentiable +from torch.nn.modules.utils import _pair + +from detectron2 import _C + + +class _ROIAlignRotated(Function): + @staticmethod + def forward(ctx, input, roi, output_size, spatial_scale, sampling_ratio): + ctx.save_for_backward(roi) + ctx.output_size = _pair(output_size) + ctx.spatial_scale = spatial_scale + ctx.sampling_ratio = sampling_ratio + ctx.input_shape = input.size() + output = _C.roi_align_rotated_forward( + input, roi, spatial_scale, output_size[0], output_size[1], sampling_ratio + ) + return output + + @staticmethod + @once_differentiable + def backward(ctx, grad_output): + (rois,) = ctx.saved_tensors + output_size = ctx.output_size + spatial_scale = ctx.spatial_scale + sampling_ratio = ctx.sampling_ratio + bs, ch, h, w = ctx.input_shape + grad_input = _C.roi_align_rotated_backward( + grad_output, + rois, + spatial_scale, + output_size[0], + output_size[1], + bs, + ch, + h, + w, + sampling_ratio, + ) + return grad_input, None, None, None, None, None + + +roi_align_rotated = _ROIAlignRotated.apply + + +class ROIAlignRotated(nn.Module): + def __init__(self, output_size, spatial_scale, sampling_ratio): + """ + Args: + output_size (tuple): h, w + spatial_scale (float): scale the input boxes by this number + sampling_ratio (int): number of inputs samples to take for each output + sample. 0 to take samples densely. + + Note: + ROIAlignRotated supports continuous coordinate by default: + Given a continuous coordinate c, its two neighboring pixel indices (in our + pixel model) are computed by floor(c - 0.5) and ceil(c - 0.5). For example, + c=1.3 has pixel neighbors with discrete indices [0] and [1] (which are sampled + from the underlying signal at continuous coordinates 0.5 and 1.5). + """ + super(ROIAlignRotated, self).__init__() + self.output_size = output_size + self.spatial_scale = spatial_scale + self.sampling_ratio = sampling_ratio + + def forward(self, input, rois): + """ + Args: + input: NCHW images + rois: Bx6 boxes. First column is the index into N. + The other 5 columns are (x_ctr, y_ctr, width, height, angle_degrees). + """ + assert rois.dim() == 2 and rois.size(1) == 6 + return roi_align_rotated( + input, rois, self.output_size, self.spatial_scale, self.sampling_ratio + ) + + def __repr__(self): + tmpstr = self.__class__.__name__ + "(" + tmpstr += "output_size=" + str(self.output_size) + tmpstr += ", spatial_scale=" + str(self.spatial_scale) + tmpstr += ", sampling_ratio=" + str(self.sampling_ratio) + tmpstr += ")" + return tmpstr diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/rotated_boxes.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/rotated_boxes.py new file mode 100644 index 0000000..ea9b085 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/rotated_boxes.py @@ -0,0 +1,22 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from __future__ import absolute_import, division, print_function, unicode_literals + +from detectron2 import _C + + +def pairwise_iou_rotated(boxes1, boxes2): + """ + Return intersection-over-union (Jaccard index) of boxes. + + Both sets of boxes are expected to be in + (x_center, y_center, width, height, angle) format. + + Arguments: + boxes1 (Tensor[N, 5]) + boxes2 (Tensor[M, 5]) + + Returns: + iou (Tensor[N, M]): the NxM matrix containing the pairwise + IoU values for every element in boxes1 and boxes2 + """ + return _C.box_iou_rotated(boxes1, boxes2) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/shape_spec.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/shape_spec.py new file mode 100644 index 0000000..ed7f0d0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/shape_spec.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from collections import namedtuple + + +class ShapeSpec(namedtuple("_ShapeSpec", ["channels", "height", "width", "stride"])): + """ + A simple structure that contains basic shape specification about a tensor. + It is often used as the auxiliary inputs/outputs of models, + to obtain the shape inference ability among pytorch modules. + + Attributes: + channels: + height: + width: + stride: + """ + + def __new__(cls, *, channels=None, height=None, width=None, stride=None): + return super().__new__(cls, channels, height, width, stride) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/wrappers.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/wrappers.py new file mode 100644 index 0000000..7e3935e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/layers/wrappers.py @@ -0,0 +1,215 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +Wrappers around on some nn functions, mainly to support empty tensors. + +Ideally, add support directly in PyTorch to empty tensors in those functions. + +These can be removed once https://github.com/pytorch/pytorch/issues/12013 +is implemented +""" + +import math +import torch +from torch.nn.modules.utils import _ntuple + +TORCH_VERSION = tuple(int(x) for x in torch.__version__.split(".")[:2]) + + +def cat(tensors, dim=0): + """ + Efficient version of torch.cat that avoids a copy if there is only a single element in a list + """ + assert isinstance(tensors, (list, tuple)) + if len(tensors) == 1: + return tensors[0] + return torch.cat(tensors, dim) + + +class _NewEmptyTensorOp(torch.autograd.Function): + @staticmethod + def forward(ctx, x, new_shape): + ctx.shape = x.shape + return x.new_empty(new_shape) + + @staticmethod + def backward(ctx, grad): + shape = ctx.shape + return _NewEmptyTensorOp.apply(grad, shape), None + + +class Conv2d(torch.nn.Conv2d): + """ + A wrapper around :class:`torch.nn.Conv2d` to support empty inputs and more features. + """ + + def __init__(self, *args, **kwargs): + """ + Extra keyword arguments supported in addition to those in `torch.nn.Conv2d`: + + Args: + norm (nn.Module, optional): a normalization layer + activation (callable(Tensor) -> Tensor): a callable activation function + + It assumes that norm layer is used before activation. + """ + norm = kwargs.pop("norm", None) + activation = kwargs.pop("activation", None) + super().__init__(*args, **kwargs) + + self.norm = norm + self.activation = activation + + def forward(self, x): + if x.numel() == 0 and self.training: + # https://github.com/pytorch/pytorch/issues/12013 + assert not isinstance( + self.norm, torch.nn.SyncBatchNorm + ), "SyncBatchNorm does not support empty inputs!" + + if x.numel() == 0 and TORCH_VERSION <= (1, 4): + assert not isinstance( + self.norm, torch.nn.GroupNorm + ), "GroupNorm does not support empty inputs in PyTorch <=1.4!" + # When input is empty, we want to return a empty tensor with "correct" shape, + # So that the following operations will not panic + # if they check for the shape of the tensor. + # This computes the height and width of the output tensor + output_shape = [ + (i + 2 * p - (di * (k - 1) + 1)) // s + 1 + for i, p, di, k, s in zip( + x.shape[-2:], self.padding, self.dilation, self.kernel_size, self.stride + ) + ] + output_shape = [x.shape[0], self.weight.shape[0]] + output_shape + empty = _NewEmptyTensorOp.apply(x, output_shape) + if self.training: + # This is to make DDP happy. + # DDP expects all workers to have gradient w.r.t the same set of parameters. + _dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return empty + _dummy + else: + return empty + + x = super().forward(x) + if self.norm is not None: + x = self.norm(x) + if self.activation is not None: + x = self.activation(x) + return x + + +if TORCH_VERSION > (1, 4): + ConvTranspose2d = torch.nn.ConvTranspose2d +else: + + class ConvTranspose2d(torch.nn.ConvTranspose2d): + """ + A wrapper around :class:`torch.nn.ConvTranspose2d` to support zero-size tensor. + """ + + def forward(self, x): + if x.numel() > 0: + return super(ConvTranspose2d, self).forward(x) + # get output shape + + # When input is empty, we want to return a empty tensor with "correct" shape, + # So that the following operations will not panic + # if they check for the shape of the tensor. + # This computes the height and width of the output tensor + output_shape = [ + (i - 1) * d - 2 * p + (di * (k - 1) + 1) + op + for i, p, di, k, d, op in zip( + x.shape[-2:], + self.padding, + self.dilation, + self.kernel_size, + self.stride, + self.output_padding, + ) + ] + output_shape = [x.shape[0], self.out_channels] + output_shape + # This is to make DDP happy. + # DDP expects all workers to have gradient w.r.t the same set of parameters. + _dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return _NewEmptyTensorOp.apply(x, output_shape) + _dummy + + +if TORCH_VERSION > (1, 4): + BatchNorm2d = torch.nn.BatchNorm2d +else: + + class BatchNorm2d(torch.nn.BatchNorm2d): + """ + A wrapper around :class:`torch.nn.BatchNorm2d` to support zero-size tensor. + """ + + def forward(self, x): + if x.numel() > 0: + return super(BatchNorm2d, self).forward(x) + # get output shape + output_shape = x.shape + return _NewEmptyTensorOp.apply(x, output_shape) + + +if TORCH_VERSION > (1, 5): + Linear = torch.nn.Linear +else: + + class Linear(torch.nn.Linear): + """ + A wrapper around :class:`torch.nn.Linear` to support empty inputs and more features. + Because of https://github.com/pytorch/pytorch/issues/34202 + """ + + def forward(self, x): + if x.numel() == 0: + output_shape = [x.shape[0], self.weight.shape[0]] + + empty = _NewEmptyTensorOp.apply(x, output_shape) + if self.training: + # This is to make DDP happy. + # DDP expects all workers to have gradient w.r.t the same set of parameters. + _dummy = sum(x.view(-1)[0] for x in self.parameters()) * 0.0 + return empty + _dummy + else: + return empty + + x = super().forward(x) + return x + + +def interpolate(input, size=None, scale_factor=None, mode="nearest", align_corners=None): + """ + A wrapper around :func:`torch.nn.functional.interpolate` to support zero-size tensor. + """ + if TORCH_VERSION > (1, 4) or input.numel() > 0: + return torch.nn.functional.interpolate( + input, size, scale_factor, mode, align_corners=align_corners + ) + + def _check_size_scale_factor(dim): + if size is None and scale_factor is None: + raise ValueError("either size or scale_factor should be defined") + if size is not None and scale_factor is not None: + raise ValueError("only one of size or scale_factor should be defined") + if ( + scale_factor is not None + and isinstance(scale_factor, tuple) + and len(scale_factor) != dim + ): + raise ValueError( + "scale_factor shape must match input shape. " + "Input is {}D, scale_factor size is {}".format(dim, len(scale_factor)) + ) + + def _output_size(dim): + _check_size_scale_factor(dim) + if size is not None: + return size + scale_factors = _ntuple(dim)(scale_factor) + # math.floor might return float in py2.7 + return [int(math.floor(input.size(i + 2) * scale_factors[i])) for i in range(dim)] + + output_shape = tuple(_output_size(2)) + output_shape = input.shape[:-2] + output_shape + return _NewEmptyTensorOp.apply(input, output_shape) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/__init__.py new file mode 100644 index 0000000..886616f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +Model Zoo API for Detectron2: a collection of functions to create common model architectures and +optionally load pre-trained weights as released in +`MODEL_ZOO.md `_. +""" +from .model_zoo import get, get_config_file, get_checkpoint_url + +__all__ = ["get_checkpoint_url", "get", "get_config_file"] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/model_zoo.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/model_zoo.py new file mode 100644 index 0000000..68d0ce5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/model_zoo/model_zoo.py @@ -0,0 +1,150 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import os +import pkg_resources +import torch + +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.modeling import build_model + + +class _ModelZooUrls(object): + """ + Mapping from names to officially released Detectron2 pre-trained models. + """ + + S3_PREFIX = "https://dl.fbaipublicfiles.com/detectron2/" + + # format: {config_path.yaml} -> model_id/model_final_{commit}.pkl + CONFIG_PATH_TO_URL_SUFFIX = { + # COCO Detection with Faster R-CNN + "COCO-Detection/faster_rcnn_R_50_C4_1x.yaml": "137257644/model_final_721ade.pkl", + "COCO-Detection/faster_rcnn_R_50_DC5_1x.yaml": "137847829/model_final_51d356.pkl", + "COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml": "137257794/model_final_b275ba.pkl", + "COCO-Detection/faster_rcnn_R_50_C4_3x.yaml": "137849393/model_final_f97cb7.pkl", + "COCO-Detection/faster_rcnn_R_50_DC5_3x.yaml": "137849425/model_final_68d202.pkl", + "COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml": "137849458/model_final_280758.pkl", + "COCO-Detection/faster_rcnn_R_101_C4_3x.yaml": "138204752/model_final_298dad.pkl", + "COCO-Detection/faster_rcnn_R_101_DC5_3x.yaml": "138204841/model_final_3e0943.pkl", + "COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml": "137851257/model_final_f6e8b1.pkl", + "COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml": "139173657/model_final_68b088.pkl", + # COCO Detection with RetinaNet + "COCO-Detection/retinanet_R_50_FPN_1x.yaml": "137593951/model_final_b796dc.pkl", + "COCO-Detection/retinanet_R_50_FPN_3x.yaml": "137849486/model_final_4cafe0.pkl", + "COCO-Detection/retinanet_R_101_FPN_3x.yaml": "138363263/model_final_59f53c.pkl", + # COCO Detection with RPN and Fast R-CNN + "COCO-Detection/rpn_R_50_C4_1x.yaml": "137258005/model_final_450694.pkl", + "COCO-Detection/rpn_R_50_FPN_1x.yaml": "137258492/model_final_02ce48.pkl", + "COCO-Detection/fast_rcnn_R_50_FPN_1x.yaml": "137635226/model_final_e5f7ce.pkl", + # COCO Instance Segmentation Baselines with Mask R-CNN + "COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x.yaml": "137259246/model_final_9243eb.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml": "137260150/model_final_4f86c3.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml": "137260431/model_final_a54504.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_50_C4_3x.yaml": "137849525/model_final_4ce675.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_3x.yaml": "137849551/model_final_84107b.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml": "137849600/model_final_f10217.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_101_C4_3x.yaml": "138363239/model_final_a2914c.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_101_DC5_3x.yaml": "138363294/model_final_0464b7.pkl", + "COCO-InstanceSegmentation/mask_rcnn_R_101_FPN_3x.yaml": "138205316/model_final_a3ec72.pkl", + "COCO-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_3x.yaml": "139653917/model_final_2d9806.pkl", # noqa + # COCO Person Keypoint Detection Baselines with Keypoint R-CNN + "COCO-Keypoints/keypoint_rcnn_R_50_FPN_1x.yaml": "137261548/model_final_04e291.pkl", + "COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml": "137849621/model_final_a6e10b.pkl", + "COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml": "138363331/model_final_997cc7.pkl", + "COCO-Keypoints/keypoint_rcnn_X_101_32x8d_FPN_3x.yaml": "139686956/model_final_5ad38f.pkl", + # COCO Panoptic Segmentation Baselines with Panoptic FPN + "COCO-PanopticSegmentation/panoptic_fpn_R_50_1x.yaml": "139514544/model_final_dbfeb4.pkl", + "COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml": "139514569/model_final_c10459.pkl", + "COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml": "139514519/model_final_cafdb1.pkl", + # LVIS Instance Segmentation Baselines with Mask R-CNN + "LVIS-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml": "144219072/model_final_571f7c.pkl", + "LVIS-InstanceSegmentation/mask_rcnn_R_101_FPN_1x.yaml": "144219035/model_final_824ab5.pkl", + "LVIS-InstanceSegmentation/mask_rcnn_X_101_32x8d_FPN_1x.yaml": "144219108/model_final_5e3439.pkl", # noqa + # Cityscapes & Pascal VOC Baselines + "Cityscapes/mask_rcnn_R_50_FPN.yaml": "142423278/model_final_af9cf5.pkl", + "PascalVOC-Detection/faster_rcnn_R_50_C4.yaml": "142202221/model_final_b1acc2.pkl", + # Other Settings + "Misc/mask_rcnn_R_50_FPN_1x_dconv_c3-c5.yaml": "138602867/model_final_65c703.pkl", + "Misc/mask_rcnn_R_50_FPN_3x_dconv_c3-c5.yaml": "144998336/model_final_821d0b.pkl", + "Misc/cascade_mask_rcnn_R_50_FPN_1x.yaml": "138602847/model_final_e9d89b.pkl", + "Misc/cascade_mask_rcnn_R_50_FPN_3x.yaml": "144998488/model_final_480dd8.pkl", + "Misc/mask_rcnn_R_50_FPN_3x_syncbn.yaml": "169527823/model_final_3b3c51.pkl", + "Misc/mask_rcnn_R_50_FPN_3x_gn.yaml": "138602888/model_final_dc5d9e.pkl", + "Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml": "138602908/model_final_01ca85.pkl", + "Misc/panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml": "139797668/model_final_be35db.pkl", + "Misc/cascade_mask_rcnn_X_152_32x8d_FPN_IN5k_gn_dconv.yaml": "18131413/model_0039999_e76410.pkl", # noqa + # D1 Comparisons + "Detectron1-Comparisons/faster_rcnn_R_50_FPN_noaug_1x.yaml": "137781054/model_final_7ab50c.pkl", # noqa + "Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml": "137781281/model_final_62ca52.pkl", # noqa + "Detectron1-Comparisons/keypoint_rcnn_R_50_FPN_1x.yaml": "137781195/model_final_cce136.pkl", + } + + +def get_checkpoint_url(config_path): + """ + Returns the URL to the model trained using the given config + + Args: + config_path (str): config file name relative to detectron2's "configs/" + directory, e.g., "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml" + + Returns: + str: a URL to the model + """ + name = config_path.replace(".yaml", "") + if config_path in _ModelZooUrls.CONFIG_PATH_TO_URL_SUFFIX: + suffix = _ModelZooUrls.CONFIG_PATH_TO_URL_SUFFIX[config_path] + return _ModelZooUrls.S3_PREFIX + name + "/" + suffix + raise RuntimeError("{} not available in Model Zoo!".format(name)) + + +def get_config_file(config_path): + """ + Returns path to a builtin config file. + + Args: + config_path (str): config file name relative to detectron2's "configs/" + directory, e.g., "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml" + + Returns: + str: the real path to the config file. + """ + cfg_file = pkg_resources.resource_filename( + "detectron2.model_zoo", os.path.join("configs", config_path) + ) + if not os.path.exists(cfg_file): + raise RuntimeError("{} not available in Model Zoo!".format(config_path)) + return cfg_file + + +def get(config_path, trained: bool = False): + """ + Get a model specified by relative path under Detectron2's official ``configs/`` directory. + + Args: + config_path (str): config file name relative to detectron2's "configs/" + directory, e.g., "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml" + trained (bool): If True, will initialize the model with the trained model zoo weights. + If False, the checkpoint specified in the config file's ``MODEL.WEIGHTS`` is used + instead; this will typically (though not always) initialize a subset of weights using + an ImageNet pre-trained model, while randomly initializing the other weights. + + Example: + + .. code-block:: python + + from detectron2 import model_zoo + model = model_zoo.get("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml", trained=True) + """ + cfg_file = get_config_file(config_path) + + cfg = get_cfg() + cfg.merge_from_file(cfg_file) + if trained: + cfg.MODEL.WEIGHTS = get_checkpoint_url(config_path) + if not torch.cuda.is_available(): + cfg.MODEL.DEVICE = "cpu" + + model = build_model(cfg) + DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS) + return model diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/__init__.py new file mode 100644 index 0000000..9e23fe4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/__init__.py @@ -0,0 +1,56 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import torch + +from detectron2.layers import ShapeSpec + +from .anchor_generator import build_anchor_generator, ANCHOR_GENERATOR_REGISTRY +from .backbone import ( + BACKBONE_REGISTRY, + FPN, + Backbone, + ResNet, + ResNetBlockBase, + build_backbone, + build_resnet_backbone, + make_stage, +) +from .meta_arch import ( + META_ARCH_REGISTRY, + SEM_SEG_HEADS_REGISTRY, + GeneralizedRCNN, + PanopticFPN, + ProposalNetwork, + RetinaNet, + SemanticSegmentor, + build_model, + build_sem_seg_head, +) +from .postprocessing import detector_postprocess +from .proposal_generator import ( + PROPOSAL_GENERATOR_REGISTRY, + build_proposal_generator, + RPN_HEAD_REGISTRY, + build_rpn_head, +) +from .roi_heads import ( + ROI_BOX_HEAD_REGISTRY, + ROI_HEADS_REGISTRY, + ROI_KEYPOINT_HEAD_REGISTRY, + ROI_MASK_HEAD_REGISTRY, + ROIHeads, + StandardROIHeads, + BaseMaskRCNNHead, + BaseKeypointRCNNHead, + build_box_head, + build_keypoint_head, + build_mask_head, + build_roi_heads, +) +from .test_time_augmentation import DatasetMapperTTA, GeneralizedRCNNWithTTA + +_EXCLUDE = {"torch", "ShapeSpec"} +__all__ = [k for k in globals().keys() if k not in _EXCLUDE and not k.startswith("_")] + +assert ( + torch.Tensor([1]) == torch.Tensor([2]) +).dtype == torch.bool, "Your Pytorch is too old. Please update to contain https://github.com/pytorch/pytorch/pull/21113" diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/anchor_generator.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/anchor_generator.py new file mode 100644 index 0000000..93927bc --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/anchor_generator.py @@ -0,0 +1,382 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +from typing import List +import torch +from torch import nn + +from detectron2.config import configurable +from detectron2.layers import ShapeSpec +from detectron2.structures import Boxes, RotatedBoxes +from detectron2.utils.registry import Registry + +ANCHOR_GENERATOR_REGISTRY = Registry("ANCHOR_GENERATOR") +ANCHOR_GENERATOR_REGISTRY.__doc__ = """ +Registry for modules that creates object detection anchors for feature maps. + +The registered object will be called with `obj(cfg, input_shape)`. +""" + + +class BufferList(nn.Module): + """ + Similar to nn.ParameterList, but for buffers + """ + + def __init__(self, buffers=None): + super(BufferList, self).__init__() + if buffers is not None: + self.extend(buffers) + + def extend(self, buffers): + offset = len(self) + for i, buffer in enumerate(buffers): + self.register_buffer(str(offset + i), buffer) + return self + + def __len__(self): + return len(self._buffers) + + def __iter__(self): + return iter(self._buffers.values()) + + +def _create_grid_offsets(size: List[int], stride: int, offset: float, device: torch.device): + grid_height, grid_width = size + shifts_x = torch.arange( + offset * stride, grid_width * stride, step=stride, dtype=torch.float32, device=device + ) + shifts_y = torch.arange( + offset * stride, grid_height * stride, step=stride, dtype=torch.float32, device=device + ) + + shift_y, shift_x = torch.meshgrid(shifts_y, shifts_x) + shift_x = shift_x.reshape(-1) + shift_y = shift_y.reshape(-1) + return shift_x, shift_y + + +def _broadcast_params(params, num_features, name): + """ + If one size (or aspect ratio) is specified and there are multiple feature + maps, we "broadcast" anchors of that single size (or aspect ratio) + over all feature maps. + + If params is list[float], or list[list[float]] with len(params) == 1, repeat + it num_features time. + + Returns: + list[list[float]]: param for each feature + """ + assert isinstance( + params, (list, tuple) + ), f"{name} in anchor generator has to be a list! Got {params}." + assert len(params), f"{name} in anchor generator cannot be empty!" + if not isinstance(params[0], (list, tuple)): # list[float] + return [params] * num_features + if len(params) == 1: + return list(params) * num_features + assert len(params) == num_features, ( + f"Got {name} of length {len(params)} in anchor generator, " + f"but the number of input features is {num_features}!" + ) + return params + + +@ANCHOR_GENERATOR_REGISTRY.register() +class DefaultAnchorGenerator(nn.Module): + """ + Compute anchors in the standard ways described in + "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks". + """ + + box_dim: int = 4 + """ + the dimension of each anchor box. + """ + + @configurable + def __init__(self, *, sizes, aspect_ratios, strides, offset=0.5): + """ + This interface is experimental. + + Args: + sizes (list[list[float]] or list[float]): + If sizes is list[list[float]], sizes[i] is the list of anchor sizes + (i.e. sqrt of anchor area) to use for the i-th feature map. + If sizes is list[float], the sizes are used for all feature maps. + Anchor sizes are given in absolute lengths in units of + the input image; they do not dynamically scale if the input image size changes. + aspect_ratios (list[list[float]] or list[float]): list of aspect ratios + (i.e. height / width) to use for anchors. Same "broadcast" rule for `sizes` applies. + strides (list[int]): stride of each input feature. + offset (float): Relative offset between the center of the first anchor and the top-left + corner of the image. Value has to be in [0, 1). + Recommend to use 0.5, which means half stride. + """ + super().__init__() + + self.strides = strides + self.num_features = len(self.strides) + sizes = _broadcast_params(sizes, self.num_features, "sizes") + aspect_ratios = _broadcast_params(aspect_ratios, self.num_features, "aspect_ratios") + self.cell_anchors = self._calculate_anchors(sizes, aspect_ratios) + + self.offset = offset + assert 0.0 <= self.offset < 1.0, self.offset + + @classmethod + def from_config(cls, cfg, input_shape: List[ShapeSpec]): + return { + "sizes": cfg.MODEL.ANCHOR_GENERATOR.SIZES, + "aspect_ratios": cfg.MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS, + "strides": [x.stride for x in input_shape], + "offset": cfg.MODEL.ANCHOR_GENERATOR.OFFSET, + } + + def _calculate_anchors(self, sizes, aspect_ratios): + cell_anchors = [ + self.generate_cell_anchors(s, a).float() for s, a in zip(sizes, aspect_ratios) + ] + return BufferList(cell_anchors) + + @property + def num_cell_anchors(self): + """ + Alias of `num_anchors`. + """ + return self.num_anchors + + @property + def num_anchors(self): + """ + Returns: + list[int]: Each int is the number of anchors at every pixel + location, on that feature map. + For example, if at every pixel we use anchors of 3 aspect + ratios and 5 sizes, the number of anchors is 15. + (See also ANCHOR_GENERATOR.SIZES and ANCHOR_GENERATOR.ASPECT_RATIOS in config) + + In standard RPN models, `num_anchors` on every feature map is the same. + """ + return [len(cell_anchors) for cell_anchors in self.cell_anchors] + + def _grid_anchors(self, grid_sizes: List[List[int]]): + """ + Returns: + list[Tensor]: #featuremap tensors, each is (#locations x #cell_anchors) x 4 + """ + anchors = [] + for size, stride, base_anchors in zip(grid_sizes, self.strides, self.cell_anchors): + shift_x, shift_y = _create_grid_offsets(size, stride, self.offset, base_anchors.device) + shifts = torch.stack((shift_x, shift_y, shift_x, shift_y), dim=1) + + anchors.append((shifts.view(-1, 1, 4) + base_anchors.view(1, -1, 4)).reshape(-1, 4)) + + return anchors + + def generate_cell_anchors(self, sizes=(32, 64, 128, 256, 512), aspect_ratios=(0.5, 1, 2)): + """ + Generate a tensor storing canonical anchor boxes, which are all anchor + boxes of different sizes and aspect_ratios centered at (0, 0). + We can later build the set of anchors for a full feature map by + shifting and tiling these tensors (see `meth:_grid_anchors`). + + Args: + sizes (tuple[float]): + aspect_ratios (tuple[float]]): + + Returns: + Tensor of shape (len(sizes) * len(aspect_ratios), 4) storing anchor boxes + in XYXY format. + """ + + # This is different from the anchor generator defined in the original Faster R-CNN + # code or Detectron. They yield the same AP, however the old version defines cell + # anchors in a less natural way with a shift relative to the feature grid and + # quantization that results in slightly different sizes for different aspect ratios. + # See also https://github.com/facebookresearch/Detectron/issues/227 + + anchors = [] + for size in sizes: + area = size ** 2.0 + for aspect_ratio in aspect_ratios: + # s * s = w * h + # a = h / w + # ... some algebra ... + # w = sqrt(s * s / a) + # h = a * w + w = math.sqrt(area / aspect_ratio) + h = aspect_ratio * w + x0, y0, x1, y1 = -w / 2.0, -h / 2.0, w / 2.0, h / 2.0 + anchors.append([x0, y0, x1, y1]) + return torch.tensor(anchors) + + def forward(self, features): + """ + Args: + features (list[Tensor]): list of backbone feature maps on which to generate anchors. + + Returns: + list[Boxes]: a list of Boxes containing all the anchors for each feature map + (i.e. the cell anchors repeated over all locations in the feature map). + The number of anchors of each feature map is Hi x Wi x num_cell_anchors, + where Hi, Wi are resolution of the feature map divided by anchor stride. + """ + grid_sizes = [feature_map.shape[-2:] for feature_map in features] + anchors_over_all_feature_maps = self._grid_anchors(grid_sizes) + return [Boxes(x) for x in anchors_over_all_feature_maps] + + +@ANCHOR_GENERATOR_REGISTRY.register() +class RotatedAnchorGenerator(nn.Module): + """ + Compute rotated anchors used by Rotated RPN (RRPN), described in + "Arbitrary-Oriented Scene Text Detection via Rotation Proposals". + """ + + box_dim: int = 5 + """ + the dimension of each anchor box. + """ + + @configurable + def __init__(self, *, sizes, aspect_ratios, strides, angles, offset=0.5): + """ + This interface is experimental. + + Args: + sizes (list[list[float]] or list[float]): + If sizes is list[list[float]], sizes[i] is the list of anchor sizes + (i.e. sqrt of anchor area) to use for the i-th feature map. + If sizes is list[float], the sizes are used for all feature maps. + Anchor sizes are given in absolute lengths in units of + the input image; they do not dynamically scale if the input image size changes. + aspect_ratios (list[list[float]] or list[float]): list of aspect ratios + (i.e. height / width) to use for anchors. Same "broadcast" rule for `sizes` applies. + strides (list[int]): stride of each input feature. + angles (list[list[float]] or list[float]): list of angles (in degrees CCW) + to use for anchors. Same "broadcast" rule for `sizes` applies. + offset (float): Relative offset between the center of the first anchor and the top-left + corner of the image. Value has to be in [0, 1). + Recommend to use 0.5, which means half stride. + """ + super().__init__() + + self.strides = strides + self.num_features = len(self.strides) + sizes = _broadcast_params(sizes, self.num_features, "sizes") + aspect_ratios = _broadcast_params(aspect_ratios, self.num_features, "aspect_ratios") + angles = _broadcast_params(angles, self.num_features, "angles") + self.cell_anchors = self._calculate_anchors(sizes, aspect_ratios, angles) + + self.offset = offset + assert 0.0 <= self.offset < 1.0, self.offset + + @classmethod + def from_config(cls, cfg, input_shape: List[ShapeSpec]): + return { + "sizes": cfg.MODEL.ANCHOR_GENERATOR.SIZES, + "aspect_ratios": cfg.MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS, + "strides": [x.stride for x in input_shape], + "offset": cfg.MODEL.ANCHOR_GENERATOR.OFFSET, + "angles": cfg.MODEL.ANCHOR_GENERATOR.ANGLES, + } + + def _calculate_anchors(self, sizes, aspect_ratios, angles): + cell_anchors = [ + self.generate_cell_anchors(size, aspect_ratio, angle).float() + for size, aspect_ratio, angle in zip(sizes, aspect_ratios, angles) + ] + return BufferList(cell_anchors) + + @property + def num_cell_anchors(self): + """ + Alias of `num_anchors`. + """ + return self.num_anchors + + @property + def num_anchors(self): + """ + Returns: + list[int]: Each int is the number of anchors at every pixel + location, on that feature map. + For example, if at every pixel we use anchors of 3 aspect + ratios, 2 sizes and 5 angles, the number of anchors is 30. + (See also ANCHOR_GENERATOR.SIZES, ANCHOR_GENERATOR.ASPECT_RATIOS + and ANCHOR_GENERATOR.ANGLES in config) + + In standard RRPN models, `num_anchors` on every feature map is the same. + """ + return [len(cell_anchors) for cell_anchors in self.cell_anchors] + + def _grid_anchors(self, grid_sizes): + anchors = [] + for size, stride, base_anchors in zip(grid_sizes, self.strides, self.cell_anchors): + shift_x, shift_y = _create_grid_offsets(size, stride, self.offset, base_anchors.device) + zeros = torch.zeros_like(shift_x) + shifts = torch.stack((shift_x, shift_y, zeros, zeros, zeros), dim=1) + + anchors.append((shifts.view(-1, 1, 5) + base_anchors.view(1, -1, 5)).reshape(-1, 5)) + + return anchors + + def generate_cell_anchors( + self, + sizes=(32, 64, 128, 256, 512), + aspect_ratios=(0.5, 1, 2), + angles=(-90, -60, -30, 0, 30, 60, 90), + ): + """ + Generate a tensor storing canonical anchor boxes, which are all anchor + boxes of different sizes, aspect_ratios, angles centered at (0, 0). + We can later build the set of anchors for a full feature map by + shifting and tiling these tensors (see `meth:_grid_anchors`). + + Args: + sizes (tuple[float]): + aspect_ratios (tuple[float]]): + angles (tuple[float]]): + + Returns: + Tensor of shape (len(sizes) * len(aspect_ratios) * len(angles), 5) + storing anchor boxes in (x_ctr, y_ctr, w, h, angle) format. + """ + anchors = [] + for size in sizes: + area = size ** 2.0 + for aspect_ratio in aspect_ratios: + # s * s = w * h + # a = h / w + # ... some algebra ... + # w = sqrt(s * s / a) + # h = a * w + w = math.sqrt(area / aspect_ratio) + h = aspect_ratio * w + anchors.extend([0, 0, w, h, a] for a in angles) + + return torch.tensor(anchors) + + def forward(self, features): + """ + Args: + features (list[Tensor]): list of backbone feature maps on which to generate anchors. + + Returns: + list[RotatedBoxes]: a list of Boxes containing all the anchors for each feature map + (i.e. the cell anchors repeated over all locations in the feature map). + The number of anchors of each feature map is Hi x Wi x num_cell_anchors, + where Hi, Wi are resolution of the feature map divided by anchor stride. + """ + grid_sizes = [feature_map.shape[-2:] for feature_map in features] + anchors_over_all_feature_maps = self._grid_anchors(grid_sizes) + return [RotatedBoxes(x) for x in anchors_over_all_feature_maps] + + +def build_anchor_generator(cfg, input_shape): + """ + Built an anchor generator from `cfg.MODEL.ANCHOR_GENERATOR.NAME`. + """ + anchor_generator = cfg.MODEL.ANCHOR_GENERATOR.NAME + return ANCHOR_GENERATOR_REGISTRY.get(anchor_generator)(cfg, input_shape) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/__init__.py new file mode 100644 index 0000000..d477fb1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .build import build_backbone, BACKBONE_REGISTRY # noqa F401 isort:skip + +from .backbone import Backbone +from .fpn import FPN +from .resnet import ResNet, ResNetBlockBase, build_resnet_backbone, make_stage + +__all__ = [k for k in globals().keys() if not k.startswith("_")] +# TODO can expose more resnet blocks after careful consideration diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/backbone.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/backbone.py new file mode 100644 index 0000000..66dee4a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/backbone.py @@ -0,0 +1,53 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from abc import ABCMeta, abstractmethod +import torch.nn as nn + +from detectron2.layers import ShapeSpec + +__all__ = ["Backbone"] + + +class Backbone(nn.Module, metaclass=ABCMeta): + """ + Abstract base class for network backbones. + """ + + def __init__(self): + """ + The `__init__` method of any subclass can specify its own set of arguments. + """ + super().__init__() + + @abstractmethod + def forward(self): + """ + Subclasses must override this method, but adhere to the same return type. + + Returns: + dict[str->Tensor]: mapping from feature name (e.g., "res2") to tensor + """ + pass + + @property + def size_divisibility(self): + """ + Some backbones require the input height and width to be divisible by a + specific integer. This is typically true for encoder / decoder type networks + with lateral connection (e.g., FPN) for which feature maps need to match + dimension in the "bottom up" and "top down" paths. Set to 0 if no specific + input size divisibility is required. + """ + return 0 + + def output_shape(self): + """ + Returns: + dict[str->ShapeSpec] + """ + # this is a backward-compatible default + return { + name: ShapeSpec( + channels=self._out_feature_channels[name], stride=self._out_feature_strides[name] + ) + for name in self._out_features + } diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/build.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/build.py new file mode 100644 index 0000000..3d2ecae --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/build.py @@ -0,0 +1,33 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from detectron2.layers import ShapeSpec +from detectron2.utils.registry import Registry + +from .backbone import Backbone + +BACKBONE_REGISTRY = Registry("BACKBONE") +BACKBONE_REGISTRY.__doc__ = """ +Registry for backbones, which extract feature maps from images + +The registered object must be a callable that accepts two arguments: + +1. A :class:`detectron2.config.CfgNode` +2. A :class:`detectron2.layers.ShapeSpec`, which contains the input shape specification. + +It must returns an instance of :class:`Backbone`. +""" + + +def build_backbone(cfg, input_shape=None): + """ + Build a backbone from `cfg.MODEL.BACKBONE.NAME`. + + Returns: + an instance of :class:`Backbone` + """ + if input_shape is None: + input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) + + backbone_name = cfg.MODEL.BACKBONE.NAME + backbone = BACKBONE_REGISTRY.get(backbone_name)(cfg, input_shape) + assert isinstance(backbone, Backbone) + return backbone diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/fpn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/fpn.py new file mode 100644 index 0000000..338b5f5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/fpn.py @@ -0,0 +1,245 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +import fvcore.nn.weight_init as weight_init +import torch.nn.functional as F +from torch import nn + +from detectron2.layers import Conv2d, ShapeSpec, get_norm + +from .backbone import Backbone +from .build import BACKBONE_REGISTRY +from .resnet import build_resnet_backbone + +__all__ = ["build_resnet_fpn_backbone", "build_retinanet_resnet_fpn_backbone", "FPN"] + + +class FPN(Backbone): + """ + This module implements :paper:`FPN`. + It creates pyramid features built on top of some input feature maps. + """ + + def __init__( + self, bottom_up, in_features, out_channels, norm="", top_block=None, fuse_type="sum" + ): + """ + Args: + bottom_up (Backbone): module representing the bottom up subnetwork. + Must be a subclass of :class:`Backbone`. The multi-scale feature + maps generated by the bottom up network, and listed in `in_features`, + are used to generate FPN levels. + in_features (list[str]): names of the input feature maps coming + from the backbone to which FPN is attached. For example, if the + backbone produces ["res2", "res3", "res4"], any *contiguous* sublist + of these may be used; order must be from high to low resolution. + out_channels (int): number of channels in the output feature maps. + norm (str): the normalization to use. + top_block (nn.Module or None): if provided, an extra operation will + be performed on the output of the last (smallest resolution) + FPN output, and the result will extend the result list. The top_block + further downsamples the feature map. It must have an attribute + "num_levels", meaning the number of extra FPN levels added by + this block, and "in_feature", which is a string representing + its input feature (e.g., p5). + fuse_type (str): types for fusing the top down features and the lateral + ones. It can be "sum" (default), which sums up element-wise; or "avg", + which takes the element-wise mean of the two. + """ + super(FPN, self).__init__() + assert isinstance(bottom_up, Backbone) + + # Feature map strides and channels from the bottom up network (e.g. ResNet) + input_shapes = bottom_up.output_shape() + in_strides = [input_shapes[f].stride for f in in_features] + in_channels = [input_shapes[f].channels for f in in_features] + + _assert_strides_are_log2_contiguous(in_strides) + lateral_convs = [] + output_convs = [] + + use_bias = norm == "" + for idx, in_channels in enumerate(in_channels): + lateral_norm = get_norm(norm, out_channels) + output_norm = get_norm(norm, out_channels) + + lateral_conv = Conv2d( + in_channels, out_channels, kernel_size=1, bias=use_bias, norm=lateral_norm + ) + output_conv = Conv2d( + out_channels, + out_channels, + kernel_size=3, + stride=1, + padding=1, + bias=use_bias, + norm=output_norm, + ) + weight_init.c2_xavier_fill(lateral_conv) + weight_init.c2_xavier_fill(output_conv) + stage = int(math.log2(in_strides[idx])) + self.add_module("fpn_lateral{}".format(stage), lateral_conv) + self.add_module("fpn_output{}".format(stage), output_conv) + + lateral_convs.append(lateral_conv) + output_convs.append(output_conv) + # Place convs into top-down order (from low to high resolution) + # to make the top-down computation in forward clearer. + self.lateral_convs = lateral_convs[::-1] + self.output_convs = output_convs[::-1] + self.top_block = top_block + self.in_features = in_features + self.bottom_up = bottom_up + # Return feature names are "p", like ["p2", "p3", ..., "p6"] + self._out_feature_strides = {"p{}".format(int(math.log2(s))): s for s in in_strides} + # top block output feature maps. + if self.top_block is not None: + for s in range(stage, stage + self.top_block.num_levels): + self._out_feature_strides["p{}".format(s + 1)] = 2 ** (s + 1) + + self._out_features = list(self._out_feature_strides.keys()) + self._out_feature_channels = {k: out_channels for k in self._out_features} + self._size_divisibility = in_strides[-1] + assert fuse_type in {"avg", "sum"} + self._fuse_type = fuse_type + + @property + def size_divisibility(self): + return self._size_divisibility + + def forward(self, x): + """ + Args: + input (dict[str->Tensor]): mapping feature map name (e.g., "res5") to + feature map tensor for each feature level in high to low resolution order. + + Returns: + dict[str->Tensor]: + mapping from feature map name to FPN feature map tensor + in high to low resolution order. Returned feature names follow the FPN + paper convention: "p", where stage has stride = 2 ** stage e.g., + ["p2", "p3", ..., "p6"]. + """ + # Reverse feature maps into top-down order (from low to high resolution) + bottom_up_features = self.bottom_up(x) + x = [bottom_up_features[f] for f in self.in_features[::-1]] + results = [] + prev_features = self.lateral_convs[0](x[0]) + results.append(self.output_convs[0](prev_features)) + for features, lateral_conv, output_conv in zip( + x[1:], self.lateral_convs[1:], self.output_convs[1:] + ): + top_down_features = F.interpolate(prev_features, scale_factor=2, mode="nearest") + lateral_features = lateral_conv(features) + prev_features = lateral_features + top_down_features + if self._fuse_type == "avg": + prev_features /= 2 + results.insert(0, output_conv(prev_features)) + + if self.top_block is not None: + top_block_in_feature = bottom_up_features.get(self.top_block.in_feature, None) + if top_block_in_feature is None: + top_block_in_feature = results[self._out_features.index(self.top_block.in_feature)] + results.extend(self.top_block(top_block_in_feature)) + assert len(self._out_features) == len(results) + return dict(zip(self._out_features, results)) + + def output_shape(self): + return { + name: ShapeSpec( + channels=self._out_feature_channels[name], stride=self._out_feature_strides[name] + ) + for name in self._out_features + } + + +def _assert_strides_are_log2_contiguous(strides): + """ + Assert that each stride is 2x times its preceding stride, i.e. "contiguous in log2". + """ + for i, stride in enumerate(strides[1:], 1): + assert stride == 2 * strides[i - 1], "Strides {} {} are not log2 contiguous".format( + stride, strides[i - 1] + ) + + +class LastLevelMaxPool(nn.Module): + """ + This module is used in the original FPN to generate a downsampled + P6 feature from P5. + """ + + def __init__(self): + super().__init__() + self.num_levels = 1 + self.in_feature = "p5" + + def forward(self, x): + return [F.max_pool2d(x, kernel_size=1, stride=2, padding=0)] + + +class LastLevelP6P7(nn.Module): + """ + This module is used in RetinaNet to generate extra layers, P6 and P7 from + C5 feature. + """ + + def __init__(self, in_channels, out_channels, in_feature="res5"): + super().__init__() + self.num_levels = 2 + self.in_feature = in_feature + self.p6 = nn.Conv2d(in_channels, out_channels, 3, 2, 1) + self.p7 = nn.Conv2d(out_channels, out_channels, 3, 2, 1) + for module in [self.p6, self.p7]: + weight_init.c2_xavier_fill(module) + + def forward(self, c5): + p6 = self.p6(c5) + p7 = self.p7(F.relu(p6)) + return [p6, p7] + + +@BACKBONE_REGISTRY.register() +def build_resnet_fpn_backbone(cfg, input_shape: ShapeSpec): + """ + Args: + cfg: a detectron2 CfgNode + + Returns: + backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. + """ + bottom_up = build_resnet_backbone(cfg, input_shape) + in_features = cfg.MODEL.FPN.IN_FEATURES + out_channels = cfg.MODEL.FPN.OUT_CHANNELS + backbone = FPN( + bottom_up=bottom_up, + in_features=in_features, + out_channels=out_channels, + norm=cfg.MODEL.FPN.NORM, + top_block=LastLevelMaxPool(), + fuse_type=cfg.MODEL.FPN.FUSE_TYPE, + ) + return backbone + + +@BACKBONE_REGISTRY.register() +def build_retinanet_resnet_fpn_backbone(cfg, input_shape: ShapeSpec): + """ + Args: + cfg: a detectron2 CfgNode + + Returns: + backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. + """ + bottom_up = build_resnet_backbone(cfg, input_shape) + in_features = cfg.MODEL.FPN.IN_FEATURES + out_channels = cfg.MODEL.FPN.OUT_CHANNELS + in_channels_p6p7 = bottom_up.output_shape()["res5"].channels + backbone = FPN( + bottom_up=bottom_up, + in_features=in_features, + out_channels=out_channels, + norm=cfg.MODEL.FPN.NORM, + top_block=LastLevelP6P7(in_channels_p6p7, out_channels), + fuse_type=cfg.MODEL.FPN.FUSE_TYPE, + ) + return backbone diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/resnet.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/resnet.py new file mode 100644 index 0000000..f1faae0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/backbone/resnet.py @@ -0,0 +1,591 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +import fvcore.nn.weight_init as weight_init +import torch +import torch.nn.functional as F +from torch import nn + +from detectron2.layers import ( + CNNBlockBase, + Conv2d, + DeformConv, + ModulatedDeformConv, + ShapeSpec, + get_norm, +) + +from .backbone import Backbone +from .build import BACKBONE_REGISTRY + +__all__ = [ + "ResNetBlockBase", + "BasicBlock", + "BottleneckBlock", + "DeformBottleneckBlock", + "BasicStem", + "ResNet", + "make_stage", + "build_resnet_backbone", +] + + +ResNetBlockBase = CNNBlockBase +""" +Alias for backward compatibiltiy. +""" + + +class BasicBlock(CNNBlockBase): + """ + The basic residual block for ResNet-18 and ResNet-34 defined in :paper:`ResNet`, + with two 3x3 conv layers and a projection shortcut if needed. + """ + + def __init__(self, in_channels, out_channels, *, stride=1, norm="BN"): + """ + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + stride (int): Stride for the first conv. + norm (str or callable): normalization for all conv layers. + See :func:`layers.get_norm` for supported format. + """ + super().__init__(in_channels, out_channels, stride) + + if in_channels != out_channels: + self.shortcut = Conv2d( + in_channels, + out_channels, + kernel_size=1, + stride=stride, + bias=False, + norm=get_norm(norm, out_channels), + ) + else: + self.shortcut = None + + self.conv1 = Conv2d( + in_channels, + out_channels, + kernel_size=3, + stride=stride, + padding=1, + bias=False, + norm=get_norm(norm, out_channels), + ) + + self.conv2 = Conv2d( + out_channels, + out_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False, + norm=get_norm(norm, out_channels), + ) + + for layer in [self.conv1, self.conv2, self.shortcut]: + if layer is not None: # shortcut can be None + weight_init.c2_msra_fill(layer) + + def forward(self, x): + out = self.conv1(x) + out = F.relu_(out) + out = self.conv2(out) + + if self.shortcut is not None: + shortcut = self.shortcut(x) + else: + shortcut = x + + out += shortcut + out = F.relu_(out) + return out + + +class BottleneckBlock(CNNBlockBase): + """ + The standard bottleneck residual block used by ResNet-50, 101 and 152 + defined in :paper:`ResNet`. It contains 3 conv layers with kernels + 1x1, 3x3, 1x1, and a projection shortcut if needed. + """ + + def __init__( + self, + in_channels, + out_channels, + *, + bottleneck_channels, + stride=1, + num_groups=1, + norm="BN", + stride_in_1x1=False, + dilation=1, + ): + """ + Args: + bottleneck_channels (int): number of output channels for the 3x3 + "bottleneck" conv layers. + num_groups (int): number of groups for the 3x3 conv layer. + norm (str or callable): normalization for all conv layers. + See :func:`layers.get_norm` for supported format. + stride_in_1x1 (bool): when stride>1, whether to put stride in the + first 1x1 convolution or the bottleneck 3x3 convolution. + dilation (int): the dilation rate of the 3x3 conv layer. + """ + super().__init__(in_channels, out_channels, stride) + + if in_channels != out_channels: + self.shortcut = Conv2d( + in_channels, + out_channels, + kernel_size=1, + stride=stride, + bias=False, + norm=get_norm(norm, out_channels), + ) + else: + self.shortcut = None + + # The original MSRA ResNet models have stride in the first 1x1 conv + # The subsequent fb.torch.resnet and Caffe2 ResNe[X]t implementations have + # stride in the 3x3 conv + stride_1x1, stride_3x3 = (stride, 1) if stride_in_1x1 else (1, stride) + + self.conv1 = Conv2d( + in_channels, + bottleneck_channels, + kernel_size=1, + stride=stride_1x1, + bias=False, + norm=get_norm(norm, bottleneck_channels), + ) + + self.conv2 = Conv2d( + bottleneck_channels, + bottleneck_channels, + kernel_size=3, + stride=stride_3x3, + padding=1 * dilation, + bias=False, + groups=num_groups, + dilation=dilation, + norm=get_norm(norm, bottleneck_channels), + ) + + self.conv3 = Conv2d( + bottleneck_channels, + out_channels, + kernel_size=1, + bias=False, + norm=get_norm(norm, out_channels), + ) + + for layer in [self.conv1, self.conv2, self.conv3, self.shortcut]: + if layer is not None: # shortcut can be None + weight_init.c2_msra_fill(layer) + + # Zero-initialize the last normalization in each residual branch, + # so that at the beginning, the residual branch starts with zeros, + # and each residual block behaves like an identity. + # See Sec 5.1 in "Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour": + # "For BN layers, the learnable scaling coefficient γ is initialized + # to be 1, except for each residual block's last BN + # where γ is initialized to be 0." + + # nn.init.constant_(self.conv3.norm.weight, 0) + # TODO this somehow hurts performance when training GN models from scratch. + # Add it as an option when we need to use this code to train a backbone. + + def forward(self, x): + out = self.conv1(x) + out = F.relu_(out) + + out = self.conv2(out) + out = F.relu_(out) + + out = self.conv3(out) + + if self.shortcut is not None: + shortcut = self.shortcut(x) + else: + shortcut = x + + out += shortcut + out = F.relu_(out) + return out + + +class DeformBottleneckBlock(ResNetBlockBase): + """ + Similar to :class:`BottleneckBlock`, but with :paper:`deformable conv ` + in the 3x3 convolution. + """ + + def __init__( + self, + in_channels, + out_channels, + *, + bottleneck_channels, + stride=1, + num_groups=1, + norm="BN", + stride_in_1x1=False, + dilation=1, + deform_modulated=False, + deform_num_groups=1, + ): + super().__init__(in_channels, out_channels, stride) + self.deform_modulated = deform_modulated + + if in_channels != out_channels: + self.shortcut = Conv2d( + in_channels, + out_channels, + kernel_size=1, + stride=stride, + bias=False, + norm=get_norm(norm, out_channels), + ) + else: + self.shortcut = None + + stride_1x1, stride_3x3 = (stride, 1) if stride_in_1x1 else (1, stride) + + self.conv1 = Conv2d( + in_channels, + bottleneck_channels, + kernel_size=1, + stride=stride_1x1, + bias=False, + norm=get_norm(norm, bottleneck_channels), + ) + + if deform_modulated: + deform_conv_op = ModulatedDeformConv + # offset channels are 2 or 3 (if with modulated) * kernel_size * kernel_size + offset_channels = 27 + else: + deform_conv_op = DeformConv + offset_channels = 18 + + self.conv2_offset = Conv2d( + bottleneck_channels, + offset_channels * deform_num_groups, + kernel_size=3, + stride=stride_3x3, + padding=1 * dilation, + dilation=dilation, + ) + self.conv2 = deform_conv_op( + bottleneck_channels, + bottleneck_channels, + kernel_size=3, + stride=stride_3x3, + padding=1 * dilation, + bias=False, + groups=num_groups, + dilation=dilation, + deformable_groups=deform_num_groups, + norm=get_norm(norm, bottleneck_channels), + ) + + self.conv3 = Conv2d( + bottleneck_channels, + out_channels, + kernel_size=1, + bias=False, + norm=get_norm(norm, out_channels), + ) + + for layer in [self.conv1, self.conv2, self.conv3, self.shortcut]: + if layer is not None: # shortcut can be None + weight_init.c2_msra_fill(layer) + + nn.init.constant_(self.conv2_offset.weight, 0) + nn.init.constant_(self.conv2_offset.bias, 0) + + def forward(self, x): + out = self.conv1(x) + out = F.relu_(out) + + if self.deform_modulated: + offset_mask = self.conv2_offset(out) + offset_x, offset_y, mask = torch.chunk(offset_mask, 3, dim=1) + offset = torch.cat((offset_x, offset_y), dim=1) + mask = mask.sigmoid() + out = self.conv2(out, offset, mask) + else: + offset = self.conv2_offset(out) + out = self.conv2(out, offset) + out = F.relu_(out) + + out = self.conv3(out) + + if self.shortcut is not None: + shortcut = self.shortcut(x) + else: + shortcut = x + + out += shortcut + out = F.relu_(out) + return out + + +def make_stage(block_class, num_blocks, first_stride, *, in_channels, out_channels, **kwargs): + """ + Create a list of blocks just like those in a ResNet stage. + + Args: + block_class (type): a subclass of ResNetBlockBase + num_blocks (int): + first_stride (int): the stride of the first block. The other blocks will have stride=1. + in_channels (int): input channels of the entire stage. + out_channels (int): output channels of **every block** in the stage. + kwargs: other arguments passed to the constructor of every block. + + Returns: + list[nn.Module]: a list of block module. + """ + assert "stride" not in kwargs, "Stride of blocks in make_stage cannot be changed." + blocks = [] + for i in range(num_blocks): + blocks.append( + block_class( + in_channels=in_channels, + out_channels=out_channels, + stride=first_stride if i == 0 else 1, + **kwargs, + ) + ) + in_channels = out_channels + return blocks + + +class BasicStem(CNNBlockBase): + """ + The standard ResNet stem (layers before the first residual block). + """ + + def __init__(self, in_channels=3, out_channels=64, norm="BN"): + """ + Args: + norm (str or callable): norm after the first conv layer. + See :func:`layers.get_norm` for supported format. + """ + super().__init__(in_channels, out_channels, 4) + self.in_channels = in_channels + self.conv1 = Conv2d( + in_channels, + out_channels, + kernel_size=7, + stride=2, + padding=3, + bias=False, + norm=get_norm(norm, out_channels), + ) + weight_init.c2_msra_fill(self.conv1) + + def forward(self, x): + x = self.conv1(x) + x = F.relu_(x) + x = F.max_pool2d(x, kernel_size=3, stride=2, padding=1) + return x + + +class ResNet(Backbone): + """ + Implement :paper:`ResNet`. + """ + + def __init__(self, stem, stages, num_classes=None, out_features=None): + """ + Args: + stem (nn.Module): a stem module + stages (list[list[CNNBlockBase]]): several (typically 4) stages, + each contains multiple :class:`CNNBlockBase`. + num_classes (None or int): if None, will not perform classification. + Otherwise, will create a linear layer. + out_features (list[str]): name of the layers whose outputs should + be returned in forward. Can be anything in "stem", "linear", or "res2" ... + If None, will return the output of the last layer. + """ + super(ResNet, self).__init__() + self.stem = stem + self.num_classes = num_classes + + current_stride = self.stem.stride + self._out_feature_strides = {"stem": current_stride} + self._out_feature_channels = {"stem": self.stem.out_channels} + + self.stages_and_names = [] + for i, blocks in enumerate(stages): + assert len(blocks) > 0, len(blocks) + for block in blocks: + assert isinstance(block, CNNBlockBase), block + + name = "res" + str(i + 2) + stage = nn.Sequential(*blocks) + + self.add_module(name, stage) + self.stages_and_names.append((stage, name)) + + self._out_feature_strides[name] = current_stride = int( + current_stride * np.prod([k.stride for k in blocks]) + ) + self._out_feature_channels[name] = curr_channels = blocks[-1].out_channels + + if num_classes is not None: + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + self.linear = nn.Linear(curr_channels, num_classes) + + # Sec 5.1 in "Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour": + # "The 1000-way fully-connected layer is initialized by + # drawing weights from a zero-mean Gaussian with standard deviation of 0.01." + nn.init.normal_(self.linear.weight, std=0.01) + name = "linear" + + if out_features is None: + out_features = [name] + self._out_features = out_features + assert len(self._out_features) + children = [x[0] for x in self.named_children()] + for out_feature in self._out_features: + assert out_feature in children, "Available children: {}".format(", ".join(children)) + + def forward(self, x): + outputs = {} + x = self.stem(x) + if "stem" in self._out_features: + outputs["stem"] = x + for stage, name in self.stages_and_names: + x = stage(x) + if name in self._out_features: + outputs[name] = x + if self.num_classes is not None: + x = self.avgpool(x) + x = torch.flatten(x, 1) + x = self.linear(x) + if "linear" in self._out_features: + outputs["linear"] = x + return outputs + + def output_shape(self): + return { + name: ShapeSpec( + channels=self._out_feature_channels[name], stride=self._out_feature_strides[name] + ) + for name in self._out_features + } + + def freeze(self, freeze_at=0): + """ + Freeze the first several stages of the ResNet. Commonly used in + fine-tuning. + + Layers that produce the same feature map spatial size are defined as one + "stage" by :paper:`FPN`. + + Args: + freeze_at (int): number of stages to freeze. + `1` means freezing the stem. `2` means freezing the stem and + one residual stage, etc. + + Returns: + nn.Module: this ResNet itself + """ + if freeze_at >= 1: + self.stem.freeze() + for idx, (stage, _) in enumerate(self.stages_and_names, start=2): + if freeze_at >= idx: + for block in stage.children(): + block.freeze() + return self + + +@BACKBONE_REGISTRY.register() +def build_resnet_backbone(cfg, input_shape): + """ + Create a ResNet instance from config. + + Returns: + ResNet: a :class:`ResNet` instance. + """ + # need registration of new blocks/stems? + norm = cfg.MODEL.RESNETS.NORM + stem = BasicStem( + in_channels=input_shape.channels, + out_channels=cfg.MODEL.RESNETS.STEM_OUT_CHANNELS, + norm=norm, + ) + + # fmt: off + freeze_at = cfg.MODEL.BACKBONE.FREEZE_AT + out_features = cfg.MODEL.RESNETS.OUT_FEATURES + depth = cfg.MODEL.RESNETS.DEPTH + num_groups = cfg.MODEL.RESNETS.NUM_GROUPS + width_per_group = cfg.MODEL.RESNETS.WIDTH_PER_GROUP + bottleneck_channels = num_groups * width_per_group + in_channels = cfg.MODEL.RESNETS.STEM_OUT_CHANNELS + out_channels = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS + stride_in_1x1 = cfg.MODEL.RESNETS.STRIDE_IN_1X1 + res5_dilation = cfg.MODEL.RESNETS.RES5_DILATION + deform_on_per_stage = cfg.MODEL.RESNETS.DEFORM_ON_PER_STAGE + deform_modulated = cfg.MODEL.RESNETS.DEFORM_MODULATED + deform_num_groups = cfg.MODEL.RESNETS.DEFORM_NUM_GROUPS + # fmt: on + assert res5_dilation in {1, 2}, "res5_dilation cannot be {}.".format(res5_dilation) + + num_blocks_per_stage = { + 18: [2, 2, 2, 2], + 34: [3, 4, 6, 3], + 50: [3, 4, 6, 3], + 101: [3, 4, 23, 3], + 152: [3, 8, 36, 3], + }[depth] + + if depth in [18, 34]: + assert out_channels == 64, "Must set MODEL.RESNETS.RES2_OUT_CHANNELS = 64 for R18/R34" + assert not any( + deform_on_per_stage + ), "MODEL.RESNETS.DEFORM_ON_PER_STAGE unsupported for R18/R34" + assert res5_dilation == 1, "Must set MODEL.RESNETS.RES5_DILATION = 1 for R18/R34" + assert num_groups == 1, "Must set MODEL.RESNETS.NUM_GROUPS = 1 for R18/R34" + + stages = [] + + # Avoid creating variables without gradients + # It consumes extra memory and may cause allreduce to fail + out_stage_idx = [{"res2": 2, "res3": 3, "res4": 4, "res5": 5}[f] for f in out_features] + max_stage_idx = max(out_stage_idx) + for idx, stage_idx in enumerate(range(2, max_stage_idx + 1)): + dilation = res5_dilation if stage_idx == 5 else 1 + first_stride = 1 if idx == 0 or (stage_idx == 5 and dilation == 2) else 2 + stage_kargs = { + "num_blocks": num_blocks_per_stage[idx], + "first_stride": first_stride, + "in_channels": in_channels, + "out_channels": out_channels, + "norm": norm, + } + # Use BasicBlock for R18 and R34. + if depth in [18, 34]: + stage_kargs["block_class"] = BasicBlock + else: + stage_kargs["bottleneck_channels"] = bottleneck_channels + stage_kargs["stride_in_1x1"] = stride_in_1x1 + stage_kargs["dilation"] = dilation + stage_kargs["num_groups"] = num_groups + if deform_on_per_stage[idx]: + stage_kargs["block_class"] = DeformBottleneckBlock + stage_kargs["deform_modulated"] = deform_modulated + stage_kargs["deform_num_groups"] = deform_num_groups + else: + stage_kargs["block_class"] = BottleneckBlock + blocks = make_stage(**stage_kargs) + in_channels = out_channels + out_channels *= 2 + bottleneck_channels *= 2 + stages.append(blocks) + return ResNet(stem, stages, out_features=out_features).freeze(freeze_at) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/box_regression.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/box_regression.py new file mode 100644 index 0000000..88426fd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/box_regression.py @@ -0,0 +1,247 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +from typing import Tuple +import torch + +# Value for clamping large dw and dh predictions. The heuristic is that we clamp +# such that dw and dh are no larger than what would transform a 16px box into a +# 1000px box (based on a small anchor, 16px, and a typical image size, 1000px). +_DEFAULT_SCALE_CLAMP = math.log(1000.0 / 16) + + +__all__ = ["Box2BoxTransform", "Box2BoxTransformRotated"] + + +def apply_deltas_broadcast(box2box_transform, deltas, boxes): + """ + Apply transform deltas to boxes. Similar to `box2box_transform.apply_deltas`, + but allow broadcasting boxes when the second dimension of deltas is a multiple + of box dimension. + + Args: + box2box_transform (Box2BoxTransform or Box2BoxTransformRotated): the transform to apply + deltas (Tensor): tensor of shape (N,B) or (N,KxB) + boxes (Tensor): tensor of shape (N,B) + + Returns: + Tensor: same shape as deltas. + """ + assert deltas.dim() == boxes.dim() == 2, f"{deltas.shape}, {boxes.shape}" + N, B = boxes.shape + assert ( + deltas.shape[1] % B == 0 + ), f"Second dim of deltas should be a multiple of {B}. Got {deltas.shape}" + K = deltas.shape[1] // B + ret = box2box_transform.apply_deltas( + deltas.view(N * K, B), boxes.unsqueeze(1).expand(N, K, B).reshape(N * K, B) + ) + return ret.view(N, K * B) + + +@torch.jit.script +class Box2BoxTransform(object): + """ + The box-to-box transform defined in R-CNN. The transformation is parameterized + by 4 deltas: (dx, dy, dw, dh). The transformation scales the box's width and height + by exp(dw), exp(dh) and shifts a box's center by the offset (dx * width, dy * height). + """ + + def __init__( + self, weights: Tuple[float, float, float, float], scale_clamp: float = _DEFAULT_SCALE_CLAMP + ): + """ + Args: + weights (4-element tuple): Scaling factors that are applied to the + (dx, dy, dw, dh) deltas. In Fast R-CNN, these were originally set + such that the deltas have unit variance; now they are treated as + hyperparameters of the system. + scale_clamp (float): When predicting deltas, the predicted box scaling + factors (dw and dh) are clamped such that they are <= scale_clamp. + """ + self.weights = weights + self.scale_clamp = scale_clamp + + def get_deltas(self, src_boxes, target_boxes): + """ + Get box regression transformation deltas (dx, dy, dw, dh) that can be used + to transform the `src_boxes` into the `target_boxes`. That is, the relation + ``target_boxes == self.apply_deltas(deltas, src_boxes)`` is true (unless + any delta is too large and is clamped). + + Args: + src_boxes (Tensor): source boxes, e.g., object proposals + target_boxes (Tensor): target of the transformation, e.g., ground-truth + boxes. + """ + assert isinstance(src_boxes, torch.Tensor), type(src_boxes) + assert isinstance(target_boxes, torch.Tensor), type(target_boxes) + + src_widths = src_boxes[:, 2] - src_boxes[:, 0] + src_heights = src_boxes[:, 3] - src_boxes[:, 1] + src_ctr_x = src_boxes[:, 0] + 0.5 * src_widths + src_ctr_y = src_boxes[:, 1] + 0.5 * src_heights + + target_widths = target_boxes[:, 2] - target_boxes[:, 0] + target_heights = target_boxes[:, 3] - target_boxes[:, 1] + target_ctr_x = target_boxes[:, 0] + 0.5 * target_widths + target_ctr_y = target_boxes[:, 1] + 0.5 * target_heights + + wx, wy, ww, wh = self.weights + dx = wx * (target_ctr_x - src_ctr_x) / src_widths + dy = wy * (target_ctr_y - src_ctr_y) / src_heights + dw = ww * torch.log(target_widths / src_widths) + dh = wh * torch.log(target_heights / src_heights) + + deltas = torch.stack((dx, dy, dw, dh), dim=1) + assert (src_widths > 0).all().item(), "Input boxes to Box2BoxTransform are not valid!" + return deltas + + def apply_deltas(self, deltas, boxes): + """ + Apply transformation `deltas` (dx, dy, dw, dh) to `boxes`. + + Args: + deltas (Tensor): transformation deltas of shape (N, k*4), where k >= 1. + deltas[i] represents k potentially different class-specific + box transformations for the single box boxes[i]. + boxes (Tensor): boxes to transform, of shape (N, 4) + """ + boxes = boxes.to(deltas.dtype) + + widths = boxes[:, 2] - boxes[:, 0] + heights = boxes[:, 3] - boxes[:, 1] + ctr_x = boxes[:, 0] + 0.5 * widths + ctr_y = boxes[:, 1] + 0.5 * heights + + wx, wy, ww, wh = self.weights + dx = deltas[:, 0::4] / wx + dy = deltas[:, 1::4] / wy + dw = deltas[:, 2::4] / ww + dh = deltas[:, 3::4] / wh + + # Prevent sending too large values into torch.exp() + dw = torch.clamp(dw, max=self.scale_clamp) + dh = torch.clamp(dh, max=self.scale_clamp) + + pred_ctr_x = dx * widths[:, None] + ctr_x[:, None] + pred_ctr_y = dy * heights[:, None] + ctr_y[:, None] + pred_w = torch.exp(dw) * widths[:, None] + pred_h = torch.exp(dh) * heights[:, None] + + pred_boxes = torch.zeros_like(deltas) + pred_boxes[:, 0::4] = pred_ctr_x - 0.5 * pred_w # x1 + pred_boxes[:, 1::4] = pred_ctr_y - 0.5 * pred_h # y1 + pred_boxes[:, 2::4] = pred_ctr_x + 0.5 * pred_w # x2 + pred_boxes[:, 3::4] = pred_ctr_y + 0.5 * pred_h # y2 + return pred_boxes + + +@torch.jit.script +class Box2BoxTransformRotated(object): + """ + The box-to-box transform defined in Rotated R-CNN. The transformation is parameterized + by 5 deltas: (dx, dy, dw, dh, da). The transformation scales the box's width and height + by exp(dw), exp(dh), shifts a box's center by the offset (dx * width, dy * height), + and rotate a box's angle by da (radians). + Note: angles of deltas are in radians while angles of boxes are in degrees. + """ + + def __init__( + self, + weights: Tuple[float, float, float, float, float], + scale_clamp: float = _DEFAULT_SCALE_CLAMP, + ): + """ + Args: + weights (5-element tuple): Scaling factors that are applied to the + (dx, dy, dw, dh, da) deltas. These are treated as + hyperparameters of the system. + scale_clamp (float): When predicting deltas, the predicted box scaling + factors (dw and dh) are clamped such that they are <= scale_clamp. + """ + self.weights = weights + self.scale_clamp = scale_clamp + + def get_deltas(self, src_boxes, target_boxes): + """ + Get box regression transformation deltas (dx, dy, dw, dh, da) that can be used + to transform the `src_boxes` into the `target_boxes`. That is, the relation + ``target_boxes == self.apply_deltas(deltas, src_boxes)`` is true (unless + any delta is too large and is clamped). + + Args: + src_boxes (Tensor): Nx5 source boxes, e.g., object proposals + target_boxes (Tensor): Nx5 target of the transformation, e.g., ground-truth + boxes. + """ + assert isinstance(src_boxes, torch.Tensor), type(src_boxes) + assert isinstance(target_boxes, torch.Tensor), type(target_boxes) + + src_ctr_x, src_ctr_y, src_widths, src_heights, src_angles = torch.unbind(src_boxes, dim=1) + + target_ctr_x, target_ctr_y, target_widths, target_heights, target_angles = torch.unbind( + target_boxes, dim=1 + ) + + wx, wy, ww, wh, wa = self.weights + dx = wx * (target_ctr_x - src_ctr_x) / src_widths + dy = wy * (target_ctr_y - src_ctr_y) / src_heights + dw = ww * torch.log(target_widths / src_widths) + dh = wh * torch.log(target_heights / src_heights) + # Angles of deltas are in radians while angles of boxes are in degrees. + # the conversion to radians serve as a way to normalize the values + da = target_angles - src_angles + da = (da + 180.0) % 360.0 - 180.0 # make it in [-180, 180) + da *= wa * math.pi / 180.0 + + deltas = torch.stack((dx, dy, dw, dh, da), dim=1) + assert ( + (src_widths > 0).all().item() + ), "Input boxes to Box2BoxTransformRotated are not valid!" + return deltas + + def apply_deltas(self, deltas, boxes): + """ + Apply transformation `deltas` (dx, dy, dw, dh, da) to `boxes`. + + Args: + deltas (Tensor): transformation deltas of shape (N, 5). + deltas[i] represents box transformation for the single box boxes[i]. + boxes (Tensor): boxes to transform, of shape (N, 5) + """ + assert deltas.shape[1] == 5 and boxes.shape[1] == 5 + + boxes = boxes.to(deltas.dtype) + + ctr_x = boxes[:, 0] + ctr_y = boxes[:, 1] + widths = boxes[:, 2] + heights = boxes[:, 3] + angles = boxes[:, 4] + + wx, wy, ww, wh, wa = self.weights + + dx = deltas[:, 0] / wx + dy = deltas[:, 1] / wy + dw = deltas[:, 2] / ww + dh = deltas[:, 3] / wh + da = deltas[:, 4] / wa + + # Prevent sending too large values into torch.exp() + dw = torch.clamp(dw, max=self.scale_clamp) + dh = torch.clamp(dh, max=self.scale_clamp) + + pred_boxes = torch.zeros_like(deltas) + pred_boxes[:, 0] = dx * widths + ctr_x # x_ctr + pred_boxes[:, 1] = dy * heights + ctr_y # y_ctr + pred_boxes[:, 2] = torch.exp(dw) * widths # width + pred_boxes[:, 3] = torch.exp(dh) * heights # height + + # Following original RRPN implementation, + # angles of deltas are in radians while angles of boxes are in degrees. + pred_angle = da * 180.0 / math.pi + angles + pred_angle = (pred_angle + 180.0) % 360.0 - 180.0 # make it in [-180, 180) + + pred_boxes[:, 4] = pred_angle + + return pred_boxes diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/matcher.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/matcher.py new file mode 100644 index 0000000..2911f8c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/matcher.py @@ -0,0 +1,123 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from typing import List +import torch + + +class Matcher(object): + """ + This class assigns to each predicted "element" (e.g., a box) a ground-truth + element. Each predicted element will have exactly zero or one matches; each + ground-truth element may be matched to zero or more predicted elements. + + The matching is determined by the MxN match_quality_matrix, that characterizes + how well each (ground-truth, prediction)-pair match each other. For example, + if the elements are boxes, this matrix may contain box intersection-over-union + overlap values. + + The matcher returns (a) a vector of length N containing the index of the + ground-truth element m in [0, M) that matches to prediction n in [0, N). + (b) a vector of length N containing the labels for each prediction. + """ + + def __init__( + self, thresholds: List[float], labels: List[int], allow_low_quality_matches: bool = False + ): + """ + Args: + thresholds (list): a list of thresholds used to stratify predictions + into levels. + labels (list): a list of values to label predictions belonging at + each level. A label can be one of {-1, 0, 1} signifying + {ignore, negative class, positive class}, respectively. + allow_low_quality_matches (bool): if True, produce additional matches + for predictions with maximum match quality lower than high_threshold. + See set_low_quality_matches_ for more details. + + For example, + thresholds = [0.3, 0.5] + labels = [0, -1, 1] + All predictions with iou < 0.3 will be marked with 0 and + thus will be considered as false positives while training. + All predictions with 0.3 <= iou < 0.5 will be marked with -1 and + thus will be ignored. + All predictions with 0.5 <= iou will be marked with 1 and + thus will be considered as true positives. + """ + # Add -inf and +inf to first and last position in thresholds + thresholds = thresholds[:] + assert thresholds[0] > 0 + thresholds.insert(0, -float("inf")) + thresholds.append(float("inf")) + assert all(low <= high for (low, high) in zip(thresholds[:-1], thresholds[1:])) + assert all(l in [-1, 0, 1] for l in labels) + assert len(labels) == len(thresholds) - 1 + self.thresholds = thresholds + self.labels = labels + self.allow_low_quality_matches = allow_low_quality_matches + + def __call__(self, match_quality_matrix): + """ + Args: + match_quality_matrix (Tensor[float]): an MxN tensor, containing the + pairwise quality between M ground-truth elements and N predicted + elements. All elements must be >= 0 (due to the us of `torch.nonzero` + for selecting indices in :meth:`set_low_quality_matches_`). + + Returns: + matches (Tensor[int64]): a vector of length N, where matches[i] is a matched + ground-truth index in [0, M) + match_labels (Tensor[int8]): a vector of length N, where pred_labels[i] indicates + whether a prediction is a true or false positive or ignored + """ + assert match_quality_matrix.dim() == 2 + if match_quality_matrix.numel() == 0: + default_matches = match_quality_matrix.new_full( + (match_quality_matrix.size(1),), 0, dtype=torch.int64 + ) + # When no gt boxes exist, we define IOU = 0 and therefore set labels + # to `self.labels[0]`, which usually defaults to background class 0 + # To choose to ignore instead, can make labels=[-1,0,-1,1] + set appropriate thresholds + default_match_labels = match_quality_matrix.new_full( + (match_quality_matrix.size(1),), self.labels[0], dtype=torch.int8 + ) + return default_matches, default_match_labels + + assert torch.all(match_quality_matrix >= 0) + + # match_quality_matrix is M (gt) x N (predicted) + # Max over gt elements (dim 0) to find best gt candidate for each prediction + matched_vals, matches = match_quality_matrix.max(dim=0) + + match_labels = matches.new_full(matches.size(), 1, dtype=torch.int8) + + for (l, low, high) in zip(self.labels, self.thresholds[:-1], self.thresholds[1:]): + low_high = (matched_vals >= low) & (matched_vals < high) + match_labels[low_high] = l + + if self.allow_low_quality_matches: + self.set_low_quality_matches_(match_labels, match_quality_matrix) + + return matches, match_labels + + def set_low_quality_matches_(self, match_labels, match_quality_matrix): + """ + Produce additional matches for predictions that have only low-quality matches. + Specifically, for each ground-truth G find the set of predictions that have + maximum overlap with it (including ties); for each prediction in that set, if + it is unmatched, then match it to the ground-truth G. + + This function implements the RPN assignment case (i) in Sec. 3.1.2 of + :paper:`Faster R-CNN`. + """ + # For each gt, find the prediction with which it has highest quality + highest_quality_foreach_gt, _ = match_quality_matrix.max(dim=1) + # Find the highest quality match available, even if it is low, including ties. + # Note that the matches qualities must be positive due to the use of + # `torch.nonzero`. + _, pred_inds_with_highest_quality = torch.nonzero( + match_quality_matrix == highest_quality_foreach_gt[:, None], as_tuple=True + ) + # If an anchor was labeled positive only due to a low-quality match + # with gt_A, but it has larger overlap with gt_B, it's matched index will still be gt_B. + # This follows the implementation in Detectron, and is found to have no significant impact. + match_labels[pred_inds_with_highest_quality] = 1 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/__init__.py new file mode 100644 index 0000000..96ef9b5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/__init__.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from .build import META_ARCH_REGISTRY, build_model # isort:skip + +from .panoptic_fpn import PanopticFPN + +# import all the meta_arch, so they will be registered +from .rcnn import GeneralizedRCNN, ProposalNetwork +from .retinanet import RetinaNet +from .semantic_seg import SEM_SEG_HEADS_REGISTRY, SemanticSegmentor, build_sem_seg_head diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/build.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/build.py new file mode 100644 index 0000000..630389d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/build.py @@ -0,0 +1,23 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import torch + +from detectron2.utils.registry import Registry + +META_ARCH_REGISTRY = Registry("META_ARCH") # noqa F401 isort:skip +META_ARCH_REGISTRY.__doc__ = """ +Registry for meta-architectures, i.e. the whole model. + +The registered object will be called with `obj(cfg)` +and expected to return a `nn.Module` object. +""" + + +def build_model(cfg): + """ + Build the whole model architecture, defined by ``cfg.MODEL.META_ARCHITECTURE``. + Note that it does not load any weights from ``cfg``. + """ + meta_arch = cfg.MODEL.META_ARCHITECTURE + model = META_ARCH_REGISTRY.get(meta_arch)(cfg) + model.to(torch.device(cfg.MODEL.DEVICE)) + return model diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/panoptic_fpn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/panoptic_fpn.py new file mode 100644 index 0000000..c5f92f7 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/panoptic_fpn.py @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import torch +from torch import nn + +from detectron2.structures import ImageList + +from ..backbone import build_backbone +from ..postprocessing import detector_postprocess, sem_seg_postprocess +from ..proposal_generator import build_proposal_generator +from ..roi_heads import build_roi_heads +from .build import META_ARCH_REGISTRY +from .semantic_seg import build_sem_seg_head + +__all__ = ["PanopticFPN"] + + +@META_ARCH_REGISTRY.register() +class PanopticFPN(nn.Module): + """ + Implement the paper :paper:`PanopticFPN`. + """ + + def __init__(self, cfg): + super().__init__() + + self.instance_loss_weight = cfg.MODEL.PANOPTIC_FPN.INSTANCE_LOSS_WEIGHT + + # options when combining instance & semantic outputs + self.combine_on = cfg.MODEL.PANOPTIC_FPN.COMBINE.ENABLED + self.combine_overlap_threshold = cfg.MODEL.PANOPTIC_FPN.COMBINE.OVERLAP_THRESH + self.combine_stuff_area_limit = cfg.MODEL.PANOPTIC_FPN.COMBINE.STUFF_AREA_LIMIT + self.combine_instances_confidence_threshold = ( + cfg.MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH + ) + + self.backbone = build_backbone(cfg) + self.proposal_generator = build_proposal_generator(cfg, self.backbone.output_shape()) + self.roi_heads = build_roi_heads(cfg, self.backbone.output_shape()) + self.sem_seg_head = build_sem_seg_head(cfg, self.backbone.output_shape()) + + self.register_buffer("pixel_mean", torch.Tensor(cfg.MODEL.PIXEL_MEAN).view(-1, 1, 1)) + self.register_buffer("pixel_std", torch.Tensor(cfg.MODEL.PIXEL_STD).view(-1, 1, 1)) + + @property + def device(self): + return self.pixel_mean.device + + def forward(self, batched_inputs): + """ + Args: + batched_inputs: a list, batched outputs of :class:`DatasetMapper`. + Each item in the list contains the inputs for one image. + + For now, each item in the list is a dict that contains: + + * "image": Tensor, image in (C, H, W) format. + * "instances": Instances + * "sem_seg": semantic segmentation ground truth. + * Other information that's included in the original dicts, such as: + "height", "width" (int): the output resolution of the model, used in inference. + See :meth:`postprocess` for details. + + Returns: + list[dict]: + each dict is the results for one image. The dict contains the following keys: + + * "instances": see :meth:`GeneralizedRCNN.forward` for its format. + * "sem_seg": see :meth:`SemanticSegmentor.forward` for its format. + * "panoptic_seg": available when `PANOPTIC_FPN.COMBINE.ENABLED`. + See the return value of + :func:`combine_semantic_and_instance_outputs` for its format. + """ + images = [x["image"].to(self.device) for x in batched_inputs] + images = [(x - self.pixel_mean) / self.pixel_std for x in images] + images = ImageList.from_tensors(images, self.backbone.size_divisibility) + features = self.backbone(images.tensor) + + if "proposals" in batched_inputs[0]: + proposals = [x["proposals"].to(self.device) for x in batched_inputs] + proposal_losses = {} + + if "sem_seg" in batched_inputs[0]: + gt_sem_seg = [x["sem_seg"].to(self.device) for x in batched_inputs] + gt_sem_seg = ImageList.from_tensors( + gt_sem_seg, self.backbone.size_divisibility, self.sem_seg_head.ignore_value + ).tensor + else: + gt_sem_seg = None + sem_seg_results, sem_seg_losses = self.sem_seg_head(features, gt_sem_seg) + + if "instances" in batched_inputs[0]: + gt_instances = [x["instances"].to(self.device) for x in batched_inputs] + else: + gt_instances = None + if self.proposal_generator: + proposals, proposal_losses = self.proposal_generator(images, features, gt_instances) + detector_results, detector_losses = self.roi_heads( + images, features, proposals, gt_instances + ) + + if self.training: + losses = {} + losses.update(sem_seg_losses) + losses.update({k: v * self.instance_loss_weight for k, v in detector_losses.items()}) + losses.update(proposal_losses) + return losses + + processed_results = [] + for sem_seg_result, detector_result, input_per_image, image_size in zip( + sem_seg_results, detector_results, batched_inputs, images.image_sizes + ): + height = input_per_image.get("height", image_size[0]) + width = input_per_image.get("width", image_size[1]) + sem_seg_r = sem_seg_postprocess(sem_seg_result, image_size, height, width) + detector_r = detector_postprocess(detector_result, height, width) + + processed_results.append({"sem_seg": sem_seg_r, "instances": detector_r}) + + if self.combine_on: + panoptic_r = combine_semantic_and_instance_outputs( + detector_r, + sem_seg_r.argmax(dim=0), + self.combine_overlap_threshold, + self.combine_stuff_area_limit, + self.combine_instances_confidence_threshold, + ) + processed_results[-1]["panoptic_seg"] = panoptic_r + return processed_results + + +def combine_semantic_and_instance_outputs( + instance_results, + semantic_results, + overlap_threshold, + stuff_area_limit, + instances_confidence_threshold, +): + """ + Implement a simple combining logic following + "combine_semantic_and_instance_predictions.py" in panopticapi + to produce panoptic segmentation outputs. + + Args: + instance_results: output of :func:`detector_postprocess`. + semantic_results: an (H, W) tensor, each is the contiguous semantic + category id + + Returns: + panoptic_seg (Tensor): of shape (height, width) where the values are ids for each segment. + segments_info (list[dict]): Describe each segment in `panoptic_seg`. + Each dict contains keys "id", "category_id", "isthing". + """ + panoptic_seg = torch.zeros_like(semantic_results, dtype=torch.int32) + + # sort instance outputs by scores + sorted_inds = torch.argsort(-instance_results.scores) + + current_segment_id = 0 + segments_info = [] + + instance_masks = instance_results.pred_masks.to(dtype=torch.bool, device=panoptic_seg.device) + + # Add instances one-by-one, check for overlaps with existing ones + for inst_id in sorted_inds: + score = instance_results.scores[inst_id].item() + if score < instances_confidence_threshold: + break + mask = instance_masks[inst_id] # H,W + mask_area = mask.sum().item() + + if mask_area == 0: + continue + + intersect = (mask > 0) & (panoptic_seg > 0) + intersect_area = intersect.sum().item() + + if intersect_area * 1.0 / mask_area > overlap_threshold: + continue + + if intersect_area > 0: + mask = mask & (panoptic_seg == 0) + + current_segment_id += 1 + panoptic_seg[mask] = current_segment_id + segments_info.append( + { + "id": current_segment_id, + "isthing": True, + "score": score, + "category_id": instance_results.pred_classes[inst_id].item(), + "instance_id": inst_id.item(), + } + ) + + # Add semantic results to remaining empty areas + semantic_labels = torch.unique(semantic_results).cpu().tolist() + for semantic_label in semantic_labels: + if semantic_label == 0: # 0 is a special "thing" class + continue + mask = (semantic_results == semantic_label) & (panoptic_seg == 0) + mask_area = mask.sum().item() + if mask_area < stuff_area_limit: + continue + + current_segment_id += 1 + panoptic_seg[mask] = current_segment_id + segments_info.append( + { + "id": current_segment_id, + "isthing": False, + "category_id": semantic_label, + "area": mask_area, + } + ) + + return panoptic_seg, segments_info diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/rcnn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/rcnn.py new file mode 100644 index 0000000..b15ea8a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/rcnn.py @@ -0,0 +1,263 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import numpy as np +import torch +from torch import nn + +from detectron2.structures import ImageList +from detectron2.utils.events import get_event_storage +from detectron2.utils.logger import log_first_n + +from ..backbone import build_backbone +from ..postprocessing import detector_postprocess +from ..proposal_generator import build_proposal_generator +from ..roi_heads import build_roi_heads +from .build import META_ARCH_REGISTRY + +__all__ = ["GeneralizedRCNN", "ProposalNetwork"] + + +@META_ARCH_REGISTRY.register() +class GeneralizedRCNN(nn.Module): + """ + Generalized R-CNN. Any models that contains the following three components: + 1. Per-image feature extraction (aka backbone) + 2. Region proposal generation + 3. Per-region feature extraction and prediction + """ + + def __init__(self, cfg): + super().__init__() + + self.backbone = build_backbone(cfg) + self.proposal_generator = build_proposal_generator(cfg, self.backbone.output_shape()) + self.roi_heads = build_roi_heads(cfg, self.backbone.output_shape()) + self.vis_period = cfg.VIS_PERIOD + self.input_format = cfg.INPUT.FORMAT + + assert len(cfg.MODEL.PIXEL_MEAN) == len(cfg.MODEL.PIXEL_STD) + self.register_buffer("pixel_mean", torch.Tensor(cfg.MODEL.PIXEL_MEAN).view(-1, 1, 1)) + self.register_buffer("pixel_std", torch.Tensor(cfg.MODEL.PIXEL_STD).view(-1, 1, 1)) + + @property + def device(self): + return self.pixel_mean.device + + def visualize_training(self, batched_inputs, proposals): + """ + A function used to visualize images and proposals. It shows ground truth + bounding boxes on the original image and up to 20 predicted object + proposals on the original image. Users can implement different + visualization functions for different models. + + Args: + batched_inputs (list): a list that contains input to the model. + proposals (list): a list that contains predicted proposals. Both + batched_inputs and proposals should have the same length. + """ + from detectron2.utils.visualizer import Visualizer + + storage = get_event_storage() + max_vis_prop = 20 + + for input, prop in zip(batched_inputs, proposals): + img = input["image"].cpu().numpy() + assert img.shape[0] == 3, "Images should have 3 channels." + if self.input_format == "BGR": + img = img[::-1, :, :] + img = img.transpose(1, 2, 0) + v_gt = Visualizer(img, None) + v_gt = v_gt.overlay_instances(boxes=input["instances"].gt_boxes) + anno_img = v_gt.get_image() + box_size = min(len(prop.proposal_boxes), max_vis_prop) + v_pred = Visualizer(img, None) + v_pred = v_pred.overlay_instances( + boxes=prop.proposal_boxes[0:box_size].tensor.cpu().numpy() + ) + prop_img = v_pred.get_image() + vis_img = np.concatenate((anno_img, prop_img), axis=1) + vis_img = vis_img.transpose(2, 0, 1) + vis_name = "Left: GT bounding boxes; Right: Predicted proposals" + storage.put_image(vis_name, vis_img) + break # only visualize one image in a batch + + def forward(self, batched_inputs): + """ + Args: + batched_inputs: a list, batched outputs of :class:`DatasetMapper` . + Each item in the list contains the inputs for one image. + For now, each item in the list is a dict that contains: + + * image: Tensor, image in (C, H, W) format. + * instances (optional): groundtruth :class:`Instances` + * proposals (optional): :class:`Instances`, precomputed proposals. + + Other information that's included in the original dicts, such as: + + * "height", "width" (int): the output resolution of the model, used in inference. + See :meth:`postprocess` for details. + + Returns: + list[dict]: + Each dict is the output for one input image. + The dict contains one key "instances" whose value is a :class:`Instances`. + The :class:`Instances` object has the following keys: + "pred_boxes", "pred_classes", "scores", "pred_masks", "pred_keypoints" + """ + if not self.training: + return self.inference(batched_inputs) + + images = self.preprocess_image(batched_inputs) + if "instances" in batched_inputs[0]: + gt_instances = [x["instances"].to(self.device) for x in batched_inputs] + elif "targets" in batched_inputs[0]: + log_first_n( + logging.WARN, "'targets' in the model inputs is now renamed to 'instances'!", n=10 + ) + gt_instances = [x["targets"].to(self.device) for x in batched_inputs] + else: + gt_instances = None + + features = self.backbone(images.tensor) + + if self.proposal_generator: + proposals, proposal_losses = self.proposal_generator(images, features, gt_instances) + else: + assert "proposals" in batched_inputs[0] + proposals = [x["proposals"].to(self.device) for x in batched_inputs] + proposal_losses = {} + + _, detector_losses = self.roi_heads(images, features, proposals, gt_instances) + if self.vis_period > 0: + storage = get_event_storage() + if storage.iter % self.vis_period == 0: + self.visualize_training(batched_inputs, proposals) + + losses = {} + losses.update(detector_losses) + losses.update(proposal_losses) + return losses + + def inference(self, batched_inputs, detected_instances=None, do_postprocess=True): + """ + Run inference on the given inputs. + + Args: + batched_inputs (list[dict]): same as in :meth:`forward` + detected_instances (None or list[Instances]): if not None, it + contains an `Instances` object per image. The `Instances` + object contains "pred_boxes" and "pred_classes" which are + known boxes in the image. + The inference will then skip the detection of bounding boxes, + and only predict other per-ROI outputs. + do_postprocess (bool): whether to apply post-processing on the outputs. + + Returns: + same as in :meth:`forward`. + """ + assert not self.training + + images = self.preprocess_image(batched_inputs) + features = self.backbone(images.tensor) + + if detected_instances is None: + if self.proposal_generator: + proposals, _ = self.proposal_generator(images, features, None) + else: + assert "proposals" in batched_inputs[0] + proposals = [x["proposals"].to(self.device) for x in batched_inputs] + + results, _ = self.roi_heads(images, features, proposals, None) + else: + detected_instances = [x.to(self.device) for x in detected_instances] + results = self.roi_heads.forward_with_given_boxes(features, detected_instances) + + if do_postprocess: + return GeneralizedRCNN._postprocess(results, batched_inputs, images.image_sizes) + else: + return results + + def preprocess_image(self, batched_inputs): + """ + Normalize, pad and batch the input images. + """ + images = [x["image"].to(self.device) for x in batched_inputs] + images = [(x - self.pixel_mean) / self.pixel_std for x in images] + images = ImageList.from_tensors(images, self.backbone.size_divisibility) + return images + + @staticmethod + def _postprocess(instances, batched_inputs, image_sizes): + """ + Rescale the output instances to the target size. + """ + # note: private function; subject to changes + processed_results = [] + for results_per_image, input_per_image, image_size in zip( + instances, batched_inputs, image_sizes + ): + height = input_per_image.get("height", image_size[0]) + width = input_per_image.get("width", image_size[1]) + r = detector_postprocess(results_per_image, height, width) + processed_results.append({"instances": r}) + return processed_results + + +@META_ARCH_REGISTRY.register() +class ProposalNetwork(nn.Module): + """ + A meta architecture that only predicts object proposals. + """ + + def __init__(self, cfg): + super().__init__() + self.backbone = build_backbone(cfg) + self.proposal_generator = build_proposal_generator(cfg, self.backbone.output_shape()) + + self.register_buffer("pixel_mean", torch.Tensor(cfg.MODEL.PIXEL_MEAN).view(-1, 1, 1)) + self.register_buffer("pixel_std", torch.Tensor(cfg.MODEL.PIXEL_STD).view(-1, 1, 1)) + + @property + def device(self): + return self.pixel_mean.device + + def forward(self, batched_inputs): + """ + Args: + Same as in :class:`GeneralizedRCNN.forward` + + Returns: + list[dict]: + Each dict is the output for one input image. + The dict contains one key "proposals" whose value is a + :class:`Instances` with keys "proposal_boxes" and "objectness_logits". + """ + images = [x["image"].to(self.device) for x in batched_inputs] + images = [(x - self.pixel_mean) / self.pixel_std for x in images] + images = ImageList.from_tensors(images, self.backbone.size_divisibility) + features = self.backbone(images.tensor) + + if "instances" in batched_inputs[0]: + gt_instances = [x["instances"].to(self.device) for x in batched_inputs] + elif "targets" in batched_inputs[0]: + log_first_n( + logging.WARN, "'targets' in the model inputs is now renamed to 'instances'!", n=10 + ) + gt_instances = [x["targets"].to(self.device) for x in batched_inputs] + else: + gt_instances = None + proposals, proposal_losses = self.proposal_generator(images, features, gt_instances) + # In training, the proposals are not useful at all but we generate them anyway. + # This makes RPN-only models about 5% slower. + if self.training: + return proposal_losses + + processed_results = [] + for results_per_image, input_per_image, image_size in zip( + proposals, batched_inputs, images.image_sizes + ): + height = input_per_image.get("height", image_size[0]) + width = input_per_image.get("width", image_size[1]) + r = detector_postprocess(results_per_image, height, width) + processed_results.append({"proposals": r}) + return processed_results diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/retinanet.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/retinanet.py new file mode 100644 index 0000000..35c42cc --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/retinanet.py @@ -0,0 +1,489 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import math +import numpy as np +from typing import List +import torch +from fvcore.nn import sigmoid_focal_loss_jit, smooth_l1_loss +from torch import nn + +from detectron2.layers import ShapeSpec, batched_nms, cat +from detectron2.structures import Boxes, ImageList, Instances, pairwise_iou +from detectron2.utils.events import get_event_storage +from detectron2.utils.logger import log_first_n + +from ..anchor_generator import build_anchor_generator +from ..backbone import build_backbone +from ..box_regression import Box2BoxTransform +from ..matcher import Matcher +from ..postprocessing import detector_postprocess +from .build import META_ARCH_REGISTRY + +__all__ = ["RetinaNet"] + + +def permute_to_N_HWA_K(tensor, K): + """ + Transpose/reshape a tensor from (N, (A x K), H, W) to (N, (HxWxA), K) + """ + assert tensor.dim() == 4, tensor.shape + N, _, H, W = tensor.shape + tensor = tensor.view(N, -1, K, H, W) + tensor = tensor.permute(0, 3, 4, 1, 2) + tensor = tensor.reshape(N, -1, K) # Size=(N,HWA,K) + return tensor + + +def permute_all_cls_and_box_to_N_HWA_K_and_concat(box_cls, box_delta, num_classes=80): + """ + Rearrange the tensor layout from the network output, i.e.: + list[Tensor]: #lvl tensors of shape (N, A x K, Hi, Wi) + to per-image predictions, i.e.: + Tensor: of shape (N x sum(Hi x Wi x A), K) + """ + # for each feature level, permute the outputs to make them be in the + # same format as the labels. Note that the labels are computed for + # all feature levels concatenated, so we keep the same representation + # for the objectness and the box_delta + box_cls_flattened = [permute_to_N_HWA_K(x, num_classes) for x in box_cls] + box_delta_flattened = [permute_to_N_HWA_K(x, 4) for x in box_delta] + # concatenate on the first dimension (representing the feature levels), to + # take into account the way the labels were generated (with all feature maps + # being concatenated as well) + box_cls = cat(box_cls_flattened, dim=1).view(-1, num_classes) + box_delta = cat(box_delta_flattened, dim=1).view(-1, 4) + return box_cls, box_delta + + +@META_ARCH_REGISTRY.register() +class RetinaNet(nn.Module): + """ + Implement RetinaNet in :paper:`RetinaNet`. + """ + + def __init__(self, cfg): + super().__init__() + + # fmt: off + self.num_classes = cfg.MODEL.RETINANET.NUM_CLASSES + self.in_features = cfg.MODEL.RETINANET.IN_FEATURES + # Loss parameters: + self.focal_loss_alpha = cfg.MODEL.RETINANET.FOCAL_LOSS_ALPHA + self.focal_loss_gamma = cfg.MODEL.RETINANET.FOCAL_LOSS_GAMMA + self.smooth_l1_loss_beta = cfg.MODEL.RETINANET.SMOOTH_L1_LOSS_BETA + # Inference parameters: + self.score_threshold = cfg.MODEL.RETINANET.SCORE_THRESH_TEST + self.topk_candidates = cfg.MODEL.RETINANET.TOPK_CANDIDATES_TEST + self.nms_threshold = cfg.MODEL.RETINANET.NMS_THRESH_TEST + self.max_detections_per_image = cfg.TEST.DETECTIONS_PER_IMAGE + # Vis parameters + self.vis_period = cfg.VIS_PERIOD + self.input_format = cfg.INPUT.FORMAT + # fmt: on + + self.backbone = build_backbone(cfg) + + backbone_shape = self.backbone.output_shape() + feature_shapes = [backbone_shape[f] for f in self.in_features] + self.head = RetinaNetHead(cfg, feature_shapes) + self.anchor_generator = build_anchor_generator(cfg, feature_shapes) + + # Matching and loss + self.box2box_transform = Box2BoxTransform(weights=cfg.MODEL.RPN.BBOX_REG_WEIGHTS) + self.matcher = Matcher( + cfg.MODEL.RETINANET.IOU_THRESHOLDS, + cfg.MODEL.RETINANET.IOU_LABELS, + allow_low_quality_matches=True, + ) + + self.register_buffer("pixel_mean", torch.Tensor(cfg.MODEL.PIXEL_MEAN).view(-1, 1, 1)) + self.register_buffer("pixel_std", torch.Tensor(cfg.MODEL.PIXEL_STD).view(-1, 1, 1)) + + """ + In Detectron1, loss is normalized by number of foreground samples in the batch. + When batch size is 1 per GPU, #foreground has a large variance and + using it lead to lower performance. Here we maintain an EMA of #foreground to + stabilize the normalizer. + """ + self.loss_normalizer = 100 # initialize with any reasonable #fg that's not too small + self.loss_normalizer_momentum = 0.9 + + @property + def device(self): + return self.pixel_mean.device + + def visualize_training(self, batched_inputs, results): + """ + A function used to visualize ground truth images and final network predictions. + It shows ground truth bounding boxes on the original image and up to 20 + predicted object bounding boxes on the original image. + + Args: + batched_inputs (list): a list that contains input to the model. + results (List[Instances]): a list of #images elements. + """ + from detectron2.utils.visualizer import Visualizer + + assert len(batched_inputs) == len( + results + ), "Cannot visualize inputs and results of different sizes" + storage = get_event_storage() + max_boxes = 20 + + image_index = 0 # only visualize a single image + img = batched_inputs[image_index]["image"].cpu().numpy() + assert img.shape[0] == 3, "Images should have 3 channels." + if self.input_format == "BGR": + img = img[::-1, :, :] + img = img.transpose(1, 2, 0) + v_gt = Visualizer(img, None) + v_gt = v_gt.overlay_instances(boxes=batched_inputs[image_index]["instances"].gt_boxes) + anno_img = v_gt.get_image() + processed_results = detector_postprocess(results[image_index], img.shape[0], img.shape[1]) + predicted_boxes = processed_results.pred_boxes.tensor.detach().cpu().numpy() + + v_pred = Visualizer(img, None) + v_pred = v_pred.overlay_instances(boxes=predicted_boxes[0:max_boxes]) + prop_img = v_pred.get_image() + vis_img = np.vstack((anno_img, prop_img)) + vis_img = vis_img.transpose(2, 0, 1) + vis_name = f"Top: GT bounding boxes; Bottom: {max_boxes} Highest Scoring Results" + storage.put_image(vis_name, vis_img) + + def forward(self, batched_inputs): + """ + Args: + batched_inputs: a list, batched outputs of :class:`DatasetMapper` . + Each item in the list contains the inputs for one image. + For now, each item in the list is a dict that contains: + + * image: Tensor, image in (C, H, W) format. + * instances: Instances + + Other information that's included in the original dicts, such as: + + * "height", "width" (int): the output resolution of the model, used in inference. + See :meth:`postprocess` for details. + Returns: + dict[str: Tensor]: + mapping from a named loss to a tensor storing the loss. Used during training only. + """ + images = self.preprocess_image(batched_inputs) + if "instances" in batched_inputs[0]: + gt_instances = [x["instances"].to(self.device) for x in batched_inputs] + elif "targets" in batched_inputs[0]: + log_first_n( + logging.WARN, "'targets' in the model inputs is now renamed to 'instances'!", n=10 + ) + gt_instances = [x["targets"].to(self.device) for x in batched_inputs] + else: + gt_instances = None + + features = self.backbone(images.tensor) + features = [features[f] for f in self.in_features] + box_cls, box_delta = self.head(features) + anchors = self.anchor_generator(features) + + if self.training: + gt_classes, gt_anchors_reg_deltas = self.get_ground_truth(anchors, gt_instances) + losses = self.losses(gt_classes, gt_anchors_reg_deltas, box_cls, box_delta) + + if self.vis_period > 0: + storage = get_event_storage() + if storage.iter % self.vis_period == 0: + results = self.inference(box_cls, box_delta, anchors, images.image_sizes) + self.visualize_training(batched_inputs, results) + + return losses + else: + results = self.inference(box_cls, box_delta, anchors, images.image_sizes) + processed_results = [] + for results_per_image, input_per_image, image_size in zip( + results, batched_inputs, images.image_sizes + ): + height = input_per_image.get("height", image_size[0]) + width = input_per_image.get("width", image_size[1]) + r = detector_postprocess(results_per_image, height, width) + processed_results.append({"instances": r}) + return processed_results + + def losses(self, gt_classes, gt_anchors_deltas, pred_class_logits, pred_anchor_deltas): + """ + Args: + For `gt_classes` and `gt_anchors_deltas` parameters, see + :meth:`RetinaNet.get_ground_truth`. + Their shapes are (N, R) and (N, R, 4), respectively, where R is + the total number of anchors across levels, i.e. sum(Hi x Wi x A) + For `pred_class_logits` and `pred_anchor_deltas`, see + :meth:`RetinaNetHead.forward`. + + Returns: + dict[str, Tensor]: + mapping from a named loss to a scalar tensor + storing the loss. Used during training only. The dict keys are: + "loss_cls" and "loss_box_reg" + """ + pred_class_logits, pred_anchor_deltas = permute_all_cls_and_box_to_N_HWA_K_and_concat( + pred_class_logits, pred_anchor_deltas, self.num_classes + ) # Shapes: (N x R, K) and (N x R, 4), respectively. + + gt_classes = gt_classes.flatten() + gt_anchors_deltas = gt_anchors_deltas.view(-1, 4) + + valid_idxs = gt_classes >= 0 + foreground_idxs = (gt_classes >= 0) & (gt_classes != self.num_classes) + num_foreground = foreground_idxs.sum().item() + get_event_storage().put_scalar("num_foreground", num_foreground) + self.loss_normalizer = ( + self.loss_normalizer_momentum * self.loss_normalizer + + (1 - self.loss_normalizer_momentum) * num_foreground + ) + + gt_classes_target = torch.zeros_like(pred_class_logits) + gt_classes_target[foreground_idxs, gt_classes[foreground_idxs]] = 1 + + # logits loss + loss_cls = sigmoid_focal_loss_jit( + pred_class_logits[valid_idxs], + gt_classes_target[valid_idxs], + alpha=self.focal_loss_alpha, + gamma=self.focal_loss_gamma, + reduction="sum", + ) / max(1, self.loss_normalizer) + + # regression loss + loss_box_reg = smooth_l1_loss( + pred_anchor_deltas[foreground_idxs], + gt_anchors_deltas[foreground_idxs], + beta=self.smooth_l1_loss_beta, + reduction="sum", + ) / max(1, self.loss_normalizer) + + return {"loss_cls": loss_cls, "loss_box_reg": loss_box_reg} + + @torch.no_grad() + def get_ground_truth(self, anchors, targets): + """ + Args: + anchors (list[Boxes]): A list of #feature level Boxes. + The Boxes contains anchors of this image on the specific feature level. + targets (list[Instances]): a list of N `Instances`s. The i-th + `Instances` contains the ground-truth per-instance annotations + for the i-th input image. Specify `targets` during training only. + + Returns: + gt_classes (Tensor): + An integer tensor of shape (N, R) storing ground-truth labels for each anchor. + R is the total number of anchors, i.e. the sum of Hi x Wi x A for all levels. + Anchors with an IoU with some target higher than the foreground threshold + are assigned their corresponding label in the [0, K-1] range. + Anchors whose IoU are below the background threshold are assigned + the label "K". Anchors whose IoU are between the foreground and background + thresholds are assigned a label "-1", i.e. ignore. + gt_anchors_deltas (Tensor): + Shape (N, R, 4). + The last dimension represents ground-truth box2box transform + targets (dx, dy, dw, dh) that map each anchor to its matched ground-truth box. + The values in the tensor are meaningful only when the corresponding + anchor is labeled as foreground. + """ + gt_classes = [] + gt_anchors_deltas = [] + anchors = Boxes.cat(anchors) # Rx4 + + for targets_per_image in targets: + match_quality_matrix = pairwise_iou(targets_per_image.gt_boxes, anchors) + gt_matched_idxs, anchor_labels = self.matcher(match_quality_matrix) + + has_gt = len(targets_per_image) > 0 + if has_gt: + # ground truth box regression + matched_gt_boxes = targets_per_image.gt_boxes[gt_matched_idxs] + gt_anchors_reg_deltas_i = self.box2box_transform.get_deltas( + anchors.tensor, matched_gt_boxes.tensor + ) + + gt_classes_i = targets_per_image.gt_classes[gt_matched_idxs] + # Anchors with label 0 are treated as background. + gt_classes_i[anchor_labels == 0] = self.num_classes + # Anchors with label -1 are ignored. + gt_classes_i[anchor_labels == -1] = -1 + else: + gt_classes_i = torch.zeros_like(gt_matched_idxs) + self.num_classes + gt_anchors_reg_deltas_i = torch.zeros_like(anchors.tensor) + + gt_classes.append(gt_classes_i) + gt_anchors_deltas.append(gt_anchors_reg_deltas_i) + + return torch.stack(gt_classes), torch.stack(gt_anchors_deltas) + + def inference(self, box_cls, box_delta, anchors, image_sizes): + """ + Arguments: + box_cls, box_delta: Same as the output of :meth:`RetinaNetHead.forward` + anchors (list[Boxes]): A list of #feature level Boxes. + The Boxes contain anchors of this image on the specific feature level. + image_sizes (List[torch.Size]): the input image sizes + + Returns: + results (List[Instances]): a list of #images elements. + """ + results = [] + + box_cls = [permute_to_N_HWA_K(x, self.num_classes) for x in box_cls] + box_delta = [permute_to_N_HWA_K(x, 4) for x in box_delta] + # list[Tensor], one per level, each has shape (N, Hi x Wi x A, K or 4) + + for img_idx, image_size in enumerate(image_sizes): + box_cls_per_image = [box_cls_per_level[img_idx] for box_cls_per_level in box_cls] + box_reg_per_image = [box_reg_per_level[img_idx] for box_reg_per_level in box_delta] + results_per_image = self.inference_single_image( + box_cls_per_image, box_reg_per_image, anchors, tuple(image_size) + ) + results.append(results_per_image) + return results + + def inference_single_image(self, box_cls, box_delta, anchors, image_size): + """ + Single-image inference. Return bounding-box detection results by thresholding + on scores and applying non-maximum suppression (NMS). + + Arguments: + box_cls (list[Tensor]): list of #feature levels. Each entry contains + tensor of size (H x W x A, K) + box_delta (list[Tensor]): Same shape as 'box_cls' except that K becomes 4. + anchors (list[Boxes]): list of #feature levels. Each entry contains + a Boxes object, which contains all the anchors for that + image in that feature level. + image_size (tuple(H, W)): a tuple of the image height and width. + + Returns: + Same as `inference`, but for only one image. + """ + boxes_all = [] + scores_all = [] + class_idxs_all = [] + + # Iterate over every feature level + for box_cls_i, box_reg_i, anchors_i in zip(box_cls, box_delta, anchors): + # (HxWxAxK,) + box_cls_i = box_cls_i.flatten().sigmoid_() + + # Keep top k top scoring indices only. + num_topk = min(self.topk_candidates, box_reg_i.size(0)) + # torch.sort is actually faster than .topk (at least on GPUs) + predicted_prob, topk_idxs = box_cls_i.sort(descending=True) + predicted_prob = predicted_prob[:num_topk] + topk_idxs = topk_idxs[:num_topk] + + # filter out the proposals with low confidence score + keep_idxs = predicted_prob > self.score_threshold + predicted_prob = predicted_prob[keep_idxs] + topk_idxs = topk_idxs[keep_idxs] + + anchor_idxs = topk_idxs // self.num_classes + classes_idxs = topk_idxs % self.num_classes + + box_reg_i = box_reg_i[anchor_idxs] + anchors_i = anchors_i[anchor_idxs] + # predict boxes + predicted_boxes = self.box2box_transform.apply_deltas(box_reg_i, anchors_i.tensor) + + boxes_all.append(predicted_boxes) + scores_all.append(predicted_prob) + class_idxs_all.append(classes_idxs) + + boxes_all, scores_all, class_idxs_all = [ + cat(x) for x in [boxes_all, scores_all, class_idxs_all] + ] + keep = batched_nms(boxes_all, scores_all, class_idxs_all, self.nms_threshold) + keep = keep[: self.max_detections_per_image] + + result = Instances(image_size) + result.pred_boxes = Boxes(boxes_all[keep]) + result.scores = scores_all[keep] + result.pred_classes = class_idxs_all[keep] + return result + + def preprocess_image(self, batched_inputs): + """ + Normalize, pad and batch the input images. + """ + images = [x["image"].to(self.device) for x in batched_inputs] + images = [(x - self.pixel_mean) / self.pixel_std for x in images] + images = ImageList.from_tensors(images, self.backbone.size_divisibility) + return images + + +class RetinaNetHead(nn.Module): + """ + The head used in RetinaNet for object classification and box regression. + It has two subnets for the two tasks, with a common structure but separate parameters. + """ + + def __init__(self, cfg, input_shape: List[ShapeSpec]): + super().__init__() + # fmt: off + in_channels = input_shape[0].channels + num_classes = cfg.MODEL.RETINANET.NUM_CLASSES + num_convs = cfg.MODEL.RETINANET.NUM_CONVS + prior_prob = cfg.MODEL.RETINANET.PRIOR_PROB + num_anchors = build_anchor_generator(cfg, input_shape).num_cell_anchors + # fmt: on + assert ( + len(set(num_anchors)) == 1 + ), "Using different number of anchors between levels is not currently supported!" + num_anchors = num_anchors[0] + + cls_subnet = [] + bbox_subnet = [] + for _ in range(num_convs): + cls_subnet.append( + nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1) + ) + cls_subnet.append(nn.ReLU()) + bbox_subnet.append( + nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1) + ) + bbox_subnet.append(nn.ReLU()) + + self.cls_subnet = nn.Sequential(*cls_subnet) + self.bbox_subnet = nn.Sequential(*bbox_subnet) + self.cls_score = nn.Conv2d( + in_channels, num_anchors * num_classes, kernel_size=3, stride=1, padding=1 + ) + self.bbox_pred = nn.Conv2d(in_channels, num_anchors * 4, kernel_size=3, stride=1, padding=1) + + # Initialization + for modules in [self.cls_subnet, self.bbox_subnet, self.cls_score, self.bbox_pred]: + for layer in modules.modules(): + if isinstance(layer, nn.Conv2d): + torch.nn.init.normal_(layer.weight, mean=0, std=0.01) + torch.nn.init.constant_(layer.bias, 0) + + # Use prior in model initialization to improve stability + bias_value = -(math.log((1 - prior_prob) / prior_prob)) + torch.nn.init.constant_(self.cls_score.bias, bias_value) + + def forward(self, features): + """ + Arguments: + features (list[Tensor]): FPN feature map tensors in high to low resolution. + Each tensor in the list correspond to different feature levels. + + Returns: + logits (list[Tensor]): #lvl tensors, each has shape (N, AxK, Hi, Wi). + The tensor predicts the classification probability + at each spatial position for each of the A anchors and K object + classes. + bbox_reg (list[Tensor]): #lvl tensors, each has shape (N, Ax4, Hi, Wi). + The tensor predicts 4-vector (dx,dy,dw,dh) box + regression values for every anchor. These values are the + relative offset between the anchor and the ground truth box. + """ + logits = [] + bbox_reg = [] + for feature in features: + logits.append(self.cls_score(self.cls_subnet(feature))) + bbox_reg.append(self.bbox_pred(self.bbox_subnet(feature))) + return logits, bbox_reg diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/semantic_seg.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/semantic_seg.py new file mode 100644 index 0000000..2c41a72 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/meta_arch/semantic_seg.py @@ -0,0 +1,186 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +from typing import Dict +import fvcore.nn.weight_init as weight_init +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.layers import Conv2d, ShapeSpec +from detectron2.structures import ImageList +from detectron2.utils.registry import Registry + +from ..backbone import build_backbone +from ..postprocessing import sem_seg_postprocess +from .build import META_ARCH_REGISTRY + +__all__ = ["SemanticSegmentor", "SEM_SEG_HEADS_REGISTRY", "SemSegFPNHead", "build_sem_seg_head"] + + +SEM_SEG_HEADS_REGISTRY = Registry("SEM_SEG_HEADS") +SEM_SEG_HEADS_REGISTRY.__doc__ = """ +Registry for semantic segmentation heads, which make semantic segmentation predictions +from feature maps. +""" + + +@META_ARCH_REGISTRY.register() +class SemanticSegmentor(nn.Module): + """ + Main class for semantic segmentation architectures. + """ + + def __init__(self, cfg): + super().__init__() + self.backbone = build_backbone(cfg) + self.sem_seg_head = build_sem_seg_head(cfg, self.backbone.output_shape()) + self.register_buffer("pixel_mean", torch.Tensor(cfg.MODEL.PIXEL_MEAN).view(-1, 1, 1)) + self.register_buffer("pixel_std", torch.Tensor(cfg.MODEL.PIXEL_STD).view(-1, 1, 1)) + + @property + def device(self): + return self.pixel_mean.device + + def forward(self, batched_inputs): + """ + Args: + batched_inputs: a list, batched outputs of :class:`DatasetMapper`. + Each item in the list contains the inputs for one image. + + For now, each item in the list is a dict that contains: + + * "image": Tensor, image in (C, H, W) format. + * "sem_seg": semantic segmentation ground truth + * Other information that's included in the original dicts, such as: + "height", "width" (int): the output resolution of the model, used in inference. + See :meth:`postprocess` for details. + + Returns: + list[dict]: + Each dict is the output for one input image. + The dict contains one key "sem_seg" whose value is a + Tensor that represents the + per-pixel segmentation prediced by the head. + The prediction has shape KxHxW that represents the logits of + each class for each pixel. + """ + images = [x["image"].to(self.device) for x in batched_inputs] + images = [(x - self.pixel_mean) / self.pixel_std for x in images] + images = ImageList.from_tensors(images, self.backbone.size_divisibility) + + features = self.backbone(images.tensor) + + if "sem_seg" in batched_inputs[0]: + targets = [x["sem_seg"].to(self.device) for x in batched_inputs] + targets = ImageList.from_tensors( + targets, self.backbone.size_divisibility, self.sem_seg_head.ignore_value + ).tensor + else: + targets = None + results, losses = self.sem_seg_head(features, targets) + + if self.training: + return losses + + processed_results = [] + for result, input_per_image, image_size in zip(results, batched_inputs, images.image_sizes): + height = input_per_image.get("height") + width = input_per_image.get("width") + r = sem_seg_postprocess(result, image_size, height, width) + processed_results.append({"sem_seg": r}) + return processed_results + + +def build_sem_seg_head(cfg, input_shape): + """ + Build a semantic segmentation head from `cfg.MODEL.SEM_SEG_HEAD.NAME`. + """ + name = cfg.MODEL.SEM_SEG_HEAD.NAME + return SEM_SEG_HEADS_REGISTRY.get(name)(cfg, input_shape) + + +@SEM_SEG_HEADS_REGISTRY.register() +class SemSegFPNHead(nn.Module): + """ + A semantic segmentation head described in :paper:`PanopticFPN`. + It takes FPN features as input and merges information from all + levels of the FPN into single output. + """ + + def __init__(self, cfg, input_shape: Dict[str, ShapeSpec]): + super().__init__() + + # fmt: off + self.in_features = cfg.MODEL.SEM_SEG_HEAD.IN_FEATURES + feature_strides = {k: v.stride for k, v in input_shape.items()} + feature_channels = {k: v.channels for k, v in input_shape.items()} + self.ignore_value = cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE + num_classes = cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES + conv_dims = cfg.MODEL.SEM_SEG_HEAD.CONVS_DIM + self.common_stride = cfg.MODEL.SEM_SEG_HEAD.COMMON_STRIDE + norm = cfg.MODEL.SEM_SEG_HEAD.NORM + self.loss_weight = cfg.MODEL.SEM_SEG_HEAD.LOSS_WEIGHT + # fmt: on + + self.scale_heads = [] + for in_feature in self.in_features: + head_ops = [] + head_length = max( + 1, int(np.log2(feature_strides[in_feature]) - np.log2(self.common_stride)) + ) + for k in range(head_length): + norm_module = nn.GroupNorm(32, conv_dims) if norm == "GN" else None + conv = Conv2d( + feature_channels[in_feature] if k == 0 else conv_dims, + conv_dims, + kernel_size=3, + stride=1, + padding=1, + bias=not norm, + norm=norm_module, + activation=F.relu, + ) + weight_init.c2_msra_fill(conv) + head_ops.append(conv) + if feature_strides[in_feature] != self.common_stride: + head_ops.append( + nn.Upsample(scale_factor=2, mode="bilinear", align_corners=False) + ) + self.scale_heads.append(nn.Sequential(*head_ops)) + self.add_module(in_feature, self.scale_heads[-1]) + self.predictor = Conv2d(conv_dims, num_classes, kernel_size=1, stride=1, padding=0) + weight_init.c2_msra_fill(self.predictor) + + def forward(self, features, targets=None): + """ + Returns: + In training, returns (None, dict of losses) + In inference, returns (CxHxW logits, {}) + """ + x = self.layers(features) + if self.training: + return None, self.losses(x, targets) + else: + x = F.interpolate( + x, scale_factor=self.common_stride, mode="bilinear", align_corners=False + ) + return x, {} + + def layers(self, features): + for i, f in enumerate(self.in_features): + if i == 0: + x = self.scale_heads[i](features[f]) + else: + x = x + self.scale_heads[i](features[f]) + x = self.predictor(x) + return x + + def losses(self, predictions, targets): + predictions = F.interpolate( + predictions, scale_factor=self.common_stride, mode="bilinear", align_corners=False + ) + loss = F.cross_entropy( + predictions, targets, reduction="mean", ignore_index=self.ignore_value + ) + losses = {"loss_sem_seg": loss * self.loss_weight} + return losses diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/poolers.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/poolers.py new file mode 100644 index 0000000..678f5af --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/poolers.py @@ -0,0 +1,231 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +import math +import sys +import torch +from torch import nn +from torchvision.ops import RoIPool + +from detectron2.layers import ROIAlign, ROIAlignRotated, cat + +__all__ = ["ROIPooler"] + + +def assign_boxes_to_levels(box_lists, min_level, max_level, canonical_box_size, canonical_level): + """ + Map each box in `box_lists` to a feature map level index and return the assignment + vector. + + Args: + box_lists (list[Boxes] | list[RotatedBoxes]): A list of N Boxes or N RotatedBoxes, + where N is the number of images in the batch. + min_level (int): Smallest feature map level index. The input is considered index 0, + the output of stage 1 is index 1, and so. + max_level (int): Largest feature map level index. + canonical_box_size (int): A canonical box size in pixels (sqrt(box area)). + canonical_level (int): The feature map level index on which a canonically-sized box + should be placed. + + Returns: + A tensor of length M, where M is the total number of boxes aggregated over all + N batch images. The memory layout corresponds to the concatenation of boxes + from all images. Each element is the feature map index, as an offset from + `self.min_level`, for the corresponding box (so value i means the box is at + `self.min_level + i`). + """ + eps = sys.float_info.epsilon + box_sizes = torch.sqrt(cat([boxes.area() for boxes in box_lists])) + # Eqn.(1) in FPN paper + level_assignments = torch.floor( + canonical_level + torch.log2(box_sizes / canonical_box_size + eps) + ) + # clamp level to (min, max), in case the box size is too large or too small + # for the available feature maps + level_assignments = torch.clamp(level_assignments, min=min_level, max=max_level) + return level_assignments.to(torch.int64) - min_level + + +def convert_boxes_to_pooler_format(box_lists): + """ + Convert all boxes in `box_lists` to the low-level format used by ROI pooling ops + (see description under Returns). + + Args: + box_lists (list[Boxes] | list[RotatedBoxes]): + A list of N Boxes or N RotatedBoxes, where N is the number of images in the batch. + + Returns: + When input is list[Boxes]: + A tensor of shape (M, 5), where M is the total number of boxes aggregated over all + N batch images. + The 5 columns are (batch index, x0, y0, x1, y1), where batch index + is the index in [0, N) identifying which batch image the box with corners at + (x0, y0, x1, y1) comes from. + When input is list[RotatedBoxes]: + A tensor of shape (M, 6), where M is the total number of boxes aggregated over all + N batch images. + The 6 columns are (batch index, x_ctr, y_ctr, width, height, angle_degrees), + where batch index is the index in [0, N) identifying which batch image the + rotated box (x_ctr, y_ctr, width, height, angle_degrees) comes from. + """ + + def fmt_box_list(box_tensor, batch_index): + repeated_index = torch.full( + (len(box_tensor), 1), batch_index, dtype=box_tensor.dtype, device=box_tensor.device + ) + return cat((repeated_index, box_tensor), dim=1) + + pooler_fmt_boxes = cat( + [fmt_box_list(box_list.tensor, i) for i, box_list in enumerate(box_lists)], dim=0 + ) + + return pooler_fmt_boxes + + +class ROIPooler(nn.Module): + """ + Region of interest feature map pooler that supports pooling from one or more + feature maps. + """ + + def __init__( + self, + output_size, + scales, + sampling_ratio, + pooler_type, + canonical_box_size=224, + canonical_level=4, + ): + """ + Args: + output_size (int, tuple[int] or list[int]): output size of the pooled region, + e.g., 14 x 14. If tuple or list is given, the length must be 2. + scales (list[float]): The scale for each low-level pooling op relative to + the input image. For a feature map with stride s relative to the input + image, scale is defined as a 1 / s. The stride must be power of 2. + When there are multiple scales, they must form a pyramid, i.e. they must be + a monotically decreasing geometric sequence with a factor of 1/2. + sampling_ratio (int): The `sampling_ratio` parameter for the ROIAlign op. + pooler_type (string): Name of the type of pooling operation that should be applied. + For instance, "ROIPool" or "ROIAlignV2". + canonical_box_size (int): A canonical box size in pixels (sqrt(box area)). The default + is heuristically defined as 224 pixels in the FPN paper (based on ImageNet + pre-training). + canonical_level (int): The feature map level index from which a canonically-sized box + should be placed. The default is defined as level 4 (stride=16) in the FPN paper, + i.e., a box of size 224x224 will be placed on the feature with stride=16. + The box placement for all boxes will be determined from their sizes w.r.t + canonical_box_size. For example, a box whose area is 4x that of a canonical box + should be used to pool features from feature level ``canonical_level+1``. + + Note that the actual input feature maps given to this module may not have + sufficiently many levels for the input boxes. If the boxes are too large or too + small for the input feature maps, the closest level will be used. + """ + super().__init__() + + if isinstance(output_size, int): + output_size = (output_size, output_size) + assert len(output_size) == 2 + assert isinstance(output_size[0], int) and isinstance(output_size[1], int) + self.output_size = output_size + + if pooler_type == "ROIAlign": + self.level_poolers = nn.ModuleList( + ROIAlign( + output_size, spatial_scale=scale, sampling_ratio=sampling_ratio, aligned=False + ) + for scale in scales + ) + elif pooler_type == "ROIAlignV2": + self.level_poolers = nn.ModuleList( + ROIAlign( + output_size, spatial_scale=scale, sampling_ratio=sampling_ratio, aligned=True + ) + for scale in scales + ) + elif pooler_type == "ROIPool": + self.level_poolers = nn.ModuleList( + RoIPool(output_size, spatial_scale=scale) for scale in scales + ) + elif pooler_type == "ROIAlignRotated": + self.level_poolers = nn.ModuleList( + ROIAlignRotated(output_size, spatial_scale=scale, sampling_ratio=sampling_ratio) + for scale in scales + ) + else: + raise ValueError("Unknown pooler type: {}".format(pooler_type)) + + # Map scale (defined as 1 / stride) to its feature map level under the + # assumption that stride is a power of 2. + min_level = -(math.log2(scales[0])) + max_level = -(math.log2(scales[-1])) + assert math.isclose(min_level, int(min_level)) and math.isclose( + max_level, int(max_level) + ), "Featuremap stride is not power of 2!" + self.min_level = int(min_level) + self.max_level = int(max_level) + assert ( + len(scales) == self.max_level - self.min_level + 1 + ), "[ROIPooler] Sizes of input featuremaps do not form a pyramid!" + assert 0 < self.min_level and self.min_level <= self.max_level + self.canonical_level = canonical_level + assert canonical_box_size > 0 + self.canonical_box_size = canonical_box_size + + def forward(self, x, box_lists): + """ + Args: + x (list[Tensor]): A list of feature maps of NCHW shape, with scales matching those + used to construct this module. + box_lists (list[Boxes] | list[RotatedBoxes]): + A list of N Boxes or N RotatedBoxes, where N is the number of images in the batch. + The box coordinates are defined on the original image and + will be scaled by the `scales` argument of :class:`ROIPooler`. + + Returns: + Tensor: + A tensor of shape (M, C, output_size, output_size) where M is the total number of + boxes aggregated over all N batch images and C is the number of channels in `x`. + """ + num_level_assignments = len(self.level_poolers) + + assert isinstance(x, list) and isinstance( + box_lists, list + ), "Arguments to pooler must be lists" + assert ( + len(x) == num_level_assignments + ), "unequal value, num_level_assignments={}, but x is list of {} Tensors".format( + num_level_assignments, len(x) + ) + + assert len(box_lists) == x[0].size( + 0 + ), "unequal value, x[0] batch dim 0 is {}, but box_list has length {}".format( + x[0].size(0), len(box_lists) + ) + + pooler_fmt_boxes = convert_boxes_to_pooler_format(box_lists) + + if num_level_assignments == 1: + return self.level_poolers[0](x[0], pooler_fmt_boxes) + + level_assignments = assign_boxes_to_levels( + box_lists, self.min_level, self.max_level, self.canonical_box_size, self.canonical_level + ) + + num_boxes = len(pooler_fmt_boxes) + num_channels = x[0].shape[1] + output_size = self.output_size[0] + + dtype, device = x[0].dtype, x[0].device + output = torch.zeros( + (num_boxes, num_channels, output_size, output_size), dtype=dtype, device=device + ) + + for level, (x_level, pooler) in enumerate(zip(x, self.level_poolers)): + inds = torch.nonzero(level_assignments == level, as_tuple=True)[0] + pooler_fmt_boxes_level = pooler_fmt_boxes[inds] + output[inds] = pooler(x_level, pooler_fmt_boxes_level) + + return output diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/postprocessing.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/postprocessing.py new file mode 100644 index 0000000..e85541f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/postprocessing.py @@ -0,0 +1,79 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from torch.nn import functional as F + +from detectron2.layers import paste_masks_in_image +from detectron2.structures import Instances +from detectron2.utils.memory import retry_if_cuda_oom + + +def detector_postprocess(results, output_height, output_width, mask_threshold=0.5): + """ + Resize the output instances. + The input images are often resized when entering an object detector. + As a result, we often need the outputs of the detector in a different + resolution from its inputs. + + This function will resize the raw outputs of an R-CNN detector + to produce outputs according to the desired output resolution. + + Args: + results (Instances): the raw outputs from the detector. + `results.image_size` contains the input image resolution the detector sees. + This object might be modified in-place. + output_height, output_width: the desired output resolution. + + Returns: + Instances: the resized output from the model, based on the output resolution + """ + scale_x, scale_y = (output_width / results.image_size[1], output_height / results.image_size[0]) + results = Instances((output_height, output_width), **results.get_fields()) + + if results.has("pred_boxes"): + output_boxes = results.pred_boxes + elif results.has("proposal_boxes"): + output_boxes = results.proposal_boxes + + output_boxes.scale(scale_x, scale_y) + output_boxes.clip(results.image_size) + + results = results[output_boxes.nonempty()] + + if results.has("pred_masks"): + results.pred_masks = retry_if_cuda_oom(paste_masks_in_image)( + results.pred_masks[:, 0, :, :], # N, 1, M, M + results.pred_boxes, + results.image_size, + threshold=mask_threshold, + ) + + if results.has("pred_keypoints"): + results.pred_keypoints[:, :, 0] *= scale_x + results.pred_keypoints[:, :, 1] *= scale_y + + return results + + +def sem_seg_postprocess(result, img_size, output_height, output_width): + """ + Return semantic segmentation predictions in the original resolution. + + The input images are often resized when entering semantic segmentor. Moreover, in same + cases, they also padded inside segmentor to be divisible by maximum network stride. + As a result, we often need the predictions of the segmentor in a different + resolution from its inputs. + + Args: + result (Tensor): semantic segmentation prediction logits. A tensor of shape (C, H, W), + where C is the number of classes, and H, W are the height and width of the prediction. + img_size (tuple): image size that segmentor is taking as input. + output_height, output_width: the desired output resolution. + + Returns: + semantic segmentation prediction (Tensor): A tensor of the shape + (C, output_height, output_width) that contains per-pixel soft predictions. + """ + result = result[:, : img_size[0], : img_size[1]].expand(1, -1, -1, -1) + result = F.interpolate( + result, size=(output_height, output_width), mode="bilinear", align_corners=False + )[0] + return result diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/__init__.py new file mode 100644 index 0000000..64fb6d4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .build import PROPOSAL_GENERATOR_REGISTRY, build_proposal_generator +from .rpn import RPN_HEAD_REGISTRY, build_rpn_head, RPN diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/build.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/build.py new file mode 100644 index 0000000..7f252bc --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/build.py @@ -0,0 +1,24 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from detectron2.utils.registry import Registry + +PROPOSAL_GENERATOR_REGISTRY = Registry("PROPOSAL_GENERATOR") +PROPOSAL_GENERATOR_REGISTRY.__doc__ = """ +Registry for proposal generator, which produces object proposals from feature maps. + +The registered object will be called with `obj(cfg, input_shape)`. +The call should return a `nn.Module` object. +""" + +from . import rpn, rrpn # noqa F401 isort:skip + + +def build_proposal_generator(cfg, input_shape): + """ + Build a proposal generator from `cfg.MODEL.PROPOSAL_GENERATOR.NAME`. + The name can be "PrecomputedProposals" to use no proposal generator. + """ + name = cfg.MODEL.PROPOSAL_GENERATOR.NAME + if name == "PrecomputedProposals": + return None + + return PROPOSAL_GENERATOR_REGISTRY.get(name)(cfg, input_shape) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/proposal_utils.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/proposal_utils.py new file mode 100644 index 0000000..d4af905 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/proposal_utils.py @@ -0,0 +1,57 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +import torch + +from detectron2.structures import Instances + + +def add_ground_truth_to_proposals(gt_boxes, proposals): + """ + Call `add_ground_truth_to_proposals_single_image` for all images. + + Args: + gt_boxes(list[Boxes]): list of N elements. Element i is a Boxes + representing the gound-truth for image i. + proposals (list[Instances]): list of N elements. Element i is a Instances + representing the proposals for image i. + + Returns: + list[Instances]: list of N Instances. Each is the proposals for the image, + with field "proposal_boxes" and "objectness_logits". + """ + assert gt_boxes is not None + + assert len(proposals) == len(gt_boxes) + if len(proposals) == 0: + return proposals + + return [ + add_ground_truth_to_proposals_single_image(gt_boxes_i, proposals_i) + for gt_boxes_i, proposals_i in zip(gt_boxes, proposals) + ] + + +def add_ground_truth_to_proposals_single_image(gt_boxes, proposals): + """ + Augment `proposals` with ground-truth boxes from `gt_boxes`. + + Args: + Same as `add_ground_truth_to_proposals`, but with gt_boxes and proposals + per image. + + Returns: + Same as `add_ground_truth_to_proposals`, but for only one image. + """ + device = proposals.objectness_logits.device + # Concatenating gt_boxes with proposals requires them to have the same fields + # Assign all ground-truth boxes an objectness logit corresponding to P(object) \approx 1. + gt_logit_value = math.log((1.0 - 1e-10) / (1 - (1.0 - 1e-10))) + + gt_logits = gt_logit_value * torch.ones(len(gt_boxes), device=device) + gt_proposal = Instances(proposals.image_size) + + gt_proposal.proposal_boxes = gt_boxes + gt_proposal.objectness_logits = gt_logits + new_proposals = Instances.cat([proposals, gt_proposal]) + + return new_proposals diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn.py new file mode 100644 index 0000000..8eb93b8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn.py @@ -0,0 +1,285 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from typing import Dict, List +import torch +import torch.nn.functional as F +from torch import nn + +from detectron2.config import configurable +from detectron2.layers import ShapeSpec +from detectron2.structures import Boxes, Instances, pairwise_iou +from detectron2.utils.memory import retry_if_cuda_oom +from detectron2.utils.registry import Registry + +from ..anchor_generator import build_anchor_generator +from ..box_regression import Box2BoxTransform +from ..matcher import Matcher +from ..sampling import subsample_labels +from .build import PROPOSAL_GENERATOR_REGISTRY +from .rpn_outputs import RPNOutputs, find_top_rpn_proposals + +RPN_HEAD_REGISTRY = Registry("RPN_HEAD") +RPN_HEAD_REGISTRY.__doc__ = """ +Registry for RPN heads, which take feature maps and perform +objectness classification and bounding box regression for anchors. + +The registered object will be called with `obj(cfg, input_shape)`. +The call should return a `nn.Module` object. +""" + + +def build_rpn_head(cfg, input_shape): + """ + Build an RPN head defined by `cfg.MODEL.RPN.HEAD_NAME`. + """ + name = cfg.MODEL.RPN.HEAD_NAME + return RPN_HEAD_REGISTRY.get(name)(cfg, input_shape) + + +@RPN_HEAD_REGISTRY.register() +class StandardRPNHead(nn.Module): + """ + Standard RPN classification and regression heads described in :paper:`Faster R-CNN`. + Uses a 3x3 conv to produce a shared hidden state from which one 1x1 conv predicts + objectness logits for each anchor and a second 1x1 conv predicts bounding-box deltas + specifying how to deform each anchor into an object proposal. + """ + + @configurable + def __init__(self, *, in_channels: int, num_anchors: int, box_dim: int = 4): + """ + NOTE: this interface is experimental. + + Args: + in_channels (int): number of input feature channels. When using multiple + input features, they must have the same number of channels. + num_anchors (int): number of anchors to predict for *each spatial position* + on the feature map. The total number of anchors for each + feature map will be `num_anchors * H * W`. + box_dim (int): dimension of a box, which is also the number of box regression + predictions to make for each anchor. An axis aligned box has + box_dim=4, while a rotated box has box_dim=5. + """ + super().__init__() + # 3x3 conv for the hidden representation + self.conv = nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=1, padding=1) + # 1x1 conv for predicting objectness logits + self.objectness_logits = nn.Conv2d(in_channels, num_anchors, kernel_size=1, stride=1) + # 1x1 conv for predicting box2box transform deltas + self.anchor_deltas = nn.Conv2d(in_channels, num_anchors * box_dim, kernel_size=1, stride=1) + + for l in [self.conv, self.objectness_logits, self.anchor_deltas]: + nn.init.normal_(l.weight, std=0.01) + nn.init.constant_(l.bias, 0) + + @classmethod + def from_config(cls, cfg, input_shape): + # Standard RPN is shared across levels: + in_channels = [s.channels for s in input_shape] + assert len(set(in_channels)) == 1, "Each level must have the same channel!" + in_channels = in_channels[0] + + # RPNHead should take the same input as anchor generator + # NOTE: it assumes that creating an anchor generator does not have unwanted side effect. + anchor_generator = build_anchor_generator(cfg, input_shape) + num_anchors = anchor_generator.num_anchors + box_dim = anchor_generator.box_dim + assert ( + len(set(num_anchors)) == 1 + ), "Each level must have the same number of anchors per spatial position" + return {"in_channels": in_channels, "num_anchors": num_anchors[0], "box_dim": box_dim} + + def forward(self, features): + """ + Args: + features (list[Tensor]): list of feature maps + + Returns: + list[Tensor]: A list of L elements. + Element i is a tensor of shape (N, A, Hi, Wi) representing + the predicted objectness logits for all anchors. A is the number of cell anchors. + list[Tensor]: A list of L elements. Element i is a tensor of shape + (N, A*box_dim, Hi, Wi) representing the predicted "deltas" used to transform anchors + to proposals. + """ + pred_objectness_logits = [] + pred_anchor_deltas = [] + for x in features: + t = F.relu(self.conv(x)) + pred_objectness_logits.append(self.objectness_logits(t)) + pred_anchor_deltas.append(self.anchor_deltas(t)) + return pred_objectness_logits, pred_anchor_deltas + + +@PROPOSAL_GENERATOR_REGISTRY.register() +class RPN(nn.Module): + """ + Region Proposal Network, introduced by :paper:`Faster R-CNN`. + """ + + def __init__(self, cfg, input_shape: Dict[str, ShapeSpec]): + super().__init__() + + # fmt: off + self.min_box_side_len = cfg.MODEL.PROPOSAL_GENERATOR.MIN_SIZE + self.in_features = cfg.MODEL.RPN.IN_FEATURES + self.nms_thresh = cfg.MODEL.RPN.NMS_THRESH + self.batch_size_per_image = cfg.MODEL.RPN.BATCH_SIZE_PER_IMAGE + self.positive_fraction = cfg.MODEL.RPN.POSITIVE_FRACTION + self.smooth_l1_beta = cfg.MODEL.RPN.SMOOTH_L1_BETA + self.loss_weight = cfg.MODEL.RPN.LOSS_WEIGHT + # fmt: on + + # Map from self.training state to train/test settings + self.pre_nms_topk = { + True: cfg.MODEL.RPN.PRE_NMS_TOPK_TRAIN, + False: cfg.MODEL.RPN.PRE_NMS_TOPK_TEST, + } + self.post_nms_topk = { + True: cfg.MODEL.RPN.POST_NMS_TOPK_TRAIN, + False: cfg.MODEL.RPN.POST_NMS_TOPK_TEST, + } + self.boundary_threshold = cfg.MODEL.RPN.BOUNDARY_THRESH + + self.anchor_generator = build_anchor_generator( + cfg, [input_shape[f] for f in self.in_features] + ) + self.box2box_transform = Box2BoxTransform(weights=cfg.MODEL.RPN.BBOX_REG_WEIGHTS) + self.anchor_matcher = Matcher( + cfg.MODEL.RPN.IOU_THRESHOLDS, cfg.MODEL.RPN.IOU_LABELS, allow_low_quality_matches=True + ) + self.rpn_head = build_rpn_head(cfg, [input_shape[f] for f in self.in_features]) + + def _subsample_labels(self, label): + """ + Randomly sample a subset of positive and negative examples, and overwrite + the label vector to the ignore value (-1) for all elements that are not + included in the sample. + + Args: + labels (Tensor): a vector of -1, 0, 1. Will be modified in-place and returned. + """ + pos_idx, neg_idx = subsample_labels( + label, self.batch_size_per_image, self.positive_fraction, 0 + ) + # Fill with the ignore label (-1), then set positive and negative labels + label.fill_(-1) + label.scatter_(0, pos_idx, 1) + label.scatter_(0, neg_idx, 0) + return label + + @torch.no_grad() + def label_and_sample_anchors(self, anchors: List[Boxes], gt_instances: List[Instances]): + """ + Args: + anchors (list[Boxes]): anchors for each feature map. + gt_instances: the ground-truth instances for each image. + + Returns: + list[Tensor]: + List of #demo tensors. i-th element is a vector of labels whose length is + the total number of anchors across feature maps. Label values are in {-1, 0, 1}, + with meanings: -1 = ignore; 0 = negative class; 1 = positive class. + list[Tensor]: + i-th element is a Nx4 tensor, where N is the total number of anchors across + feature maps. The values are the matched gt boxes for each anchor. + Values are undefined for those anchors not labeled as 1. + """ + anchors = Boxes.cat(anchors) + + gt_boxes = [x.gt_boxes for x in gt_instances] + image_sizes = [x.image_size for x in gt_instances] + del gt_instances + + gt_labels = [] + matched_gt_boxes = [] + for image_size_i, gt_boxes_i in zip(image_sizes, gt_boxes): + """ + image_size_i: (h, w) for the i-th image + gt_boxes_i: ground-truth boxes for i-th image + """ + + match_quality_matrix = retry_if_cuda_oom(pairwise_iou)(gt_boxes_i, anchors) + matched_idxs, gt_labels_i = retry_if_cuda_oom(self.anchor_matcher)(match_quality_matrix) + # Matching is memory-expensive and may result in CPU tensors. But the result is small + gt_labels_i = gt_labels_i.to(device=gt_boxes_i.device) + del match_quality_matrix + + if self.boundary_threshold >= 0: + # Discard anchors that go out of the boundaries of the image + # NOTE: This is legacy functionality that is turned off by default in Detectron2 + anchors_inside_image = anchors.inside_box(image_size_i, self.boundary_threshold) + gt_labels_i[~anchors_inside_image] = -1 + + # A vector of labels (-1, 0, 1) for each anchor + gt_labels_i = self._subsample_labels(gt_labels_i) + + if len(gt_boxes_i) == 0: + # These values won't be used anyway since the anchor is labeled as background + matched_gt_boxes_i = torch.zeros_like(anchors.tensor) + else: + # TODO wasted indexing computation for ignored boxes + matched_gt_boxes_i = gt_boxes_i[matched_idxs].tensor + + gt_labels.append(gt_labels_i) # N,AHW + matched_gt_boxes.append(matched_gt_boxes_i) + return gt_labels, matched_gt_boxes + + def forward(self, images, features, gt_instances=None): + """ + Args: + images (ImageList): input images of length `N` + features (dict[str: Tensor]): input data as a mapping from feature + map name to tensor. Axis 0 represents the number of images `N` in + the input data; axes 1-3 are channels, height, and width, which may + vary between feature maps (e.g., if a feature pyramid is used). + gt_instances (list[Instances], optional): a length `N` list of `Instances`s. + Each `Instances` stores ground-truth instances for the corresponding image. + + Returns: + proposals: list[Instances]: contains fields "proposal_boxes", "objectness_logits" + loss: dict[Tensor] or None + """ + features = [features[f] for f in self.in_features] + pred_objectness_logits, pred_anchor_deltas = self.rpn_head(features) + anchors = self.anchor_generator(features) + + if self.training: + gt_labels, gt_boxes = self.label_and_sample_anchors(anchors, gt_instances) + else: + gt_labels, gt_boxes = None, None + + outputs = RPNOutputs( + self.box2box_transform, + self.batch_size_per_image, + images, + pred_objectness_logits, + pred_anchor_deltas, + anchors, + gt_labels, + gt_boxes, + self.smooth_l1_beta, + ) + + if self.training: + losses = {k: v * self.loss_weight for k, v in outputs.losses().items()} + else: + losses = {} + + with torch.no_grad(): + # Find the top proposals by applying NMS and removing boxes that + # are too small. The proposals are treated as fixed for approximate + # joint training with roi heads. This approach ignores the derivative + # w.r.t. the proposal boxes’ coordinates that are also network + # responses, so is approximate. + proposals = find_top_rpn_proposals( + outputs.predict_proposals(), + outputs.predict_objectness_logits(), + images, + self.nms_thresh, + self.pre_nms_topk[self.training], + self.post_nms_topk[self.training], + self.min_box_side_len, + self.training, + ) + + return proposals, losses diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn_outputs.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn_outputs.py new file mode 100644 index 0000000..44f846f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rpn_outputs.py @@ -0,0 +1,323 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import itertools +import logging +import torch +import torch.nn.functional as F +from fvcore.nn import smooth_l1_loss + +from detectron2.layers import batched_nms, cat +from detectron2.structures import Boxes, Instances +from detectron2.utils.events import get_event_storage + +logger = logging.getLogger(__name__) + +# TODO: comments for future refactoring of this module +# +# From @rbg: +# This code involves a significant amount of tensor reshaping and permuting. Look for +# ways to simplify this. + +""" +Shape shorthand in this module: + + N: number of images in the minibatch + L: number of feature maps per image on which RPN is run + A: number of cell anchors (must be the same for all feature maps) + Hi, Wi: height and width of the i-th feature map + 4: size of the box parameterization + +Naming convention: + + objectness: refers to the binary classification of an anchor as object vs. not + object. + + deltas: refers to the 4-d (dx, dy, dw, dh) deltas that parameterize the box2box + transform (see :class:`box_regression.Box2BoxTransform`). + + pred_objectness_logits: predicted objectness scores in [-inf, +inf]; use + sigmoid(pred_objectness_logits) to estimate P(object). + + gt_labels: ground-truth binary classification labels for objectness + + pred_anchor_deltas: predicted box2box transform deltas + + gt_anchor_deltas: ground-truth box2box transform deltas +""" + + +def find_top_rpn_proposals( + proposals, + pred_objectness_logits, + images, + nms_thresh, + pre_nms_topk, + post_nms_topk, + min_box_side_len, + training, +): + """ + For each feature map, select the `pre_nms_topk` highest scoring proposals, + apply NMS, clip proposals, and remove small boxes. Return the `post_nms_topk` + highest scoring proposals among all the feature maps if `training` is True, + otherwise, returns the highest `post_nms_topk` scoring proposals for each + feature map. + + Args: + proposals (list[Tensor]): A list of L tensors. Tensor i has shape (N, Hi*Wi*A, 4). + All proposal predictions on the feature maps. + pred_objectness_logits (list[Tensor]): A list of L tensors. Tensor i has shape (N, Hi*Wi*A). + images (ImageList): Input images as an :class:`ImageList`. + nms_thresh (float): IoU threshold to use for NMS + pre_nms_topk (int): number of top k scoring proposals to keep before applying NMS. + When RPN is run on multiple feature maps (as in FPN) this number is per + feature map. + post_nms_topk (int): number of top k scoring proposals to keep after applying NMS. + When RPN is run on multiple feature maps (as in FPN) this number is total, + over all feature maps. + min_box_side_len (float): minimum proposal box side length in pixels (absolute units + wrt input images). + training (bool): True if proposals are to be used in training, otherwise False. + This arg exists only to support a legacy bug; look for the "NB: Legacy bug ..." + comment. + + Returns: + proposals (list[Instances]): list of N Instances. The i-th Instances + stores post_nms_topk object proposals for image i, sorted by their + objectness score in descending order. + """ + image_sizes = images.image_sizes # in (h, w) order + num_images = len(image_sizes) + device = proposals[0].device + + # 1. Select top-k anchor for every level and every image + topk_scores = [] # #lvl Tensor, each of shape N x topk + topk_proposals = [] + level_ids = [] # #lvl Tensor, each of shape (topk,) + batch_idx = torch.arange(num_images, device=device) + for level_id, proposals_i, logits_i in zip( + itertools.count(), proposals, pred_objectness_logits + ): + Hi_Wi_A = logits_i.shape[1] + num_proposals_i = min(pre_nms_topk, Hi_Wi_A) + + # sort is faster than topk (https://github.com/pytorch/pytorch/issues/22812) + # topk_scores_i, topk_idx = logits_i.topk(num_proposals_i, dim=1) + logits_i, idx = logits_i.sort(descending=True, dim=1) + topk_scores_i = logits_i[batch_idx, :num_proposals_i] + topk_idx = idx[batch_idx, :num_proposals_i] + + # each is N x topk + topk_proposals_i = proposals_i[batch_idx[:, None], topk_idx] # N x topk x 4 + + topk_proposals.append(topk_proposals_i) + topk_scores.append(topk_scores_i) + level_ids.append(torch.full((num_proposals_i,), level_id, dtype=torch.int64, device=device)) + + # 2. Concat all levels together + topk_scores = cat(topk_scores, dim=1) + topk_proposals = cat(topk_proposals, dim=1) + level_ids = cat(level_ids, dim=0) + + # 3. For each image, run a per-level NMS, and choose topk results. + results = [] + for n, image_size in enumerate(image_sizes): + boxes = Boxes(topk_proposals[n]) + scores_per_img = topk_scores[n] + lvl = level_ids + + valid_mask = torch.isfinite(boxes.tensor).all(dim=1) & torch.isfinite(scores_per_img) + if not valid_mask.all(): + if training: + raise FloatingPointError( + "Predicted boxes or scores contain Inf/NaN. Training has diverged." + ) + boxes = boxes[valid_mask] + scores_per_img = scores_per_img[valid_mask] + lvl = lvl[valid_mask] + boxes.clip(image_size) + + # filter empty boxes + keep = boxes.nonempty(threshold=min_box_side_len) + if keep.sum().item() != len(boxes): + boxes, scores_per_img, lvl = boxes[keep], scores_per_img[keep], lvl[keep] + + keep = batched_nms(boxes.tensor, scores_per_img, lvl, nms_thresh) + # In Detectron1, there was different behavior during training vs. testing. + # (https://github.com/facebookresearch/Detectron/issues/459) + # During training, topk is over the proposals from *all* images in the training batch. + # During testing, it is over the proposals for each image separately. + # As a result, the training behavior becomes batch-dependent, + # and the configuration "POST_NMS_TOPK_TRAIN" end up relying on the batch size. + # This bug is addressed in Detectron2 to make the behavior independent of batch size. + keep = keep[:post_nms_topk] # keep is already sorted + + res = Instances(image_size) + res.proposal_boxes = boxes[keep] + res.objectness_logits = scores_per_img[keep] + results.append(res) + return results + + +def rpn_losses( + gt_labels, gt_anchor_deltas, pred_objectness_logits, pred_anchor_deltas, smooth_l1_beta +): + """ + Args: + gt_labels (Tensor): shape (N,), each element in {-1, 0, 1} representing + ground-truth objectness labels with: -1 = ignore; 0 = not object; 1 = object. + gt_anchor_deltas (Tensor): shape (N, box_dim), row i represents ground-truth + box2box transform targets (dx, dy, dw, dh) or (dx, dy, dw, dh, da) that map anchor i to + its matched ground-truth box. + pred_objectness_logits (Tensor): shape (N,), each element is a predicted objectness + logit. + pred_anchor_deltas (Tensor): shape (N, box_dim), each row is a predicted box2box + transform (dx, dy, dw, dh) or (dx, dy, dw, dh, da) + smooth_l1_beta (float): The transition point between L1 and L2 loss in + the smooth L1 loss function. When set to 0, the loss becomes L1. When + set to +inf, the loss becomes constant 0. + + Returns: + objectness_loss, localization_loss, both unnormalized (summed over samples). + """ + pos_masks = gt_labels == 1 + localization_loss = smooth_l1_loss( + pred_anchor_deltas[pos_masks], gt_anchor_deltas[pos_masks], smooth_l1_beta, reduction="sum" + ) + + valid_masks = gt_labels >= 0 + objectness_loss = F.binary_cross_entropy_with_logits( + pred_objectness_logits[valid_masks], + gt_labels[valid_masks].to(torch.float32), + reduction="sum", + ) + return objectness_loss, localization_loss + + +class RPNOutputs(object): + def __init__( + self, + box2box_transform, + batch_size_per_image, + images, + pred_objectness_logits, + pred_anchor_deltas, + anchors, + gt_labels=None, + gt_boxes=None, + smooth_l1_beta=0.0, + ): + """ + Args: + box2box_transform (Box2BoxTransform): :class:`Box2BoxTransform` instance for + anchor-proposal transformations. + images (ImageList): :class:`ImageList` instance representing N input images + batch_size_per_image (int): number of proposals to sample when training + pred_objectness_logits (list[Tensor]): A list of L elements. + Element i is a tensor of shape (N, A, Hi, Wi) representing + the predicted objectness logits for anchors. + pred_anchor_deltas (list[Tensor]): A list of L elements. Element i is a tensor of shape + (N, A*4 or 5, Hi, Wi) representing the predicted "deltas" used to transform anchors + to proposals. + anchors (list[Boxes or RotatedBoxes]): A list of Boxes/RotatedBoxes storing the all + the anchors for each feature map. See :meth:`AnchorGenerator.forward`. + gt_labels (list[Tensor]): Available on in training. + See :meth:`RPN.label_and_sample_anchors`. + gt_boxes (list[Boxes or RotatedBoxes]): Available on in training. + See :meth:`RPN.label_and_sample_anchors`. + smooth_l1_beta (float): The transition point between L1 and L2 loss in + the smooth L1 loss function. When set to 0, the loss becomes L1. When + set to +inf, the loss becomes constant 0. + """ + self.box2box_transform = box2box_transform + self.batch_size_per_image = batch_size_per_image + + B = anchors[0].tensor.size(1) # box dimension (4 or 5) + self.pred_objectness_logits = [ + # Reshape: (N, A, Hi, Wi) -> (N, Hi, Wi, A) -> (N, Hi*Wi*A) + score.permute(0, 2, 3, 1).flatten(1) + for score in pred_objectness_logits + ] + + self.pred_anchor_deltas = [ + # Reshape: (N, A*B, Hi, Wi) -> (N, A, B, Hi, Wi) -> (N, Hi, Wi, A, B) + # -> (N, Hi*Wi*A, B) + x.view(x.shape[0], -1, B, x.shape[-2], x.shape[-1]) + .permute(0, 3, 4, 1, 2) + .flatten(1, -2) + for x in pred_anchor_deltas + ] + + self.anchors = anchors + + self.gt_boxes = gt_boxes + self.gt_labels = gt_labels + + self.num_images = len(images) + self.smooth_l1_beta = smooth_l1_beta + + def losses(self): + """ + Return the losses from a set of RPN predictions and their associated ground-truth. + + Returns: + dict[loss name -> loss value]: A dict mapping from loss name to loss value. + Loss names are: `loss_rpn_cls` for objectness classification and + `loss_rpn_loc` for proposal localization. + """ + gt_labels = torch.stack(self.gt_labels) + anchors = self.anchors[0].cat(self.anchors).tensor # Ax(4 or 5) + gt_anchor_deltas = [self.box2box_transform.get_deltas(anchors, k) for k in self.gt_boxes] + gt_anchor_deltas = torch.stack(gt_anchor_deltas) + + # Log the number of positive/negative anchors per-image that's used in training + num_pos_anchors = (gt_labels == 1).sum().item() + num_neg_anchors = (gt_labels == 0).sum().item() + storage = get_event_storage() + storage.put_scalar("rpn/num_pos_anchors", num_pos_anchors / self.num_images) + storage.put_scalar("rpn/num_neg_anchors", num_neg_anchors / self.num_images) + + objectness_loss, localization_loss = rpn_losses( + gt_labels, + gt_anchor_deltas, + # concat on the Hi*Wi*A dimension + cat(self.pred_objectness_logits, dim=1), + cat(self.pred_anchor_deltas, dim=1), + self.smooth_l1_beta, + ) + normalizer = self.batch_size_per_image * self.num_images + return { + "loss_rpn_cls": objectness_loss / normalizer, + "loss_rpn_loc": localization_loss / normalizer, + } + + def predict_proposals(self): + """ + Transform anchors into proposals by applying the predicted anchor deltas. + + Returns: + proposals (list[Tensor]): A list of L tensors. Tensor i has shape + (N, Hi*Wi*A, B), where B is box dimension (4 or 5). + """ + proposals = [] + # For each feature map + for anchors_i, pred_anchor_deltas_i in zip(self.anchors, self.pred_anchor_deltas): + B = anchors_i.tensor.size(1) + N = self.num_images + pred_anchor_deltas_i = pred_anchor_deltas_i.reshape(-1, B) + # Expand anchors to shape (N*Hi*Wi*A, B) + anchors_i = anchors_i.tensor.unsqueeze(0).expand(N, -1, -1).reshape(-1, B) + proposals_i = self.box2box_transform.apply_deltas(pred_anchor_deltas_i, anchors_i) + # Append feature map proposals with shape (N, Hi*Wi*A, B) + proposals.append(proposals_i.view(N, -1, B)) + return proposals + + def predict_objectness_logits(self): + """ + Return objectness logits in the same format as the proposals returned by + :meth:`predict_proposals`. + + Returns: + pred_objectness_logits (list[Tensor]): A list of L tensors. Tensor i has shape + (N, Hi*Wi*A). + """ + return self.pred_objectness_logits diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rrpn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rrpn.py new file mode 100644 index 0000000..8c2ac36 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/proposal_generator/rrpn.py @@ -0,0 +1,233 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import itertools +import logging +from typing import Dict, List +import torch + +from detectron2.layers import ShapeSpec, batched_nms_rotated, cat +from detectron2.structures import Instances, RotatedBoxes, pairwise_iou_rotated +from detectron2.utils.memory import retry_if_cuda_oom + +from ..box_regression import Box2BoxTransformRotated +from .build import PROPOSAL_GENERATOR_REGISTRY +from .rpn import RPN +from .rpn_outputs import RPNOutputs + +logger = logging.getLogger(__name__) + + +def find_top_rrpn_proposals( + proposals, + pred_objectness_logits, + images, + nms_thresh, + pre_nms_topk, + post_nms_topk, + min_box_side_len, + training, +): + """ + For each feature map, select the `pre_nms_topk` highest scoring proposals, + apply NMS, clip proposals, and remove small boxes. Return the `post_nms_topk` + highest scoring proposals among all the feature maps if `training` is True, + otherwise, returns the highest `post_nms_topk` scoring proposals for each + feature map. + + Args: + proposals (list[Tensor]): A list of L tensors. Tensor i has shape (N, Hi*Wi*A, 5). + All proposal predictions on the feature maps. + pred_objectness_logits (list[Tensor]): A list of L tensors. Tensor i has shape (N, Hi*Wi*A). + images (ImageList): Input images as an :class:`ImageList`. + nms_thresh (float): IoU threshold to use for NMS + pre_nms_topk (int): number of top k scoring proposals to keep before applying NMS. + When RRPN is run on multiple feature maps (as in FPN) this number is per + feature map. + post_nms_topk (int): number of top k scoring proposals to keep after applying NMS. + When RRPN is run on multiple feature maps (as in FPN) this number is total, + over all feature maps. + min_box_side_len (float): minimum proposal box side length in pixels (absolute units + wrt input images). + training (bool): True if proposals are to be used in training, otherwise False. + This arg exists only to support a legacy bug; look for the "NB: Legacy bug ..." + comment. + + Returns: + proposals (list[Instances]): list of N Instances. The i-th Instances + stores post_nms_topk object proposals for image i. + """ + image_sizes = images.image_sizes # in (h, w) order + num_images = len(image_sizes) + device = proposals[0].device + + # 1. Select top-k anchor for every level and every image + topk_scores = [] # #lvl Tensor, each of shape N x topk + topk_proposals = [] + level_ids = [] # #lvl Tensor, each of shape (topk,) + batch_idx = torch.arange(num_images, device=device) + for level_id, proposals_i, logits_i in zip( + itertools.count(), proposals, pred_objectness_logits + ): + Hi_Wi_A = logits_i.shape[1] + num_proposals_i = min(pre_nms_topk, Hi_Wi_A) + + # sort is faster than topk (https://github.com/pytorch/pytorch/issues/22812) + # topk_scores_i, topk_idx = logits_i.topk(num_proposals_i, dim=1) + logits_i, idx = logits_i.sort(descending=True, dim=1) + topk_scores_i = logits_i[batch_idx, :num_proposals_i] + topk_idx = idx[batch_idx, :num_proposals_i] + + # each is N x topk + topk_proposals_i = proposals_i[batch_idx[:, None], topk_idx] # N x topk x 5 + + topk_proposals.append(topk_proposals_i) + topk_scores.append(topk_scores_i) + level_ids.append(torch.full((num_proposals_i,), level_id, dtype=torch.int64, device=device)) + + # 2. Concat all levels together + topk_scores = cat(topk_scores, dim=1) + topk_proposals = cat(topk_proposals, dim=1) + level_ids = cat(level_ids, dim=0) + + # 3. For each image, run a per-level NMS, and choose topk results. + results = [] + for n, image_size in enumerate(image_sizes): + boxes = RotatedBoxes(topk_proposals[n]) + scores_per_img = topk_scores[n] + valid_mask = torch.isfinite(boxes.tensor).all(dim=1) & torch.isfinite(scores_per_img) + if not valid_mask.all(): + boxes = boxes[valid_mask] + scores_per_img = scores_per_img[valid_mask] + boxes.clip(image_size) + + # filter empty boxes + keep = boxes.nonempty(threshold=min_box_side_len) + lvl = level_ids + if keep.sum().item() != len(boxes): + boxes, scores_per_img, lvl = (boxes[keep], scores_per_img[keep], level_ids[keep]) + + keep = batched_nms_rotated(boxes.tensor, scores_per_img, lvl, nms_thresh) + # In Detectron1, there was different behavior during training vs. testing. + # (https://github.com/facebookresearch/Detectron/issues/459) + # During training, topk is over the proposals from *all* images in the training batch. + # During testing, it is over the proposals for each image separately. + # As a result, the training behavior becomes batch-dependent, + # and the configuration "POST_NMS_TOPK_TRAIN" end up relying on the batch size. + # This bug is addressed in Detectron2 to make the behavior independent of batch size. + keep = keep[:post_nms_topk] + + res = Instances(image_size) + res.proposal_boxes = boxes[keep] + res.objectness_logits = scores_per_img[keep] + results.append(res) + return results + + +@PROPOSAL_GENERATOR_REGISTRY.register() +class RRPN(RPN): + """ + Rotated Region Proposal Network described in :paper:`RRPN`. + """ + + def __init__(self, cfg, input_shape: Dict[str, ShapeSpec]): + super().__init__(cfg, input_shape) + self.box2box_transform = Box2BoxTransformRotated(weights=cfg.MODEL.RPN.BBOX_REG_WEIGHTS) + if self.boundary_threshold >= 0: + raise NotImplementedError( + "boundary_threshold is a legacy option not implemented for RRPN." + ) + + @torch.no_grad() + def label_and_sample_anchors(self, anchors: List[RotatedBoxes], gt_instances: List[Instances]): + """ + Args: + anchors (list[RotatedBoxes]): anchors for each feature map. + gt_instances: the ground-truth instances for each image. + + Returns: + list[Tensor]: + List of #demo tensors. i-th element is a vector of labels whose length is + the total number of anchors across feature maps. Label values are in {-1, 0, 1}, + with meanings: -1 = ignore; 0 = negative class; 1 = positive class. + list[Tensor]: + i-th element is a Nx5 tensor, where N is the total number of anchors across + feature maps. The values are the matched gt boxes for each anchor. + Values are undefined for those anchors not labeled as 1. + """ + anchors = RotatedBoxes.cat(anchors) + + gt_boxes = [x.gt_boxes for x in gt_instances] + del gt_instances + + gt_labels = [] + matched_gt_boxes = [] + for gt_boxes_i in gt_boxes: + """ + gt_boxes_i: ground-truth boxes for i-th image + """ + match_quality_matrix = retry_if_cuda_oom(pairwise_iou_rotated)(gt_boxes_i, anchors) + matched_idxs, gt_labels_i = retry_if_cuda_oom(self.anchor_matcher)(match_quality_matrix) + # Matching is memory-expensive and may result in CPU tensors. But the result is small + gt_labels_i = gt_labels_i.to(device=gt_boxes_i.device) + + # A vector of labels (-1, 0, 1) for each anchor + gt_labels_i = self._subsample_labels(gt_labels_i) + + if len(gt_boxes_i) == 0: + # These values won't be used anyway since the anchor is labeled as background + matched_gt_boxes_i = torch.zeros_like(anchors.tensor) + else: + # TODO wasted indexing computation for ignored boxes + matched_gt_boxes_i = gt_boxes_i[matched_idxs].tensor + + gt_labels.append(gt_labels_i) # N,AHW + matched_gt_boxes.append(matched_gt_boxes_i) + return gt_labels, matched_gt_boxes + + def forward(self, images, features, gt_instances=None): + # same signature as RPN.forward + features = [features[f] for f in self.in_features] + pred_objectness_logits, pred_anchor_deltas = self.rpn_head(features) + anchors = self.anchor_generator(features) + + if self.training: + gt_labels, gt_boxes = self.label_and_sample_anchors(anchors, gt_instances) + else: + gt_labels, gt_boxes = None, None + + outputs = RPNOutputs( + self.box2box_transform, + self.batch_size_per_image, + images, + pred_objectness_logits, + pred_anchor_deltas, + anchors, + gt_labels, + gt_boxes, + self.smooth_l1_beta, + ) + + if self.training: + losses = {k: v * self.loss_weight for k, v in outputs.losses().items()} + else: + losses = {} + + with torch.no_grad(): + # Find the top proposals by applying NMS and removing boxes that + # are too small. The proposals are treated as fixed for approximate + # joint training with roi heads. This approach ignores the derivative + # w.r.t. the proposal boxes’ coordinates that are also network + # responses, so is approximate. + + # Note: this line is the only difference v.s. RPN.forward + proposals = find_top_rrpn_proposals( + outputs.predict_proposals(), + outputs.predict_objectness_logits(), + images, + self.nms_thresh, + self.pre_nms_topk[self.training], + self.post_nms_topk[self.training], + self.min_box_side_len, + self.training, + ) + + return proposals, losses diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/__init__.py new file mode 100644 index 0000000..a49099a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .box_head import ROI_BOX_HEAD_REGISTRY, build_box_head +from .keypoint_head import ROI_KEYPOINT_HEAD_REGISTRY, build_keypoint_head, BaseKeypointRCNNHead +from .mask_head import ROI_MASK_HEAD_REGISTRY, build_mask_head, BaseMaskRCNNHead +from .roi_heads import ( + ROI_HEADS_REGISTRY, + ROIHeads, + Res5ROIHeads, + StandardROIHeads, + build_roi_heads, + select_foreground_proposals, +) +from .rotated_fast_rcnn import RROIHeads +from .fast_rcnn import FastRCNNOutputLayers + +from . import cascade_rcnn # isort:skip diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/box_head.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/box_head.py new file mode 100644 index 0000000..de62d47 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/box_head.py @@ -0,0 +1,115 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +from typing import List +import fvcore.nn.weight_init as weight_init +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.config import configurable +from detectron2.layers import Conv2d, Linear, ShapeSpec, get_norm +from detectron2.utils.registry import Registry + +ROI_BOX_HEAD_REGISTRY = Registry("ROI_BOX_HEAD") +ROI_BOX_HEAD_REGISTRY.__doc__ = """ +Registry for box heads, which make box predictions from per-region features. + +The registered object will be called with `obj(cfg, input_shape)`. +""" + + +@ROI_BOX_HEAD_REGISTRY.register() +class FastRCNNConvFCHead(nn.Module): + """ + A head with several 3x3 conv layers (each followed by norm & relu) and then + several fc layers (each followed by relu). + """ + + @configurable + def __init__( + self, input_shape: ShapeSpec, *, conv_dims: List[int], fc_dims: List[int], conv_norm="" + ): + """ + NOTE: this interface is experimental. + + Args: + input_shape (ShapeSpec): shape of the input feature. + conv_dims (list[int]): the output dimensions of the conv layers + fc_dims (list[int]): the output dimensions of the fc layers + conv_norm (str or callable): normalization for the conv layers. + See :func:`detectron2.layers.get_norm` for supported types. + """ + super().__init__() + assert len(conv_dims) + len(fc_dims) > 0 + + self._output_size = (input_shape.channels, input_shape.height, input_shape.width) + + self.conv_norm_relus = [] + for k, conv_dim in enumerate(conv_dims): + conv = Conv2d( + self._output_size[0], + conv_dim, + kernel_size=3, + padding=1, + bias=not conv_norm, + norm=get_norm(conv_norm, conv_dim), + activation=F.relu, + ) + self.add_module("conv{}".format(k + 1), conv) + self.conv_norm_relus.append(conv) + self._output_size = (conv_dim, self._output_size[1], self._output_size[2]) + + self.fcs = [] + for k, fc_dim in enumerate(fc_dims): + fc = Linear(np.prod(self._output_size), fc_dim) + self.add_module("fc{}".format(k + 1), fc) + self.fcs.append(fc) + self._output_size = fc_dim + + for layer in self.conv_norm_relus: + weight_init.c2_msra_fill(layer) + for layer in self.fcs: + weight_init.c2_xavier_fill(layer) + + @classmethod + def from_config(cls, cfg, input_shape): + num_conv = cfg.MODEL.ROI_BOX_HEAD.NUM_CONV + conv_dim = cfg.MODEL.ROI_BOX_HEAD.CONV_DIM + num_fc = cfg.MODEL.ROI_BOX_HEAD.NUM_FC + fc_dim = cfg.MODEL.ROI_BOX_HEAD.FC_DIM + return { + "input_shape": input_shape, + "conv_dims": [conv_dim] * num_conv, + "fc_dims": [fc_dim] * num_fc, + "conv_norm": cfg.MODEL.ROI_BOX_HEAD.NORM, + } + + def forward(self, x): + for layer in self.conv_norm_relus: + x = layer(x) + if len(self.fcs): + if x.dim() > 2: + x = torch.flatten(x, start_dim=1) + for layer in self.fcs: + x = F.relu(layer(x)) + return x + + @property + def output_shape(self): + """ + Returns: + ShapeSpec: the output feature shape + """ + o = self._output_size + if isinstance(o, int): + return ShapeSpec(channels=o) + else: + return ShapeSpec(channels=o[0], height=o[1], width=o[2]) + + +def build_box_head(cfg, input_shape): + """ + Build a box head defined by `cfg.MODEL.ROI_BOX_HEAD.NAME`. + """ + name = cfg.MODEL.ROI_BOX_HEAD.NAME + return ROI_BOX_HEAD_REGISTRY.get(name)(cfg, input_shape) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/cascade_rcnn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/cascade_rcnn.py new file mode 100644 index 0000000..b3efdcf --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/cascade_rcnn.py @@ -0,0 +1,298 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from typing import List +import torch +from torch import nn +from torch.autograd.function import Function + +from detectron2.config import configurable +from detectron2.layers import ShapeSpec +from detectron2.structures import Boxes, Instances, pairwise_iou +from detectron2.utils.events import get_event_storage + +from ..box_regression import Box2BoxTransform +from ..matcher import Matcher +from ..poolers import ROIPooler +from .box_head import build_box_head +from .fast_rcnn import FastRCNNOutputLayers, fast_rcnn_inference +from .roi_heads import ROI_HEADS_REGISTRY, StandardROIHeads + + +class _ScaleGradient(Function): + @staticmethod + def forward(ctx, input, scale): + ctx.scale = scale + return input + + @staticmethod + def backward(ctx, grad_output): + return grad_output * ctx.scale, None + + +@ROI_HEADS_REGISTRY.register() +class CascadeROIHeads(StandardROIHeads): + """ + Implement :paper:`Cascade R-CNN`. + """ + + @configurable + def __init__( + self, + *, + box_in_features: List[str], + box_pooler: ROIPooler, + box_heads: List[nn.Module], + box_predictors: List[nn.Module], + proposal_matchers: List[Matcher], + **kwargs, + ): + """ + NOTE: this interface is experimental. + + Args: + box_pooler (ROIPooler): pooler that extracts region features from given boxes + box_heads (list[nn.Module]): box head for each cascade stage + box_predictors (list[nn.Module]): box predictor for each cascade stage + proposal_matchers (list[Matcher]): matcher with different IoU thresholds to + match boxes with ground truth for each stage. The first matcher matches + RPN proposals with ground truth, the other matchers use boxes predicted + by the previous stage as proposals and match them with ground truth. + """ + assert "proposal_matcher" not in kwargs, ( + "CascadeROIHeads takes 'proposal_matchers=' for each stage instead " + "of one 'proposal_matcher='." + ) + # The first matcher matches RPN proposals with ground truth, done in the base class + kwargs["proposal_matcher"] = proposal_matchers[0] + num_stages = self.num_cascade_stages = len(box_heads) + box_heads = nn.ModuleList(box_heads) + box_predictors = nn.ModuleList(box_predictors) + assert len(box_predictors) == num_stages, f"{len(box_predictors)} != {num_stages}!" + assert len(proposal_matchers) == num_stages, f"{len(proposal_matchers)} != {num_stages}!" + super().__init__( + box_in_features=box_in_features, + box_pooler=box_pooler, + box_head=box_heads, + box_predictor=box_predictors, + **kwargs, + ) + self.proposal_matchers = proposal_matchers + + @classmethod + def from_config(cls, cfg, input_shape): + ret = super().from_config(cfg, input_shape) + ret.pop("proposal_matcher") + return ret + + @classmethod + def _init_box_head(cls, cfg, input_shape): + # fmt: off + in_features = cfg.MODEL.ROI_HEADS.IN_FEATURES + pooler_resolution = cfg.MODEL.ROI_BOX_HEAD.POOLER_RESOLUTION + pooler_scales = tuple(1.0 / input_shape[k].stride for k in in_features) + sampling_ratio = cfg.MODEL.ROI_BOX_HEAD.POOLER_SAMPLING_RATIO + pooler_type = cfg.MODEL.ROI_BOX_HEAD.POOLER_TYPE + cascade_bbox_reg_weights = cfg.MODEL.ROI_BOX_CASCADE_HEAD.BBOX_REG_WEIGHTS + cascade_ious = cfg.MODEL.ROI_BOX_CASCADE_HEAD.IOUS + assert len(cascade_bbox_reg_weights) == len(cascade_ious) + assert cfg.MODEL.ROI_BOX_HEAD.CLS_AGNOSTIC_BBOX_REG, \ + "CascadeROIHeads only support class-agnostic regression now!" + assert cascade_ious[0] == cfg.MODEL.ROI_HEADS.IOU_THRESHOLDS[0] + # fmt: on + + in_channels = [input_shape[f].channels for f in in_features] + # Check all channel counts are equal + assert len(set(in_channels)) == 1, in_channels + in_channels = in_channels[0] + + box_pooler = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type=pooler_type, + ) + pooled_shape = ShapeSpec( + channels=in_channels, width=pooler_resolution, height=pooler_resolution + ) + + box_heads, box_predictors, proposal_matchers = [], [], [] + for match_iou, bbox_reg_weights in zip(cascade_ious, cascade_bbox_reg_weights): + box_head = build_box_head(cfg, pooled_shape) + box_heads.append(box_head) + box_predictors.append( + FastRCNNOutputLayers( + cfg, + box_head.output_shape, + box2box_transform=Box2BoxTransform(weights=bbox_reg_weights), + ) + ) + proposal_matchers.append(Matcher([match_iou], [0, 1], allow_low_quality_matches=False)) + return { + "box_in_features": in_features, + "box_pooler": box_pooler, + "box_heads": box_heads, + "box_predictors": box_predictors, + "proposal_matchers": proposal_matchers, + } + + def forward(self, images, features, proposals, targets=None): + del images + if self.training: + proposals = self.label_and_sample_proposals(proposals, targets) + + if self.training: + # Need targets to box head + losses = self._forward_box(features, proposals, targets) + losses.update(self._forward_mask(features, proposals)) + losses.update(self._forward_keypoint(features, proposals)) + return proposals, losses + else: + pred_instances = self._forward_box(features, proposals) + pred_instances = self.forward_with_given_boxes(features, pred_instances) + return pred_instances, {} + + def _forward_box(self, features, proposals, targets=None): + """ + Args: + features, targets: the same as in + Same as in :meth:`ROIHeads.forward`. + proposals (list[Instances]): the per-image object proposals with + their matching ground truth. + Each has fields "proposal_boxes", and "objectness_logits", + "gt_classes", "gt_boxes". + """ + features = [features[f] for f in self.box_in_features] + head_outputs = [] # (predictor, predictions, proposals) + prev_pred_boxes = None + image_sizes = [x.image_size for x in proposals] + for k in range(self.num_cascade_stages): + if k > 0: + # The output boxes of the previous stage are used to create the input + # proposals of the next stage. + proposals = self._create_proposals_from_boxes(prev_pred_boxes, image_sizes) + if self.training: + proposals = self._match_and_label_boxes(proposals, k, targets) + predictions = self._run_stage(features, proposals, k) + prev_pred_boxes = self.box_predictor[k].predict_boxes(predictions, proposals) + head_outputs.append((self.box_predictor[k], predictions, proposals)) + + if self.training: + losses = {} + storage = get_event_storage() + for stage, (predictor, predictions, proposals) in enumerate(head_outputs): + with storage.name_scope("stage{}".format(stage)): + stage_losses = predictor.losses(predictions, proposals) + losses.update({k + "_stage{}".format(stage): v for k, v in stage_losses.items()}) + return losses + else: + # Each is a list[Tensor] of length #image. Each tensor is Ri x (K+1) + scores_per_stage = [h[0].predict_probs(h[1], h[2]) for h in head_outputs] + + # Average the scores across heads + scores = [ + sum(list(scores_per_image)) * (1.0 / self.num_cascade_stages) + for scores_per_image in zip(*scores_per_stage) + ] + # Use the boxes of the last head + predictor, predictions, proposals = head_outputs[-1] + boxes = predictor.predict_boxes(predictions, proposals) + pred_instances, _ = fast_rcnn_inference( + boxes, + scores, + image_sizes, + predictor.test_score_thresh, + predictor.test_nms_thresh, + predictor.test_topk_per_image, + ) + return pred_instances + + @torch.no_grad() + def _match_and_label_boxes(self, proposals, stage, targets): + """ + Match proposals with groundtruth using the matcher at the given stage. + Label the proposals as foreground or background based on the match. + + Args: + proposals (list[Instances]): One Instances for each image, with + the field "proposal_boxes". + stage (int): the current stage + targets (list[Instances]): the ground truth instances + + Returns: + list[Instances]: the same proposals, but with fields "gt_classes" and "gt_boxes" + """ + num_fg_samples, num_bg_samples = [], [] + for proposals_per_image, targets_per_image in zip(proposals, targets): + match_quality_matrix = pairwise_iou( + targets_per_image.gt_boxes, proposals_per_image.proposal_boxes + ) + # proposal_labels are 0 or 1 + matched_idxs, proposal_labels = self.proposal_matchers[stage](match_quality_matrix) + if len(targets_per_image) > 0: + gt_classes = targets_per_image.gt_classes[matched_idxs] + # Label unmatched proposals (0 label from matcher) as background (label=num_classes) + gt_classes[proposal_labels == 0] = self.num_classes + gt_boxes = targets_per_image.gt_boxes[matched_idxs] + else: + gt_classes = torch.zeros_like(matched_idxs) + self.num_classes + gt_boxes = Boxes( + targets_per_image.gt_boxes.tensor.new_zeros((len(proposals_per_image), 4)) + ) + proposals_per_image.gt_classes = gt_classes + proposals_per_image.gt_boxes = gt_boxes + + num_fg_samples.append((proposal_labels == 1).sum().item()) + num_bg_samples.append(proposal_labels.numel() - num_fg_samples[-1]) + + # Log the number of fg/bg samples in each stage + storage = get_event_storage() + storage.put_scalar( + "stage{}/roi_head/num_fg_samples".format(stage), + sum(num_fg_samples) / len(num_fg_samples), + ) + storage.put_scalar( + "stage{}/roi_head/num_bg_samples".format(stage), + sum(num_bg_samples) / len(num_bg_samples), + ) + return proposals + + def _run_stage(self, features, proposals, stage): + """ + Args: + features (list[Tensor]): #lvl input features to ROIHeads + proposals (list[Instances]): #image Instances, with the field "proposal_boxes" + stage (int): the current stage + + Returns: + Same output as `FastRCNNOutputLayers.forward()`. + """ + box_features = self.box_pooler(features, [x.proposal_boxes for x in proposals]) + # The original implementation averages the losses among heads, + # but scale up the parameter gradients of the heads. + # This is equivalent to adding the losses among heads, + # but scale down the gradients on features. + box_features = _ScaleGradient.apply(box_features, 1.0 / self.num_cascade_stages) + box_features = self.box_head[stage](box_features) + return self.box_predictor[stage](box_features) + + def _create_proposals_from_boxes(self, boxes, image_sizes): + """ + Args: + boxes (list[Tensor]): per-image predicted boxes, each of shape Ri x 4 + image_sizes (list[tuple]): list of image shapes in (h, w) + + Returns: + list[Instances]: per-image proposals with the given boxes. + """ + # Just like RPN, the proposals should not have gradients + boxes = [Boxes(b.detach()) for b in boxes] + proposals = [] + for boxes_per_image, image_size in zip(boxes, image_sizes): + boxes_per_image.clip(image_size) + if self.training: + # do not filter empty boxes at inference time, + # because the scores from each stage need to be aligned and added later + boxes_per_image = boxes_per_image[boxes_per_image.nonempty()] + prop = Instances(image_size) + prop.proposal_boxes = boxes_per_image + proposals.append(prop) + return proposals diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/fast_rcnn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/fast_rcnn.py new file mode 100644 index 0000000..ca796ac --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/fast_rcnn.py @@ -0,0 +1,510 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import torch +from fvcore.nn import smooth_l1_loss +from torch import nn +from torch.nn import functional as F + +from detectron2.config import configurable +from detectron2.layers import Linear, ShapeSpec, batched_nms, cat +from detectron2.modeling.box_regression import Box2BoxTransform, apply_deltas_broadcast +from detectron2.structures import Boxes, Instances +from detectron2.utils.events import get_event_storage + +__all__ = ["fast_rcnn_inference", "FastRCNNOutputLayers"] + + +logger = logging.getLogger(__name__) + +""" +Shape shorthand in this module: + + N: number of images in the minibatch + R: number of ROIs, combined over all images, in the minibatch + Ri: number of ROIs in image i + K: number of foreground classes. E.g.,there are 80 foreground classes in COCO. + +Naming convention: + + deltas: refers to the 4-d (dx, dy, dw, dh) deltas that parameterize the box2box + transform (see :class:`box_regression.Box2BoxTransform`). + + pred_class_logits: predicted class scores in [-inf, +inf]; use + softmax(pred_class_logits) to estimate P(class). + + gt_classes: ground-truth classification labels in [0, K], where [0, K) represent + foreground object classes and K represents the background class. + + pred_proposal_deltas: predicted box2box transform deltas for transforming proposals + to detection box predictions. + + gt_proposal_deltas: ground-truth box2box transform deltas +""" + + +def fast_rcnn_inference(boxes, scores, image_shapes, score_thresh, nms_thresh, topk_per_image): + """ + Call `fast_rcnn_inference_single_image` for all images. + + Args: + boxes (list[Tensor]): A list of Tensors of predicted class-specific or class-agnostic + boxes for each image. Element i has shape (Ri, K * 4) if doing + class-specific regression, or (Ri, 4) if doing class-agnostic + regression, where Ri is the number of predicted objects for image i. + This is compatible with the output of :meth:`FastRCNNOutputLayers.predict_boxes`. + scores (list[Tensor]): A list of Tensors of predicted class scores for each image. + Element i has shape (Ri, K + 1), where Ri is the number of predicted objects + for image i. Compatible with the output of :meth:`FastRCNNOutputLayers.predict_probs`. + image_shapes (list[tuple]): A list of (width, height) tuples for each image in the batch. + score_thresh (float): Only return detections with a confidence score exceeding this + threshold. + nms_thresh (float): The threshold to use for box non-maximum suppression. Value in [0, 1]. + topk_per_image (int): The number of top scoring detections to return. Set < 0 to return + all detections. + + Returns: + instances: (list[Instances]): A list of N instances, one for each image in the batch, + that stores the topk most confidence detections. + kept_indices: (list[Tensor]): A list of 1D tensor of length of N, each element indicates + the corresponding boxes/scores index in [0, Ri) from the input, for image i. + """ + result_per_image = [ + fast_rcnn_inference_single_image( + boxes_per_image, scores_per_image, image_shape, score_thresh, nms_thresh, topk_per_image + ) + for scores_per_image, boxes_per_image, image_shape in zip(scores, boxes, image_shapes) + ] + return [x[0] for x in result_per_image], [x[1] for x in result_per_image] + + +def fast_rcnn_inference_single_image( + boxes, scores, image_shape, score_thresh, nms_thresh, topk_per_image +): + """ + Single-image inference. Return bounding-box detection results by thresholding + on scores and applying non-maximum suppression (NMS). + + Args: + Same as `fast_rcnn_inference`, but with boxes, scores, and image shapes + per image. + + Returns: + Same as `fast_rcnn_inference`, but for only one image. + """ + valid_mask = torch.isfinite(boxes).all(dim=1) & torch.isfinite(scores).all(dim=1) + if not valid_mask.all(): + boxes = boxes[valid_mask] + scores = scores[valid_mask] + + scores = scores[:, :-1] + num_bbox_reg_classes = boxes.shape[1] // 4 + # Convert to Boxes to use the `clip` function ... + boxes = Boxes(boxes.reshape(-1, 4)) + boxes.clip(image_shape) + boxes = boxes.tensor.view(-1, num_bbox_reg_classes, 4) # R x C x 4 + + # Filter results based on detection scores + filter_mask = scores > score_thresh # R x K + # R' x 2. First column contains indices of the R predictions; + # Second column contains indices of classes. + filter_inds = filter_mask.nonzero() + if num_bbox_reg_classes == 1: + boxes = boxes[filter_inds[:, 0], 0] + else: + boxes = boxes[filter_mask] + scores = scores[filter_mask] + + # Apply per-class NMS + keep = batched_nms(boxes, scores, filter_inds[:, 1], nms_thresh) + if topk_per_image >= 0: + keep = keep[:topk_per_image] + boxes, scores, filter_inds = boxes[keep], scores[keep], filter_inds[keep] + + result = Instances(image_shape) + result.pred_boxes = Boxes(boxes) + result.scores = scores + result.pred_classes = filter_inds[:, 1] + return result, filter_inds[:, 0] + + +class FastRCNNOutputs(object): + """ + A class that stores information about outputs of a Fast R-CNN head. + It provides methods that are used to decode the outputs of a Fast R-CNN head. + """ + + def __init__( + self, + box2box_transform, + pred_class_logits, + pred_proposal_deltas, + proposals, + smooth_l1_beta=0, + ): + """ + Args: + box2box_transform (Box2BoxTransform/Box2BoxTransformRotated): + box2box transform instance for proposal-to-detection transformations. + pred_class_logits (Tensor): A tensor of shape (R, K + 1) storing the predicted class + logits for all R predicted object instances. + Each row corresponds to a predicted object instance. + pred_proposal_deltas (Tensor): A tensor of shape (R, K * B) or (R, B) for + class-specific or class-agnostic regression. It stores the predicted deltas that + transform proposals into final box detections. + B is the box dimension (4 or 5). + When B is 4, each row is [dx, dy, dw, dh (, ....)]. + When B is 5, each row is [dx, dy, dw, dh, da (, ....)]. + proposals (list[Instances]): A list of N Instances, where Instances i stores the + proposals for image i, in the field "proposal_boxes". + When training, each Instances must have ground-truth labels + stored in the field "gt_classes" and "gt_boxes". + The total number of all instances must be equal to R. + smooth_l1_beta (float): The transition point between L1 and L2 loss in + the smooth L1 loss function. When set to 0, the loss becomes L1. When + set to +inf, the loss becomes constant 0. + """ + self.box2box_transform = box2box_transform + self.num_preds_per_image = [len(p) for p in proposals] + self.pred_class_logits = pred_class_logits + self.pred_proposal_deltas = pred_proposal_deltas + self.smooth_l1_beta = smooth_l1_beta + self.image_shapes = [x.image_size for x in proposals] + + if len(proposals): + box_type = type(proposals[0].proposal_boxes) + # cat(..., dim=0) concatenates over all images in the batch + self.proposals = box_type.cat([p.proposal_boxes for p in proposals]) + assert ( + not self.proposals.tensor.requires_grad + ), "Proposals should not require gradients!" + + # The following fields should exist only when training. + if proposals[0].has("gt_boxes"): + self.gt_boxes = box_type.cat([p.gt_boxes for p in proposals]) + assert proposals[0].has("gt_classes") + self.gt_classes = cat([p.gt_classes for p in proposals], dim=0) + else: + self.proposals = Boxes(torch.zeros(0, 4, device=self.pred_proposal_deltas.device)) + self._no_instances = len(proposals) == 0 # no instances found + + def _log_accuracy(self): + """ + Log the accuracy metrics to EventStorage. + """ + num_instances = self.gt_classes.numel() + pred_classes = self.pred_class_logits.argmax(dim=1) + bg_class_ind = self.pred_class_logits.shape[1] - 1 + + fg_inds = (self.gt_classes >= 0) & (self.gt_classes < bg_class_ind) + num_fg = fg_inds.nonzero().numel() + fg_gt_classes = self.gt_classes[fg_inds] + fg_pred_classes = pred_classes[fg_inds] + + num_false_negative = (fg_pred_classes == bg_class_ind).nonzero().numel() + num_accurate = (pred_classes == self.gt_classes).nonzero().numel() + fg_num_accurate = (fg_pred_classes == fg_gt_classes).nonzero().numel() + + storage = get_event_storage() + if num_instances > 0: + storage.put_scalar("fast_rcnn/cls_accuracy", num_accurate / num_instances) + if num_fg > 0: + storage.put_scalar("fast_rcnn/fg_cls_accuracy", fg_num_accurate / num_fg) + storage.put_scalar("fast_rcnn/false_negative", num_false_negative / num_fg) + + def softmax_cross_entropy_loss(self): + """ + Compute the softmax cross entropy loss for box classification. + + Returns: + scalar Tensor + """ + if self._no_instances: + return 0.0 * self.pred_class_logits.sum() + else: + self._log_accuracy() + return F.cross_entropy(self.pred_class_logits, self.gt_classes, reduction="mean") + + def smooth_l1_loss(self): + """ + Compute the smooth L1 loss for box regression. + + Returns: + scalar Tensor + """ + if self._no_instances: + return 0.0 * self.pred_proposal_deltas.sum() + gt_proposal_deltas = self.box2box_transform.get_deltas( + self.proposals.tensor, self.gt_boxes.tensor + ) + box_dim = gt_proposal_deltas.size(1) # 4 or 5 + cls_agnostic_bbox_reg = self.pred_proposal_deltas.size(1) == box_dim + device = self.pred_proposal_deltas.device + + bg_class_ind = self.pred_class_logits.shape[1] - 1 + + # Box delta loss is only computed between the prediction for the gt class k + # (if 0 <= k < bg_class_ind) and the target; there is no loss defined on predictions + # for non-gt classes and background. + # Empty fg_inds produces a valid loss of zero as long as the size_average + # arg to smooth_l1_loss is False (otherwise it uses torch.mean internally + # and would produce a nan loss). + fg_inds = torch.nonzero( + (self.gt_classes >= 0) & (self.gt_classes < bg_class_ind), as_tuple=True + )[0] + if cls_agnostic_bbox_reg: + # pred_proposal_deltas only corresponds to foreground class for agnostic + gt_class_cols = torch.arange(box_dim, device=device) + else: + fg_gt_classes = self.gt_classes[fg_inds] + # pred_proposal_deltas for class k are located in columns [b * k : b * k + b], + # where b is the dimension of box representation (4 or 5) + # Note that compared to Detectron1, + # we do not perform bounding box regression for background classes. + gt_class_cols = box_dim * fg_gt_classes[:, None] + torch.arange(box_dim, device=device) + + loss_box_reg = smooth_l1_loss( + self.pred_proposal_deltas[fg_inds[:, None], gt_class_cols], + gt_proposal_deltas[fg_inds], + self.smooth_l1_beta, + reduction="sum", + ) + # The loss is normalized using the total number of regions (R), not the number + # of foreground regions even though the box regression loss is only defined on + # foreground regions. Why? Because doing so gives equal training influence to + # each foreground example. To see how, consider two different minibatches: + # (1) Contains a single foreground region + # (2) Contains 100 foreground regions + # If we normalize by the number of foreground regions, the single example in + # minibatch (1) will be given 100 times as much influence as each foreground + # example in minibatch (2). Normalizing by the total number of regions, R, + # means that the single example in minibatch (1) and each of the 100 examples + # in minibatch (2) are given equal influence. + loss_box_reg = loss_box_reg / self.gt_classes.numel() + return loss_box_reg + + def _predict_boxes(self): + """ + Returns: + Tensor: A Tensors of predicted class-specific or class-agnostic boxes + for all images in a batch. Element i has shape (Ri, K * B) or (Ri, B), where Ri is + the number of predicted objects for image i and B is the box dimension (4 or 5) + """ + return apply_deltas_broadcast( + self.box2box_transform, self.pred_proposal_deltas, self.proposals.tensor + ) + + """ + A subclass is expected to have the following methods because + they are used to query information about the head predictions. + """ + + def losses(self): + """ + Compute the default losses for box head in Fast(er) R-CNN, + with softmax cross entropy loss and smooth L1 loss. + + Returns: + A dict of losses (scalar tensors) containing keys "loss_cls" and "loss_box_reg". + """ + return { + "loss_cls": self.softmax_cross_entropy_loss(), + "loss_box_reg": self.smooth_l1_loss(), + } + + def predict_boxes(self): + """ + Deprecated + """ + return self._predict_boxes().split(self.num_preds_per_image, dim=0) + + def predict_probs(self): + """ + Deprecated + """ + probs = F.softmax(self.pred_class_logits, dim=-1) + return probs.split(self.num_preds_per_image, dim=0) + + def inference(self, score_thresh, nms_thresh, topk_per_image): + """ + Deprecated + """ + boxes = self.predict_boxes() + scores = self.predict_probs() + image_shapes = self.image_shapes + return fast_rcnn_inference( + boxes, scores, image_shapes, score_thresh, nms_thresh, topk_per_image + ) + + +class FastRCNNOutputLayers(nn.Module): + """ + Two linear layers for predicting Fast R-CNN outputs: + (1) proposal-to-detection box regression deltas + (2) classification scores + """ + + @configurable + def __init__( + self, + input_shape, + *, + box2box_transform, + num_classes, + cls_agnostic_bbox_reg=False, + smooth_l1_beta=0.0, + test_score_thresh=0.0, + test_nms_thresh=0.5, + test_topk_per_image=100, + ): + """ + NOTE: this interface is experimental. + + Args: + input_shape (ShapeSpec): shape of the input feature to this module + box2box_transform (Box2BoxTransform or Box2BoxTransformRotated): + num_classes (int): number of foreground classes + cls_agnostic_bbox_reg (bool): whether to use class agnostic for bbox regression + smooth_l1_beta (float): transition point from L1 to L2 loss. + test_score_thresh (float): threshold to filter predictions results. + test_nms_thresh (float): NMS threshold for prediction results. + test_topk_per_image (int): number of top predictions to produce per image. + """ + super().__init__() + if isinstance(input_shape, int): # some backward compatibility + input_shape = ShapeSpec(channels=input_shape) + input_size = input_shape.channels * (input_shape.width or 1) * (input_shape.height or 1) + # The prediction layer for num_classes foreground classes and one background class + # (hence + 1) + self.cls_score = Linear(input_size, num_classes + 1) + num_bbox_reg_classes = 1 if cls_agnostic_bbox_reg else num_classes + box_dim = len(box2box_transform.weights) + self.bbox_pred = Linear(input_size, num_bbox_reg_classes * box_dim) + + nn.init.normal_(self.cls_score.weight, std=0.01) + nn.init.normal_(self.bbox_pred.weight, std=0.001) + for l in [self.cls_score, self.bbox_pred]: + nn.init.constant_(l.bias, 0) + + self.box2box_transform = box2box_transform + self.smooth_l1_beta = smooth_l1_beta + self.test_score_thresh = test_score_thresh + self.test_nms_thresh = test_nms_thresh + self.test_topk_per_image = test_topk_per_image + + @classmethod + def from_config(cls, cfg, input_shape): + return { + "input_shape": input_shape, + "box2box_transform": Box2BoxTransform(weights=cfg.MODEL.ROI_BOX_HEAD.BBOX_REG_WEIGHTS), + # fmt: off + "num_classes" : cfg.MODEL.ROI_HEADS.NUM_CLASSES, + "cls_agnostic_bbox_reg" : cfg.MODEL.ROI_BOX_HEAD.CLS_AGNOSTIC_BBOX_REG, + "smooth_l1_beta" : cfg.MODEL.ROI_BOX_HEAD.SMOOTH_L1_BETA, + "test_score_thresh" : cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST, + "test_nms_thresh" : cfg.MODEL.ROI_HEADS.NMS_THRESH_TEST, + "test_topk_per_image" : cfg.TEST.DETECTIONS_PER_IMAGE + # fmt: on + } + + def forward(self, x): + """ + Returns: + Tensor: Nx(K+1) scores for each box + Tensor: Nx4 or Nx(Kx4) bounding box regression deltas. + """ + if x.dim() > 2: + x = torch.flatten(x, start_dim=1) + scores = self.cls_score(x) + proposal_deltas = self.bbox_pred(x) + return scores, proposal_deltas + + # TODO: move the implementation to this class. + def losses(self, predictions, proposals): + """ + Args: + predictions: return values of :meth:`forward()`. + proposals (list[Instances]): proposals that match the features + that were used to compute predictions. + """ + scores, proposal_deltas = predictions + return FastRCNNOutputs( + self.box2box_transform, scores, proposal_deltas, proposals, self.smooth_l1_beta + ).losses() + + def inference(self, predictions, proposals): + """ + Returns: + list[Instances]: same as `fast_rcnn_inference`. + list[Tensor]: same as `fast_rcnn_inference`. + """ + boxes = self.predict_boxes(predictions, proposals) + scores = self.predict_probs(predictions, proposals) + image_shapes = [x.image_size for x in proposals] + return fast_rcnn_inference( + boxes, + scores, + image_shapes, + self.test_score_thresh, + self.test_nms_thresh, + self.test_topk_per_image, + ) + + def predict_boxes_for_gt_classes(self, predictions, proposals): + """ + Returns: + list[Tensor]: A list of Tensors of predicted boxes for GT classes in case of + class-specific box head. Element i of the list has shape (Ri, B), where Ri is + the number of predicted objects for image i and B is the box dimension (4 or 5) + """ + if not len(proposals): + return [] + scores, proposal_deltas = predictions + proposal_boxes = [p.proposal_boxes for p in proposals] + proposal_boxes = proposal_boxes[0].cat(proposal_boxes).tensor + N, B = proposal_boxes.shape + predict_boxes = apply_deltas_broadcast( + self.box2box_transform, proposal_deltas, proposal_boxes + ) # Nx(KxB) + + K = predict_boxes.shape[1] // B + if K > 1: + gt_classes = torch.cat([p.gt_classes for p in proposals], dim=0) + # Some proposals are ignored or have a background class. Their gt_classes + # cannot be used as index. + gt_classes = gt_classes.clamp_(0, K - 1) + + predict_boxes = predict_boxes.view(N, K, B)[ + torch.arange(N, dtype=torch.long, device=predict_boxes.device), gt_classes + ] + num_prop_per_image = [len(p) for p in proposals] + return predict_boxes.split(num_prop_per_image) + + def predict_boxes(self, predictions, proposals): + """ + Returns: + list[Tensor]: A list of Tensors of predicted class-specific or class-agnostic boxes + for each image. Element i has shape (Ri, K * B) or (Ri, B), where Ri is + the number of predicted objects for image i and B is the box dimension (4 or 5) + """ + if not len(proposals): + return [] + _, proposal_deltas = predictions + num_prop_per_image = [len(p) for p in proposals] + proposal_boxes = [p.proposal_boxes for p in proposals] + proposal_boxes = proposal_boxes[0].cat(proposal_boxes).tensor + predict_boxes = apply_deltas_broadcast( + self.box2box_transform, proposal_deltas, proposal_boxes + ) # Nx(KxB) + return predict_boxes.split(num_prop_per_image) + + def predict_probs(self, predictions, proposals): + """ + Returns: + list[Tensor]: A list of Tensors of predicted class probabilities for each image. + Element i has shape (Ri, K + 1), where Ri is the number of predicted objects + for image i. + """ + scores, _ = predictions + num_inst_per_image = [len(p) for p in proposals] + probs = F.softmax(scores, dim=-1) + return probs.split(num_inst_per_image, dim=0) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/keypoint_head.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/keypoint_head.py new file mode 100644 index 0000000..c7990c8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/keypoint_head.py @@ -0,0 +1,253 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from typing import List +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.config import configurable +from detectron2.layers import Conv2d, ConvTranspose2d, cat, interpolate +from detectron2.structures import Instances, heatmaps_to_keypoints +from detectron2.utils.events import get_event_storage +from detectron2.utils.registry import Registry + +_TOTAL_SKIPPED = 0 + +ROI_KEYPOINT_HEAD_REGISTRY = Registry("ROI_KEYPOINT_HEAD") +ROI_KEYPOINT_HEAD_REGISTRY.__doc__ = """ +Registry for keypoint heads, which make keypoint predictions from per-region features. + +The registered object will be called with `obj(cfg, input_shape)`. +""" + + +def build_keypoint_head(cfg, input_shape): + """ + Build a keypoint head from `cfg.MODEL.ROI_KEYPOINT_HEAD.NAME`. + """ + name = cfg.MODEL.ROI_KEYPOINT_HEAD.NAME + return ROI_KEYPOINT_HEAD_REGISTRY.get(name)(cfg, input_shape) + + +def keypoint_rcnn_loss(pred_keypoint_logits, instances, normalizer): + """ + Arguments: + pred_keypoint_logits (Tensor): A tensor of shape (N, K, S, S) where N is the total number + of instances in the batch, K is the number of keypoints, and S is the side length + of the keypoint heatmap. The values are spatial logits. + instances (list[Instances]): A list of M Instances, where M is the batch size. + These instances are predictions from the model + that are in 1:1 correspondence with pred_keypoint_logits. + Each Instances should contain a `gt_keypoints` field containing a `structures.Keypoint` + instance. + normalizer (float): Normalize the loss by this amount. + If not specified, we normalize by the number of visible keypoints in the minibatch. + + Returns a scalar tensor containing the loss. + """ + heatmaps = [] + valid = [] + + keypoint_side_len = pred_keypoint_logits.shape[2] + for instances_per_image in instances: + if len(instances_per_image) == 0: + continue + keypoints = instances_per_image.gt_keypoints + heatmaps_per_image, valid_per_image = keypoints.to_heatmap( + instances_per_image.proposal_boxes.tensor, keypoint_side_len + ) + heatmaps.append(heatmaps_per_image.view(-1)) + valid.append(valid_per_image.view(-1)) + + if len(heatmaps): + keypoint_targets = cat(heatmaps, dim=0) + valid = cat(valid, dim=0).to(dtype=torch.uint8) + valid = torch.nonzero(valid).squeeze(1) + + # torch.mean (in binary_cross_entropy_with_logits) doesn't + # accept empty tensors, so handle it separately + if len(heatmaps) == 0 or valid.numel() == 0: + global _TOTAL_SKIPPED + _TOTAL_SKIPPED += 1 + storage = get_event_storage() + storage.put_scalar("kpts_num_skipped_batches", _TOTAL_SKIPPED, smoothing_hint=False) + return pred_keypoint_logits.sum() * 0 + + N, K, H, W = pred_keypoint_logits.shape + pred_keypoint_logits = pred_keypoint_logits.view(N * K, H * W) + + keypoint_loss = F.cross_entropy( + pred_keypoint_logits[valid], keypoint_targets[valid], reduction="sum" + ) + + # If a normalizer isn't specified, normalize by the number of visible keypoints in the minibatch + if normalizer is None: + normalizer = valid.numel() + keypoint_loss /= normalizer + + return keypoint_loss + + +def keypoint_rcnn_inference(pred_keypoint_logits, pred_instances): + """ + Post process each predicted keypoint heatmap in `pred_keypoint_logits` into (x, y, score) + and add it to the `pred_instances` as a `pred_keypoints` field. + + Args: + pred_keypoint_logits (Tensor): A tensor of shape (R, K, S, S) where R is the total number + of instances in the batch, K is the number of keypoints, and S is the side length of + the keypoint heatmap. The values are spatial logits. + pred_instances (list[Instances]): A list of N Instances, where N is the number of images. + + Returns: + None. Each element in pred_instances will contain an extra "pred_keypoints" field. + The field is a tensor of shape (#instance, K, 3) where the last + dimension corresponds to (x, y, score). + The scores are larger than 0. + """ + # flatten all bboxes from all images together (list[Boxes] -> Rx4 tensor) + bboxes_flat = cat([b.pred_boxes.tensor for b in pred_instances], dim=0) + + keypoint_results = heatmaps_to_keypoints(pred_keypoint_logits.detach(), bboxes_flat.detach()) + num_instances_per_image = [len(i) for i in pred_instances] + keypoint_results = keypoint_results[:, :, [0, 1, 3]].split(num_instances_per_image, dim=0) + + for keypoint_results_per_image, instances_per_image in zip(keypoint_results, pred_instances): + # keypoint_results_per_image is (num instances)x(num keypoints)x(x, y, score) + instances_per_image.pred_keypoints = keypoint_results_per_image + + +class BaseKeypointRCNNHead(nn.Module): + """ + Implement the basic Keypoint R-CNN losses and inference logic described in :paper:`Mask R-CNN`. + """ + + @configurable + def __init__(self, *, num_keypoints, loss_weight=1.0, loss_normalizer=1.0): + """ + NOTE: this interface is experimental. + + Args: + num_keypoints (int): number of keypoints to predict + loss_weight (float): weight to multiple on the keypoint loss + loss_normalizer (float or str): + If float, divide the loss by `loss_normalizer * #images`. + If 'visible', the loss is normalized by the total number of + visible keypoints across images. + """ + super().__init__() + self.num_keypoints = num_keypoints + self.loss_weight = loss_weight + assert loss_normalizer == "visible" or isinstance(loss_normalizer, float), loss_normalizer + self.loss_normalizer = loss_normalizer + + @classmethod + def from_config(cls, cfg, input_shape): + ret = { + "loss_weight": cfg.MODEL.ROI_KEYPOINT_HEAD.LOSS_WEIGHT, + "num_keypoints": cfg.MODEL.ROI_KEYPOINT_HEAD.NUM_KEYPOINTS, + } + normalize_by_visible = ( + cfg.MODEL.ROI_KEYPOINT_HEAD.NORMALIZE_LOSS_BY_VISIBLE_KEYPOINTS + ) # noqa + if not normalize_by_visible: + batch_size_per_image = cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE + positive_sample_fraction = cfg.MODEL.ROI_HEADS.POSITIVE_FRACTION + ret["loss_normalizer"] = ( + ret["num_keypoints"] * batch_size_per_image * positive_sample_fraction + ) + else: + ret["loss_normalizer"] = "visible" + return ret + + def forward(self, x, instances: List[Instances]): + """ + Args: + x: input region feature(s) provided by :class:`ROIHeads`. + instances (list[Instances]): contains the boxes & labels corresponding + to the input features. + Exact format is up to its caller to decide. + Typically, this is the foreground instances in training, with + "proposal_boxes" field and other gt annotations. + In inference, it contains boxes that are already predicted. + + Returns: + A dict of losses if in training. The predicted "instances" if in inference. + """ + x = self.layers(x) + if self.training: + num_images = len(instances) + normalizer = ( + None if self.loss_normalizer == "visible" else num_images * self.loss_normalizer + ) + return { + "loss_keypoint": keypoint_rcnn_loss(x, instances, normalizer=normalizer) + * self.loss_weight + } + else: + keypoint_rcnn_inference(x, instances) + return instances + + def layers(self, x): + """ + Neural network layers that makes predictions from regional input features. + """ + raise NotImplementedError + + +@ROI_KEYPOINT_HEAD_REGISTRY.register() +class KRCNNConvDeconvUpsampleHead(BaseKeypointRCNNHead): + """ + A standard keypoint head containing a series of 3x3 convs, followed by + a transpose convolution and bilinear interpolation for upsampling. + """ + + @configurable + def __init__(self, input_shape, *, num_keypoints, conv_dims, **kwargs): + """ + NOTE: this interface is experimental. + + Args: + input_shape (ShapeSpec): shape of the input feature + conv_dims: an iterable of output channel counts for each conv in the head + e.g. (512, 512, 512) for three convs outputting 512 channels. + """ + super().__init__(num_keypoints=num_keypoints, **kwargs) + + # default up_scale to 2 (this can be made an option) + up_scale = 2 + in_channels = input_shape.channels + + self.blocks = [] + for idx, layer_channels in enumerate(conv_dims, 1): + module = Conv2d(in_channels, layer_channels, 3, stride=1, padding=1) + self.add_module("conv_fcn{}".format(idx), module) + self.blocks.append(module) + in_channels = layer_channels + + deconv_kernel = 4 + self.score_lowres = ConvTranspose2d( + in_channels, num_keypoints, deconv_kernel, stride=2, padding=deconv_kernel // 2 - 1 + ) + self.up_scale = up_scale + + for name, param in self.named_parameters(): + if "bias" in name: + nn.init.constant_(param, 0) + elif "weight" in name: + # Caffe2 implementation uses MSRAFill, which in fact + # corresponds to kaiming_normal_ in PyTorch + nn.init.kaiming_normal_(param, mode="fan_out", nonlinearity="relu") + + @classmethod + def from_config(cls, cfg, input_shape): + ret = super().from_config(cfg, input_shape) + ret["input_shape"] = input_shape + ret["conv_dims"] = cfg.MODEL.ROI_KEYPOINT_HEAD.CONV_DIMS + return ret + + def layers(self, x): + for layer in self.blocks: + x = F.relu(layer(x)) + x = self.score_lowres(x) + x = interpolate(x, scale_factor=self.up_scale, mode="bilinear", align_corners=False) + return x diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/mask_head.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/mask_head.py new file mode 100644 index 0000000..5209722 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/mask_head.py @@ -0,0 +1,277 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from typing import List +import fvcore.nn.weight_init as weight_init +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.config import configurable +from detectron2.layers import Conv2d, ConvTranspose2d, ShapeSpec, cat, get_norm +from detectron2.structures import Instances +from detectron2.utils.events import get_event_storage +from detectron2.utils.registry import Registry + +ROI_MASK_HEAD_REGISTRY = Registry("ROI_MASK_HEAD") +ROI_MASK_HEAD_REGISTRY.__doc__ = """ +Registry for mask heads, which predicts instance masks given +per-region features. + +The registered object will be called with `obj(cfg, input_shape)`. +""" + + +def mask_rcnn_loss(pred_mask_logits, instances, vis_period=0): + """ + Compute the mask prediction loss defined in the Mask R-CNN paper. + + Args: + pred_mask_logits (Tensor): A tensor of shape (B, C, Hmask, Wmask) or (B, 1, Hmask, Wmask) + for class-specific or class-agnostic, where B is the total number of predicted masks + in all images, C is the number of foreground classes, and Hmask, Wmask are the height + and width of the mask predictions. The values are logits. + instances (list[Instances]): A list of N Instances, where N is the number of images + in the batch. These instances are in 1:1 + correspondence with the pred_mask_logits. The ground-truth labels (class, box, mask, + ...) associated with each instance are stored in fields. + vis_period (int): the period (in steps) to dump visualization. + + Returns: + mask_loss (Tensor): A scalar tensor containing the loss. + """ + cls_agnostic_mask = pred_mask_logits.size(1) == 1 + total_num_masks = pred_mask_logits.size(0) + mask_side_len = pred_mask_logits.size(2) + assert pred_mask_logits.size(2) == pred_mask_logits.size(3), "Mask prediction must be square!" + + gt_classes = [] + gt_masks = [] + for instances_per_image in instances: + if len(instances_per_image) == 0: + continue + if not cls_agnostic_mask: + gt_classes_per_image = instances_per_image.gt_classes.to(dtype=torch.int64) + gt_classes.append(gt_classes_per_image) + + gt_masks_per_image = instances_per_image.gt_masks.crop_and_resize( + instances_per_image.proposal_boxes.tensor, mask_side_len + ).to(device=pred_mask_logits.device) + # A tensor of shape (N, M, M), N=#instances in the image; M=mask_side_len + gt_masks.append(gt_masks_per_image) + + if len(gt_masks) == 0: + return pred_mask_logits.sum() * 0 + + gt_masks = cat(gt_masks, dim=0) + + if cls_agnostic_mask: + pred_mask_logits = pred_mask_logits[:, 0] + else: + indices = torch.arange(total_num_masks) + gt_classes = cat(gt_classes, dim=0) + pred_mask_logits = pred_mask_logits[indices, gt_classes] + + if gt_masks.dtype == torch.bool: + gt_masks_bool = gt_masks + else: + # Here we allow gt_masks to be float as well (depend on the implementation of rasterize()) + gt_masks_bool = gt_masks > 0.5 + gt_masks = gt_masks.to(dtype=torch.float32) + + # Log the training accuracy (using gt classes and 0.5 threshold) + mask_incorrect = (pred_mask_logits > 0.0) != gt_masks_bool + mask_accuracy = 1 - (mask_incorrect.sum().item() / max(mask_incorrect.numel(), 1.0)) + num_positive = gt_masks_bool.sum().item() + false_positive = (mask_incorrect & ~gt_masks_bool).sum().item() / max( + gt_masks_bool.numel() - num_positive, 1.0 + ) + false_negative = (mask_incorrect & gt_masks_bool).sum().item() / max(num_positive, 1.0) + + storage = get_event_storage() + storage.put_scalar("mask_rcnn/accuracy", mask_accuracy) + storage.put_scalar("mask_rcnn/false_positive", false_positive) + storage.put_scalar("mask_rcnn/false_negative", false_negative) + if vis_period > 0 and storage.iter % vis_period == 0: + pred_masks = pred_mask_logits.sigmoid() + vis_masks = torch.cat([pred_masks, gt_masks], axis=2) + name = "Left: mask prediction; Right: mask GT" + for idx, vis_mask in enumerate(vis_masks): + vis_mask = torch.stack([vis_mask] * 3, axis=0) + storage.put_image(name + f" ({idx})", vis_mask) + + mask_loss = F.binary_cross_entropy_with_logits(pred_mask_logits, gt_masks, reduction="mean") + return mask_loss + + +def mask_rcnn_inference(pred_mask_logits, pred_instances): + """ + Convert pred_mask_logits to estimated foreground probability masks while also + extracting only the masks for the predicted classes in pred_instances. For each + predicted box, the mask of the same class is attached to the instance by adding a + new "pred_masks" field to pred_instances. + + Args: + pred_mask_logits (Tensor): A tensor of shape (B, C, Hmask, Wmask) or (B, 1, Hmask, Wmask) + for class-specific or class-agnostic, where B is the total number of predicted masks + in all images, C is the number of foreground classes, and Hmask, Wmask are the height + and width of the mask predictions. The values are logits. + pred_instances (list[Instances]): A list of N Instances, where N is the number of images + in the batch. Each Instances must have field "pred_classes". + + Returns: + None. pred_instances will contain an extra "pred_masks" field storing a mask of size (Hmask, + Wmask) for predicted class. Note that the masks are returned as a soft (non-quantized) + masks the resolution predicted by the network; post-processing steps, such as resizing + the predicted masks to the original image resolution and/or binarizing them, is left + to the caller. + """ + cls_agnostic_mask = pred_mask_logits.size(1) == 1 + + if cls_agnostic_mask: + mask_probs_pred = pred_mask_logits.sigmoid() + else: + # Select masks corresponding to the predicted classes + num_masks = pred_mask_logits.shape[0] + class_pred = cat([i.pred_classes for i in pred_instances]) + indices = torch.arange(num_masks, device=class_pred.device) + mask_probs_pred = pred_mask_logits[indices, class_pred][:, None].sigmoid() + # mask_probs_pred.shape: (B, 1, Hmask, Wmask) + + num_boxes_per_image = [len(i) for i in pred_instances] + mask_probs_pred = mask_probs_pred.split(num_boxes_per_image, dim=0) + + for prob, instances in zip(mask_probs_pred, pred_instances): + instances.pred_masks = prob # (1, Hmask, Wmask) + + +class BaseMaskRCNNHead(nn.Module): + """ + Implement the basic Mask R-CNN losses and inference logic described in :paper:`Mask R-CNN` + """ + + @configurable + def __init__(self, *, vis_period=0): + """ + NOTE: this interface is experimental. + + Args: + vis_period (int): visualization period + """ + super().__init__() + self.vis_period = vis_period + + @classmethod + def from_config(cls, cfg, input_shape): + return {"vis_period": cfg.VIS_PERIOD} + + def forward(self, x, instances: List[Instances]): + """ + Args: + x: input region feature(s) provided by :class:`ROIHeads`. + instances (list[Instances]): contains the boxes & labels corresponding + to the input features. + Exact format is up to its caller to decide. + Typically, this is the foreground instances in training, with + "proposal_boxes" field and other gt annotations. + In inference, it contains boxes that are already predicted. + + Returns: + A dict of losses in training. The predicted "instances" in inference. + """ + x = self.layers(x) + if self.training: + return {"loss_mask": mask_rcnn_loss(x, instances, self.vis_period)} + else: + mask_rcnn_inference(x, instances) + return instances + + def layers(self, x): + """ + Neural network layers that makes predictions from input features. + """ + raise NotImplementedError + + +@ROI_MASK_HEAD_REGISTRY.register() +class MaskRCNNConvUpsampleHead(BaseMaskRCNNHead): + """ + A mask head with several conv layers, plus an upsample layer (with `ConvTranspose2d`). + Predictions are made with a final 1x1 conv layer. + """ + + @configurable + def __init__(self, input_shape: ShapeSpec, *, num_classes, conv_dims, conv_norm="", **kwargs): + """ + NOTE: this interface is experimental. + + Args: + input_shape (ShapeSpec): shape of the input feature + num_classes (int): the number of classes. 1 if using class agnostic prediction. + conv_dims (list[int]): a list of N>0 integers representing the output dimensions + of N-1 conv layers and the last upsample layer. + conv_norm (str or callable): normalization for the conv layers. + See :func:`detectron2.layers.get_norm` for supported types. + """ + super().__init__(**kwargs) + assert len(conv_dims) >= 1, "conv_dims have to be non-empty!" + + self.conv_norm_relus = [] + + cur_channels = input_shape.channels + for k, conv_dim in enumerate(conv_dims[:-1]): + conv = Conv2d( + cur_channels, + conv_dim, + kernel_size=3, + stride=1, + padding=1, + bias=not conv_norm, + norm=get_norm(conv_norm, conv_dim), + activation=F.relu, + ) + self.add_module("mask_fcn{}".format(k + 1), conv) + self.conv_norm_relus.append(conv) + cur_channels = conv_dim + + self.deconv = ConvTranspose2d( + cur_channels, conv_dims[-1], kernel_size=2, stride=2, padding=0 + ) + cur_channels = conv_dims[-1] + + self.predictor = Conv2d(cur_channels, num_classes, kernel_size=1, stride=1, padding=0) + + for layer in self.conv_norm_relus + [self.deconv]: + weight_init.c2_msra_fill(layer) + # use normal distribution initialization for mask prediction layer + nn.init.normal_(self.predictor.weight, std=0.001) + if self.predictor.bias is not None: + nn.init.constant_(self.predictor.bias, 0) + + @classmethod + def from_config(cls, cfg, input_shape): + ret = super().from_config(cfg, input_shape) + conv_dim = cfg.MODEL.ROI_MASK_HEAD.CONV_DIM + num_conv = cfg.MODEL.ROI_MASK_HEAD.NUM_CONV + ret.update( + conv_dims=[conv_dim] * (num_conv + 1), # +1 for ConvTranspose + conv_norm=cfg.MODEL.ROI_MASK_HEAD.NORM, + input_shape=input_shape, + ) + if cfg.MODEL.ROI_MASK_HEAD.CLS_AGNOSTIC_MASK: + ret["num_classes"] = 1 + else: + ret["num_classes"] = cfg.MODEL.ROI_HEADS.NUM_CLASSES + return ret + + def layers(self, x): + for layer in self.conv_norm_relus: + x = layer(x) + x = F.relu(self.deconv(x)) + return self.predictor(x) + + +def build_mask_head(cfg, input_shape): + """ + Build a mask head defined by `cfg.MODEL.ROI_MASK_HEAD.NAME`. + """ + name = cfg.MODEL.ROI_MASK_HEAD.NAME + return ROI_MASK_HEAD_REGISTRY.get(name)(cfg, input_shape) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/roi_heads.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/roi_heads.py new file mode 100644 index 0000000..f35588e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/roi_heads.py @@ -0,0 +1,812 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import inspect +import logging +import numpy as np +from typing import Dict, List, Optional, Tuple, Union +import torch +from torch import nn + +from detectron2.config import configurable +from detectron2.layers import ShapeSpec +from detectron2.structures import Boxes, ImageList, Instances, pairwise_iou +from detectron2.utils.events import get_event_storage +from detectron2.utils.registry import Registry + +from ..backbone.resnet import BottleneckBlock, make_stage +from ..matcher import Matcher +from ..poolers import ROIPooler +from ..proposal_generator.proposal_utils import add_ground_truth_to_proposals +from ..sampling import subsample_labels +from .box_head import build_box_head +from .fast_rcnn import FastRCNNOutputLayers +from .keypoint_head import build_keypoint_head +from .mask_head import build_mask_head + +ROI_HEADS_REGISTRY = Registry("ROI_HEADS") +ROI_HEADS_REGISTRY.__doc__ = """ +Registry for ROI heads in a generalized R-CNN model. +ROIHeads take feature maps and region proposals, and +perform per-region computation. + +The registered object will be called with `obj(cfg, input_shape)`. +The call is expected to return an :class:`ROIHeads`. +""" + +logger = logging.getLogger(__name__) + + +def build_roi_heads(cfg, input_shape): + """ + Build ROIHeads defined by `cfg.MODEL.ROI_HEADS.NAME`. + """ + name = cfg.MODEL.ROI_HEADS.NAME + return ROI_HEADS_REGISTRY.get(name)(cfg, input_shape) + + +def select_foreground_proposals( + proposals: List[Instances], bg_label: int +) -> Tuple[List[Instances], List[torch.Tensor]]: + """ + Given a list of N Instances (for N images), each containing a `gt_classes` field, + return a list of Instances that contain only instances with `gt_classes != -1 && + gt_classes != bg_label`. + + Args: + proposals (list[Instances]): A list of N Instances, where N is the number of + images in the batch. + bg_label: label index of background class. + + Returns: + list[Instances]: N Instances, each contains only the selected foreground instances. + list[Tensor]: N boolean vector, correspond to the selection mask of + each Instances object. True for selected instances. + """ + assert isinstance(proposals, (list, tuple)) + assert isinstance(proposals[0], Instances) + assert proposals[0].has("gt_classes") + fg_proposals = [] + fg_selection_masks = [] + for proposals_per_image in proposals: + gt_classes = proposals_per_image.gt_classes + fg_selection_mask = (gt_classes != -1) & (gt_classes != bg_label) + fg_idxs = fg_selection_mask.nonzero().squeeze(1) + fg_proposals.append(proposals_per_image[fg_idxs]) + fg_selection_masks.append(fg_selection_mask) + return fg_proposals, fg_selection_masks + + +def select_proposals_with_visible_keypoints(proposals: List[Instances]) -> List[Instances]: + """ + Args: + proposals (list[Instances]): a list of N Instances, where N is the + number of images. + + Returns: + proposals: only contains proposals with at least one visible keypoint. + + Note that this is still slightly different from Detectron. + In Detectron, proposals for training keypoint head are re-sampled from + all the proposals with IOU>threshold & >=1 visible keypoint. + + Here, the proposals are first sampled from all proposals with + IOU>threshold, then proposals with no visible keypoint are filtered out. + This strategy seems to make no difference on Detectron and is easier to implement. + """ + ret = [] + all_num_fg = [] + for proposals_per_image in proposals: + # If empty/unannotated image (hard negatives), skip filtering for train + if len(proposals_per_image) == 0: + ret.append(proposals_per_image) + continue + gt_keypoints = proposals_per_image.gt_keypoints.tensor + # #fg x K x 3 + vis_mask = gt_keypoints[:, :, 2] >= 1 + xs, ys = gt_keypoints[:, :, 0], gt_keypoints[:, :, 1] + proposal_boxes = proposals_per_image.proposal_boxes.tensor.unsqueeze(dim=1) # #fg x 1 x 4 + kp_in_box = ( + (xs >= proposal_boxes[:, :, 0]) + & (xs <= proposal_boxes[:, :, 2]) + & (ys >= proposal_boxes[:, :, 1]) + & (ys <= proposal_boxes[:, :, 3]) + ) + selection = (kp_in_box & vis_mask).any(dim=1) + selection_idxs = torch.nonzero(selection, as_tuple=True)[0] + all_num_fg.append(selection_idxs.numel()) + ret.append(proposals_per_image[selection_idxs]) + + storage = get_event_storage() + storage.put_scalar("keypoint_head/num_fg_samples", np.mean(all_num_fg)) + return ret + + +class ROIHeads(torch.nn.Module): + """ + ROIHeads perform all per-region computation in an R-CNN. + + It typically contains logic to + 1. (in training only) match proposals with ground truth and sample them + 2. crop the regions and extract per-region features using proposals + 3. make per-region predictions with different heads + + It can have many variants, implemented as subclasses of this class. + This base class contains the logic to match/sample proposals. + But it is not necessary to inherit this class if the sampling logic is not needed. + """ + + @configurable + def __init__( + self, + *, + num_classes, + batch_size_per_image, + positive_sample_fraction, + proposal_matcher, + proposal_append_gt=True + ): + """ + NOTE: this interface is experimental. + + Args: + num_classes (int): number of classes. Used to label background proposals. + batch_size_per_image (int): number of proposals to use for training + positive_sample_fraction (float): fraction of positive (foreground) proposals + to use for training. + proposal_matcher (Matcher): matcher that matches proposals and ground truth + proposal_append_gt (bool): whether to include ground truth as proposals as well + """ + super().__init__() + self.batch_size_per_image = batch_size_per_image + self.positive_sample_fraction = positive_sample_fraction + self.num_classes = num_classes + self.proposal_matcher = proposal_matcher + self.proposal_append_gt = proposal_append_gt + + @classmethod + def from_config(cls, cfg): + return { + "batch_size_per_image": cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE, + "positive_sample_fraction": cfg.MODEL.ROI_HEADS.POSITIVE_FRACTION, + "num_classes": cfg.MODEL.ROI_HEADS.NUM_CLASSES, + "proposal_append_gt": cfg.MODEL.ROI_HEADS.PROPOSAL_APPEND_GT, + # Matcher to assign box proposals to gt boxes + "proposal_matcher": Matcher( + cfg.MODEL.ROI_HEADS.IOU_THRESHOLDS, + cfg.MODEL.ROI_HEADS.IOU_LABELS, + allow_low_quality_matches=False, + ), + } + + def _sample_proposals( + self, matched_idxs: torch.Tensor, matched_labels: torch.Tensor, gt_classes: torch.Tensor + ) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Based on the matching between N proposals and M groundtruth, + sample the proposals and set their classification labels. + + Args: + matched_idxs (Tensor): a vector of length N, each is the best-matched + gt index in [0, M) for each proposal. + matched_labels (Tensor): a vector of length N, the matcher's label + (one of cfg.MODEL.ROI_HEADS.IOU_LABELS) for each proposal. + gt_classes (Tensor): a vector of length M. + + Returns: + Tensor: a vector of indices of sampled proposals. Each is in [0, N). + Tensor: a vector of the same length, the classification label for + each sampled proposal. Each sample is labeled as either a category in + [0, num_classes) or the background (num_classes). + """ + has_gt = gt_classes.numel() > 0 + # Get the corresponding GT for each proposal + if has_gt: + gt_classes = gt_classes[matched_idxs] + # Label unmatched proposals (0 label from matcher) as background (label=num_classes) + gt_classes[matched_labels == 0] = self.num_classes + # Label ignore proposals (-1 label) + gt_classes[matched_labels == -1] = -1 + else: + gt_classes = torch.zeros_like(matched_idxs) + self.num_classes + + sampled_fg_idxs, sampled_bg_idxs = subsample_labels( + gt_classes, self.batch_size_per_image, self.positive_sample_fraction, self.num_classes + ) + + sampled_idxs = torch.cat([sampled_fg_idxs, sampled_bg_idxs], dim=0) + return sampled_idxs, gt_classes[sampled_idxs] + + @torch.no_grad() + def label_and_sample_proposals( + self, proposals: List[Instances], targets: List[Instances] + ) -> List[Instances]: + """ + Prepare some proposals to be used to train the ROI heads. + It performs box matching between `proposals` and `targets`, and assigns + training labels to the proposals. + It returns ``self.batch_size_per_image`` random samples from proposals and groundtruth + boxes, with a fraction of positives that is no larger than + ``self.positive_sample_fraction``. + + Args: + See :meth:`ROIHeads.forward` + + Returns: + list[Instances]: + length `N` list of `Instances`s containing the proposals + sampled for training. Each `Instances` has the following fields: + + - proposal_boxes: the proposal boxes + - gt_boxes: the ground-truth box that the proposal is assigned to + (this is only meaningful if the proposal has a label > 0; if label = 0 + then the ground-truth box is random) + + Other fields such as "gt_classes", "gt_masks", that's included in `targets`. + """ + gt_boxes = [x.gt_boxes for x in targets] + # Augment proposals with ground-truth boxes. + # In the case of learned proposals (e.g., RPN), when training starts + # the proposals will be low quality due to random initialization. + # It's possible that none of these initial + # proposals have high enough overlap with the gt objects to be used + # as positive examples for the second stage components (box head, + # cls head, mask head). Adding the gt boxes to the set of proposals + # ensures that the second stage components will have some positive + # examples from the start of training. For RPN, this augmentation improves + # convergence and empirically improves box AP on COCO by about 0.5 + # points (under one tested configuration). + if self.proposal_append_gt: + proposals = add_ground_truth_to_proposals(gt_boxes, proposals) + + proposals_with_gt = [] + + num_fg_samples = [] + num_bg_samples = [] + for proposals_per_image, targets_per_image in zip(proposals, targets): + has_gt = len(targets_per_image) > 0 + match_quality_matrix = pairwise_iou( + targets_per_image.gt_boxes, proposals_per_image.proposal_boxes + ) + matched_idxs, matched_labels = self.proposal_matcher(match_quality_matrix) + sampled_idxs, gt_classes = self._sample_proposals( + matched_idxs, matched_labels, targets_per_image.gt_classes + ) + + # Set target attributes of the sampled proposals: + proposals_per_image = proposals_per_image[sampled_idxs] + proposals_per_image.gt_classes = gt_classes + + # We index all the attributes of targets that start with "gt_" + # and have not been added to proposals yet (="gt_classes"). + if has_gt: + sampled_targets = matched_idxs[sampled_idxs] + # NOTE: here the indexing waste some compute, because heads + # like masks, keypoints, etc, will filter the proposals again, + # (by foreground/background, or number of keypoints in the image, etc) + # so we essentially index the data twice. + for (trg_name, trg_value) in targets_per_image.get_fields().items(): + if trg_name.startswith("gt_") and not proposals_per_image.has(trg_name): + proposals_per_image.set(trg_name, trg_value[sampled_targets]) + else: + gt_boxes = Boxes( + targets_per_image.gt_boxes.tensor.new_zeros((len(sampled_idxs), 4)) + ) + proposals_per_image.gt_boxes = gt_boxes + + num_bg_samples.append((gt_classes == self.num_classes).sum().item()) + num_fg_samples.append(gt_classes.numel() - num_bg_samples[-1]) + proposals_with_gt.append(proposals_per_image) + + # Log the number of fg/bg samples that are selected for training ROI heads + storage = get_event_storage() + storage.put_scalar("roi_head/num_fg_samples", np.mean(num_fg_samples)) + storage.put_scalar("roi_head/num_bg_samples", np.mean(num_bg_samples)) + + return proposals_with_gt + + def forward( + self, + images: ImageList, + features: Dict[str, torch.Tensor], + proposals: List[Instances], + targets: Optional[List[Instances]] = None, + ) -> Tuple[List[Instances], Dict[str, torch.Tensor]]: + """ + Args: + images (ImageList): + features (dict[str,Tensor]): input data as a mapping from feature + map name to tensor. Axis 0 represents the number of images `N` in + the input data; axes 1-3 are channels, height, and width, which may + vary between feature maps (e.g., if a feature pyramid is used). + proposals (list[Instances]): length `N` list of `Instances`. The i-th + `Instances` contains object proposals for the i-th input image, + with fields "proposal_boxes" and "objectness_logits". + targets (list[Instances], optional): length `N` list of `Instances`. The i-th + `Instances` contains the ground-truth per-instance annotations + for the i-th input image. Specify `targets` during training only. + It may have the following fields: + + - gt_boxes: the bounding box of each instance. + - gt_classes: the label for each instance with a category ranging in [0, #class]. + - gt_masks: PolygonMasks or BitMasks, the ground-truth masks of each instance. + - gt_keypoints: NxKx3, the groud-truth keypoints for each instance. + + Returns: + list[Instances]: length `N` list of `Instances` containing the + detected instances. Returned during inference only; may be [] during training. + + dict[str->Tensor]: + mapping from a named loss to a tensor storing the loss. Used during training only. + """ + raise NotImplementedError() + + +@ROI_HEADS_REGISTRY.register() +class Res5ROIHeads(ROIHeads): + """ + The ROIHeads in a typical "C4" R-CNN model, where + the box and mask head share the cropping and + the per-region feature computation by a Res5 block. + """ + + def __init__(self, cfg, input_shape): + super().__init__(cfg) + + # fmt: off + self.in_features = cfg.MODEL.ROI_HEADS.IN_FEATURES + pooler_resolution = cfg.MODEL.ROI_BOX_HEAD.POOLER_RESOLUTION + pooler_type = cfg.MODEL.ROI_BOX_HEAD.POOLER_TYPE + pooler_scales = (1.0 / input_shape[self.in_features[0]].stride, ) + sampling_ratio = cfg.MODEL.ROI_BOX_HEAD.POOLER_SAMPLING_RATIO + self.mask_on = cfg.MODEL.MASK_ON + # fmt: on + assert not cfg.MODEL.KEYPOINT_ON + assert len(self.in_features) == 1 + + self.pooler = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type=pooler_type, + ) + + self.res5, out_channels = self._build_res5_block(cfg) + self.box_predictor = FastRCNNOutputLayers( + cfg, ShapeSpec(channels=out_channels, height=1, width=1) + ) + + if self.mask_on: + self.mask_head = build_mask_head( + cfg, + ShapeSpec(channels=out_channels, width=pooler_resolution, height=pooler_resolution), + ) + + def _build_res5_block(self, cfg): + # fmt: off + stage_channel_factor = 2 ** 3 # res5 is 8x res2 + num_groups = cfg.MODEL.RESNETS.NUM_GROUPS + width_per_group = cfg.MODEL.RESNETS.WIDTH_PER_GROUP + bottleneck_channels = num_groups * width_per_group * stage_channel_factor + out_channels = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS * stage_channel_factor + stride_in_1x1 = cfg.MODEL.RESNETS.STRIDE_IN_1X1 + norm = cfg.MODEL.RESNETS.NORM + assert not cfg.MODEL.RESNETS.DEFORM_ON_PER_STAGE[-1], \ + "Deformable conv is not yet supported in res5 head." + # fmt: on + + blocks = make_stage( + BottleneckBlock, + 3, + first_stride=2, + in_channels=out_channels // 2, + bottleneck_channels=bottleneck_channels, + out_channels=out_channels, + num_groups=num_groups, + norm=norm, + stride_in_1x1=stride_in_1x1, + ) + return nn.Sequential(*blocks), out_channels + + def _shared_roi_transform(self, features, boxes): + x = self.pooler(features, boxes) + return self.res5(x) + + def forward(self, images, features, proposals, targets=None): + """ + See :meth:`ROIHeads.forward`. + """ + del images + + if self.training: + assert targets + proposals = self.label_and_sample_proposals(proposals, targets) + del targets + + proposal_boxes = [x.proposal_boxes for x in proposals] + box_features = self._shared_roi_transform( + [features[f] for f in self.in_features], proposal_boxes + ) + predictions = self.box_predictor(box_features.mean(dim=[2, 3])) + + if self.training: + del features + losses = self.box_predictor.losses(predictions, proposals) + if self.mask_on: + proposals, fg_selection_masks = select_foreground_proposals( + proposals, self.num_classes + ) + # Since the ROI feature transform is shared between boxes and masks, + # we don't need to recompute features. The mask loss is only defined + # on foreground proposals, so we need to select out the foreground + # features. + mask_features = box_features[torch.cat(fg_selection_masks, dim=0)] + del box_features + losses.update(self.mask_head(mask_features, proposals)) + return [], losses + else: + pred_instances, _ = self.box_predictor.inference(predictions, proposals) + pred_instances = self.forward_with_given_boxes(features, pred_instances) + return pred_instances, {} + + def forward_with_given_boxes(self, features, instances): + """ + Use the given boxes in `instances` to produce other (non-box) per-ROI outputs. + + Args: + features: same as in `forward()` + instances (list[Instances]): instances to predict other outputs. Expect the keys + "pred_boxes" and "pred_classes" to exist. + + Returns: + instances (Instances): + the same `Instances` object, with extra + fields such as `pred_masks` or `pred_keypoints`. + """ + assert not self.training + assert instances[0].has("pred_boxes") and instances[0].has("pred_classes") + + if self.mask_on: + features = [features[f] for f in self.in_features] + x = self._shared_roi_transform(features, [x.pred_boxes for x in instances]) + return self.mask_head(x, instances) + else: + return instances + + +@ROI_HEADS_REGISTRY.register() +class StandardROIHeads(ROIHeads): + """ + It's "standard" in a sense that there is no ROI transform sharing + or feature sharing between tasks. + Each head independently processes the input features by each head's + own pooler and head. + + This class is used by most models, such as FPN and C5. + To implement more models, you can subclass it and implement a different + :meth:`forward()` or a head. + """ + + @configurable + def __init__( + self, + *, + box_in_features: List[str], + box_pooler: ROIPooler, + box_head: nn.Module, + box_predictor: nn.Module, + mask_in_features: Optional[List[str]] = None, + mask_pooler: Optional[ROIPooler] = None, + mask_head: Optional[nn.Module] = None, + keypoint_in_features: Optional[List[str]] = None, + keypoint_pooler: Optional[ROIPooler] = None, + keypoint_head: Optional[nn.Module] = None, + train_on_pred_boxes: bool = False, + **kwargs + ): + """ + NOTE: this interface is experimental. + + Args: + box_in_features (list[str]): list of feature names to use for the box head. + box_pooler (ROIPooler): pooler to extra region features for box head + box_head (nn.Module): transform features to make box predictions + box_predictor (nn.Module): make box predictions from the feature. + Should have the same interface as :class:`FastRCNNOutputLayers`. + mask_in_features (list[str]): list of feature names to use for the mask head. + None if not using mask head. + mask_pooler (ROIPooler): pooler to extra region features for mask head + mask_head (nn.Module): transform features to make mask predictions + keypoint_in_features, keypoint_pooler, keypoint_head: similar to ``mask*``. + train_on_pred_boxes (bool): whether to use proposal boxes or + predicted boxes from the box head to train other heads. + """ + super().__init__(**kwargs) + # keep self.in_features for backward compatibility + self.in_features = self.box_in_features = box_in_features + self.box_pooler = box_pooler + self.box_head = box_head + self.box_predictor = box_predictor + + self.mask_on = mask_in_features is not None + if self.mask_on: + self.mask_in_features = mask_in_features + self.mask_pooler = mask_pooler + self.mask_head = mask_head + self.keypoint_on = keypoint_in_features is not None + if self.keypoint_on: + self.keypoint_in_features = keypoint_in_features + self.keypoint_pooler = keypoint_pooler + self.keypoint_head = keypoint_head + + self.train_on_pred_boxes = train_on_pred_boxes + + @classmethod + def from_config(cls, cfg, input_shape): + ret = super().from_config(cfg) + ret["train_on_pred_boxes"] = cfg.MODEL.ROI_BOX_HEAD.TRAIN_ON_PRED_BOXES + # Subclasses that have not been updated to use from_config style construction + # may have overridden _init_*_head methods. In this case, those overridden methods + # will not be classmethods and we need to avoid trying to call them here. + # We test for this with ismethod which only returns True for bound methods of cls. + # Such subclasses will need to handle calling their overridden _init_*_head methods. + if inspect.ismethod(cls._init_box_head): + ret.update(cls._init_box_head(cfg, input_shape)) + if inspect.ismethod(cls._init_mask_head): + ret.update(cls._init_mask_head(cfg, input_shape)) + if inspect.ismethod(cls._init_keypoint_head): + ret.update(cls._init_keypoint_head(cfg, input_shape)) + return ret + + @classmethod + def _init_box_head(cls, cfg, input_shape): + # fmt: off + in_features = cfg.MODEL.ROI_HEADS.IN_FEATURES + pooler_resolution = cfg.MODEL.ROI_BOX_HEAD.POOLER_RESOLUTION + pooler_scales = tuple(1.0 / input_shape[k].stride for k in in_features) + sampling_ratio = cfg.MODEL.ROI_BOX_HEAD.POOLER_SAMPLING_RATIO + pooler_type = cfg.MODEL.ROI_BOX_HEAD.POOLER_TYPE + # fmt: on + + # If StandardROIHeads is applied on multiple feature maps (as in FPN), + # then we share the same predictors and therefore the channel counts must be the same + in_channels = [input_shape[f].channels for f in in_features] + # Check all channel counts are equal + assert len(set(in_channels)) == 1, in_channels + in_channels = in_channels[0] + + box_pooler = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type=pooler_type, + ) + # Here we split "box head" and "box predictor", which is mainly due to historical reasons. + # They are used together so the "box predictor" layers should be part of the "box head". + # New subclasses of ROIHeads do not need "box predictor"s. + box_head = build_box_head( + cfg, ShapeSpec(channels=in_channels, height=pooler_resolution, width=pooler_resolution) + ) + box_predictor = FastRCNNOutputLayers(cfg, box_head.output_shape) + return { + "box_in_features": in_features, + "box_pooler": box_pooler, + "box_head": box_head, + "box_predictor": box_predictor, + } + + @classmethod + def _init_mask_head(cls, cfg, input_shape): + if not cfg.MODEL.MASK_ON: + return {} + # fmt: off + in_features = cfg.MODEL.ROI_HEADS.IN_FEATURES + pooler_resolution = cfg.MODEL.ROI_MASK_HEAD.POOLER_RESOLUTION + pooler_scales = tuple(1.0 / input_shape[k].stride for k in in_features) + sampling_ratio = cfg.MODEL.ROI_MASK_HEAD.POOLER_SAMPLING_RATIO + pooler_type = cfg.MODEL.ROI_MASK_HEAD.POOLER_TYPE + # fmt: on + + in_channels = [input_shape[f].channels for f in in_features][0] + + ret = {"mask_in_features": in_features} + ret["mask_pooler"] = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type=pooler_type, + ) + ret["mask_head"] = build_mask_head( + cfg, ShapeSpec(channels=in_channels, width=pooler_resolution, height=pooler_resolution) + ) + return ret + + @classmethod + def _init_keypoint_head(cls, cfg, input_shape): + if not cfg.MODEL.KEYPOINT_ON: + return {} + # fmt: off + in_features = cfg.MODEL.ROI_HEADS.IN_FEATURES + pooler_resolution = cfg.MODEL.ROI_KEYPOINT_HEAD.POOLER_RESOLUTION + pooler_scales = tuple(1.0 / input_shape[k].stride for k in in_features) # noqa + sampling_ratio = cfg.MODEL.ROI_KEYPOINT_HEAD.POOLER_SAMPLING_RATIO + pooler_type = cfg.MODEL.ROI_KEYPOINT_HEAD.POOLER_TYPE + # fmt: on + + in_channels = [input_shape[f].channels for f in in_features][0] + + ret = {"keypoint_in_features": in_features} + ret["keypoint_pooler"] = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type=pooler_type, + ) + ret["keypoint_head"] = build_keypoint_head( + cfg, ShapeSpec(channels=in_channels, width=pooler_resolution, height=pooler_resolution) + ) + return ret + + def forward( + self, + images: ImageList, + features: Dict[str, torch.Tensor], + proposals: List[Instances], + targets: Optional[List[Instances]] = None, + ) -> Tuple[List[Instances], Dict[str, torch.Tensor]]: + """ + See :class:`ROIHeads.forward`. + """ + del images + if self.training: + assert targets + proposals = self.label_and_sample_proposals(proposals, targets) + del targets + + if self.training: + losses = self._forward_box(features, proposals) + # Usually the original proposals used by the box head are used by the mask, keypoint + # heads. But when `self.train_on_pred_boxes is True`, proposals will contain boxes + # predicted by the box head. + losses.update(self._forward_mask(features, proposals)) + losses.update(self._forward_keypoint(features, proposals)) + return proposals, losses + else: + pred_instances = self._forward_box(features, proposals) + # During inference cascaded prediction is used: the mask and keypoints heads are only + # applied to the top scoring box detections. + pred_instances = self.forward_with_given_boxes(features, pred_instances) + return pred_instances, {} + + def forward_with_given_boxes( + self, features: Dict[str, torch.Tensor], instances: List[Instances] + ) -> List[Instances]: + """ + Use the given boxes in `instances` to produce other (non-box) per-ROI outputs. + + This is useful for downstream tasks where a box is known, but need to obtain + other attributes (outputs of other heads). + Test-time augmentation also uses this. + + Args: + features: same as in `forward()` + instances (list[Instances]): instances to predict other outputs. Expect the keys + "pred_boxes" and "pred_classes" to exist. + + Returns: + instances (list[Instances]): + the same `Instances` objects, with extra + fields such as `pred_masks` or `pred_keypoints`. + """ + assert not self.training + assert instances[0].has("pred_boxes") and instances[0].has("pred_classes") + + instances = self._forward_mask(features, instances) + instances = self._forward_keypoint(features, instances) + return instances + + def _forward_box( + self, features: Dict[str, torch.Tensor], proposals: List[Instances] + ) -> Union[Dict[str, torch.Tensor], List[Instances]]: + """ + Forward logic of the box prediction branch. If `self.train_on_pred_boxes is True`, + the function puts predicted boxes in the `proposal_boxes` field of `proposals` argument. + + Args: + features (dict[str, Tensor]): mapping from feature map names to tensor. + Same as in :meth:`ROIHeads.forward`. + proposals (list[Instances]): the per-image object proposals with + their matching ground truth. + Each has fields "proposal_boxes", and "objectness_logits", + "gt_classes", "gt_boxes". + + Returns: + In training, a dict of losses. + In inference, a list of `Instances`, the predicted instances. + """ + features = [features[f] for f in self.box_in_features] + box_features = self.box_pooler(features, [x.proposal_boxes for x in proposals]) + box_features = self.box_head(box_features) + predictions = self.box_predictor(box_features) + del box_features + + if self.training: + losses = self.box_predictor.losses(predictions, proposals) + # proposals is modified in-place below, so losses must be computed first. + if self.train_on_pred_boxes: + with torch.no_grad(): + pred_boxes = self.box_predictor.predict_boxes_for_gt_classes( + predictions, proposals + ) + for proposals_per_image, pred_boxes_per_image in zip(proposals, pred_boxes): + proposals_per_image.proposal_boxes = Boxes(pred_boxes_per_image) + return losses + else: + pred_instances, _ = self.box_predictor.inference(predictions, proposals) + return pred_instances + + def _forward_mask( + self, features: Dict[str, torch.Tensor], instances: List[Instances] + ) -> Union[Dict[str, torch.Tensor], List[Instances]]: + """ + Forward logic of the mask prediction branch. + + Args: + features (dict[str, Tensor]): mapping from feature map names to tensor. + Same as in :meth:`ROIHeads.forward`. + instances (list[Instances]): the per-image instances to train/predict masks. + In training, they can be the proposals. + In inference, they can be the predicted boxes. + + Returns: + In training, a dict of losses. + In inference, update `instances` with new fields "pred_masks" and return it. + """ + if not self.mask_on: + return {} if self.training else instances + + features = [features[f] for f in self.mask_in_features] + + if self.training: + # The loss is only defined on positive proposals. + proposals, _ = select_foreground_proposals(instances, self.num_classes) + proposal_boxes = [x.proposal_boxes for x in proposals] + mask_features = self.mask_pooler(features, proposal_boxes) + return self.mask_head(mask_features, proposals) + else: + pred_boxes = [x.pred_boxes for x in instances] + mask_features = self.mask_pooler(features, pred_boxes) + return self.mask_head(mask_features, instances) + + def _forward_keypoint( + self, features: Dict[str, torch.Tensor], instances: List[Instances] + ) -> Union[Dict[str, torch.Tensor], List[Instances]]: + """ + Forward logic of the keypoint prediction branch. + + Args: + features (dict[str, Tensor]): mapping from feature map names to tensor. + Same as in :meth:`ROIHeads.forward`. + instances (list[Instances]): the per-image instances to train/predict keypoints. + In training, they can be the proposals. + In inference, they can be the predicted boxes. + + Returns: + In training, a dict of losses. + In inference, update `instances` with new fields "pred_keypoints" and return it. + """ + if not self.keypoint_on: + return {} if self.training else instances + + features = [features[f] for f in self.keypoint_in_features] + + if self.training: + # The loss is defined on positive proposals with >=1 visible keypoints. + proposals, _ = select_foreground_proposals(instances, self.num_classes) + proposals = select_proposals_with_visible_keypoints(proposals) + proposal_boxes = [x.proposal_boxes for x in proposals] + + keypoint_features = self.keypoint_pooler(features, proposal_boxes) + return self.keypoint_head(keypoint_features, proposals) + else: + pred_boxes = [x.pred_boxes for x in instances] + keypoint_features = self.keypoint_pooler(features, pred_boxes) + return self.keypoint_head(keypoint_features, instances) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/rotated_fast_rcnn.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/rotated_fast_rcnn.py new file mode 100644 index 0000000..3d7362d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/roi_heads/rotated_fast_rcnn.py @@ -0,0 +1,276 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import numpy as np +import torch + +from detectron2.config import configurable +from detectron2.layers import ShapeSpec, batched_nms_rotated +from detectron2.structures import Instances, RotatedBoxes, pairwise_iou_rotated +from detectron2.utils.events import get_event_storage + +from ..box_regression import Box2BoxTransformRotated +from ..poolers import ROIPooler +from ..proposal_generator.proposal_utils import add_ground_truth_to_proposals +from .box_head import build_box_head +from .fast_rcnn import FastRCNNOutputLayers +from .roi_heads import ROI_HEADS_REGISTRY, StandardROIHeads + +logger = logging.getLogger(__name__) + +""" +Shape shorthand in this module: + + N: number of images in the minibatch + R: number of ROIs, combined over all images, in the minibatch + Ri: number of ROIs in image i + K: number of foreground classes. E.g.,there are 80 foreground classes in COCO. + +Naming convention: + + deltas: refers to the 5-d (dx, dy, dw, dh, da) deltas that parameterize the box2box + transform (see :class:`box_regression.Box2BoxTransformRotated`). + + pred_class_logits: predicted class scores in [-inf, +inf]; use + softmax(pred_class_logits) to estimate P(class). + + gt_classes: ground-truth classification labels in [0, K], where [0, K) represent + foreground object classes and K represents the background class. + + pred_proposal_deltas: predicted rotated box2box transform deltas for transforming proposals + to detection box predictions. + + gt_proposal_deltas: ground-truth rotated box2box transform deltas +""" + + +def fast_rcnn_inference_rotated( + boxes, scores, image_shapes, score_thresh, nms_thresh, topk_per_image +): + """ + Call `fast_rcnn_inference_single_image_rotated` for all images. + + Args: + boxes (list[Tensor]): A list of Tensors of predicted class-specific or class-agnostic + boxes for each image. Element i has shape (Ri, K * 5) if doing + class-specific regression, or (Ri, 5) if doing class-agnostic + regression, where Ri is the number of predicted objects for image i. + This is compatible with the output of :meth:`FastRCNNOutputs.predict_boxes`. + scores (list[Tensor]): A list of Tensors of predicted class scores for each image. + Element i has shape (Ri, K + 1), where Ri is the number of predicted objects + for image i. Compatible with the output of :meth:`FastRCNNOutputs.predict_probs`. + image_shapes (list[tuple]): A list of (width, height) tuples for each image in the batch. + score_thresh (float): Only return detections with a confidence score exceeding this + threshold. + nms_thresh (float): The threshold to use for box non-maximum suppression. Value in [0, 1]. + topk_per_image (int): The number of top scoring detections to return. Set < 0 to return + all detections. + + Returns: + instances: (list[Instances]): A list of N instances, one for each image in the batch, + that stores the topk most confidence detections. + kept_indices: (list[Tensor]): A list of 1D tensor of length of N, each element indicates + the corresponding boxes/scores index in [0, Ri) from the input, for image i. + """ + result_per_image = [ + fast_rcnn_inference_single_image_rotated( + boxes_per_image, scores_per_image, image_shape, score_thresh, nms_thresh, topk_per_image + ) + for scores_per_image, boxes_per_image, image_shape in zip(scores, boxes, image_shapes) + ] + return [x[0] for x in result_per_image], [x[1] for x in result_per_image] + + +def fast_rcnn_inference_single_image_rotated( + boxes, scores, image_shape, score_thresh, nms_thresh, topk_per_image +): + """ + Single-image inference. Return rotated bounding-box detection results by thresholding + on scores and applying rotated non-maximum suppression (Rotated NMS). + + Args: + Same as `fast_rcnn_inference_rotated`, but with rotated boxes, scores, and image shapes + per image. + + Returns: + Same as `fast_rcnn_inference_rotated`, but for only one image. + """ + valid_mask = torch.isfinite(boxes).all(dim=1) & torch.isfinite(scores).all(dim=1) + if not valid_mask.all(): + boxes = boxes[valid_mask] + scores = scores[valid_mask] + + B = 5 # box dimension + scores = scores[:, :-1] + num_bbox_reg_classes = boxes.shape[1] // B + # Convert to Boxes to use the `clip` function ... + boxes = RotatedBoxes(boxes.reshape(-1, B)) + boxes.clip(image_shape) + boxes = boxes.tensor.view(-1, num_bbox_reg_classes, B) # R x C x B + # Filter results based on detection scores + filter_mask = scores > score_thresh # R x K + # R' x 2. First column contains indices of the R predictions; + # Second column contains indices of classes. + filter_inds = filter_mask.nonzero() + if num_bbox_reg_classes == 1: + boxes = boxes[filter_inds[:, 0], 0] + else: + boxes = boxes[filter_mask] + scores = scores[filter_mask] + + # Apply per-class Rotated NMS + keep = batched_nms_rotated(boxes, scores, filter_inds[:, 1], nms_thresh) + if topk_per_image >= 0: + keep = keep[:topk_per_image] + boxes, scores, filter_inds = boxes[keep], scores[keep], filter_inds[keep] + + result = Instances(image_shape) + result.pred_boxes = RotatedBoxes(boxes) + result.scores = scores + result.pred_classes = filter_inds[:, 1] + + return result, filter_inds[:, 0] + + +class RotatedFastRCNNOutputLayers(FastRCNNOutputLayers): + """ + Two linear layers for predicting Rotated Fast R-CNN outputs. + """ + + @classmethod + def from_config(cls, cfg, input_shape): + args = super().from_config(cfg, input_shape) + args["box2box_transform"] = Box2BoxTransformRotated( + weights=cfg.MODEL.ROI_BOX_HEAD.BBOX_REG_WEIGHTS + ) + return args + + def inference(self, predictions, proposals): + """ + Returns: + list[Instances]: same as `fast_rcnn_inference_rotated`. + list[Tensor]: same as `fast_rcnn_inference_rotated`. + """ + boxes = self.predict_boxes(predictions, proposals) + scores = self.predict_probs(predictions, proposals) + image_shapes = [x.image_size for x in proposals] + + return fast_rcnn_inference_rotated( + boxes, + scores, + image_shapes, + self.test_score_thresh, + self.test_nms_thresh, + self.test_topk_per_image, + ) + + +@ROI_HEADS_REGISTRY.register() +class RROIHeads(StandardROIHeads): + """ + This class is used by Rotated Fast R-CNN to detect rotated boxes. + For now, it only supports box predictions but not mask or keypoints. + """ + + @configurable + def __init__(self, **kwargs): + """ + NOTE: this interface is experimental. + """ + super().__init__(**kwargs) + assert ( + not self.mask_on and not self.keypoint_on + ), "Mask/Keypoints not supported in Rotated ROIHeads." + assert not self.train_on_pred_boxes, "train_on_pred_boxes not implemented for RROIHeads!" + + @classmethod + def _init_box_head(cls, cfg, input_shape): + # fmt: off + in_features = cfg.MODEL.ROI_HEADS.IN_FEATURES + pooler_resolution = cfg.MODEL.ROI_BOX_HEAD.POOLER_RESOLUTION + pooler_scales = tuple(1.0 / input_shape[k].stride for k in in_features) + sampling_ratio = cfg.MODEL.ROI_BOX_HEAD.POOLER_SAMPLING_RATIO + pooler_type = cfg.MODEL.ROI_BOX_HEAD.POOLER_TYPE + # fmt: on + assert pooler_type in ["ROIAlignRotated"], pooler_type + # assume all channel counts are equal + in_channels = [input_shape[f].channels for f in in_features][0] + + box_pooler = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type=pooler_type, + ) + box_head = build_box_head( + cfg, ShapeSpec(channels=in_channels, height=pooler_resolution, width=pooler_resolution) + ) + # This line is the only difference v.s. StandardROIHeads + box_predictor = RotatedFastRCNNOutputLayers(cfg, box_head.output_shape) + return { + "box_in_features": in_features, + "box_pooler": box_pooler, + "box_head": box_head, + "box_predictor": box_predictor, + } + + @torch.no_grad() + def label_and_sample_proposals(self, proposals, targets): + """ + Prepare some proposals to be used to train the RROI heads. + It performs box matching between `proposals` and `targets`, and assigns + training labels to the proposals. + It returns `self.batch_size_per_image` random samples from proposals and groundtruth boxes, + with a fraction of positives that is no larger than `self.positive_sample_fraction. + + Args: + See :meth:`StandardROIHeads.forward` + + Returns: + list[Instances]: length `N` list of `Instances`s containing the proposals + sampled for training. Each `Instances` has the following fields: + - proposal_boxes: the rotated proposal boxes + - gt_boxes: the ground-truth rotated boxes that the proposal is assigned to + (this is only meaningful if the proposal has a label > 0; if label = 0 + then the ground-truth box is random) + - gt_classes: the ground-truth classification lable for each proposal + """ + gt_boxes = [x.gt_boxes for x in targets] + if self.proposal_append_gt: + proposals = add_ground_truth_to_proposals(gt_boxes, proposals) + + proposals_with_gt = [] + + num_fg_samples = [] + num_bg_samples = [] + for proposals_per_image, targets_per_image in zip(proposals, targets): + has_gt = len(targets_per_image) > 0 + match_quality_matrix = pairwise_iou_rotated( + targets_per_image.gt_boxes, proposals_per_image.proposal_boxes + ) + matched_idxs, matched_labels = self.proposal_matcher(match_quality_matrix) + sampled_idxs, gt_classes = self._sample_proposals( + matched_idxs, matched_labels, targets_per_image.gt_classes + ) + + proposals_per_image = proposals_per_image[sampled_idxs] + proposals_per_image.gt_classes = gt_classes + + if has_gt: + sampled_targets = matched_idxs[sampled_idxs] + proposals_per_image.gt_boxes = targets_per_image.gt_boxes[sampled_targets] + else: + gt_boxes = RotatedBoxes( + targets_per_image.gt_boxes.tensor.new_zeros((len(sampled_idxs), 5)) + ) + proposals_per_image.gt_boxes = gt_boxes + + num_bg_samples.append((gt_classes == self.num_classes).sum().item()) + num_fg_samples.append(gt_classes.numel() - num_bg_samples[-1]) + proposals_with_gt.append(proposals_per_image) + + # Log the number of fg/bg samples that are selected for training ROI heads + storage = get_event_storage() + storage.put_scalar("roi_head/num_fg_samples", np.mean(num_fg_samples)) + storage.put_scalar("roi_head/num_bg_samples", np.mean(num_bg_samples)) + + return proposals_with_gt diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/sampling.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/sampling.py new file mode 100644 index 0000000..ecf251a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/sampling.py @@ -0,0 +1,50 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import torch + +__all__ = ["subsample_labels"] + + +def subsample_labels(labels, num_samples, positive_fraction, bg_label): + """ + Return `num_samples` (or fewer, if not enough found) + random samples from `labels` which is a mixture of positives & negatives. + It will try to return as many positives as possible without + exceeding `positive_fraction * num_samples`, and then try to + fill the remaining slots with negatives. + + Args: + labels (Tensor): (N, ) label vector with values: + * -1: ignore + * bg_label: background ("negative") class + * otherwise: one or more foreground ("positive") classes + num_samples (int): The total number of labels with value >= 0 to return. + Values that are not sampled will be filled with -1 (ignore). + positive_fraction (float): The number of subsampled labels with values > 0 + is `min(num_positives, int(positive_fraction * num_samples))`. The number + of negatives sampled is `min(num_negatives, num_samples - num_positives_sampled)`. + In order words, if there are not enough positives, the sample is filled with + negatives. If there are also not enough negatives, then as many elements are + sampled as is possible. + bg_label (int): label index of background ("negative") class. + + Returns: + pos_idx, neg_idx (Tensor): + 1D vector of indices. The total length of both is `num_samples` or fewer. + """ + positive = torch.nonzero((labels != -1) & (labels != bg_label), as_tuple=True)[0] + negative = torch.nonzero(labels == bg_label, as_tuple=True)[0] + + num_pos = int(num_samples * positive_fraction) + # protect against not enough positive examples + num_pos = min(positive.numel(), num_pos) + num_neg = num_samples - num_pos + # protect against not enough negative examples + num_neg = min(negative.numel(), num_neg) + + # randomly select positive and negative examples + perm1 = torch.randperm(positive.numel(), device=positive.device)[:num_pos] + perm2 = torch.randperm(negative.numel(), device=negative.device)[:num_neg] + + pos_idx = positive[perm1] + neg_idx = negative[perm2] + return pos_idx, neg_idx diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/test_time_augmentation.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/test_time_augmentation.py new file mode 100644 index 0000000..1e5bcf0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/modeling/test_time_augmentation.py @@ -0,0 +1,285 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import numpy as np +from contextlib import contextmanager +from itertools import count +import torch +from torch import nn +from torch.nn.parallel import DistributedDataParallel + +from detectron2.data.detection_utils import read_image +from detectron2.data.transforms import ResizeShortestEdge +from detectron2.structures import Instances + +from .meta_arch import GeneralizedRCNN +from .postprocessing import detector_postprocess +from .roi_heads.fast_rcnn import fast_rcnn_inference_single_image + +__all__ = ["DatasetMapperTTA", "GeneralizedRCNNWithTTA"] + + +class DatasetMapperTTA: + """ + Implement test-time augmentation for detection data. + It is a callable which takes a dataset dict from a detection dataset, + and returns a list of dataset dicts where the images + are augmented from the input image by the transformations defined in the config. + This is used for test-time augmentation. + """ + + def __init__(self, cfg): + self.min_sizes = cfg.TEST.AUG.MIN_SIZES + self.max_size = cfg.TEST.AUG.MAX_SIZE + self.flip = cfg.TEST.AUG.FLIP + self.image_format = cfg.INPUT.FORMAT + + def __call__(self, dataset_dict): + """ + Args: + dict: a detection dataset dict + + Returns: + list[dict]: + a list of dataset dicts, which contain augmented version of the input image. + The total number of dicts is ``len(min_sizes) * (2 if flip else 1)``. + """ + ret = [] + if "image" not in dataset_dict: + numpy_image = read_image(dataset_dict["file_name"], self.image_format) + else: + numpy_image = dataset_dict["image"].permute(1, 2, 0).numpy().astype("uint8") + for min_size in self.min_sizes: + image = np.copy(numpy_image) + tfm = ResizeShortestEdge(min_size, self.max_size).get_transform(image) + resized = tfm.apply_image(image) + resized = torch.as_tensor(resized.transpose(2, 0, 1).astype("float32")) + + dic = copy.deepcopy(dataset_dict) + dic["horiz_flip"] = False + dic["image"] = resized + ret.append(dic) + + if self.flip: + dic = copy.deepcopy(dataset_dict) + dic["horiz_flip"] = True + dic["image"] = torch.flip(resized, dims=[2]) + ret.append(dic) + return ret + + +class GeneralizedRCNNWithTTA(nn.Module): + """ + A GeneralizedRCNN with test-time augmentation enabled. + Its :meth:`__call__` method has the same interface as :meth:`GeneralizedRCNN.forward`. + """ + + def __init__(self, cfg, model, tta_mapper=None, batch_size=3): + """ + Args: + cfg (CfgNode): + model (GeneralizedRCNN): a GeneralizedRCNN to apply TTA on. + tta_mapper (callable): takes a dataset dict and returns a list of + augmented versions of the dataset dict. Defaults to + `DatasetMapperTTA(cfg)`. + batch_size (int): batch the augmented images into this batch size for inference. + """ + super().__init__() + if isinstance(model, DistributedDataParallel): + model = model.module + assert isinstance( + model, GeneralizedRCNN + ), "TTA is only supported on GeneralizedRCNN. Got a model of type {}".format(type(model)) + self.cfg = cfg.clone() + assert not self.cfg.MODEL.KEYPOINT_ON, "TTA for keypoint is not supported yet" + assert ( + not self.cfg.MODEL.LOAD_PROPOSALS + ), "TTA for pre-computed proposals is not supported yet" + + self.model = model + + if tta_mapper is None: + tta_mapper = DatasetMapperTTA(cfg) + self.tta_mapper = tta_mapper + self.batch_size = batch_size + + @contextmanager + def _turn_off_roi_heads(self, attrs): + """ + Open a context where some heads in `model.roi_heads` are temporarily turned off. + Args: + attr (list[str]): the attribute in `model.roi_heads` which can be used + to turn off a specific head, e.g., "mask_on", "keypoint_on". + """ + roi_heads = self.model.roi_heads + old = {} + for attr in attrs: + try: + old[attr] = getattr(roi_heads, attr) + except AttributeError: + # The head may not be implemented in certain ROIHeads + pass + + if len(old.keys()) == 0: + yield + else: + for attr in old.keys(): + setattr(roi_heads, attr, False) + yield + for attr in old.keys(): + setattr(roi_heads, attr, old[attr]) + + def _batch_inference(self, batched_inputs, detected_instances=None, do_postprocess=True): + """ + Execute inference on a list of inputs, + using batch size = self.batch_size, instead of the length of the list. + + Inputs & outputs have the same format as :meth:`GeneralizedRCNN.inference` + """ + if detected_instances is None: + detected_instances = [None] * len(batched_inputs) + + outputs = [] + inputs, instances = [], [] + for idx, input, instance in zip(count(), batched_inputs, detected_instances): + inputs.append(input) + instances.append(instance) + if len(inputs) == self.batch_size or idx == len(batched_inputs) - 1: + outputs.extend( + self.model.inference( + inputs, + instances if instances[0] is not None else None, + do_postprocess=do_postprocess, + ) + ) + inputs, instances = [], [] + return outputs + + def __call__(self, batched_inputs): + """ + Same input/output format as :meth:`GeneralizedRCNN.forward` + """ + return [self._inference_one_image(x) for x in batched_inputs] + + def _detector_postprocess(self, outputs, aug_vars): + return detector_postprocess(outputs, aug_vars["height"], aug_vars["width"]) + + def _inference_one_image(self, input): + """ + Args: + input (dict): one dataset dict + + Returns: + dict: one output dict + """ + + augmented_inputs, aug_vars = self._get_augmented_inputs(input) + # Detect boxes from all augmented versions + with self._turn_off_roi_heads(["mask_on", "keypoint_on"]): + # temporarily disable roi heads + all_boxes, all_scores, all_classes = self._get_augmented_boxes( + augmented_inputs, aug_vars + ) + merged_instances = self._merge_detections( + all_boxes, all_scores, all_classes, (aug_vars["height"], aug_vars["width"]) + ) + + if self.cfg.MODEL.MASK_ON: + # Use the detected boxes to obtain new fields + augmented_instances = self._rescale_detected_boxes( + augmented_inputs, merged_instances, aug_vars + ) + # run forward on the detected boxes + outputs = self._batch_inference( + augmented_inputs, augmented_instances, do_postprocess=False + ) + # Delete now useless variables to avoid being out of memory + del augmented_inputs, augmented_instances, merged_instances + # average the predictions + outputs[0].pred_masks = self._reduce_pred_masks(outputs, aug_vars) + # postprocess + output = self._detector_postprocess(outputs[0], aug_vars) + return {"instances": output} + else: + return {"instances": merged_instances} + + def _get_augmented_inputs(self, input): + augmented_inputs = self.tta_mapper(input) + + do_hflip = [k.pop("horiz_flip", False) for k in augmented_inputs] + heights = [k["height"] for k in augmented_inputs] + widths = [k["width"] for k in augmented_inputs] + assert ( + len(set(heights)) == 1 and len(set(widths)) == 1 + ), "Augmented version of the inputs should have the same original resolution!" + height = heights[0] + width = widths[0] + aug_vars = {"height": height, "width": width, "do_hflip": do_hflip} + + return augmented_inputs, aug_vars + + def _get_augmented_boxes(self, augmented_inputs, aug_vars): + # 1: forward with all augmented images + outputs = self._batch_inference(augmented_inputs, do_postprocess=False) + # 2: union the results + all_boxes = [] + all_scores = [] + all_classes = [] + for idx, output in enumerate(outputs): + rescaled_output = self._detector_postprocess(output, aug_vars) + pred_boxes = rescaled_output.pred_boxes.tensor + if aug_vars["do_hflip"][idx]: + pred_boxes[:, [0, 2]] = aug_vars["width"] - pred_boxes[:, [2, 0]] + all_boxes.append(pred_boxes) + all_scores.extend(rescaled_output.scores) + all_classes.extend(rescaled_output.pred_classes) + all_boxes = torch.cat(all_boxes, dim=0).cpu() + return all_boxes, all_scores, all_classes + + def _merge_detections(self, all_boxes, all_scores, all_classes, shape_hw): + # select from the union of all results + num_boxes = len(all_boxes) + num_classes = self.cfg.MODEL.ROI_HEADS.NUM_CLASSES + # +1 because fast_rcnn_inference expects background scores as well + all_scores_2d = torch.zeros(num_boxes, num_classes + 1, device=all_boxes.device) + for idx, cls, score in zip(count(), all_classes, all_scores): + all_scores_2d[idx, cls] = score + + merged_instances, _ = fast_rcnn_inference_single_image( + all_boxes, + all_scores_2d, + shape_hw, + 1e-8, + self.cfg.MODEL.ROI_HEADS.NMS_THRESH_TEST, + self.cfg.TEST.DETECTIONS_PER_IMAGE, + ) + + return merged_instances + + def _rescale_detected_boxes(self, augmented_inputs, merged_instances, aug_vars): + augmented_instances = [] + for idx, input in enumerate(augmented_inputs): + actual_height, actual_width = input["image"].shape[1:3] + scale_x = actual_width * 1.0 / aug_vars["width"] + scale_y = actual_height * 1.0 / aug_vars["height"] + pred_boxes = merged_instances.pred_boxes.clone() + pred_boxes.tensor[:, 0::2] *= scale_x + pred_boxes.tensor[:, 1::2] *= scale_y + if aug_vars["do_hflip"][idx]: + pred_boxes.tensor[:, [0, 2]] = actual_width - pred_boxes.tensor[:, [2, 0]] + + aug_instances = Instances( + image_size=(actual_height, actual_width), + pred_boxes=pred_boxes, + pred_classes=merged_instances.pred_classes, + scores=merged_instances.scores, + ) + augmented_instances.append(aug_instances) + return augmented_instances + + def _reduce_pred_masks(self, outputs, aug_vars): + for idx, output in enumerate(outputs): + if aug_vars["do_hflip"][idx]: + output.pred_masks = output.pred_masks.flip(dims=[3]) + all_pred_masks = torch.stack([o.pred_masks for o in outputs], dim=0) + avg_pred_masks = torch.mean(all_pred_masks, dim=0) + return avg_pred_masks diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/__init__.py new file mode 100644 index 0000000..10f84e1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .build import build_lr_scheduler, build_optimizer +from .lr_scheduler import WarmupCosineLR, WarmupMultiStepLR + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/build.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/build.py new file mode 100644 index 0000000..6d9d0ee --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/build.py @@ -0,0 +1,165 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from enum import Enum +from typing import Any, Callable, Dict, Iterable, List, Set, Type, Union +import torch + +from detectron2.config import CfgNode + +from .lr_scheduler import WarmupCosineLR, WarmupMultiStepLR + +_GradientClipperInput = Union[torch.Tensor, Iterable[torch.Tensor]] +_GradientClipper = Callable[[_GradientClipperInput], None] + + +class GradientClipType(Enum): + VALUE = "value" + NORM = "norm" + + +def _create_gradient_clipper(cfg: CfgNode) -> _GradientClipper: + """ + Creates gradient clipping closure to clip by value or by norm, + according to the provided config. + """ + cfg = cfg.clone() + + def clip_grad_norm(p: _GradientClipperInput): + torch.nn.utils.clip_grad_norm_(p, cfg.CLIP_VALUE, cfg.NORM_TYPE) + + def clip_grad_value(p: _GradientClipperInput): + torch.nn.utils.clip_grad_value_(p, cfg.CLIP_VALUE) + + _GRADIENT_CLIP_TYPE_TO_CLIPPER = { + GradientClipType.VALUE: clip_grad_value, + GradientClipType.NORM: clip_grad_norm, + } + return _GRADIENT_CLIP_TYPE_TO_CLIPPER[GradientClipType(cfg.CLIP_TYPE)] + + +def _generate_optimizer_class_with_gradient_clipping( + optimizer_type: Type[torch.optim.Optimizer], gradient_clipper: _GradientClipper +) -> Type[torch.optim.Optimizer]: + """ + Dynamically creates a new type that inherits the type of a given instance + and overrides the `step` method to add gradient clipping + """ + + def optimizer_wgc_step(self, closure=None): + for group in self.param_groups: + for p in group["params"]: + gradient_clipper(p) + super(type(self), self).step(closure) + + OptimizerWithGradientClip = type( + optimizer_type.__name__ + "WithGradientClip", + (optimizer_type,), + {"step": optimizer_wgc_step}, + ) + return OptimizerWithGradientClip + + +def maybe_add_gradient_clipping( + cfg: CfgNode, optimizer: torch.optim.Optimizer +) -> torch.optim.Optimizer: + """ + If gradient clipping is enabled through config options, wraps the existing + optimizer instance of some type OptimizerType to become an instance + of the new dynamically created class OptimizerTypeWithGradientClip + that inherits OptimizerType and overrides the `step` method to + include gradient clipping. + + Args: + cfg: CfgNode + configuration options + optimizer: torch.optim.Optimizer + existing optimizer instance + + Return: + optimizer: torch.optim.Optimizer + either the unmodified optimizer instance (if gradient clipping is + disabled), or the same instance with adjusted __class__ to override + the `step` method and include gradient clipping + """ + if not cfg.SOLVER.CLIP_GRADIENTS.ENABLED: + return optimizer + grad_clipper = _create_gradient_clipper(cfg.SOLVER.CLIP_GRADIENTS) + OptimizerWithGradientClip = _generate_optimizer_class_with_gradient_clipping( + type(optimizer), grad_clipper + ) + optimizer.__class__ = OptimizerWithGradientClip + return optimizer + + +def build_optimizer(cfg: CfgNode, model: torch.nn.Module) -> torch.optim.Optimizer: + """ + Build an optimizer from config. + """ + norm_module_types = ( + torch.nn.BatchNorm1d, + torch.nn.BatchNorm2d, + torch.nn.BatchNorm3d, + torch.nn.SyncBatchNorm, + # NaiveSyncBatchNorm inherits from BatchNorm2d + torch.nn.GroupNorm, + torch.nn.InstanceNorm1d, + torch.nn.InstanceNorm2d, + torch.nn.InstanceNorm3d, + torch.nn.LayerNorm, + torch.nn.LocalResponseNorm, + ) + params: List[Dict[str, Any]] = [] + memo: Set[torch.nn.parameter.Parameter] = set() + for module in model.modules(): + for key, value in module.named_parameters(recurse=False): + if not value.requires_grad: + continue + # Avoid duplicating parameters + if value in memo: + continue + memo.add(value) + lr = cfg.SOLVER.BASE_LR + weight_decay = cfg.SOLVER.WEIGHT_DECAY + if isinstance(module, norm_module_types): + weight_decay = cfg.SOLVER.WEIGHT_DECAY_NORM + elif key == "bias": + # NOTE: unlike Detectron v1, we now default BIAS_LR_FACTOR to 1.0 + # and WEIGHT_DECAY_BIAS to WEIGHT_DECAY so that bias optimizer + # hyperparameters are by default exactly the same as for regular + # weights. + lr = cfg.SOLVER.BASE_LR * cfg.SOLVER.BIAS_LR_FACTOR + weight_decay = cfg.SOLVER.WEIGHT_DECAY_BIAS + params += [{"params": [value], "lr": lr, "weight_decay": weight_decay}] + + optimizer = torch.optim.SGD( + params, cfg.SOLVER.BASE_LR, momentum=cfg.SOLVER.MOMENTUM, nesterov=cfg.SOLVER.NESTEROV + ) + optimizer = maybe_add_gradient_clipping(cfg, optimizer) + return optimizer + + +def build_lr_scheduler( + cfg: CfgNode, optimizer: torch.optim.Optimizer +) -> torch.optim.lr_scheduler._LRScheduler: + """ + Build a LR scheduler from config. + """ + name = cfg.SOLVER.LR_SCHEDULER_NAME + if name == "WarmupMultiStepLR": + return WarmupMultiStepLR( + optimizer, + cfg.SOLVER.STEPS, + cfg.SOLVER.GAMMA, + warmup_factor=cfg.SOLVER.WARMUP_FACTOR, + warmup_iters=cfg.SOLVER.WARMUP_ITERS, + warmup_method=cfg.SOLVER.WARMUP_METHOD, + ) + elif name == "WarmupCosineLR": + return WarmupCosineLR( + optimizer, + cfg.SOLVER.MAX_ITER, + warmup_factor=cfg.SOLVER.WARMUP_FACTOR, + warmup_iters=cfg.SOLVER.WARMUP_ITERS, + warmup_method=cfg.SOLVER.WARMUP_METHOD, + ) + else: + raise ValueError("Unknown LR scheduler: {}".format(name)) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/lr_scheduler.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/lr_scheduler.py new file mode 100644 index 0000000..6148d86 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/solver/lr_scheduler.py @@ -0,0 +1,116 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +from bisect import bisect_right +from typing import List +import torch + +# NOTE: PyTorch's LR scheduler interface uses names that assume the LR changes +# only on epoch boundaries. We typically use iteration based schedules instead. +# As a result, "epoch" (e.g., as in self.last_epoch) should be understood to mean +# "iteration" instead. + +# FIXME: ideally this would be achieved with a CombinedLRScheduler, separating +# MultiStepLR with WarmupLR but the current LRScheduler design doesn't allow it. + + +class WarmupMultiStepLR(torch.optim.lr_scheduler._LRScheduler): + def __init__( + self, + optimizer: torch.optim.Optimizer, + milestones: List[int], + gamma: float = 0.1, + warmup_factor: float = 0.001, + warmup_iters: int = 1000, + warmup_method: str = "linear", + last_epoch: int = -1, + ): + if not list(milestones) == sorted(milestones): + raise ValueError( + "Milestones should be a list of" " increasing integers. Got {}", milestones + ) + self.milestones = milestones + self.gamma = gamma + self.warmup_factor = warmup_factor + self.warmup_iters = warmup_iters + self.warmup_method = warmup_method + super().__init__(optimizer, last_epoch) + + def get_lr(self) -> List[float]: + warmup_factor = _get_warmup_factor_at_iter( + self.warmup_method, self.last_epoch, self.warmup_iters, self.warmup_factor + ) + return [ + base_lr * warmup_factor * self.gamma ** bisect_right(self.milestones, self.last_epoch) + for base_lr in self.base_lrs + ] + + def _compute_values(self) -> List[float]: + # The new interface + return self.get_lr() + + +class WarmupCosineLR(torch.optim.lr_scheduler._LRScheduler): + def __init__( + self, + optimizer: torch.optim.Optimizer, + max_iters: int, + warmup_factor: float = 0.001, + warmup_iters: int = 1000, + warmup_method: str = "linear", + last_epoch: int = -1, + ): + self.max_iters = max_iters + self.warmup_factor = warmup_factor + self.warmup_iters = warmup_iters + self.warmup_method = warmup_method + super().__init__(optimizer, last_epoch) + + def get_lr(self) -> List[float]: + warmup_factor = _get_warmup_factor_at_iter( + self.warmup_method, self.last_epoch, self.warmup_iters, self.warmup_factor + ) + # Different definitions of half-cosine with warmup are possible. For + # simplicity we multiply the standard half-cosine schedule by the warmup + # factor. An alternative is to start the period of the cosine at warmup_iters + # instead of at 0. In the case that warmup_iters << max_iters the two are + # very close to each other. + return [ + base_lr + * warmup_factor + * 0.5 + * (1.0 + math.cos(math.pi * self.last_epoch / self.max_iters)) + for base_lr in self.base_lrs + ] + + def _compute_values(self) -> List[float]: + # The new interface + return self.get_lr() + + +def _get_warmup_factor_at_iter( + method: str, iter: int, warmup_iters: int, warmup_factor: float +) -> float: + """ + Return the learning rate warmup factor at a specific iteration. + See :paper:`in1k1h` for more details. + + Args: + method (str): warmup method; either "constant" or "linear". + iter (int): iteration at which to calculate the warmup factor. + warmup_iters (int): the number of warmup iterations. + warmup_factor (float): the base warmup factor (the meaning changes according + to the method used). + + Returns: + float: the effective warmup factor at the given iteration. + """ + if iter >= warmup_iters: + return 1.0 + + if method == "constant": + return warmup_factor + elif method == "linear": + alpha = iter / warmup_iters + return warmup_factor * (1 - alpha) + alpha + else: + raise ValueError("Unknown warmup method: {}".format(method)) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/__init__.py new file mode 100644 index 0000000..618f526 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .boxes import Boxes, BoxMode, pairwise_iou +from .image_list import ImageList + +from .instances import Instances +from .keypoints import Keypoints, heatmaps_to_keypoints +from .masks import BitMasks, PolygonMasks, rasterize_polygons_within_box, polygons_to_bitmask +from .rotated_boxes import RotatedBoxes +from .rotated_boxes import pairwise_iou as pairwise_iou_rotated + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/boxes.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/boxes.py new file mode 100644 index 0000000..e625803 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/boxes.py @@ -0,0 +1,367 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +import numpy as np +from enum import IntEnum, unique +from typing import Iterator, List, Tuple, Union +import torch + +_RawBoxType = Union[List[float], Tuple[float, ...], torch.Tensor, np.ndarray] + + +@unique +class BoxMode(IntEnum): + """ + Enum of different ways to represent a box. + """ + + XYXY_ABS = 0 + """ + (x0, y0, x1, y1) in absolute floating points coordinates. + The coordinates in range [0, width or height]. + """ + XYWH_ABS = 1 + """ + (x0, y0, w, h) in absolute floating points coordinates. + """ + XYXY_REL = 2 + """ + Not yet supported! + (x0, y0, x1, y1) in range [0, 1]. They are relative to the size of the image. + """ + XYWH_REL = 3 + """ + Not yet supported! + (x0, y0, w, h) in range [0, 1]. They are relative to the size of the image. + """ + XYWHA_ABS = 4 + """ + (xc, yc, w, h, a) in absolute floating points coordinates. + (xc, yc) is the center of the rotated box, and the angle a is in degrees ccw. + """ + + @staticmethod + def convert(box: _RawBoxType, from_mode: "BoxMode", to_mode: "BoxMode") -> _RawBoxType: + """ + Args: + box: can be a k-tuple, k-list or an Nxk array/tensor, where k = 4 or 5 + from_mode, to_mode (BoxMode) + + Returns: + The converted box of the same type. + """ + if from_mode == to_mode: + return box + + original_type = type(box) + is_numpy = isinstance(box, np.ndarray) + single_box = isinstance(box, (list, tuple)) + if single_box: + assert len(box) == 4 or len(box) == 5, ( + "BoxMode.convert takes either a k-tuple/list or an Nxk array/tensor," + " where k == 4 or 5" + ) + arr = torch.tensor(box)[None, :] + else: + # avoid modifying the input box + if is_numpy: + arr = torch.from_numpy(np.asarray(box)).clone() + else: + arr = box.clone() + + assert to_mode.value not in [ + BoxMode.XYXY_REL, + BoxMode.XYWH_REL, + ] and from_mode.value not in [ + BoxMode.XYXY_REL, + BoxMode.XYWH_REL, + ], "Relative mode not yet supported!" + + if from_mode == BoxMode.XYWHA_ABS and to_mode == BoxMode.XYXY_ABS: + assert ( + arr.shape[-1] == 5 + ), "The last dimension of input shape must be 5 for XYWHA format" + original_dtype = arr.dtype + arr = arr.double() + + w = arr[:, 2] + h = arr[:, 3] + a = arr[:, 4] + c = torch.abs(torch.cos(a * math.pi / 180.0)) + s = torch.abs(torch.sin(a * math.pi / 180.0)) + # This basically computes the horizontal bounding rectangle of the rotated box + new_w = c * w + s * h + new_h = c * h + s * w + + # convert center to top-left corner + arr[:, 0] -= new_w / 2.0 + arr[:, 1] -= new_h / 2.0 + # bottom-right corner + arr[:, 2] = arr[:, 0] + new_w + arr[:, 3] = arr[:, 1] + new_h + + arr = arr[:, :4].to(dtype=original_dtype) + elif from_mode == BoxMode.XYWH_ABS and to_mode == BoxMode.XYWHA_ABS: + original_dtype = arr.dtype + arr = arr.double() + arr[:, 0] += arr[:, 2] / 2.0 + arr[:, 1] += arr[:, 3] / 2.0 + angles = torch.zeros((arr.shape[0], 1), dtype=arr.dtype) + arr = torch.cat((arr, angles), axis=1).to(dtype=original_dtype) + else: + if to_mode == BoxMode.XYXY_ABS and from_mode == BoxMode.XYWH_ABS: + arr[:, 2] += arr[:, 0] + arr[:, 3] += arr[:, 1] + elif from_mode == BoxMode.XYXY_ABS and to_mode == BoxMode.XYWH_ABS: + arr[:, 2] -= arr[:, 0] + arr[:, 3] -= arr[:, 1] + else: + raise NotImplementedError( + "Conversion from BoxMode {} to {} is not supported yet".format( + from_mode, to_mode + ) + ) + + if single_box: + return original_type(arr.flatten().tolist()) + if is_numpy: + return arr.numpy() + else: + return arr + + +class Boxes: + """ + This structure stores a list of boxes as a Nx4 torch.Tensor. + It supports some common methods about boxes + (`area`, `clip`, `nonempty`, etc), + and also behaves like a Tensor + (support indexing, `to(device)`, `.device`, and iteration over all boxes) + + Attributes: + tensor (torch.Tensor): float matrix of Nx4. Each row is (x1, y1, x2, y2). + """ + + BoxSizeType = Union[List[int], Tuple[int, int]] + + def __init__(self, tensor: torch.Tensor): + """ + Args: + tensor (Tensor[float]): a Nx4 matrix. Each row is (x1, y1, x2, y2). + """ + device = tensor.device if isinstance(tensor, torch.Tensor) else torch.device("cpu") + tensor = torch.as_tensor(tensor, dtype=torch.float32, device=device) + if tensor.numel() == 0: + # Use reshape, so we don't end up creating a new tensor that does not depend on + # the inputs (and consequently confuses jit) + tensor = tensor.reshape((0, 4)).to(dtype=torch.float32, device=device) + assert tensor.dim() == 2 and tensor.size(-1) == 4, tensor.size() + + self.tensor = tensor + + def clone(self) -> "Boxes": + """ + Clone the Boxes. + + Returns: + Boxes + """ + return Boxes(self.tensor.clone()) + + def to(self, device: str) -> "Boxes": + return Boxes(self.tensor.to(device)) + + def area(self) -> torch.Tensor: + """ + Computes the area of all the boxes. + + Returns: + torch.Tensor: a vector with areas of each box. + """ + box = self.tensor + area = (box[:, 2] - box[:, 0]) * (box[:, 3] - box[:, 1]) + return area + + def clip(self, box_size: BoxSizeType) -> None: + """ + Clip (in place) the boxes by limiting x coordinates to the range [0, width] + and y coordinates to the range [0, height]. + + Args: + box_size (height, width): The clipping box's size. + """ + assert torch.isfinite(self.tensor).all(), "Box tensor contains infinite or NaN!" + h, w = box_size + self.tensor[:, 0].clamp_(min=0, max=w) + self.tensor[:, 1].clamp_(min=0, max=h) + self.tensor[:, 2].clamp_(min=0, max=w) + self.tensor[:, 3].clamp_(min=0, max=h) + + def nonempty(self, threshold: float = 0.0) -> torch.Tensor: + """ + Find boxes that are non-empty. + A box is considered empty, if either of its side is no larger than threshold. + + Returns: + Tensor: + a binary vector which represents whether each box is empty + (False) or non-empty (True). + """ + box = self.tensor + widths = box[:, 2] - box[:, 0] + heights = box[:, 3] - box[:, 1] + keep = (widths > threshold) & (heights > threshold) + return keep + + def __getitem__(self, item: Union[int, slice, torch.BoolTensor]) -> "Boxes": + """ + Returns: + Boxes: Create a new :class:`Boxes` by indexing. + + The following usage are allowed: + + 1. `new_boxes = boxes[3]`: return a `Boxes` which contains only one box. + 2. `new_boxes = boxes[2:10]`: return a slice of boxes. + 3. `new_boxes = boxes[vector]`, where vector is a torch.BoolTensor + with `length = len(boxes)`. Nonzero elements in the vector will be selected. + + Note that the returned Boxes might share storage with this Boxes, + subject to Pytorch's indexing semantics. + """ + if isinstance(item, int): + return Boxes(self.tensor[item].view(1, -1)) + b = self.tensor[item] + assert b.dim() == 2, "Indexing on Boxes with {} failed to return a matrix!".format(item) + return Boxes(b) + + def __len__(self) -> int: + return self.tensor.shape[0] + + def __repr__(self) -> str: + return "Boxes(" + str(self.tensor) + ")" + + def inside_box(self, box_size: BoxSizeType, boundary_threshold: int = 0) -> torch.Tensor: + """ + Args: + box_size (height, width): Size of the reference box. + boundary_threshold (int): Boxes that extend beyond the reference box + boundary by more than boundary_threshold are considered "outside". + + Returns: + a binary vector, indicating whether each box is inside the reference box. + """ + height, width = box_size + inds_inside = ( + (self.tensor[..., 0] >= -boundary_threshold) + & (self.tensor[..., 1] >= -boundary_threshold) + & (self.tensor[..., 2] < width + boundary_threshold) + & (self.tensor[..., 3] < height + boundary_threshold) + ) + return inds_inside + + def get_centers(self) -> torch.Tensor: + """ + Returns: + The box centers in a Nx2 array of (x, y). + """ + return (self.tensor[:, :2] + self.tensor[:, 2:]) / 2 + + def scale(self, scale_x: float, scale_y: float) -> None: + """ + Scale the box with horizontal and vertical scaling factors + """ + self.tensor[:, 0::2] *= scale_x + self.tensor[:, 1::2] *= scale_y + + @classmethod + def cat(cls, boxes_list: List["Boxes"]) -> "Boxes": + """ + Concatenates a list of Boxes into a single Boxes + + Arguments: + boxes_list (list[Boxes]) + + Returns: + Boxes: the concatenated Boxes + """ + assert isinstance(boxes_list, (list, tuple)) + if len(boxes_list) == 0: + return cls(torch.empty(0)) + assert all(isinstance(box, Boxes) for box in boxes_list) + + # use torch.cat (v.s. layers.cat) so the returned boxes never share storage with input + cat_boxes = cls(torch.cat([b.tensor for b in boxes_list], dim=0)) + return cat_boxes + + @property + def device(self) -> torch.device: + return self.tensor.device + + def __iter__(self) -> Iterator[torch.Tensor]: + """ + Yield a box as a Tensor of shape (4,) at a time. + """ + yield from self.tensor + + +# implementation from https://github.com/kuangliu/torchcv/blob/master/torchcv/utils/box.py +# with slight modifications +def pairwise_iou(boxes1: Boxes, boxes2: Boxes) -> torch.Tensor: + """ + Given two lists of boxes of size N and M, + compute the IoU (intersection over union) + between __all__ N x M pairs of boxes. + The box order must be (xmin, ymin, xmax, ymax). + + Args: + boxes1,boxes2 (Boxes): two `Boxes`. Contains N & M boxes, respectively. + + Returns: + Tensor: IoU, sized [N,M]. + """ + area1 = boxes1.area() + area2 = boxes2.area() + + boxes1, boxes2 = boxes1.tensor, boxes2.tensor + + width_height = torch.min(boxes1[:, None, 2:], boxes2[:, 2:]) - torch.max( + boxes1[:, None, :2], boxes2[:, :2] + ) # [N,M,2] + + width_height.clamp_(min=0) # [N,M,2] + inter = width_height.prod(dim=2) # [N,M] + del width_height + + # handle empty boxes + iou = torch.where( + inter > 0, + inter / (area1[:, None] + area2 - inter), + torch.zeros(1, dtype=inter.dtype, device=inter.device), + ) + return iou + + +def matched_boxlist_iou(boxes1: Boxes, boxes2: Boxes) -> torch.Tensor: + """ + Compute pairwise intersection over union (IOU) of two sets of matched + boxes. The box order must be (xmin, ymin, xmax, ymax). + Similar to boxlist_iou, but computes only diagonal elements of the matrix + Arguments: + boxes1: (Boxes) bounding boxes, sized [N,4]. + boxes2: (Boxes) bounding boxes, sized [N,4]. + Returns: + (tensor) iou, sized [N]. + """ + assert len(boxes1) == len( + boxes2 + ), "boxlists should have the same" "number of entries, got {}, {}".format( + len(boxes1), len(boxes2) + ) + area1 = boxes1.area() # [N] + area2 = boxes2.area() # [N] + box1, box2 = boxes1.tensor, boxes2.tensor + lt = torch.max(box1[:, :2], box2[:, :2]) # [N,2] + rb = torch.min(box1[:, 2:], box2[:, 2:]) # [N,2] + wh = (rb - lt).clamp(min=0) # [N,2] + inter = wh[:, 0] * wh[:, 1] # [N] + iou = inter / (area1 + area2 - inter) # [N] + return iou diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/image_list.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/image_list.py new file mode 100644 index 0000000..2d89224 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/image_list.py @@ -0,0 +1,113 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +from __future__ import division +from typing import Any, List, Sequence, Tuple, Union +import torch +from torch.nn import functional as F + + +class ImageList(object): + """ + Structure that holds a list of images (of possibly + varying sizes) as a single tensor. + This works by padding the images to the same size, + and storing in a field the original sizes of each image + + Attributes: + image_sizes (list[tuple[int, int]]): each tuple is (h, w) + """ + + def __init__(self, tensor: torch.Tensor, image_sizes: List[Tuple[int, int]]): + """ + Arguments: + tensor (Tensor): of shape (N, H, W) or (N, C_1, ..., C_K, H, W) where K >= 1 + image_sizes (list[tuple[int, int]]): Each tuple is (h, w). It can + be smaller than (H, W) due to padding. + """ + self.tensor = tensor + self.image_sizes = image_sizes + + def __len__(self) -> int: + return len(self.image_sizes) + + def __getitem__(self, idx: Union[int, slice]) -> torch.Tensor: + """ + Access the individual image in its original size. + + Returns: + Tensor: an image of shape (H, W) or (C_1, ..., C_K, H, W) where K >= 1 + """ + size = self.image_sizes[idx] + return self.tensor[idx, ..., : size[0], : size[1]] # type: ignore + + def to(self, *args: Any, **kwargs: Any) -> "ImageList": + cast_tensor = self.tensor.to(*args, **kwargs) + return ImageList(cast_tensor, self.image_sizes) + + @property + def device(self) -> torch.device: + return self.tensor.device + + @staticmethod + def from_tensors( + tensors: Sequence[torch.Tensor], size_divisibility: int = 0, pad_value: float = 0.0 + ) -> "ImageList": + """ + Args: + tensors: a tuple or list of `torch.Tensors`, each of shape (Hi, Wi) or + (C_1, ..., C_K, Hi, Wi) where K >= 1. The Tensors will be padded + to the same shape with `pad_value`. + size_divisibility (int): If `size_divisibility > 0`, add padding to ensure + the common height and width is divisible by `size_divisibility`. + This depends on the model and many models need a divisibility of 32. + pad_value (float): value to pad + + Returns: + an `ImageList`. + """ + assert len(tensors) > 0 + assert isinstance(tensors, (tuple, list)) + for t in tensors: + assert isinstance(t, torch.Tensor), type(t) + assert t.shape[1:-2] == tensors[0].shape[1:-2], t.shape + # per dimension maximum (H, W) or (C_1, ..., C_K, H, W) where K >= 1 among all tensors + max_size = ( + # In tracing mode, x.shape[i] is Tensor, and should not be converted + # to int: this will cause the traced graph to have hard-coded shapes. + # Instead we should make max_size a Tensor that depends on these tensors. + # Using torch.stack twice seems to be the best way to convert + # list[list[ScalarTensor]] to a Tensor + torch.stack( + [ + torch.stack([torch.as_tensor(dim) for dim in size]) + for size in [tuple(img.shape) for img in tensors] + ] + ) + .max(0) + .values + ) + + if size_divisibility > 0: + stride = size_divisibility + # the last two dims are H,W, both subject to divisibility requirement + max_size = torch.cat([max_size[:-2], (max_size[-2:] + (stride - 1)) // stride * stride]) + + image_sizes = [tuple(im.shape[-2:]) for im in tensors] + + if len(tensors) == 1: + # This seems slightly (2%) faster. + # TODO: check whether it's faster for multiple images as well + image_size = image_sizes[0] + padding_size = [0, max_size[-1] - image_size[1], 0, max_size[-2] - image_size[0]] + if all(x == 0 for x in padding_size): # https://github.com/pytorch/pytorch/issues/31734 + batched_imgs = tensors[0].unsqueeze(0) + else: + padded = F.pad(tensors[0], padding_size, value=pad_value) + batched_imgs = padded.unsqueeze_(0) + else: + # max_size can be a tensor in tracing mode, therefore use tuple() + batch_shape = (len(tensors),) + tuple(max_size) + batched_imgs = tensors[0].new_full(batch_shape, pad_value) + for img, pad_img in zip(tensors, batched_imgs): + pad_img[..., : img.shape[-2], : img.shape[-1]].copy_(img) + + return ImageList(batched_imgs.contiguous(), image_sizes) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/instances.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/instances.py new file mode 100644 index 0000000..373de08 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/instances.py @@ -0,0 +1,185 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import itertools +from typing import Any, Dict, List, Tuple, Union +import torch + + +class Instances: + """ + This class represents a list of instances in an image. + It stores the attributes of instances (e.g., boxes, masks, labels, scores) as "fields". + All fields must have the same ``__len__`` which is the number of instances. + + All other (non-field) attributes of this class are considered private: + they must start with '_' and are not modifiable by a user. + + Some basic usage: + + 1. Set/Get a field: + + .. code-block:: python + + instances.gt_boxes = Boxes(...) + print(instances.pred_masks) # a tensor of shape (N, H, W) + print('gt_masks' in instances) + + 2. ``len(instances)`` returns the number of instances + 3. Indexing: ``instances[indices]`` will apply the indexing on all the fields + and returns a new :class:`Instances`. + Typically, ``indices`` is a integer vector of indices, + or a binary mask of length ``num_instances``, + """ + + def __init__(self, image_size: Tuple[int, int], **kwargs: Any): + """ + Args: + image_size (height, width): the spatial size of the image. + kwargs: fields to add to this `Instances`. + """ + self._image_size = image_size + self._fields: Dict[str, Any] = {} + for k, v in kwargs.items(): + self.set(k, v) + + @property + def image_size(self) -> Tuple[int, int]: + """ + Returns: + tuple: height, width + """ + return self._image_size + + def __setattr__(self, name: str, val: Any) -> None: + if name.startswith("_"): + super().__setattr__(name, val) + else: + self.set(name, val) + + def __getattr__(self, name: str) -> Any: + if name == "_fields" or name not in self._fields: + raise AttributeError("Cannot find field '{}' in the given Instances!".format(name)) + return self._fields[name] + + def set(self, name: str, value: Any) -> None: + """ + Set the field named `name` to `value`. + The length of `value` must be the number of instances, + and must agree with other existing fields in this object. + """ + data_len = len(value) + if len(self._fields): + assert ( + len(self) == data_len + ), "Adding a field of length {} to a Instances of length {}".format(data_len, len(self)) + self._fields[name] = value + + def has(self, name: str) -> bool: + """ + Returns: + bool: whether the field called `name` exists. + """ + return name in self._fields + + def remove(self, name: str) -> None: + """ + Remove the field called `name`. + """ + del self._fields[name] + + def get(self, name: str) -> Any: + """ + Returns the field called `name`. + """ + return self._fields[name] + + def get_fields(self) -> Dict[str, Any]: + """ + Returns: + dict: a dict which maps names (str) to data of the fields + + Modifying the returned dict will modify this instance. + """ + return self._fields + + # Tensor-like methods + def to(self, device: str) -> "Instances": + """ + Returns: + Instances: all fields are called with a `to(device)`, if the field has this method. + """ + ret = Instances(self._image_size) + for k, v in self._fields.items(): + if hasattr(v, "to"): + v = v.to(device) + ret.set(k, v) + return ret + + def __getitem__(self, item: Union[int, slice, torch.BoolTensor]) -> "Instances": + """ + Args: + item: an index-like object and will be used to index all the fields. + + Returns: + If `item` is a string, return the data in the corresponding field. + Otherwise, returns an `Instances` where all fields are indexed by `item`. + """ + if type(item) == int: + if item >= len(self) or item < -len(self): + raise IndexError("Instances index out of range!") + else: + item = slice(item, None, len(self)) + + ret = Instances(self._image_size) + for k, v in self._fields.items(): + ret.set(k, v[item]) + return ret + + def __len__(self) -> int: + for v in self._fields.values(): + return len(v) + raise NotImplementedError("Empty Instances does not support __len__!") + + def __iter__(self): + raise NotImplementedError("`Instances` object is not iterable!") + + @staticmethod + def cat(instance_lists: List["Instances"]) -> "Instances": + """ + Args: + instance_lists (list[Instances]) + + Returns: + Instances + """ + assert all(isinstance(i, Instances) for i in instance_lists) + assert len(instance_lists) > 0 + if len(instance_lists) == 1: + return instance_lists[0] + + image_size = instance_lists[0].image_size + for i in instance_lists[1:]: + assert i.image_size == image_size + ret = Instances(image_size) + for k in instance_lists[0]._fields.keys(): + values = [i.get(k) for i in instance_lists] + v0 = values[0] + if isinstance(v0, torch.Tensor): + values = torch.cat(values, dim=0) + elif isinstance(v0, list): + values = list(itertools.chain(*values)) + elif hasattr(type(v0), "cat"): + values = type(v0).cat(values) + else: + raise ValueError("Unsupported type {} for concatenation".format(type(v0))) + ret.set(k, values) + return ret + + def __str__(self) -> str: + s = self.__class__.__name__ + "(" + s += "num_instances={}, ".format(len(self)) + s += "image_height={}, ".format(self._image_size[0]) + s += "image_width={}, ".format(self._image_size[1]) + s += "fields=[{}])".format(", ".join((f"{k}: {v}" for k, v in self._fields.items()))) + return s + + __repr__ = __str__ diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/keypoints.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/keypoints.py new file mode 100644 index 0000000..2242815 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/keypoints.py @@ -0,0 +1,209 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +from typing import Any, List, Tuple, Union +import torch + +from detectron2.layers import interpolate + + +class Keypoints: + """ + Stores keypoint annotation data. GT Instances have a `gt_keypoints` property + containing the x,y location and visibility flag of each keypoint. This tensor has shape + (N, K, 3) where N is the number of instances and K is the number of keypoints per instance. + + The visibility flag follows the COCO format and must be one of three integers: + * v=0: not labeled (in which case x=y=0) + * v=1: labeled but not visible + * v=2: labeled and visible + """ + + def __init__(self, keypoints: Union[torch.Tensor, np.ndarray, List[List[float]]]): + """ + Arguments: + keypoints: A Tensor, numpy array, or list of the x, y, and visibility of each keypoint. + The shape should be (N, K, 3) where N is the number of + instances, and K is the number of keypoints per instance. + """ + device = keypoints.device if isinstance(keypoints, torch.Tensor) else torch.device("cpu") + keypoints = torch.as_tensor(keypoints, dtype=torch.float32, device=device) + assert keypoints.dim() == 3 and keypoints.shape[2] == 3, keypoints.shape + self.tensor = keypoints + + def __len__(self) -> int: + return self.tensor.size(0) + + def to(self, *args: Any, **kwargs: Any) -> "Keypoints": + return type(self)(self.tensor.to(*args, **kwargs)) + + @property + def device(self) -> torch.device: + return self.tensor.device + + def to_heatmap(self, boxes: torch.Tensor, heatmap_size: int) -> torch.Tensor: + """ + Arguments: + boxes: Nx4 tensor, the boxes to draw the keypoints to + + Returns: + heatmaps: + A tensor of shape (N, K) containing an integer spatial label + in the range [0, heatmap_size**2 - 1] for each keypoint in the input. + valid: + A tensor of shape (N, K) containing whether each keypoint is in the roi or not. + """ + return _keypoints_to_heatmap(self.tensor, boxes, heatmap_size) + + def __getitem__(self, item: Union[int, slice, torch.BoolTensor]) -> "Keypoints": + """ + Create a new `Keypoints` by indexing on this `Keypoints`. + + The following usage are allowed: + + 1. `new_kpts = kpts[3]`: return a `Keypoints` which contains only one instance. + 2. `new_kpts = kpts[2:10]`: return a slice of key points. + 3. `new_kpts = kpts[vector]`, where vector is a torch.ByteTensor + with `length = len(kpts)`. Nonzero elements in the vector will be selected. + + Note that the returned Keypoints might share storage with this Keypoints, + subject to Pytorch's indexing semantics. + """ + if isinstance(item, int): + return Keypoints([self.tensor[item]]) + return Keypoints(self.tensor[item]) + + def __repr__(self) -> str: + s = self.__class__.__name__ + "(" + s += "num_instances={})".format(len(self.tensor)) + return s + + +# TODO make this nicer, this is a direct translation from C2 (but removing the inner loop) +def _keypoints_to_heatmap( + keypoints: torch.Tensor, rois: torch.Tensor, heatmap_size: int +) -> Tuple[torch.Tensor, torch.Tensor]: + """ + Encode keypoint locations into a target heatmap for use in SoftmaxWithLoss across space. + + Maps keypoints from the half-open interval [x1, x2) on continuous image coordinates to the + closed interval [0, heatmap_size - 1] on discrete image coordinates. We use the + continuous-discrete conversion from Heckbert 1990 ("What is the coordinate of a pixel?"): + d = floor(c) and c = d + 0.5, where d is a discrete coordinate and c is a continuous coordinate. + + Arguments: + keypoints: tensor of keypoint locations in of shape (N, K, 3). + rois: Nx4 tensor of rois in xyxy format + heatmap_size: integer side length of square heatmap. + + Returns: + heatmaps: A tensor of shape (N, K) containing an integer spatial label + in the range [0, heatmap_size**2 - 1] for each keypoint in the input. + valid: A tensor of shape (N, K) containing whether each keypoint is in + the roi or not. + """ + + if rois.numel() == 0: + return rois.new().long(), rois.new().long() + offset_x = rois[:, 0] + offset_y = rois[:, 1] + scale_x = heatmap_size / (rois[:, 2] - rois[:, 0]) + scale_y = heatmap_size / (rois[:, 3] - rois[:, 1]) + + offset_x = offset_x[:, None] + offset_y = offset_y[:, None] + scale_x = scale_x[:, None] + scale_y = scale_y[:, None] + + x = keypoints[..., 0] + y = keypoints[..., 1] + + x_boundary_inds = x == rois[:, 2][:, None] + y_boundary_inds = y == rois[:, 3][:, None] + + x = (x - offset_x) * scale_x + x = x.floor().long() + y = (y - offset_y) * scale_y + y = y.floor().long() + + x[x_boundary_inds] = heatmap_size - 1 + y[y_boundary_inds] = heatmap_size - 1 + + valid_loc = (x >= 0) & (y >= 0) & (x < heatmap_size) & (y < heatmap_size) + vis = keypoints[..., 2] > 0 + valid = (valid_loc & vis).long() + + lin_ind = y * heatmap_size + x + heatmaps = lin_ind * valid + + return heatmaps, valid + + +@torch.no_grad() +def heatmaps_to_keypoints(maps: torch.Tensor, rois: torch.Tensor) -> torch.Tensor: + """ + Extract predicted keypoint locations from heatmaps. + + Args: + maps (Tensor): (#ROIs, #keypoints, POOL_H, POOL_W). The predicted heatmap of logits for + each ROI and each keypoint. + rois (Tensor): (#ROIs, 4). The box of each ROI. + + Returns: + Tensor of shape (#ROIs, #keypoints, 4) with the last dimension corresponding to + (x, y, logit, score) for each keypoint. + + When converting discrete pixel indices in an NxN image to a continuous keypoint coordinate, + we maintain consistency with :meth:`Keypoints.to_heatmap` by using the conversion from + Heckbert 1990: c = d + 0.5, where d is a discrete coordinate and c is a continuous coordinate. + """ + offset_x = rois[:, 0] + offset_y = rois[:, 1] + + widths = (rois[:, 2] - rois[:, 0]).clamp(min=1) + heights = (rois[:, 3] - rois[:, 1]).clamp(min=1) + widths_ceil = widths.ceil() + heights_ceil = heights.ceil() + + num_rois, num_keypoints = maps.shape[:2] + xy_preds = maps.new_zeros(rois.shape[0], num_keypoints, 4) + + width_corrections = widths / widths_ceil + height_corrections = heights / heights_ceil + + keypoints_idx = torch.arange(num_keypoints, device=maps.device) + + for i in range(num_rois): + outsize = (int(heights_ceil[i]), int(widths_ceil[i])) + roi_map = interpolate(maps[[i]], size=outsize, mode="bicubic", align_corners=False).squeeze( + 0 + ) # #keypoints x H x W + + # softmax over the spatial region + max_score, _ = roi_map.view(num_keypoints, -1).max(1) + max_score = max_score.view(num_keypoints, 1, 1) + tmp_full_resolution = (roi_map - max_score).exp_() + tmp_pool_resolution = (maps[i] - max_score).exp_() + # Produce scores over the region H x W, but normalize with POOL_H x POOL_W, + # so that the scores of objects of different absolute sizes will be more comparable + roi_map_scores = tmp_full_resolution / tmp_pool_resolution.sum((1, 2), keepdim=True) + + w = roi_map.shape[2] + pos = roi_map.view(num_keypoints, -1).argmax(1) + + x_int = pos % w + y_int = (pos - x_int) // w + + assert ( + roi_map_scores[keypoints_idx, y_int, x_int] + == roi_map_scores.view(num_keypoints, -1).max(1)[0] + ).all() + + x = (x_int.float() + 0.5) * width_corrections[i] + y = (y_int.float() + 0.5) * height_corrections[i] + + xy_preds[i, :, 0] = x + offset_x[i] + xy_preds[i, :, 1] = y + offset_y[i] + xy_preds[i, :, 2] = roi_map[keypoints_idx, y_int, x_int] + xy_preds[i, :, 3] = roi_map_scores[keypoints_idx, y_int, x_int] + + return xy_preds diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/masks.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/masks.py new file mode 100644 index 0000000..e363baf --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/masks.py @@ -0,0 +1,424 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import itertools +import numpy as np +from typing import Any, Iterator, List, Union +import pycocotools.mask as mask_utils +import torch + +from detectron2.layers.roi_align import ROIAlign + +from .boxes import Boxes + + +def polygon_area(x, y): + # Using the shoelace formula + # https://stackoverflow.com/questions/24467972/calculate-area-of-polygon-given-x-y-coordinates + return 0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1))) + + +def polygons_to_bitmask(polygons: List[np.ndarray], height: int, width: int) -> np.ndarray: + """ + Args: + polygons (list[ndarray]): each array has shape (Nx2,) + height, width (int) + + Returns: + ndarray: a bool mask of shape (height, width) + """ + assert len(polygons) > 0, "COCOAPI does not support empty polygons" + rles = mask_utils.frPyObjects(polygons, height, width) + rle = mask_utils.merge(rles) + return mask_utils.decode(rle).astype(np.bool) + + +def rasterize_polygons_within_box( + polygons: List[np.ndarray], box: np.ndarray, mask_size: int +) -> torch.Tensor: + """ + Rasterize the polygons into a mask image and + crop the mask content in the given box. + The cropped mask is resized to (mask_size, mask_size). + + This function is used when generating training targets for mask head in Mask R-CNN. + Given original ground-truth masks for an image, new ground-truth mask + training targets in the size of `mask_size x mask_size` + must be provided for each predicted box. This function will be called to + produce such targets. + + Args: + polygons (list[ndarray[float]]): a list of polygons, which represents an instance. + box: 4-element numpy array + mask_size (int): + + Returns: + Tensor: BoolTensor of shape (mask_size, mask_size) + """ + # 1. Shift the polygons w.r.t the boxes + w, h = box[2] - box[0], box[3] - box[1] + + polygons = copy.deepcopy(polygons) + for p in polygons: + p[0::2] = p[0::2] - box[0] + p[1::2] = p[1::2] - box[1] + + # 2. Rescale the polygons to the new box size + # max() to avoid division by small number + ratio_h = mask_size / max(h, 0.1) + ratio_w = mask_size / max(w, 0.1) + + if ratio_h == ratio_w: + for p in polygons: + p *= ratio_h + else: + for p in polygons: + p[0::2] *= ratio_w + p[1::2] *= ratio_h + + # 3. Rasterize the polygons with coco api + mask = polygons_to_bitmask(polygons, mask_size, mask_size) + mask = torch.from_numpy(mask) + return mask + + +class BitMasks: + """ + This class stores the segmentation masks for all objects in one image, in + the form of bitmaps. + + Attributes: + tensor: bool Tensor of N,H,W, representing N instances in the image. + """ + + def __init__(self, tensor: Union[torch.Tensor, np.ndarray]): + """ + Args: + tensor: bool Tensor of N,H,W, representing N instances in the image. + """ + device = tensor.device if isinstance(tensor, torch.Tensor) else torch.device("cpu") + tensor = torch.as_tensor(tensor, dtype=torch.bool, device=device) + assert tensor.dim() == 3, tensor.size() + self.image_size = tensor.shape[1:] + self.tensor = tensor + + def to(self, device: str) -> "BitMasks": + return BitMasks(self.tensor.to(device)) + + @property + def device(self) -> torch.device: + return self.tensor.device + + def __getitem__(self, item: Union[int, slice, torch.BoolTensor]) -> "BitMasks": + """ + Returns: + BitMasks: Create a new :class:`BitMasks` by indexing. + + The following usage are allowed: + + 1. `new_masks = masks[3]`: return a `BitMasks` which contains only one mask. + 2. `new_masks = masks[2:10]`: return a slice of masks. + 3. `new_masks = masks[vector]`, where vector is a torch.BoolTensor + with `length = len(masks)`. Nonzero elements in the vector will be selected. + + Note that the returned object might share storage with this object, + subject to Pytorch's indexing semantics. + """ + if isinstance(item, int): + return BitMasks(self.tensor[item].view(1, -1)) + m = self.tensor[item] + assert m.dim() == 3, "Indexing on BitMasks with {} returns a tensor with shape {}!".format( + item, m.shape + ) + return BitMasks(m) + + def __iter__(self) -> torch.Tensor: + yield from self.tensor + + def __repr__(self) -> str: + s = self.__class__.__name__ + "(" + s += "num_instances={})".format(len(self.tensor)) + return s + + def __len__(self) -> int: + return self.tensor.shape[0] + + def nonempty(self) -> torch.Tensor: + """ + Find masks that are non-empty. + + Returns: + Tensor: a BoolTensor which represents + whether each mask is empty (False) or non-empty (True). + """ + return self.tensor.flatten(1).any(dim=1) + + @staticmethod + def from_polygon_masks( + polygon_masks: Union["PolygonMasks", List[List[np.ndarray]]], height: int, width: int + ) -> "BitMasks": + """ + Args: + polygon_masks (list[list[ndarray]] or PolygonMasks) + height, width (int) + """ + if isinstance(polygon_masks, PolygonMasks): + polygon_masks = polygon_masks.polygons + masks = [polygons_to_bitmask(p, height, width) for p in polygon_masks] + return BitMasks(torch.stack([torch.from_numpy(x) for x in masks])) + + def crop_and_resize(self, boxes: torch.Tensor, mask_size: int) -> torch.Tensor: + """ + Crop each bitmask by the given box, and resize results to (mask_size, mask_size). + This can be used to prepare training targets for Mask R-CNN. + It has less reconstruction error compared to rasterization with polygons. + However we observe no difference in accuracy, + but BitMasks requires more memory to store all the masks. + + Args: + boxes (Tensor): Nx4 tensor storing the boxes for each mask + mask_size (int): the size of the rasterized mask. + + Returns: + Tensor: + A bool tensor of shape (N, mask_size, mask_size), where + N is the number of predicted boxes for this image. + """ + assert len(boxes) == len(self), "{} != {}".format(len(boxes), len(self)) + device = self.tensor.device + + batch_inds = torch.arange(len(boxes), device=device).to(dtype=boxes.dtype)[:, None] + rois = torch.cat([batch_inds, boxes], dim=1) # Nx5 + + bit_masks = self.tensor.to(dtype=torch.float32) + rois = rois.to(device=device) + output = ( + ROIAlign((mask_size, mask_size), 1.0, 0, aligned=True) + .forward(bit_masks[:, None, :, :], rois) + .squeeze(1) + ) + output = output >= 0.5 + return output + + def get_bounding_boxes(self) -> None: + # not needed now + raise NotImplementedError + + @staticmethod + def cat(bitmasks_list: List["BitMasks"]) -> "BitMasks": + """ + Concatenates a list of BitMasks into a single BitMasks + + Arguments: + bitmasks_list (list[BitMasks]) + + Returns: + BitMasks: the concatenated BitMasks + """ + assert isinstance(bitmasks_list, (list, tuple)) + assert len(bitmasks_list) > 0 + assert all(isinstance(bitmask, BitMasks) for bitmask in bitmasks_list) + + cat_bitmasks = type(bitmasks_list[0])(torch.cat([bm.tensor for bm in bitmasks_list], dim=0)) + return cat_bitmasks + + +class PolygonMasks: + """ + This class stores the segmentation masks for all objects in one image, in the form of polygons. + + Attributes: + polygons: list[list[ndarray]]. Each ndarray is a float64 vector representing a polygon. + """ + + def __init__(self, polygons: List[List[Union[torch.Tensor, np.ndarray]]]): + """ + Arguments: + polygons (list[list[np.ndarray]]): The first + level of the list correspond to individual instances, + the second level to all the polygons that compose the + instance, and the third level to the polygon coordinates. + The third level array should have the format of + [x0, y0, x1, y1, ..., xn, yn] (n >= 3). + """ + assert isinstance(polygons, list), ( + "Cannot create PolygonMasks: Expect a list of list of polygons per image. " + "Got '{}' instead.".format(type(polygons)) + ) + + def _make_array(t: Union[torch.Tensor, np.ndarray]) -> np.ndarray: + # Use float64 for higher precision, because why not? + # Always put polygons on CPU (self.to is a no-op) since they + # are supposed to be small tensors. + # May need to change this assumption if GPU placement becomes useful + if isinstance(t, torch.Tensor): + t = t.cpu().numpy() + return np.asarray(t).astype("float64") + + def process_polygons( + polygons_per_instance: List[Union[torch.Tensor, np.ndarray]] + ) -> List[np.ndarray]: + assert isinstance(polygons_per_instance, list), ( + "Cannot create polygons: Expect a list of polygons per instance. " + "Got '{}' instead.".format(type(polygons_per_instance)) + ) + # transform the polygon to a tensor + polygons_per_instance = [_make_array(p) for p in polygons_per_instance] + for polygon in polygons_per_instance: + assert len(polygon) % 2 == 0 and len(polygon) >= 6 + return polygons_per_instance + + self.polygons: List[List[np.ndarray]] = [ + process_polygons(polygons_per_instance) for polygons_per_instance in polygons + ] + + def to(self, *args: Any, **kwargs: Any) -> "PolygonMasks": + return self + + @property + def device(self) -> torch.device: + return torch.device("cpu") + + def get_bounding_boxes(self) -> Boxes: + """ + Returns: + Boxes: tight bounding boxes around polygon masks. + """ + boxes = torch.zeros(len(self.polygons), 4, dtype=torch.float32) + for idx, polygons_per_instance in enumerate(self.polygons): + minxy = torch.as_tensor([float("inf"), float("inf")], dtype=torch.float32) + maxxy = torch.zeros(2, dtype=torch.float32) + for polygon in polygons_per_instance: + coords = torch.from_numpy(polygon).view(-1, 2).to(dtype=torch.float32) + minxy = torch.min(minxy, torch.min(coords, dim=0).values) + maxxy = torch.max(maxxy, torch.max(coords, dim=0).values) + boxes[idx, :2] = minxy + boxes[idx, 2:] = maxxy + return Boxes(boxes) + + def nonempty(self) -> torch.Tensor: + """ + Find masks that are non-empty. + + Returns: + Tensor: + a BoolTensor which represents whether each mask is empty (False) or not (True). + """ + keep = [1 if len(polygon) > 0 else 0 for polygon in self.polygons] + return torch.from_numpy(np.asarray(keep, dtype=np.bool)) + + def __getitem__(self, item: Union[int, slice, List[int], torch.BoolTensor]) -> "PolygonMasks": + """ + Support indexing over the instances and return a `PolygonMasks` object. + `item` can be: + + 1. An integer. It will return an object with only one instance. + 2. A slice. It will return an object with the selected instances. + 3. A list[int]. It will return an object with the selected instances, + correpsonding to the indices in the list. + 4. A vector mask of type BoolTensor, whose length is num_instances. + It will return an object with the instances whose mask is nonzero. + """ + if isinstance(item, int): + selected_polygons = [self.polygons[item]] + elif isinstance(item, slice): + selected_polygons = self.polygons[item] + elif isinstance(item, list): + selected_polygons = [self.polygons[i] for i in item] + elif isinstance(item, torch.Tensor): + # Polygons is a list, so we have to move the indices back to CPU. + if item.dtype == torch.bool: + assert item.dim() == 1, item.shape + item = item.nonzero().squeeze(1).cpu().numpy().tolist() + elif item.dtype in [torch.int32, torch.int64]: + item = item.cpu().numpy().tolist() + else: + raise ValueError("Unsupported tensor dtype={} for indexing!".format(item.dtype)) + selected_polygons = [self.polygons[i] for i in item] + return PolygonMasks(selected_polygons) + + def __iter__(self) -> Iterator[List[np.ndarray]]: + """ + Yields: + list[ndarray]: the polygons for one instance. + Each Tensor is a float64 vector representing a polygon. + """ + return iter(self.polygons) + + def __repr__(self) -> str: + s = self.__class__.__name__ + "(" + s += "num_instances={})".format(len(self.polygons)) + return s + + def __len__(self) -> int: + return len(self.polygons) + + def crop_and_resize(self, boxes: torch.Tensor, mask_size: int) -> torch.Tensor: + """ + Crop each mask by the given box, and resize results to (mask_size, mask_size). + This can be used to prepare training targets for Mask R-CNN. + + Args: + boxes (Tensor): Nx4 tensor storing the boxes for each mask + mask_size (int): the size of the rasterized mask. + + Returns: + Tensor: A bool tensor of shape (N, mask_size, mask_size), where + N is the number of predicted boxes for this image. + """ + assert len(boxes) == len(self), "{} != {}".format(len(boxes), len(self)) + + device = boxes.device + # Put boxes on the CPU, as the polygon representation is not efficient GPU-wise + # (several small tensors for representing a single instance mask) + boxes = boxes.to(torch.device("cpu")) + + results = [ + rasterize_polygons_within_box(poly, box.numpy(), mask_size) + for poly, box in zip(self.polygons, boxes) + ] + """ + poly: list[list[float]], the polygons for one instance + box: a tensor of shape (4,) + """ + if len(results) == 0: + return torch.empty(0, mask_size, mask_size, dtype=torch.bool, device=device) + return torch.stack(results, dim=0).to(device=device) + + def area(self): + """ + Computes area of the mask. + Only works with Polygons, using the shoelace formula: + https://stackoverflow.com/questions/24467972/calculate-area-of-polygon-given-x-y-coordinates + + Returns: + Tensor: a vector, area for each instance + """ + + area = [] + for polygons_per_instance in self.polygons: + area_per_instance = 0 + for p in polygons_per_instance: + area_per_instance += polygon_area(p[0::2], p[1::2]) + area.append(area_per_instance) + + return torch.tensor(area) + + @staticmethod + def cat(polymasks_list: List["PolygonMasks"]) -> "PolygonMasks": + """ + Concatenates a list of PolygonMasks into a single PolygonMasks + + Arguments: + polymasks_list (list[PolygonMasks]) + + Returns: + PolygonMasks: the concatenated PolygonMasks + """ + assert isinstance(polymasks_list, (list, tuple)) + assert len(polymasks_list) > 0 + assert all(isinstance(polymask, PolygonMasks) for polymask in polymasks_list) + + cat_polymasks = type(polymasks_list[0])( + list(itertools.chain.from_iterable(pm.polygons for pm in polymasks_list)) + ) + return cat_polymasks diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/rotated_boxes.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/rotated_boxes.py new file mode 100644 index 0000000..823cfb6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/structures/rotated_boxes.py @@ -0,0 +1,481 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +from typing import Iterator, Union +import torch + +from detectron2.layers.rotated_boxes import pairwise_iou_rotated + +from .boxes import Boxes + + +class RotatedBoxes(Boxes): + """ + This structure stores a list of rotated boxes as a Nx5 torch.Tensor. + It supports some common methods about boxes + (`area`, `clip`, `nonempty`, etc), + and also behaves like a Tensor + (support indexing, `to(device)`, `.device`, and iteration over all boxes) + """ + + def __init__(self, tensor: torch.Tensor): + """ + Args: + tensor (Tensor[float]): a Nx5 matrix. Each row is + (x_center, y_center, width, height, angle), + in which angle is represented in degrees. + While there's no strict range restriction for it, + the recommended principal range is between [-180, 180) degrees. + + Assume we have a horizontal box B = (x_center, y_center, width, height), + where width is along the x-axis and height is along the y-axis. + The rotated box B_rot (x_center, y_center, width, height, angle) + can be seen as: + + 1. When angle == 0: + B_rot == B + 2. When angle > 0: + B_rot is obtained by rotating B w.r.t its center by :math:`|angle|` degrees CCW; + 3. When angle < 0: + B_rot is obtained by rotating B w.r.t its center by :math:`|angle|` degrees CW. + + Mathematically, since the right-handed coordinate system for image space + is (y, x), where y is top->down and x is left->right, the 4 vertices of the + rotated rectangle :math:`(yr_i, xr_i)` (i = 1, 2, 3, 4) can be obtained from + the vertices of the horizontal rectangle (y_i, x_i) (i = 1, 2, 3, 4) + in the following way (:math:`\\theta = angle*\\pi/180` is the angle in radians, + (y_c, x_c) is the center of the rectangle): + + .. math:: + + yr_i = \\cos(\\theta) (y_i - y_c) - \\sin(\\theta) (x_i - x_c) + y_c, + + xr_i = \\sin(\\theta) (y_i - y_c) + \\cos(\\theta) (x_i - x_c) + x_c, + + which is the standard rigid-body rotation transformation. + + Intuitively, the angle is + (1) the rotation angle from y-axis in image space + to the height vector (top->down in the box's local coordinate system) + of the box in CCW, and + (2) the rotation angle from x-axis in image space + to the width vector (left->right in the box's local coordinate system) + of the box in CCW. + + More intuitively, consider the following horizontal box ABCD represented + in (x1, y1, x2, y2): (3, 2, 7, 4), + covering the [3, 7] x [2, 4] region of the continuous coordinate system + which looks like this: + + .. code:: none + + O--------> x + | + | A---B + | | | + | D---C + | + v y + + Note that each capital letter represents one 0-dimensional geometric point + instead of a 'square pixel' here. + + In the example above, using (x, y) to represent a point we have: + + .. math:: + + O = (0, 0), A = (3, 2), B = (7, 2), C = (7, 4), D = (3, 4) + + We name vector AB = vector DC as the width vector in box's local coordinate system, and + vector AD = vector BC as the height vector in box's local coordinate system. Initially, + when angle = 0 degree, they're aligned with the positive directions of x-axis and y-axis + in the image space, respectively. + + For better illustration, we denote the center of the box as E, + + .. code:: none + + O--------> x + | + | A---B + | | E | + | D---C + | + v y + + where the center E = ((3+7)/2, (2+4)/2) = (5, 3). + + Also, + + .. math:: + + width = |AB| = |CD| = 7 - 3 = 4, + height = |AD| = |BC| = 4 - 2 = 2. + + Therefore, the corresponding representation for the same shape in rotated box in + (x_center, y_center, width, height, angle) format is: + + (5, 3, 4, 2, 0), + + Now, let's consider (5, 3, 4, 2, 90), which is rotated by 90 degrees + CCW (counter-clockwise) by definition. It looks like this: + + .. code:: none + + O--------> x + | B-C + | | | + | |E| + | | | + | A-D + v y + + The center E is still located at the same point (5, 3), while the vertices + ABCD are rotated by 90 degrees CCW with regard to E: + A = (4, 5), B = (4, 1), C = (6, 1), D = (6, 5) + + Here, 90 degrees can be seen as the CCW angle to rotate from y-axis to + vector AD or vector BC (the top->down height vector in box's local coordinate system), + or the CCW angle to rotate from x-axis to vector AB or vector DC (the left->right + width vector in box's local coordinate system). + + .. math:: + + width = |AB| = |CD| = 5 - 1 = 4, + height = |AD| = |BC| = 6 - 4 = 2. + + Next, how about (5, 3, 4, 2, -90), which is rotated by 90 degrees CW (clockwise) + by definition? It looks like this: + + .. code:: none + + O--------> x + | D-A + | | | + | |E| + | | | + | C-B + v y + + The center E is still located at the same point (5, 3), while the vertices + ABCD are rotated by 90 degrees CW with regard to E: + A = (6, 1), B = (6, 5), C = (4, 5), D = (4, 1) + + .. math:: + + width = |AB| = |CD| = 5 - 1 = 4, + height = |AD| = |BC| = 6 - 4 = 2. + + This covers exactly the same region as (5, 3, 4, 2, 90) does, and their IoU + will be 1. However, these two will generate different RoI Pooling results and + should not be treated as an identical box. + + On the other hand, it's easy to see that (X, Y, W, H, A) is identical to + (X, Y, W, H, A+360N), for any integer N. For example (5, 3, 4, 2, 270) would be + identical to (5, 3, 4, 2, -90), because rotating the shape 270 degrees CCW is + equivalent to rotating the same shape 90 degrees CW. + + We could rotate further to get (5, 3, 4, 2, 180), or (5, 3, 4, 2, -180): + + .. code:: none + + O--------> x + | + | C---D + | | E | + | B---A + | + v y + + .. math:: + + A = (7, 4), B = (3, 4), C = (3, 2), D = (7, 2), + + width = |AB| = |CD| = 7 - 3 = 4, + height = |AD| = |BC| = 4 - 2 = 2. + + Finally, this is a very inaccurate (heavily quantized) illustration of + how (5, 3, 4, 2, 60) looks like in case anyone wonders: + + .. code:: none + + O--------> x + | B\ + | / C + | /E / + | A / + | `D + v y + + It's still a rectangle with center of (5, 3), width of 4 and height of 2, + but its angle (and thus orientation) is somewhere between + (5, 3, 4, 2, 0) and (5, 3, 4, 2, 90). + """ + device = tensor.device if isinstance(tensor, torch.Tensor) else torch.device("cpu") + tensor = torch.as_tensor(tensor, dtype=torch.float32, device=device) + if tensor.numel() == 0: + # Use reshape, so we don't end up creating a new tensor that does not depend on + # the inputs (and consequently confuses jit) + tensor = tensor.reshape((0, 5)).to(dtype=torch.float32, device=device) + assert tensor.dim() == 2 and tensor.size(-1) == 5, tensor.size() + + self.tensor = tensor + + def clone(self) -> "RotatedBoxes": + """ + Clone the RotatedBoxes. + + Returns: + RotatedBoxes + """ + return RotatedBoxes(self.tensor.clone()) + + def to(self, device: str) -> "RotatedBoxes": + return RotatedBoxes(self.tensor.to(device)) + + def area(self) -> torch.Tensor: + """ + Computes the area of all the boxes. + + Returns: + torch.Tensor: a vector with areas of each box. + """ + box = self.tensor + area = box[:, 2] * box[:, 3] + return area + + def normalize_angles(self) -> None: + """ + Restrict angles to the range of [-180, 180) degrees + """ + self.tensor[:, 4] = (self.tensor[:, 4] + 180.0) % 360.0 - 180.0 + + def clip(self, box_size: Boxes.BoxSizeType, clip_angle_threshold: float = 1.0) -> None: + """ + Clip (in place) the boxes by limiting x coordinates to the range [0, width] + and y coordinates to the range [0, height]. + + For RRPN: + Only clip boxes that are almost horizontal with a tolerance of + clip_angle_threshold to maintain backward compatibility. + + Rotated boxes beyond this threshold are not clipped for two reasons: + + 1. There are potentially multiple ways to clip a rotated box to make it + fit within the image. + 2. It's tricky to make the entire rectangular box fit within the image + and still be able to not leave out pixels of interest. + + Therefore we rely on ops like RoIAlignRotated to safely handle this. + + Args: + box_size (height, width): The clipping box's size. + clip_angle_threshold: + Iff. abs(normalized(angle)) <= clip_angle_threshold (in degrees), + we do the clipping as horizontal boxes. + """ + h, w = box_size + + # normalize angles to be within (-180, 180] degrees + self.normalize_angles() + + idx = torch.where(torch.abs(self.tensor[:, 4]) <= clip_angle_threshold)[0] + + # convert to (x1, y1, x2, y2) + x1 = self.tensor[idx, 0] - self.tensor[idx, 2] / 2.0 + y1 = self.tensor[idx, 1] - self.tensor[idx, 3] / 2.0 + x2 = self.tensor[idx, 0] + self.tensor[idx, 2] / 2.0 + y2 = self.tensor[idx, 1] + self.tensor[idx, 3] / 2.0 + + # clip + x1.clamp_(min=0, max=w) + y1.clamp_(min=0, max=h) + x2.clamp_(min=0, max=w) + y2.clamp_(min=0, max=h) + + # convert back to (xc, yc, w, h) + self.tensor[idx, 0] = (x1 + x2) / 2.0 + self.tensor[idx, 1] = (y1 + y2) / 2.0 + # make sure widths and heights do not increase due to numerical errors + self.tensor[idx, 2] = torch.min(self.tensor[idx, 2], x2 - x1) + self.tensor[idx, 3] = torch.min(self.tensor[idx, 3], y2 - y1) + + def nonempty(self, threshold: float = 0.0) -> torch.Tensor: + """ + Find boxes that are non-empty. + A box is considered empty, if either of its side is no larger than threshold. + + Returns: + Tensor: a binary vector which represents + whether each box is empty (False) or non-empty (True). + """ + box = self.tensor + widths = box[:, 2] + heights = box[:, 3] + keep = (widths > threshold) & (heights > threshold) + return keep + + def __getitem__(self, item: Union[int, slice, torch.BoolTensor]) -> "RotatedBoxes": + """ + Returns: + RotatedBoxes: Create a new :class:`RotatedBoxes` by indexing. + + The following usage are allowed: + + 1. `new_boxes = boxes[3]`: return a `RotatedBoxes` which contains only one box. + 2. `new_boxes = boxes[2:10]`: return a slice of boxes. + 3. `new_boxes = boxes[vector]`, where vector is a torch.ByteTensor + with `length = len(boxes)`. Nonzero elements in the vector will be selected. + + Note that the returned RotatedBoxes might share storage with this RotatedBoxes, + subject to Pytorch's indexing semantics. + """ + if isinstance(item, int): + return RotatedBoxes(self.tensor[item].view(1, -1)) + b = self.tensor[item] + assert b.dim() == 2, "Indexing on RotatedBoxes with {} failed to return a matrix!".format( + item + ) + return RotatedBoxes(b) + + def __len__(self) -> int: + return self.tensor.shape[0] + + def __repr__(self) -> str: + return "RotatedBoxes(" + str(self.tensor) + ")" + + def inside_box(self, box_size: Boxes.BoxSizeType, boundary_threshold: int = 0) -> torch.Tensor: + """ + Args: + box_size (height, width): Size of the reference box covering + [0, width] x [0, height] + boundary_threshold (int): Boxes that extend beyond the reference box + boundary by more than boundary_threshold are considered "outside". + + For RRPN, it might not be necessary to call this function since it's common + for rotated box to extend to outside of the image boundaries + (the clip function only clips the near-horizontal boxes) + + Returns: + a binary vector, indicating whether each box is inside the reference box. + """ + height, width = box_size + + cnt_x = self.tensor[..., 0] + cnt_y = self.tensor[..., 1] + half_w = self.tensor[..., 2] / 2.0 + half_h = self.tensor[..., 3] / 2.0 + a = self.tensor[..., 4] + c = torch.abs(torch.cos(a * math.pi / 180.0)) + s = torch.abs(torch.sin(a * math.pi / 180.0)) + # This basically computes the horizontal bounding rectangle of the rotated box + max_rect_dx = c * half_w + s * half_h + max_rect_dy = c * half_h + s * half_w + + inds_inside = ( + (cnt_x - max_rect_dx >= -boundary_threshold) + & (cnt_y - max_rect_dy >= -boundary_threshold) + & (cnt_x + max_rect_dx < width + boundary_threshold) + & (cnt_y + max_rect_dy < height + boundary_threshold) + ) + + return inds_inside + + def get_centers(self) -> torch.Tensor: + """ + Returns: + The box centers in a Nx2 array of (x, y). + """ + return self.tensor[:, :2] + + def scale(self, scale_x: float, scale_y: float) -> None: + """ + Scale the rotated box with horizontal and vertical scaling factors + Note: when scale_factor_x != scale_factor_y, + the rotated box does not preserve the rectangular shape when the angle + is not a multiple of 90 degrees under resize transformation. + Instead, the shape is a parallelogram (that has skew) + Here we make an approximation by fitting a rotated rectangle to the parallelogram. + """ + self.tensor[:, 0] *= scale_x + self.tensor[:, 1] *= scale_y + theta = self.tensor[:, 4] * math.pi / 180.0 + c = torch.cos(theta) + s = torch.sin(theta) + + # In image space, y is top->down and x is left->right + # Consider the local coordintate system for the rotated box, + # where the box center is located at (0, 0), and the four vertices ABCD are + # A(-w / 2, -h / 2), B(w / 2, -h / 2), C(w / 2, h / 2), D(-w / 2, h / 2) + # the midpoint of the left edge AD of the rotated box E is: + # E = (A+D)/2 = (-w / 2, 0) + # the midpoint of the top edge AB of the rotated box F is: + # F(0, -h / 2) + # To get the old coordinates in the global system, apply the rotation transformation + # (Note: the right-handed coordinate system for image space is yOx): + # (old_x, old_y) = (s * y + c * x, c * y - s * x) + # E(old) = (s * 0 + c * (-w/2), c * 0 - s * (-w/2)) = (-c * w / 2, s * w / 2) + # F(old) = (s * (-h / 2) + c * 0, c * (-h / 2) - s * 0) = (-s * h / 2, -c * h / 2) + # After applying the scaling factor (sfx, sfy): + # E(new) = (-sfx * c * w / 2, sfy * s * w / 2) + # F(new) = (-sfx * s * h / 2, -sfy * c * h / 2) + # The new width after scaling tranformation becomes: + + # w(new) = |E(new) - O| * 2 + # = sqrt[(sfx * c * w / 2)^2 + (sfy * s * w / 2)^2] * 2 + # = sqrt[(sfx * c)^2 + (sfy * s)^2] * w + # i.e., scale_factor_w = sqrt[(sfx * c)^2 + (sfy * s)^2] + # + # For example, + # when angle = 0 or 180, |c| = 1, s = 0, scale_factor_w == scale_factor_x; + # when |angle| = 90, c = 0, |s| = 1, scale_factor_w == scale_factor_y + self.tensor[:, 2] *= torch.sqrt((scale_x * c) ** 2 + (scale_y * s) ** 2) + + # h(new) = |F(new) - O| * 2 + # = sqrt[(sfx * s * h / 2)^2 + (sfy * c * h / 2)^2] * 2 + # = sqrt[(sfx * s)^2 + (sfy * c)^2] * h + # i.e., scale_factor_h = sqrt[(sfx * s)^2 + (sfy * c)^2] + # + # For example, + # when angle = 0 or 180, |c| = 1, s = 0, scale_factor_h == scale_factor_y; + # when |angle| = 90, c = 0, |s| = 1, scale_factor_h == scale_factor_x + self.tensor[:, 3] *= torch.sqrt((scale_x * s) ** 2 + (scale_y * c) ** 2) + + # The angle is the rotation angle from y-axis in image space to the height + # vector (top->down in the box's local coordinate system) of the box in CCW. + # + # angle(new) = angle_yOx(O - F(new)) + # = angle_yOx( (sfx * s * h / 2, sfy * c * h / 2) ) + # = atan2(sfx * s * h / 2, sfy * c * h / 2) + # = atan2(sfx * s, sfy * c) + # + # For example, + # when sfx == sfy, angle(new) == atan2(s, c) == angle(old) + self.tensor[:, 4] = torch.atan2(scale_x * s, scale_y * c) * 180 / math.pi + + @property + def device(self) -> str: + return self.tensor.device + + def __iter__(self) -> Iterator[torch.Tensor]: + """ + Yield a box as a Tensor of shape (5,) at a time. + """ + yield from self.tensor + + +def pairwise_iou(boxes1: RotatedBoxes, boxes2: RotatedBoxes) -> None: + """ + Given two lists of rotated boxes of size N and M, + compute the IoU (intersection over union) + between __all__ N x M pairs of boxes. + The box order must be (x_center, y_center, width, height, angle). + + Args: + boxes1, boxes2 (RotatedBoxes): + two `RotatedBoxes`. Contains N & M rotated boxes, respectively. + + Returns: + Tensor: IoU, sized [N,M]. + """ + + return pairwise_iou_rotated(boxes1.tensor, boxes2.tensor) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/README.md b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/README.md new file mode 100644 index 0000000..9765b24 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/README.md @@ -0,0 +1,5 @@ +# Utility functions + +This folder contain utility functions that are not used in the +core library, but are useful for building models or training +code using the config system. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/__init__.py new file mode 100644 index 0000000..168f997 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/analysis.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/analysis.py new file mode 100644 index 0000000..c48e376 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/analysis.py @@ -0,0 +1,164 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +# -*- coding: utf-8 -*- + +import logging +import typing +import torch +from fvcore.nn import activation_count, flop_count, parameter_count, parameter_count_table +from torch import nn + +from detectron2.structures import BitMasks, Boxes, ImageList, Instances + +from .logger import log_first_n + +__all__ = [ + "activation_count_operators", + "flop_count_operators", + "parameter_count_table", + "parameter_count", +] + +FLOPS_MODE = "flops" +ACTIVATIONS_MODE = "activations" + + +# some extra ops to ignore from counting. +_IGNORED_OPS = [ + "aten::add", + "aten::add_", + "aten::batch_norm", + "aten::constant_pad_nd", + "aten::div", + "aten::div_", + "aten::exp", + "aten::log2", + "aten::max_pool2d", + "aten::meshgrid", + "aten::mul", + "aten::mul_", + "aten::nonzero_numpy", + "aten::relu", + "aten::relu_", + "aten::rsub", + "aten::sigmoid", + "aten::sigmoid_", + "aten::softmax", + "aten::sort", + "aten::sqrt", + "aten::sub", + "aten::upsample_nearest2d", + "prim::PythonOp", + "torchvision::nms", +] + + +def flop_count_operators( + model: nn.Module, inputs: list, **kwargs +) -> typing.DefaultDict[str, float]: + """ + Implement operator-level flops counting using jit. + This is a wrapper of fvcore.nn.flop_count, that supports standard detection models + in detectron2. + + Note: + The function runs the input through the model to compute flops. + The flops of a detection model is often input-dependent, for example, + the flops of box & mask head depends on the number of proposals & + the number of detected objects. + Therefore, the flops counting using a single input may not accurately + reflect the computation cost of a model. + + Args: + model: a detectron2 model that takes `list[dict]` as input. + inputs (list[dict]): inputs to model, in detectron2's standard format. + """ + return _wrapper_count_operators(model=model, inputs=inputs, mode=FLOPS_MODE, **kwargs) + + +def activation_count_operators( + model: nn.Module, inputs: list, **kwargs +) -> typing.DefaultDict[str, float]: + """ + Implement operator-level activations counting using jit. + This is a wrapper of fvcore.nn.activation_count, that supports standard detection models + in detectron2. + + Note: + The function runs the input through the model to compute activations. + The activations of a detection model is often input-dependent, for example, + the activations of box & mask head depends on the number of proposals & + the number of detected objects. + + Args: + model: a detectron2 model that takes `list[dict]` as input. + inputs (list[dict]): inputs to model, in detectron2's standard format. + """ + return _wrapper_count_operators(model=model, inputs=inputs, mode=ACTIVATIONS_MODE, **kwargs) + + +def _flatten_to_tuple(outputs): + result = [] + if isinstance(outputs, torch.Tensor): + result.append(outputs) + elif isinstance(outputs, (list, tuple)): + for v in outputs: + result.extend(_flatten_to_tuple(v)) + elif isinstance(outputs, dict): + for _, v in outputs.items(): + result.extend(_flatten_to_tuple(v)) + elif isinstance(outputs, Instances): + result.extend(_flatten_to_tuple(outputs.get_fields())) + elif isinstance(outputs, (Boxes, BitMasks, ImageList)): + result.append(outputs.tensor) + else: + log_first_n( + logging.WARN, + f"Output of type {type(outputs)} not included in flops/activations count.", + n=10, + ) + return tuple(result) + + +def _wrapper_count_operators( + model: nn.Module, inputs: list, mode: str, **kwargs +) -> typing.DefaultDict[str, float]: + + # ignore some ops + supported_ops = {k: lambda *args, **kwargs: {} for k in _IGNORED_OPS} + supported_ops.update(kwargs.pop("supported_ops", {})) + kwargs["supported_ops"] = supported_ops + + assert len(inputs) == 1, "Please use batch size=1" + tensor_input = inputs[0]["image"] + + class WrapModel(nn.Module): + def __init__(self, model): + super().__init__() + if isinstance( + model, (nn.parallel.distributed.DistributedDataParallel, nn.DataParallel) + ): + self.model = model.module + else: + self.model = model + + def forward(self, image): + # jit requires the input/output to be Tensors + inputs = [{"image": image}] + outputs = self.model.forward(inputs) + # Only the subgraph that computes the returned tuple of tensor will be + # counted. So we flatten everything we found to tuple of tensors. + return _flatten_to_tuple(outputs) + + old_train = model.training + with torch.no_grad(): + if mode == FLOPS_MODE: + ret = flop_count(WrapModel(model).train(False), (tensor_input,), **kwargs) + elif mode == ACTIVATIONS_MODE: + ret = activation_count(WrapModel(model).train(False), (tensor_input,), **kwargs) + else: + raise NotImplementedError("Count for mode {} is not supported yet.".format(mode)) + # compatible with change in fvcore + if isinstance(ret, tuple): + ret = ret[0] + model.train(old_train) + return ret diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/collect_env.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/collect_env.py new file mode 100644 index 0000000..c25b99c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/collect_env.py @@ -0,0 +1,160 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import importlib +import numpy as np +import os +import re +import subprocess +import sys +from collections import defaultdict +import PIL +import torch +import torchvision +from tabulate import tabulate + +__all__ = ["collect_env_info"] + + +def collect_torch_env(): + try: + import torch.__config__ + + return torch.__config__.show() + except ImportError: + # compatible with older versions of pytorch + from torch.utils.collect_env import get_pretty_env_info + + return get_pretty_env_info() + + +def get_env_module(): + var_name = "DETECTRON2_ENV_MODULE" + return var_name, os.environ.get(var_name, "") + + +def detect_compute_compatibility(CUDA_HOME, so_file): + try: + cuobjdump = os.path.join(CUDA_HOME, "bin", "cuobjdump") + if os.path.isfile(cuobjdump): + output = subprocess.check_output( + "'{}' --list-elf '{}'".format(cuobjdump, so_file), shell=True + ) + output = output.decode("utf-8").strip().split("\n") + sm = [] + for line in output: + line = re.findall(r"\.sm_[0-9]*\.", line)[0] + sm.append(line.strip(".")) + sm = sorted(set(sm)) + return ", ".join(sm) + else: + return so_file + "; cannot find cuobjdump" + except Exception: + # unhandled failure + return so_file + + +def collect_env_info(): + has_cuda = torch.cuda.is_available() + # NOTE: the use of CUDA_HOME requires the CUDA build deps, though in + # theory detectron2 should be made runnable with only the CUDA runtime + from torch.utils.cpp_extension import CUDA_HOME + + data = [] + data.append(("sys.platform", sys.platform)) + data.append(("Python", sys.version.replace("\n", ""))) + data.append(("numpy", np.__version__)) + + try: + import detectron2 # noqa + + data.append( + ("detectron2", detectron2.__version__ + " @" + os.path.dirname(detectron2.__file__)) + ) + except ImportError: + data.append(("detectron2", "failed to import")) + else: + try: + from detectron2 import _C + except ImportError: + data.append(("detectron2._C", "failed to import")) + else: + data.append(("detectron2 compiler", _C.get_compiler_version())) + data.append(("detectron2 CUDA compiler", _C.get_cuda_version())) + if has_cuda: + data.append( + ("detectron2 arch flags", detect_compute_compatibility(CUDA_HOME, _C.__file__)) + ) + + data.append(get_env_module()) + data.append(("PyTorch", torch.__version__ + " @" + os.path.dirname(torch.__file__))) + data.append(("PyTorch debug build", torch.version.debug)) + + data.append(("CUDA available", has_cuda)) + if has_cuda: + devices = defaultdict(list) + for k in range(torch.cuda.device_count()): + devices[torch.cuda.get_device_name(k)].append(str(k)) + for name, devids in devices.items(): + data.append(("GPU " + ",".join(devids), name)) + + from torch.utils.cpp_extension import CUDA_HOME + + data.append(("CUDA_HOME", str(CUDA_HOME))) + + if CUDA_HOME is not None and os.path.isdir(CUDA_HOME): + try: + nvcc = os.path.join(CUDA_HOME, "bin", "nvcc") + nvcc = subprocess.check_output("'{}' -V | tail -n1".format(nvcc), shell=True) + nvcc = nvcc.decode("utf-8").strip() + except subprocess.SubprocessError: + nvcc = "Not Available" + data.append(("NVCC", nvcc)) + + cuda_arch_list = os.environ.get("TORCH_CUDA_ARCH_LIST", None) + if cuda_arch_list: + data.append(("TORCH_CUDA_ARCH_LIST", cuda_arch_list)) + data.append(("Pillow", PIL.__version__)) + + try: + data.append( + ( + "torchvision", + str(torchvision.__version__) + " @" + os.path.dirname(torchvision.__file__), + ) + ) + if has_cuda: + try: + torchvision_C = importlib.util.find_spec("torchvision._C").origin + msg = detect_compute_compatibility(CUDA_HOME, torchvision_C) + data.append(("torchvision arch flags", msg)) + except ImportError: + data.append(("torchvision._C", "failed to find")) + except AttributeError: + data.append(("torchvision", "unknown")) + + try: + import fvcore + + data.append(("fvcore", fvcore.__version__)) + except ImportError: + pass + + try: + import cv2 + + data.append(("cv2", cv2.__version__)) + except ImportError: + pass + env_str = tabulate(data) + "\n" + env_str += collect_torch_env() + return env_str + + +if __name__ == "__main__": + try: + import detectron2 # noqa + except ImportError: + print(collect_env_info()) + else: + from detectron2.utils.collect_env import collect_env_info + + print(collect_env_info()) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/colormap.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/colormap.py new file mode 100644 index 0000000..1bf1455 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/colormap.py @@ -0,0 +1,140 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +""" +An awesome colormap for really neat visualizations. +Copied from Detectron, and removed gray colors. +""" + +import numpy as np + +__all__ = ["colormap", "random_color"] + +# fmt: off +# RGB: +_COLORS = np.array( + [ + 0.000, 0.447, 0.741, + 0.850, 0.325, 0.098, + 0.929, 0.694, 0.125, + 0.494, 0.184, 0.556, + 0.466, 0.674, 0.188, + 0.301, 0.745, 0.933, + 0.635, 0.078, 0.184, + 0.300, 0.300, 0.300, + 0.600, 0.600, 0.600, + 1.000, 0.000, 0.000, + 1.000, 0.500, 0.000, + 0.749, 0.749, 0.000, + 0.000, 1.000, 0.000, + 0.000, 0.000, 1.000, + 0.667, 0.000, 1.000, + 0.333, 0.333, 0.000, + 0.333, 0.667, 0.000, + 0.333, 1.000, 0.000, + 0.667, 0.333, 0.000, + 0.667, 0.667, 0.000, + 0.667, 1.000, 0.000, + 1.000, 0.333, 0.000, + 1.000, 0.667, 0.000, + 1.000, 1.000, 0.000, + 0.000, 0.333, 0.500, + 0.000, 0.667, 0.500, + 0.000, 1.000, 0.500, + 0.333, 0.000, 0.500, + 0.333, 0.333, 0.500, + 0.333, 0.667, 0.500, + 0.333, 1.000, 0.500, + 0.667, 0.000, 0.500, + 0.667, 0.333, 0.500, + 0.667, 0.667, 0.500, + 0.667, 1.000, 0.500, + 1.000, 0.000, 0.500, + 1.000, 0.333, 0.500, + 1.000, 0.667, 0.500, + 1.000, 1.000, 0.500, + 0.000, 0.333, 1.000, + 0.000, 0.667, 1.000, + 0.000, 1.000, 1.000, + 0.333, 0.000, 1.000, + 0.333, 0.333, 1.000, + 0.333, 0.667, 1.000, + 0.333, 1.000, 1.000, + 0.667, 0.000, 1.000, + 0.667, 0.333, 1.000, + 0.667, 0.667, 1.000, + 0.667, 1.000, 1.000, + 1.000, 0.000, 1.000, + 1.000, 0.333, 1.000, + 1.000, 0.667, 1.000, + 0.333, 0.000, 0.000, + 0.500, 0.000, 0.000, + 0.667, 0.000, 0.000, + 0.833, 0.000, 0.000, + 1.000, 0.000, 0.000, + 0.000, 0.167, 0.000, + 0.000, 0.333, 0.000, + 0.000, 0.500, 0.000, + 0.000, 0.667, 0.000, + 0.000, 0.833, 0.000, + 0.000, 1.000, 0.000, + 0.000, 0.000, 0.167, + 0.000, 0.000, 0.333, + 0.000, 0.000, 0.500, + 0.000, 0.000, 0.667, + 0.000, 0.000, 0.833, + 0.000, 0.000, 1.000, + 0.000, 0.000, 0.000, + 0.143, 0.143, 0.143, + 0.857, 0.857, 0.857, + 1.000, 1.000, 1.000 + ] +).astype(np.float32).reshape(-1, 3) +# fmt: on + + +def colormap(rgb=False, maximum=255): + """ + Args: + rgb (bool): whether to return RGB colors or BGR colors. + maximum (int): either 255 or 1 + + Returns: + ndarray: a float32 array of Nx3 colors, in range [0, 255] or [0, 1] + """ + assert maximum in [255, 1], maximum + c = _COLORS * maximum + if not rgb: + c = c[:, ::-1] + return c + + +def random_color(rgb=False, maximum=255): + """ + Args: + rgb (bool): whether to return RGB colors or BGR colors. + maximum (int): either 255 or 1 + + Returns: + ndarray: a vector of 3 numbers + """ + idx = np.random.randint(0, len(_COLORS)) + ret = _COLORS[idx] * maximum + if not rgb: + ret = ret[::-1] + return ret + + +if __name__ == "__main__": + import cv2 + + size = 100 + H, W = 10, 10 + canvas = np.random.rand(H * size, W * size, 3).astype("float32") + for h in range(H): + for w in range(W): + idx = h * W + w + if idx >= len(_COLORS): + break + canvas[h * size : (h + 1) * size, w * size : (w + 1) * size] = _COLORS[idx] + cv2.imshow("a", canvas) + cv2.waitKey(0) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/comm.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/comm.py new file mode 100644 index 0000000..8cc7b3d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/comm.py @@ -0,0 +1,263 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +This file contains primitives for multi-gpu communication. +This is useful when doing distributed training. +""" + +import functools +import logging +import numpy as np +import pickle +import torch +import torch.distributed as dist + +_LOCAL_PROCESS_GROUP = None +""" +A torch process group which only includes processes that on the same machine as the current process. +This variable is set when processes are spawned by `launch()` in "engine/launch.py". +""" + + +def get_world_size() -> int: + if not dist.is_available(): + return 1 + if not dist.is_initialized(): + return 1 + return dist.get_world_size() + + +def get_rank() -> int: + if not dist.is_available(): + return 0 + if not dist.is_initialized(): + return 0 + return dist.get_rank() + + +def get_local_rank() -> int: + """ + Returns: + The rank of the current process within the local (per-machine) process group. + """ + if not dist.is_available(): + return 0 + if not dist.is_initialized(): + return 0 + assert _LOCAL_PROCESS_GROUP is not None + return dist.get_rank(group=_LOCAL_PROCESS_GROUP) + + +def get_local_size() -> int: + """ + Returns: + The size of the per-machine process group, + i.e. the number of processes per machine. + """ + if not dist.is_available(): + return 1 + if not dist.is_initialized(): + return 1 + return dist.get_world_size(group=_LOCAL_PROCESS_GROUP) + + +def is_main_process() -> bool: + return get_rank() == 0 + + +def synchronize(): + """ + Helper function to synchronize (barrier) among all processes when + using distributed training + """ + if not dist.is_available(): + return + if not dist.is_initialized(): + return + world_size = dist.get_world_size() + if world_size == 1: + return + dist.barrier() + + +@functools.lru_cache() +def _get_global_gloo_group(): + """ + Return a process group based on gloo backend, containing all the ranks + The result is cached. + """ + if dist.get_backend() == "nccl": + return dist.new_group(backend="gloo") + else: + return dist.group.WORLD + + +def _serialize_to_tensor(data, group): + backend = dist.get_backend(group) + assert backend in ["gloo", "nccl"] + device = torch.device("cpu" if backend == "gloo" else "cuda") + + buffer = pickle.dumps(data) + if len(buffer) > 1024 ** 3: + logger = logging.getLogger(__name__) + logger.warning( + "Rank {} trying to all-gather {:.2f} GB of data on device {}".format( + get_rank(), len(buffer) / (1024 ** 3), device + ) + ) + storage = torch.ByteStorage.from_buffer(buffer) + tensor = torch.ByteTensor(storage).to(device=device) + return tensor + + +def _pad_to_largest_tensor(tensor, group): + """ + Returns: + list[int]: size of the tensor, on each rank + Tensor: padded tensor that has the max size + """ + world_size = dist.get_world_size(group=group) + assert ( + world_size >= 1 + ), "comm.gather/all_gather must be called from ranks within the given group!" + local_size = torch.tensor([tensor.numel()], dtype=torch.int64, device=tensor.device) + size_list = [ + torch.zeros([1], dtype=torch.int64, device=tensor.device) for _ in range(world_size) + ] + dist.all_gather(size_list, local_size, group=group) + size_list = [int(size.item()) for size in size_list] + + max_size = max(size_list) + + # we pad the tensor because torch all_gather does not support + # gathering tensors of different shapes + if local_size != max_size: + padding = torch.zeros((max_size - local_size,), dtype=torch.uint8, device=tensor.device) + tensor = torch.cat((tensor, padding), dim=0) + return size_list, tensor + + +def all_gather(data, group=None): + """ + Run all_gather on arbitrary picklable data (not necessarily tensors). + + Args: + data: any picklable object + group: a torch process group. By default, will use a group which + contains all ranks on gloo backend. + + Returns: + list[data]: list of data gathered from each rank + """ + if get_world_size() == 1: + return [data] + if group is None: + group = _get_global_gloo_group() + if dist.get_world_size(group) == 1: + return [data] + + tensor = _serialize_to_tensor(data, group) + + size_list, tensor = _pad_to_largest_tensor(tensor, group) + max_size = max(size_list) + + # receiving Tensor from all ranks + tensor_list = [ + torch.empty((max_size,), dtype=torch.uint8, device=tensor.device) for _ in size_list + ] + dist.all_gather(tensor_list, tensor, group=group) + + data_list = [] + for size, tensor in zip(size_list, tensor_list): + buffer = tensor.cpu().numpy().tobytes()[:size] + data_list.append(pickle.loads(buffer)) + + return data_list + + +def gather(data, dst=0, group=None): + """ + Run gather on arbitrary picklable data (not necessarily tensors). + + Args: + data: any picklable object + dst (int): destination rank + group: a torch process group. By default, will use a group which + contains all ranks on gloo backend. + + Returns: + list[data]: on dst, a list of data gathered from each rank. Otherwise, + an empty list. + """ + if get_world_size() == 1: + return [data] + if group is None: + group = _get_global_gloo_group() + if dist.get_world_size(group=group) == 1: + return [data] + rank = dist.get_rank(group=group) + + tensor = _serialize_to_tensor(data, group) + size_list, tensor = _pad_to_largest_tensor(tensor, group) + + # receiving Tensor from all ranks + if rank == dst: + max_size = max(size_list) + tensor_list = [ + torch.empty((max_size,), dtype=torch.uint8, device=tensor.device) for _ in size_list + ] + dist.gather(tensor, tensor_list, dst=dst, group=group) + + data_list = [] + for size, tensor in zip(size_list, tensor_list): + buffer = tensor.cpu().numpy().tobytes()[:size] + data_list.append(pickle.loads(buffer)) + return data_list + else: + dist.gather(tensor, [], dst=dst, group=group) + return [] + + +def shared_random_seed(): + """ + Returns: + int: a random number that is the same across all workers. + If workers need a shared RNG, they can use this shared seed to + create one. + + All workers must call this function, otherwise it will deadlock. + """ + ints = np.random.randint(2 ** 31) + all_ints = all_gather(ints) + return all_ints[0] + + +def reduce_dict(input_dict, average=True): + """ + Reduce the values in the dictionary from all processes so that process with rank + 0 has the reduced results. + + Args: + input_dict (dict): inputs to be reduced. All the values must be scalar CUDA Tensor. + average (bool): whether to do average or sum + + Returns: + a dict with the same keys as input_dict, after reduction. + """ + world_size = get_world_size() + if world_size < 2: + return input_dict + with torch.no_grad(): + names = [] + values = [] + # sort the keys so that they are consistent across processes + for k in sorted(input_dict.keys()): + names.append(k) + values.append(input_dict[k]) + values = torch.stack(values, dim=0) + dist.reduce(values, dst=0) + if dist.get_rank() == 0 and average: + # only main process gets accumulated, so only divide by + # world_size in this case + values /= world_size + reduced_dict = {k: v for k, v in zip(names, values)} + return reduced_dict diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/env.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/env.py new file mode 100644 index 0000000..6769cae --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/env.py @@ -0,0 +1,116 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import importlib +import importlib.util +import logging +import numpy as np +import os +import random +import sys +from datetime import datetime +import torch + +__all__ = ["seed_all_rng"] + + +def seed_all_rng(seed=None): + """ + Set the random seed for the RNG in torch, numpy and python. + + Args: + seed (int): if None, will use a strong random seed. + """ + if seed is None: + seed = ( + os.getpid() + + int(datetime.now().strftime("%S%f")) + + int.from_bytes(os.urandom(2), "big") + ) + logger = logging.getLogger(__name__) + logger.info("Using a generated random seed {}".format(seed)) + np.random.seed(seed) + torch.set_rng_state(torch.manual_seed(seed).get_state()) + random.seed(seed) + + +# from https://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path +def _import_file(module_name, file_path, make_importable=False): + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + if make_importable: + sys.modules[module_name] = module + return module + + +def _configure_libraries(): + """ + Configurations for some libraries. + """ + # An environment option to disable `import cv2` globally, + # in case it leads to negative performance impact + disable_cv2 = int(os.environ.get("DETECTRON2_DISABLE_CV2", False)) + if disable_cv2: + sys.modules["cv2"] = None + else: + # Disable opencl in opencv since its interaction with cuda often has negative effects + # This envvar is supported after OpenCV 3.4.0 + os.environ["OPENCV_OPENCL_RUNTIME"] = "disabled" + try: + import cv2 + + if int(cv2.__version__.split(".")[0]) >= 3: + cv2.ocl.setUseOpenCL(False) + except ImportError: + pass + + def get_version(module, digit=2): + return tuple(map(int, module.__version__.split(".")[:digit])) + + # fmt: off + assert get_version(torch) >= (1, 4), "Requires torch>=1.4" + import fvcore + assert get_version(fvcore, 3) >= (0, 1, 1), "Requires fvcore>=0.1.1" + import yaml + assert get_version(yaml) >= (5, 1), "Requires pyyaml>=5.1" + # fmt: on + + +_ENV_SETUP_DONE = False + + +def setup_environment(): + """Perform environment setup work. The default setup is a no-op, but this + function allows the user to specify a Python source file or a module in + the $DETECTRON2_ENV_MODULE environment variable, that performs + custom setup work that may be necessary to their computing environment. + """ + global _ENV_SETUP_DONE + if _ENV_SETUP_DONE: + return + _ENV_SETUP_DONE = True + + _configure_libraries() + + custom_module_path = os.environ.get("DETECTRON2_ENV_MODULE") + + if custom_module_path: + setup_custom_environment(custom_module_path) + else: + # The default setup is a no-op + pass + + +def setup_custom_environment(custom_module): + """ + Load custom environment setup by importing a Python source file or a + module, and run the setup function. + """ + if custom_module.endswith(".py"): + module = _import_file("detectron2.utils.env.custom_module", custom_module) + else: + module = importlib.import_module(custom_module) + assert hasattr(module, "setup_environment") and callable(module.setup_environment), ( + "Custom environment module defined in {} does not have the " + "required callable attribute 'setup_environment'." + ).format(custom_module) + module.setup_environment() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/events.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/events.py new file mode 100644 index 0000000..a3c57ed --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/events.py @@ -0,0 +1,432 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import datetime +import json +import logging +import os +import time +from collections import defaultdict +from contextlib import contextmanager +import torch +from fvcore.common.file_io import PathManager +from fvcore.common.history_buffer import HistoryBuffer + +_CURRENT_STORAGE_STACK = [] + + +def get_event_storage(): + """ + Returns: + The :class:`EventStorage` object that's currently being used. + Throws an error if no :class:`EventStorage` is currently enabled. + """ + assert len( + _CURRENT_STORAGE_STACK + ), "get_event_storage() has to be called inside a 'with EventStorage(...)' context!" + return _CURRENT_STORAGE_STACK[-1] + + +class EventWriter: + """ + Base class for writers that obtain events from :class:`EventStorage` and process them. + """ + + def write(self): + raise NotImplementedError + + def close(self): + pass + + +class JSONWriter(EventWriter): + """ + Write scalars to a json file. + + It saves scalars as one json per line (instead of a big json) for easy parsing. + + Examples parsing such a json file: + + .. code-block:: none + + $ cat metrics.json | jq -s '.[0:2]' + [ + { + "data_time": 0.008433341979980469, + "iteration": 20, + "loss": 1.9228371381759644, + "loss_box_reg": 0.050025828182697296, + "loss_classifier": 0.5316952466964722, + "loss_mask": 0.7236229181289673, + "loss_rpn_box": 0.0856662318110466, + "loss_rpn_cls": 0.48198649287223816, + "lr": 0.007173333333333333, + "time": 0.25401854515075684 + }, + { + "data_time": 0.007216215133666992, + "iteration": 40, + "loss": 1.282649278640747, + "loss_box_reg": 0.06222952902317047, + "loss_classifier": 0.30682939291000366, + "loss_mask": 0.6970193982124329, + "loss_rpn_box": 0.038663312792778015, + "loss_rpn_cls": 0.1471673548221588, + "lr": 0.007706666666666667, + "time": 0.2490077018737793 + } + ] + + $ cat metrics.json | jq '.loss_mask' + 0.7126231789588928 + 0.689423680305481 + 0.6776131987571716 + ... + + """ + + def __init__(self, json_file, window_size=20): + """ + Args: + json_file (str): path to the json file. New data will be appended if the file exists. + window_size (int): the window size of median smoothing for the scalars whose + `smoothing_hint` are True. + """ + self._file_handle = PathManager.open(json_file, "a") + self._window_size = window_size + + def write(self): + storage = get_event_storage() + to_save = {"iteration": storage.iter} + to_save.update(storage.latest_with_smoothing_hint(self._window_size)) + self._file_handle.write(json.dumps(to_save, sort_keys=True) + "\n") + self._file_handle.flush() + try: + os.fsync(self._file_handle.fileno()) + except AttributeError: + pass + + def close(self): + self._file_handle.close() + + +class TensorboardXWriter(EventWriter): + """ + Write all scalars to a tensorboard file. + """ + + def __init__(self, log_dir: str, window_size: int = 20, **kwargs): + """ + Args: + log_dir (str): the directory to save the output events + window_size (int): the scalars will be median-smoothed by this window size + + kwargs: other arguments passed to `torch.utils.tensorboard.SummaryWriter(...)` + """ + self._window_size = window_size + from torch.utils.tensorboard import SummaryWriter + + self._writer = SummaryWriter(log_dir, **kwargs) + + def write(self): + storage = get_event_storage() + for k, v in storage.latest_with_smoothing_hint(self._window_size).items(): + self._writer.add_scalar(k, v, storage.iter) + + # storage.put_{image,histogram} is only meant to be used by + # tensorboard writer. So we access its internal fields directly from here. + if len(storage._vis_data) >= 1: + for img_name, img, step_num in storage._vis_data: + self._writer.add_image(img_name, img, step_num) + # Storage stores all image data and rely on this writer to clear them. + # As a result it assumes only one writer will use its image data. + # An alternative design is to let storage store limited recent + # data (e.g. only the most recent image) that all writers can access. + # In that case a writer may not see all image data if its period is long. + storage.clear_images() + + if len(storage._histograms) >= 1: + for params in storage._histograms: + self._writer.add_histogram_raw(**params) + storage.clear_histograms() + + def close(self): + if hasattr(self, "_writer"): # doesn't exist when the code fails at import + self._writer.close() + + +class CommonMetricPrinter(EventWriter): + """ + Print **common** metrics to the terminal, including + iteration time, ETA, memory, all losses, and the learning rate. + + To print something different, please implement a similar printer by yourself. + """ + + def __init__(self, max_iter): + """ + Args: + max_iter (int): the maximum number of iterations to train. + Used to compute ETA. + """ + self.logger = logging.getLogger(__name__) + self._max_iter = max_iter + self._last_write = None + + def write(self): + storage = get_event_storage() + iteration = storage.iter + + try: + data_time = storage.history("data_time").avg(20) + except KeyError: + # they may not exist in the first few iterations (due to warmup) + # or when SimpleTrainer is not used + data_time = None + + eta_string = None + try: + iter_time = storage.history("time").global_avg() + eta_seconds = storage.history("time").median(1000) * (self._max_iter - iteration) + storage.put_scalar("eta_seconds", eta_seconds, smoothing_hint=False) + eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) + except KeyError: + iter_time = None + # estimate eta on our own - more noisy + if self._last_write is not None: + estimate_iter_time = (time.perf_counter() - self._last_write[1]) / ( + iteration - self._last_write[0] + ) + eta_seconds = estimate_iter_time * (self._max_iter - iteration) + eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) + self._last_write = (iteration, time.perf_counter()) + + try: + lr = "{:.6f}".format(storage.history("lr").latest()) + except KeyError: + lr = "N/A" + + if torch.cuda.is_available(): + max_mem_mb = torch.cuda.max_memory_allocated() / 1024.0 / 1024.0 + else: + max_mem_mb = None + + # NOTE: max_mem is parsed by grep in "dev/parse_results.sh" + self.logger.info( + " {eta}iter: {iter} {losses} {time}{data_time}lr: {lr} {memory}".format( + eta=f"eta: {eta_string} " if eta_string else "", + iter=iteration, + losses=" ".join( + [ + "{}: {:.3f}".format(k, v.median(20)) + for k, v in storage.histories().items() + if "loss" in k + ] + ), + time="time: {:.4f} ".format(iter_time) if iter_time is not None else "", + data_time="data_time: {:.4f} ".format(data_time) if data_time is not None else "", + lr=lr, + memory="max_mem: {:.0f}M".format(max_mem_mb) if max_mem_mb is not None else "", + ) + ) + + +class EventStorage: + """ + The user-facing class that provides metric storage functionalities. + + In the future we may add support for storing / logging other types of data if needed. + """ + + def __init__(self, start_iter=0): + """ + Args: + start_iter (int): the iteration number to start with + """ + self._history = defaultdict(HistoryBuffer) + self._smoothing_hints = {} + self._latest_scalars = {} + self._iter = start_iter + self._current_prefix = "" + self._vis_data = [] + self._histograms = [] + + def put_image(self, img_name, img_tensor): + """ + Add an `img_tensor` associated with `img_name`, to be shown on + tensorboard. + + Args: + img_name (str): The name of the image to put into tensorboard. + img_tensor (torch.Tensor or numpy.array): An `uint8` or `float` + Tensor of shape `[channel, height, width]` where `channel` is + 3. The image format should be RGB. The elements in img_tensor + can either have values in [0, 1] (float32) or [0, 255] (uint8). + The `img_tensor` will be visualized in tensorboard. + """ + self._vis_data.append((img_name, img_tensor, self._iter)) + + def put_scalar(self, name, value, smoothing_hint=True): + """ + Add a scalar `value` to the `HistoryBuffer` associated with `name`. + + Args: + smoothing_hint (bool): a 'hint' on whether this scalar is noisy and should be + smoothed when logged. The hint will be accessible through + :meth:`EventStorage.smoothing_hints`. A writer may ignore the hint + and apply custom smoothing rule. + + It defaults to True because most scalars we save need to be smoothed to + provide any useful signal. + """ + name = self._current_prefix + name + history = self._history[name] + value = float(value) + history.update(value, self._iter) + self._latest_scalars[name] = value + + existing_hint = self._smoothing_hints.get(name) + if existing_hint is not None: + assert ( + existing_hint == smoothing_hint + ), "Scalar {} was put with a different smoothing_hint!".format(name) + else: + self._smoothing_hints[name] = smoothing_hint + + def put_scalars(self, *, smoothing_hint=True, **kwargs): + """ + Put multiple scalars from keyword arguments. + + Examples: + + storage.put_scalars(loss=my_loss, accuracy=my_accuracy, smoothing_hint=True) + """ + for k, v in kwargs.items(): + self.put_scalar(k, v, smoothing_hint=smoothing_hint) + + def put_histogram(self, hist_name, hist_tensor, bins=1000): + """ + Create a histogram from a tensor. + + Args: + hist_name (str): The name of the histogram to put into tensorboard. + hist_tensor (torch.Tensor): A Tensor of arbitrary shape to be converted + into a histogram. + bins (int): Number of histogram bins. + """ + ht_min, ht_max = hist_tensor.min().item(), hist_tensor.max().item() + + # Create a histogram with PyTorch + hist_counts = torch.histc(hist_tensor, bins=bins) + hist_edges = torch.linspace(start=ht_min, end=ht_max, steps=bins + 1, dtype=torch.float32) + + # Parameter for the add_histogram_raw function of SummaryWriter + hist_params = dict( + tag=hist_name, + min=ht_min, + max=ht_max, + num=len(hist_tensor), + sum=float(hist_tensor.sum()), + sum_squares=float(torch.sum(hist_tensor ** 2)), + bucket_limits=hist_edges[1:].tolist(), + bucket_counts=hist_counts.tolist(), + global_step=self._iter, + ) + self._histograms.append(hist_params) + + def history(self, name): + """ + Returns: + HistoryBuffer: the scalar history for name + """ + ret = self._history.get(name, None) + if ret is None: + raise KeyError("No history metric available for {}!".format(name)) + return ret + + def histories(self): + """ + Returns: + dict[name -> HistoryBuffer]: the HistoryBuffer for all scalars + """ + return self._history + + def latest(self): + """ + Returns: + dict[name -> number]: the scalars that's added in the current iteration. + """ + return self._latest_scalars + + def latest_with_smoothing_hint(self, window_size=20): + """ + Similar to :meth:`latest`, but the returned values + are either the un-smoothed original latest value, + or a median of the given window_size, + depend on whether the smoothing_hint is True. + + This provides a default behavior that other writers can use. + """ + result = {} + for k, v in self._latest_scalars.items(): + result[k] = self._history[k].median(window_size) if self._smoothing_hints[k] else v + return result + + def smoothing_hints(self): + """ + Returns: + dict[name -> bool]: the user-provided hint on whether the scalar + is noisy and needs smoothing. + """ + return self._smoothing_hints + + def step(self): + """ + User should call this function at the beginning of each iteration, to + notify the storage of the start of a new iteration. + The storage will then be able to associate the new data with the + correct iteration number. + """ + self._iter += 1 + self._latest_scalars = {} + + @property + def iter(self): + return self._iter + + @property + def iteration(self): + # for backward compatibility + return self._iter + + def __enter__(self): + _CURRENT_STORAGE_STACK.append(self) + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + assert _CURRENT_STORAGE_STACK[-1] == self + _CURRENT_STORAGE_STACK.pop() + + @contextmanager + def name_scope(self, name): + """ + Yields: + A context within which all the events added to this storage + will be prefixed by the name scope. + """ + old_prefix = self._current_prefix + self._current_prefix = name.rstrip("/") + "/" + yield + self._current_prefix = old_prefix + + def clear_images(self): + """ + Delete all the stored images for visualization. This should be called + after images are written to tensorboard. + """ + self._vis_data = [] + + def clear_histograms(self): + """ + Delete all the stored histograms for visualization. + This should be called after histograms are written to tensorboard. + """ + self._histograms = [] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/logger.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/logger.py new file mode 100644 index 0000000..b6496d9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/logger.py @@ -0,0 +1,221 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import functools +import logging +import os +import sys +import time +from collections import Counter +from fvcore.common.file_io import PathManager +from tabulate import tabulate +from termcolor import colored + + +class _ColorfulFormatter(logging.Formatter): + def __init__(self, *args, **kwargs): + self._root_name = kwargs.pop("root_name") + "." + self._abbrev_name = kwargs.pop("abbrev_name", "") + if len(self._abbrev_name): + self._abbrev_name = self._abbrev_name + "." + super(_ColorfulFormatter, self).__init__(*args, **kwargs) + + def formatMessage(self, record): + record.name = record.name.replace(self._root_name, self._abbrev_name) + log = super(_ColorfulFormatter, self).formatMessage(record) + if record.levelno == logging.WARNING: + prefix = colored("WARNING", "red", attrs=["blink"]) + elif record.levelno == logging.ERROR or record.levelno == logging.CRITICAL: + prefix = colored("ERROR", "red", attrs=["blink", "underline"]) + else: + return log + return prefix + " " + log + + +@functools.lru_cache() # so that calling setup_logger multiple times won't add many handlers +def setup_logger( + output=None, distributed_rank=0, *, color=True, name="detectron2", abbrev_name=None +): + """ + Initialize the detectron2 logger and set its verbosity level to "DEBUG". + + Args: + output (str): a file name or a directory to save log. If None, will not save log file. + If ends with ".txt" or ".log", assumed to be a file name. + Otherwise, logs will be saved to `output/log.txt`. + name (str): the root module name of this logger + abbrev_name (str): an abbreviation of the module, to avoid long names in logs. + Set to "" to not log the root module in logs. + By default, will abbreviate "detectron2" to "d2" and leave other + modules unchanged. + + Returns: + logging.Logger: a logger + """ + logger = logging.getLogger(name) + logger.setLevel(logging.DEBUG) + logger.propagate = False + + if abbrev_name is None: + abbrev_name = "d2" if name == "detectron2" else name + + plain_formatter = logging.Formatter( + "[%(asctime)s] %(name)s %(levelname)s: %(message)s", datefmt="%m/%d %H:%M:%S" + ) + # stdout logging: master only + if distributed_rank == 0: + ch = logging.StreamHandler(stream=sys.stdout) + ch.setLevel(logging.DEBUG) + if color: + formatter = _ColorfulFormatter( + colored("[%(asctime)s %(name)s]: ", "green") + "%(message)s", + datefmt="%m/%d %H:%M:%S", + root_name=name, + abbrev_name=str(abbrev_name), + ) + else: + formatter = plain_formatter + ch.setFormatter(formatter) + logger.addHandler(ch) + + # file logging: all workers + if output is not None: + if output.endswith(".txt") or output.endswith(".log"): + filename = output + else: + filename = os.path.join(output, "log.txt") + if distributed_rank > 0: + filename = filename + ".rank{}".format(distributed_rank) + PathManager.mkdirs(os.path.dirname(filename)) + + fh = logging.StreamHandler(_cached_log_stream(filename)) + fh.setLevel(logging.DEBUG) + fh.setFormatter(plain_formatter) + logger.addHandler(fh) + + return logger + + +# cache the opened file object, so that different calls to `setup_logger` +# with the same file name can safely write to the same file. +@functools.lru_cache(maxsize=None) +def _cached_log_stream(filename): + return PathManager.open(filename, "a") + + +""" +Below are some other convenient logging methods. +They are mainly adopted from +https://github.com/abseil/abseil-py/blob/master/absl/logging/__init__.py +""" + + +def _find_caller(): + """ + Returns: + str: module name of the caller + tuple: a hashable key to be used to identify different callers + """ + frame = sys._getframe(2) + while frame: + code = frame.f_code + if os.path.join("utils", "logger.") not in code.co_filename: + mod_name = frame.f_globals["__name__"] + if mod_name == "__main__": + mod_name = "detectron2" + return mod_name, (code.co_filename, frame.f_lineno, code.co_name) + frame = frame.f_back + + +_LOG_COUNTER = Counter() +_LOG_TIMER = {} + + +def log_first_n(lvl, msg, n=1, *, name=None, key="caller"): + """ + Log only for the first n times. + + Args: + lvl (int): the logging level + msg (str): + n (int): + name (str): name of the logger to use. Will use the caller's module by default. + key (str or tuple[str]): the string(s) can be one of "caller" or + "message", which defines how to identify duplicated logs. + For example, if called with `n=1, key="caller"`, this function + will only log the first call from the same caller, regardless of + the message content. + If called with `n=1, key="message"`, this function will log the + same content only once, even if they are called from different places. + If called with `n=1, key=("caller", "message")`, this function + will not log only if the same caller has logged the same message before. + """ + if isinstance(key, str): + key = (key,) + assert len(key) > 0 + + caller_module, caller_key = _find_caller() + hash_key = () + if "caller" in key: + hash_key = hash_key + caller_key + if "message" in key: + hash_key = hash_key + (msg,) + + _LOG_COUNTER[hash_key] += 1 + if _LOG_COUNTER[hash_key] <= n: + logging.getLogger(name or caller_module).log(lvl, msg) + + +def log_every_n(lvl, msg, n=1, *, name=None): + """ + Log once per n times. + + Args: + lvl (int): the logging level + msg (str): + n (int): + name (str): name of the logger to use. Will use the caller's module by default. + """ + caller_module, key = _find_caller() + _LOG_COUNTER[key] += 1 + if n == 1 or _LOG_COUNTER[key] % n == 1: + logging.getLogger(name or caller_module).log(lvl, msg) + + +def log_every_n_seconds(lvl, msg, n=1, *, name=None): + """ + Log no more than once per n seconds. + + Args: + lvl (int): the logging level + msg (str): + n (int): + name (str): name of the logger to use. Will use the caller's module by default. + """ + caller_module, key = _find_caller() + last_logged = _LOG_TIMER.get(key, None) + current_time = time.time() + if last_logged is None or current_time - last_logged >= n: + logging.getLogger(name or caller_module).log(lvl, msg) + _LOG_TIMER[key] = current_time + + +def create_small_table(small_dict): + """ + Create a small table using the keys of small_dict as headers. This is only + suitable for small dictionaries. + + Args: + small_dict (dict): a result dictionary of only a few items. + + Returns: + str: the table as a string. + """ + keys, values = tuple(zip(*small_dict.items())) + table = tabulate( + [values], + headers=keys, + tablefmt="pipe", + floatfmt=".3f", + stralign="center", + numalign="center", + ) + return table diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/memory.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/memory.py new file mode 100644 index 0000000..d495a16 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/memory.py @@ -0,0 +1,86 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import logging +from contextlib import contextmanager +from functools import wraps +import torch + +__all__ = ["retry_if_cuda_oom"] + + +@contextmanager +def _ignore_torch_cuda_oom(): + """ + A context which ignores CUDA OOM exception from pytorch. + """ + try: + yield + except RuntimeError as e: + # NOTE: the string may change? + if "CUDA out of memory. " in str(e): + pass + else: + raise + + +def retry_if_cuda_oom(func): + """ + Makes a function retry itself after encountering + pytorch's CUDA OOM error. + It will first retry after calling `torch.cuda.empty_cache()`. + + If that still fails, it will then retry by trying to convert inputs to CPUs. + In this case, it expects the function to dispatch to CPU implementation. + The return values may become CPU tensors as well and it's user's + responsibility to convert it back to CUDA tensor if needed. + + Args: + func: a stateless callable that takes tensor-like objects as arguments + + Returns: + a callable which retries `func` if OOM is encountered. + + Examples: + + .. code-block:: python + + output = retry_if_cuda_oom(some_torch_function)(input1, input2) + # output may be on CPU even if inputs are on GPU + + Note: + 1. When converting inputs to CPU, it will only look at each argument and check + if it has `.device` and `.to` for conversion. Nested structures of tensors + are not supported. + + 2. Since the function might be called more than once, it has to be + stateless. + """ + + def maybe_to_cpu(x): + try: + like_gpu_tensor = x.device.type == "cuda" and hasattr(x, "to") + except AttributeError: + like_gpu_tensor = False + if like_gpu_tensor: + return x.to(device="cpu") + else: + return x + + @wraps(func) + def wrapped(*args, **kwargs): + with _ignore_torch_cuda_oom(): + return func(*args, **kwargs) + + # Clear cache and retry + torch.cuda.empty_cache() + with _ignore_torch_cuda_oom(): + return func(*args, **kwargs) + + # Try on CPU. This slows down the code significantly, therefore print a notice. + logger = logging.getLogger(__name__) + logger.info("Attempting to copy inputs of {} to CPU due to CUDA OOM".format(str(func))) + new_args = (maybe_to_cpu(x) for x in args) + new_kwargs = {k: maybe_to_cpu(v) for k, v in kwargs.items()} + return func(*new_args, **new_kwargs) + + return wrapped diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/registry.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/registry.py new file mode 100644 index 0000000..fea1de9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/registry.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +# Keep this module for backward compatibility. +from fvcore.common.registry import Registry # noqa + +__all__ = ["Registry"] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/serialize.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/serialize.py new file mode 100644 index 0000000..734a62c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/serialize.py @@ -0,0 +1,29 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import cloudpickle + + +class PicklableWrapper(object): + """ + Wrap an object to make it more picklable, note that it uses + heavy weight serialization libraries that are slower than pickle. + It's best to use it only on closures (which are usually not picklable). + + This is a simplified version of + https://github.com/joblib/joblib/blob/master/joblib/externals/loky/cloudpickle_wrapper.py + """ + + def __init__(self, obj): + self._obj = obj + + def __reduce__(self): + s = cloudpickle.dumps(self._obj) + return cloudpickle.loads, (s,) + + def __call__(self, *args, **kwargs): + return self._obj(*args, **kwargs) + + def __getattr__(self, attr): + # Ensure that the wrapped object can be used seamlessly as the previous object. + if attr not in ["_obj"]: + return getattr(self._obj, attr) + return getattr(self, attr) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/video_visualizer.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/video_visualizer.py new file mode 100644 index 0000000..0144b67 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/video_visualizer.py @@ -0,0 +1,235 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +import pycocotools.mask as mask_util + +from detectron2.utils.visualizer import ( + ColorMode, + Visualizer, + _create_text_labels, + _PanopticPrediction, +) + +from .colormap import random_color + + +class _DetectedInstance: + """ + Used to store data about detected objects in video frame, + in order to transfer color to objects in the future frames. + + Attributes: + label (int): + bbox (tuple[float]): + mask_rle (dict): + color (tuple[float]): RGB colors in range (0, 1) + ttl (int): time-to-live for the instance. For example, if ttl=2, + the instance color can be transferred to objects in the next two frames. + """ + + __slots__ = ["label", "bbox", "mask_rle", "color", "ttl"] + + def __init__(self, label, bbox, mask_rle, color, ttl): + self.label = label + self.bbox = bbox + self.mask_rle = mask_rle + self.color = color + self.ttl = ttl + + +class VideoVisualizer: + def __init__(self, metadata, instance_mode=ColorMode.IMAGE): + """ + Args: + metadata (MetadataCatalog): image metadata. + """ + self.metadata = metadata + self._old_instances = [] + assert instance_mode in [ + ColorMode.IMAGE, + ColorMode.IMAGE_BW, + ], "Other mode not supported yet." + self._instance_mode = instance_mode + + def draw_instance_predictions(self, frame, predictions): + """ + Draw instance-level prediction results on an image. + + Args: + frame (ndarray): an RGB image of shape (H, W, C), in the range [0, 255]. + predictions (Instances): the output of an instance detection/segmentation + model. Following fields will be used to draw: + "pred_boxes", "pred_classes", "scores", "pred_masks" (or "pred_masks_rle"). + + Returns: + output (VisImage): image object with visualizations. + """ + frame_visualizer = Visualizer(frame, self.metadata) + num_instances = len(predictions) + if num_instances == 0: + return frame_visualizer.output + + boxes = predictions.pred_boxes.tensor.numpy() if predictions.has("pred_boxes") else None + scores = predictions.scores if predictions.has("scores") else None + classes = predictions.pred_classes.numpy() if predictions.has("pred_classes") else None + keypoints = predictions.pred_keypoints if predictions.has("pred_keypoints") else None + + if predictions.has("pred_masks"): + masks = predictions.pred_masks + # mask IOU is not yet enabled + # masks_rles = mask_util.encode(np.asarray(masks.permute(1, 2, 0), order="F")) + # assert len(masks_rles) == num_instances + else: + masks = None + + detected = [ + _DetectedInstance(classes[i], boxes[i], mask_rle=None, color=None, ttl=8) + for i in range(num_instances) + ] + colors = self._assign_colors(detected) + + labels = _create_text_labels(classes, scores, self.metadata.get("thing_classes", None)) + + if self._instance_mode == ColorMode.IMAGE_BW: + # any() returns uint8 tensor + frame_visualizer.output.img = frame_visualizer._create_grayscale_image( + (masks.any(dim=0) > 0).numpy() if masks is not None else None + ) + alpha = 0.3 + else: + alpha = 0.5 + + frame_visualizer.overlay_instances( + boxes=None if masks is not None else boxes, # boxes are a bit distracting + masks=masks, + labels=labels, + keypoints=keypoints, + assigned_colors=colors, + alpha=alpha, + ) + + return frame_visualizer.output + + def draw_sem_seg(self, frame, sem_seg, area_threshold=None): + """ + Args: + sem_seg (ndarray or Tensor): semantic segmentation of shape (H, W), + each value is the integer label. + area_threshold (Optional[int]): only draw segmentations larger than the threshold + """ + # don't need to do anything special + frame_visualizer = Visualizer(frame, self.metadata) + frame_visualizer.draw_sem_seg(sem_seg, area_threshold=None) + return frame_visualizer.output + + def draw_panoptic_seg_predictions( + self, frame, panoptic_seg, segments_info, area_threshold=None, alpha=0.5 + ): + frame_visualizer = Visualizer(frame, self.metadata) + pred = _PanopticPrediction(panoptic_seg, segments_info) + + if self._instance_mode == ColorMode.IMAGE_BW: + frame_visualizer.output.img = frame_visualizer._create_grayscale_image( + pred.non_empty_mask() + ) + + # draw mask for all semantic segments first i.e. "stuff" + for mask, sinfo in pred.semantic_masks(): + category_idx = sinfo["category_id"] + try: + mask_color = [x / 255 for x in self.metadata.stuff_colors[category_idx]] + except AttributeError: + mask_color = None + + frame_visualizer.draw_binary_mask( + mask, + color=mask_color, + text=self.metadata.stuff_classes[category_idx], + alpha=alpha, + area_threshold=area_threshold, + ) + + all_instances = list(pred.instance_masks()) + if len(all_instances) == 0: + return frame_visualizer.output + # draw mask for all instances second + masks, sinfo = list(zip(*all_instances)) + num_instances = len(masks) + masks_rles = mask_util.encode( + np.asarray(np.asarray(masks).transpose(1, 2, 0), dtype=np.uint8, order="F") + ) + assert len(masks_rles) == num_instances + + category_ids = [x["category_id"] for x in sinfo] + detected = [ + _DetectedInstance(category_ids[i], bbox=None, mask_rle=masks_rles[i], color=None, ttl=8) + for i in range(num_instances) + ] + colors = self._assign_colors(detected) + labels = [self.metadata.thing_classes[k] for k in category_ids] + + frame_visualizer.overlay_instances( + boxes=None, + masks=masks, + labels=labels, + keypoints=None, + assigned_colors=colors, + alpha=alpha, + ) + return frame_visualizer.output + + def _assign_colors(self, instances): + """ + Naive tracking heuristics to assign same color to the same instance, + will update the internal state of tracked instances. + + Returns: + list[tuple[float]]: list of colors. + """ + + # Compute iou with either boxes or masks: + is_crowd = np.zeros((len(instances),), dtype=np.bool) + if instances[0].bbox is None: + assert instances[0].mask_rle is not None + # use mask iou only when box iou is None + # because box seems good enough + rles_old = [x.mask_rle for x in self._old_instances] + rles_new = [x.mask_rle for x in instances] + ious = mask_util.iou(rles_old, rles_new, is_crowd) + threshold = 0.5 + else: + boxes_old = [x.bbox for x in self._old_instances] + boxes_new = [x.bbox for x in instances] + ious = mask_util.iou(boxes_old, boxes_new, is_crowd) + threshold = 0.6 + if len(ious) == 0: + ious = np.zeros((len(self._old_instances), len(instances)), dtype="float32") + + # Only allow matching instances of the same label: + for old_idx, old in enumerate(self._old_instances): + for new_idx, new in enumerate(instances): + if old.label != new.label: + ious[old_idx, new_idx] = 0 + + matched_new_per_old = np.asarray(ious).argmax(axis=1) + max_iou_per_old = np.asarray(ious).max(axis=1) + + # Try to find match for each old instance: + extra_instances = [] + for idx, inst in enumerate(self._old_instances): + if max_iou_per_old[idx] > threshold: + newidx = matched_new_per_old[idx] + if instances[newidx].color is None: + instances[newidx].color = inst.color + continue + # If an old instance does not match any new instances, + # keep it for the next frame in case it is just missed by the detector + inst.ttl -= 1 + if inst.ttl > 0: + extra_instances.append(inst) + + # Assign random color to newly-detected instances: + for inst in instances: + if inst.color is None: + inst.color = random_color(rgb=True, maximum=1) + self._old_instances = instances[:] + extra_instances + return [d.color for d in instances] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/visualizer.py b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/visualizer.py new file mode 100644 index 0000000..3ffcbdb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/detectron2/utils/visualizer.py @@ -0,0 +1,1143 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import colorsys +import logging +import math +import numpy as np +from enum import Enum, unique +import cv2 +import matplotlib as mpl +import matplotlib.colors as mplc +import matplotlib.figure as mplfigure +import pycocotools.mask as mask_util +import torch +from fvcore.common.file_io import PathManager +from matplotlib.backends.backend_agg import FigureCanvasAgg +from PIL import Image + +from detectron2.structures import BitMasks, Boxes, BoxMode, Keypoints, PolygonMasks, RotatedBoxes + +from .colormap import random_color + +logger = logging.getLogger(__name__) + +__all__ = ["ColorMode", "VisImage", "Visualizer"] + + +_SMALL_OBJECT_AREA_THRESH = 1000 +_LARGE_MASK_AREA_THRESH = 120000 +_OFF_WHITE = (1.0, 1.0, 240.0 / 255) +_BLACK = (0, 0, 0) +_RED = (1.0, 0, 0) + +_KEYPOINT_THRESHOLD = 0.05 + + +@unique +class ColorMode(Enum): + """ + Enum of different color modes to use for instance visualizations. + """ + + IMAGE = 0 + """ + Picks a random color for every instance and overlay segmentations with low opacity. + """ + SEGMENTATION = 1 + """ + Let instances of the same category have similar colors + (from metadata.thing_colors), and overlay them with + high opacity. This provides more attention on the quality of segmentation. + """ + IMAGE_BW = 2 + """ + Same as IMAGE, but convert all areas without masks to gray-scale. + Only available for drawing per-instance mask predictions. + """ + + +class GenericMask: + """ + Attribute: + polygons (list[ndarray]): list[ndarray]: polygons for this mask. + Each ndarray has format [x, y, x, y, ...] + mask (ndarray): a binary mask + """ + + def __init__(self, mask_or_polygons, height, width): + self._mask = self._polygons = self._has_holes = None + self.height = height + self.width = width + + m = mask_or_polygons + if isinstance(m, dict): + # RLEs + assert "counts" in m and "size" in m + if isinstance(m["counts"], list): # uncompressed RLEs + h, w = m["size"] + assert h == height and w == width + m = mask_util.frPyObjects(m, h, w) + self._mask = mask_util.decode(m)[:, :] + return + + if isinstance(m, list): # list[ndarray] + self._polygons = [np.asarray(x).reshape(-1) for x in m] + return + + if isinstance(m, np.ndarray): # assumed to be a binary mask + assert m.shape[1] != 2, m.shape + assert m.shape == (height, width), m.shape + self._mask = m.astype("uint8") + return + + raise ValueError("GenericMask cannot handle object {} of type '{}'".format(m, type(m))) + + @property + def mask(self): + if self._mask is None: + self._mask = self.polygons_to_mask(self._polygons) + return self._mask + + @property + def polygons(self): + if self._polygons is None: + self._polygons, self._has_holes = self.mask_to_polygons(self._mask) + return self._polygons + + @property + def has_holes(self): + if self._has_holes is None: + if self._mask is not None: + self._polygons, self._has_holes = self.mask_to_polygons(self._mask) + else: + self._has_holes = False # if original format is polygon, does not have holes + return self._has_holes + + def mask_to_polygons(self, mask): + # cv2.RETR_CCOMP flag retrieves all the contours and arranges them to a 2-level + # hierarchy. External contours (boundary) of the object are placed in hierarchy-1. + # Internal contours (holes) are placed in hierarchy-2. + # cv2.CHAIN_APPROX_NONE flag gets vertices of polygons from contours. + mask = np.ascontiguousarray(mask) # some versions of cv2 does not support incontiguous arr + res = cv2.findContours(mask.astype("uint8"), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) + hierarchy = res[-1] + if hierarchy is None: # empty mask + return [], False + has_holes = (hierarchy.reshape(-1, 4)[:, 3] >= 0).sum() > 0 + res = res[-2] + res = [x.flatten() for x in res] + res = [x for x in res if len(x) >= 6] + return res, has_holes + + def polygons_to_mask(self, polygons): + rle = mask_util.frPyObjects(polygons, self.height, self.width) + rle = mask_util.merge(rle) + return mask_util.decode(rle)[:, :] + + def area(self): + return self.mask.sum() + + def bbox(self): + p = mask_util.frPyObjects(self.polygons, self.height, self.width) + p = mask_util.merge(p) + bbox = mask_util.toBbox(p) + bbox[2] += bbox[0] + bbox[3] += bbox[1] + return bbox + + +class _PanopticPrediction: + def __init__(self, panoptic_seg, segments_info): + self._seg = panoptic_seg + + self._sinfo = {s["id"]: s for s in segments_info} # seg id -> seg info + segment_ids, areas = torch.unique(panoptic_seg, sorted=True, return_counts=True) + areas = areas.numpy() + sorted_idxs = np.argsort(-areas) + self._seg_ids, self._seg_areas = segment_ids[sorted_idxs], areas[sorted_idxs] + self._seg_ids = self._seg_ids.tolist() + for sid, area in zip(self._seg_ids, self._seg_areas): + if sid in self._sinfo: + self._sinfo[sid]["area"] = float(area) + + def non_empty_mask(self): + """ + Returns: + (H, W) array, a mask for all pixels that have a prediction + """ + empty_ids = [] + for id in self._seg_ids: + if id not in self._sinfo: + empty_ids.append(id) + if len(empty_ids) == 0: + return np.zeros(self._seg.shape, dtype=np.uint8) + assert ( + len(empty_ids) == 1 + ), ">1 ids corresponds to no labels. This is currently not supported" + return (self._seg != empty_ids[0]).numpy().astype(np.bool) + + def semantic_masks(self): + for sid in self._seg_ids: + sinfo = self._sinfo.get(sid) + if sinfo is None or sinfo["isthing"]: + # Some pixels (e.g. id 0 in PanopticFPN) have no instance or semantic predictions. + continue + yield (self._seg == sid).numpy().astype(np.bool), sinfo + + def instance_masks(self): + for sid in self._seg_ids: + sinfo = self._sinfo.get(sid) + if sinfo is None or not sinfo["isthing"]: + continue + mask = (self._seg == sid).numpy().astype(np.bool) + if mask.sum() > 0: + yield mask, sinfo + + +def _create_text_labels(classes, scores, class_names): + """ + Args: + classes (list[int] or None): + scores (list[float] or None): + class_names (list[str] or None): + + Returns: + list[str] or None + """ + labels = None + if classes is not None and class_names is not None and len(class_names) > 1: + labels = [class_names[i] for i in classes] + if scores is not None: + if labels is None: + labels = ["{:.0f}%".format(s * 100) for s in scores] + else: + labels = ["{} {:.0f}%".format(l, s * 100) for l, s in zip(labels, scores)] + return labels + + +class VisImage: + def __init__(self, img, scale=1.0): + """ + Args: + img (ndarray): an RGB image of shape (H, W, 3). + scale (float): scale the input image + """ + self.img = img + self.scale = scale + self.width, self.height = img.shape[1], img.shape[0] + self._setup_figure(img) + + def _setup_figure(self, img): + """ + Args: + Same as in :meth:`__init__()`. + + Returns: + fig (matplotlib.pyplot.figure): top level container for all the image plot elements. + ax (matplotlib.pyplot.Axes): contains figure elements and sets the coordinate system. + """ + fig = mplfigure.Figure(frameon=False) + self.dpi = fig.get_dpi() + # add a small 1e-2 to avoid precision lost due to matplotlib's truncation + # (https://github.com/matplotlib/matplotlib/issues/15363) + fig.set_size_inches( + (self.width * self.scale + 1e-2) / self.dpi, + (self.height * self.scale + 1e-2) / self.dpi, + ) + self.canvas = FigureCanvasAgg(fig) + # self.canvas = mpl.backends.backend_cairo.FigureCanvasCairo(fig) + ax = fig.add_axes([0.0, 0.0, 1.0, 1.0]) + ax.axis("off") + ax.set_xlim(0.0, self.width) + ax.set_ylim(self.height) + + self.fig = fig + self.ax = ax + + def save(self, filepath): + """ + Args: + filepath (str): a string that contains the absolute path, including the file name, where + the visualized image will be saved. + """ + if filepath.lower().endswith(".jpg") or filepath.lower().endswith(".png"): + # faster than matplotlib's imshow + cv2.imwrite(filepath, self.get_image()[:, :, ::-1]) + else: + # support general formats (e.g. pdf) + self.ax.imshow(self.img, interpolation="nearest") + self.fig.savefig(filepath) + + def get_image(self): + """ + Returns: + ndarray: + the visualized image of shape (H, W, 3) (RGB) in uint8 type. + The shape is scaled w.r.t the input image using the given `scale` argument. + """ + canvas = self.canvas + s, (width, height) = canvas.print_to_buffer() + if (self.width, self.height) != (width, height): + img = cv2.resize(self.img, (width, height)) + else: + img = self.img + + # buf = io.BytesIO() # works for cairo backend + # canvas.print_rgba(buf) + # width, height = self.width, self.height + # s = buf.getvalue() + + buffer = np.frombuffer(s, dtype="uint8") + + # imshow is slow. blend manually (still quite slow) + img_rgba = buffer.reshape(height, width, 4) + rgb, alpha = np.split(img_rgba, [3], axis=2) + + try: + import numexpr as ne # fuse them with numexpr + + visualized_image = ne.evaluate("demo * (1 - alpha / 255.0) + rgb * (alpha / 255.0)") + except ImportError: + alpha = alpha.astype("float32") / 255.0 + visualized_image = img * (1 - alpha) + rgb * alpha + + visualized_image = visualized_image.astype("uint8") + + return visualized_image + + +class Visualizer: + def __init__(self, img_rgb, metadata, scale=1.0, instance_mode=ColorMode.IMAGE): + """ + Args: + img_rgb: a numpy array of shape (H, W, C), where H and W correspond to + the height and width of the image respectively. C is the number of + color channels. The image is required to be in RGB format since that + is a requirement of the Matplotlib library. The image is also expected + to be in the range [0, 255]. + metadata (MetadataCatalog): image metadata. + """ + self.img = np.asarray(img_rgb).clip(0, 255).astype(np.uint8) + self.metadata = metadata + self.output = VisImage(self.img, scale=scale) + self.cpu_device = torch.device("cpu") + + # too small texts are useless, therefore clamp to 9 + self._default_font_size = max( + np.sqrt(self.output.height * self.output.width) // 90, 10 // scale + ) + self._instance_mode = instance_mode + + def draw_instance_predictions(self, predictions): + """ + Draw instance-level prediction results on an image. + + Args: + predictions (Instances): the output of an instance detection/segmentation + model. Following fields will be used to draw: + "pred_boxes", "pred_classes", "scores", "pred_masks" (or "pred_masks_rle"). + + Returns: + output (VisImage): image object with visualizations. + """ + boxes = predictions.pred_boxes if predictions.has("pred_boxes") else None + scores = predictions.scores if predictions.has("scores") else None + classes = predictions.pred_classes if predictions.has("pred_classes") else None + labels = _create_text_labels(classes, scores, self.metadata.get("thing_classes", None)) + keypoints = predictions.pred_keypoints if predictions.has("pred_keypoints") else None + + if predictions.has("pred_masks"): + masks = np.asarray(predictions.pred_masks) + masks = [GenericMask(x, self.output.height, self.output.width) for x in masks] + else: + masks = None + + if self._instance_mode == ColorMode.SEGMENTATION and self.metadata.get("thing_colors"): + colors = [ + self._jitter([x / 255 for x in self.metadata.thing_colors[c]]) for c in classes + ] + alpha = 0.8 + else: + colors = None + alpha = 0.5 + + if self._instance_mode == ColorMode.IMAGE_BW: + self.output.img = self._create_grayscale_image( + (predictions.pred_masks.any(dim=0) > 0).numpy() + ) + alpha = 0.3 + + self.overlay_instances( + masks=masks, + boxes=boxes, + labels=labels, + keypoints=keypoints, + assigned_colors=colors, + alpha=alpha, + ) + return self.output + + def draw_sem_seg(self, sem_seg, area_threshold=None, alpha=0.8): + """ + Draw semantic segmentation predictions/labels. + + Args: + sem_seg (Tensor or ndarray): the segmentation of shape (H, W). + Each value is the integer label of the pixel. + area_threshold (int): segments with less than `area_threshold` are not drawn. + alpha (float): the larger it is, the more opaque the segmentations are. + + Returns: + output (VisImage): image object with visualizations. + """ + if isinstance(sem_seg, torch.Tensor): + sem_seg = sem_seg.numpy() + labels, areas = np.unique(sem_seg, return_counts=True) + sorted_idxs = np.argsort(-areas).tolist() + labels = labels[sorted_idxs] + for label in filter(lambda l: l < len(self.metadata.stuff_classes), labels): + try: + mask_color = [x / 255 for x in self.metadata.stuff_colors[label]] + except (AttributeError, IndexError): + mask_color = None + + binary_mask = (sem_seg == label).astype(np.uint8) + text = self.metadata.stuff_classes[label] + self.draw_binary_mask( + binary_mask, + color=mask_color, + edge_color=_OFF_WHITE, + text=text, + alpha=alpha, + area_threshold=area_threshold, + ) + return self.output + + def draw_panoptic_seg_predictions( + self, panoptic_seg, segments_info, area_threshold=None, alpha=0.7 + ): + """ + Draw panoptic prediction results on an image. + + Args: + panoptic_seg (Tensor): of shape (height, width) where the values are ids for each + segment. + segments_info (list[dict]): Describe each segment in `panoptic_seg`. + Each dict contains keys "id", "category_id", "isthing". + area_threshold (int): stuff segments with less than `area_threshold` are not drawn. + + Returns: + output (VisImage): image object with visualizations. + """ + pred = _PanopticPrediction(panoptic_seg, segments_info) + + if self._instance_mode == ColorMode.IMAGE_BW: + self.output.img = self._create_grayscale_image(pred.non_empty_mask()) + + # draw mask for all semantic segments first i.e. "stuff" + for mask, sinfo in pred.semantic_masks(): + category_idx = sinfo["category_id"] + try: + mask_color = [x / 255 for x in self.metadata.stuff_colors[category_idx]] + except AttributeError: + mask_color = None + + text = self.metadata.stuff_classes[category_idx] + self.draw_binary_mask( + mask, + color=mask_color, + edge_color=_OFF_WHITE, + text=text, + alpha=alpha, + area_threshold=area_threshold, + ) + + # draw mask for all instances second + all_instances = list(pred.instance_masks()) + if len(all_instances) == 0: + return self.output + masks, sinfo = list(zip(*all_instances)) + category_ids = [x["category_id"] for x in sinfo] + + try: + scores = [x["score"] for x in sinfo] + except KeyError: + scores = None + labels = _create_text_labels(category_ids, scores, self.metadata.thing_classes) + + try: + colors = [random_color(rgb=True, maximum=1) for k in category_ids] + except AttributeError: + colors = None + self.overlay_instances(masks=masks, labels=labels, assigned_colors=colors, alpha=alpha) + + return self.output + + def draw_dataset_dict(self, dic): + """ + Draw annotations/segmentaions in Detectron2 Dataset format. + + Args: + dic (dict): annotation/segmentation data of one image, in Detectron2 Dataset format. + + Returns: + output (VisImage): image object with visualizations. + """ + annos = dic.get("annotations", None) + if annos: + if "segmentation" in annos[0]: + masks = [x["segmentation"] for x in annos] + else: + masks = None + if "keypoints" in annos[0]: + keypts = [x["keypoints"] for x in annos] + keypts = np.array(keypts).reshape(len(annos), -1, 3) + else: + keypts = None + + boxes = [BoxMode.convert(x["bbox"], x["bbox_mode"], BoxMode.XYXY_ABS) for x in annos] + + labels = [x["category_id"] for x in annos] + colors = None + if self._instance_mode == ColorMode.SEGMENTATION and self.metadata.get("thing_colors"): + colors = [ + self._jitter([x / 255 for x in self.metadata.thing_colors[c]]) for c in labels + ] + names = self.metadata.get("thing_classes", None) + if names: + labels = [names[i] for i in labels] + labels = [ + "{}".format(i) + ("|crowd" if a.get("iscrowd", 0) else "") + for i, a in zip(labels, annos) + ] + self.overlay_instances( + labels=labels, boxes=boxes, masks=masks, keypoints=keypts, assigned_colors=colors + ) + + sem_seg = dic.get("sem_seg", None) + if sem_seg is None and "sem_seg_file_name" in dic: + with PathManager.open(dic["sem_seg_file_name"], "rb") as f: + sem_seg = Image.open(f) + sem_seg = np.asarray(sem_seg, dtype="uint8") + if sem_seg is not None: + self.draw_sem_seg(sem_seg, area_threshold=0, alpha=0.5) + return self.output + + def overlay_instances( + self, + *, + boxes=None, + labels=None, + masks=None, + keypoints=None, + assigned_colors=None, + alpha=0.5 + ): + """ + Args: + boxes (Boxes, RotatedBoxes or ndarray): either a :class:`Boxes`, + or an Nx4 numpy array of XYXY_ABS format for the N objects in a single image, + or a :class:`RotatedBoxes`, + or an Nx5 numpy array of (x_center, y_center, width, height, angle_degrees) format + for the N objects in a single image, + labels (list[str]): the text to be displayed for each instance. + masks (masks-like object): Supported types are: + + * :class:`detectron2.structures.PolygonMasks`, + :class:`detectron2.structures.BitMasks`. + * list[list[ndarray]]: contains the segmentation masks for all objects in one image. + The first level of the list corresponds to individual instances. The second + level to all the polygon that compose the instance, and the third level + to the polygon coordinates. The third level should have the format of + [x0, y0, x1, y1, ..., xn, yn] (n >= 3). + * list[ndarray]: each ndarray is a binary mask of shape (H, W). + * list[dict]: each dict is a COCO-style RLE. + keypoints (Keypoint or array like): an array-like object of shape (N, K, 3), + where the N is the number of instances and K is the number of keypoints. + The last dimension corresponds to (x, y, visibility or score). + assigned_colors (list[matplotlib.colors]): a list of colors, where each color + corresponds to each mask or box in the image. Refer to 'matplotlib.colors' + for full list of formats that the colors are accepted in. + + Returns: + output (VisImage): image object with visualizations. + """ + num_instances = None + if boxes is not None: + boxes = self._convert_boxes(boxes) + num_instances = len(boxes) + if masks is not None: + masks = self._convert_masks(masks) + if num_instances: + assert len(masks) == num_instances + else: + num_instances = len(masks) + if keypoints is not None: + if num_instances: + assert len(keypoints) == num_instances + else: + num_instances = len(keypoints) + keypoints = self._convert_keypoints(keypoints) + if labels is not None: + assert len(labels) == num_instances + if assigned_colors is None: + assigned_colors = [random_color(rgb=True, maximum=1) for _ in range(num_instances)] + if num_instances == 0: + return self.output + if boxes is not None and boxes.shape[1] == 5: + return self.overlay_rotated_instances( + boxes=boxes, labels=labels, assigned_colors=assigned_colors + ) + + # Display in largest to smallest order to reduce occlusion. + areas = None + if boxes is not None: + areas = np.prod(boxes[:, 2:] - boxes[:, :2], axis=1) + elif masks is not None: + areas = np.asarray([x.area() for x in masks]) + + if areas is not None: + sorted_idxs = np.argsort(-areas).tolist() + # Re-order overlapped instances in descending order. + boxes = boxes[sorted_idxs] if boxes is not None else None + labels = [labels[k] for k in sorted_idxs] if labels is not None else None + masks = [masks[idx] for idx in sorted_idxs] if masks is not None else None + assigned_colors = [assigned_colors[idx] for idx in sorted_idxs] + keypoints = keypoints[sorted_idxs] if keypoints is not None else None + + for i in range(num_instances): + color = assigned_colors[i] + if boxes is not None: + self.draw_box(boxes[i], edge_color=color) + + if masks is not None: + for segment in masks[i].polygons: + self.draw_polygon(segment.reshape(-1, 2), color, alpha=alpha) + + if labels is not None: + # first get a box + if boxes is not None: + x0, y0, x1, y1 = boxes[i] + text_pos = (x0, y0) # if drawing boxes, put text on the box corner. + horiz_align = "left" + elif masks is not None: + x0, y0, x1, y1 = masks[i].bbox() + + # draw text in the center (defined by median) when box is not drawn + # median is less sensitive to outliers. + text_pos = np.median(masks[i].mask.nonzero(), axis=1)[::-1] + horiz_align = "center" + else: + continue # drawing the box confidence for keypoints isn't very useful. + # for small objects, draw text at the side to avoid occlusion + instance_area = (y1 - y0) * (x1 - x0) + if ( + instance_area < _SMALL_OBJECT_AREA_THRESH * self.output.scale + or y1 - y0 < 40 * self.output.scale + ): + if y1 >= self.output.height - 5: + text_pos = (x1, y0) + else: + text_pos = (x0, y1) + + height_ratio = (y1 - y0) / np.sqrt(self.output.height * self.output.width) + lighter_color = self._change_color_brightness(color, brightness_factor=0.7) + font_size = ( + np.clip((height_ratio - 0.02) / 0.08 + 1, 1.2, 2) + * 0.5 + * self._default_font_size + ) + self.draw_text( + labels[i], + text_pos, + color=lighter_color, + horizontal_alignment=horiz_align, + font_size=font_size, + ) + + # draw keypoints + if keypoints is not None: + for keypoints_per_instance in keypoints: + self.draw_and_connect_keypoints(keypoints_per_instance) + + return self.output + + def overlay_rotated_instances(self, boxes=None, labels=None, assigned_colors=None): + """ + Args: + boxes (ndarray): an Nx5 numpy array of + (x_center, y_center, width, height, angle_degrees) format + for the N objects in a single image. + labels (list[str]): the text to be displayed for each instance. + assigned_colors (list[matplotlib.colors]): a list of colors, where each color + corresponds to each mask or box in the image. Refer to 'matplotlib.colors' + for full list of formats that the colors are accepted in. + + Returns: + output (VisImage): image object with visualizations. + """ + + num_instances = len(boxes) + + if assigned_colors is None: + assigned_colors = [random_color(rgb=True, maximum=1) for _ in range(num_instances)] + if num_instances == 0: + return self.output + + # Display in largest to smallest order to reduce occlusion. + if boxes is not None: + areas = boxes[:, 2] * boxes[:, 3] + + sorted_idxs = np.argsort(-areas).tolist() + # Re-order overlapped instances in descending order. + boxes = boxes[sorted_idxs] + labels = [labels[k] for k in sorted_idxs] if labels is not None else None + colors = [assigned_colors[idx] for idx in sorted_idxs] + + for i in range(num_instances): + self.draw_rotated_box_with_label( + boxes[i], edge_color=colors[i], label=labels[i] if labels is not None else None + ) + + return self.output + + def draw_and_connect_keypoints(self, keypoints): + """ + Draws keypoints of an instance and follows the rules for keypoint connections + to draw lines between appropriate keypoints. This follows color heuristics for + line color. + + Args: + keypoints (Tensor): a tensor of shape (K, 3), where K is the number of keypoints + and the last dimension corresponds to (x, y, probability). + + Returns: + output (VisImage): image object with visualizations. + """ + visible = {} + keypoint_names = self.metadata.get("keypoint_names") + for idx, keypoint in enumerate(keypoints): + # draw keypoint + x, y, prob = keypoint + if prob > _KEYPOINT_THRESHOLD: + self.draw_circle((x, y), color=_RED) + if keypoint_names: + keypoint_name = keypoint_names[idx] + visible[keypoint_name] = (x, y) + + if self.metadata.get("keypoint_connection_rules"): + for kp0, kp1, color in self.metadata.keypoint_connection_rules: + if kp0 in visible and kp1 in visible: + x0, y0 = visible[kp0] + x1, y1 = visible[kp1] + color = tuple(x / 255.0 for x in color) + self.draw_line([x0, x1], [y0, y1], color=color) + + # draw lines from nose to mid-shoulder and mid-shoulder to mid-hip + # Note that this strategy is specific to person keypoints. + # For other keypoints, it should just do nothing + try: + ls_x, ls_y = visible["left_shoulder"] + rs_x, rs_y = visible["right_shoulder"] + mid_shoulder_x, mid_shoulder_y = (ls_x + rs_x) / 2, (ls_y + rs_y) / 2 + except KeyError: + pass + else: + # draw line from nose to mid-shoulder + nose_x, nose_y = visible.get("nose", (None, None)) + if nose_x is not None: + self.draw_line([nose_x, mid_shoulder_x], [nose_y, mid_shoulder_y], color=_RED) + + try: + # draw line from mid-shoulder to mid-hip + lh_x, lh_y = visible["left_hip"] + rh_x, rh_y = visible["right_hip"] + except KeyError: + pass + else: + mid_hip_x, mid_hip_y = (lh_x + rh_x) / 2, (lh_y + rh_y) / 2 + self.draw_line([mid_hip_x, mid_shoulder_x], [mid_hip_y, mid_shoulder_y], color=_RED) + return self.output + + """ + Primitive drawing functions: + """ + + def draw_text( + self, + text, + position, + *, + font_size=None, + color="g", + horizontal_alignment="center", + rotation=0 + ): + """ + Args: + text (str): class label + position (tuple): a tuple of the x and y coordinates to place text on image. + font_size (int, optional): font of the text. If not provided, a font size + proportional to the image width is calculated and used. + color: color of the text. Refer to `matplotlib.colors` for full list + of formats that are accepted. + horizontal_alignment (str): see `matplotlib.text.Text` + rotation: rotation angle in degrees CCW + + Returns: + output (VisImage): image object with text drawn. + """ + if not font_size: + font_size = self._default_font_size + + # since the text background is dark, we don't want the text to be dark + color = np.maximum(list(mplc.to_rgb(color)), 0.2) + color[np.argmax(color)] = max(0.8, np.max(color)) + + x, y = position + self.output.ax.text( + x, + y, + text, + size=font_size * self.output.scale, + family="sans-serif", + bbox={"facecolor": "black", "alpha": 0.8, "pad": 0.7, "edgecolor": "none"}, + verticalalignment="top", + horizontalalignment=horizontal_alignment, + color=color, + zorder=10, + rotation=rotation, + ) + return self.output + + def draw_box(self, box_coord, alpha=0.5, edge_color="g", line_style="-"): + """ + Args: + box_coord (tuple): a tuple containing x0, y0, x1, y1 coordinates, where x0 and y0 + are the coordinates of the image's top left corner. x1 and y1 are the + coordinates of the image's bottom right corner. + alpha (float): blending efficient. Smaller values lead to more transparent masks. + edge_color: color of the outline of the box. Refer to `matplotlib.colors` + for full list of formats that are accepted. + line_style (string): the string to use to create the outline of the boxes. + + Returns: + output (VisImage): image object with box drawn. + """ + x0, y0, x1, y1 = box_coord + width = x1 - x0 + height = y1 - y0 + + linewidth = max(self._default_font_size / 4, 1) + + self.output.ax.add_patch( + mpl.patches.Rectangle( + (x0, y0), + width, + height, + fill=False, + edgecolor=edge_color, + linewidth=linewidth * self.output.scale, + alpha=alpha, + linestyle=line_style, + ) + ) + return self.output + + def draw_rotated_box_with_label( + self, rotated_box, alpha=0.5, edge_color="g", line_style="-", label=None + ): + """ + Args: + rotated_box (tuple): a tuple containing (cnt_x, cnt_y, w, h, angle), + where cnt_x and cnt_y are the center coordinates of the box. + w and h are the width and height of the box. angle represents how + many degrees the box is rotated CCW with regard to the 0-degree box. + alpha (float): blending efficient. Smaller values lead to more transparent masks. + edge_color: color of the outline of the box. Refer to `matplotlib.colors` + for full list of formats that are accepted. + line_style (string): the string to use to create the outline of the boxes. + label (string): label for rotated box. It will not be rendered when set to None. + + Returns: + output (VisImage): image object with box drawn. + """ + cnt_x, cnt_y, w, h, angle = rotated_box + area = w * h + # use thinner lines when the box is small + linewidth = self._default_font_size / ( + 6 if area < _SMALL_OBJECT_AREA_THRESH * self.output.scale else 3 + ) + + theta = angle * math.pi / 180.0 + c = math.cos(theta) + s = math.sin(theta) + rect = [(-w / 2, h / 2), (-w / 2, -h / 2), (w / 2, -h / 2), (w / 2, h / 2)] + # x: left->right ; y: top->down + rotated_rect = [(s * yy + c * xx + cnt_x, c * yy - s * xx + cnt_y) for (xx, yy) in rect] + for k in range(4): + j = (k + 1) % 4 + self.draw_line( + [rotated_rect[k][0], rotated_rect[j][0]], + [rotated_rect[k][1], rotated_rect[j][1]], + color=edge_color, + linestyle="--" if k == 1 else line_style, + linewidth=linewidth, + ) + + if label is not None: + text_pos = rotated_rect[1] # topleft corner + + height_ratio = h / np.sqrt(self.output.height * self.output.width) + label_color = self._change_color_brightness(edge_color, brightness_factor=0.7) + font_size = ( + np.clip((height_ratio - 0.02) / 0.08 + 1, 1.2, 2) * 0.5 * self._default_font_size + ) + self.draw_text(label, text_pos, color=label_color, font_size=font_size, rotation=angle) + + return self.output + + def draw_circle(self, circle_coord, color, radius=3): + """ + Args: + circle_coord (list(int) or tuple(int)): contains the x and y coordinates + of the center of the circle. + color: color of the polygon. Refer to `matplotlib.colors` for a full list of + formats that are accepted. + radius (int): radius of the circle. + + Returns: + output (VisImage): image object with box drawn. + """ + x, y = circle_coord + self.output.ax.add_patch( + mpl.patches.Circle(circle_coord, radius=radius, fill=True, color=color) + ) + return self.output + + def draw_line(self, x_data, y_data, color, linestyle="-", linewidth=None): + """ + Args: + x_data (list[int]): a list containing x values of all the points being drawn. + Length of list should match the length of y_data. + y_data (list[int]): a list containing y values of all the points being drawn. + Length of list should match the length of x_data. + color: color of the line. Refer to `matplotlib.colors` for a full list of + formats that are accepted. + linestyle: style of the line. Refer to `matplotlib.lines.Line2D` + for a full list of formats that are accepted. + linewidth (float or None): width of the line. When it's None, + a default value will be computed and used. + + Returns: + output (VisImage): image object with line drawn. + """ + if linewidth is None: + linewidth = self._default_font_size / 3 + linewidth = max(linewidth, 1) + self.output.ax.add_line( + mpl.lines.Line2D( + x_data, + y_data, + linewidth=linewidth * self.output.scale, + color=color, + linestyle=linestyle, + ) + ) + return self.output + + def draw_binary_mask( + self, binary_mask, color=None, *, edge_color=None, text=None, alpha=0.5, area_threshold=4096 + ): + """ + Args: + binary_mask (ndarray): numpy array of shape (H, W), where H is the image height and + W is the image width. Each value in the array is either a 0 or 1 value of uint8 + type. + color: color of the mask. Refer to `matplotlib.colors` for a full list of + formats that are accepted. If None, will pick a random color. + edge_color: color of the polygon edges. Refer to `matplotlib.colors` for a + full list of formats that are accepted. + text (str): if None, will be drawn in the object's center of mass. + alpha (float): blending efficient. Smaller values lead to more transparent masks. + area_threshold (float): a connected component small than this will not be shown. + + Returns: + output (VisImage): image object with mask drawn. + """ + if color is None: + color = random_color(rgb=True, maximum=1) + if area_threshold is None: + area_threshold = 4096 + + has_valid_segment = False + binary_mask = binary_mask.astype("uint8") # opencv needs uint8 + mask = GenericMask(binary_mask, self.output.height, self.output.width) + shape2d = (binary_mask.shape[0], binary_mask.shape[1]) + + if not mask.has_holes: + # draw polygons for regular masks + for segment in mask.polygons: + area = mask_util.area(mask_util.frPyObjects([segment], shape2d[0], shape2d[1])) + if area < area_threshold: + continue + has_valid_segment = True + segment = segment.reshape(-1, 2) + self.draw_polygon(segment, color=color, edge_color=edge_color, alpha=alpha) + else: + rgba = np.zeros(shape2d + (4,), dtype="float32") + rgba[:, :, :3] = color + rgba[:, :, 3] = (mask.mask == 1).astype("float32") * alpha + has_valid_segment = True + self.output.ax.imshow(rgba) + + if text is not None and has_valid_segment: + # TODO sometimes drawn on wrong objects. the heuristics here can improve. + lighter_color = self._change_color_brightness(color, brightness_factor=0.7) + _num_cc, cc_labels, stats, centroids = cv2.connectedComponentsWithStats(binary_mask, 8) + largest_component_id = np.argmax(stats[1:, -1]) + 1 + + # draw text on the largest component, as well as other very large components. + for cid in range(1, _num_cc): + if cid == largest_component_id or stats[cid, -1] > _LARGE_MASK_AREA_THRESH: + # median is more stable than centroid + # center = centroids[largest_component_id] + center = np.median((cc_labels == cid).nonzero(), axis=1)[::-1] + self.draw_text(text, center, color=lighter_color) + return self.output + + def draw_polygon(self, segment, color, edge_color=None, alpha=0.5): + """ + Args: + segment: numpy array of shape Nx2, containing all the points in the polygon. + color: color of the polygon. Refer to `matplotlib.colors` for a full list of + formats that are accepted. + edge_color: color of the polygon edges. Refer to `matplotlib.colors` for a + full list of formats that are accepted. If not provided, a darker shade + of the polygon color will be used instead. + alpha (float): blending efficient. Smaller values lead to more transparent masks. + + Returns: + output (VisImage): image object with polygon drawn. + """ + if edge_color is None: + # make edge color darker than the polygon color + if alpha > 0.8: + edge_color = self._change_color_brightness(color, brightness_factor=-0.7) + else: + edge_color = color + edge_color = mplc.to_rgb(edge_color) + (1,) + + polygon = mpl.patches.Polygon( + segment, + fill=True, + facecolor=mplc.to_rgb(color) + (alpha,), + edgecolor=edge_color, + linewidth=max(self._default_font_size // 15 * self.output.scale, 1), + ) + self.output.ax.add_patch(polygon) + return self.output + + """ + Internal methods: + """ + + def _jitter(self, color): + """ + Randomly modifies given color to produce a slightly different color than the color given. + + Args: + color (tuple[double]): a tuple of 3 elements, containing the RGB values of the color + picked. The values in the list are in the [0.0, 1.0] range. + + Returns: + jittered_color (tuple[double]): a tuple of 3 elements, containing the RGB values of the + color after being jittered. The values in the list are in the [0.0, 1.0] range. + """ + color = mplc.to_rgb(color) + vec = np.random.rand(3) + # better to do it in another color space + vec = vec / np.linalg.norm(vec) * 0.5 + res = np.clip(vec + color, 0, 1) + return tuple(res) + + def _create_grayscale_image(self, mask=None): + """ + Create a grayscale version of the original image. + The colors in masked area, if given, will be kept. + """ + img_bw = self.img.astype("f4").mean(axis=2) + img_bw = np.stack([img_bw] * 3, axis=2) + if mask is not None: + img_bw[mask] = self.img[mask] + return img_bw + + def _change_color_brightness(self, color, brightness_factor): + """ + Depending on the brightness_factor, gives a lighter or darker color i.e. a color with + less or more saturation than the original color. + + Args: + color: color of the polygon. Refer to `matplotlib.colors` for a full list of + formats that are accepted. + brightness_factor (float): a value in [-1.0, 1.0] range. A lightness factor of + 0 will correspond to no change, a factor in [-1.0, 0) range will result in + a darker color and a factor in (0, 1.0] range will result in a lighter color. + + Returns: + modified_color (tuple[double]): a tuple containing the RGB values of the + modified color. Each value in the tuple is in the [0.0, 1.0] range. + """ + assert brightness_factor >= -1.0 and brightness_factor <= 1.0 + color = mplc.to_rgb(color) + polygon_color = colorsys.rgb_to_hls(*mplc.to_rgb(color)) + modified_lightness = polygon_color[1] + (brightness_factor * polygon_color[1]) + modified_lightness = 0.0 if modified_lightness < 0.0 else modified_lightness + modified_lightness = 1.0 if modified_lightness > 1.0 else modified_lightness + modified_color = colorsys.hls_to_rgb(polygon_color[0], modified_lightness, polygon_color[2]) + return modified_color + + def _convert_boxes(self, boxes): + """ + Convert different format of boxes to an NxB array, where B = 4 or 5 is the box dimension. + """ + if isinstance(boxes, Boxes) or isinstance(boxes, RotatedBoxes): + return boxes.tensor.numpy() + else: + return np.asarray(boxes) + + def _convert_masks(self, masks_or_polygons): + """ + Convert different format of masks or polygons to a tuple of masks and polygons. + + Returns: + list[GenericMask]: + """ + + m = masks_or_polygons + if isinstance(m, PolygonMasks): + m = m.polygons + if isinstance(m, BitMasks): + m = m.tensor.numpy() + if isinstance(m, torch.Tensor): + m = m.numpy() + ret = [] + for x in m: + if isinstance(x, GenericMask): + ret.append(x) + else: + ret.append(GenericMask(x, self.output.height, self.output.width)) + return ret + + def _convert_keypoints(self, keypoints): + if isinstance(keypoints, Keypoints): + keypoints = keypoints.tensor + keypoints = np.asarray(keypoints) + return keypoints + + def get_output(self): + """ + Returns: + output (VisImage): the image output containing the visualizations added + to the image. + """ + return self.output diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/README.md b/preprocess/humanparsing/mhp_extension/detectron2/dev/README.md new file mode 100644 index 0000000..cc0d329 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/README.md @@ -0,0 +1,7 @@ + +## Some scripts for developers to use, include: + +- `linter.sh`: lint the codebase before commit +- `run_{inference,instant}_tests.sh`: run inference/training for a few iterations. + Note that these tests require 2 GPUs. +- `parse_results.sh`: parse results from a log file. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/linter.sh b/preprocess/humanparsing/mhp_extension/detectron2/dev/linter.sh new file mode 100644 index 0000000..fd7081d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/linter.sh @@ -0,0 +1,46 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +# Run this script at project root by "./dev/linter.sh" before you commit + +vergte() { + [ "$2" = "$(echo -e "$1\\n$2" | sort -V | head -n1)" ] +} + +{ + black --version | grep -E "(19.3b0.*6733274)|(19.3b0\\+8)" > /dev/null +} || { + echo "Linter requires 'black @ git+https://github.com/psf/black@673327449f86fce558adde153bb6cbe54bfebad2' !" + exit 1 +} + +ISORT_TARGET_VERSION="4.3.21" +ISORT_VERSION=$(isort -v | grep VERSION | awk '{print $2}') +vergte "$ISORT_VERSION" "$ISORT_TARGET_VERSION" || { + echo "Linter requires isort>=${ISORT_TARGET_VERSION} !" + exit 1 +} + +set -v + +echo "Running isort ..." +isort -y -sp . --atomic + +echo "Running black ..." +black -l 100 . + +echo "Running flake8 ..." +if [ -x "$(command -v flake8-3)" ]; then + flake8-3 . +else + python3 -m flake8 . +fi + +# echo "Running mypy ..." +# Pytorch does not have enough type annotations +# mypy detectron2/solver detectron2/structures detectron2/config + +echo "Running clang-format ..." +find . -regex ".*\.\(cpp\|c\|cc\|cu\|cxx\|h\|hh\|hpp\|hxx\|tcc\|mm\|m\)" -print0 | xargs -0 clang-format -i + +command -v arc > /dev/null && arc lint diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/README.md b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/README.md new file mode 100644 index 0000000..095684f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/README.md @@ -0,0 +1,17 @@ + +## To build a cu101 wheel for release: + +``` +$ nvidia-docker run -it --storage-opt "size=20GB" --name pt pytorch/manylinux-cuda101 +# inside the container: +# git clone https://github.com/facebookresearch/detectron2/ +# cd detectron2 +# export CU_VERSION=cu101 D2_VERSION_SUFFIX= PYTHON_VERSION=3.7 PYTORCH_VERSION=1.4 +# ./dev/packaging/build_wheel.sh +``` + +## To build all wheels for `CUDA {9.2,10.0,10.1}` x `Python {3.6,3.7,3.8}`: +``` +./dev/packaging/build_all_wheels.sh +./dev/packaging/gen_wheel_index.sh /path/to/wheels +``` diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/build_all_wheels.sh b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/build_all_wheels.sh new file mode 100644 index 0000000..eb64dea --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/build_all_wheels.sh @@ -0,0 +1,57 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +PYTORCH_VERSION=1.5 + +build_for_one_cuda() { + cu=$1 + + case "$cu" in + cu*) + container_name=manylinux-cuda${cu/cu/} + ;; + cpu) + container_name=manylinux-cuda101 + ;; + *) + echo "Unrecognized cu=$cu" + exit 1 + ;; + esac + + echo "Launching container $container_name ..." + + for py in 3.6 3.7 3.8; do + docker run -itd \ + --name $container_name \ + --mount type=bind,source="$(pwd)",target=/detectron2 \ + pytorch/$container_name + + cat </dev/null 2>&1 && pwd )" +. "$script_dir/pkg_helpers.bash" + +echo "Build Settings:" +echo "CU_VERSION: $CU_VERSION" # e.g. cu101 +echo "D2_VERSION_SUFFIX: $D2_VERSION_SUFFIX" # e.g. +cu101 or "" +echo "PYTHON_VERSION: $PYTHON_VERSION" # e.g. 3.6 +echo "PYTORCH_VERSION: $PYTORCH_VERSION" # e.g. 1.4 + +setup_cuda +setup_wheel_python +yum install ninja-build -y && ln -sv /usr/bin/ninja-build /usr/bin/ninja + +export TORCH_VERSION_SUFFIX="+$CU_VERSION" +if [[ "$CU_VERSION" == "cu102" ]]; then + export TORCH_VERSION_SUFFIX="" +fi +pip_install pip numpy -U +pip_install "torch==$PYTORCH_VERSION$TORCH_VERSION_SUFFIX" \ + -f https://download.pytorch.org/whl/$CU_VERSION/torch_stable.html + +# use separate directories to allow parallel build +BASE_BUILD_DIR=build/$CU_VERSION/$PYTHON_VERSION +python setup.py \ + build -b $BASE_BUILD_DIR \ + bdist_wheel -b $BASE_BUILD_DIR/build_dist -d wheels/$CU_VERSION diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/gen_wheel_index.sh b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/gen_wheel_index.sh new file mode 100644 index 0000000..44d6041 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/gen_wheel_index.sh @@ -0,0 +1,27 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + + +root=$1 +if [[ -z "$root" ]]; then + echo "Usage: ./gen_wheel_index.sh /path/to/wheels" + exit +fi + +index=$root/index.html + +cd "$root" +for cu in cpu cu92 cu100 cu101 cu102; do + cd $cu + echo "Creating $PWD/index.html ..." + for whl in *.whl; do + echo "
    $whl
    " + done > index.html + cd "$root" +done + +echo "Creating $index ..." +for whl in $(find . -type f -name '*.whl' -printf '%P\n' | sort); do + echo "$whl
    " +done > "$index" + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/pkg_helpers.bash b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/pkg_helpers.bash new file mode 100644 index 0000000..51e6185 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/packaging/pkg_helpers.bash @@ -0,0 +1,57 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +# Function to retry functions that sometimes timeout or have flaky failures +retry () { + $* || (sleep 1 && $*) || (sleep 2 && $*) || (sleep 4 && $*) || (sleep 8 && $*) +} +# Install with pip a bit more robustly than the default +pip_install() { + retry pip install --progress-bar off "$@" +} + + +setup_cuda() { + # Now work out the CUDA settings + # Like other torch domain libraries, we choose common GPU architectures only. + export FORCE_CUDA=1 + case "$CU_VERSION" in + cu102) + export CUDA_HOME=/usr/local/cuda-10.2/ + export TORCH_CUDA_ARCH_LIST="3.5;3.7;5.0;5.2;6.0+PTX;6.1+PTX;7.0+PTX;7.5+PTX" + ;; + cu101) + export CUDA_HOME=/usr/local/cuda-10.1/ + export TORCH_CUDA_ARCH_LIST="3.5;3.7;5.0;5.2;6.0+PTX;6.1+PTX;7.0+PTX;7.5+PTX" + ;; + cu100) + export CUDA_HOME=/usr/local/cuda-10.0/ + export TORCH_CUDA_ARCH_LIST="3.5;3.7;5.0;5.2;6.0+PTX;6.1+PTX;7.0+PTX;7.5+PTX" + ;; + cu92) + export CUDA_HOME=/usr/local/cuda-9.2/ + export TORCH_CUDA_ARCH_LIST="3.5;3.7;5.0;5.2;6.0+PTX;6.1+PTX;7.0+PTX" + ;; + cpu) + unset FORCE_CUDA + export CUDA_VISIBLE_DEVICES= + ;; + *) + echo "Unrecognized CU_VERSION=$CU_VERSION" + exit 1 + ;; + esac +} + +setup_wheel_python() { + case "$PYTHON_VERSION" in + 3.6) python_abi=cp36-cp36m ;; + 3.7) python_abi=cp37-cp37m ;; + 3.8) python_abi=cp38-cp38 ;; + *) + echo "Unrecognized PYTHON_VERSION=$PYTHON_VERSION" + exit 1 + ;; + esac + export PATH="/opt/python/$python_abi/bin:$PATH" +} diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/parse_results.sh b/preprocess/humanparsing/mhp_extension/detectron2/dev/parse_results.sh new file mode 100644 index 0000000..874b688 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/parse_results.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +# A shell script that parses metrics from the log file. +# Make it easier for developers to track performance of models. + +LOG="$1" + +if [[ -z "$LOG" ]]; then + echo "Usage: $0 /path/to/log/file" + exit 1 +fi + +# [12/15 11:47:32] trainer INFO: Total training time: 12:15:04.446477 (0.4900 s / it) +# [12/15 11:49:03] inference INFO: Total inference time: 0:01:25.326167 (0.13652186737060548 s / demo per device, on 8 devices) +# [12/15 11:49:03] inference INFO: Total inference pure compute time: ..... + +# training time +trainspeed=$(grep -o 'Overall training.*' "$LOG" | grep -Eo '\(.*\)' | grep -o '[0-9\.]*') +echo "Training speed: $trainspeed s/it" + +# inference time: there could be multiple inference during training +inferencespeed=$(grep -o 'Total inference pure.*' "$LOG" | tail -n1 | grep -Eo '\(.*\)' | grep -o '[0-9\.]*' | head -n1) +echo "Inference speed: $inferencespeed s/it" + +# [12/15 11:47:18] trainer INFO: eta: 0:00:00 iter: 90000 loss: 0.5407 (0.7256) loss_classifier: 0.1744 (0.2446) loss_box_reg: 0.0838 (0.1160) loss_mask: 0.2159 (0.2722) loss_objectness: 0.0244 (0.0429) loss_rpn_box_reg: 0.0279 (0.0500) time: 0.4487 (0.4899) data: 0.0076 (0.0975) lr: 0.000200 max mem: 4161 +memory=$(grep -o 'max[_ ]mem: [0-9]*' "$LOG" | tail -n1 | grep -o '[0-9]*') +echo "Training memory: $memory MB" + +echo "Easy to copypaste:" +echo "$trainspeed","$inferencespeed","$memory" + +echo "------------------------------" + +# [12/26 17:26:32] engine.coco_evaluation: copypaste: Task: bbox +# [12/26 17:26:32] engine.coco_evaluation: copypaste: AP,AP50,AP75,APs,APm,APl +# [12/26 17:26:32] engine.coco_evaluation: copypaste: 0.0017,0.0024,0.0017,0.0005,0.0019,0.0011 +# [12/26 17:26:32] engine.coco_evaluation: copypaste: Task: segm +# [12/26 17:26:32] engine.coco_evaluation: copypaste: AP,AP50,AP75,APs,APm,APl +# [12/26 17:26:32] engine.coco_evaluation: copypaste: 0.0014,0.0021,0.0016,0.0005,0.0016,0.0011 + +echo "COCO Results:" +num_tasks=$(grep -o 'copypaste:.*Task.*' "$LOG" | sort -u | wc -l) +# each task has 3 lines +grep -o 'copypaste:.*' "$LOG" | cut -d ' ' -f 2- | tail -n $((num_tasks * 3)) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/run_inference_tests.sh b/preprocess/humanparsing/mhp_extension/detectron2/dev/run_inference_tests.sh new file mode 100644 index 0000000..17e422d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/run_inference_tests.sh @@ -0,0 +1,44 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +BIN="python tools/train_net.py" +OUTPUT="inference_test_output" +NUM_GPUS=2 + +CFG_LIST=( "${@:1}" ) + +if [ ${#CFG_LIST[@]} -eq 0 ]; then + CFG_LIST=( ./configs/quick_schedules/*inference_acc_test.yaml ) +fi + +echo "========================================================================" +echo "Configs to run:" +echo "${CFG_LIST[@]}" +echo "========================================================================" + + +for cfg in "${CFG_LIST[@]}"; do + echo "========================================================================" + echo "Running $cfg ..." + echo "========================================================================" + $BIN \ + --eval-only \ + --num-gpus $NUM_GPUS \ + --config-file "$cfg" \ + OUTPUT_DIR $OUTPUT + rm -rf $OUTPUT +done + + +echo "========================================================================" +echo "Running demo.py ..." +echo "========================================================================" +DEMO_BIN="python demo/demo.py" +COCO_DIR=datasets/coco/val2014 +mkdir -pv $OUTPUT + +set -v + +$DEMO_BIN --config-file ./configs/quick_schedules/panoptic_fpn_R_50_inference_acc_test.yaml \ + --input $COCO_DIR/COCO_val2014_0000001933* --output $OUTPUT +rm -rf $OUTPUT diff --git a/preprocess/humanparsing/mhp_extension/detectron2/dev/run_instant_tests.sh b/preprocess/humanparsing/mhp_extension/detectron2/dev/run_instant_tests.sh new file mode 100644 index 0000000..2c51de6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/dev/run_instant_tests.sh @@ -0,0 +1,27 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +BIN="python tools/train_net.py" +OUTPUT="instant_test_output" +NUM_GPUS=2 + +CFG_LIST=( "${@:1}" ) +if [ ${#CFG_LIST[@]} -eq 0 ]; then + CFG_LIST=( ./configs/quick_schedules/*instant_test.yaml ) +fi + +echo "========================================================================" +echo "Configs to run:" +echo "${CFG_LIST[@]}" +echo "========================================================================" + +for cfg in "${CFG_LIST[@]}"; do + echo "========================================================================" + echo "Running $cfg ..." + echo "========================================================================" + $BIN --num-gpus $NUM_GPUS --config-file "$cfg" \ + SOLVER.IMS_PER_BATCH $(($NUM_GPUS * 2)) \ + OUTPUT_DIR "$OUTPUT" + rm -rf "$OUTPUT" +done + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile b/preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile new file mode 100644 index 0000000..2a86039 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile @@ -0,0 +1,49 @@ +FROM nvidia/cuda:10.1-cudnn7-devel + +ENV DEBIAN_FRONTEND noninteractive +RUN apt-get update && apt-get install -y \ + python3-opencv ca-certificates python3-dev git wget sudo \ + cmake ninja-build protobuf-compiler libprotobuf-dev && \ + rm -rf /var/lib/apt/lists/* +RUN ln -sv /usr/bin/python3 /usr/bin/python + +# create a non-root user +ARG USER_ID=1000 +RUN useradd -m --no-log-init --system --uid ${USER_ID} appuser -g sudo +RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers +USER appuser +WORKDIR /home/appuser + +ENV PATH="/home/appuser/.local/bin:${PATH}" +RUN wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py --user && \ + rm get-pip.py + +# install dependencies +# See https://pytorch.org/ for other options if you use a different version of CUDA +RUN pip install --user tensorboard cython +RUN pip install --user torch==1.5+cu101 torchvision==0.6+cu101 -f https://download.pytorch.org/whl/torch_stable.html +RUN pip install --user 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI' + +RUN pip install --user 'git+https://github.com/facebookresearch/fvcore' +# install detectron2 +RUN git clone https://github.com/facebookresearch/detectron2 detectron2_repo +# set FORCE_CUDA because during `docker build` cuda is not accessible +ENV FORCE_CUDA="1" +# This will by default build detectron2 for all common cuda architectures and take a lot more time, +# because inside `docker build`, there is no way to tell which architecture will be used. +ARG TORCH_CUDA_ARCH_LIST="Kepler;Kepler+Tesla;Maxwell;Maxwell+Tegra;Pascal;Volta;Turing" +ENV TORCH_CUDA_ARCH_LIST="${TORCH_CUDA_ARCH_LIST}" + +RUN pip install --user -e detectron2_repo + +# Set a fixed model cache directory. +ENV FVCORE_CACHE="/tmp" +WORKDIR /home/appuser/detectron2_repo + +# run detectron2 under user "appuser": +# wget http://images.cocodataset.org/val2017/000000439715.jpg -O input.jpg +# python3 demo/demo.py \ + #--config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ + #--input input.jpg --output outputs/ \ + #--opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile-circleci b/preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile-circleci new file mode 100644 index 0000000..bc0be84 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docker/Dockerfile-circleci @@ -0,0 +1,17 @@ +FROM nvidia/cuda:10.1-cudnn7-devel +# This dockerfile only aims to provide an environment for unittest on CircleCI + +ENV DEBIAN_FRONTEND noninteractive +RUN apt-get update && apt-get install -y \ + python3-opencv ca-certificates python3-dev git wget sudo ninja-build && \ + rm -rf /var/lib/apt/lists/* + +RUN wget -q https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py && \ + rm get-pip.py + +# install dependencies +# See https://pytorch.org/ for other options if you use a different version of CUDA +RUN pip install tensorboard cython +RUN pip install torch==1.5+cu101 torchvision==0.6+cu101 -f https://download.pytorch.org/whl/torch_stable.html +RUN pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI' diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docker/README.md b/preprocess/humanparsing/mhp_extension/detectron2/docker/README.md new file mode 100644 index 0000000..760c405 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docker/README.md @@ -0,0 +1,36 @@ + +## Use the container (with docker ≥ 19.03) + +``` +cd docker/ +# Build: +docker build --build-arg USER_ID=$UID -t detectron2:v0 . +# Run: +docker run --gpus all -it \ + --shm-size=8gb --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ + --name=detectron2 detectron2:v0 + +# Grant docker access to host X server to show images +xhost +local:`docker inspect --format='{{ .Config.Hostname }}' detectron2` +``` + +## Use the container (with docker < 19.03) + +Install docker-compose and nvidia-docker2, then run: +``` +cd docker && USER_ID=$UID docker-compose run detectron2 +``` + +#### Using a persistent cache directory + +You can prevent models from being re-downloaded on every run, +by storing them in a cache directory. + +To do this, add `--volume=$HOME/.torch/fvcore_cache:/tmp:rw` in the run command. + +## Install new dependencies +Add the following to `Dockerfile` to make persistent changes. +``` +RUN sudo apt-get update && sudo apt-get install -y vim +``` +Or run them in the container to make temporary changes. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docker/docker-compose.yml b/preprocess/humanparsing/mhp_extension/detectron2/docker/docker-compose.yml new file mode 100644 index 0000000..e660f44 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docker/docker-compose.yml @@ -0,0 +1,18 @@ +version: "2.3" +services: + detectron2: + build: + context: . + dockerfile: Dockerfile + args: + USER_ID: ${USER_ID:-1000} + runtime: nvidia # TODO: Exchange with "gpu: all" in the future (see https://github.com/facebookresearch/detectron2/pull/197/commits/00545e1f376918db4a8ce264d427a07c1e896c5a). + shm_size: "8gb" + ulimits: + memlock: -1 + stack: 67108864 + volumes: + - /tmp/.X11-unix:/tmp/.X11-unix:ro + environment: + - DISPLAY=$DISPLAY + - NVIDIA_VISIBLE_DEVICES=all diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/.gitignore b/preprocess/humanparsing/mhp_extension/detectron2/docs/.gitignore new file mode 100644 index 0000000..e35d885 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/.gitignore @@ -0,0 +1 @@ +_build diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/Makefile b/preprocess/humanparsing/mhp_extension/detectron2/docs/Makefile new file mode 100644 index 0000000..d537643 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/README.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/README.md new file mode 100644 index 0000000..2c65c36 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/README.md @@ -0,0 +1,16 @@ +# Read the docs: + +The latest documentation built from this directory is available at [detectron2.readthedocs.io](https://detectron2.readthedocs.io/). +Documents in this directory are not meant to be read on github. + +# Build the docs: + +1. Install detectron2 according to [INSTALL.md](INSTALL.md). +2. Install additional libraries required to build docs: + - docutils==0.16 + - Sphinx==3.0.0 + - recommonmark==0.6.0 + - sphinx_rtd_theme + - mock + +3. Run `make html` from this directory. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/conf.py b/preprocess/humanparsing/mhp_extension/detectron2/docs/conf.py new file mode 100644 index 0000000..44e9f2b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/conf.py @@ -0,0 +1,335 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +# flake8: noqa + +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +import mock +from sphinx.domains import Domain +from typing import Dict, List, Tuple + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +import sphinx_rtd_theme + + +class GithubURLDomain(Domain): + """ + Resolve certain links in markdown files to github source. + """ + + name = "githuburl" + ROOT = "https://github.com/facebookresearch/detectron2/blob/master/" + LINKED_DOC = ["tutorials/install", "tutorials/getting_started"] + + def resolve_any_xref(self, env, fromdocname, builder, target, node, contnode): + github_url = None + if not target.endswith("html") and target.startswith("../../"): + url = target.replace("../", "") + github_url = url + if fromdocname in self.LINKED_DOC: + # unresolved links in these docs are all github links + github_url = target + + if github_url is not None: + if github_url.endswith("MODEL_ZOO") or github_url.endswith("README"): + # bug of recommonmark. + # https://github.com/readthedocs/recommonmark/blob/ddd56e7717e9745f11300059e4268e204138a6b1/recommonmark/parser.py#L152-L155 + github_url += ".md" + print("Ref {} resolved to github:{}".format(target, github_url)) + contnode["refuri"] = self.ROOT + github_url + return [("githuburl:any", contnode)] + else: + return [] + + +# to support markdown +from recommonmark.parser import CommonMarkParser + +sys.path.insert(0, os.path.abspath("../")) +os.environ["DOC_BUILDING"] = "True" +DEPLOY = os.environ.get("READTHEDOCS") == "True" + + +# -- Project information ----------------------------------------------------- + +# fmt: off +try: + import torch # noqa +except ImportError: + for m in [ + "torch", "torchvision", "torch.nn", "torch.nn.parallel", "torch.distributed", "torch.multiprocessing", "torch.autograd", + "torch.autograd.function", "torch.nn.modules", "torch.nn.modules.utils", "torch.utils", "torch.utils.data", "torch.onnx", + "torchvision", "torchvision.ops", + ]: + sys.modules[m] = mock.Mock(name=m) + sys.modules['torch'].__version__ = "1.5" # fake version + +for m in [ + "cv2", "scipy", "portalocker", "detectron2._C", + "pycocotools", "pycocotools.mask", "pycocotools.coco", "pycocotools.cocoeval", + "google", "google.protobuf", "google.protobuf.internal", "onnx", + "caffe2", "caffe2.proto", "caffe2.python", "caffe2.python.utils", "caffe2.python.onnx", "caffe2.python.onnx.backend", +]: + sys.modules[m] = mock.Mock(name=m) +# fmt: on +sys.modules["cv2"].__version__ = "3.4" + +import detectron2 # isort: skip + + +project = "detectron2" +copyright = "2019-2020, detectron2 contributors" +author = "detectron2 contributors" + +# The short X.Y version +version = detectron2.__version__ +# The full version, including alpha/beta/rc tags +release = version + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +needs_sphinx = "3.0" + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "recommonmark", + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.coverage", + "sphinx.ext.mathjax", + "sphinx.ext.viewcode", + "sphinx.ext.githubpages", +] + +# -- Configurations for plugins ------------ +napoleon_google_docstring = True +napoleon_include_init_with_doc = True +napoleon_include_special_with_doc = True +napoleon_numpy_docstring = False +napoleon_use_rtype = False +autodoc_inherit_docstrings = False +autodoc_member_order = "bysource" + +if DEPLOY: + intersphinx_timeout = 10 +else: + # skip this when building locally + intersphinx_timeout = 0.1 +intersphinx_mapping = { + "python": ("https://docs.python.org/3.6", None), + "numpy": ("https://docs.scipy.org/doc/numpy/", None), + "torch": ("https://pytorch.org/docs/master/", None), +} +# ------------------------- + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +source_suffix = [".rst", ".md"] + +# The master toctree document. +master_doc = "index" + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "build", "README.md", "tutorials/README.md"] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "sphinx" + + +# -- Options for HTML output ------------------------------------------------- + +html_theme = "sphinx_rtd_theme" +html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = "detectron2doc" + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, "detectron2.tex", "detectron2 Documentation", "detectron2 contributors", "manual") +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, "detectron2", "detectron2 Documentation", [author], 1)] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ( + master_doc, + "detectron2", + "detectron2 Documentation", + author, + "detectron2", + "One line description of project.", + "Miscellaneous", + ) +] + + +# -- Options for todo extension ---------------------------------------------- + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +_DEPRECATED_NAMES = set() + + +def autodoc_skip_member(app, what, name, obj, skip, options): + # we hide something deliberately + if getattr(obj, "__HIDE_SPHINX_DOC__", False): + return True + # Hide some names that are deprecated or not intended to be used + if name in _DEPRECATED_NAMES: + return True + return None + + +_PAPER_DATA = { + "resnet": ("1512.03385", "Deep Residual Learning for Image Recognition"), + "fpn": ("1612.03144", "Feature Pyramid Networks for Object Detection"), + "mask r-cnn": ("1703.06870", "Mask R-CNN"), + "faster r-cnn": ( + "1506.01497", + "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks", + ), + "deformconv": ("1703.06211", "Deformable Convolutional Networks"), + "deformconv2": ("1811.11168", "Deformable ConvNets v2: More Deformable, Better Results"), + "panopticfpn": ("1901.02446", "Panoptic Feature Pyramid Networks"), + "retinanet": ("1708.02002", "Focal Loss for Dense Object Detection"), + "cascade r-cnn": ("1712.00726", "Cascade R-CNN: Delving into High Quality Object Detection"), + "lvis": ("1908.03195", "LVIS: A Dataset for Large Vocabulary Instance Segmentation"), + "rrpn": ("1703.01086", "Arbitrary-Oriented Scene Text Detection via Rotation Proposals"), + "in1k1h": ("1706.02677", "Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour"), +} + + +def paper_ref_role( + typ: str, + rawtext: str, + text: str, + lineno: int, + inliner, + options: Dict = {}, + content: List[str] = [], +): + """ + Parse :paper:`xxx`. Similar to the "extlinks" sphinx extension. + """ + from docutils import nodes, utils + from sphinx.util.nodes import split_explicit_title + + text = utils.unescape(text) + has_explicit_title, title, link = split_explicit_title(text) + link = link.lower() + if link not in _PAPER_DATA: + inliner.reporter.warning("Cannot find paper " + link) + paper_url, paper_title = "#", link + else: + paper_url, paper_title = _PAPER_DATA[link] + if "/" not in paper_url: + paper_url = "https://arxiv.org/abs/" + paper_url + if not has_explicit_title: + title = paper_title + pnode = nodes.reference(title, title, internal=False, refuri=paper_url) + return [pnode], [] + + +def setup(app): + from recommonmark.transform import AutoStructify + + app.add_domain(GithubURLDomain) + app.connect("autodoc-skip-member", autodoc_skip_member) + app.add_role("paper", paper_ref_role) + app.add_config_value( + "recommonmark_config", + {"enable_math": True, "enable_inline_math": True, "enable_eval_rst": True}, + True, + ) + app.add_transform(AutoStructify) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/index.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/index.rst new file mode 100644 index 0000000..8634b7b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/index.rst @@ -0,0 +1,14 @@ +.. detectron2 documentation master file, created by + sphinx-quickstart on Sat Sep 21 13:46:45 2019. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to detectron2's documentation! +====================================== + +.. toctree:: + :maxdepth: 2 + + tutorials/index + notes/index + modules/index diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/checkpoint.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/checkpoint.rst new file mode 100644 index 0000000..616cb18 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/checkpoint.rst @@ -0,0 +1,7 @@ +detectron2.checkpoint package +============================= + +.. automodule:: detectron2.checkpoint + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/config.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/config.rst new file mode 100644 index 0000000..034bd5f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/config.rst @@ -0,0 +1,17 @@ +detectron2.config package +========================= + +.. automodule:: detectron2.config + :members: + :undoc-members: + :show-inheritance: + :inherited-members: + + +Config References +----------------- + +.. literalinclude:: ../../detectron2/config/defaults.py + :language: python + :linenos: + :lines: 4- diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/data.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/data.rst new file mode 100644 index 0000000..3697f0e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/data.rst @@ -0,0 +1,40 @@ +detectron2.data package +======================= + +.. automodule:: detectron2.data + :members: + :undoc-members: + :show-inheritance: + +detectron2.data.detection\_utils module +--------------------------------------- + +.. automodule:: detectron2.data.detection_utils + :members: + :undoc-members: + :show-inheritance: + +detectron2.data.datasets module +--------------------------------------- + +.. automodule:: detectron2.data.datasets + :members: + :undoc-members: + :show-inheritance: + +detectron2.data.samplers module +--------------------------------------- + +.. automodule:: detectron2.data.samplers + :members: + :undoc-members: + :show-inheritance: + + +detectron2.data.transforms module +--------------------------------------- + +.. automodule:: detectron2.data.transforms + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/engine.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/engine.rst new file mode 100644 index 0000000..bb8b533 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/engine.rst @@ -0,0 +1,25 @@ +detectron2.engine package +========================= + + +.. automodule:: detectron2.engine + :members: + :undoc-members: + :show-inheritance: + + +detectron2.engine.defaults module +--------------------------------- + +.. automodule:: detectron2.engine.defaults + :members: + :undoc-members: + :show-inheritance: + +detectron2.engine.hooks module +--------------------------------- + +.. automodule:: detectron2.engine.hooks + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/evaluation.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/evaluation.rst new file mode 100644 index 0000000..d9d34ff --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/evaluation.rst @@ -0,0 +1,7 @@ +detectron2.evaluation package +============================= + +.. automodule:: detectron2.evaluation + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/export.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/export.rst new file mode 100644 index 0000000..bb7c3c9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/export.rst @@ -0,0 +1,7 @@ +detectron2.export package +========================= + +.. automodule:: detectron2.export + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/index.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/index.rst new file mode 100644 index 0000000..1b246f5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/index.rst @@ -0,0 +1,17 @@ +API Documentation +================== + +.. toctree:: + + checkpoint + config + data + engine + evaluation + layers + model_zoo + modeling + solver + structures + utils + export diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/layers.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/layers.rst new file mode 100644 index 0000000..6aeb521 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/layers.rst @@ -0,0 +1,7 @@ +detectron2.layers package +========================= + +.. automodule:: detectron2.layers + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/model_zoo.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/model_zoo.rst new file mode 100644 index 0000000..8b1c7d5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/model_zoo.rst @@ -0,0 +1,7 @@ +detectron2.model_zoo package +============================ + +.. automodule:: detectron2.model_zoo + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/modeling.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/modeling.rst new file mode 100644 index 0000000..58ccd2c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/modeling.rst @@ -0,0 +1,58 @@ +detectron2.modeling package +=========================== + +.. automodule:: detectron2.modeling + :members: + :undoc-members: + :show-inheritance: + + +detectron2.modeling.poolers module +--------------------------------------- + +.. automodule:: detectron2.modeling.poolers + :members: + :undoc-members: + :show-inheritance: + + +detectron2.modeling.sampling module +------------------------------------ + +.. automodule:: detectron2.modeling.sampling + :members: + :undoc-members: + :show-inheritance: + + +detectron2.modeling.box_regression module +------------------------------------------ + +.. automodule:: detectron2.modeling.box_regression + :members: + :undoc-members: + :show-inheritance: + + +Model Registries +----------------- + +These are different registries provided in modeling. +Each registry provide you the ability to replace it with your customized component, +without having to modify detectron2's code. + +Note that it is impossible to allow users to customize any line of code directly. +Even just to add one line at some place, +you'll likely need to find out the smallest registry which contains that line, +and register your component to that registry. + + +.. autodata:: detectron2.modeling.META_ARCH_REGISTRY +.. autodata:: detectron2.modeling.BACKBONE_REGISTRY +.. autodata:: detectron2.modeling.PROPOSAL_GENERATOR_REGISTRY +.. autodata:: detectron2.modeling.RPN_HEAD_REGISTRY +.. autodata:: detectron2.modeling.ANCHOR_GENERATOR_REGISTRY +.. autodata:: detectron2.modeling.ROI_HEADS_REGISTRY +.. autodata:: detectron2.modeling.ROI_BOX_HEAD_REGISTRY +.. autodata:: detectron2.modeling.ROI_MASK_HEAD_REGISTRY +.. autodata:: detectron2.modeling.ROI_KEYPOINT_HEAD_REGISTRY diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/solver.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/solver.rst new file mode 100644 index 0000000..7f4a49f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/solver.rst @@ -0,0 +1,7 @@ +detectron2.solver package +========================= + +.. automodule:: detectron2.solver + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/structures.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/structures.rst new file mode 100644 index 0000000..5701c61 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/structures.rst @@ -0,0 +1,7 @@ +detectron2.structures package +============================= + +.. automodule:: detectron2.structures + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/utils.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/utils.rst new file mode 100644 index 0000000..8b57292 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/modules/utils.rst @@ -0,0 +1,80 @@ +detectron2.utils package +======================== + +detectron2.utils.colormap module +-------------------------------- + +.. automodule:: detectron2.utils.colormap + :members: + :undoc-members: + :show-inheritance: + +detectron2.utils.comm module +---------------------------- + +.. automodule:: detectron2.utils.comm + :members: + :undoc-members: + :show-inheritance: + + +detectron2.utils.events module +------------------------------ + +.. automodule:: detectron2.utils.events + :members: + :undoc-members: + :show-inheritance: + + +detectron2.utils.logger module +------------------------------ + +.. automodule:: detectron2.utils.logger + :members: + :undoc-members: + :show-inheritance: + + +detectron2.utils.registry module +-------------------------------- + +.. automodule:: detectron2.utils.registry + :members: + :undoc-members: + :show-inheritance: + +detectron2.utils.memory module +---------------------------------- + +.. automodule:: detectron2.utils.memory + :members: + :undoc-members: + :show-inheritance: + + +detectron2.utils.analysis module +---------------------------------- + +.. automodule:: detectron2.utils.analysis + :members: + :undoc-members: + :show-inheritance: + + +detectron2.utils.visualizer module +---------------------------------- + +.. automodule:: detectron2.utils.visualizer + :members: + :undoc-members: + :show-inheritance: + +detectron2.utils.video\_visualizer module +----------------------------------------- + +.. automodule:: detectron2.utils.video_visualizer + :members: + :undoc-members: + :show-inheritance: + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/benchmarks.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/benchmarks.md new file mode 100644 index 0000000..963f921 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/benchmarks.md @@ -0,0 +1,196 @@ + +# Benchmarks + +Here we benchmark the training speed of a Mask R-CNN in detectron2, +with some other popular open source Mask R-CNN implementations. + + +### Settings + +* Hardware: 8 NVIDIA V100s with NVLink. +* Software: Python 3.7, CUDA 10.1, cuDNN 7.6.5, PyTorch 1.5, + TensorFlow 1.15.0rc2, Keras 2.2.5, MxNet 1.6.0b20190820. +* Model: an end-to-end R-50-FPN Mask-RCNN model, using the same hyperparameter as the + [Detectron baseline config](https://github.com/facebookresearch/Detectron/blob/master/configs/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml) + (it does no have scale augmentation). +* Metrics: We use the average throughput in iterations 100-500 to skip GPU warmup time. + Note that for R-CNN-style models, the throughput of a model typically changes during training, because + it depends on the predictions of the model. Therefore this metric is not directly comparable with + "train speed" in model zoo, which is the average speed of the entire training run. + + +### Main Results + +```eval_rst ++-------------------------------+--------------------+ +| Implementation | Throughput (img/s) | ++===============================+====================+ +| |D2| |PT| | 62 | ++-------------------------------+--------------------+ +| mmdetection_ |PT| | 53 | ++-------------------------------+--------------------+ +| maskrcnn-benchmark_ |PT| | 53 | ++-------------------------------+--------------------+ +| tensorpack_ |TF| | 50 | ++-------------------------------+--------------------+ +| simpledet_ |mxnet| | 39 | ++-------------------------------+--------------------+ +| Detectron_ |C2| | 19 | ++-------------------------------+--------------------+ +| `matterport/Mask_RCNN`__ |TF| | 14 | ++-------------------------------+--------------------+ + +.. _maskrcnn-benchmark: https://github.com/facebookresearch/maskrcnn-benchmark/ +.. _tensorpack: https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN +.. _mmdetection: https://github.com/open-mmlab/mmdetection/ +.. _simpledet: https://github.com/TuSimple/simpledet/ +.. _Detectron: https://github.com/facebookresearch/Detectron +__ https://github.com/matterport/Mask_RCNN/ + +.. |D2| image:: https://github.com/facebookresearch/detectron2/raw/master/.github/Detectron2-Logo-Horz.svg?sanitize=true + :height: 15pt + :target: https://github.com/facebookresearch/detectron2/ +.. |PT| image:: https://pytorch.org/assets/images/logo-icon.svg + :width: 15pt + :height: 15pt + :target: https://pytorch.org +.. |TF| image:: https://static.nvidiagrid.net/ngc/containers/tensorflow.png + :width: 15pt + :height: 15pt + :target: https://tensorflow.org +.. |mxnet| image:: https://github.com/dmlc/web-data/raw/master/mxnet/image/mxnet_favicon.png + :width: 15pt + :height: 15pt + :target: https://mxnet.apache.org/ +.. |C2| image:: https://caffe2.ai/static/logo.svg + :width: 15pt + :height: 15pt + :target: https://caffe2.ai +``` + + +Details for each implementation: + +* __Detectron2__: with release v0.1.2, run: + ``` + python tools/train_net.py --config-file configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml --num-gpus 8 + ``` + +* __mmdetection__: at commit `b0d845f`, run + ``` + ./tools/dist_train.sh configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py 8 + ``` + +* __maskrcnn-benchmark__: use commit `0ce8f6f` with `sed -i ‘s/torch.uint8/torch.bool/g’ **/*.py; sed -i 's/AT_CHECK/TORCH_CHECK/g' **/*.cu` + to make it compatible with PyTorch 1.5. Then, run training with + ``` + python -m torch.distributed.launch --nproc_per_node=8 tools/train_net.py --config-file configs/e2e_mask_rcnn_R_50_FPN_1x.yaml + ``` + The speed we observed is faster than its model zoo, likely due to different software versions. + +* __tensorpack__: at commit `caafda`, `export TF_CUDNN_USE_AUTOTUNE=0`, then run + ``` + mpirun -np 8 ./train.py --config DATA.BASEDIR=/data/coco TRAINER=horovod BACKBONE.STRIDE_1X1=True TRAIN.STEPS_PER_EPOCH=50 --load ImageNet-R50-AlignPadding.npz + ``` + +* __SimpleDet__: at commit `9187a1`, run + ``` + python detection_train.py --config config/mask_r50v1_fpn_1x.py + ``` + +* __Detectron__: run + ``` + python tools/train_net.py --cfg configs/12_2017_baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml + ``` + Note that many of its ops run on CPUs, therefore the performance is limited. + +* __matterport/Mask_RCNN__: at commit `3deaec`, apply the following diff, `export TF_CUDNN_USE_AUTOTUNE=0`, then run + ``` + python coco.py train --dataset=/data/coco/ --model=imagenet + ``` + Note that many small details in this implementation might be different + from Detectron's standards. + +
    + + (diff to make it use the same hyperparameters - click to expand) + + + ```diff + diff --git i/mrcnn/model.py w/mrcnn/model.py + index 62cb2b0..61d7779 100644 + --- i/mrcnn/model.py + +++ w/mrcnn/model.py + @@ -2367,8 +2367,8 @@ class MaskRCNN(): + epochs=epochs, + steps_per_epoch=self.config.STEPS_PER_EPOCH, + callbacks=callbacks, + - validation_data=val_generator, + - validation_steps=self.config.VALIDATION_STEPS, + + #validation_data=val_generator, + + #validation_steps=self.config.VALIDATION_STEPS, + max_queue_size=100, + workers=workers, + use_multiprocessing=True, + diff --git i/mrcnn/parallel_model.py w/mrcnn/parallel_model.py + index d2bf53b..060172a 100644 + --- i/mrcnn/parallel_model.py + +++ w/mrcnn/parallel_model.py + @@ -32,6 +32,7 @@ class ParallelModel(KM.Model): + keras_model: The Keras model to parallelize + gpu_count: Number of GPUs. Must be > 1 + """ + + super().__init__() + self.inner_model = keras_model + self.gpu_count = gpu_count + merged_outputs = self.make_parallel() + diff --git i/samples/coco/coco.py w/samples/coco/coco.py + index 5d172b5..239ed75 100644 + --- i/samples/coco/coco.py + +++ w/samples/coco/coco.py + @@ -81,7 +81,10 @@ class CocoConfig(Config): + IMAGES_PER_GPU = 2 + + # Uncomment to train on 8 GPUs (default is 1) + - # GPU_COUNT = 8 + + GPU_COUNT = 8 + + BACKBONE = "resnet50" + + STEPS_PER_EPOCH = 50 + + TRAIN_ROIS_PER_IMAGE = 512 + + # Number of classes (including background) + NUM_CLASSES = 1 + 80 # COCO has 80 classes + @@ -496,29 +499,10 @@ if __name__ == '__main__': + # *** This training schedule is an example. Update to your needs *** + + # Training - Stage 1 + - print("Training network heads") + model.train(dataset_train, dataset_val, + learning_rate=config.LEARNING_RATE, + epochs=40, + - layers='heads', + - augmentation=augmentation) + - + - # Training - Stage 2 + - # Finetune layers from ResNet stage 4 and up + - print("Fine tune Resnet stage 4 and up") + - model.train(dataset_train, dataset_val, + - learning_rate=config.LEARNING_RATE, + - epochs=120, + - layers='4+', + - augmentation=augmentation) + - + - # Training - Stage 3 + - # Fine tune all layers + - print("Fine tune all layers") + - model.train(dataset_train, dataset_val, + - learning_rate=config.LEARNING_RATE / 10, + - epochs=160, + - layers='all', + + layers='3+', + augmentation=augmentation) + + elif args.command == "evaluate": + ``` + +
    diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/changelog.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/changelog.md new file mode 100644 index 0000000..c0d4f59 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/changelog.md @@ -0,0 +1,26 @@ +# Change Log + +### Releases +See release log at +[https://github.com/facebookresearch/detectron2/releases](https://github.com/facebookresearch/detectron2/releases). + +### Notable Backward Incompatible Changes: + +* 03/30/2020: Custom box head's `output_size` changed to `output_shape`. +* 02/14/2020,02/18/2020: Mask head and keypoint head now include logic for losses & inference. Custom heads + should overwrite the feature computation by `layers()` method. +* 11/11/2019: `detectron2.data.detection_utils.read_image` transposes images with exif information. + +### Config Version Change Log + +* v1: Rename `RPN_HEAD.NAME` to `RPN.HEAD_NAME`. +* v2: A batch of rename of many configurations before release. + +### Silent Regression in Historical Versions: + +We list a few silent regressions since they may silently produce incorrect results and will be hard to debug. + +* 04/01/2020 - 05/11/2020: Bad accuracy if `TRAIN_ON_PRED_BOXES` is set to True. +* 03/30/2020 - 04/01/2020: ResNets are not correctly built. +* 12/19/2019 - 12/26/2019: Using aspect ratio grouping causes a drop in accuracy. +* release - 11/9/2019: Test time augmentation does not predict the last category. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/compatibility.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/compatibility.md new file mode 100644 index 0000000..f7b66c2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/compatibility.md @@ -0,0 +1,83 @@ +# Compatibility with Other Libraries + +## Compatibility with Detectron (and maskrcnn-benchmark) + +Detectron2 addresses some legacy issues left in Detectron. As a result, their models +are not compatible: +running inference with the same model weights will produce different results in the two code bases. + +The major differences regarding inference are: + +- The height and width of a box with corners (x1, y1) and (x2, y2) is now computed more naturally as + width = x2 - x1 and height = y2 - y1; + In Detectron, a "+ 1" was added both height and width. + + Note that the relevant ops in Caffe2 have [adopted this change of convention](https://github.com/pytorch/pytorch/pull/20550) + with an extra option. + So it is still possible to run inference with a Detectron2-trained model in Caffe2. + + The change in height/width calculations most notably changes: + - encoding/decoding in bounding box regression. + - non-maximum suppression. The effect here is very negligible, though. + +- RPN now uses simpler anchors with fewer quantization artifacts. + + In Detectron, the anchors were quantized and + [do not have accurate areas](https://github.com/facebookresearch/Detectron/issues/227). + In Detectron2, the anchors are center-aligned to feature grid points and not quantized. + +- Classification layers have a different ordering of class labels. + + This involves any trainable parameter with shape (..., num_categories + 1, ...). + In Detectron2, integer labels [0, K-1] correspond to the K = num_categories object categories + and the label "K" corresponds to the special "background" category. + In Detectron, label "0" means background, and labels [1, K] correspond to the K categories. + +- ROIAlign is implemented differently. The new implementation is [available in Caffe2](https://github.com/pytorch/pytorch/pull/23706). + + 1. All the ROIs are shifted by half a pixel compared to Detectron in order to create better image-feature-map alignment. + See `layers/roi_align.py` for details. + To enable the old behavior, use `ROIAlign(aligned=False)`, or `POOLER_TYPE=ROIAlign` instead of + `ROIAlignV2` (the default). + + 1. The ROIs are not required to have a minimum size of 1. + This will lead to tiny differences in the output, but should be negligible. + +- Mask inference function is different. + + In Detectron2, the "paste_mask" function is different and should be more accurate than in Detectron. This change + can improve mask AP on COCO by ~0.5% absolute. + +There are some other differences in training as well, but they won't affect +model-level compatibility. The major ones are: + +- We fixed a [bug](https://github.com/facebookresearch/Detectron/issues/459) in + Detectron, by making `RPN.POST_NMS_TOPK_TRAIN` per-image, rather than per-batch. + The fix may lead to a small accuracy drop for a few models (e.g. keypoint + detection) and will require some parameter tuning to match the Detectron results. +- For simplicity, we change the default loss in bounding box regression to L1 loss, instead of smooth L1 loss. + We have observed that this tends to slightly decrease box AP50 while improving box AP for higher + overlap thresholds (and leading to a slight overall improvement in box AP). +- We interpret the coordinates in COCO bounding box and segmentation annotations + as coordinates in range `[0, width]` or `[0, height]`. The coordinates in + COCO keypoint annotations are interpreted as pixel indices in range `[0, width - 1]` or `[0, height - 1]`. + Note that this affects how flip augmentation is implemented. + + +We will later share more details and rationale behind the above mentioned issues +about pixels, coordinates, and "+1"s. + + +## Compatibility with Caffe2 + +As mentioned above, despite the incompatibilities with Detectron, the relevant +ops have been implemented in Caffe2. +Therefore, models trained with detectron2 can be converted in Caffe2. +See [Deployment](../tutorials/deployment.md) for the tutorial. + +## Compatibility with TensorFlow + +Most ops are available in TensorFlow, although some tiny differences in +the implementation of resize / ROIAlign / padding need to be addressed. +A working conversion script is provided by [tensorpack FasterRCNN](https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN/convert_d2) +to run a standard detectron2 model in TensorFlow. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/contributing.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/contributing.md new file mode 100644 index 0000000..81936df --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/contributing.md @@ -0,0 +1,49 @@ +# Contributing to detectron2 + +## Issues +We use GitHub issues to track public bugs and questions. +Please make sure to follow one of the +[issue templates](https://github.com/facebookresearch/detectron2/issues/new/choose) +when reporting any issues. + +Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe +disclosure of security bugs. In those cases, please go through the process +outlined on that page and do not file a public issue. + +## Pull Requests +We actively welcome your pull requests. + +However, if you're adding any significant features (e.g. > 50 lines), please +make sure to have a corresponding issue to discuss your motivation and proposals, +before sending a PR. We do not always accept new features, and we take the following +factors into consideration: + +1. Whether the same feature can be achieved without modifying detectron2. +Detectron2 is designed so that you can implement many extensions from the outside, e.g. +those in [projects](https://github.com/facebookresearch/detectron2/tree/master/projects). +If some part is not as extensible, you can also bring up the issue to make it more extensible. +2. Whether the feature is potentially useful to a large audience, or only to a small portion of users. +3. Whether the proposed solution has a good design / interface. +4. Whether the proposed solution adds extra mental/practical overhead to users who don't + need such feature. +5. Whether the proposed solution breaks existing APIs. + +When sending a PR, please do: + +1. If a PR contains multiple orthogonal changes, split it to several PRs. +2. If you've added code that should be tested, add tests. +3. For PRs that need experiments (e.g. adding a new model or new methods), + you don't need to update model zoo, but do provide experiment results in the description of the PR. +4. If APIs are changed, update the documentation. +5. Make sure your code lints with `./dev/linter.sh`. + + +## Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Facebook's open source projects. + +Complete your CLA here: + +## License +By contributing to detectron2, you agree that your contributions will be licensed +under the LICENSE file in the root directory of this source tree. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/index.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/index.rst new file mode 100644 index 0000000..63cf907 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/notes/index.rst @@ -0,0 +1,10 @@ +Notes +====================================== + +.. toctree:: + :maxdepth: 2 + + benchmarks + compatibility + contributing + changelog diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/README.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/README.md new file mode 100644 index 0000000..1ca9c94 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/README.md @@ -0,0 +1,4 @@ +# Read the docs: + +The latest documentation built from this directory is available at [detectron2.readthedocs.io](https://detectron2.readthedocs.io/). +Documents in this directory are not meant to be read on github. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/builtin_datasets.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/builtin_datasets.md new file mode 100644 index 0000000..1a2633f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/builtin_datasets.md @@ -0,0 +1,99 @@ +# Setup Builtin Datasets + +Detectron2 has builtin support for a few datasets. +The datasets are assumed to exist in a directory specified by the environment variable +`DETECTRON2_DATASETS`. +Under this directory, detectron2 expects to find datasets in the structure described below. + +You can set the location for builtin datasets by `export DETECTRON2_DATASETS=/path/to/datasets`. +If left unset, the default is `./datasets` relative to your current working directory. + +The [model zoo](https://github.com/facebookresearch/detectron2/blob/master/MODEL_ZOO.md) +contains configs and models that use these builtin datasets. + +## Expected dataset structure for COCO instance/keypoint detection: + +``` +coco/ + annotations/ + instances_{train,val}2017.json + person_keypoints_{train,val}2017.json + {train,val}2017/ + # image files that are mentioned in the corresponding json +``` + +You can use the 2014 version of the dataset as well. + +Some of the builtin tests (`dev/run_*_tests.sh`) uses a tiny version of the COCO dataset, +which you can download with `./prepare_for_tests.sh`. + +## Expected dataset structure for PanopticFPN: + +``` +coco/ + annotations/ + panoptic_{train,val}2017.json + panoptic_{train,val}2017/ # png annotations + panoptic_stuff_{train,val}2017/ # generated by the script mentioned below +``` + +Install panopticapi by: +``` +pip install git+https://github.com/cocodataset/panopticapi.git +``` +Then, run `python prepare_panoptic_fpn.py`, to extract semantic annotations from panoptic annotations. + +## Expected dataset structure for LVIS instance segmentation: +``` +coco/ + {train,val,test}2017/ +lvis/ + lvis_v0.5_{train,val}.json + lvis_v0.5_image_info_test.json +``` + +Install lvis-api by: +``` +pip install git+https://github.com/lvis-dataset/lvis-api.git +``` + +Run `python prepare_cocofied_lvis.py` to prepare "cocofied" LVIS annotations for evaluation of models trained on the COCO dataset. + +## Expected dataset structure for cityscapes: +``` +cityscapes/ + gtFine/ + train/ + aachen/ + color.png, instanceIds.png, labelIds.png, polygons.json, + labelTrainIds.png + ... + val/ + test/ + leftImg8bit/ + train/ + val/ + test/ +``` +Install cityscapes scripts by: +``` +pip install git+https://github.com/mcordts/cityscapesScripts.git +``` + +Note: labelTrainIds.png are created using cityscapesescript with: +``` +CITYSCAPES_DATASET=$DETECTRON2_DATASETS/cityscapes python cityscapesscripts/preparation/createTrainIdLabelImgs.py +``` +They are not needed for instance segmentation. + +## Expected dataset structure for Pascal VOC: +``` +VOC20{07,12}/ + Annotations/ + ImageSets/ + Main/ + trainval.txt + test.txt + # train.txt or val.txt, if you use these splits + JPEGImages/ +``` diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/configs.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/configs.md new file mode 100644 index 0000000..ea82583 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/configs.md @@ -0,0 +1,58 @@ +# Configs + +Detectron2 provides a key-value based config system that can be +used to obtain standard, common behaviors. + +Detectron2's config system uses YAML and [yacs](https://github.com/rbgirshick/yacs). +In addition to the [basic operations](../modules/config.html#detectron2.config.CfgNode) +that access and update a config, we provide the following extra functionalities: + +1. The config can have `_BASE_: base.yaml` field, which will load a base config first. + Values in the base config will be overwritten in sub-configs, if there are any conflicts. + We provided several base configs for standard model architectures. +2. We provide config versioning, for backward compatibility. + If your config file is versioned with a config line like `VERSION: 2`, + detectron2 will still recognize it even if we change some keys in the future. + +"Config" is a very limited abstraction. +We do not expect all features in detectron2 to be available through configs. +If you need something that's not available in the config space, +please write code using detectron2's API. + +### Basic Usage + +Some basic usage of the `CfgNode` object is shown here. See more in [documentation](../modules/config.html#detectron2.config.CfgNode). +```python +from detectron2.config import get_cfg +cfg = get_cfg() # obtain detectron2's default config +cfg.xxx = yyy # add new configs for your own custom components +cfg.merge_from_file("my_cfg.yaml") # load values from a file + +cfg.merge_from_list(["MODEL.WEIGHTS", "weights.pth"]) # can also load values from a list of str +print(cfg.dump()) # print formatted configs +``` + +Many builtin tools in detectron2 accepts command line config overwrite: +Key-value pairs provided in the command line will overwrite the existing values in the config file. +For example, [demo.py](../../demo/demo.py) can be used with +``` +./demo.py --config-file config.yaml [--other-options] \ + --opts MODEL.WEIGHTS /path/to/weights INPUT.MIN_SIZE_TEST 1000 +``` + +To see a list of available configs in detectron2 and what they mean, +check [Config References](../modules/config.html#config-references) + + +### Best Practice with Configs + +1. Treat the configs you write as "code": avoid copying them or duplicating them; use `_BASE_` + to share common parts between configs. + +2. Keep the configs you write simple: don't include keys that do not affect the experimental setting. + +3. Keep a version number in your configs (or the base config), e.g., `VERSION: 2`, + for backward compatibility. + We print a warning when reading a config without version number. + The official configs do not include version number because they are meant to + be always up-to-date. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/data_loading.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/data_loading.md new file mode 100644 index 0000000..bb037ca --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/data_loading.md @@ -0,0 +1,77 @@ + +# Use Custom Dataloaders + +## How the Existing Dataloader Works + +Detectron2 contains a builtin data loading pipeline. +It's good to understand how it works, in case you need to write a custom one. + +Detectron2 provides two functions +[build_detection_{train,test}_loader](../modules/data.html#detectron2.data.build_detection_train_loader) +that create a default data loader from a given config. +Here is how `build_detection_{train,test}_loader` work: + +1. It takes the name of a registered dataset (e.g., "coco_2017_train") and loads a `list[dict]` representing the dataset items + in a lightweight, canonical format. These dataset items are not yet ready to be used by the model (e.g., images are + not loaded into memory, random augmentations have not been applied, etc.). + Details about the dataset format and dataset registration can be found in + [datasets](./datasets.md). +2. Each dict in this list is mapped by a function ("mapper"): + * Users can customize this mapping function by specifying the "mapper" argument in + `build_detection_{train,test}_loader`. The default mapper is [DatasetMapper](../modules/data.html#detectron2.data.DatasetMapper). + * The output format of such function can be arbitrary, as long as it is accepted by the consumer of this data loader (usually the model). + The outputs of the default mapper, after batching, follow the default model input format documented in + [Use Models](./models.html#model-input-format). + * The role of the mapper is to transform the lightweight, canonical representation of a dataset item into a format + that is ready for the model to consume (including, e.g., read images, perform random data augmentation and convert to torch Tensors). + If you would like to perform custom transformations to data, you often want a custom mapper. +3. The outputs of the mapper are batched (simply into a list). +4. This batched data is the output of the data loader. Typically, it's also the input of + `model.forward()`. + + +## Write a Custom Dataloader + +Using a different "mapper" with `build_detection_{train,test}_loader(mapper=)` works for most use cases +of custom data loading. +For example, if you want to resize all images to a fixed size for Mask R-CNN training, write this: + +```python +from detectron2.data import build_detection_train_loader +from detectron2.data import transforms as T +from detectron2.data import detection_utils as utils + +def mapper(dataset_dict): + # Implement a mapper, similar to the default DatasetMapper, but with your own customizations + dataset_dict = copy.deepcopy(dataset_dict) # it will be modified by code below + image = utils.read_image(dataset_dict["file_name"], format="BGR") + image, transforms = T.apply_transform_gens([T.Resize((800, 800))], image) + dataset_dict["image"] = torch.as_tensor(image.transpose(2, 0, 1).astype("float32")) + + annos = [ + utils.transform_instance_annotations(obj, transforms, image.shape[:2]) + for obj in dataset_dict.pop("annotations") + if obj.get("iscrowd", 0) == 0 + ] + instances = utils.annotations_to_instances(annos, image.shape[:2]) + dataset_dict["instances"] = utils.filter_empty_instances(instances) + return dataset_dict + +data_loader = build_detection_train_loader(cfg, mapper=mapper) +# use this dataloader instead of the default +``` +Refer to [API documentation of detectron2.data](../modules/data) for details. + +If you want to change not only the mapper (e.g., to write different sampling or batching logic), +you can write your own data loader. The data loader is simply a +python iterator that produces [the format](./models.md) your model accepts. +You can implement it using any tools you like. + +## Use a Custom Dataloader + +If you use [DefaultTrainer](../modules/engine.html#detectron2.engine.defaults.DefaultTrainer), +you can overwrite its `build_{train,test}_loader` method to use your own dataloader. +See the [densepose dataloader](../../projects/DensePose/train_net.py) +for an example. + +If you write your own training loop, you can plug in your data loader easily. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/datasets.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/datasets.md new file mode 100644 index 0000000..8dc1c0c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/datasets.md @@ -0,0 +1,221 @@ +# Use Custom Datasets + +Datasets that have builtin support in detectron2 are listed in [datasets](../../datasets). +If you want to use a custom dataset while also reusing detectron2's data loaders, +you will need to + +1. __Register__ your dataset (i.e., tell detectron2 how to obtain your dataset). +2. Optionally, __register metadata__ for your dataset. + +Next, we explain the above two concepts in detail. + +The [Colab tutorial](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5) +has a live example of how to register and train on a dataset of custom formats. + +### Register a Dataset + +To let detectron2 know how to obtain a dataset named "my_dataset", you will implement +a function that returns the items in your dataset and then tell detectron2 about this +function: +```python +def my_dataset_function(): + ... + return list[dict] in the following format + +from detectron2.data import DatasetCatalog +DatasetCatalog.register("my_dataset", my_dataset_function) +``` + +Here, the snippet associates a dataset "my_dataset" with a function that returns the data. +The registration stays effective until the process exists. + +The function can processes data from its original format into either one of the following: +1. Detectron2's standard dataset dict, described below. This will work with many other builtin + features in detectron2, so it's recommended to use it when it's sufficient for your task. +2. Your custom dataset dict. You can also return arbitrary dicts in your own format, + such as adding extra keys for new tasks. + Then you will need to handle them properly downstream as well. + See below for more details. + +#### Standard Dataset Dicts + +For standard tasks +(instance detection, instance/semantic/panoptic segmentation, keypoint detection), +we load the original dataset into `list[dict]` with a specification similar to COCO's json annotations. +This is our standard representation for a dataset. + +Each dict contains information about one image. +The dict may have the following fields, +and the required fields vary based on what the dataloader or the task needs (see more below). + ++ `file_name`: the full path to the image file. Will apply rotation and flipping if the image has such exif information. ++ `height`, `width`: integer. The shape of image. ++ `image_id` (str or int): a unique id that identifies this image. Used + during evaluation to identify the images, but a dataset may use it for different purposes. ++ `annotations` (list[dict]): each dict corresponds to annotations of one instance + in this image. Required by instance detection/segmentation or keypoint detection tasks. + + Images with empty `annotations` will by default be removed from training, + but can be included using `DATALOADER.FILTER_EMPTY_ANNOTATIONS`. + + Each dict contains the following keys, of which `bbox`,`bbox_mode` and `category_id` are required: + + `bbox` (list[float]): list of 4 numbers representing the bounding box of the instance. + + `bbox_mode` (int): the format of bbox. + It must be a member of + [structures.BoxMode](../modules/structures.html#detectron2.structures.BoxMode). + Currently supports: `BoxMode.XYXY_ABS`, `BoxMode.XYWH_ABS`. + + `category_id` (int): an integer in the range [0, num_categories) representing the category label. + The value num_categories is reserved to represent the "background" category, if applicable. + + `segmentation` (list[list[float]] or dict): the segmentation mask of the instance. + + If `list[list[float]]`, it represents a list of polygons, one for each connected component + of the object. Each `list[float]` is one simple polygon in the format of `[x1, y1, ..., xn, yn]`. + The Xs and Ys are either relative coordinates in [0, 1], or absolute coordinates, + depend on whether "bbox_mode" is relative. + + If `dict`, it represents the per-pixel segmentation mask in COCO's RLE format. The dict should have + keys "size" and "counts". You can convert a uint8 segmentation mask of 0s and 1s into + RLE format by `pycocotools.mask.encode(np.asarray(mask, order="F"))`. + + `keypoints` (list[float]): in the format of [x1, y1, v1,..., xn, yn, vn]. + v[i] means the [visibility](http://cocodataset.org/#format-data) of this keypoint. + `n` must be equal to the number of keypoint categories. + The Xs and Ys are either relative coordinates in [0, 1], or absolute coordinates, + depend on whether "bbox_mode" is relative. + + Note that the coordinate annotations in COCO format are integers in range [0, H-1 or W-1]. + By default, detectron2 adds 0.5 to absolute keypoint coordinates to convert them from discrete + pixel indices to floating point coordinates. + + `iscrowd`: 0 (default) or 1. Whether this instance is labeled as COCO's "crowd + region". Don't include this field if you don't know what it means. ++ `sem_seg_file_name`: the full path to the ground truth semantic segmentation file. + Required by semantic segmentation task. + It should be an image whose pixel values are integer labels. + + +Fast R-CNN (with precomputed proposals) is rarely used today. +To train a Fast R-CNN, the following extra keys are needed: + ++ `proposal_boxes` (array): 2D numpy array with shape (K, 4) representing K precomputed proposal boxes for this image. ++ `proposal_objectness_logits` (array): numpy array with shape (K, ), which corresponds to the objectness + logits of proposals in 'proposal_boxes'. ++ `proposal_bbox_mode` (int): the format of the precomputed proposal bbox. + It must be a member of + [structures.BoxMode](../modules/structures.html#detectron2.structures.BoxMode). + Default is `BoxMode.XYXY_ABS`. + +#### Custom Dataset Dicts for New Tasks + +In the `list[dict]` that your dataset function returns, the dictionary can also have arbitrary custom data. +This will be useful for a new task that needs extra information not supported +by the standard dataset dicts. In this case, you need to make sure the downstream code can handle your data +correctly. Usually this requires writing a new `mapper` for the dataloader (see [Use Custom Dataloaders](./data_loading.md)). + +When designing a custom format, note that all dicts are stored in memory +(sometimes serialized and with multiple copies). +To save memory, each dict is meant to contain small but sufficient information +about each sample, such as file names and annotations. +Loading full samples typically happens in the data loader. + +For attributes shared among the entire dataset, use `Metadata` (see below). +To avoid extra memory, do not save such information repeatly for each sample. + +### "Metadata" for Datasets + +Each dataset is associated with some metadata, accessible through +`MetadataCatalog.get(dataset_name).some_metadata`. +Metadata is a key-value mapping that contains information that's shared among +the entire dataset, and usually is used to interpret what's in the dataset, e.g., +names of classes, colors of classes, root of files, etc. +This information will be useful for augmentation, evaluation, visualization, logging, etc. +The structure of metadata depends on the what is needed from the corresponding downstream code. + +If you register a new dataset through `DatasetCatalog.register`, +you may also want to add its corresponding metadata through +`MetadataCatalog.get(dataset_name).some_key = some_value`, to enable any features that need the metadata. +You can do it like this (using the metadata key "thing_classes" as an example): + +```python +from detectron2.data import MetadataCatalog +MetadataCatalog.get("my_dataset").thing_classes = ["person", "dog"] +``` + +Here is a list of metadata keys that are used by builtin features in detectron2. +If you add your own dataset without these metadata, some features may be +unavailable to you: + +* `thing_classes` (list[str]): Used by all instance detection/segmentation tasks. + A list of names for each instance/thing category. + If you load a COCO format dataset, it will be automatically set by the function `load_coco_json`. + +* `thing_colors` (list[tuple(r, g, b)]): Pre-defined color (in [0, 255]) for each thing category. + Used for visualization. If not given, random colors are used. + +* `stuff_classes` (list[str]): Used by semantic and panoptic segmentation tasks. + A list of names for each stuff category. + +* `stuff_colors` (list[tuple(r, g, b)]): Pre-defined color (in [0, 255]) for each stuff category. + Used for visualization. If not given, random colors are used. + +* `keypoint_names` (list[str]): Used by keypoint localization. A list of names for each keypoint. + +* `keypoint_flip_map` (list[tuple[str]]): Used by the keypoint localization task. A list of pairs of names, + where each pair are the two keypoints that should be flipped if the image is + flipped horizontally during augmentation. +* `keypoint_connection_rules`: list[tuple(str, str, (r, g, b))]. Each tuple specifies a pair of keypoints + that are connected and the color to use for the line between them when visualized. + +Some additional metadata that are specific to the evaluation of certain datasets (e.g. COCO): + +* `thing_dataset_id_to_contiguous_id` (dict[int->int]): Used by all instance detection/segmentation tasks in the COCO format. + A mapping from instance class ids in the dataset to contiguous ids in range [0, #class). + Will be automatically set by the function `load_coco_json`. + +* `stuff_dataset_id_to_contiguous_id` (dict[int->int]): Used when generating prediction json files for + semantic/panoptic segmentation. + A mapping from semantic segmentation class ids in the dataset + to contiguous ids in [0, num_categories). It is useful for evaluation only. + +* `json_file`: The COCO annotation json file. Used by COCO evaluation for COCO-format datasets. +* `panoptic_root`, `panoptic_json`: Used by panoptic evaluation. +* `evaluator_type`: Used by the builtin main training script to select + evaluator. Don't use it in a new training script. + You can just provide the [DatasetEvaluator](../modules/evaluation.html#detectron2.evaluation.DatasetEvaluator) + for your dataset directly in your main script. + +NOTE: For background on the concept of "thing" and "stuff", see +[On Seeing Stuff: The Perception of Materials by Humans and Machines](http://persci.mit.edu/pub_pdfs/adelson_spie_01.pdf). +In detectron2, the term "thing" is used for instance-level tasks, +and "stuff" is used for semantic segmentation tasks. +Both are used in panoptic segmentation. + +### Register a COCO Format Dataset + +If your dataset is already a json file in the COCO format, +the dataset and its associated metadata can be registered easily with: +```python +from detectron2.data.datasets import register_coco_instances +register_coco_instances("my_dataset", {}, "json_annotation.json", "path/to/image/dir") +``` + +If your dataset is in COCO format but with extra custom per-instance annotations, +the [load_coco_json](../modules/data.html#detectron2.data.datasets.load_coco_json) +function might be useful. + +### Update the Config for New Datasets + +Once you've registered the dataset, you can use the name of the dataset (e.g., "my_dataset" in +example above) in `cfg.DATASETS.{TRAIN,TEST}`. +There are other configs you might want to change to train or evaluate on new datasets: + +* `MODEL.ROI_HEADS.NUM_CLASSES` and `MODEL.RETINANET.NUM_CLASSES` are the number of thing classes + for R-CNN and RetinaNet models, respectively. +* `MODEL.ROI_KEYPOINT_HEAD.NUM_KEYPOINTS` sets the number of keypoints for Keypoint R-CNN. + You'll also need to set [Keypoint OKS](http://cocodataset.org/#keypoints-eval) + with `TEST.KEYPOINT_OKS_SIGMAS` for evaluation. +* `MODEL.SEM_SEG_HEAD.NUM_CLASSES` sets the number of stuff classes for Semantic FPN & Panoptic FPN. +* If you're training Fast R-CNN (with precomputed proposals), `DATASETS.PROPOSAL_FILES_{TRAIN,TEST}` + need to match the datasets. The format of proposal files are documented + [here](../modules/data.html#detectron2.data.load_proposals_into_dataset). + +New models +(e.g. [TensorMask](../../projects/TensorMask), +[PointRend](../../projects/PointRend)) +often have similar configs of their own that need to be changed as well. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/deployment.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/deployment.md new file mode 100644 index 0000000..a473247 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/deployment.md @@ -0,0 +1,92 @@ +# Deployment + +## Caffe2 Deployment +We currently support converting a detectron2 model to Caffe2 format through ONNX. +The converted Caffe2 model is able to run without detectron2 dependency in either Python or C++. +It has a runtime optimized for CPU & mobile inference, but not for GPU inference. + +Caffe2 conversion requires PyTorch ≥ 1.4 and ONNX ≥ 1.6. + +### Coverage + +It supports 3 most common meta architectures: `GeneralizedRCNN`, `RetinaNet`, `PanopticFPN`, +and most official models under these 3 meta architectures. + +Users' custom extensions under these architectures (added through registration) are supported +as long as they do not contain control flow or operators not available in Caffe2 (e.g. deformable convolution). +For example, custom backbones and heads are often supported out of the box. + +### Usage + +The conversion APIs are documented at [the API documentation](../modules/export). +We provide a tool, `caffe2_converter.py` as an example that uses +these APIs to convert a standard model. + +To convert an official Mask R-CNN trained on COCO, first +[prepare the COCO dataset](../../datasets/), then pick the model from [Model Zoo](../../MODEL_ZOO.md), and run: +``` +cd tools/deploy/ && ./caffe2_converter.py --config-file ../../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ + --output ./caffe2_model --run-eval \ + MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl \ + MODEL.DEVICE cpu +``` + +Note that: +1. The conversion needs valid sample inputs & weights to trace the model. That's why the script requires the dataset. + You can modify the script to obtain sample inputs in other ways. +2. With the `--run-eval` flag, it will evaluate the converted models to verify its accuracy. + The accuracy is typically slightly different (within 0.1 AP) from PyTorch due to + numerical precisions between different implementations. + It's recommended to always verify the accuracy in case your custom model is not supported by the + conversion. + +The converted model is available at the specified `caffe2_model/` directory. Two files `model.pb` +and `model_init.pb` that contain network structure and network parameters are necessary for deployment. +These files can then be loaded in C++ or Python using Caffe2's APIs. + +The script generates `model.svg` file which contains a visualization of the network. +You can also load `model.pb` to tools such as [netron](https://github.com/lutzroeder/netron) to visualize it. + +### Use the model in C++/Python + +The model can be loaded in C++. An example [caffe2_mask_rcnn.cpp](../../tools/deploy/) is given, +which performs CPU/GPU inference using `COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x`. + +The C++ example needs to be built with: +* PyTorch with caffe2 inside +* gflags, glog, opencv +* protobuf headers that match the version of your caffe2 +* MKL headers if caffe2 is built with MKL + +The following can compile the example inside [official detectron2 docker](../../docker/): +``` +sudo apt update && sudo apt install libgflags-dev libgoogle-glog-dev libopencv-dev +pip install mkl-include +wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-cpp-3.6.1.tar.gz +tar xf protobuf-cpp-3.6.1.tar.gz +export CPATH=$(readlink -f ./protobuf-3.6.1/src/):$HOME/.local/include +export CMAKE_PREFIX_PATH=$HOME/.local/lib/python3.6/site-packages/torch/ +mkdir build && cd build +cmake -DTORCH_CUDA_ARCH_LIST=$TORCH_CUDA_ARCH_LIST .. && make + +# To run: +./caffe2_mask_rcnn --predict_net=./model.pb --init_net=./model_init.pb --input=input.jpg +``` + +Note that: + +* All converted models (the .pb files) take two input tensors: + "data" is an NCHW image, and "im_info" is an Nx3 tensor consisting of (height, width, 1.0) for + each image (the shape of "data" might be larger than that in "im_info" due to padding). + +* The converted models do not contain post-processing operations that + transform raw layer outputs into formatted predictions. + The example only produces raw outputs (28x28 masks) from the final + layers that are not post-processed, because in actual deployment, an application often needs + its custom lightweight post-processing (e.g. full-image masks for every detected object is often not necessary). + +We also provide a python wrapper around the converted model, in the +[Caffe2Model.\_\_call\_\_](../modules/export.html#detectron2.export.Caffe2Model.__call__) method. +This method has an interface that's identical to the [pytorch versions of models](./models.md), +and it internally applies pre/post-processing code to match the formats. +They can serve as a reference for pre/post-processing in actual deployment. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/evaluation.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/evaluation.md new file mode 100644 index 0000000..c71adb7 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/evaluation.md @@ -0,0 +1,43 @@ + +# Evaluation + +Evaluation is a process that takes a number of inputs/outputs pairs and aggregate them. +You can always [use the model](./models.md) directly and just parse its inputs/outputs manually to perform +evaluation. +Alternatively, evaluation is implemented in detectron2 using the [DatasetEvaluator](../modules/evaluation.html#detectron2.evaluation.DatasetEvaluator) +interface. + +Detectron2 includes a few `DatasetEvaluator` that computes metrics using standard dataset-specific +APIs (e.g., COCO, LVIS). +You can also implement your own `DatasetEvaluator` that performs some other jobs +using the inputs/outputs pairs. +For example, to count how many instances are detected on the validation set: + +``` +class Counter(DatasetEvaluator): + def reset(self): + self.count = 0 + def process(self, inputs, outputs): + for output in outputs: + self.count += len(output["instances"]) + def evaluate(self): + # save self.count somewhere, or print it, or return it. + return {"count": self.count} +``` + +Once you have some `DatasetEvaluator`, you can run it with +[inference_on_dataset](../modules/evaluation.html#detectron2.evaluation.inference_on_dataset). +For example, + +```python +val_results = inference_on_dataset( + model, + val_data_loader, + DatasetEvaluators([COCOEvaluator(...), Counter()])) +``` +Compared to running the evaluation manually using the model, the benefit of this function is that +you can merge evaluators together using [DatasetEvaluators](../modules/evaluation.html#detectron2.evaluation.DatasetEvaluators). +In this way you can run all evaluations without having to go through the dataset multiple times. + +The `inference_on_dataset` function also provides accurate speed benchmarks for the +given model and dataset. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/extend.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/extend.md new file mode 100644 index 0000000..4232185 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/extend.md @@ -0,0 +1,53 @@ +# Extend Detectron2's Defaults + +__Research is about doing things in new ways__. +This brings a tension in how to create abstractions in code, +which is a challenge for any research engineering project of a significant size: + +1. On one hand, it needs to have very thin abstractions to allow for the possibility of doing + everything in new ways. It should be reasonably easy to break existing + abstractions and replace them with new ones. + +2. On the other hand, such a project also needs reasonably high-level + abstractions, so that users can easily do things in standard ways, + without worrying too much about the details that only certain researchers care about. + +In detectron2, there are two types of interfaces that address this tension together: + +1. Functions and classes that take a config (`cfg`) argument + (sometimes with only a few extra arguments). + + Such functions and classes implement + the "standard default" behavior: it will read what it needs from the + config and do the "standard" thing. + Users only need to load a given config and pass it around, without having to worry about + which arguments are used and what they all mean. + +2. Functions and classes that have well-defined explicit arguments. + + Each of these is a small building block of the entire system. + They require users' expertise to understand what each argument should be, + and require more effort to stitch together to a larger system. + But they can be stitched together in more flexible ways. + + When you need to implement something not supported by the "standard defaults" + included in detectron2, these well-defined components can be reused. + +3. (experimental) A few classes are implemented with the + [@configurable](../../modules/config.html#detectron2.config.configurable) + decorator - they can be called with either a config, or with explicit arguments. + Their explicit argument interfaces are currently __experimental__ and subject to change. + + +If you only need the standard behavior, the [Beginner's Tutorial](./getting_started.md) +should suffice. If you need to extend detectron2 to your own needs, +see the following tutorials for more details: + +* Detectron2 includes a few standard datasets. To use custom ones, see + [Use Custom Datasets](./datasets.md). +* Detectron2 contains the standard logic that creates a data loader for training/testing from a + dataset, but you can write your own as well. See [Use Custom Data Loaders](./data_loading.md). +* Detectron2 implements many standard detection models, and provide ways for you + to overwrite their behaviors. See [Use Models](./models.md) and [Write Models](./write-models.md). +* Detectron2 provides a default training loop that is good for common training tasks. + You can customize it with hooks, or write your own loop instead. See [training](./training.md). diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/getting_started.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/getting_started.md new file mode 100644 index 0000000..acaf13f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/getting_started.md @@ -0,0 +1,79 @@ +## Getting Started with Detectron2 + +This document provides a brief intro of the usage of builtin command-line tools in detectron2. + +For a tutorial that involves actual coding with the API, +see our [Colab Notebook](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5) +which covers how to run inference with an +existing model, and how to train a builtin model on a custom dataset. + +For more advanced tutorials, refer to our [documentation](https://detectron2.readthedocs.io/tutorials/extend.html). + + +### Inference Demo with Pre-trained Models + +1. Pick a model and its config file from + [model zoo](MODEL_ZOO.md), + for example, `mask_rcnn_R_50_FPN_3x.yaml`. +2. We provide `demo.py` that is able to run builtin standard models. Run it with: +``` +cd demo/ +python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ + --input input1.jpg input2.jpg \ + [--other-options] + --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl +``` +The configs are made for training, therefore we need to specify `MODEL.WEIGHTS` to a model from model zoo for evaluation. +This command will run the inference and show visualizations in an OpenCV window. + +For details of the command line arguments, see `demo.py -h` or look at its source code +to understand its behavior. Some common arguments are: +* To run __on your webcam__, replace `--input files` with `--webcam`. +* To run __on a video__, replace `--input files` with `--video-input video.mp4`. +* To run __on cpu__, add `MODEL.DEVICE cpu` after `--opts`. +* To save outputs to a directory (for images) or a file (for webcam or video), use `--output`. + + +### Training & Evaluation in Command Line + +We provide a script in "tools/{,plain_}train_net.py", that is made to train +all the configs provided in detectron2. +You may want to use it as a reference to write your own training script. + +To train a model with "train_net.py", first +setup the corresponding datasets following +[datasets/README.md](./datasets/README.md), +then run: +``` +cd tools/ +./train_net.py --num-gpus 8 \ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml +``` + +The configs are made for 8-GPU training. +To train on 1 GPU, you may need to [change some parameters](https://arxiv.org/abs/1706.02677), e.g.: +``` +./train_net.py \ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \ + --num-gpus 1 SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025 +``` + +For most models, CPU training is not supported. + +To evaluate a model's performance, use +``` +./train_net.py \ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \ + --eval-only MODEL.WEIGHTS /path/to/checkpoint_file +``` +For more options, see `./train_net.py -h`. + +### Use Detectron2 APIs in Your Code + +See our [Colab Notebook](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5) +to learn how to use detectron2 APIs to: +1. run inference with an existing model +2. train a builtin model on a custom dataset + +See [detectron2/projects](https://github.com/facebookresearch/detectron2/tree/master/projects) +for more ways to build your project on detectron2. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/index.rst b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/index.rst new file mode 100644 index 0000000..896e71e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/index.rst @@ -0,0 +1,18 @@ +Tutorials +====================================== + +.. toctree:: + :maxdepth: 2 + + install + getting_started + builtin_datasets + extend + datasets + data_loading + models + write-models + training + evaluation + configs + deployment diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/install.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/install.md new file mode 100644 index 0000000..3985f8a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/install.md @@ -0,0 +1,184 @@ +## Installation + +Our [Colab Notebook](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5) +has step-by-step instructions that install detectron2. +The [Dockerfile](docker) +also installs detectron2 with a few simple commands. + +### Requirements +- Linux or macOS with Python ≥ 3.6 +- PyTorch ≥ 1.4 +- [torchvision](https://github.com/pytorch/vision/) that matches the PyTorch installation. + You can install them together at [pytorch.org](https://pytorch.org) to make sure of this. +- OpenCV, optional, needed by demo and visualization +- pycocotools: `pip install cython; pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'` + + +### Build Detectron2 from Source + +gcc & g++ ≥ 5 are required. [ninja](https://ninja-build.org/) is recommended for faster build. +After having them, run: +``` +python -m pip install 'git+https://github.com/facebookresearch/detectron2.git' +# (add --user if you don't have permission) + +# Or, to install it from a local clone: +git clone https://github.com/facebookresearch/detectron2.git +python -m pip install -e detectron2 + +# Or if you are on macOS +# CC=clang CXX=clang++ python -m pip install -e . +``` + +To __rebuild__ detectron2 that's built from a local clone, use `rm -rf build/ **/*.so` to clean the +old build first. You often need to rebuild detectron2 after reinstalling PyTorch. + +### Install Pre-Built Detectron2 (Linux only) +``` +# for CUDA 10.1: +python -m pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/index.html +``` +You can replace cu101 with "cu{100,92}" or "cpu". + +Note that: +1. Such installation has to be used with certain version of official PyTorch release. + See [releases](https://github.com/facebookresearch/detectron2/releases) for requirements. + It will not work with a different version of PyTorch or a non-official build of PyTorch. +2. Such installation is out-of-date w.r.t. master branch of detectron2. It may not be + compatible with the master branch of a research project that uses detectron2 (e.g. those in + [projects](projects) or [meshrcnn](https://github.com/facebookresearch/meshrcnn/)). + +### Common Installation Issues + +If you met issues using the pre-built detectron2, please uninstall it and try building it from source. + +Click each issue for its solutions: + +
    + +Undefined torch/aten/caffe2 symbols, or segmentation fault immediately when running the library. + +
    + +This usually happens when detectron2 or torchvision is not +compiled with the version of PyTorch you're running. + +Pre-built torchvision or detectron2 has to work with the corresponding official release of pytorch. +If the error comes from a pre-built torchvision, uninstall torchvision and pytorch and reinstall them +following [pytorch.org](http://pytorch.org). So the versions will match. + +If the error comes from a pre-built detectron2, check [release notes](https://github.com/facebookresearch/detectron2/releases) +to see the corresponding pytorch version required for each pre-built detectron2. + +If the error comes from detectron2 or torchvision that you built manually from source, +remove files you built (`build/`, `**/*.so`) and rebuild it so it can pick up the version of pytorch currently in your environment. + +If you cannot resolve this problem, please include the output of `gdb -ex "r" -ex "bt" -ex "quit" --args python -m detectron2.utils.collect_env` +in your issue. +
    + +
    + +Undefined C++ symbols (e.g. `GLIBCXX`) or C++ symbols not found. + +
    +Usually it's because the library is compiled with a newer C++ compiler but run with an old C++ runtime. + +This often happens with old anaconda. +Try `conda update libgcc`. Then rebuild detectron2. + +The fundamental solution is to run the code with proper C++ runtime. +One way is to use `LD_PRELOAD=/path/to/libstdc++.so`. + +
    + +
    + +"Not compiled with GPU support" or "Detectron2 CUDA Compiler: not available". + +
    +CUDA is not found when building detectron2. +You should make sure + +``` +python -c 'import torch; from torch.utils.cpp_extension import CUDA_HOME; print(torch.cuda.is_available(), CUDA_HOME)' +``` + +print valid outputs at the time you build detectron2. + +Most models can run inference (but not training) without GPU support. To use CPUs, set `MODEL.DEVICE='cpu'` in the config. +
    + +
    + +"invalid device function" or "no kernel image is available for execution". + +
    +Two possibilities: + +* You build detectron2 with one version of CUDA but run it with a different version. + + To check whether it is the case, + use `python -m detectron2.utils.collect_env` to find out inconsistent CUDA versions. + In the output of this command, you should expect "Detectron2 CUDA Compiler", "CUDA_HOME", "PyTorch built with - CUDA" + to contain cuda libraries of the same version. + + When they are inconsistent, + you need to either install a different build of PyTorch (or build by yourself) + to match your local CUDA installation, or install a different version of CUDA to match PyTorch. + +* Detectron2 or PyTorch/torchvision is not built for the correct GPU architecture (compute compatibility). + + The GPU architecture for PyTorch/detectron2/torchvision is available in the "architecture flags" in + `python -m detectron2.utils.collect_env`. + + The GPU architecture flags of detectron2/torchvision by default matches the GPU model detected + during compilation. This means the compiled code may not work on a different GPU model. + To overwrite the GPU architecture for detectron2/torchvision, use `TORCH_CUDA_ARCH_LIST` environment variable during compilation. + + For example, `export TORCH_CUDA_ARCH_LIST=6.0,7.0` makes it compile for both P100s and V100s. + Visit [developer.nvidia.com/cuda-gpus](https://developer.nvidia.com/cuda-gpus) to find out + the correct compute compatibility number for your device. + +
    + +
    + +Undefined CUDA symbols; cannot open libcudart.so; other nvcc failures. + +
    +The version of NVCC you use to build detectron2 or torchvision does +not match the version of CUDA you are running with. +This often happens when using anaconda's CUDA runtime. + +Use `python -m detectron2.utils.collect_env` to find out inconsistent CUDA versions. +In the output of this command, you should expect "Detectron2 CUDA Compiler", "CUDA_HOME", "PyTorch built with - CUDA" +to contain cuda libraries of the same version. + +When they are inconsistent, +you need to either install a different build of PyTorch (or build by yourself) +to match your local CUDA installation, or install a different version of CUDA to match PyTorch. +
    + + +
    + +"ImportError: cannot import name '_C'". + +
    +Please build and install detectron2 following the instructions above. + +If you are running code from detectron2's root directory, `cd` to a different one. +Otherwise you may not import the code that you installed. +
    + +
    + +ONNX conversion segfault after some "TraceWarning". + +
    +The ONNX package is compiled with too old compiler. + +Please build and install ONNX from its source code using a compiler +whose version is closer to what's used by PyTorch (available in `torch.__config__.show()`). +
    diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/models.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/models.md new file mode 100644 index 0000000..456f36d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/models.md @@ -0,0 +1,151 @@ +# Use Models + +Models (and their sub-models) in detectron2 are built by +functions such as `build_model`, `build_backbone`, `build_roi_heads`: +```python +from detectron2.modeling import build_model +model = build_model(cfg) # returns a torch.nn.Module +``` + +`build_model` only builds the model structure, and fill it with random parameters. +See below for how to load an existing checkpoint to the model, +and how to use the `model` object. + +### Load/Save a Checkpoint +```python +from detectron2.checkpoint import DetectionCheckpointer +DetectionCheckpointer(model).load(file_path) # load a file to model + +checkpointer = DetectionCheckpointer(model, save_dir="output") +checkpointer.save("model_999") # save to output/model_999.pth +``` + +Detectron2's checkpointer recognizes models in pytorch's `.pth` format, as well as the `.pkl` files +in our model zoo. +See [API doc](../modules/checkpoint.html#detectron2.checkpoint.DetectionCheckpointer) +for more details about its usage. + +The model files can be arbitrarily manipulated using `torch.{load,save}` for `.pth` files or +`pickle.{dump,load}` for `.pkl` files. + +### Use a Model + +A model can be called by `outputs = model(inputs)`, where `inputs` is a `list[dict]`. +Each dict corresponds to one image and the required keys +depend on the type of model, and whether the model is in training or evaluation mode. +For example, in order to do inference, +all existing models expect the "image" key, and optionally "height" and "width". +The detailed format of inputs and outputs of existing models are explained below. + +When in training mode, all models are required to be used under an `EventStorage`. +The training statistics will be put into the storage: +```python +from detectron2.utils.events import EventStorage +with EventStorage() as storage: + losses = model(inputs) +``` + +If you only want to do simple inference using an existing model, +[DefaultPredictor](../modules/engine.html#detectron2.engine.defaults.DefaultPredictor) +is a wrapper around model that provides such basic functionality. +It includes default behavior including model loading, preprocessing, +and operates on single image rather than batches. + +### Model Input Format + +Users can implement custom models that support any arbitrary input format. +Here we describe the standard input format that all builtin models support in detectron2. +They all take a `list[dict]` as the inputs. Each dict +corresponds to information about one image. + +The dict may contain the following keys: + +* "image": `Tensor` in (C, H, W) format. The meaning of channels are defined by `cfg.INPUT.FORMAT`. + Image normalization, if any, will be performed inside the model using + `cfg.MODEL.PIXEL_{MEAN,STD}`. +* "instances": an [Instances](../modules/structures.html#detectron2.structures.Instances) + object, with the following fields: + + "gt_boxes": a [Boxes](../modules/structures.html#detectron2.structures.Boxes) object storing N boxes, one for each instance. + + "gt_classes": `Tensor` of long type, a vector of N labels, in range [0, num_categories). + + "gt_masks": a [PolygonMasks](../modules/structures.html#detectron2.structures.PolygonMasks) + or [BitMasks](../modules/structures.html#detectron2.structures.BitMasks) object storing N masks, one for each instance. + + "gt_keypoints": a [Keypoints](../modules/structures.html#detectron2.structures.Keypoints) + object storing N keypoint sets, one for each instance. +* "proposals": an [Instances](../modules/structures.html#detectron2.structures.Instances) + object used only in Fast R-CNN style models, with the following fields: + + "proposal_boxes": a [Boxes](../modules/structures.html#detectron2.structures.Boxes) object storing P proposal boxes. + + "objectness_logits": `Tensor`, a vector of P scores, one for each proposal. +* "height", "width": the **desired** output height and width, which is not necessarily the same + as the height or width of the `image` input field. + For example, the `image` input field might be a resized image, + but you may want the outputs to be in **original** resolution. + + If provided, the model will produce output in this resolution, + rather than in the resolution of the `image` as input into the model. This is more efficient and accurate. +* "sem_seg": `Tensor[int]` in (H, W) format. The semantic segmentation ground truth. + Values represent category labels starting from 0. + + +#### How it connects to data loader: + +The output of the default [DatasetMapper]( ../modules/data.html#detectron2.data.DatasetMapper) is a dict +that follows the above format. +After the data loader performs batching, it becomes `list[dict]` which the builtin models support. + + +### Model Output Format + +When in training mode, the builtin models output a `dict[str->ScalarTensor]` with all the losses. + +When in inference mode, the builtin models output a `list[dict]`, one dict for each image. +Based on the tasks the model is doing, each dict may contain the following fields: + +* "instances": [Instances](../modules/structures.html#detectron2.structures.Instances) + object with the following fields: + * "pred_boxes": [Boxes](../modules/structures.html#detectron2.structures.Boxes) object storing N boxes, one for each detected instance. + * "scores": `Tensor`, a vector of N scores. + * "pred_classes": `Tensor`, a vector of N labels in range [0, num_categories). + + "pred_masks": a `Tensor` of shape (N, H, W), masks for each detected instance. + + "pred_keypoints": a `Tensor` of shape (N, num_keypoint, 3). + Each row in the last dimension is (x, y, score). Scores are larger than 0. +* "sem_seg": `Tensor` of (num_categories, H, W), the semantic segmentation prediction. +* "proposals": [Instances](../modules/structures.html#detectron2.structures.Instances) + object with the following fields: + * "proposal_boxes": [Boxes](../modules/structures.html#detectron2.structures.Boxes) + object storing N boxes. + * "objectness_logits": a torch vector of N scores. +* "panoptic_seg": A tuple of `(Tensor, list[dict])`. The tensor has shape (H, W), where each element + represent the segment id of the pixel. Each dict describes one segment id and has the following fields: + * "id": the segment id + * "isthing": whether the segment is a thing or stuff + * "category_id": the category id of this segment. It represents the thing + class id when `isthing==True`, and the stuff class id otherwise. + + +### Partially execute a model: + +Sometimes you may want to obtain an intermediate tensor inside a model. +Since there are typically hundreds of intermediate tensors, there isn't an API that provides you +the intermediate result you need. +You have the following options: + +1. Write a (sub)model. Following the [tutorial](./write-models.md), you can + rewrite a model component (e.g. a head of a model), such that it + does the same thing as the existing component, but returns the output + you need. +2. Partially execute a model. You can create the model as usual, + but use custom code to execute it instead of its `forward()`. For example, + the following code obtains mask features before mask head. + +```python +images = ImageList.from_tensors(...) # preprocessed input tensor +model = build_model(cfg) +features = model.backbone(images.tensor) +proposals, _ = model.proposal_generator(images, features) +instances = model.roi_heads._forward_box(features, proposals) +mask_features = [features[f] for f in model.roi_heads.in_features] +mask_features = model.roi_heads.mask_pooler(mask_features, [x.pred_boxes for x in instances]) +``` + +Note that both options require you to read the existing forward code to understand +how to write code to obtain the outputs you need. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/training.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/training.md new file mode 100644 index 0000000..dc7d537 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/training.md @@ -0,0 +1,50 @@ +# Training + +From the previous tutorials, you may now have a custom model and data loader. + +You are free to create your own optimizer, and write the training logic: it's +usually easy with PyTorch, and allow researchers to see the entire training +logic more clearly and have full control. +One such example is provided in [tools/plain_train_net.py](../../tools/plain_train_net.py). + +We also provide a standarized "trainer" abstraction with a +[minimal hook system](../modules/engine.html#detectron2.engine.HookBase) +that helps simplify the standard types of training. + +You can use +[SimpleTrainer().train()](../modules/engine.html#detectron2.engine.SimpleTrainer) +which provides minimal abstraction for single-cost single-optimizer single-data-source training. +The builtin `train_net.py` script uses +[DefaultTrainer().train()](../modules/engine.html#detectron2.engine.defaults.DefaultTrainer), +which includes more standard default behavior that one might want to opt in, +including default configurations for learning rate schedule, +logging, evaluation, checkpointing etc. +This also means that it's less likely to support some non-standard behavior +you might want during research. + +To customize the training loops, you can: + +1. If your customization is similar to what `DefaultTrainer` is already doing, +you can change behavior of `DefaultTrainer` by overwriting [its methods](../modules/engine.html#detectron2.engine.defaults.DefaultTrainer) +in a subclass, like what [tools/train_net.py](../../tools/train_net.py) does. +2. If you need something very novel, you can start from [tools/plain_train_net.py](../../tools/plain_train_net.py) to implement them yourself. + +### Logging of Metrics + +During training, metrics are saved to a centralized [EventStorage](../modules/utils.html#detectron2.utils.events.EventStorage). +You can use the following code to access it and log metrics to it: +``` +from detectron2.utils.events import get_event_storage + +# inside the model: +if self.training: + value = # compute the value from inputs + storage = get_event_storage() + storage.put_scalar("some_accuracy", value) +``` + +Refer to its documentation for more details. + +Metrics are then saved to various destinations with [EventWriter](../modules/utils.html#module-detectron2.utils.events). +DefaultTrainer enables a few `EventWriter` with default configurations. +See above for how to customize them. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/write-models.md b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/write-models.md new file mode 100644 index 0000000..bb87d58 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/docs/tutorials/write-models.md @@ -0,0 +1,39 @@ +# Write Models + +If you are trying to do something completely new, you may wish to implement +a model entirely from scratch within detectron2. However, in many situations you may +be interested in modifying or extending some components of an existing model. +Therefore, we also provide a registration mechanism that lets you override the +behavior of certain internal components of standard models. + +For example, to add a new backbone, import this code in your code: +```python +from detectron2.modeling import BACKBONE_REGISTRY, Backbone, ShapeSpec + +@BACKBONE_REGISTRY.register() +class ToyBackBone(Backbone): + def __init__(self, cfg, input_shape): + # create your own backbone + self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=16, padding=3) + + def forward(self, image): + return {"conv1": self.conv1(image)} + + def output_shape(self): + return {"conv1": ShapeSpec(channels=64, stride=16)} +``` +Then, you can use `cfg.MODEL.BACKBONE.NAME = 'ToyBackBone'` in your config object. +`build_model(cfg)` will then call your `ToyBackBone` instead. + +As another example, to add new abilities to the ROI heads in the Generalized R-CNN meta-architecture, +you can implement a new +[ROIHeads](../modules/modeling.html#detectron2.modeling.ROIHeads) subclass and put it in the `ROI_HEADS_REGISTRY`. +See [densepose in detectron2](../../projects/DensePose) +and [meshrcnn](https://github.com/facebookresearch/meshrcnn) +for examples that implement new ROIHeads to perform new tasks. +And [projects/](../../projects/) +contains more examples that implement different architectures. + +A complete list of registries can be found in [API documentation](../modules/modeling.html#model-registries). +You can register components in these registries to customize different parts of a model, or the +entire model. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/README.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/README.md new file mode 100644 index 0000000..fd2f1ee --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/README.md @@ -0,0 +1,54 @@ +# DensePose in Detectron2 +**Dense Human Pose Estimation In The Wild** + +_Rıza Alp Güler, Natalia Neverova, Iasonas Kokkinos_ + +[[`densepose.org`](https://densepose.org)] [[`arXiv`](https://arxiv.org/abs/1802.00434)] [[`BibTeX`](#CitingDensePose)] + +Dense human pose estimation aims at mapping all human pixels of an RGB image to the 3D surface of the human body. + +
    + +
    + +In this repository, we provide the code to train and evaluate DensePose-RCNN. We also provide tools to visualize +DensePose annotation and results. + +# Quick Start + +See [ Getting Started ](doc/GETTING_STARTED.md) + +# Model Zoo and Baselines + +We provide a number of baseline results and trained models available for download. See [Model Zoo](doc/MODEL_ZOO.md) for details. + +# License + +Detectron2 is released under the [Apache 2.0 license](../../LICENSE) + +## Citing DensePose + +If you use DensePose, please take the references from the following BibTeX entries: + +For DensePose with estimated confidences: + +``` +@InProceedings{Neverova2019DensePoseConfidences, + title = {Correlated Uncertainty for Learning Dense Correspondences from Noisy Labels}, + author = {Neverova, Natalia and Novotny, David and Vedaldi, Andrea}, + journal = {Advances in Neural Information Processing Systems}, + year = {2019}, +} +``` + +For the original DensePose: + +``` +@InProceedings{Guler2018DensePose, + title={DensePose: Dense Human Pose Estimation In The Wild}, + author={R\{i}za Alp G\"uler, Natalia Neverova, Iasonas Kokkinos}, + journal={The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2018} +} +``` + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/apply_net.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/apply_net.py new file mode 100644 index 0000000..7262f7c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/apply_net.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import argparse +import glob +import logging +import os +import pickle +import sys +from typing import Any, ClassVar, Dict, List +import torch + +from detectron2.config import get_cfg +from detectron2.data.detection_utils import read_image +from detectron2.engine.defaults import DefaultPredictor +from detectron2.structures.boxes import BoxMode +from detectron2.structures.instances import Instances +from detectron2.utils.logger import setup_logger + +from densepose import add_densepose_config +from densepose.utils.logger import verbosity_to_level +from densepose.vis.base import CompoundVisualizer +from densepose.vis.bounding_box import ScoredBoundingBoxVisualizer +from densepose.vis.densepose import ( + DensePoseResultsContourVisualizer, + DensePoseResultsFineSegmentationVisualizer, + DensePoseResultsUVisualizer, + DensePoseResultsVVisualizer, +) +from densepose.vis.extractor import CompoundExtractor, create_extractor + +DOC = """Apply Net - a tool to print / visualize DensePose results +""" + +LOGGER_NAME = "apply_net" +logger = logging.getLogger(LOGGER_NAME) + +_ACTION_REGISTRY: Dict[str, "Action"] = {} + + +class Action(object): + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + parser.add_argument( + "-v", + "--verbosity", + action="count", + help="Verbose mode. Multiple -v options increase the verbosity.", + ) + + +def register_action(cls: type): + """ + Decorator for action classes to automate action registration + """ + global _ACTION_REGISTRY + _ACTION_REGISTRY[cls.COMMAND] = cls + return cls + + +class InferenceAction(Action): + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + super(InferenceAction, cls).add_arguments(parser) + parser.add_argument("cfg", metavar="", help="Config file") + parser.add_argument("model", metavar="", help="Model file") + parser.add_argument("input", metavar="", help="Input data") + parser.add_argument( + "--opts", + help="Modify config options using the command-line 'KEY VALUE' pairs", + default=[], + nargs=argparse.REMAINDER, + ) + + @classmethod + def execute(cls: type, args: argparse.Namespace): + logger.info(f"Loading config from {args.cfg}") + opts = [] + cfg = cls.setup_config(args.cfg, args.model, args, opts) + logger.info(f"Loading model from {args.model}") + predictor = DefaultPredictor(cfg) + logger.info(f"Loading data from {args.input}") + file_list = cls._get_input_file_list(args.input) + if len(file_list) == 0: + logger.warning(f"No input images for {args.input}") + return + context = cls.create_context(args) + for file_name in file_list: + img = read_image(file_name, format="BGR") # predictor expects BGR image. + with torch.no_grad(): + outputs = predictor(img)["instances"] + cls.execute_on_outputs(context, {"file_name": file_name, "image": img}, outputs) + cls.postexecute(context) + + @classmethod + def setup_config( + cls: type, config_fpath: str, model_fpath: str, args: argparse.Namespace, opts: List[str] + ): + cfg = get_cfg() + add_densepose_config(cfg) + cfg.merge_from_file(config_fpath) + cfg.merge_from_list(args.opts) + if opts: + cfg.merge_from_list(opts) + cfg.MODEL.WEIGHTS = model_fpath + cfg.freeze() + return cfg + + @classmethod + def _get_input_file_list(cls: type, input_spec: str): + if os.path.isdir(input_spec): + file_list = [ + os.path.join(input_spec, fname) + for fname in os.listdir(input_spec) + if os.path.isfile(os.path.join(input_spec, fname)) + ] + elif os.path.isfile(input_spec): + file_list = [input_spec] + else: + file_list = glob.glob(input_spec) + return file_list + + +@register_action +class DumpAction(InferenceAction): + """ + Dump action that outputs results to a pickle file + """ + + COMMAND: ClassVar[str] = "dump" + + @classmethod + def add_parser(cls: type, subparsers: argparse._SubParsersAction): + parser = subparsers.add_parser(cls.COMMAND, help="Dump model outputs to a file.") + cls.add_arguments(parser) + parser.set_defaults(func=cls.execute) + + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + super(DumpAction, cls).add_arguments(parser) + parser.add_argument( + "--output", + metavar="", + default="results.pkl", + help="File name to save dump to", + ) + + @classmethod + def execute_on_outputs( + cls: type, context: Dict[str, Any], entry: Dict[str, Any], outputs: Instances + ): + image_fpath = entry["file_name"] + logger.info(f"Processing {image_fpath}") + result = {"file_name": image_fpath} + if outputs.has("scores"): + result["scores"] = outputs.get("scores").cpu() + if outputs.has("pred_boxes"): + result["pred_boxes_XYXY"] = outputs.get("pred_boxes").tensor.cpu() + if outputs.has("pred_densepose"): + boxes_XYWH = BoxMode.convert( + result["pred_boxes_XYXY"], BoxMode.XYXY_ABS, BoxMode.XYWH_ABS + ) + result["pred_densepose"] = outputs.get("pred_densepose").to_result(boxes_XYWH) + context["results"].append(result) + + @classmethod + def create_context(cls: type, args: argparse.Namespace): + context = {"results": [], "out_fname": args.output} + return context + + @classmethod + def postexecute(cls: type, context: Dict[str, Any]): + out_fname = context["out_fname"] + out_dir = os.path.dirname(out_fname) + if len(out_dir) > 0 and not os.path.exists(out_dir): + os.makedirs(out_dir) + with open(out_fname, "wb") as hFile: + pickle.dump(context["results"], hFile) + logger.info(f"Output saved to {out_fname}") + + +@register_action +class ShowAction(InferenceAction): + """ + Show action that visualizes selected entries on an image + """ + + COMMAND: ClassVar[str] = "show" + VISUALIZERS: ClassVar[Dict[str, object]] = { + "dp_contour": DensePoseResultsContourVisualizer, + "dp_segm": DensePoseResultsFineSegmentationVisualizer, + "dp_u": DensePoseResultsUVisualizer, + "dp_v": DensePoseResultsVVisualizer, + "bbox": ScoredBoundingBoxVisualizer, + } + + @classmethod + def add_parser(cls: type, subparsers: argparse._SubParsersAction): + parser = subparsers.add_parser(cls.COMMAND, help="Visualize selected entries") + cls.add_arguments(parser) + parser.set_defaults(func=cls.execute) + + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + super(ShowAction, cls).add_arguments(parser) + parser.add_argument( + "visualizations", + metavar="", + help="Comma separated list of visualizations, possible values: " + "[{}]".format(",".join(sorted(cls.VISUALIZERS.keys()))), + ) + parser.add_argument( + "--min_score", + metavar="", + default=0.8, + type=float, + help="Minimum detection score to visualize", + ) + parser.add_argument( + "--nms_thresh", metavar="", default=None, type=float, help="NMS threshold" + ) + parser.add_argument( + "--output", + metavar="", + default="outputres.png", + help="File name to save output to", + ) + + @classmethod + def setup_config( + cls: type, config_fpath: str, model_fpath: str, args: argparse.Namespace, opts: List[str] + ): + opts.append("MODEL.ROI_HEADS.SCORE_THRESH_TEST") + opts.append(str(args.min_score)) + if args.nms_thresh is not None: + opts.append("MODEL.ROI_HEADS.NMS_THRESH_TEST") + opts.append(str(args.nms_thresh)) + cfg = super(ShowAction, cls).setup_config(config_fpath, model_fpath, args, opts) + return cfg + + @classmethod + def execute_on_outputs( + cls: type, context: Dict[str, Any], entry: Dict[str, Any], outputs: Instances + ): + import cv2 + import numpy as np + + visualizer = context["visualizer"] + extractor = context["extractor"] + image_fpath = entry["file_name"] + logger.info(f"Processing {image_fpath}") + image = cv2.cvtColor(entry["image"], cv2.COLOR_BGR2GRAY) + image = np.tile(image[:, :, np.newaxis], [1, 1, 3]) + data = extractor(outputs) + image_vis = visualizer.visualize(image, data) + entry_idx = context["entry_idx"] + 1 + out_fname = cls._get_out_fname(entry_idx, context["out_fname"]) + out_dir = os.path.dirname(out_fname) + if len(out_dir) > 0 and not os.path.exists(out_dir): + os.makedirs(out_dir) + cv2.imwrite(out_fname, image_vis) + logger.info(f"Output saved to {out_fname}") + context["entry_idx"] += 1 + + @classmethod + def postexecute(cls: type, context: Dict[str, Any]): + pass + + @classmethod + def _get_out_fname(cls: type, entry_idx: int, fname_base: str): + base, ext = os.path.splitext(fname_base) + return base + ".{0:04d}".format(entry_idx) + ext + + @classmethod + def create_context(cls: type, args: argparse.Namespace) -> Dict[str, Any]: + vis_specs = args.visualizations.split(",") + visualizers = [] + extractors = [] + for vis_spec in vis_specs: + vis = cls.VISUALIZERS[vis_spec]() + visualizers.append(vis) + extractor = create_extractor(vis) + extractors.append(extractor) + visualizer = CompoundVisualizer(visualizers) + extractor = CompoundExtractor(extractors) + context = { + "extractor": extractor, + "visualizer": visualizer, + "out_fname": args.output, + "entry_idx": 0, + } + return context + + +def create_argument_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description=DOC, + formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=120), + ) + parser.set_defaults(func=lambda _: parser.print_help(sys.stdout)) + subparsers = parser.add_subparsers(title="Actions") + for _, action in _ACTION_REGISTRY.items(): + action.add_parser(subparsers) + return parser + + +def main(): + parser = create_argument_parser() + args = parser.parse_args() + verbosity = args.verbosity if hasattr(args, "verbosity") else None + global logger + logger = setup_logger(name=LOGGER_NAME) + logger.setLevel(verbosity_to_level(verbosity)) + args.func(args) + + +if __name__ == "__main__": + main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/Base-DensePose-RCNN-FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/Base-DensePose-RCNN-FPN.yaml new file mode 100644 index 0000000..3ed1bcd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/Base-DensePose-RCNN-FPN.yaml @@ -0,0 +1,47 @@ +MODEL: + META_ARCHITECTURE: "GeneralizedRCNN" + BACKBONE: + NAME: "build_resnet_fpn_backbone" + RESNETS: + OUT_FEATURES: ["res2", "res3", "res4", "res5"] + FPN: + IN_FEATURES: ["res2", "res3", "res4", "res5"] + ANCHOR_GENERATOR: + SIZES: [[32], [64], [128], [256], [512]] # One size for each in feature map + ASPECT_RATIOS: [[0.5, 1.0, 2.0]] # Three aspect ratios (same for all in feature maps) + RPN: + IN_FEATURES: ["p2", "p3", "p4", "p5", "p6"] + PRE_NMS_TOPK_TRAIN: 2000 # Per FPN level + PRE_NMS_TOPK_TEST: 1000 # Per FPN level + # Detectron1 uses 2000 proposals per-batch, + # (See "modeling/rpn/rpn_outputs.py" for details of this legacy issue) + # which is approximately 1000 proposals per-image since the default batch size for FPN is 2. + POST_NMS_TOPK_TRAIN: 1000 + POST_NMS_TOPK_TEST: 1000 + + DENSEPOSE_ON: True + ROI_HEADS: + NAME: "DensePoseROIHeads" + IN_FEATURES: ["p2", "p3", "p4", "p5"] + NUM_CLASSES: 1 + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_FC: 2 + POOLER_RESOLUTION: 7 + POOLER_SAMPLING_RATIO: 2 + POOLER_TYPE: "ROIAlign" + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseV1ConvXHead" + POOLER_TYPE: "ROIAlign" + NUM_COARSE_SEGM_CHANNELS: 2 +DATASETS: + TRAIN: ("densepose_coco_2014_train", "densepose_coco_2014_valminusminival") + TEST: ("densepose_coco_2014_minival",) +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.01 + STEPS: (60000, 80000) + MAX_ITER: 90000 + WARMUP_FACTOR: 0.1 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC1_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC1_s1x.yaml new file mode 100644 index 0000000..15475b1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC1_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseDeepLabHead" + UV_CONFIDENCE: + ENABLED: True + TYPE: "iid_iso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC2_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC2_s1x.yaml new file mode 100644 index 0000000..7546b96 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_WC2_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseDeepLabHead" + UV_CONFIDENCE: + ENABLED: True + TYPE: "indep_aniso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_s1x.yaml new file mode 100644 index 0000000..045f7f0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_DL_s1x.yaml @@ -0,0 +1,10 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseDeepLabHead" +SOLVER: + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC1_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC1_s1x.yaml new file mode 100644 index 0000000..ace6209 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC1_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 + ROI_DENSEPOSE_HEAD: + UV_CONFIDENCE: + ENABLED: True + TYPE: "iid_iso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) + WARMUP_FACTOR: 0.025 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC2_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC2_s1x.yaml new file mode 100644 index 0000000..766c098 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_WC2_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 + ROI_DENSEPOSE_HEAD: + UV_CONFIDENCE: + ENABLED: True + TYPE: "indep_aniso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) + WARMUP_FACTOR: 0.025 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x.yaml new file mode 100644 index 0000000..af44fb7 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x.yaml @@ -0,0 +1,8 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 +SOLVER: + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x_legacy.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x_legacy.yaml new file mode 100644 index 0000000..8e79a1b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_101_FPN_s1x_legacy.yaml @@ -0,0 +1,17 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + RESNETS: + DEPTH: 101 + ROI_DENSEPOSE_HEAD: + NUM_COARSE_SEGM_CHANNELS: 15 + POOLER_RESOLUTION: 14 + HEATMAP_SIZE: 56 + INDEX_WEIGHTS: 2.0 + PART_WEIGHTS: 0.3 + POINT_REGRESSION_WEIGHTS: 0.1 + DECODER_ON: False +SOLVER: + BASE_LR: 0.002 + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC1_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC1_s1x.yaml new file mode 100644 index 0000000..f3720ef --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC1_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseDeepLabHead" + UV_CONFIDENCE: + ENABLED: True + TYPE: "iid_iso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC2_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC2_s1x.yaml new file mode 100644 index 0000000..5a47cc0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_WC2_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseDeepLabHead" + UV_CONFIDENCE: + ENABLED: True + TYPE: "indep_aniso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_s1x.yaml new file mode 100644 index 0000000..52a170b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_DL_s1x.yaml @@ -0,0 +1,10 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseDeepLabHead" +SOLVER: + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC1_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC1_s1x.yaml new file mode 100644 index 0000000..d36e542 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC1_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + UV_CONFIDENCE: + ENABLED: True + TYPE: "iid_iso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) + WARMUP_FACTOR: 0.025 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC2_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC2_s1x.yaml new file mode 100644 index 0000000..e880d46 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_WC2_s1x.yaml @@ -0,0 +1,16 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + UV_CONFIDENCE: + ENABLED: True + TYPE: "indep_aniso" + POINT_REGRESSION_WEIGHTS: 0.0005 +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 130000 + STEPS: (100000, 120000) + WARMUP_FACTOR: 0.025 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x.yaml new file mode 100644 index 0000000..d2dd14c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x.yaml @@ -0,0 +1,8 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +SOLVER: + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x_legacy.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x_legacy.yaml new file mode 100644 index 0000000..6c5391f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/densepose_rcnn_R_50_FPN_s1x_legacy.yaml @@ -0,0 +1,17 @@ +_BASE_: "Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + NUM_COARSE_SEGM_CHANNELS: 15 + POOLER_RESOLUTION: 14 + HEATMAP_SIZE: 56 + INDEX_WEIGHTS: 2.0 + PART_WEIGHTS: 0.3 + POINT_REGRESSION_WEIGHTS: 0.1 + DECODER_ON: False +SOLVER: + BASE_LR: 0.002 + MAX_ITER: 130000 + STEPS: (100000, 120000) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/Base-RCNN-FPN-MC.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/Base-RCNN-FPN-MC.yaml new file mode 100644 index 0000000..5a20882 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/Base-RCNN-FPN-MC.yaml @@ -0,0 +1,91 @@ +MODEL: + META_ARCHITECTURE: "GeneralizedRCNN" + BACKBONE: + NAME: "build_resnet_fpn_backbone" + RESNETS: + OUT_FEATURES: ["res2", "res3", "res4", "res5"] + FPN: + IN_FEATURES: ["res2", "res3", "res4", "res5"] + ANCHOR_GENERATOR: + SIZES: [[32], [64], [128], [256], [512]] # One size for each in feature map + ASPECT_RATIOS: [[0.5, 1.0, 2.0]] # Three aspect ratios (same for all in feature maps) + RPN: + IN_FEATURES: ["p2", "p3", "p4", "p5", "p6"] + PRE_NMS_TOPK_TRAIN: 2000 # Per FPN level + PRE_NMS_TOPK_TEST: 1000 # Per FPN level + # Detectron1 uses 2000 proposals per-batch, + # (See "modeling/rpn/rpn_outputs.py" for details of this legacy issue) + # which is approximately 1000 proposals per-image since the default batch size for FPN is 2. + POST_NMS_TOPK_TRAIN: 1000 + POST_NMS_TOPK_TEST: 1000 + ROI_HEADS: + NAME: "StandardROIHeads" + IN_FEATURES: ["p2", "p3", "p4", "p5"] + NUM_CLASSES: 1 + ROI_BOX_HEAD: + NAME: "FastRCNNConvFCHead" + NUM_FC: 2 + POOLER_RESOLUTION: 7 + ROI_MASK_HEAD: + NAME: "MaskRCNNConvUpsampleHead" + NUM_CONV: 4 + POOLER_RESOLUTION: 14 +DATASETS: + TRAIN: ("base_coco_2017_train",) + TEST: ("base_coco_2017_val", "densepose_chimps") + CATEGORY_MAPS: + "base_coco_2017_train": + "16": 1 # bird -> person + "17": 1 # cat -> person + "18": 1 # dog -> person + "19": 1 # horse -> person + "20": 1 # sheep -> person + "21": 1 # cow -> person + "22": 1 # elephant -> person + "23": 1 # bear -> person + "24": 1 # zebra -> person + "25": 1 # girafe -> person + "base_coco_2017_val": + "16": 1 # bird -> person + "17": 1 # cat -> person + "18": 1 # dog -> person + "19": 1 # horse -> person + "20": 1 # sheep -> person + "21": 1 # cow -> person + "22": 1 # elephant -> person + "23": 1 # bear -> person + "24": 1 # zebra -> person + "25": 1 # girafe -> person + WHITELISTED_CATEGORIES: + "base_coco_2017_train": + - 1 # person + - 16 # bird + - 17 # cat + - 18 # dog + - 19 # horse + - 20 # sheep + - 21 # cow + - 22 # elephant + - 23 # bear + - 24 # zebra + - 25 # girafe + "base_coco_2017_val": + - 1 # person + - 16 # bird + - 17 # cat + - 18 # dog + - 19 # horse + - 20 # sheep + - 21 # cow + - 22 # elephant + - 23 # bear + - 24 # zebra + - 25 # girafe +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.02 + STEPS: (60000, 80000) + MAX_ITER: 90000 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/faster_rcnn_R_50_FPN_1x_MC.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/faster_rcnn_R_50_FPN_1x_MC.yaml new file mode 100644 index 0000000..80139ad --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/evolution/faster_rcnn_R_50_FPN_1x_MC.yaml @@ -0,0 +1,7 @@ +_BASE_: "Base-RCNN-FPN-MC.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + DENSEPOSE_ON: False + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_DL_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_DL_instant_test.yaml new file mode 100644 index 0000000..b90989e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_DL_instant_test.yaml @@ -0,0 +1,11 @@ +_BASE_: "../Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + ROI_DENSEPOSE_HEAD: + NAME: "DensePoseDeepLabHead" +DATASETS: + TRAIN: ("densepose_coco_2014_minival_100",) + TEST: ("densepose_coco_2014_minival_100",) +SOLVER: + MAX_ITER: 40 + STEPS: (30,) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_TTA_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_TTA_inference_acc_test.yaml new file mode 100644 index 0000000..7d41274 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_TTA_inference_acc_test.yaml @@ -0,0 +1,13 @@ +_BASE_: "../densepose_rcnn_R_50_FPN_s1x.yaml" +MODEL: + WEIGHTS: "https://dl.fbaipublicfiles.com/densepose/densepose_rcnn_R_50_FPN_s1x/165712039/model_final_162be9.pkl" +DATASETS: + TRAIN: () + TEST: ("densepose_coco_2014_minival_100",) +TEST: + AUG: + ENABLED: True + MIN_SIZES: (400, 500, 600, 700, 800, 900, 1000, 1100, 1200) + MAX_SIZE: 4000 + FLIP: True + EXPECTED_RESULTS: [["bbox_TTA", "AP", 61.74, 0.03], ["densepose_gps_TTA", "AP", 60.22, 0.03], ["densepose_gpsm_TTA", "AP", 63.85, 0.03]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC1_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC1_instant_test.yaml new file mode 100644 index 0000000..f0fe611 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC1_instant_test.yaml @@ -0,0 +1,19 @@ +_BASE_: "../Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + UV_CONFIDENCE: + ENABLED: True + TYPE: "iid_iso" + POINT_REGRESSION_WEIGHTS: 0.0005 +DATASETS: + TRAIN: ("densepose_coco_2014_minival_100",) + TEST: ("densepose_coco_2014_minival_100",) +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 40 + STEPS: (30,) + WARMUP_FACTOR: 0.025 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC2_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC2_instant_test.yaml new file mode 100644 index 0000000..f0d9358 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_WC2_instant_test.yaml @@ -0,0 +1,19 @@ +_BASE_: "../Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 + ROI_DENSEPOSE_HEAD: + UV_CONFIDENCE: + ENABLED: True + TYPE: "indep_aniso" + POINT_REGRESSION_WEIGHTS: 0.0005 +DATASETS: + TRAIN: ("densepose_coco_2014_minival_100",) + TEST: ("densepose_coco_2014_minival_100",) +SOLVER: + CLIP_GRADIENTS: + ENABLED: True + MAX_ITER: 40 + STEPS: (30,) + WARMUP_FACTOR: 0.025 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_inference_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_inference_acc_test.yaml new file mode 100644 index 0000000..3c5a7d2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_inference_acc_test.yaml @@ -0,0 +1,8 @@ +_BASE_: "../densepose_rcnn_R_50_FPN_s1x.yaml" +MODEL: + WEIGHTS: "https://dl.fbaipublicfiles.com/densepose/densepose_rcnn_R_50_FPN_s1x/165712039/model_final_162be9.pkl" +DATASETS: + TRAIN: () + TEST: ("densepose_coco_2014_minival_100",) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 59.27, 0.025], ["densepose_gps", "AP", 60.11, 0.02], ["densepose_gpsm", "AP", 64.20, 0.02]] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_instant_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_instant_test.yaml new file mode 100644 index 0000000..057c876 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_instant_test.yaml @@ -0,0 +1,9 @@ +_BASE_: "../Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" +DATASETS: + TRAIN: ("densepose_coco_2014_minival_100",) + TEST: ("densepose_coco_2014_minival_100",) +SOLVER: + MAX_ITER: 40 + STEPS: (30,) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_training_acc_test.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_training_acc_test.yaml new file mode 100644 index 0000000..b991160 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/configs/quick_schedules/densepose_rcnn_R_50_FPN_training_acc_test.yaml @@ -0,0 +1,14 @@ +_BASE_: "../Base-DensePose-RCNN-FPN.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + ROI_HEADS: + NUM_CLASSES: 1 +DATASETS: + TRAIN: ("densepose_coco_2014_minival",) + TEST: ("densepose_coco_2014_minival",) +SOLVER: + MAX_ITER: 6000 + STEPS: (5500, 5800) +TEST: + EXPECTED_RESULTS: [["bbox", "AP", 58.27, 1.0], ["densepose_gps", "AP", 42.47, 1.5], ["densepose_gpsm", "AP", 49.20, 1.5]] + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/__init__.py new file mode 100644 index 0000000..aea5a1a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .data.datasets import builtin # just to register data +from .config import add_densepose_config, add_dataset_category_config +from .densepose_head import ROI_DENSEPOSE_HEAD_REGISTRY +from .evaluator import DensePoseCOCOEvaluator +from .roi_head import DensePoseROIHeads +from .data.structures import DensePoseDataRelative, DensePoseList, DensePoseTransformData +from .modeling.test_time_augmentation import DensePoseGeneralizedRCNNWithTTA +from .utils.transform import load_from_cfg diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/config.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/config.py new file mode 100644 index 0000000..2d76056 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/config.py @@ -0,0 +1,68 @@ +# -*- coding = utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from detectron2.config import CfgNode as CN + + +def add_dataset_category_config(cfg: CN): + """ + Add config for additional category-related dataset options + - category whitelisting + - category mapping + """ + _C = cfg + _C.DATASETS.CATEGORY_MAPS = CN(new_allowed=True) + _C.DATASETS.WHITELISTED_CATEGORIES = CN(new_allowed=True) + + +def add_densepose_config(cfg: CN): + """ + Add config for densepose head. + """ + _C = cfg + + _C.MODEL.DENSEPOSE_ON = True + + _C.MODEL.ROI_DENSEPOSE_HEAD = CN() + _C.MODEL.ROI_DENSEPOSE_HEAD.NAME = "" + _C.MODEL.ROI_DENSEPOSE_HEAD.NUM_STACKED_CONVS = 8 + # Number of parts used for point labels + _C.MODEL.ROI_DENSEPOSE_HEAD.NUM_PATCHES = 24 + _C.MODEL.ROI_DENSEPOSE_HEAD.DECONV_KERNEL = 4 + _C.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_DIM = 512 + _C.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_KERNEL = 3 + _C.MODEL.ROI_DENSEPOSE_HEAD.UP_SCALE = 2 + _C.MODEL.ROI_DENSEPOSE_HEAD.HEATMAP_SIZE = 112 + _C.MODEL.ROI_DENSEPOSE_HEAD.POOLER_TYPE = "ROIAlignV2" + _C.MODEL.ROI_DENSEPOSE_HEAD.POOLER_RESOLUTION = 28 + _C.MODEL.ROI_DENSEPOSE_HEAD.POOLER_SAMPLING_RATIO = 2 + _C.MODEL.ROI_DENSEPOSE_HEAD.NUM_COARSE_SEGM_CHANNELS = 2 # 15 or 2 + # Overlap threshold for an RoI to be considered foreground (if >= FG_IOU_THRESHOLD) + _C.MODEL.ROI_DENSEPOSE_HEAD.FG_IOU_THRESHOLD = 0.7 + # Loss weights for annotation masks.(14 Parts) + _C.MODEL.ROI_DENSEPOSE_HEAD.INDEX_WEIGHTS = 5.0 + # Loss weights for surface parts. (24 Parts) + _C.MODEL.ROI_DENSEPOSE_HEAD.PART_WEIGHTS = 1.0 + # Loss weights for UV regression. + _C.MODEL.ROI_DENSEPOSE_HEAD.POINT_REGRESSION_WEIGHTS = 0.01 + # For Decoder + _C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_ON = True + _C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_NUM_CLASSES = 256 + _C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_CONV_DIMS = 256 + _C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_NORM = "" + _C.MODEL.ROI_DENSEPOSE_HEAD.DECODER_COMMON_STRIDE = 4 + # For DeepLab head + _C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB = CN() + _C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NORM = "GN" + _C.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NONLOCAL_ON = 0 + # Confidences + # Enable learning confidences (variances) along with the actual values + _C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE = CN({"ENABLED": False}) + # UV confidence lower bound + _C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.EPSILON = 0.01 + # Statistical model type for confidence learning, possible values: + # - "iid_iso": statistically independent identically distributed residuals + # with isotropic covariance + # - "indep_aniso": statistically independent residuals with anisotropic + # covariances + _C.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.TYPE = "iid_iso" diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/__init__.py new file mode 100644 index 0000000..5484f59 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from .build import build_detection_test_loader, build_detection_train_loader +from .dataset_mapper import DatasetMapper + +# ensure the builtin data are registered +from . import datasets + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/build.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/build.py new file mode 100644 index 0000000..c722ec1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/build.py @@ -0,0 +1,405 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import itertools +import logging +import numpy as np +import operator +from typing import Any, Callable, Collection, Dict, Iterable, List, Optional +import torch + +from detectron2.config import CfgNode +from detectron2.data import samplers +from detectron2.data.build import ( + load_proposals_into_dataset, + print_instances_class_histogram, + trivial_batch_collator, + worker_init_reset_seed, +) +from detectron2.data.catalog import DatasetCatalog, MetadataCatalog +from detectron2.data.common import AspectRatioGroupedDataset, DatasetFromList, MapDataset +from detectron2.utils.comm import get_world_size + +from .dataset_mapper import DatasetMapper +from .datasets.coco import DENSEPOSE_KEYS_WITHOUT_MASK as DENSEPOSE_COCO_KEYS_WITHOUT_MASK +from .datasets.coco import DENSEPOSE_MASK_KEY as DENSEPOSE_COCO_MASK_KEY + +__all__ = ["build_detection_train_loader", "build_detection_test_loader"] + + +Instance = Dict[str, Any] +InstancePredicate = Callable[[Instance], bool] + + +def _compute_num_images_per_worker(cfg: CfgNode): + num_workers = get_world_size() + images_per_batch = cfg.SOLVER.IMS_PER_BATCH + assert ( + images_per_batch % num_workers == 0 + ), "SOLVER.IMS_PER_BATCH ({}) must be divisible by the number of workers ({}).".format( + images_per_batch, num_workers + ) + assert ( + images_per_batch >= num_workers + ), "SOLVER.IMS_PER_BATCH ({}) must be larger than the number of workers ({}).".format( + images_per_batch, num_workers + ) + images_per_worker = images_per_batch // num_workers + return images_per_worker + + +def _map_category_id_to_contiguous_id(dataset_name: str, dataset_dicts: Iterable[Instance]): + meta = MetadataCatalog.get(dataset_name) + for dataset_dict in dataset_dicts: + for ann in dataset_dict["annotations"]: + ann["category_id"] = meta.thing_dataset_id_to_contiguous_id[ann["category_id"]] + + +def _add_category_id_to_contiguous_id_maps_to_metadata(dataset_names: Iterable[str]): + # merge categories for all data + merged_categories = {} + for dataset_name in dataset_names: + meta = MetadataCatalog.get(dataset_name) + for cat_id, cat_name in meta.categories.items(): + if cat_id not in merged_categories: + merged_categories[cat_id] = (cat_name, dataset_name) + continue + cat_name_other, dataset_name_other = merged_categories[cat_id] + if cat_name_other != cat_name: + raise ValueError( + f"Incompatible categories for category ID {cat_id}: " + f'dataset {dataset_name} value "{cat_name}", ' + f'dataset {dataset_name_other} value "{cat_name_other}"' + ) + + merged_cat_id_to_cont_id = {} + for i, cat_id in enumerate(sorted(merged_categories.keys())): + merged_cat_id_to_cont_id[cat_id] = i + + # add category maps to metadata + for dataset_name in dataset_names: + meta = MetadataCatalog.get(dataset_name) + categories = meta.get("categories") + meta.thing_classes = [categories[cat_id] for cat_id in sorted(categories.keys())] + meta.thing_dataset_id_to_contiguous_id = { + cat_id: merged_cat_id_to_cont_id[cat_id] for cat_id in sorted(categories.keys()) + } + meta.thing_contiguous_id_to_dataset_id = { + merged_cat_id_to_cont_id[cat_id]: cat_id for cat_id in sorted(categories.keys()) + } + + +def _maybe_create_general_keep_instance_predicate(cfg: CfgNode) -> Optional[InstancePredicate]: + def has_annotations(instance: Instance) -> bool: + return "annotations" in instance + + def has_only_crowd_anotations(instance: Instance) -> bool: + for ann in instance["annotations"]: + if ann.get("is_crowd", 0) == 0: + return False + return True + + def general_keep_instance_predicate(instance: Instance) -> bool: + return has_annotations(instance) and not has_only_crowd_anotations(instance) + + if not cfg.DATALOADER.FILTER_EMPTY_ANNOTATIONS: + return None + return general_keep_instance_predicate + + +def _maybe_create_keypoints_keep_instance_predicate(cfg: CfgNode) -> Optional[InstancePredicate]: + + min_num_keypoints = cfg.MODEL.ROI_KEYPOINT_HEAD.MIN_KEYPOINTS_PER_IMAGE + + def has_sufficient_num_keypoints(instance: Instance) -> bool: + num_kpts = sum( + (np.array(ann["keypoints"][2::3]) > 0).sum() + for ann in instance["annotations"] + if "keypoints" in ann + ) + return num_kpts >= min_num_keypoints + + if cfg.MODEL.KEYPOINT_ON and (min_num_keypoints > 0): + return has_sufficient_num_keypoints + return None + + +def _maybe_create_mask_keep_instance_predicate(cfg: CfgNode) -> Optional[InstancePredicate]: + if not cfg.MODEL.MASK_ON: + return None + + def has_mask_annotations(instance: Instance) -> bool: + return any("segmentation" in ann for ann in instance["annotations"]) + + return has_mask_annotations + + +def _maybe_create_densepose_keep_instance_predicate(cfg: CfgNode) -> Optional[InstancePredicate]: + if not cfg.MODEL.DENSEPOSE_ON: + return None + + def has_densepose_annotations(instance: Instance) -> bool: + for ann in instance["annotations"]: + if all(key in ann for key in DENSEPOSE_COCO_KEYS_WITHOUT_MASK) and ( + (DENSEPOSE_COCO_MASK_KEY in ann) or ("segmentation" in ann) + ): + return True + return False + + return has_densepose_annotations + + +def _maybe_create_specific_keep_instance_predicate(cfg: CfgNode) -> Optional[InstancePredicate]: + specific_predicate_creators = [ + _maybe_create_keypoints_keep_instance_predicate, + _maybe_create_mask_keep_instance_predicate, + _maybe_create_densepose_keep_instance_predicate, + ] + predicates = [creator(cfg) for creator in specific_predicate_creators] + predicates = [p for p in predicates if p is not None] + if not predicates: + return None + + def combined_predicate(instance: Instance) -> bool: + return any(p(instance) for p in predicates) + + return combined_predicate + + +def _get_train_keep_instance_predicate(cfg: CfgNode): + general_keep_predicate = _maybe_create_general_keep_instance_predicate(cfg) + combined_specific_keep_predicate = _maybe_create_specific_keep_instance_predicate(cfg) + + def combined_general_specific_keep_predicate(instance: Instance) -> bool: + return general_keep_predicate(instance) and combined_specific_keep_predicate(instance) + + if (general_keep_predicate is None) and (combined_specific_keep_predicate is None): + return None + if general_keep_predicate is None: + return combined_specific_keep_predicate + if combined_specific_keep_predicate is None: + return general_keep_predicate + return combined_general_specific_keep_predicate + + +def _get_test_keep_instance_predicate(cfg: CfgNode): + general_keep_predicate = _maybe_create_general_keep_instance_predicate(cfg) + return general_keep_predicate + + +def _maybe_filter_and_map_categories( + dataset_name: str, dataset_dicts: List[Instance] +) -> List[Instance]: + meta = MetadataCatalog.get(dataset_name) + whitelisted_categories = meta.get("whitelisted_categories") + category_map = meta.get("category_map", {}) + if whitelisted_categories is None and not category_map: + return dataset_dicts + filtered_dataset_dicts = [] + for dataset_dict in dataset_dicts: + anns = [] + for ann in dataset_dict["annotations"]: + cat_id = ann["category_id"] + if whitelisted_categories is not None and cat_id not in whitelisted_categories: + continue + ann["category_id"] = category_map.get(cat_id, cat_id) + anns.append(ann) + dataset_dict["annotations"] = anns + filtered_dataset_dicts.append(dataset_dict) + return filtered_dataset_dicts + + +def _add_category_whitelists_to_metadata(cfg: CfgNode): + for dataset_name, whitelisted_cat_ids in cfg.DATASETS.WHITELISTED_CATEGORIES.items(): + meta = MetadataCatalog.get(dataset_name) + meta.whitelisted_categories = whitelisted_cat_ids + logger = logging.getLogger(__name__) + logger.info( + "Whitelisted categories for dataset {}: {}".format( + dataset_name, meta.whitelisted_categories + ) + ) + + +def _add_category_maps_to_metadata(cfg: CfgNode): + for dataset_name, category_map in cfg.DATASETS.CATEGORY_MAPS.items(): + category_map = { + int(cat_id_src): int(cat_id_dst) for cat_id_src, cat_id_dst in category_map.items() + } + meta = MetadataCatalog.get(dataset_name) + meta.category_map = category_map + logger = logging.getLogger(__name__) + logger.info("Category maps for dataset {}: {}".format(dataset_name, meta.category_map)) + + +def combine_detection_dataset_dicts( + dataset_names: Collection[str], + keep_instance_predicate: Optional[InstancePredicate] = None, + proposal_files: Optional[Collection[str]] = None, +) -> List[Instance]: + """ + Load and prepare dataset dicts for training / testing + + Args: + dataset_names (Collection[str]): a list of dataset names + keep_instance_predicate (Callable: Dict[str, Any] -> bool): predicate + applied to instance dicts which defines whether to keep the instance + proposal_files (Collection[str]): if given, a list of object proposal files + that match each dataset in `dataset_names`. + """ + assert len(dataset_names) + if proposal_files is None: + proposal_files = [None] * len(dataset_names) + assert len(dataset_names) == len(proposal_files) + # load annotations and dataset metadata + dataset_map = {} + for dataset_name in dataset_names: + dataset_dicts = DatasetCatalog.get(dataset_name) + dataset_map[dataset_name] = dataset_dicts + # initialize category maps + _add_category_id_to_contiguous_id_maps_to_metadata(dataset_names) + # apply category maps + all_datasets_dicts = [] + for dataset_name, proposal_file in zip(dataset_names, proposal_files): + dataset_dicts = dataset_map[dataset_name] + assert len(dataset_dicts), f"Dataset '{dataset_name}' is empty!" + if proposal_file is not None: + dataset_dicts = load_proposals_into_dataset(dataset_dicts, proposal_file) + dataset_dicts = _maybe_filter_and_map_categories(dataset_name, dataset_dicts) + _map_category_id_to_contiguous_id(dataset_name, dataset_dicts) + print_instances_class_histogram( + dataset_dicts, MetadataCatalog.get(dataset_name).thing_classes + ) + all_datasets_dicts.append(dataset_dicts) + + if keep_instance_predicate is not None: + all_datasets_dicts_plain = [ + d + for d in itertools.chain.from_iterable(all_datasets_dicts) + if keep_instance_predicate(d) + ] + else: + all_datasets_dicts_plain = list(itertools.chain.from_iterable(all_datasets_dicts)) + return all_datasets_dicts_plain + + +def build_detection_train_loader(cfg: CfgNode, mapper=None): + """ + A data loader is created in a way similar to that of Detectron2. + The main differences are: + - it allows to combine data with different but compatible object category sets + + The data loader is created by the following steps: + 1. Use the dataset names in config to query :class:`DatasetCatalog`, and obtain a list of dicts. + 2. Start workers to work on the dicts. Each worker will: + * Map each metadata dict into another format to be consumed by the model. + * Batch them by simply putting dicts into a list. + The batched ``list[mapped_dict]`` is what this dataloader will return. + + Args: + cfg (CfgNode): the config + mapper (callable): a callable which takes a sample (dict) from dataset and + returns the format to be consumed by the model. + By default it will be `DatasetMapper(cfg, True)`. + + Returns: + an infinite iterator of training data + """ + images_per_worker = _compute_num_images_per_worker(cfg) + + _add_category_whitelists_to_metadata(cfg) + _add_category_maps_to_metadata(cfg) + dataset_dicts = combine_detection_dataset_dicts( + cfg.DATASETS.TRAIN, + keep_instance_predicate=_get_train_keep_instance_predicate(cfg), + proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, + ) + dataset = DatasetFromList(dataset_dicts, copy=False) + + if mapper is None: + mapper = DatasetMapper(cfg, True) + dataset = MapDataset(dataset, mapper) + + sampler_name = cfg.DATALOADER.SAMPLER_TRAIN + logger = logging.getLogger(__name__) + logger.info("Using training sampler {}".format(sampler_name)) + if sampler_name == "TrainingSampler": + sampler = samplers.TrainingSampler(len(dataset)) + elif sampler_name == "RepeatFactorTrainingSampler": + sampler = samplers.RepeatFactorTrainingSampler( + dataset_dicts, cfg.DATALOADER.REPEAT_THRESHOLD + ) + else: + raise ValueError("Unknown training sampler: {}".format(sampler_name)) + + if cfg.DATALOADER.ASPECT_RATIO_GROUPING: + data_loader = torch.utils.data.DataLoader( + dataset, + sampler=sampler, + num_workers=cfg.DATALOADER.NUM_WORKERS, + batch_sampler=None, + collate_fn=operator.itemgetter(0), # don't batch, but yield individual elements + worker_init_fn=worker_init_reset_seed, + ) # yield individual mapped dict + data_loader = AspectRatioGroupedDataset(data_loader, images_per_worker) + else: + batch_sampler = torch.utils.data.sampler.BatchSampler( + sampler, images_per_worker, drop_last=True + ) + # drop_last so the batch always have the same size + data_loader = torch.utils.data.DataLoader( + dataset, + num_workers=cfg.DATALOADER.NUM_WORKERS, + batch_sampler=batch_sampler, + collate_fn=trivial_batch_collator, + worker_init_fn=worker_init_reset_seed, + ) + + return data_loader + + +def build_detection_test_loader(cfg, dataset_name, mapper=None): + """ + Similar to `build_detection_train_loader`. + But this function uses the given `dataset_name` argument (instead of the names in cfg), + and uses batch size 1. + + Args: + cfg: a detectron2 CfgNode + dataset_name (str): a name of the dataset that's available in the DatasetCatalog + mapper (callable): a callable which takes a sample (dict) from dataset + and returns the format to be consumed by the model. + By default it will be `DatasetMapper(cfg, False)`. + + Returns: + DataLoader: a torch DataLoader, that loads the given detection + dataset, with test-time transformation and batching. + """ + _add_category_whitelists_to_metadata(cfg) + _add_category_maps_to_metadata(cfg) + dataset_dicts = combine_detection_dataset_dicts( + [dataset_name], + keep_instance_predicate=_get_test_keep_instance_predicate(cfg), + proposal_files=[ + cfg.DATASETS.PROPOSAL_FILES_TEST[list(cfg.DATASETS.TEST).index(dataset_name)] + ] + if cfg.MODEL.LOAD_PROPOSALS + else None, + ) + + dataset = DatasetFromList(dataset_dicts) + if mapper is None: + mapper = DatasetMapper(cfg, False) + dataset = MapDataset(dataset, mapper) + + sampler = samplers.InferenceSampler(len(dataset)) + # Always use 1 image per worker during inference since this is the + # standard when reporting inference time in papers. + batch_sampler = torch.utils.data.sampler.BatchSampler(sampler, 1, drop_last=False) + + data_loader = torch.utils.data.DataLoader( + dataset, + num_workers=cfg.DATALOADER.NUM_WORKERS, + batch_sampler=batch_sampler, + collate_fn=trivial_batch_collator, + ) + return data_loader diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/dataset_mapper.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/dataset_mapper.py new file mode 100644 index 0000000..f749767 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/dataset_mapper.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import copy +import torch +from fvcore.common.file_io import PathManager + +from detectron2.data import MetadataCatalog +from detectron2.data import detection_utils as utils +from detectron2.data import transforms as T + +from .structures import DensePoseDataRelative, DensePoseList, DensePoseTransformData + + +class DatasetMapper: + """ + A customized version of `detectron2.data.DatasetMapper` + """ + + def __init__(self, cfg, is_train=True): + self.tfm_gens = utils.build_transform_gen(cfg, is_train) + + # fmt: off + self.img_format = cfg.INPUT.FORMAT + self.mask_on = cfg.MODEL.MASK_ON + self.keypoint_on = cfg.MODEL.KEYPOINT_ON + self.densepose_on = cfg.MODEL.DENSEPOSE_ON + assert not cfg.MODEL.LOAD_PROPOSALS, "not supported yet" + # fmt: on + if self.keypoint_on and is_train: + # Flip only makes sense in training + self.keypoint_hflip_indices = utils.create_keypoint_hflip_indices(cfg.DATASETS.TRAIN) + else: + self.keypoint_hflip_indices = None + + if self.densepose_on: + densepose_transform_srcs = [ + MetadataCatalog.get(ds).densepose_transform_src + for ds in cfg.DATASETS.TRAIN + cfg.DATASETS.TEST + ] + assert len(densepose_transform_srcs) > 0 + # TODO: check that DensePose transformation data is the same for + # all the data. Otherwise one would have to pass DB ID with + # each entry to select proper transformation data. For now, since + # all DensePose annotated data uses the same data semantics, we + # omit this check. + densepose_transform_data_fpath = PathManager.get_local_path(densepose_transform_srcs[0]) + self.densepose_transform_data = DensePoseTransformData.load( + densepose_transform_data_fpath + ) + + self.is_train = is_train + + def __call__(self, dataset_dict): + """ + Args: + dataset_dict (dict): Metadata of one image, in Detectron2 Dataset format. + + Returns: + dict: a format that builtin models in detectron2 accept + """ + dataset_dict = copy.deepcopy(dataset_dict) # it will be modified by code below + image = utils.read_image(dataset_dict["file_name"], format=self.img_format) + utils.check_image_size(dataset_dict, image) + + image, transforms = T.apply_transform_gens(self.tfm_gens, image) + image_shape = image.shape[:2] # h, w + dataset_dict["image"] = torch.as_tensor(image.transpose(2, 0, 1).astype("float32")) + + if not self.is_train: + dataset_dict.pop("annotations", None) + return dataset_dict + + for anno in dataset_dict["annotations"]: + if not self.mask_on: + anno.pop("segmentation", None) + if not self.keypoint_on: + anno.pop("keypoints", None) + + # USER: Implement additional transformations if you have other types of data + # USER: Don't call transpose_densepose if you don't need + annos = [ + self._transform_densepose( + utils.transform_instance_annotations( + obj, transforms, image_shape, keypoint_hflip_indices=self.keypoint_hflip_indices + ), + transforms, + ) + for obj in dataset_dict.pop("annotations") + if obj.get("iscrowd", 0) == 0 + ] + instances = utils.annotations_to_instances(annos, image_shape) + + if len(annos) and "densepose" in annos[0]: + gt_densepose = [obj["densepose"] for obj in annos] + instances.gt_densepose = DensePoseList(gt_densepose, instances.gt_boxes, image_shape) + + dataset_dict["instances"] = instances[instances.gt_boxes.nonempty()] + return dataset_dict + + def _transform_densepose(self, annotation, transforms): + if not self.densepose_on: + return annotation + + # Handle densepose annotations + is_valid, reason_not_valid = DensePoseDataRelative.validate_annotation(annotation) + if is_valid: + densepose_data = DensePoseDataRelative(annotation, cleanup=True) + densepose_data.apply_transform(transforms, self.densepose_transform_data) + annotation["densepose"] = densepose_data + else: + # logger = logging.getLogger(__name__) + # logger.debug("Could not load DensePose annotation: {}".format(reason_not_valid)) + DensePoseDataRelative.cleanup_annotation(annotation) + # NOTE: annotations for certain instances may be unavailable. + # 'None' is accepted by the DensePostList data structure. + annotation["densepose"] = None + return annotation diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/__init__.py new file mode 100644 index 0000000..4a59d93 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from . import builtin # ensure the builtin data are registered + +__all__ = [k for k in globals().keys() if "builtin" not in k and not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/builtin.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/builtin.py new file mode 100644 index 0000000..e70f3d3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/builtin.py @@ -0,0 +1,10 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .coco import BASE_DATASETS as BASE_COCO_DATASETS +from .coco import DATASETS as COCO_DATASETS +from .coco import register_datasets as register_coco_datasets + +DEFAULT_DATASETS_ROOT = "data" + + +register_coco_datasets(COCO_DATASETS, DEFAULT_DATASETS_ROOT) +register_coco_datasets(BASE_COCO_DATASETS, DEFAULT_DATASETS_ROOT) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/coco.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/coco.py new file mode 100644 index 0000000..3a96474 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/datasets/coco.py @@ -0,0 +1,314 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import contextlib +import io +import logging +import os +from dataclasses import dataclass +from typing import Any, Dict, Iterable, List, Optional +from fvcore.common.file_io import PathManager +from fvcore.common.timer import Timer + +from detectron2.data import DatasetCatalog, MetadataCatalog +from detectron2.structures import BoxMode + +DENSEPOSE_MASK_KEY = "dp_masks" +DENSEPOSE_KEYS_WITHOUT_MASK = ["dp_x", "dp_y", "dp_I", "dp_U", "dp_V"] +DENSEPOSE_KEYS = DENSEPOSE_KEYS_WITHOUT_MASK + [DENSEPOSE_MASK_KEY] +DENSEPOSE_METADATA_URL_PREFIX = "https://dl.fbaipublicfiles.com/densepose/data/" + + +@dataclass +class CocoDatasetInfo: + name: str + images_root: str + annotations_fpath: str + + +DATASETS = [ + CocoDatasetInfo( + name="densepose_coco_2014_train", + images_root="coco/train2014", + annotations_fpath="coco/annotations/densepose_train2014.json", + ), + CocoDatasetInfo( + name="densepose_coco_2014_minival", + images_root="coco/val2014", + annotations_fpath="coco/annotations/densepose_minival2014.json", + ), + CocoDatasetInfo( + name="densepose_coco_2014_minival_100", + images_root="coco/val2014", + annotations_fpath="coco/annotations/densepose_minival2014_100.json", + ), + CocoDatasetInfo( + name="densepose_coco_2014_valminusminival", + images_root="coco/val2014", + annotations_fpath="coco/annotations/densepose_valminusminival2014.json", + ), + CocoDatasetInfo( + name="densepose_chimps", + images_root="densepose_evolution/densepose_chimps", + annotations_fpath="densepose_evolution/annotations/densepose_chimps_densepose.json", + ), +] + + +BASE_DATASETS = [ + CocoDatasetInfo( + name="base_coco_2017_train", + images_root="coco/train2017", + annotations_fpath="coco/annotations/instances_train2017.json", + ), + CocoDatasetInfo( + name="base_coco_2017_val", + images_root="coco/val2017", + annotations_fpath="coco/annotations/instances_val2017.json", + ), + CocoDatasetInfo( + name="base_coco_2017_val_100", + images_root="coco/val2017", + annotations_fpath="coco/annotations/instances_val2017_100.json", + ), +] + + +def _is_relative_local_path(path: os.PathLike): + path_str = os.fsdecode(path) + return ("://" not in path_str) and not os.path.isabs(path) + + +def _maybe_prepend_base_path(base_path: Optional[os.PathLike], path: os.PathLike): + """ + Prepends the provided path with a base path prefix if: + 1) base path is not None; + 2) path is a local path + """ + if base_path is None: + return path + if _is_relative_local_path(path): + return os.path.join(base_path, path) + return path + + +def get_metadata(base_path: Optional[os.PathLike]) -> Dict[str, Any]: + """ + Returns metadata associated with COCO DensePose data + + Args: + base_path: Optional[os.PathLike] + Base path used to load metadata from + + Returns: + Dict[str, Any] + Metadata in the form of a dictionary + """ + meta = { + "densepose_transform_src": _maybe_prepend_base_path( + base_path, "UV_symmetry_transforms.mat" + ), + "densepose_smpl_subdiv": _maybe_prepend_base_path(base_path, "SMPL_subdiv.mat"), + "densepose_smpl_subdiv_transform": _maybe_prepend_base_path( + base_path, "SMPL_SUBDIV_TRANSFORM.mat" + ), + } + return meta + + +def _load_coco_annotations(json_file: str): + """ + Load COCO annotations from a JSON file + + Args: + json_file: str + Path to the file to load annotations from + Returns: + Instance of `pycocotools.coco.COCO` that provides access to annotations + data + """ + from pycocotools.coco import COCO + + logger = logging.getLogger(__name__) + timer = Timer() + with contextlib.redirect_stdout(io.StringIO()): + coco_api = COCO(json_file) + if timer.seconds() > 1: + logger.info("Loading {} takes {:.2f} seconds.".format(json_file, timer.seconds())) + return coco_api + + +def _add_categories_metadata(dataset_name: str, categories: Dict[str, Any]): + meta = MetadataCatalog.get(dataset_name) + meta.categories = {c["id"]: c["name"] for c in categories} + logger = logging.getLogger(__name__) + logger.info("Dataset {} categories: {}".format(dataset_name, categories)) + + +def _verify_annotations_have_unique_ids(json_file: str, anns: List[List[Dict[str, Any]]]): + if "minival" in json_file: + # Skip validation on COCO2014 valminusminival and minival annotations + # The ratio of buggy annotations there is tiny and does not affect accuracy + # Therefore we explicitly white-list them + return + ann_ids = [ann["id"] for anns_per_image in anns for ann in anns_per_image] + assert len(set(ann_ids)) == len(ann_ids), "Annotation ids in '{}' are not unique!".format( + json_file + ) + + +def _maybe_add_bbox(obj: Dict[str, Any], ann_dict: Dict[str, Any]): + if "bbox" not in ann_dict: + return + obj["bbox"] = ann_dict["bbox"] + obj["bbox_mode"] = BoxMode.XYWH_ABS + + +def _maybe_add_segm(obj: Dict[str, Any], ann_dict: Dict[str, Any]): + if "segmentation" not in ann_dict: + return + segm = ann_dict["segmentation"] + if not isinstance(segm, dict): + # filter out invalid polygons (< 3 points) + segm = [poly for poly in segm if len(poly) % 2 == 0 and len(poly) >= 6] + if len(segm) == 0: + return + obj["segmentation"] = segm + + +def _maybe_add_keypoints(obj: Dict[str, Any], ann_dict: Dict[str, Any]): + if "keypoints" not in ann_dict: + return + keypts = ann_dict["keypoints"] # list[int] + for idx, v in enumerate(keypts): + if idx % 3 != 2: + # COCO's segmentation coordinates are floating points in [0, H or W], + # but keypoint coordinates are integers in [0, H-1 or W-1] + # Therefore we assume the coordinates are "pixel indices" and + # add 0.5 to convert to floating point coordinates. + keypts[idx] = v + 0.5 + obj["keypoints"] = keypts + + +def _maybe_add_densepose(obj: Dict[str, Any], ann_dict: Dict[str, Any]): + for key in DENSEPOSE_KEYS: + if key in ann_dict: + obj[key] = ann_dict[key] + + +def _combine_images_with_annotations( + dataset_name: str, + image_root: str, + img_datas: Iterable[Dict[str, Any]], + ann_datas: Iterable[Iterable[Dict[str, Any]]], +): + + ann_keys = ["iscrowd", "category_id"] + dataset_dicts = [] + + for img_dict, ann_dicts in zip(img_datas, ann_datas): + record = {} + record["file_name"] = os.path.join(image_root, img_dict["file_name"]) + record["height"] = img_dict["height"] + record["width"] = img_dict["width"] + record["image_id"] = img_dict["id"] + record["dataset"] = dataset_name + objs = [] + for ann_dict in ann_dicts: + assert ann_dict["image_id"] == record["image_id"] + assert ann_dict.get("ignore", 0) == 0 + obj = {key: ann_dict[key] for key in ann_keys if key in ann_dict} + _maybe_add_bbox(obj, ann_dict) + _maybe_add_segm(obj, ann_dict) + _maybe_add_keypoints(obj, ann_dict) + _maybe_add_densepose(obj, ann_dict) + objs.append(obj) + record["annotations"] = objs + dataset_dicts.append(record) + return dataset_dicts + + +def load_coco_json(annotations_json_file: str, image_root: str, dataset_name: str): + """ + Loads a JSON file with annotations in COCO instances format. + Replaces `detectron2.data.data.coco.load_coco_json` to handle metadata + in a more flexible way. Postpones category mapping to a later stage to be + able to combine several data with different (but coherent) sets of + categories. + + Args: + + annotations_json_file: str + Path to the JSON file with annotations in COCO instances format. + image_root: str + directory that contains all the images + dataset_name: str + the name that identifies a dataset, e.g. "densepose_coco_2014_train" + extra_annotation_keys: Optional[List[str]] + If provided, these keys are used to extract additional data from + the annotations. + """ + coco_api = _load_coco_annotations(PathManager.get_local_path(annotations_json_file)) + _add_categories_metadata(dataset_name, coco_api.loadCats(coco_api.getCatIds())) + # sort indices for reproducible results + img_ids = sorted(coco_api.imgs.keys()) + # imgs is a list of dicts, each looks something like: + # {'license': 4, + # 'url': 'http://farm6.staticflickr.com/5454/9413846304_881d5e5c3b_z.jpg', + # 'file_name': 'COCO_val2014_000000001268.jpg', + # 'height': 427, + # 'width': 640, + # 'date_captured': '2013-11-17 05:57:24', + # 'id': 1268} + imgs = coco_api.loadImgs(img_ids) + logger = logging.getLogger(__name__) + logger.info("Loaded {} images in COCO format from {}".format(len(imgs), annotations_json_file)) + # anns is a list[list[dict]], where each dict is an annotation + # record for an object. The inner list enumerates the objects in an image + # and the outer list enumerates over images. + anns = [coco_api.imgToAnns[img_id] for img_id in img_ids] + _verify_annotations_have_unique_ids(annotations_json_file, anns) + dataset_records = _combine_images_with_annotations(dataset_name, image_root, imgs, anns) + return dataset_records + + +def register_dataset(dataset_data: CocoDatasetInfo, datasets_root: Optional[os.PathLike] = None): + """ + Registers provided COCO DensePose dataset + + Args: + dataset_data: CocoDatasetInfo + Dataset data + datasets_root: Optional[os.PathLike] + Datasets root folder (default: None) + """ + annotations_fpath = _maybe_prepend_base_path(datasets_root, dataset_data.annotations_fpath) + images_root = _maybe_prepend_base_path(datasets_root, dataset_data.images_root) + + def load_annotations(): + return load_coco_json( + annotations_json_file=annotations_fpath, + image_root=images_root, + dataset_name=dataset_data.name, + ) + + DatasetCatalog.register(dataset_data.name, load_annotations) + MetadataCatalog.get(dataset_data.name).set( + json_file=annotations_fpath, + image_root=images_root, + **get_metadata(DENSEPOSE_METADATA_URL_PREFIX) + ) + + +def register_datasets( + datasets_data: Iterable[CocoDatasetInfo], datasets_root: Optional[os.PathLike] = None +): + """ + Registers provided COCO DensePose data + + Args: + datasets_data: Iterable[CocoDatasetInfo] + An iterable of dataset datas + datasets_root: Optional[os.PathLike] + Datasets root folder (default: None) + """ + for dataset_data in datasets_data: + register_dataset(dataset_data, datasets_root) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/structures.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/structures.py new file mode 100644 index 0000000..bbb950b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/data/structures.py @@ -0,0 +1,579 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import base64 +import numpy as np +from io import BytesIO +import torch +from PIL import Image +from torch.nn import functional as F + + +class DensePoseTransformData(object): + + # Horizontal symmetry label transforms used for horizontal flip + MASK_LABEL_SYMMETRIES = [0, 1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14] + # fmt: off + POINT_LABEL_SYMMETRIES = [ 0, 1, 2, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15, 18, 17, 20, 19, 22, 21, 24, 23] # noqa + # fmt: on + + def __init__(self, uv_symmetries): + self.mask_label_symmetries = DensePoseTransformData.MASK_LABEL_SYMMETRIES + self.point_label_symmetries = DensePoseTransformData.POINT_LABEL_SYMMETRIES + self.uv_symmetries = uv_symmetries + + @staticmethod + def load(fpath): + import scipy.io + + uv_symmetry_map = scipy.io.loadmat(fpath) + uv_symmetry_map_torch = {} + for key in ["U_transforms", "V_transforms"]: + uv_symmetry_map_torch[key] = [] + map_src = uv_symmetry_map[key] + map_dst = uv_symmetry_map_torch[key] + for i in range(map_src.shape[1]): + map_dst.append(torch.from_numpy(map_src[0, i]).to(dtype=torch.float)) + uv_symmetry_map_torch[key] = torch.stack(map_dst, dim=0).to( + device=torch.cuda.current_device() + ) + transform_data = DensePoseTransformData(uv_symmetry_map_torch) + return transform_data + + +class DensePoseDataRelative(object): + """ + Dense pose relative annotations that can be applied to any bounding box: + x - normalized X coordinates [0, 255] of annotated points + y - normalized Y coordinates [0, 255] of annotated points + i - body part labels 0,...,24 for annotated points + u - body part U coordinates [0, 1] for annotated points + v - body part V coordinates [0, 1] for annotated points + segm - 256x256 segmentation mask with values 0,...,14 + To obtain absolute x and y data wrt some bounding box one needs to first + divide the data by 256, multiply by the respective bounding box size + and add bounding box offset: + x_img = x0 + x_norm * w / 256.0 + y_img = y0 + y_norm * h / 256.0 + Segmentation masks are typically sampled to get image-based masks. + """ + + # Key for normalized X coordinates in annotation dict + X_KEY = "dp_x" + # Key for normalized Y coordinates in annotation dict + Y_KEY = "dp_y" + # Key for U part coordinates in annotation dict + U_KEY = "dp_U" + # Key for V part coordinates in annotation dict + V_KEY = "dp_V" + # Key for I point labels in annotation dict + I_KEY = "dp_I" + # Key for segmentation mask in annotation dict + S_KEY = "dp_masks" + # Number of body parts in segmentation masks + N_BODY_PARTS = 14 + # Number of parts in point labels + N_PART_LABELS = 24 + MASK_SIZE = 256 + + def __init__(self, annotation, cleanup=False): + is_valid, reason_not_valid = DensePoseDataRelative.validate_annotation(annotation) + assert is_valid, "Invalid DensePose annotations: {}".format(reason_not_valid) + self.x = torch.as_tensor(annotation[DensePoseDataRelative.X_KEY]) + self.y = torch.as_tensor(annotation[DensePoseDataRelative.Y_KEY]) + self.i = torch.as_tensor(annotation[DensePoseDataRelative.I_KEY]) + self.u = torch.as_tensor(annotation[DensePoseDataRelative.U_KEY]) + self.v = torch.as_tensor(annotation[DensePoseDataRelative.V_KEY]) + self.segm = DensePoseDataRelative.extract_segmentation_mask(annotation) + self.device = torch.device("cpu") + if cleanup: + DensePoseDataRelative.cleanup_annotation(annotation) + + def to(self, device): + if self.device == device: + return self + new_data = DensePoseDataRelative.__new__(DensePoseDataRelative) + new_data.x = self.x + new_data.x = self.x.to(device) + new_data.y = self.y.to(device) + new_data.i = self.i.to(device) + new_data.u = self.u.to(device) + new_data.v = self.v.to(device) + new_data.segm = self.segm.to(device) + new_data.device = device + return new_data + + @staticmethod + def extract_segmentation_mask(annotation): + import pycocotools.mask as mask_utils + + poly_specs = annotation[DensePoseDataRelative.S_KEY] + segm = torch.zeros((DensePoseDataRelative.MASK_SIZE,) * 2, dtype=torch.float32) + for i in range(DensePoseDataRelative.N_BODY_PARTS): + poly_i = poly_specs[i] + if poly_i: + mask_i = mask_utils.decode(poly_i) + segm[mask_i > 0] = i + 1 + return segm + + @staticmethod + def validate_annotation(annotation): + for key in [ + DensePoseDataRelative.X_KEY, + DensePoseDataRelative.Y_KEY, + DensePoseDataRelative.I_KEY, + DensePoseDataRelative.U_KEY, + DensePoseDataRelative.V_KEY, + DensePoseDataRelative.S_KEY, + ]: + if key not in annotation: + return False, "no {key} data in the annotation".format(key=key) + return True, None + + @staticmethod + def cleanup_annotation(annotation): + for key in [ + DensePoseDataRelative.X_KEY, + DensePoseDataRelative.Y_KEY, + DensePoseDataRelative.I_KEY, + DensePoseDataRelative.U_KEY, + DensePoseDataRelative.V_KEY, + DensePoseDataRelative.S_KEY, + ]: + if key in annotation: + del annotation[key] + + def apply_transform(self, transforms, densepose_transform_data): + self._transform_pts(transforms, densepose_transform_data) + self._transform_segm(transforms, densepose_transform_data) + + def _transform_pts(self, transforms, dp_transform_data): + import detectron2.data.transforms as T + + # NOTE: This assumes that HorizFlipTransform is the only one that does flip + do_hflip = sum(isinstance(t, T.HFlipTransform) for t in transforms.transforms) % 2 == 1 + if do_hflip: + self.x = self.segm.size(1) - self.x + self._flip_iuv_semantics(dp_transform_data) + + def _flip_iuv_semantics(self, dp_transform_data: DensePoseTransformData) -> None: + i_old = self.i.clone() + uv_symmetries = dp_transform_data.uv_symmetries + pt_label_symmetries = dp_transform_data.point_label_symmetries + for i in range(self.N_PART_LABELS): + if i + 1 in i_old: + annot_indices_i = i_old == i + 1 + if pt_label_symmetries[i + 1] != i + 1: + self.i[annot_indices_i] = pt_label_symmetries[i + 1] + u_loc = (self.u[annot_indices_i] * 255).long() + v_loc = (self.v[annot_indices_i] * 255).long() + self.u[annot_indices_i] = uv_symmetries["U_transforms"][i][v_loc, u_loc].to( + device=self.u.device + ) + self.v[annot_indices_i] = uv_symmetries["V_transforms"][i][v_loc, u_loc].to( + device=self.v.device + ) + + def _transform_segm(self, transforms, dp_transform_data): + import detectron2.data.transforms as T + + # NOTE: This assumes that HorizFlipTransform is the only one that does flip + do_hflip = sum(isinstance(t, T.HFlipTransform) for t in transforms.transforms) % 2 == 1 + if do_hflip: + self.segm = torch.flip(self.segm, [1]) + self._flip_segm_semantics(dp_transform_data) + + def _flip_segm_semantics(self, dp_transform_data): + old_segm = self.segm.clone() + mask_label_symmetries = dp_transform_data.mask_label_symmetries + for i in range(self.N_BODY_PARTS): + if mask_label_symmetries[i + 1] != i + 1: + self.segm[old_segm == i + 1] = mask_label_symmetries[i + 1] + + +def normalized_coords_transform(x0, y0, w, h): + """ + Coordinates transform that maps top left corner to (-1, -1) and bottom + right corner to (1, 1). Used for torch.grid_sample to initialize the + grid + """ + + def f(p): + return (2 * (p[0] - x0) / w - 1, 2 * (p[1] - y0) / h - 1) + + return f + + +class DensePoseOutput(object): + def __init__(self, S, I, U, V, confidences): + """ + Args: + S (`torch.Tensor`): coarse segmentation tensor of size (N, A, H, W) + I (`torch.Tensor`): fine segmentation tensor of size (N, C, H, W) + U (`torch.Tensor`): U coordinates for each fine segmentation label of size (N, C, H, W) + V (`torch.Tensor`): V coordinates for each fine segmentation label of size (N, C, H, W) + confidences (dict of str -> `torch.Tensor`) estimated confidence model parameters + """ + self.S = S + self.I = I # noqa: E741 + self.U = U + self.V = V + self.confidences = confidences + self._check_output_dims(S, I, U, V) + + def _check_output_dims(self, S, I, U, V): + assert ( + len(S.size()) == 4 + ), "Segmentation output should have 4 " "dimensions (NCHW), but has size {}".format( + S.size() + ) + assert ( + len(I.size()) == 4 + ), "Segmentation output should have 4 " "dimensions (NCHW), but has size {}".format( + S.size() + ) + assert ( + len(U.size()) == 4 + ), "Segmentation output should have 4 " "dimensions (NCHW), but has size {}".format( + S.size() + ) + assert ( + len(V.size()) == 4 + ), "Segmentation output should have 4 " "dimensions (NCHW), but has size {}".format( + S.size() + ) + assert len(S) == len(I), ( + "Number of output segmentation planes {} " + "should be equal to the number of output part index " + "planes {}".format(len(S), len(I)) + ) + assert S.size()[2:] == I.size()[2:], ( + "Output segmentation plane size {} " + "should be equal to the output part index " + "plane size {}".format(S.size()[2:], I.size()[2:]) + ) + assert I.size() == U.size(), ( + "Part index output shape {} " + "should be the same as U coordinates output shape {}".format(I.size(), U.size()) + ) + assert I.size() == V.size(), ( + "Part index output shape {} " + "should be the same as V coordinates output shape {}".format(I.size(), V.size()) + ) + + def resize(self, image_size_hw): + # do nothing - outputs are invariant to resize + pass + + def _crop(self, S, I, U, V, bbox_old_xywh, bbox_new_xywh): + """ + Resample S, I, U, V from bbox_old to the cropped bbox_new + """ + x0old, y0old, wold, hold = bbox_old_xywh + x0new, y0new, wnew, hnew = bbox_new_xywh + tr_coords = normalized_coords_transform(x0old, y0old, wold, hold) + topleft = (x0new, y0new) + bottomright = (x0new + wnew, y0new + hnew) + topleft_norm = tr_coords(topleft) + bottomright_norm = tr_coords(bottomright) + hsize = S.size(1) + wsize = S.size(2) + grid = torch.meshgrid( + torch.arange( + topleft_norm[1], + bottomright_norm[1], + (bottomright_norm[1] - topleft_norm[1]) / hsize, + )[:hsize], + torch.arange( + topleft_norm[0], + bottomright_norm[0], + (bottomright_norm[0] - topleft_norm[0]) / wsize, + )[:wsize], + ) + grid = torch.stack(grid, dim=2).to(S.device) + assert ( + grid.size(0) == hsize + ), "Resampled grid expected " "height={}, actual height={}".format(hsize, grid.size(0)) + assert grid.size(1) == wsize, "Resampled grid expected " "width={}, actual width={}".format( + wsize, grid.size(1) + ) + S_new = F.grid_sample( + S.unsqueeze(0), + torch.unsqueeze(grid, 0), + mode="bilinear", + padding_mode="border", + align_corners=True, + ).squeeze(0) + I_new = F.grid_sample( + I.unsqueeze(0), + torch.unsqueeze(grid, 0), + mode="bilinear", + padding_mode="border", + align_corners=True, + ).squeeze(0) + U_new = F.grid_sample( + U.unsqueeze(0), + torch.unsqueeze(grid, 0), + mode="bilinear", + padding_mode="border", + align_corners=True, + ).squeeze(0) + V_new = F.grid_sample( + V.unsqueeze(0), + torch.unsqueeze(grid, 0), + mode="bilinear", + padding_mode="border", + align_corners=True, + ).squeeze(0) + return S_new, I_new, U_new, V_new + + def crop(self, indices_cropped, bboxes_old, bboxes_new): + """ + Crop outputs for selected bounding boxes to the new bounding boxes. + """ + # VK: cropping is ignored for now + # for i, ic in enumerate(indices_cropped): + # self.S[ic], self.I[ic], self.U[ic], self.V[ic] = \ + # self._crop(self.S[ic], self.I[ic], self.U[ic], self.V[ic], + # bboxes_old[i], bboxes_new[i]) + pass + + def hflip(self, transform_data: DensePoseTransformData) -> None: + """ + Change S, I, U and V to take into account a Horizontal flip. + """ + if self.I.shape[0] > 0: + for el in "SIUV": + self.__dict__[el] = torch.flip(self.__dict__[el], [3]) + self._flip_iuv_semantics_tensor(transform_data) + self._flip_segm_semantics_tensor(transform_data) + + def _flip_iuv_semantics_tensor(self, dp_transform_data: DensePoseTransformData) -> None: + point_label_symmetries = dp_transform_data.point_label_symmetries + uv_symmetries = dp_transform_data.uv_symmetries + + N, C, H, W = self.U.shape + u_loc = (self.U[:, 1:, :, :].clamp(0, 1) * 255).long() + v_loc = (self.V[:, 1:, :, :].clamp(0, 1) * 255).long() + Iindex = torch.arange(C - 1, device=self.U.device)[None, :, None, None].expand( + N, C - 1, H, W + ) + self.U[:, 1:, :, :] = uv_symmetries["U_transforms"][Iindex, v_loc, u_loc].to( + device=self.U.device + ) + self.V[:, 1:, :, :] = uv_symmetries["V_transforms"][Iindex, v_loc, u_loc].to( + device=self.V.device + ) + + for el in "IUV": + self.__dict__[el] = self.__dict__[el][:, point_label_symmetries, :, :] + + def _flip_segm_semantics_tensor(self, dp_transform_data): + if self.S.shape[1] == DensePoseDataRelative.N_BODY_PARTS + 1: + self.S = self.S[:, dp_transform_data.mask_label_symmetries, :, :] + + def to_result(self, boxes_xywh): + """ + Convert DensePose outputs to results format. Results are more compact, + but cannot be resampled any more + """ + result = DensePoseResult(boxes_xywh, self.S, self.I, self.U, self.V) + return result + + def __getitem__(self, item): + if isinstance(item, int): + S_selected = self.S[item].unsqueeze(0) + I_selected = self.I[item].unsqueeze(0) + U_selected = self.U[item].unsqueeze(0) + V_selected = self.V[item].unsqueeze(0) + conf_selected = {} + for key in self.confidences: + conf_selected[key] = self.confidences[key][item].unsqueeze(0) + else: + S_selected = self.S[item] + I_selected = self.I[item] + U_selected = self.U[item] + V_selected = self.V[item] + conf_selected = {} + for key in self.confidences: + conf_selected[key] = self.confidences[key][item] + return DensePoseOutput(S_selected, I_selected, U_selected, V_selected, conf_selected) + + def __str__(self): + s = "DensePoseOutput S {}, I {}, U {}, V {}".format( + list(self.S.size()), list(self.I.size()), list(self.U.size()), list(self.V.size()) + ) + s_conf = "confidences: [{}]".format( + ", ".join([f"{key} {list(self.confidences[key].size())}" for key in self.confidences]) + ) + return ", ".join([s, s_conf]) + + def __len__(self): + return self.S.size(0) + + +class DensePoseResult(object): + def __init__(self, boxes_xywh, S, I, U, V): + self.results = [] + self.boxes_xywh = boxes_xywh.cpu().tolist() + assert len(boxes_xywh.size()) == 2 + assert boxes_xywh.size(1) == 4 + for i, box_xywh in enumerate(boxes_xywh): + result_i = self._output_to_result(box_xywh, S[[i]], I[[i]], U[[i]], V[[i]]) + result_numpy_i = result_i.cpu().numpy() + result_encoded_i = DensePoseResult.encode_png_data(result_numpy_i) + result_encoded_with_shape_i = (result_numpy_i.shape, result_encoded_i) + self.results.append(result_encoded_with_shape_i) + + def __str__(self): + s = "DensePoseResult: N={} [{}]".format( + len(self.results), ", ".join([str(list(r[0])) for r in self.results]) + ) + return s + + def _output_to_result(self, box_xywh, S, I, U, V): + x, y, w, h = box_xywh + w = max(int(w), 1) + h = max(int(h), 1) + result = torch.zeros([3, h, w], dtype=torch.uint8, device=U.device) + assert ( + len(S.size()) == 4 + ), "AnnIndex tensor size should have {} " "dimensions but has {}".format(4, len(S.size())) + s_bbox = F.interpolate(S, (h, w), mode="bilinear", align_corners=False).argmax(dim=1) + assert ( + len(I.size()) == 4 + ), "IndexUV tensor size should have {} " "dimensions but has {}".format(4, len(S.size())) + i_bbox = ( + F.interpolate(I, (h, w), mode="bilinear", align_corners=False).argmax(dim=1) + * (s_bbox > 0).long() + ).squeeze(0) + assert len(U.size()) == 4, "U tensor size should have {} " "dimensions but has {}".format( + 4, len(U.size()) + ) + u_bbox = F.interpolate(U, (h, w), mode="bilinear", align_corners=False) + assert len(V.size()) == 4, "V tensor size should have {} " "dimensions but has {}".format( + 4, len(V.size()) + ) + v_bbox = F.interpolate(V, (h, w), mode="bilinear", align_corners=False) + result[0] = i_bbox + for part_id in range(1, u_bbox.size(1)): + result[1][i_bbox == part_id] = ( + (u_bbox[0, part_id][i_bbox == part_id] * 255).clamp(0, 255).to(torch.uint8) + ) + result[2][i_bbox == part_id] = ( + (v_bbox[0, part_id][i_bbox == part_id] * 255).clamp(0, 255).to(torch.uint8) + ) + assert ( + result.size(1) == h + ), "Results height {} should be equal" "to bounding box height {}".format(result.size(1), h) + assert ( + result.size(2) == w + ), "Results width {} should be equal" "to bounding box width {}".format(result.size(2), w) + return result + + @staticmethod + def encode_png_data(arr): + """ + Encode array data as a PNG image using the highest compression rate + @param arr [in] Data stored in an array of size (3, M, N) of type uint8 + @return Base64-encoded string containing PNG-compressed data + """ + assert len(arr.shape) == 3, "Expected a 3D array as an input," " got a {0}D array".format( + len(arr.shape) + ) + assert arr.shape[0] == 3, "Expected first array dimension of size 3," " got {0}".format( + arr.shape[0] + ) + assert arr.dtype == np.uint8, "Expected an array of type np.uint8, " " got {0}".format( + arr.dtype + ) + data = np.moveaxis(arr, 0, -1) + im = Image.fromarray(data) + fstream = BytesIO() + im.save(fstream, format="png", optimize=True) + s = base64.encodebytes(fstream.getvalue()).decode() + return s + + @staticmethod + def decode_png_data(shape, s): + """ + Decode array data from a string that contains PNG-compressed data + @param Base64-encoded string containing PNG-compressed data + @return Data stored in an array of size (3, M, N) of type uint8 + """ + fstream = BytesIO(base64.decodebytes(s.encode())) + im = Image.open(fstream) + data = np.moveaxis(np.array(im.getdata(), dtype=np.uint8), -1, 0) + return data.reshape(shape) + + def __len__(self): + return len(self.results) + + def __getitem__(self, item): + result_encoded = self.results[item] + bbox_xywh = self.boxes_xywh[item] + return result_encoded, bbox_xywh + + +class DensePoseList(object): + + _TORCH_DEVICE_CPU = torch.device("cpu") + + def __init__(self, densepose_datas, boxes_xyxy_abs, image_size_hw, device=_TORCH_DEVICE_CPU): + assert len(densepose_datas) == len( + boxes_xyxy_abs + ), "Attempt to initialize DensePoseList with {} DensePose datas " "and {} boxes".format( + len(densepose_datas), len(boxes_xyxy_abs) + ) + self.densepose_datas = [] + for densepose_data in densepose_datas: + assert isinstance(densepose_data, DensePoseDataRelative) or densepose_data is None, ( + "Attempt to initialize DensePoseList with DensePose datas " + "of type {}, expected DensePoseDataRelative".format(type(densepose_data)) + ) + densepose_data_ondevice = ( + densepose_data.to(device) if densepose_data is not None else None + ) + self.densepose_datas.append(densepose_data_ondevice) + self.boxes_xyxy_abs = boxes_xyxy_abs.to(device) + self.image_size_hw = image_size_hw + self.device = device + + def to(self, device): + if self.device == device: + return self + return DensePoseList(self.densepose_datas, self.boxes_xyxy_abs, self.image_size_hw, device) + + def __iter__(self): + return iter(self.densepose_datas) + + def __len__(self): + return len(self.densepose_datas) + + def __repr__(self): + s = self.__class__.__name__ + "(" + s += "num_instances={}, ".format(len(self.densepose_datas)) + s += "image_width={}, ".format(self.image_size_hw[1]) + s += "image_height={})".format(self.image_size_hw[0]) + return s + + def __getitem__(self, item): + if isinstance(item, int): + densepose_data_rel = self.densepose_datas[item] + return densepose_data_rel + elif isinstance(item, slice): + densepose_datas_rel = self.densepose_datas[item] + boxes_xyxy_abs = self.boxes_xyxy_abs[item] + return DensePoseList( + densepose_datas_rel, boxes_xyxy_abs, self.image_size_hw, self.device + ) + elif isinstance(item, torch.Tensor) and (item.dtype == torch.bool): + densepose_datas_rel = [self.densepose_datas[i] for i, x in enumerate(item) if x > 0] + boxes_xyxy_abs = self.boxes_xyxy_abs[item] + return DensePoseList( + densepose_datas_rel, boxes_xyxy_abs, self.image_size_hw, self.device + ) + else: + densepose_datas_rel = [self.densepose_datas[i] for i in item] + boxes_xyxy_abs = self.boxes_xyxy_abs[item] + return DensePoseList( + densepose_datas_rel, boxes_xyxy_abs, self.image_size_hw, self.device + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_coco_evaluation.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_coco_evaluation.py new file mode 100644 index 0000000..489e7b0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_coco_evaluation.py @@ -0,0 +1,1138 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# This is a modified version of cocoeval.py where we also have the densepose evaluation. + +__author__ = "tsungyi" + +import copy +import datetime +import itertools +import logging +import numpy as np +import pickle +import time +from collections import defaultdict +from enum import Enum +from typing import Any, Dict, Tuple +import scipy.spatial.distance as ssd +from fvcore.common.file_io import PathManager +from pycocotools import mask as maskUtils +from scipy.io import loadmat +from scipy.ndimage import zoom as spzoom + +from .data.structures import DensePoseDataRelative, DensePoseResult + +logger = logging.getLogger(__name__) + + +class DensePoseEvalMode(str, Enum): + # use both masks and geodesic distances (GPS * IOU) to compute scores + GPSM = "gpsm" + # use only geodesic distances (GPS) to compute scores + GPS = "gps" + # use only masks (IOU) to compute scores + IOU = "iou" + + +class DensePoseDataMode(str, Enum): + # use estimated IUV data (default mode) + IUV_DT = "iuvdt" + # use ground truth IUV data + IUV_GT = "iuvgt" + # use ground truth labels I and set UV to 0 + I_GT_UV_0 = "igtuv0" + # use ground truth labels I and estimated UV coordinates + I_GT_UV_DT = "igtuvdt" + # use estimated labels I and set UV to 0 + I_DT_UV_0 = "idtuv0" + + +class DensePoseCocoEval(object): + # Interface for evaluating detection on the Microsoft COCO dataset. + # + # The usage for CocoEval is as follows: + # cocoGt=..., cocoDt=... # load dataset and results + # E = CocoEval(cocoGt,cocoDt); # initialize CocoEval object + # E.params.recThrs = ...; # set parameters as desired + # E.evaluate(); # run per image evaluation + # E.accumulate(); # accumulate per image results + # E.summarize(); # display summary metrics of results + # For example usage see evalDemo.m and http://mscoco.org/. + # + # The evaluation parameters are as follows (defaults in brackets): + # imgIds - [all] N demo ids to use for evaluation + # catIds - [all] K cat ids to use for evaluation + # iouThrs - [.5:.05:.95] T=10 IoU thresholds for evaluation + # recThrs - [0:.01:1] R=101 recall thresholds for evaluation + # areaRng - [...] A=4 object area ranges for evaluation + # maxDets - [1 10 100] M=3 thresholds on max detections per image + # iouType - ['segm'] set iouType to 'segm', 'bbox', 'keypoints' or 'densepose' + # iouType replaced the now DEPRECATED useSegm parameter. + # useCats - [1] if true use category labels for evaluation + # Note: if useCats=0 category labels are ignored as in proposal scoring. + # Note: multiple areaRngs [Ax2] and maxDets [Mx1] can be specified. + # + # evaluate(): evaluates detections on every image and every category and + # concats the results into the "evalImgs" with fields: + # dtIds - [1xD] id for each of the D detections (dt) + # gtIds - [1xG] id for each of the G ground truths (gt) + # dtMatches - [TxD] matching gt id at each IoU or 0 + # gtMatches - [TxG] matching dt id at each IoU or 0 + # dtScores - [1xD] confidence of each dt + # gtIgnore - [1xG] ignore flag for each gt + # dtIgnore - [TxD] ignore flag for each dt at each IoU + # + # accumulate(): accumulates the per-image, per-category evaluation + # results in "evalImgs" into the dictionary "eval" with fields: + # params - parameters used for evaluation + # date - date evaluation was performed + # counts - [T,R,K,A,M] parameter dimensions (see above) + # precision - [TxRxKxAxM] precision for every evaluation setting + # recall - [TxKxAxM] max recall for every evaluation setting + # Note: precision and recall==-1 for settings with no gt objects. + # + # See also coco, mask, pycocoDemo, pycocoEvalDemo + # + # Microsoft COCO Toolbox. version 2.0 + # Data, paper, and tutorials available at: http://mscoco.org/ + # Code written by Piotr Dollar and Tsung-Yi Lin, 2015. + # Licensed under the Simplified BSD License [see coco/license.txt] + def __init__( + self, + cocoGt=None, + cocoDt=None, + iouType: str = "densepose", + dpEvalMode: DensePoseEvalMode = DensePoseEvalMode.GPS, + dpDataMode: DensePoseDataMode = DensePoseDataMode.IUV_DT, + ): + """ + Initialize CocoEval using coco APIs for gt and dt + :param cocoGt: coco object with ground truth annotations + :param cocoDt: coco object with detection results + :return: None + """ + self.cocoGt = cocoGt # ground truth COCO API + self.cocoDt = cocoDt # detections COCO API + self._dpEvalMode = dpEvalMode + self._dpDataMode = dpDataMode + self.params = {} # evaluation parameters + self.evalImgs = defaultdict(list) # per-image per-category eval results [KxAxI] + self.eval = {} # accumulated evaluation results + self._gts = defaultdict(list) # gt for evaluation + self._dts = defaultdict(list) # dt for evaluation + self.params = Params(iouType=iouType) # parameters + self._paramsEval = {} # parameters for evaluation + self.stats = [] # result summarization + self.ious = {} # ious between all gts and dts + if cocoGt is not None: + self.params.imgIds = sorted(cocoGt.getImgIds()) + self.params.catIds = sorted(cocoGt.getCatIds()) + self.ignoreThrBB = 0.7 + self.ignoreThrUV = 0.9 + + def _loadGEval(self): + smpl_subdiv_fpath = PathManager.get_local_path( + "https://dl.fbaipublicfiles.com/densepose/data/SMPL_subdiv.mat" + ) + pdist_transform_fpath = PathManager.get_local_path( + "https://dl.fbaipublicfiles.com/densepose/data/SMPL_SUBDIV_TRANSFORM.mat" + ) + pdist_matrix_fpath = PathManager.get_local_path( + "https://dl.fbaipublicfiles.com/densepose/data/Pdist_matrix.pkl", timeout_sec=120 + ) + SMPL_subdiv = loadmat(smpl_subdiv_fpath) + self.PDIST_transform = loadmat(pdist_transform_fpath) + self.PDIST_transform = self.PDIST_transform["index"].squeeze() + UV = np.array([SMPL_subdiv["U_subdiv"], SMPL_subdiv["V_subdiv"]]).squeeze() + ClosestVertInds = np.arange(UV.shape[1]) + 1 + self.Part_UVs = [] + self.Part_ClosestVertInds = [] + for i in np.arange(24): + self.Part_UVs.append(UV[:, SMPL_subdiv["Part_ID_subdiv"].squeeze() == (i + 1)]) + self.Part_ClosestVertInds.append( + ClosestVertInds[SMPL_subdiv["Part_ID_subdiv"].squeeze() == (i + 1)] + ) + + with open(pdist_matrix_fpath, "rb") as hFile: + arrays = pickle.load(hFile, encoding="latin1") + self.Pdist_matrix = arrays["Pdist_matrix"] + self.Part_ids = np.array(SMPL_subdiv["Part_ID_subdiv"].squeeze()) + # Mean geodesic distances for parts. + self.Mean_Distances = np.array([0, 0.351, 0.107, 0.126, 0.237, 0.173, 0.142, 0.128, 0.150]) + # Coarse Part labels. + self.CoarseParts = np.array( + [0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8] + ) + + def _prepare(self): + """ + Prepare ._gts and ._dts for evaluation based on params + :return: None + """ + + def _toMask(anns, coco): + # modify ann['segmentation'] by reference + for ann in anns: + rle = coco.annToRLE(ann) + ann["segmentation"] = rle + + def _getIgnoreRegion(iid, coco): + img = coco.imgs[iid] + + if "ignore_regions_x" not in img.keys(): + return None + + if len(img["ignore_regions_x"]) == 0: + return None + + rgns_merged = [] + for region_x, region_y in zip(img["ignore_regions_x"], img["ignore_regions_y"]): + rgns = [iter(region_x), iter(region_y)] + rgns_merged.append([next(it) for it in itertools.cycle(rgns)]) + rles = maskUtils.frPyObjects(rgns_merged, img["height"], img["width"]) + rle = maskUtils.merge(rles) + return maskUtils.decode(rle) + + def _checkIgnore(dt, iregion): + if iregion is None: + return True + + bb = np.array(dt["bbox"]).astype(np.int) + x1, y1, x2, y2 = bb[0], bb[1], bb[0] + bb[2], bb[1] + bb[3] + x2 = min([x2, iregion.shape[1]]) + y2 = min([y2, iregion.shape[0]]) + + if bb[2] * bb[3] == 0: + return False + + crop_iregion = iregion[y1:y2, x1:x2] + + if crop_iregion.sum() == 0: + return True + + if "densepose" not in dt.keys(): # filtering boxes + return crop_iregion.sum() / bb[2] / bb[3] < self.ignoreThrBB + + # filtering UVs + ignoremask = np.require(crop_iregion, requirements=["F"]) + mask = self._extract_mask(dt) + uvmask = np.require(np.asarray(mask > 0), dtype=np.uint8, requirements=["F"]) + uvmask_ = maskUtils.encode(uvmask) + ignoremask_ = maskUtils.encode(ignoremask) + uviou = maskUtils.iou([uvmask_], [ignoremask_], [1])[0] + return uviou < self.ignoreThrUV + + p = self.params + + if p.useCats: + gts = self.cocoGt.loadAnns(self.cocoGt.getAnnIds(imgIds=p.imgIds, catIds=p.catIds)) + dts = self.cocoDt.loadAnns(self.cocoDt.getAnnIds(imgIds=p.imgIds, catIds=p.catIds)) + else: + gts = self.cocoGt.loadAnns(self.cocoGt.getAnnIds(imgIds=p.imgIds)) + dts = self.cocoDt.loadAnns(self.cocoDt.getAnnIds(imgIds=p.imgIds)) + + imns = self.cocoGt.loadImgs(p.imgIds) + self.size_mapping = {} + for im in imns: + self.size_mapping[im["id"]] = [im["height"], im["width"]] + + # if iouType == 'uv', add point gt annotations + if p.iouType == "densepose": + self._loadGEval() + + # convert ground truth to mask if iouType == 'segm' + if p.iouType == "segm": + _toMask(gts, self.cocoGt) + _toMask(dts, self.cocoDt) + + # set ignore flag + for gt in gts: + gt["ignore"] = gt["ignore"] if "ignore" in gt else 0 + gt["ignore"] = "iscrowd" in gt and gt["iscrowd"] + if p.iouType == "keypoints": + gt["ignore"] = (gt["num_keypoints"] == 0) or gt["ignore"] + if p.iouType == "densepose": + gt["ignore"] = ("dp_x" in gt) == 0 + + self._gts = defaultdict(list) # gt for evaluation + self._dts = defaultdict(list) # dt for evaluation + self._igrgns = defaultdict(list) + + for gt in gts: + iid = gt["image_id"] + if iid not in self._igrgns.keys(): + self._igrgns[iid] = _getIgnoreRegion(iid, self.cocoGt) + if _checkIgnore(gt, self._igrgns[iid]): + self._gts[iid, gt["category_id"]].append(gt) + for dt in dts: + iid = dt["image_id"] + if (iid not in self._igrgns) or _checkIgnore(dt, self._igrgns[iid]): + self._dts[iid, dt["category_id"]].append(dt) + + self.evalImgs = defaultdict(list) # per-image per-category evaluation results + self.eval = {} # accumulated evaluation results + + def evaluate(self): + """ + Run per image evaluation on given images and store results (a list of dict) in self.evalImgs + :return: None + """ + tic = time.time() + logger.info("Running per image DensePose evaluation... {}".format(self.params.iouType)) + p = self.params + # add backward compatibility if useSegm is specified in params + if p.useSegm is not None: + p.iouType = "segm" if p.useSegm == 1 else "bbox" + logger.info("useSegm (deprecated) is not None. Running DensePose evaluation") + p.imgIds = list(np.unique(p.imgIds)) + if p.useCats: + p.catIds = list(np.unique(p.catIds)) + p.maxDets = sorted(p.maxDets) + self.params = p + + self._prepare() + # loop through images, area range, max detection number + catIds = p.catIds if p.useCats else [-1] + + if p.iouType in ["segm", "bbox"]: + computeIoU = self.computeIoU + elif p.iouType == "keypoints": + computeIoU = self.computeOks + elif p.iouType == "densepose": + computeIoU = self.computeOgps + if self._dpEvalMode == DensePoseEvalMode.GPSM: + self.real_ious = { + (imgId, catId): self.computeDPIoU(imgId, catId) + for imgId in p.imgIds + for catId in catIds + } + + self.ious = { + (imgId, catId): computeIoU(imgId, catId) for imgId in p.imgIds for catId in catIds + } + + evaluateImg = self.evaluateImg + maxDet = p.maxDets[-1] + self.evalImgs = [ + evaluateImg(imgId, catId, areaRng, maxDet) + for catId in catIds + for areaRng in p.areaRng + for imgId in p.imgIds + ] + self._paramsEval = copy.deepcopy(self.params) + toc = time.time() + logger.info("DensePose evaluation DONE (t={:0.2f}s).".format(toc - tic)) + + def getDensePoseMask(self, polys): + maskGen = np.zeros([256, 256]) + for i in range(1, 15): + if polys[i - 1]: + currentMask = maskUtils.decode(polys[i - 1]) + maskGen[currentMask > 0] = i + return maskGen + + def _generate_rlemask_on_image(self, mask, imgId, data): + bbox_xywh = np.array(data["bbox"]) + x, y, w, h = bbox_xywh + im_h, im_w = self.size_mapping[imgId] + im_mask = np.zeros((im_h, im_w), dtype=np.uint8) + if mask is not None: + x0 = max(int(x), 0) + x1 = min(int(x + w), im_w, int(x) + mask.shape[1]) + y0 = max(int(y), 0) + y1 = min(int(y + h), im_h, int(y) + mask.shape[0]) + y = int(y) + x = int(x) + im_mask[y0:y1, x0:x1] = mask[y0 - y : y1 - y, x0 - x : x1 - x] + im_mask = np.require(np.asarray(im_mask > 0), dtype=np.uint8, requirements=["F"]) + rle_mask = maskUtils.encode(np.array(im_mask[:, :, np.newaxis], order="F"))[0] + return rle_mask + + def computeDPIoU(self, imgId, catId): + p = self.params + if p.useCats: + gt = self._gts[imgId, catId] + dt = self._dts[imgId, catId] + else: + gt = [_ for cId in p.catIds for _ in self._gts[imgId, cId]] + dt = [_ for cId in p.catIds for _ in self._dts[imgId, cId]] + if len(gt) == 0 and len(dt) == 0: + return [] + inds = np.argsort([-d["score"] for d in dt], kind="mergesort") + dt = [dt[i] for i in inds] + if len(dt) > p.maxDets[-1]: + dt = dt[0 : p.maxDets[-1]] + + gtmasks = [] + for g in gt: + if DensePoseDataRelative.S_KEY in g: + mask = self.getDensePoseMask(g[DensePoseDataRelative.S_KEY]) + _, _, w, h = g["bbox"] + scale_x = float(max(w, 1)) / mask.shape[1] + scale_y = float(max(h, 1)) / mask.shape[0] + mask = spzoom(mask, (scale_y, scale_x), order=1, prefilter=False) + mask = np.array(mask > 0.5, dtype=np.uint8) + rle_mask = self._generate_rlemask_on_image(mask, imgId, g) + elif "segmentation" in g: + segmentation = g["segmentation"] + if isinstance(segmentation, list) and segmentation: + # polygons + im_h, im_w = self.size_mapping[imgId] + rles = maskUtils.frPyObjects(segmentation, im_h, im_w) + rle_mask = maskUtils.merge(rles) + elif isinstance(segmentation, dict): + if isinstance(segmentation["counts"], list): + # uncompressed RLE + im_h, im_w = self.size_mapping[imgId] + rle_mask = maskUtils.frPyObjects(segmentation, im_h, im_w) + else: + # compressed RLE + rle_mask = segmentation + else: + rle_mask = self._generate_rlemask_on_image(None, imgId, g) + else: + rle_mask = self._generate_rlemask_on_image(None, imgId, g) + gtmasks.append(rle_mask) + + dtmasks = [] + for d in dt: + mask = self._extract_mask(d) + mask = np.require(np.asarray(mask > 0), dtype=np.uint8, requirements=["F"]) + rle_mask = self._generate_rlemask_on_image(mask, imgId, d) + dtmasks.append(rle_mask) + + # compute iou between each dt and gt region + iscrowd = [int(o["iscrowd"]) for o in gt] + iousDP = maskUtils.iou(dtmasks, gtmasks, iscrowd) + return iousDP + + def computeIoU(self, imgId, catId): + p = self.params + if p.useCats: + gt = self._gts[imgId, catId] + dt = self._dts[imgId, catId] + else: + gt = [_ for cId in p.catIds for _ in self._gts[imgId, cId]] + dt = [_ for cId in p.catIds for _ in self._dts[imgId, cId]] + if len(gt) == 0 and len(dt) == 0: + return [] + inds = np.argsort([-d["score"] for d in dt], kind="mergesort") + dt = [dt[i] for i in inds] + if len(dt) > p.maxDets[-1]: + dt = dt[0 : p.maxDets[-1]] + + if p.iouType == "segm": + g = [g["segmentation"] for g in gt] + d = [d["segmentation"] for d in dt] + elif p.iouType == "bbox": + g = [g["bbox"] for g in gt] + d = [d["bbox"] for d in dt] + else: + raise Exception("unknown iouType for iou computation") + + # compute iou between each dt and gt region + iscrowd = [int(o["iscrowd"]) for o in gt] + ious = maskUtils.iou(d, g, iscrowd) + return ious + + def computeOks(self, imgId, catId): + p = self.params + # dimension here should be Nxm + gts = self._gts[imgId, catId] + dts = self._dts[imgId, catId] + inds = np.argsort([-d["score"] for d in dts], kind="mergesort") + dts = [dts[i] for i in inds] + if len(dts) > p.maxDets[-1]: + dts = dts[0 : p.maxDets[-1]] + # if len(gts) == 0 and len(dts) == 0: + if len(gts) == 0 or len(dts) == 0: + return [] + ious = np.zeros((len(dts), len(gts))) + sigmas = ( + np.array( + [ + 0.26, + 0.25, + 0.25, + 0.35, + 0.35, + 0.79, + 0.79, + 0.72, + 0.72, + 0.62, + 0.62, + 1.07, + 1.07, + 0.87, + 0.87, + 0.89, + 0.89, + ] + ) + / 10.0 + ) + vars = (sigmas * 2) ** 2 + k = len(sigmas) + # compute oks between each detection and ground truth object + for j, gt in enumerate(gts): + # create bounds for ignore regions(double the gt bbox) + g = np.array(gt["keypoints"]) + xg = g[0::3] + yg = g[1::3] + vg = g[2::3] + k1 = np.count_nonzero(vg > 0) + bb = gt["bbox"] + x0 = bb[0] - bb[2] + x1 = bb[0] + bb[2] * 2 + y0 = bb[1] - bb[3] + y1 = bb[1] + bb[3] * 2 + for i, dt in enumerate(dts): + d = np.array(dt["keypoints"]) + xd = d[0::3] + yd = d[1::3] + if k1 > 0: + # measure the per-keypoint distance if keypoints visible + dx = xd - xg + dy = yd - yg + else: + # measure minimum distance to keypoints in (x0,y0) & (x1,y1) + z = np.zeros(k) + dx = np.max((z, x0 - xd), axis=0) + np.max((z, xd - x1), axis=0) + dy = np.max((z, y0 - yd), axis=0) + np.max((z, yd - y1), axis=0) + e = (dx ** 2 + dy ** 2) / vars / (gt["area"] + np.spacing(1)) / 2 + if k1 > 0: + e = e[vg > 0] + ious[i, j] = np.sum(np.exp(-e)) / e.shape[0] + return ious + + def _extract_mask(self, dt: Dict[str, Any]) -> np.ndarray: + (densepose_shape, densepose_data_encoded), densepose_bbox_xywh = dt["densepose"] + densepose_data = DensePoseResult.decode_png_data(densepose_shape, densepose_data_encoded) + return densepose_data[0] + + def _extract_iuv( + self, densepose_data: np.ndarray, py: np.ndarray, px: np.ndarray, gt: Dict[str, Any] + ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: + """ + Extract arrays of I, U and V values at given points as numpy arrays + given the data mode stored in self._dpDataMode + """ + if self._dpDataMode == DensePoseDataMode.IUV_DT: + # estimated labels and UV (default) + ipoints = densepose_data[0, py, px] + upoints = densepose_data[1, py, px] / 255.0 # convert from uint8 by /255. + vpoints = densepose_data[2, py, px] / 255.0 + elif self._dpDataMode == DensePoseDataMode.IUV_GT: + # ground truth + ipoints = np.array(gt["dp_I"]) + upoints = np.array(gt["dp_U"]) + vpoints = np.array(gt["dp_V"]) + elif self._dpDataMode == DensePoseDataMode.I_GT_UV_0: + # ground truth labels, UV = 0 + ipoints = np.array(gt["dp_I"]) + upoints = upoints * 0.0 + vpoints = vpoints * 0.0 + elif self._dpDataMode == DensePoseDataMode.I_GT_UV_DT: + # ground truth labels, estimated UV + ipoints = np.array(gt["dp_I"]) + upoints = densepose_data[1, py, px] / 255.0 # convert from uint8 by /255. + vpoints = densepose_data[2, py, px] / 255.0 + elif self._dpDataMode == DensePoseDataMode.I_DT_UV_0: + # estimated labels, UV = 0 + ipoints = densepose_data[0, py, px] + upoints = upoints * 0.0 + vpoints = vpoints * 0.0 + else: + raise ValueError(f"Unknown data mode: {self._dpDataMode}") + return ipoints, upoints, vpoints + + def computeOgps(self, imgId, catId): + p = self.params + # dimension here should be Nxm + g = self._gts[imgId, catId] + d = self._dts[imgId, catId] + inds = np.argsort([-d_["score"] for d_ in d], kind="mergesort") + d = [d[i] for i in inds] + if len(d) > p.maxDets[-1]: + d = d[0 : p.maxDets[-1]] + # if len(gts) == 0 and len(dts) == 0: + if len(g) == 0 or len(d) == 0: + return [] + ious = np.zeros((len(d), len(g))) + # compute opgs between each detection and ground truth object + # sigma = self.sigma #0.255 # dist = 0.3m corresponds to ogps = 0.5 + # 1 # dist = 0.3m corresponds to ogps = 0.96 + # 1.45 # dist = 1.7m (person height) corresponds to ogps = 0.5) + for j, gt in enumerate(g): + if not gt["ignore"]: + g_ = gt["bbox"] + for i, dt in enumerate(d): + # + dy = int(dt["bbox"][3]) + dx = int(dt["bbox"][2]) + dp_x = np.array(gt["dp_x"]) * g_[2] / 255.0 + dp_y = np.array(gt["dp_y"]) * g_[3] / 255.0 + py = (dp_y + g_[1] - dt["bbox"][1]).astype(np.int) + px = (dp_x + g_[0] - dt["bbox"][0]).astype(np.int) + # + pts = np.zeros(len(px)) + pts[px >= dx] = -1 + pts[py >= dy] = -1 + pts[px < 0] = -1 + pts[py < 0] = -1 + if len(pts) < 1: + ogps = 0.0 + elif np.max(pts) == -1: + ogps = 0.0 + else: + px[pts == -1] = 0 + py[pts == -1] = 0 + (densepose_shape, densepose_data_encoded), densepose_bbox_xywh = dt[ + "densepose" + ] + densepose_data = DensePoseResult.decode_png_data( + densepose_shape, densepose_data_encoded + ) + assert densepose_data.shape[2] == dx, ( + "DensePoseData width {} should be equal to " + "detection bounding box width {}".format(densepose_data.shape[2], dx) + ) + assert densepose_data.shape[1] == dy, ( + "DensePoseData height {} should be equal to " + "detection bounding box height {}".format(densepose_data.shape[1], dy) + ) + ipoints, upoints, vpoints = self._extract_iuv(densepose_data, py, px, gt) + ipoints[pts == -1] = 0 + # Find closest vertices in subsampled mesh. + cVerts, cVertsGT = self.findAllClosestVerts(gt, upoints, vpoints, ipoints) + # Get pairwise geodesic distances between gt and estimated mesh points. + dist = self.getDistances(cVertsGT, cVerts) + # Compute the Ogps measure. + # Find the mean geodesic normalization distance for + # each GT point, based on which part it is on. + Current_Mean_Distances = self.Mean_Distances[ + self.CoarseParts[self.Part_ids[cVertsGT[cVertsGT > 0].astype(int) - 1]] + ] + # Compute gps + ogps_values = np.exp(-(dist ** 2) / (2 * (Current_Mean_Distances ** 2))) + # + if len(dist) > 0: + ogps = np.sum(ogps_values) / len(dist) + ious[i, j] = ogps + + gbb = [gt["bbox"] for gt in g] + dbb = [dt["bbox"] for dt in d] + + # compute iou between each dt and gt region + iscrowd = [int(o["iscrowd"]) for o in g] + ious_bb = maskUtils.iou(dbb, gbb, iscrowd) + return ious, ious_bb + + def evaluateImg(self, imgId, catId, aRng, maxDet): + """ + perform evaluation for single category and image + :return: dict (single image results) + """ + + p = self.params + if p.useCats: + gt = self._gts[imgId, catId] + dt = self._dts[imgId, catId] + else: + gt = [_ for cId in p.catIds for _ in self._gts[imgId, cId]] + dt = [_ for cId in p.catIds for _ in self._dts[imgId, cId]] + if len(gt) == 0 and len(dt) == 0: + return None + + for g in gt: + # g['_ignore'] = g['ignore'] + if g["ignore"] or (g["area"] < aRng[0] or g["area"] > aRng[1]): + g["_ignore"] = True + else: + g["_ignore"] = False + + # sort dt highest score first, sort gt ignore last + gtind = np.argsort([g["_ignore"] for g in gt], kind="mergesort") + gt = [gt[i] for i in gtind] + dtind = np.argsort([-d["score"] for d in dt], kind="mergesort") + dt = [dt[i] for i in dtind[0:maxDet]] + iscrowd = [int(o["iscrowd"]) for o in gt] + # load computed ious + if p.iouType == "densepose": + # print('Checking the length', len(self.ious[imgId, catId])) + # if len(self.ious[imgId, catId]) == 0: + # print(self.ious[imgId, catId]) + ious = ( + self.ious[imgId, catId][0][:, gtind] + if len(self.ious[imgId, catId]) > 0 + else self.ious[imgId, catId] + ) + ioubs = ( + self.ious[imgId, catId][1][:, gtind] + if len(self.ious[imgId, catId]) > 0 + else self.ious[imgId, catId] + ) + if self._dpEvalMode == DensePoseEvalMode.GPSM: + iousM = ( + self.real_ious[imgId, catId][:, gtind] + if len(self.real_ious[imgId, catId]) > 0 + else self.real_ious[imgId, catId] + ) + else: + ious = ( + self.ious[imgId, catId][:, gtind] + if len(self.ious[imgId, catId]) > 0 + else self.ious[imgId, catId] + ) + + T = len(p.iouThrs) + G = len(gt) + D = len(dt) + gtm = np.zeros((T, G)) + dtm = np.zeros((T, D)) + gtIg = np.array([g["_ignore"] for g in gt]) + dtIg = np.zeros((T, D)) + if np.all(gtIg) and p.iouType == "densepose": + dtIg = np.logical_or(dtIg, True) + + if len(ious) > 0: # and not p.iouType == 'densepose': + for tind, t in enumerate(p.iouThrs): + for dind, d in enumerate(dt): + # information about best match so far (m=-1 -> unmatched) + iou = min([t, 1 - 1e-10]) + m = -1 + for gind, _g in enumerate(gt): + # if this gt already matched, and not a crowd, continue + if gtm[tind, gind] > 0 and not iscrowd[gind]: + continue + # if dt matched to reg gt, and on ignore gt, stop + if m > -1 and gtIg[m] == 0 and gtIg[gind] == 1: + break + if p.iouType == "densepose": + if self._dpEvalMode == DensePoseEvalMode.GPSM: + new_iou = np.sqrt(iousM[dind, gind] * ious[dind, gind]) + elif self._dpEvalMode == DensePoseEvalMode.IOU: + new_iou = iousM[dind, gind] + elif self._dpEvalMode == DensePoseEvalMode.GPS: + new_iou = ious[dind, gind] + else: + new_iou = ious[dind, gind] + if new_iou < iou: + continue + if new_iou == 0.0: + continue + # if match successful and best so far, store appropriately + iou = new_iou + m = gind + # if match made store id of match for both dt and gt + if m == -1: + continue + dtIg[tind, dind] = gtIg[m] + dtm[tind, dind] = gt[m]["id"] + gtm[tind, m] = d["id"] + + if p.iouType == "densepose": + if not len(ioubs) == 0: + for dind, d in enumerate(dt): + # information about best match so far (m=-1 -> unmatched) + if dtm[tind, dind] == 0: + ioub = 0.8 + m = -1 + for gind, _g in enumerate(gt): + # if this gt already matched, and not a crowd, continue + if gtm[tind, gind] > 0 and not iscrowd[gind]: + continue + # continue to next gt unless better match made + if ioubs[dind, gind] < ioub: + continue + # if match successful and best so far, store appropriately + ioub = ioubs[dind, gind] + m = gind + # if match made store id of match for both dt and gt + if m > -1: + dtIg[:, dind] = gtIg[m] + if gtIg[m]: + dtm[tind, dind] = gt[m]["id"] + gtm[tind, m] = d["id"] + # set unmatched detections outside of area range to ignore + a = np.array([d["area"] < aRng[0] or d["area"] > aRng[1] for d in dt]).reshape((1, len(dt))) + dtIg = np.logical_or(dtIg, np.logical_and(dtm == 0, np.repeat(a, T, 0))) + # store results for given image and category + # print('Done with the function', len(self.ious[imgId, catId])) + return { + "image_id": imgId, + "category_id": catId, + "aRng": aRng, + "maxDet": maxDet, + "dtIds": [d["id"] for d in dt], + "gtIds": [g["id"] for g in gt], + "dtMatches": dtm, + "gtMatches": gtm, + "dtScores": [d["score"] for d in dt], + "gtIgnore": gtIg, + "dtIgnore": dtIg, + } + + def accumulate(self, p=None): + """ + Accumulate per image evaluation results and store the result in self.eval + :param p: input params for evaluation + :return: None + """ + logger.info("Accumulating evaluation results...") + tic = time.time() + if not self.evalImgs: + logger.info("Please run evaluate() first") + # allows input customized parameters + if p is None: + p = self.params + p.catIds = p.catIds if p.useCats == 1 else [-1] + T = len(p.iouThrs) + R = len(p.recThrs) + K = len(p.catIds) if p.useCats else 1 + A = len(p.areaRng) + M = len(p.maxDets) + precision = -(np.ones((T, R, K, A, M))) # -1 for the precision of absent categories + recall = -(np.ones((T, K, A, M))) + + # create dictionary for future indexing + logger.info("Categories: {}".format(p.catIds)) + _pe = self._paramsEval + catIds = _pe.catIds if _pe.useCats else [-1] + setK = set(catIds) + setA = set(map(tuple, _pe.areaRng)) + setM = set(_pe.maxDets) + setI = set(_pe.imgIds) + # get inds to evaluate + k_list = [n for n, k in enumerate(p.catIds) if k in setK] + m_list = [m for n, m in enumerate(p.maxDets) if m in setM] + a_list = [n for n, a in enumerate(map(lambda x: tuple(x), p.areaRng)) if a in setA] + i_list = [n for n, i in enumerate(p.imgIds) if i in setI] + I0 = len(_pe.imgIds) + A0 = len(_pe.areaRng) + # retrieve E at each category, area range, and max number of detections + for k, k0 in enumerate(k_list): + Nk = k0 * A0 * I0 + for a, a0 in enumerate(a_list): + Na = a0 * I0 + for m, maxDet in enumerate(m_list): + E = [self.evalImgs[Nk + Na + i] for i in i_list] + E = [e for e in E if e is not None] + if len(E) == 0: + continue + dtScores = np.concatenate([e["dtScores"][0:maxDet] for e in E]) + + # different sorting method generates slightly different results. + # mergesort is used to be consistent as Matlab implementation. + inds = np.argsort(-dtScores, kind="mergesort") + + dtm = np.concatenate([e["dtMatches"][:, 0:maxDet] for e in E], axis=1)[:, inds] + dtIg = np.concatenate([e["dtIgnore"][:, 0:maxDet] for e in E], axis=1)[:, inds] + gtIg = np.concatenate([e["gtIgnore"] for e in E]) + npig = np.count_nonzero(gtIg == 0) + if npig == 0: + continue + tps = np.logical_and(dtm, np.logical_not(dtIg)) + fps = np.logical_and(np.logical_not(dtm), np.logical_not(dtIg)) + tp_sum = np.cumsum(tps, axis=1).astype(dtype=np.float) + fp_sum = np.cumsum(fps, axis=1).astype(dtype=np.float) + for t, (tp, fp) in enumerate(zip(tp_sum, fp_sum)): + tp = np.array(tp) + fp = np.array(fp) + nd = len(tp) + rc = tp / npig + pr = tp / (fp + tp + np.spacing(1)) + q = np.zeros((R,)) + + if nd: + recall[t, k, a, m] = rc[-1] + else: + recall[t, k, a, m] = 0 + + # numpy is slow without cython optimization for accessing elements + # use python array gets significant speed improvement + pr = pr.tolist() + q = q.tolist() + + for i in range(nd - 1, 0, -1): + if pr[i] > pr[i - 1]: + pr[i - 1] = pr[i] + + inds = np.searchsorted(rc, p.recThrs, side="left") + try: + for ri, pi in enumerate(inds): + q[ri] = pr[pi] + except Exception: + pass + precision[t, :, k, a, m] = np.array(q) + logger.info( + "Final: max precision {}, min precision {}".format(np.max(precision), np.min(precision)) + ) + self.eval = { + "params": p, + "counts": [T, R, K, A, M], + "date": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "precision": precision, + "recall": recall, + } + toc = time.time() + logger.info("DONE (t={:0.2f}s).".format(toc - tic)) + + def summarize(self): + """ + Compute and display summary metrics for evaluation results. + Note this function can *only* be applied on the default parameter setting + """ + + def _summarize(ap=1, iouThr=None, areaRng="all", maxDets=100): + p = self.params + iStr = " {:<18} {} @[ {}={:<9} | area={:>6s} | maxDets={:>3d} ] = {:0.3f}" + titleStr = "Average Precision" if ap == 1 else "Average Recall" + typeStr = "(AP)" if ap == 1 else "(AR)" + measure = "IoU" + if self.params.iouType == "keypoints": + measure = "OKS" + elif self.params.iouType == "densepose": + measure = "OGPS" + iouStr = ( + "{:0.2f}:{:0.2f}".format(p.iouThrs[0], p.iouThrs[-1]) + if iouThr is None + else "{:0.2f}".format(iouThr) + ) + + aind = [i for i, aRng in enumerate(p.areaRngLbl) if aRng == areaRng] + mind = [i for i, mDet in enumerate(p.maxDets) if mDet == maxDets] + if ap == 1: + # dimension of precision: [TxRxKxAxM] + s = self.eval["precision"] + # IoU + if iouThr is not None: + t = np.where(np.abs(iouThr - p.iouThrs) < 0.001)[0] + s = s[t] + s = s[:, :, :, aind, mind] + else: + # dimension of recall: [TxKxAxM] + s = self.eval["recall"] + if iouThr is not None: + t = np.where(iouThr == p.iouThrs)[0] + s = s[t] + s = s[:, :, aind, mind] + if len(s[s > -1]) == 0: + mean_s = -1 + else: + mean_s = np.mean(s[s > -1]) + logger.info(iStr.format(titleStr, typeStr, measure, iouStr, areaRng, maxDets, mean_s)) + return mean_s + + def _summarizeDets(): + stats = np.zeros((12,)) + stats[0] = _summarize(1) + stats[1] = _summarize(1, iouThr=0.5, maxDets=self.params.maxDets[2]) + stats[2] = _summarize(1, iouThr=0.75, maxDets=self.params.maxDets[2]) + stats[3] = _summarize(1, areaRng="small", maxDets=self.params.maxDets[2]) + stats[4] = _summarize(1, areaRng="medium", maxDets=self.params.maxDets[2]) + stats[5] = _summarize(1, areaRng="large", maxDets=self.params.maxDets[2]) + stats[6] = _summarize(0, maxDets=self.params.maxDets[0]) + stats[7] = _summarize(0, maxDets=self.params.maxDets[1]) + stats[8] = _summarize(0, maxDets=self.params.maxDets[2]) + stats[9] = _summarize(0, areaRng="small", maxDets=self.params.maxDets[2]) + stats[10] = _summarize(0, areaRng="medium", maxDets=self.params.maxDets[2]) + stats[11] = _summarize(0, areaRng="large", maxDets=self.params.maxDets[2]) + return stats + + def _summarizeKps(): + stats = np.zeros((10,)) + stats[0] = _summarize(1, maxDets=20) + stats[1] = _summarize(1, maxDets=20, iouThr=0.5) + stats[2] = _summarize(1, maxDets=20, iouThr=0.75) + stats[3] = _summarize(1, maxDets=20, areaRng="medium") + stats[4] = _summarize(1, maxDets=20, areaRng="large") + stats[5] = _summarize(0, maxDets=20) + stats[6] = _summarize(0, maxDets=20, iouThr=0.5) + stats[7] = _summarize(0, maxDets=20, iouThr=0.75) + stats[8] = _summarize(0, maxDets=20, areaRng="medium") + stats[9] = _summarize(0, maxDets=20, areaRng="large") + return stats + + def _summarizeUvs(): + stats = np.zeros((10,)) + stats[0] = _summarize(1, maxDets=self.params.maxDets[0]) + stats[1] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.5) + stats[2] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.75) + stats[3] = _summarize(1, maxDets=self.params.maxDets[0], areaRng="medium") + stats[4] = _summarize(1, maxDets=self.params.maxDets[0], areaRng="large") + stats[5] = _summarize(0, maxDets=self.params.maxDets[0]) + stats[6] = _summarize(0, maxDets=self.params.maxDets[0], iouThr=0.5) + stats[7] = _summarize(0, maxDets=self.params.maxDets[0], iouThr=0.75) + stats[8] = _summarize(0, maxDets=self.params.maxDets[0], areaRng="medium") + stats[9] = _summarize(0, maxDets=self.params.maxDets[0], areaRng="large") + return stats + + def _summarizeUvsOld(): + stats = np.zeros((18,)) + stats[0] = _summarize(1, maxDets=self.params.maxDets[0]) + stats[1] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.5) + stats[2] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.55) + stats[3] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.60) + stats[4] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.65) + stats[5] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.70) + stats[6] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.75) + stats[7] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.80) + stats[8] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.85) + stats[9] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.90) + stats[10] = _summarize(1, maxDets=self.params.maxDets[0], iouThr=0.95) + stats[11] = _summarize(1, maxDets=self.params.maxDets[0], areaRng="medium") + stats[12] = _summarize(1, maxDets=self.params.maxDets[0], areaRng="large") + stats[13] = _summarize(0, maxDets=self.params.maxDets[0]) + stats[14] = _summarize(0, maxDets=self.params.maxDets[0], iouThr=0.5) + stats[15] = _summarize(0, maxDets=self.params.maxDets[0], iouThr=0.75) + stats[16] = _summarize(0, maxDets=self.params.maxDets[0], areaRng="medium") + stats[17] = _summarize(0, maxDets=self.params.maxDets[0], areaRng="large") + return stats + + if not self.eval: + raise Exception("Please run accumulate() first") + iouType = self.params.iouType + if iouType in ["segm", "bbox"]: + summarize = _summarizeDets + elif iouType in ["keypoints"]: + summarize = _summarizeKps + elif iouType in ["densepose"]: + summarize = _summarizeUvs + self.stats = summarize() + + def __str__(self): + self.summarize() + + # ================ functions for dense pose ============================== + def findAllClosestVerts(self, gt, U_points, V_points, Index_points): + # + I_gt = np.array(gt["dp_I"]) + U_gt = np.array(gt["dp_U"]) + V_gt = np.array(gt["dp_V"]) + # + # print(I_gt) + # + ClosestVerts = np.ones(Index_points.shape) * -1 + for i in np.arange(24): + # + if sum(Index_points == (i + 1)) > 0: + UVs = np.array( + [U_points[Index_points == (i + 1)], V_points[Index_points == (i + 1)]] + ) + Current_Part_UVs = self.Part_UVs[i] + Current_Part_ClosestVertInds = self.Part_ClosestVertInds[i] + D = ssd.cdist(Current_Part_UVs.transpose(), UVs.transpose()).squeeze() + ClosestVerts[Index_points == (i + 1)] = Current_Part_ClosestVertInds[ + np.argmin(D, axis=0) + ] + # + ClosestVertsGT = np.ones(Index_points.shape) * -1 + for i in np.arange(24): + if sum(I_gt == (i + 1)) > 0: + UVs = np.array([U_gt[I_gt == (i + 1)], V_gt[I_gt == (i + 1)]]) + Current_Part_UVs = self.Part_UVs[i] + Current_Part_ClosestVertInds = self.Part_ClosestVertInds[i] + D = ssd.cdist(Current_Part_UVs.transpose(), UVs.transpose()).squeeze() + ClosestVertsGT[I_gt == (i + 1)] = Current_Part_ClosestVertInds[np.argmin(D, axis=0)] + # + return ClosestVerts, ClosestVertsGT + + def getDistances(self, cVertsGT, cVerts): + + ClosestVertsTransformed = self.PDIST_transform[cVerts.astype(int) - 1] + ClosestVertsGTTransformed = self.PDIST_transform[cVertsGT.astype(int) - 1] + # + ClosestVertsTransformed[cVerts < 0] = 0 + ClosestVertsGTTransformed[cVertsGT < 0] = 0 + # + cVertsGT = ClosestVertsGTTransformed + cVerts = ClosestVertsTransformed + # + n = 27554 + dists = [] + for d in range(len(cVertsGT)): + if cVertsGT[d] > 0: + if cVerts[d] > 0: + i = cVertsGT[d] - 1 + j = cVerts[d] - 1 + if j == i: + dists.append(0) + elif j > i: + ccc = i + i = j + j = ccc + i = n - i - 1 + j = n - j - 1 + k = (n * (n - 1) / 2) - (n - i) * ((n - i) - 1) / 2 + j - i - 1 + k = (n * n - n) / 2 - k - 1 + dists.append(self.Pdist_matrix[int(k)][0]) + else: + i = n - i - 1 + j = n - j - 1 + k = (n * (n - 1) / 2) - (n - i) * ((n - i) - 1) / 2 + j - i - 1 + k = (n * n - n) / 2 - k - 1 + dists.append(self.Pdist_matrix[int(k)][0]) + else: + dists.append(np.inf) + return np.atleast_1d(np.array(dists).squeeze()) + + +class Params: + """ + Params for coco evaluation api + """ + + def setDetParams(self): + self.imgIds = [] + self.catIds = [] + # np.arange causes trouble. the data point on arange is slightly larger than the true value + self.iouThrs = np.linspace(0.5, 0.95, np.round((0.95 - 0.5) / 0.05) + 1, endpoint=True) + self.recThrs = np.linspace(0.0, 1.00, np.round((1.00 - 0.0) / 0.01) + 1, endpoint=True) + self.maxDets = [1, 10, 100] + self.areaRng = [ + [0 ** 2, 1e5 ** 2], + [0 ** 2, 32 ** 2], + [32 ** 2, 96 ** 2], + [96 ** 2, 1e5 ** 2], + ] + self.areaRngLbl = ["all", "small", "medium", "large"] + self.useCats = 1 + + def setKpParams(self): + self.imgIds = [] + self.catIds = [] + # np.arange causes trouble. the data point on arange is slightly larger than the true value + self.iouThrs = np.linspace(0.5, 0.95, np.round((0.95 - 0.5) / 0.05) + 1, endpoint=True) + self.recThrs = np.linspace(0.0, 1.00, np.round((1.00 - 0.0) / 0.01) + 1, endpoint=True) + self.maxDets = [20] + self.areaRng = [[0 ** 2, 1e5 ** 2], [32 ** 2, 96 ** 2], [96 ** 2, 1e5 ** 2]] + self.areaRngLbl = ["all", "medium", "large"] + self.useCats = 1 + + def setUvParams(self): + self.imgIds = [] + self.catIds = [] + self.iouThrs = np.linspace(0.5, 0.95, int(np.round((0.95 - 0.5) / 0.05)) + 1, endpoint=True) + self.recThrs = np.linspace(0.0, 1.00, int(np.round((1.00 - 0.0) / 0.01)) + 1, endpoint=True) + self.maxDets = [20] + self.areaRng = [[0 ** 2, 1e5 ** 2], [32 ** 2, 96 ** 2], [96 ** 2, 1e5 ** 2]] + self.areaRngLbl = ["all", "medium", "large"] + self.useCats = 1 + + def __init__(self, iouType="segm"): + if iouType == "segm" or iouType == "bbox": + self.setDetParams() + elif iouType == "keypoints": + self.setKpParams() + elif iouType == "densepose": + self.setUvParams() + else: + raise Exception("iouType not supported") + self.iouType = iouType + # useSegm is deprecated + self.useSegm = None diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_head.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_head.py new file mode 100644 index 0000000..3639706 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/densepose_head.py @@ -0,0 +1,1216 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import math +from dataclasses import dataclass +from enum import Enum +import fvcore.nn.weight_init as weight_init +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.config import CfgNode +from detectron2.layers import Conv2d, ConvTranspose2d, interpolate +from detectron2.structures.boxes import matched_boxlist_iou +from detectron2.utils.registry import Registry + +from .data.structures import DensePoseOutput + +ROI_DENSEPOSE_HEAD_REGISTRY = Registry("ROI_DENSEPOSE_HEAD") + + +class DensePoseUVConfidenceType(Enum): + """ + Statistical model type for confidence learning, possible values: + - "iid_iso": statistically independent identically distributed residuals + with anisotropic covariance + - "indep_aniso": statistically independent residuals with anisotropic + covariances + For details, see: + N. Neverova, D. Novotny, A. Vedaldi "Correlated Uncertainty for Learning + Dense Correspondences from Noisy Labels", p. 918--926, in Proc. NIPS 2019 + """ + + # fmt: off + IID_ISO = "iid_iso" + INDEP_ANISO = "indep_aniso" + # fmt: on + + +@dataclass +class DensePoseUVConfidenceConfig: + """ + Configuration options for confidence on UV data + """ + + enabled: bool = False + # lower bound on UV confidences + epsilon: float = 0.01 + type: DensePoseUVConfidenceType = DensePoseUVConfidenceType.IID_ISO + + +@dataclass +class DensePoseConfidenceModelConfig: + """ + Configuration options for confidence models + """ + + # confidence for U and V values + uv_confidence: DensePoseUVConfidenceConfig + + @staticmethod + def from_cfg(cfg: CfgNode) -> "DensePoseConfidenceModelConfig": + return DensePoseConfidenceModelConfig( + uv_confidence=DensePoseUVConfidenceConfig( + enabled=cfg.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.ENABLED, + epsilon=cfg.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.EPSILON, + type=DensePoseUVConfidenceType(cfg.MODEL.ROI_DENSEPOSE_HEAD.UV_CONFIDENCE.TYPE), + ) + ) + + +def initialize_module_params(module): + for name, param in module.named_parameters(): + if "bias" in name: + nn.init.constant_(param, 0) + elif "weight" in name: + nn.init.kaiming_normal_(param, mode="fan_out", nonlinearity="relu") + + +@ROI_DENSEPOSE_HEAD_REGISTRY.register() +class DensePoseDeepLabHead(nn.Module): + def __init__(self, cfg, input_channels): + super(DensePoseDeepLabHead, self).__init__() + # fmt: off + hidden_dim = cfg.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_DIM + kernel_size = cfg.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_KERNEL + norm = cfg.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NORM + self.n_stacked_convs = cfg.MODEL.ROI_DENSEPOSE_HEAD.NUM_STACKED_CONVS + self.use_nonlocal = cfg.MODEL.ROI_DENSEPOSE_HEAD.DEEPLAB.NONLOCAL_ON + # fmt: on + pad_size = kernel_size // 2 + n_channels = input_channels + + self.ASPP = ASPP(input_channels, [6, 12, 56], n_channels) # 6, 12, 56 + self.add_module("ASPP", self.ASPP) + + if self.use_nonlocal: + self.NLBlock = NONLocalBlock2D(input_channels, bn_layer=True) + self.add_module("NLBlock", self.NLBlock) + # weight_init.c2_msra_fill(self.ASPP) + + for i in range(self.n_stacked_convs): + norm_module = nn.GroupNorm(32, hidden_dim) if norm == "GN" else None + layer = Conv2d( + n_channels, + hidden_dim, + kernel_size, + stride=1, + padding=pad_size, + bias=not norm, + norm=norm_module, + ) + weight_init.c2_msra_fill(layer) + n_channels = hidden_dim + layer_name = self._get_layer_name(i) + self.add_module(layer_name, layer) + self.n_out_channels = hidden_dim + # initialize_module_params(self) + + def forward(self, features): + x0 = features + x = self.ASPP(x0) + if self.use_nonlocal: + x = self.NLBlock(x) + output = x + for i in range(self.n_stacked_convs): + layer_name = self._get_layer_name(i) + x = getattr(self, layer_name)(x) + x = F.relu(x) + output = x + return output + + def _get_layer_name(self, i): + layer_name = "body_conv_fcn{}".format(i + 1) + return layer_name + + +# Copied from +# https://github.com/pytorch/vision/blob/master/torchvision/models/segmentation/deeplabv3.py +# See https://arxiv.org/pdf/1706.05587.pdf for details +class ASPPConv(nn.Sequential): + def __init__(self, in_channels, out_channels, dilation): + modules = [ + nn.Conv2d( + in_channels, out_channels, 3, padding=dilation, dilation=dilation, bias=False + ), + nn.GroupNorm(32, out_channels), + nn.ReLU(), + ] + super(ASPPConv, self).__init__(*modules) + + +class ASPPPooling(nn.Sequential): + def __init__(self, in_channels, out_channels): + super(ASPPPooling, self).__init__( + nn.AdaptiveAvgPool2d(1), + nn.Conv2d(in_channels, out_channels, 1, bias=False), + nn.GroupNorm(32, out_channels), + nn.ReLU(), + ) + + def forward(self, x): + size = x.shape[-2:] + x = super(ASPPPooling, self).forward(x) + return F.interpolate(x, size=size, mode="bilinear", align_corners=False) + + +class ASPP(nn.Module): + def __init__(self, in_channels, atrous_rates, out_channels): + super(ASPP, self).__init__() + modules = [] + modules.append( + nn.Sequential( + nn.Conv2d(in_channels, out_channels, 1, bias=False), + nn.GroupNorm(32, out_channels), + nn.ReLU(), + ) + ) + + rate1, rate2, rate3 = tuple(atrous_rates) + modules.append(ASPPConv(in_channels, out_channels, rate1)) + modules.append(ASPPConv(in_channels, out_channels, rate2)) + modules.append(ASPPConv(in_channels, out_channels, rate3)) + modules.append(ASPPPooling(in_channels, out_channels)) + + self.convs = nn.ModuleList(modules) + + self.project = nn.Sequential( + nn.Conv2d(5 * out_channels, out_channels, 1, bias=False), + # nn.BatchNorm2d(out_channels), + nn.ReLU() + # nn.Dropout(0.5) + ) + + def forward(self, x): + res = [] + for conv in self.convs: + res.append(conv(x)) + res = torch.cat(res, dim=1) + return self.project(res) + + +# copied from +# https://github.com/AlexHex7/Non-local_pytorch/blob/master/lib/non_local_embedded_gaussian.py +# See https://arxiv.org/abs/1711.07971 for details +class _NonLocalBlockND(nn.Module): + def __init__( + self, in_channels, inter_channels=None, dimension=3, sub_sample=True, bn_layer=True + ): + super(_NonLocalBlockND, self).__init__() + + assert dimension in [1, 2, 3] + + self.dimension = dimension + self.sub_sample = sub_sample + + self.in_channels = in_channels + self.inter_channels = inter_channels + + if self.inter_channels is None: + self.inter_channels = in_channels // 2 + if self.inter_channels == 0: + self.inter_channels = 1 + + if dimension == 3: + conv_nd = nn.Conv3d + max_pool_layer = nn.MaxPool3d(kernel_size=(1, 2, 2)) + bn = nn.GroupNorm # (32, hidden_dim) #nn.BatchNorm3d + elif dimension == 2: + conv_nd = nn.Conv2d + max_pool_layer = nn.MaxPool2d(kernel_size=(2, 2)) + bn = nn.GroupNorm # (32, hidden_dim)nn.BatchNorm2d + else: + conv_nd = nn.Conv1d + max_pool_layer = nn.MaxPool1d(kernel_size=2) + bn = nn.GroupNorm # (32, hidden_dim)nn.BatchNorm1d + + self.g = conv_nd( + in_channels=self.in_channels, + out_channels=self.inter_channels, + kernel_size=1, + stride=1, + padding=0, + ) + + if bn_layer: + self.W = nn.Sequential( + conv_nd( + in_channels=self.inter_channels, + out_channels=self.in_channels, + kernel_size=1, + stride=1, + padding=0, + ), + bn(32, self.in_channels), + ) + nn.init.constant_(self.W[1].weight, 0) + nn.init.constant_(self.W[1].bias, 0) + else: + self.W = conv_nd( + in_channels=self.inter_channels, + out_channels=self.in_channels, + kernel_size=1, + stride=1, + padding=0, + ) + nn.init.constant_(self.W.weight, 0) + nn.init.constant_(self.W.bias, 0) + + self.theta = conv_nd( + in_channels=self.in_channels, + out_channels=self.inter_channels, + kernel_size=1, + stride=1, + padding=0, + ) + self.phi = conv_nd( + in_channels=self.in_channels, + out_channels=self.inter_channels, + kernel_size=1, + stride=1, + padding=0, + ) + + if sub_sample: + self.g = nn.Sequential(self.g, max_pool_layer) + self.phi = nn.Sequential(self.phi, max_pool_layer) + + def forward(self, x): + """ + :param x: (b, c, t, h, w) + :return: + """ + + batch_size = x.size(0) + + g_x = self.g(x).view(batch_size, self.inter_channels, -1) + g_x = g_x.permute(0, 2, 1) + + theta_x = self.theta(x).view(batch_size, self.inter_channels, -1) + theta_x = theta_x.permute(0, 2, 1) + phi_x = self.phi(x).view(batch_size, self.inter_channels, -1) + f = torch.matmul(theta_x, phi_x) + f_div_C = F.softmax(f, dim=-1) + + y = torch.matmul(f_div_C, g_x) + y = y.permute(0, 2, 1).contiguous() + y = y.view(batch_size, self.inter_channels, *x.size()[2:]) + W_y = self.W(y) + z = W_y + x + + return z + + +class NONLocalBlock2D(_NonLocalBlockND): + def __init__(self, in_channels, inter_channels=None, sub_sample=True, bn_layer=True): + super(NONLocalBlock2D, self).__init__( + in_channels, + inter_channels=inter_channels, + dimension=2, + sub_sample=sub_sample, + bn_layer=bn_layer, + ) + + +@ROI_DENSEPOSE_HEAD_REGISTRY.register() +class DensePoseV1ConvXHead(nn.Module): + def __init__(self, cfg, input_channels): + super(DensePoseV1ConvXHead, self).__init__() + # fmt: off + hidden_dim = cfg.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_DIM + kernel_size = cfg.MODEL.ROI_DENSEPOSE_HEAD.CONV_HEAD_KERNEL + self.n_stacked_convs = cfg.MODEL.ROI_DENSEPOSE_HEAD.NUM_STACKED_CONVS + # fmt: on + pad_size = kernel_size // 2 + n_channels = input_channels + for i in range(self.n_stacked_convs): + layer = Conv2d(n_channels, hidden_dim, kernel_size, stride=1, padding=pad_size) + layer_name = self._get_layer_name(i) + self.add_module(layer_name, layer) + n_channels = hidden_dim + self.n_out_channels = n_channels + initialize_module_params(self) + + def forward(self, features): + x = features + output = x + for i in range(self.n_stacked_convs): + layer_name = self._get_layer_name(i) + x = getattr(self, layer_name)(x) + x = F.relu(x) + output = x + return output + + def _get_layer_name(self, i): + layer_name = "body_conv_fcn{}".format(i + 1) + return layer_name + + +class DensePosePredictor(nn.Module): + def __init__(self, cfg, input_channels): + + super(DensePosePredictor, self).__init__() + dim_in = input_channels + n_segm_chan = cfg.MODEL.ROI_DENSEPOSE_HEAD.NUM_COARSE_SEGM_CHANNELS + dim_out_patches = cfg.MODEL.ROI_DENSEPOSE_HEAD.NUM_PATCHES + 1 + kernel_size = cfg.MODEL.ROI_DENSEPOSE_HEAD.DECONV_KERNEL + self.ann_index_lowres = ConvTranspose2d( + dim_in, n_segm_chan, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + self.index_uv_lowres = ConvTranspose2d( + dim_in, dim_out_patches, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + self.u_lowres = ConvTranspose2d( + dim_in, dim_out_patches, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + self.v_lowres = ConvTranspose2d( + dim_in, dim_out_patches, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + self.scale_factor = cfg.MODEL.ROI_DENSEPOSE_HEAD.UP_SCALE + self.confidence_model_cfg = DensePoseConfidenceModelConfig.from_cfg(cfg) + self._initialize_confidence_estimation_layers(cfg, self.confidence_model_cfg, dim_in) + initialize_module_params(self) + + def forward(self, head_outputs): + ann_index_lowres = self.ann_index_lowres(head_outputs) + index_uv_lowres = self.index_uv_lowres(head_outputs) + u_lowres = self.u_lowres(head_outputs) + v_lowres = self.v_lowres(head_outputs) + + def interp2d(input): + return interpolate( + input, scale_factor=self.scale_factor, mode="bilinear", align_corners=False + ) + + ann_index = interp2d(ann_index_lowres) + index_uv = interp2d(index_uv_lowres) + u = interp2d(u_lowres) + v = interp2d(v_lowres) + ( + (sigma_1, sigma_2, kappa_u, kappa_v), + (sigma_1_lowres, sigma_2_lowres, kappa_u_lowres, kappa_v_lowres), + (ann_index, index_uv), + ) = self._forward_confidence_estimation_layers( + self.confidence_model_cfg, head_outputs, interp2d, ann_index, index_uv + ) + return ( + (ann_index, index_uv, u, v), + (ann_index_lowres, index_uv_lowres, u_lowres, v_lowres), + (sigma_1, sigma_2, kappa_u, kappa_v), + (sigma_1_lowres, sigma_2_lowres, kappa_u_lowres, kappa_v_lowres), + ) + + def _initialize_confidence_estimation_layers( + self, cfg: CfgNode, confidence_model_cfg: DensePoseConfidenceModelConfig, dim_in: int + ): + dim_out_patches = cfg.MODEL.ROI_DENSEPOSE_HEAD.NUM_PATCHES + 1 + kernel_size = cfg.MODEL.ROI_DENSEPOSE_HEAD.DECONV_KERNEL + if confidence_model_cfg.uv_confidence.enabled: + if confidence_model_cfg.uv_confidence.type == DensePoseUVConfidenceType.IID_ISO: + self.sigma_2_lowres = ConvTranspose2d( + dim_in, dim_out_patches, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + elif confidence_model_cfg.uv_confidence.type == DensePoseUVConfidenceType.INDEP_ANISO: + self.sigma_2_lowres = ConvTranspose2d( + dim_in, dim_out_patches, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + self.kappa_u_lowres = ConvTranspose2d( + dim_in, dim_out_patches, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + self.kappa_v_lowres = ConvTranspose2d( + dim_in, dim_out_patches, kernel_size, stride=2, padding=int(kernel_size / 2 - 1) + ) + else: + raise ValueError( + f"Unknown confidence model type: {confidence_model_cfg.confidence_model_type}" + ) + + def _forward_confidence_estimation_layers( + self, confidence_model_cfg, head_outputs, interp2d, ann_index, index_uv + ): + sigma_1, sigma_2, kappa_u, kappa_v = None, None, None, None + sigma_1_lowres, sigma_2_lowres, kappa_u_lowres, kappa_v_lowres = None, None, None, None + if confidence_model_cfg.uv_confidence.enabled: + if confidence_model_cfg.uv_confidence.type == DensePoseUVConfidenceType.IID_ISO: + sigma_2_lowres = self.sigma_2_lowres(head_outputs) + sigma_2 = interp2d(sigma_2_lowres) + elif confidence_model_cfg.uv_confidence.type == DensePoseUVConfidenceType.INDEP_ANISO: + sigma_2_lowres = self.sigma_2_lowres(head_outputs) + kappa_u_lowres = self.kappa_u_lowres(head_outputs) + kappa_v_lowres = self.kappa_v_lowres(head_outputs) + sigma_2 = interp2d(sigma_2_lowres) + kappa_u = interp2d(kappa_u_lowres) + kappa_v = interp2d(kappa_v_lowres) + else: + raise ValueError( + f"Unknown confidence model type: {confidence_model_cfg.confidence_model_type}" + ) + return ( + (sigma_1, sigma_2, kappa_u, kappa_v), + (sigma_1_lowres, sigma_2_lowres, kappa_u_lowres, kappa_v_lowres), + (ann_index, index_uv), + ) + + +class DensePoseDataFilter(object): + def __init__(self, cfg): + self.iou_threshold = cfg.MODEL.ROI_DENSEPOSE_HEAD.FG_IOU_THRESHOLD + + @torch.no_grad() + def __call__(self, proposals_with_targets): + """ + Filters proposals with targets to keep only the ones relevant for + DensePose training + proposals: list(Instances), each element of the list corresponds to + various instances (proposals, GT for boxes and densepose) for one + image + """ + proposals_filtered = [] + for proposals_per_image in proposals_with_targets: + if not hasattr(proposals_per_image, "gt_densepose"): + continue + assert hasattr(proposals_per_image, "gt_boxes") + assert hasattr(proposals_per_image, "proposal_boxes") + gt_boxes = proposals_per_image.gt_boxes + est_boxes = proposals_per_image.proposal_boxes + # apply match threshold for densepose head + iou = matched_boxlist_iou(gt_boxes, est_boxes) + iou_select = iou > self.iou_threshold + proposals_per_image = proposals_per_image[iou_select] + assert len(proposals_per_image.gt_boxes) == len(proposals_per_image.proposal_boxes) + # filter out any target without densepose annotation + gt_densepose = proposals_per_image.gt_densepose + assert len(proposals_per_image.gt_boxes) == len(proposals_per_image.gt_densepose) + selected_indices = [ + i for i, dp_target in enumerate(gt_densepose) if dp_target is not None + ] + if len(selected_indices) != len(gt_densepose): + proposals_per_image = proposals_per_image[selected_indices] + assert len(proposals_per_image.gt_boxes) == len(proposals_per_image.proposal_boxes) + assert len(proposals_per_image.gt_boxes) == len(proposals_per_image.gt_densepose) + proposals_filtered.append(proposals_per_image) + return proposals_filtered + + +def build_densepose_head(cfg, input_channels): + head_name = cfg.MODEL.ROI_DENSEPOSE_HEAD.NAME + return ROI_DENSEPOSE_HEAD_REGISTRY.get(head_name)(cfg, input_channels) + + +def build_densepose_predictor(cfg, input_channels): + predictor = DensePosePredictor(cfg, input_channels) + return predictor + + +def build_densepose_data_filter(cfg): + dp_filter = DensePoseDataFilter(cfg) + return dp_filter + + +def densepose_inference(densepose_outputs, densepose_confidences, detections): + """ + Infer dense pose estimate based on outputs from the DensePose head + and detections. The estimate for each detection instance is stored in its + "pred_densepose" attribute. + + Args: + densepose_outputs (tuple(`torch.Tensor`)): iterable containing 4 elements: + - s (:obj: `torch.Tensor`): coarse segmentation tensor of size (N, A, H, W), + - i (:obj: `torch.Tensor`): fine segmentation tensor of size (N, C, H, W), + - u (:obj: `torch.Tensor`): U coordinates for each class of size (N, C, H, W), + - v (:obj: `torch.Tensor`): V coordinates for each class of size (N, C, H, W), + where N is the total number of detections in a batch, + A is the number of coarse segmentations labels + (e.g. 15 for coarse body parts + background), + C is the number of fine segmentation labels + (e.g. 25 for fine body parts + background), + W is the resolution along the X axis + H is the resolution along the Y axis + densepose_confidences (tuple(`torch.Tensor`)): iterable containing 4 elements: + - sigma_1 (:obj: `torch.Tensor`): global confidences for UV coordinates + of size (N, C, H, W) + - sigma_2 (:obj: `torch.Tensor`): individual confidences for UV coordinates + of size (N, C, H, W) + - kappa_u (:obj: `torch.Tensor`): first component of confidence direction + vector of size (N, C, H, W) + - kappa_v (:obj: `torch.Tensor`): second component of confidence direction + vector of size (N, C, H, W) + detections (list[Instances]): A list of N Instances, where N is the number of images + in the batch. Instances are modified by this method: "pred_densepose" attribute + is added to each instance, the attribute contains the corresponding + DensePoseOutput object. + """ + # DensePose outputs: segmentation, body part indices, U, V + s, index_uv, u, v = densepose_outputs + sigma_1, sigma_2, kappa_u, kappa_v = densepose_confidences + k = 0 + for detection in detections: + n_i = len(detection) + s_i = s[k : k + n_i] + index_uv_i = index_uv[k : k + n_i] + u_i = u[k : k + n_i] + v_i = v[k : k + n_i] + _local_vars = locals() + confidences = { + name: _local_vars[name] + for name in ("sigma_1", "sigma_2", "kappa_u", "kappa_v") + if _local_vars.get(name) is not None + } + densepose_output_i = DensePoseOutput(s_i, index_uv_i, u_i, v_i, confidences) + detection.pred_densepose = densepose_output_i + k += n_i + + +def _linear_interpolation_utilities(v_norm, v0_src, size_src, v0_dst, size_dst, size_z): + """ + Computes utility values for linear interpolation at points v. + The points are given as normalized offsets in the source interval + (v0_src, v0_src + size_src), more precisely: + v = v0_src + v_norm * size_src / 256.0 + The computed utilities include lower points v_lo, upper points v_hi, + interpolation weights v_w and flags j_valid indicating whether the + points falls into the destination interval (v0_dst, v0_dst + size_dst). + + Args: + v_norm (:obj: `torch.Tensor`): tensor of size N containing + normalized point offsets + v0_src (:obj: `torch.Tensor`): tensor of size N containing + left bounds of source intervals for normalized points + size_src (:obj: `torch.Tensor`): tensor of size N containing + source interval sizes for normalized points + v0_dst (:obj: `torch.Tensor`): tensor of size N containing + left bounds of destination intervals + size_dst (:obj: `torch.Tensor`): tensor of size N containing + destination interval sizes + size_z (int): interval size for data to be interpolated + + Returns: + v_lo (:obj: `torch.Tensor`): int tensor of size N containing + indices of lower values used for interpolation, all values are + integers from [0, size_z - 1] + v_hi (:obj: `torch.Tensor`): int tensor of size N containing + indices of upper values used for interpolation, all values are + integers from [0, size_z - 1] + v_w (:obj: `torch.Tensor`): float tensor of size N containing + interpolation weights + j_valid (:obj: `torch.Tensor`): uint8 tensor of size N containing + 0 for points outside the estimation interval + (v0_est, v0_est + size_est) and 1 otherwise + """ + v = v0_src + v_norm * size_src / 256.0 + j_valid = (v - v0_dst >= 0) * (v - v0_dst < size_dst) + v_grid = (v - v0_dst) * size_z / size_dst + v_lo = v_grid.floor().long().clamp(min=0, max=size_z - 1) + v_hi = (v_lo + 1).clamp(max=size_z - 1) + v_grid = torch.min(v_hi.float(), v_grid) + v_w = v_grid - v_lo.float() + return v_lo, v_hi, v_w, j_valid + + +def _grid_sampling_utilities( + zh, zw, bbox_xywh_est, bbox_xywh_gt, index_gt, x_norm, y_norm, index_bbox +): + """ + Prepare tensors used in grid sampling. + + Args: + z_est (:obj: `torch.Tensor`): tensor of size (N,C,H,W) with estimated + values of Z to be extracted for the points X, Y and channel + indices I + bbox_xywh_est (:obj: `torch.Tensor`): tensor of size (N, 4) containing + estimated bounding boxes in format XYWH + bbox_xywh_gt (:obj: `torch.Tensor`): tensor of size (N, 4) containing + matched ground truth bounding boxes in format XYWH + index_gt (:obj: `torch.Tensor`): tensor of size K with point labels for + ground truth points + x_norm (:obj: `torch.Tensor`): tensor of size K with X normalized + coordinates of ground truth points. Image X coordinates can be + obtained as X = Xbbox + x_norm * Wbbox / 255 + y_norm (:obj: `torch.Tensor`): tensor of size K with Y normalized + coordinates of ground truth points. Image Y coordinates can be + obtained as Y = Ybbox + y_norm * Hbbox / 255 + index_bbox (:obj: `torch.Tensor`): tensor of size K with bounding box + indices for each ground truth point. The values are thus in + [0, N-1] + + Returns: + j_valid (:obj: `torch.Tensor`): uint8 tensor of size M containing + 0 for points to be discarded and 1 for points to be selected + y_lo (:obj: `torch.Tensor`): int tensor of indices of upper values + in z_est for each point + y_hi (:obj: `torch.Tensor`): int tensor of indices of lower values + in z_est for each point + x_lo (:obj: `torch.Tensor`): int tensor of indices of left values + in z_est for each point + x_hi (:obj: `torch.Tensor`): int tensor of indices of right values + in z_est for each point + w_ylo_xlo (:obj: `torch.Tensor`): float tensor of size M; + contains upper-left value weight for each point + w_ylo_xhi (:obj: `torch.Tensor`): float tensor of size M; + contains upper-right value weight for each point + w_yhi_xlo (:obj: `torch.Tensor`): float tensor of size M; + contains lower-left value weight for each point + w_yhi_xhi (:obj: `torch.Tensor`): float tensor of size M; + contains lower-right value weight for each point + """ + + x0_gt, y0_gt, w_gt, h_gt = bbox_xywh_gt[index_bbox].unbind(dim=1) + x0_est, y0_est, w_est, h_est = bbox_xywh_est[index_bbox].unbind(dim=1) + x_lo, x_hi, x_w, jx_valid = _linear_interpolation_utilities( + x_norm, x0_gt, w_gt, x0_est, w_est, zw + ) + y_lo, y_hi, y_w, jy_valid = _linear_interpolation_utilities( + y_norm, y0_gt, h_gt, y0_est, h_est, zh + ) + j_valid = jx_valid * jy_valid + + w_ylo_xlo = (1.0 - x_w) * (1.0 - y_w) + w_ylo_xhi = x_w * (1.0 - y_w) + w_yhi_xlo = (1.0 - x_w) * y_w + w_yhi_xhi = x_w * y_w + + return j_valid, y_lo, y_hi, x_lo, x_hi, w_ylo_xlo, w_ylo_xhi, w_yhi_xlo, w_yhi_xhi + + +def _extract_at_points_packed( + z_est, + index_bbox_valid, + slice_index_uv, + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo, + w_ylo_xhi, + w_yhi_xlo, + w_yhi_xhi, +): + """ + Extract ground truth values z_gt for valid point indices and estimated + values z_est using bilinear interpolation over top-left (y_lo, x_lo), + top-right (y_lo, x_hi), bottom-left (y_hi, x_lo) and bottom-right + (y_hi, x_hi) values in z_est with corresponding weights: + w_ylo_xlo, w_ylo_xhi, w_yhi_xlo and w_yhi_xhi. + Use slice_index_uv to slice dim=1 in z_est + """ + z_est_sampled = ( + z_est[index_bbox_valid, slice_index_uv, y_lo, x_lo] * w_ylo_xlo + + z_est[index_bbox_valid, slice_index_uv, y_lo, x_hi] * w_ylo_xhi + + z_est[index_bbox_valid, slice_index_uv, y_hi, x_lo] * w_yhi_xlo + + z_est[index_bbox_valid, slice_index_uv, y_hi, x_hi] * w_yhi_xhi + ) + return z_est_sampled + + +def _resample_data( + z, bbox_xywh_src, bbox_xywh_dst, wout, hout, mode="nearest", padding_mode="zeros" +): + """ + Args: + z (:obj: `torch.Tensor`): tensor of size (N,C,H,W) with data to be + resampled + bbox_xywh_src (:obj: `torch.Tensor`): tensor of size (N,4) containing + source bounding boxes in format XYWH + bbox_xywh_dst (:obj: `torch.Tensor`): tensor of size (N,4) containing + destination bounding boxes in format XYWH + Return: + zresampled (:obj: `torch.Tensor`): tensor of size (N, C, Hout, Wout) + with resampled values of z, where D is the discretization size + """ + n = bbox_xywh_src.size(0) + assert n == bbox_xywh_dst.size(0), ( + "The number of " + "source ROIs for resampling ({}) should be equal to the number " + "of destination ROIs ({})".format(bbox_xywh_src.size(0), bbox_xywh_dst.size(0)) + ) + x0src, y0src, wsrc, hsrc = bbox_xywh_src.unbind(dim=1) + x0dst, y0dst, wdst, hdst = bbox_xywh_dst.unbind(dim=1) + x0dst_norm = 2 * (x0dst - x0src) / wsrc - 1 + y0dst_norm = 2 * (y0dst - y0src) / hsrc - 1 + x1dst_norm = 2 * (x0dst + wdst - x0src) / wsrc - 1 + y1dst_norm = 2 * (y0dst + hdst - y0src) / hsrc - 1 + grid_w = torch.arange(wout, device=z.device, dtype=torch.float) / wout + grid_h = torch.arange(hout, device=z.device, dtype=torch.float) / hout + grid_w_expanded = grid_w[None, None, :].expand(n, hout, wout) + grid_h_expanded = grid_h[None, :, None].expand(n, hout, wout) + dx_expanded = (x1dst_norm - x0dst_norm)[:, None, None].expand(n, hout, wout) + dy_expanded = (y1dst_norm - y0dst_norm)[:, None, None].expand(n, hout, wout) + x0_expanded = x0dst_norm[:, None, None].expand(n, hout, wout) + y0_expanded = y0dst_norm[:, None, None].expand(n, hout, wout) + grid_x = grid_w_expanded * dx_expanded + x0_expanded + grid_y = grid_h_expanded * dy_expanded + y0_expanded + grid = torch.stack((grid_x, grid_y), dim=3) + # resample Z from (N, C, H, W) into (N, C, Hout, Wout) + zresampled = F.grid_sample(z, grid, mode=mode, padding_mode=padding_mode, align_corners=True) + return zresampled + + +def _extract_single_tensors_from_matches_one_image( + proposals_targets, bbox_with_dp_offset, bbox_global_offset +): + i_gt_all = [] + x_norm_all = [] + y_norm_all = [] + u_gt_all = [] + v_gt_all = [] + s_gt_all = [] + bbox_xywh_gt_all = [] + bbox_xywh_est_all = [] + # Ibbox_all == k should be true for all data that corresponds + # to bbox_xywh_gt[k] and bbox_xywh_est[k] + # index k here is global wrt images + i_bbox_all = [] + # at offset k (k is global) contains index of bounding box data + # within densepose output tensor + i_with_dp = [] + + boxes_xywh_est = proposals_targets.proposal_boxes.clone() + boxes_xywh_gt = proposals_targets.gt_boxes.clone() + n_i = len(boxes_xywh_est) + assert n_i == len(boxes_xywh_gt) + + if n_i: + boxes_xywh_est.tensor[:, 2] -= boxes_xywh_est.tensor[:, 0] + boxes_xywh_est.tensor[:, 3] -= boxes_xywh_est.tensor[:, 1] + boxes_xywh_gt.tensor[:, 2] -= boxes_xywh_gt.tensor[:, 0] + boxes_xywh_gt.tensor[:, 3] -= boxes_xywh_gt.tensor[:, 1] + if hasattr(proposals_targets, "gt_densepose"): + densepose_gt = proposals_targets.gt_densepose + for k, box_xywh_est, box_xywh_gt, dp_gt in zip( + range(n_i), boxes_xywh_est.tensor, boxes_xywh_gt.tensor, densepose_gt + ): + if (dp_gt is not None) and (len(dp_gt.x) > 0): + i_gt_all.append(dp_gt.i) + x_norm_all.append(dp_gt.x) + y_norm_all.append(dp_gt.y) + u_gt_all.append(dp_gt.u) + v_gt_all.append(dp_gt.v) + s_gt_all.append(dp_gt.segm.unsqueeze(0)) + bbox_xywh_gt_all.append(box_xywh_gt.view(-1, 4)) + bbox_xywh_est_all.append(box_xywh_est.view(-1, 4)) + i_bbox_k = torch.full_like(dp_gt.i, bbox_with_dp_offset + len(i_with_dp)) + i_bbox_all.append(i_bbox_k) + i_with_dp.append(bbox_global_offset + k) + return ( + i_gt_all, + x_norm_all, + y_norm_all, + u_gt_all, + v_gt_all, + s_gt_all, + bbox_xywh_gt_all, + bbox_xywh_est_all, + i_bbox_all, + i_with_dp, + ) + + +def _extract_single_tensors_from_matches(proposals_with_targets): + i_img = [] + i_gt_all = [] + x_norm_all = [] + y_norm_all = [] + u_gt_all = [] + v_gt_all = [] + s_gt_all = [] + bbox_xywh_gt_all = [] + bbox_xywh_est_all = [] + i_bbox_all = [] + i_with_dp_all = [] + n = 0 + for i, proposals_targets_per_image in enumerate(proposals_with_targets): + n_i = proposals_targets_per_image.proposal_boxes.tensor.size(0) + if not n_i: + continue + ( + i_gt_img, + x_norm_img, + y_norm_img, + u_gt_img, + v_gt_img, + s_gt_img, + bbox_xywh_gt_img, + bbox_xywh_est_img, + i_bbox_img, + i_with_dp_img, + ) = _extract_single_tensors_from_matches_one_image( # noqa + proposals_targets_per_image, len(i_with_dp_all), n + ) + i_gt_all.extend(i_gt_img) + x_norm_all.extend(x_norm_img) + y_norm_all.extend(y_norm_img) + u_gt_all.extend(u_gt_img) + v_gt_all.extend(v_gt_img) + s_gt_all.extend(s_gt_img) + bbox_xywh_gt_all.extend(bbox_xywh_gt_img) + bbox_xywh_est_all.extend(bbox_xywh_est_img) + i_bbox_all.extend(i_bbox_img) + i_with_dp_all.extend(i_with_dp_img) + i_img.extend([i] * len(i_with_dp_img)) + n += n_i + # concatenate all data into a single tensor + if (n > 0) and (len(i_with_dp_all) > 0): + i_gt = torch.cat(i_gt_all, 0).long() + x_norm = torch.cat(x_norm_all, 0) + y_norm = torch.cat(y_norm_all, 0) + u_gt = torch.cat(u_gt_all, 0) + v_gt = torch.cat(v_gt_all, 0) + s_gt = torch.cat(s_gt_all, 0) + bbox_xywh_gt = torch.cat(bbox_xywh_gt_all, 0) + bbox_xywh_est = torch.cat(bbox_xywh_est_all, 0) + i_bbox = torch.cat(i_bbox_all, 0).long() + else: + i_gt = None + x_norm = None + y_norm = None + u_gt = None + v_gt = None + s_gt = None + bbox_xywh_gt = None + bbox_xywh_est = None + i_bbox = None + return ( + i_img, + i_with_dp_all, + bbox_xywh_est, + bbox_xywh_gt, + i_gt, + x_norm, + y_norm, + u_gt, + v_gt, + s_gt, + i_bbox, + ) + + +class IIDIsotropicGaussianUVLoss(nn.Module): + """ + Loss for the case of iid residuals with isotropic covariance: + $Sigma_i = sigma_i^2 I$ + The loss (negative log likelihood) is then: + $1/2 sum_{i=1}^n (log(2 pi) + 2 log sigma_i^2 + ||delta_i||^2 / sigma_i^2)$, + where $delta_i=(u - u', v - v')$ is a 2D vector containing UV coordinates + difference between estimated and ground truth UV values + For details, see: + N. Neverova, D. Novotny, A. Vedaldi "Correlated Uncertainty for Learning + Dense Correspondences from Noisy Labels", p. 918--926, in Proc. NIPS 2019 + """ + + def __init__(self, sigma_lower_bound: float): + super(IIDIsotropicGaussianUVLoss, self).__init__() + self.sigma_lower_bound = sigma_lower_bound + self.log2pi = math.log(2 * math.pi) + + def forward( + self, + u: torch.Tensor, + v: torch.Tensor, + sigma_u: torch.Tensor, + target_u: torch.Tensor, + target_v: torch.Tensor, + ): + # compute $\sigma_i^2$ + # use sigma_lower_bound to avoid degenerate solution for variance + # (sigma -> 0) + sigma2 = F.softplus(sigma_u) + self.sigma_lower_bound + # compute \|delta_i\|^2 + delta_t_delta = (u - target_u) ** 2 + (v - target_v) ** 2 + # the total loss from the formula above: + loss = 0.5 * (self.log2pi + 2 * torch.log(sigma2) + delta_t_delta / sigma2) + return loss.sum() + + +class IndepAnisotropicGaussianUVLoss(nn.Module): + """ + Loss for the case of independent residuals with anisotropic covariances: + $Sigma_i = sigma_i^2 I + r_i r_i^T$ + The loss (negative log likelihood) is then: + $1/2 sum_{i=1}^n (log(2 pi) + + log sigma_i^2 (sigma_i^2 + ||r_i||^2) + + ||delta_i||^2 / sigma_i^2 + - ^2 / (sigma_i^2 * (sigma_i^2 + ||r_i||^2)))$, + where $delta_i=(u - u', v - v')$ is a 2D vector containing UV coordinates + difference between estimated and ground truth UV values + For details, see: + N. Neverova, D. Novotny, A. Vedaldi "Correlated Uncertainty for Learning + Dense Correspondences from Noisy Labels", p. 918--926, in Proc. NIPS 2019 + """ + + def __init__(self, sigma_lower_bound: float): + super(IndepAnisotropicGaussianUVLoss, self).__init__() + self.sigma_lower_bound = sigma_lower_bound + self.log2pi = math.log(2 * math.pi) + + def forward( + self, + u: torch.Tensor, + v: torch.Tensor, + sigma_u: torch.Tensor, + kappa_u_est: torch.Tensor, + kappa_v_est: torch.Tensor, + target_u: torch.Tensor, + target_v: torch.Tensor, + ): + # compute $\sigma_i^2$ + sigma2 = F.softplus(sigma_u) + self.sigma_lower_bound + # compute \|r_i\|^2 + r_sqnorm2 = kappa_u_est ** 2 + kappa_v_est ** 2 + delta_u = u - target_u + delta_v = v - target_v + # compute \|delta_i\|^2 + delta_sqnorm = delta_u ** 2 + delta_v ** 2 + delta_u_r_u = delta_u * kappa_u_est + delta_v_r_v = delta_v * kappa_v_est + # compute the scalar product + delta_r = delta_u_r_u + delta_v_r_v + # compute squared scalar product ^2 + delta_r_sqnorm = delta_r ** 2 + denom2 = sigma2 * (sigma2 + r_sqnorm2) + loss = 0.5 * ( + self.log2pi + torch.log(denom2) + delta_sqnorm / sigma2 - delta_r_sqnorm / denom2 + ) + return loss.sum() + + +class DensePoseLosses(object): + def __init__(self, cfg): + # fmt: off + self.heatmap_size = cfg.MODEL.ROI_DENSEPOSE_HEAD.HEATMAP_SIZE + self.w_points = cfg.MODEL.ROI_DENSEPOSE_HEAD.POINT_REGRESSION_WEIGHTS + self.w_part = cfg.MODEL.ROI_DENSEPOSE_HEAD.PART_WEIGHTS + self.w_segm = cfg.MODEL.ROI_DENSEPOSE_HEAD.INDEX_WEIGHTS + self.n_segm_chan = cfg.MODEL.ROI_DENSEPOSE_HEAD.NUM_COARSE_SEGM_CHANNELS + # fmt: on + self.confidence_model_cfg = DensePoseConfidenceModelConfig.from_cfg(cfg) + if self.confidence_model_cfg.uv_confidence.type == DensePoseUVConfidenceType.IID_ISO: + self.uv_loss_with_confidences = IIDIsotropicGaussianUVLoss( + self.confidence_model_cfg.uv_confidence.epsilon + ) + elif self.confidence_model_cfg.uv_confidence.type == DensePoseUVConfidenceType.INDEP_ANISO: + self.uv_loss_with_confidences = IndepAnisotropicGaussianUVLoss( + self.confidence_model_cfg.uv_confidence.epsilon + ) + + def __call__(self, proposals_with_gt, densepose_outputs, densepose_confidences): + losses = {} + # densepose outputs are computed for all images and all bounding boxes; + # i.e. if a batch has 4 images with (3, 1, 2, 1) proposals respectively, + # the outputs will have size(0) == 3+1+2+1 == 7 + s, index_uv, u, v = densepose_outputs + sigma_1, sigma_2, kappa_u, kappa_v = densepose_confidences + conf_type = self.confidence_model_cfg.uv_confidence.type + assert u.size(2) == v.size(2) + assert u.size(3) == v.size(3) + assert u.size(2) == index_uv.size(2) + assert u.size(3) == index_uv.size(3) + + with torch.no_grad(): + ( + index_uv_img, + i_with_dp, + bbox_xywh_est, + bbox_xywh_gt, + index_gt_all, + x_norm, + y_norm, + u_gt_all, + v_gt_all, + s_gt, + index_bbox, + ) = _extract_single_tensors_from_matches( # noqa + proposals_with_gt + ) + n_batch = len(i_with_dp) + + # NOTE: we need to keep the same computation graph on all the GPUs to + # perform reduction properly. Hence even if we have no data on one + # of the GPUs, we still need to generate the computation graph. + # Add fake (zero) loss in the form Tensor.sum() * 0 + if not n_batch: + losses["loss_densepose_I"] = index_uv.sum() * 0 + losses["loss_densepose_S"] = s.sum() * 0 + if self.confidence_model_cfg.uv_confidence.enabled: + losses["loss_densepose_UV"] = (u.sum() + v.sum()) * 0 + if conf_type == DensePoseUVConfidenceType.IID_ISO: + losses["loss_densepose_UV"] += sigma_2.sum() * 0 + elif conf_type == DensePoseUVConfidenceType.INDEP_ANISO: + losses["loss_densepose_UV"] += ( + sigma_2.sum() + kappa_u.sum() + kappa_v.sum() + ) * 0 + else: + losses["loss_densepose_U"] = u.sum() * 0 + losses["loss_densepose_V"] = v.sum() * 0 + return losses + + zh = u.size(2) + zw = u.size(3) + + ( + j_valid, + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo, + w_ylo_xhi, + w_yhi_xlo, + w_yhi_xhi, + ) = _grid_sampling_utilities( # noqa + zh, zw, bbox_xywh_est, bbox_xywh_gt, index_gt_all, x_norm, y_norm, index_bbox + ) + + j_valid_fg = j_valid * (index_gt_all > 0) + + u_gt = u_gt_all[j_valid_fg] + u_est_all = _extract_at_points_packed( + u[i_with_dp], + index_bbox, + index_gt_all, + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo, + w_ylo_xhi, + w_yhi_xlo, + w_yhi_xhi, + ) + u_est = u_est_all[j_valid_fg] + + v_gt = v_gt_all[j_valid_fg] + v_est_all = _extract_at_points_packed( + v[i_with_dp], + index_bbox, + index_gt_all, + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo, + w_ylo_xhi, + w_yhi_xlo, + w_yhi_xhi, + ) + v_est = v_est_all[j_valid_fg] + + index_uv_gt = index_gt_all[j_valid] + index_uv_est_all = _extract_at_points_packed( + index_uv[i_with_dp], + index_bbox, + slice(None), + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo[:, None], + w_ylo_xhi[:, None], + w_yhi_xlo[:, None], + w_yhi_xhi[:, None], + ) + index_uv_est = index_uv_est_all[j_valid, :] + + if self.confidence_model_cfg.uv_confidence.enabled: + sigma_2_est_all = _extract_at_points_packed( + sigma_2[i_with_dp], + index_bbox, + index_gt_all, + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo, + w_ylo_xhi, + w_yhi_xlo, + w_yhi_xhi, + ) + sigma_2_est = sigma_2_est_all[j_valid_fg] + if conf_type in [DensePoseUVConfidenceType.INDEP_ANISO]: + kappa_u_est_all = _extract_at_points_packed( + kappa_u[i_with_dp], + index_bbox, + index_gt_all, + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo, + w_ylo_xhi, + w_yhi_xlo, + w_yhi_xhi, + ) + kappa_u_est = kappa_u_est_all[j_valid_fg] + kappa_v_est_all = _extract_at_points_packed( + kappa_v[i_with_dp], + index_bbox, + index_gt_all, + y_lo, + y_hi, + x_lo, + x_hi, + w_ylo_xlo, + w_ylo_xhi, + w_yhi_xlo, + w_yhi_xhi, + ) + kappa_v_est = kappa_v_est_all[j_valid_fg] + + # Resample everything to the estimated data size, no need to resample + # S_est then: + s_est = s[i_with_dp] + with torch.no_grad(): + s_gt = _resample_data( + s_gt.unsqueeze(1), + bbox_xywh_gt, + bbox_xywh_est, + self.heatmap_size, + self.heatmap_size, + mode="nearest", + padding_mode="zeros", + ).squeeze(1) + + # add point-based losses: + if self.confidence_model_cfg.uv_confidence.enabled: + if conf_type == DensePoseUVConfidenceType.IID_ISO: + uv_loss = ( + self.uv_loss_with_confidences(u_est, v_est, sigma_2_est, u_gt, v_gt) + * self.w_points + ) + losses["loss_densepose_UV"] = uv_loss + elif conf_type == DensePoseUVConfidenceType.INDEP_ANISO: + uv_loss = ( + self.uv_loss_with_confidences( + u_est, v_est, sigma_2_est, kappa_u_est, kappa_v_est, u_gt, v_gt + ) + * self.w_points + ) + losses["loss_densepose_UV"] = uv_loss + else: + raise ValueError(f"Unknown confidence model type: {conf_type}") + else: + u_loss = F.smooth_l1_loss(u_est, u_gt, reduction="sum") * self.w_points + losses["loss_densepose_U"] = u_loss + v_loss = F.smooth_l1_loss(v_est, v_gt, reduction="sum") * self.w_points + losses["loss_densepose_V"] = v_loss + index_uv_loss = F.cross_entropy(index_uv_est, index_uv_gt.long()) * self.w_part + losses["loss_densepose_I"] = index_uv_loss + + if self.n_segm_chan == 2: + s_gt = s_gt > 0 + s_loss = F.cross_entropy(s_est, s_gt.long()) * self.w_segm + losses["loss_densepose_S"] = s_loss + return losses + + +def build_densepose_losses(cfg): + losses = DensePoseLosses(cfg) + return losses diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/evaluator.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/evaluator.py new file mode 100644 index 0000000..3bb002b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/evaluator.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import contextlib +import copy +import io +import itertools +import json +import logging +import os +from collections import OrderedDict +import torch +from fvcore.common.file_io import PathManager +from pycocotools.coco import COCO + +from detectron2.data import MetadataCatalog +from detectron2.evaluation import DatasetEvaluator +from detectron2.structures import BoxMode +from detectron2.utils.comm import all_gather, is_main_process, synchronize +from detectron2.utils.logger import create_small_table + +from .densepose_coco_evaluation import DensePoseCocoEval, DensePoseEvalMode + + +class DensePoseCOCOEvaluator(DatasetEvaluator): + def __init__(self, dataset_name, distributed, output_dir=None): + self._distributed = distributed + self._output_dir = output_dir + + self._cpu_device = torch.device("cpu") + self._logger = logging.getLogger(__name__) + + self._metadata = MetadataCatalog.get(dataset_name) + json_file = PathManager.get_local_path(self._metadata.json_file) + with contextlib.redirect_stdout(io.StringIO()): + self._coco_api = COCO(json_file) + + def reset(self): + self._predictions = [] + + def process(self, inputs, outputs): + """ + Args: + inputs: the inputs to a COCO model (e.g., GeneralizedRCNN). + It is a list of dict. Each dict corresponds to an image and + contains keys like "height", "width", "file_name", "image_id". + outputs: the outputs of a COCO model. It is a list of dicts with key + "instances" that contains :class:`Instances`. + The :class:`Instances` object needs to have `densepose` field. + """ + for input, output in zip(inputs, outputs): + instances = output["instances"].to(self._cpu_device) + + boxes = instances.pred_boxes.tensor.clone() + boxes = BoxMode.convert(boxes, BoxMode.XYXY_ABS, BoxMode.XYWH_ABS) + instances.pred_densepose = instances.pred_densepose.to_result(boxes) + + json_results = prediction_to_json(instances, input["image_id"]) + self._predictions.extend(json_results) + + def evaluate(self): + if self._distributed: + synchronize() + predictions = all_gather(self._predictions) + predictions = list(itertools.chain(*predictions)) + if not is_main_process(): + return + else: + predictions = self._predictions + + return copy.deepcopy(self._eval_predictions(predictions)) + + def _eval_predictions(self, predictions): + """ + Evaluate predictions on densepose. + Return results with the metrics of the tasks. + """ + self._logger.info("Preparing results for COCO format ...") + + if self._output_dir: + file_path = os.path.join(self._output_dir, "coco_densepose_results.json") + with open(file_path, "w") as f: + json.dump(predictions, f) + f.flush() + os.fsync(f.fileno()) + + self._logger.info("Evaluating predictions ...") + res = OrderedDict() + results_gps, results_gpsm = _evaluate_predictions_on_coco(self._coco_api, predictions) + res["densepose_gps"] = results_gps + res["densepose_gpsm"] = results_gpsm + return res + + +def prediction_to_json(instances, img_id): + """ + Args: + instances (Instances): the output of the model + img_id (str): the image id in COCO + + Returns: + list[dict]: the results in densepose evaluation format + """ + scores = instances.scores.tolist() + + results = [] + for k in range(len(instances)): + densepose = instances.pred_densepose[k] + result = { + "image_id": img_id, + "category_id": 1, # densepose only has one class + "bbox": densepose[1], + "score": scores[k], + "densepose": densepose, + } + results.append(result) + return results + + +def _evaluate_predictions_on_coco(coco_gt, coco_results): + metrics = ["AP", "AP50", "AP75", "APm", "APl"] + + logger = logging.getLogger(__name__) + + if len(coco_results) == 0: # cocoapi does not handle empty results very well + logger.warn("No predictions from the model! Set scores to -1") + results_gps = {metric: -1 for metric in metrics} + results_gpsm = {metric: -1 for metric in metrics} + return results_gps, results_gpsm + + coco_dt = coco_gt.loadRes(coco_results) + results_gps = _evaluate_predictions_on_coco_gps(coco_gt, coco_dt, metrics) + logger.info( + "Evaluation results for densepose, GPS metric: \n" + create_small_table(results_gps) + ) + results_gpsm = _evaluate_predictions_on_coco_gpsm(coco_gt, coco_dt, metrics) + logger.info( + "Evaluation results for densepose, GPSm metric: \n" + create_small_table(results_gpsm) + ) + return results_gps, results_gpsm + + +def _evaluate_predictions_on_coco_gps(coco_gt, coco_dt, metrics): + coco_eval = DensePoseCocoEval(coco_gt, coco_dt, "densepose", dpEvalMode=DensePoseEvalMode.GPS) + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + results = {metric: float(coco_eval.stats[idx] * 100) for idx, metric in enumerate(metrics)} + return results + + +def _evaluate_predictions_on_coco_gpsm(coco_gt, coco_dt, metrics): + coco_eval = DensePoseCocoEval(coco_gt, coco_dt, "densepose", dpEvalMode=DensePoseEvalMode.GPSM) + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + results = {metric: float(coco_eval.stats[idx] * 100) for idx, metric in enumerate(metrics)} + return results diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/modeling/test_time_augmentation.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/modeling/test_time_augmentation.py new file mode 100644 index 0000000..fcf69db --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/modeling/test_time_augmentation.py @@ -0,0 +1,75 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from detectron2.modeling.test_time_augmentation import GeneralizedRCNNWithTTA + + +class DensePoseGeneralizedRCNNWithTTA(GeneralizedRCNNWithTTA): + def __init__(self, cfg, model, transform_data, tta_mapper=None, batch_size=1): + """ + Args: + cfg (CfgNode): + model (GeneralizedRCNN): a GeneralizedRCNN to apply TTA on. + transform_data (DensePoseTransformData): contains symmetry label + transforms used for horizontal flip + tta_mapper (callable): takes a dataset dict and returns a list of + augmented versions of the dataset dict. Defaults to + `DatasetMapperTTA(cfg)`. + batch_size (int): batch the augmented images into this batch size for inference. + """ + self._transform_data = transform_data + super().__init__(cfg=cfg, model=model, tta_mapper=tta_mapper, batch_size=batch_size) + + # the implementation follows closely the one from detectron2/modeling + def _inference_one_image(self, input): + """ + Args: + input (dict): one dataset dict + + Returns: + dict: one output dict + """ + + augmented_inputs, aug_vars = self._get_augmented_inputs(input) + # Detect boxes from all augmented versions + with self._turn_off_roi_heads(["mask_on", "keypoint_on", "densepose_on"]): + # temporarily disable roi heads + all_boxes, all_scores, all_classes = self._get_augmented_boxes( + augmented_inputs, aug_vars + ) + merged_instances = self._merge_detections( + all_boxes, all_scores, all_classes, (aug_vars["height"], aug_vars["width"]) + ) + + if self.cfg.MODEL.MASK_ON or self.cfg.MODEL.DENSEPOSE_ON: + # Use the detected boxes to obtain new fields + augmented_instances = self._rescale_detected_boxes( + augmented_inputs, merged_instances, aug_vars + ) + # run forward on the detected boxes + outputs = self._batch_inference( + augmented_inputs, augmented_instances, do_postprocess=False + ) + # Delete now useless variables to avoid being out of memory + del augmented_inputs, augmented_instances, merged_instances + # average the predictions + if self.cfg.MODEL.MASK_ON: + outputs[0].pred_masks = self._reduce_pred_masks(outputs, aug_vars) + if self.cfg.MODEL.DENSEPOSE_ON: + outputs[0].pred_densepose = self._reduce_pred_densepose(outputs, aug_vars) + # postprocess + output = self._detector_postprocess(outputs[0], aug_vars) + return {"instances": output} + else: + return {"instances": merged_instances} + + def _reduce_pred_densepose(self, outputs, aug_vars): + for idx, output in enumerate(outputs): + if aug_vars["do_hflip"][idx]: + output.pred_densepose.hflip(self._transform_data) + # Less memory-intensive averaging + for attr in "SIUV": + setattr( + outputs[0].pred_densepose, + attr, + sum(getattr(o.pred_densepose, attr) for o in outputs) / len(outputs), + ) + return outputs[0].pred_densepose diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/roi_head.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/roi_head.py new file mode 100644 index 0000000..0231197 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/roi_head.py @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import numpy as np +from typing import Dict +import fvcore.nn.weight_init as weight_init +import torch +import torch.nn as nn +from torch.nn import functional as F + +from detectron2.layers import Conv2d, ShapeSpec, get_norm +from detectron2.modeling import ROI_HEADS_REGISTRY, StandardROIHeads +from detectron2.modeling.poolers import ROIPooler +from detectron2.modeling.roi_heads import select_foreground_proposals + +from .densepose_head import ( + build_densepose_data_filter, + build_densepose_head, + build_densepose_losses, + build_densepose_predictor, + densepose_inference, +) + + +class Decoder(nn.Module): + """ + A semantic segmentation head described in detail in the Panoptic Feature Pyramid Networks paper + (https://arxiv.org/abs/1901.02446). It takes FPN features as input and merges information from + all levels of the FPN into single output. + """ + + def __init__(self, cfg, input_shape: Dict[str, ShapeSpec], in_features): + super(Decoder, self).__init__() + + # fmt: off + self.in_features = in_features + feature_strides = {k: v.stride for k, v in input_shape.items()} + feature_channels = {k: v.channels for k, v in input_shape.items()} + num_classes = cfg.MODEL.ROI_DENSEPOSE_HEAD.DECODER_NUM_CLASSES + conv_dims = cfg.MODEL.ROI_DENSEPOSE_HEAD.DECODER_CONV_DIMS + self.common_stride = cfg.MODEL.ROI_DENSEPOSE_HEAD.DECODER_COMMON_STRIDE + norm = cfg.MODEL.ROI_DENSEPOSE_HEAD.DECODER_NORM + # fmt: on + + self.scale_heads = [] + for in_feature in self.in_features: + head_ops = [] + head_length = max( + 1, int(np.log2(feature_strides[in_feature]) - np.log2(self.common_stride)) + ) + for k in range(head_length): + conv = Conv2d( + feature_channels[in_feature] if k == 0 else conv_dims, + conv_dims, + kernel_size=3, + stride=1, + padding=1, + bias=not norm, + norm=get_norm(norm, conv_dims), + activation=F.relu, + ) + weight_init.c2_msra_fill(conv) + head_ops.append(conv) + if feature_strides[in_feature] != self.common_stride: + head_ops.append( + nn.Upsample(scale_factor=2, mode="bilinear", align_corners=False) + ) + self.scale_heads.append(nn.Sequential(*head_ops)) + self.add_module(in_feature, self.scale_heads[-1]) + self.predictor = Conv2d(conv_dims, num_classes, kernel_size=1, stride=1, padding=0) + weight_init.c2_msra_fill(self.predictor) + + def forward(self, features): + for i, _ in enumerate(self.in_features): + if i == 0: + x = self.scale_heads[i](features[i]) + else: + x = x + self.scale_heads[i](features[i]) + x = self.predictor(x) + return x + + +@ROI_HEADS_REGISTRY.register() +class DensePoseROIHeads(StandardROIHeads): + """ + A Standard ROIHeads which contains an addition of DensePose head. + """ + + def __init__(self, cfg, input_shape): + super().__init__(cfg, input_shape) + self._init_densepose_head(cfg, input_shape) + + def _init_densepose_head(self, cfg, input_shape): + # fmt: off + self.densepose_on = cfg.MODEL.DENSEPOSE_ON + if not self.densepose_on: + return + self.densepose_data_filter = build_densepose_data_filter(cfg) + dp_pooler_resolution = cfg.MODEL.ROI_DENSEPOSE_HEAD.POOLER_RESOLUTION + dp_pooler_sampling_ratio = cfg.MODEL.ROI_DENSEPOSE_HEAD.POOLER_SAMPLING_RATIO + dp_pooler_type = cfg.MODEL.ROI_DENSEPOSE_HEAD.POOLER_TYPE + self.use_decoder = cfg.MODEL.ROI_DENSEPOSE_HEAD.DECODER_ON + # fmt: on + if self.use_decoder: + dp_pooler_scales = (1.0 / input_shape[self.in_features[0]].stride,) + else: + dp_pooler_scales = tuple(1.0 / input_shape[k].stride for k in self.in_features) + in_channels = [input_shape[f].channels for f in self.in_features][0] + + if self.use_decoder: + self.decoder = Decoder(cfg, input_shape, self.in_features) + + self.densepose_pooler = ROIPooler( + output_size=dp_pooler_resolution, + scales=dp_pooler_scales, + sampling_ratio=dp_pooler_sampling_ratio, + pooler_type=dp_pooler_type, + ) + self.densepose_head = build_densepose_head(cfg, in_channels) + self.densepose_predictor = build_densepose_predictor( + cfg, self.densepose_head.n_out_channels + ) + self.densepose_losses = build_densepose_losses(cfg) + + def _forward_densepose(self, features, instances): + """ + Forward logic of the densepose prediction branch. + + Args: + features (list[Tensor]): #level input features for densepose prediction + instances (list[Instances]): the per-image instances to train/predict densepose. + In training, they can be the proposals. + In inference, they can be the predicted boxes. + + Returns: + In training, a dict of losses. + In inference, update `instances` with new fields "densepose" and return it. + """ + if not self.densepose_on: + return {} if self.training else instances + + features = [features[f] for f in self.in_features] + if self.training: + proposals, _ = select_foreground_proposals(instances, self.num_classes) + proposals_dp = self.densepose_data_filter(proposals) + if len(proposals_dp) > 0: + # NOTE may deadlock in DDP if certain workers have empty proposals_dp + proposal_boxes = [x.proposal_boxes for x in proposals_dp] + + if self.use_decoder: + features = [self.decoder(features)] + + features_dp = self.densepose_pooler(features, proposal_boxes) + densepose_head_outputs = self.densepose_head(features_dp) + densepose_outputs, _, confidences, _ = self.densepose_predictor( + densepose_head_outputs + ) + densepose_loss_dict = self.densepose_losses( + proposals_dp, densepose_outputs, confidences + ) + return densepose_loss_dict + else: + pred_boxes = [x.pred_boxes for x in instances] + + if self.use_decoder: + features = [self.decoder(features)] + + features_dp = self.densepose_pooler(features, pred_boxes) + if len(features_dp) > 0: + densepose_head_outputs = self.densepose_head(features_dp) + densepose_outputs, _, confidences, _ = self.densepose_predictor( + densepose_head_outputs + ) + else: + # If no detection occurred instances + # set densepose_outputs to empty tensors + empty_tensor = torch.zeros(size=(0, 0, 0, 0), device=features_dp.device) + densepose_outputs = tuple([empty_tensor] * 4) + confidences = tuple([empty_tensor] * 4) + + densepose_inference(densepose_outputs, confidences, instances) + return instances + + def forward(self, images, features, proposals, targets=None): + instances, losses = super().forward(images, features, proposals, targets) + del targets, images + + if self.training: + losses.update(self._forward_densepose(features, instances)) + return instances, losses + + def forward_with_given_boxes(self, features, instances): + """ + Use the given boxes in `instances` to produce other (non-box) per-ROI outputs. + + This is useful for downstream tasks where a box is known, but need to obtain + other attributes (outputs of other heads). + Test-time augmentation also uses this. + + Args: + features: same as in `forward()` + instances (list[Instances]): instances to predict other outputs. Expect the keys + "pred_boxes" and "pred_classes" to exist. + + Returns: + instances (list[Instances]): + the same `Instances` objects, with extra + fields such as `pred_masks` or `pred_keypoints`. + """ + + instances = super().forward_with_given_boxes(features, instances) + instances = self._forward_densepose(features, instances) + return instances diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/dbhelper.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/dbhelper.py new file mode 100644 index 0000000..b28862c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/dbhelper.py @@ -0,0 +1,145 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from typing import Any, Dict, Optional, Tuple + + +class EntrySelector(object): + """ + Base class for entry selectors + """ + + @staticmethod + def from_string(spec: str) -> "EntrySelector": + if spec == "*": + return AllEntrySelector() + return FieldEntrySelector(spec) + + +class AllEntrySelector(EntrySelector): + """ + Selector that accepts all entries + """ + + SPECIFIER = "*" + + def __call__(self, entry): + return True + + +class FieldEntrySelector(EntrySelector): + """ + Selector that accepts only entries that match provided field + specifier(s). Only a limited set of specifiers is supported for now: + ::=[] + ::=[] + is a valid identifier + ::= "int" | "str" + ::= "=" + ::= "," + ::= ":" + ::= | + ::= + ::= "-" + is a string without spaces and special symbols + (e.g. , , , ) + """ + + _SPEC_DELIM = "," + _TYPE_DELIM = ":" + _RANGE_DELIM = "-" + _EQUAL = "=" + _ERROR_PREFIX = "Invalid field selector specifier" + + class _FieldEntryValuePredicate(object): + """ + Predicate that checks strict equality for the specified entry field + """ + + def __init__(self, name: str, typespec: str, value: str): + import builtins + + self.name = name + self.type = getattr(builtins, typespec) if typespec is not None else str + self.value = value + + def __call__(self, entry): + return entry[self.name] == self.type(self.value) + + class _FieldEntryRangePredicate(object): + """ + Predicate that checks whether an entry field falls into the specified range + """ + + def __init__(self, name: str, typespec: str, vmin: str, vmax: str): + import builtins + + self.name = name + self.type = getattr(builtins, typespec) if typespec is not None else str + self.vmin = vmin + self.vmax = vmax + + def __call__(self, entry): + return (entry[self.name] >= self.type(self.vmin)) and ( + entry[self.name] <= self.type(self.vmax) + ) + + def __init__(self, spec: str): + self._predicates = self._parse_specifier_into_predicates(spec) + + def __call__(self, entry: Dict[str, Any]): + for predicate in self._predicates: + if not predicate(entry): + return False + return True + + def _parse_specifier_into_predicates(self, spec: str): + predicates = [] + specs = spec.split(self._SPEC_DELIM) + for subspec in specs: + eq_idx = subspec.find(self._EQUAL) + if eq_idx > 0: + field_name_with_type = subspec[:eq_idx] + field_name, field_type = self._parse_field_name_type(field_name_with_type) + field_value_or_range = subspec[eq_idx + 1 :] + if self._is_range_spec(field_value_or_range): + vmin, vmax = self._get_range_spec(field_value_or_range) + predicate = FieldEntrySelector._FieldEntryRangePredicate( + field_name, field_type, vmin, vmax + ) + else: + predicate = FieldEntrySelector._FieldEntryValuePredicate( + field_name, field_type, field_value_or_range + ) + predicates.append(predicate) + elif eq_idx == 0: + self._parse_error(f'"{subspec}", field name is empty!') + else: + self._parse_error(f'"{subspec}", should have format ' "=!") + return predicates + + def _parse_field_name_type(self, field_name_with_type: str) -> Tuple[str, Optional[str]]: + type_delim_idx = field_name_with_type.find(self._TYPE_DELIM) + if type_delim_idx > 0: + field_name = field_name_with_type[:type_delim_idx] + field_type = field_name_with_type[type_delim_idx + 1 :] + elif type_delim_idx == 0: + self._parse_error(f'"{field_name_with_type}", field name is empty!') + else: + field_name = field_name_with_type + field_type = None + return field_name, field_type + + def _is_range_spec(self, field_value_or_range): + delim_idx = field_value_or_range.find(self._RANGE_DELIM) + return delim_idx > 0 + + def _get_range_spec(self, field_value_or_range): + if self._is_range_spec(field_value_or_range): + delim_idx = field_value_or_range.find(self._RANGE_DELIM) + vmin = field_value_or_range[:delim_idx] + vmax = field_value_or_range[delim_idx + 1 :] + return vmin, vmax + else: + self._parse_error('"field_value_or_range", range of values expected!') + + def _parse_error(self, msg): + raise ValueError(f"{self._ERROR_PREFIX}: {msg}") diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/logger.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/logger.py new file mode 100644 index 0000000..e3fa45e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/logger.py @@ -0,0 +1,13 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging + + +def verbosity_to_level(verbosity): + if verbosity is not None: + if verbosity == 0: + return logging.WARNING + elif verbosity == 1: + return logging.INFO + elif verbosity >= 2: + return logging.DEBUG + return logging.WARNING diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/transform.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/transform.py new file mode 100644 index 0000000..b7cfe09 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/utils/transform.py @@ -0,0 +1,16 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from fvcore.common.file_io import PathManager + +from detectron2.data import MetadataCatalog + +from densepose import DensePoseTransformData + + +def load_for_dataset(dataset_name): + path = MetadataCatalog.get(dataset_name).densepose_transform_src + densepose_transform_data_fpath = PathManager.get_local_path(path) + return DensePoseTransformData.load(densepose_transform_data_fpath) + + +def load_from_cfg(cfg): + return load_for_dataset(cfg.DATASETS.TEST[0]) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/base.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/base.py new file mode 100644 index 0000000..2aa3e6e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/base.py @@ -0,0 +1,191 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import numpy as np +import cv2 +import torch + +Image = np.ndarray +Boxes = torch.Tensor + + +class MatrixVisualizer(object): + """ + Base visualizer for matrix data + """ + + def __init__( + self, + inplace=True, + cmap=cv2.COLORMAP_PARULA, + val_scale=1.0, + alpha=0.7, + interp_method_matrix=cv2.INTER_LINEAR, + interp_method_mask=cv2.INTER_NEAREST, + ): + self.inplace = inplace + self.cmap = cmap + self.val_scale = val_scale + self.alpha = alpha + self.interp_method_matrix = interp_method_matrix + self.interp_method_mask = interp_method_mask + + def visualize(self, image_bgr, mask, matrix, bbox_xywh): + self._check_image(image_bgr) + self._check_mask_matrix(mask, matrix) + if self.inplace: + image_target_bgr = image_bgr + else: + image_target_bgr = image_bgr * 0 + x, y, w, h = [int(v) for v in bbox_xywh] + if w <= 0 or h <= 0: + return image_bgr + mask, matrix = self._resize(mask, matrix, w, h) + mask_bg = np.tile((mask == 0)[:, :, np.newaxis], [1, 1, 3]) + matrix_scaled = matrix.astype(np.float32) * self.val_scale + _EPSILON = 1e-6 + if np.any(matrix_scaled > 255 + _EPSILON): + logger = logging.getLogger(__name__) + logger.warning( + f"Matrix has values > {255 + _EPSILON} after " f"scaling, clipping to [0..255]" + ) + matrix_scaled_8u = matrix_scaled.clip(0, 255).astype(np.uint8) + matrix_vis = cv2.applyColorMap(matrix_scaled_8u, self.cmap) + matrix_vis[mask_bg] = image_target_bgr[y : y + h, x : x + w, :][mask_bg] + image_target_bgr[y : y + h, x : x + w, :] = ( + image_target_bgr[y : y + h, x : x + w, :] * (1.0 - self.alpha) + matrix_vis * self.alpha + ) + return image_target_bgr.astype(np.uint8) + + def _resize(self, mask, matrix, w, h): + if (w != mask.shape[1]) or (h != mask.shape[0]): + mask = cv2.resize(mask, (w, h), self.interp_method_mask) + if (w != matrix.shape[1]) or (h != matrix.shape[0]): + matrix = cv2.resize(matrix, (w, h), self.interp_method_matrix) + return mask, matrix + + def _check_image(self, image_rgb): + assert len(image_rgb.shape) == 3 + assert image_rgb.shape[2] == 3 + assert image_rgb.dtype == np.uint8 + + def _check_mask_matrix(self, mask, matrix): + assert len(matrix.shape) == 2 + assert len(mask.shape) == 2 + assert mask.dtype == np.uint8 + + +class RectangleVisualizer(object): + + _COLOR_GREEN = (18, 127, 15) + + def __init__(self, color=_COLOR_GREEN, thickness=1): + self.color = color + self.thickness = thickness + + def visualize(self, image_bgr, bbox_xywh, color=None, thickness=None): + x, y, w, h = bbox_xywh + color = color or self.color + thickness = thickness or self.thickness + cv2.rectangle(image_bgr, (int(x), int(y)), (int(x + w), int(y + h)), color, thickness) + return image_bgr + + +class PointsVisualizer(object): + + _COLOR_GREEN = (18, 127, 15) + + def __init__(self, color_bgr=_COLOR_GREEN, r=5): + self.color_bgr = color_bgr + self.r = r + + def visualize(self, image_bgr, pts_xy, colors_bgr=None, rs=None): + for j, pt_xy in enumerate(pts_xy): + x, y = pt_xy + color_bgr = colors_bgr[j] if colors_bgr is not None else self.color_bgr + r = rs[j] if rs is not None else self.r + cv2.circle(image_bgr, (x, y), r, color_bgr, -1) + return image_bgr + + +class TextVisualizer(object): + + _COLOR_GRAY = (218, 227, 218) + _COLOR_WHITE = (255, 255, 255) + + def __init__( + self, + font_face=cv2.FONT_HERSHEY_SIMPLEX, + font_color_bgr=_COLOR_GRAY, + font_scale=0.35, + font_line_type=cv2.LINE_AA, + font_line_thickness=1, + fill_color_bgr=_COLOR_WHITE, + fill_color_transparency=1.0, + frame_color_bgr=_COLOR_WHITE, + frame_color_transparency=1.0, + frame_thickness=1, + ): + self.font_face = font_face + self.font_color_bgr = font_color_bgr + self.font_scale = font_scale + self.font_line_type = font_line_type + self.font_line_thickness = font_line_thickness + self.fill_color_bgr = fill_color_bgr + self.fill_color_transparency = fill_color_transparency + self.frame_color_bgr = frame_color_bgr + self.frame_color_transparency = frame_color_transparency + self.frame_thickness = frame_thickness + + def visualize(self, image_bgr, txt, topleft_xy): + txt_w, txt_h = self.get_text_size_wh(txt) + topleft_xy = tuple(map(int, topleft_xy)) + x, y = topleft_xy + if self.frame_color_transparency < 1.0: + t = self.frame_thickness + image_bgr[y - t : y + txt_h + t, x - t : x + txt_w + t, :] = ( + image_bgr[y - t : y + txt_h + t, x - t : x + txt_w + t, :] + * self.frame_color_transparency + + np.array(self.frame_color_bgr) * (1.0 - self.frame_color_transparency) + ).astype(np.float) + if self.fill_color_transparency < 1.0: + image_bgr[y : y + txt_h, x : x + txt_w, :] = ( + image_bgr[y : y + txt_h, x : x + txt_w, :] * self.fill_color_transparency + + np.array(self.fill_color_bgr) * (1.0 - self.fill_color_transparency) + ).astype(np.float) + cv2.putText( + image_bgr, + txt, + topleft_xy, + self.font_face, + self.font_scale, + self.font_color_bgr, + self.font_line_thickness, + self.font_line_type, + ) + return image_bgr + + def get_text_size_wh(self, txt): + ((txt_w, txt_h), _) = cv2.getTextSize( + txt, self.font_face, self.font_scale, self.font_line_thickness + ) + return txt_w, txt_h + + +class CompoundVisualizer(object): + def __init__(self, visualizers): + self.visualizers = visualizers + + def visualize(self, image_bgr, data): + assert len(data) == len( + self.visualizers + ), "The number of datas {} should match the number of visualizers" " {}".format( + len(data), len(self.visualizers) + ) + image = image_bgr + for i, visualizer in enumerate(self.visualizers): + image = visualizer.visualize(image, data[i]) + return image + + def __str__(self): + visualizer_str = ", ".join([str(v) for v in self.visualizers]) + return "Compound Visualizer [{}]".format(visualizer_str) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/bounding_box.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/bounding_box.py new file mode 100644 index 0000000..d7951d6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/bounding_box.py @@ -0,0 +1,37 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .base import RectangleVisualizer, TextVisualizer + + +class BoundingBoxVisualizer(object): + def __init__(self): + self.rectangle_visualizer = RectangleVisualizer() + + def visualize(self, image_bgr, boxes_xywh): + for bbox_xywh in boxes_xywh: + image_bgr = self.rectangle_visualizer.visualize(image_bgr, bbox_xywh) + return image_bgr + + +class ScoredBoundingBoxVisualizer(object): + def __init__(self, bbox_visualizer_params=None, score_visualizer_params=None): + if bbox_visualizer_params is None: + bbox_visualizer_params = {} + if score_visualizer_params is None: + score_visualizer_params = {} + self.visualizer_bbox = RectangleVisualizer(**bbox_visualizer_params) + self.visualizer_score = TextVisualizer(**score_visualizer_params) + + def visualize(self, image_bgr, scored_bboxes): + boxes_xywh, box_scores = scored_bboxes + assert len(boxes_xywh) == len( + box_scores + ), "Number of bounding boxes {} should be equal to the number of scores {}".format( + len(boxes_xywh), len(box_scores) + ) + for i, box_xywh in enumerate(boxes_xywh): + score_i = box_scores[i] + image_bgr = self.visualizer_bbox.visualize(image_bgr, box_xywh) + score_txt = "{0:6.4f}".format(score_i) + topleft_xy = box_xywh[0], box_xywh[1] + image_bgr = self.visualizer_score.visualize(image_bgr, score_txt, topleft_xy) + return image_bgr diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/densepose.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/densepose.py new file mode 100644 index 0000000..f2e77dc --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/densepose.py @@ -0,0 +1,593 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import numpy as np +from typing import Iterable, Optional, Tuple +import cv2 + +from ..data.structures import DensePoseDataRelative, DensePoseOutput, DensePoseResult +from .base import Boxes, Image, MatrixVisualizer, PointsVisualizer + + +class DensePoseResultsVisualizer(object): + def visualize(self, image_bgr: Image, densepose_result: Optional[DensePoseResult]) -> Image: + if densepose_result is None: + return image_bgr + context = self.create_visualization_context(image_bgr) + for i, result_encoded_w_shape in enumerate(densepose_result.results): + iuv_arr = DensePoseResult.decode_png_data(*result_encoded_w_shape) + bbox_xywh = densepose_result.boxes_xywh[i] + self.visualize_iuv_arr(context, iuv_arr, bbox_xywh) + image_bgr = self.context_to_image_bgr(context) + return image_bgr + + +class DensePoseMaskedColormapResultsVisualizer(DensePoseResultsVisualizer): + def __init__( + self, + data_extractor, + segm_extractor, + inplace=True, + cmap=cv2.COLORMAP_PARULA, + alpha=0.7, + val_scale=1.0, + ): + self.mask_visualizer = MatrixVisualizer( + inplace=inplace, cmap=cmap, val_scale=val_scale, alpha=alpha + ) + self.data_extractor = data_extractor + self.segm_extractor = segm_extractor + + def create_visualization_context(self, image_bgr: Image): + return image_bgr + + def context_to_image_bgr(self, context): + return context + + def get_image_bgr_from_context(self, context): + return context + + def visualize_iuv_arr(self, context, iuv_arr, bbox_xywh): + image_bgr = self.get_image_bgr_from_context(context) + matrix = self.data_extractor(iuv_arr) + segm = self.segm_extractor(iuv_arr) + mask = np.zeros(matrix.shape, dtype=np.uint8) + mask[segm > 0] = 1 + image_bgr = self.mask_visualizer.visualize(image_bgr, mask, matrix, bbox_xywh) + return image_bgr + + +def _extract_i_from_iuvarr(iuv_arr): + return iuv_arr[0, :, :] + + +def _extract_u_from_iuvarr(iuv_arr): + return iuv_arr[1, :, :] + + +def _extract_v_from_iuvarr(iuv_arr): + return iuv_arr[2, :, :] + + +class DensePoseResultsMplContourVisualizer(DensePoseResultsVisualizer): + def __init__(self, levels=10, **kwargs): + self.levels = levels + self.plot_args = kwargs + + def create_visualization_context(self, image_bgr: Image): + import matplotlib.pyplot as plt + from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas + + context = {} + context["image_bgr"] = image_bgr + dpi = 100 + height_inches = float(image_bgr.shape[0]) / dpi + width_inches = float(image_bgr.shape[1]) / dpi + fig = plt.figure(figsize=(width_inches, height_inches), dpi=dpi) + plt.axes([0, 0, 1, 1]) + plt.axis("off") + context["fig"] = fig + canvas = FigureCanvas(fig) + context["canvas"] = canvas + extent = (0, image_bgr.shape[1], image_bgr.shape[0], 0) + plt.imshow(image_bgr[:, :, ::-1], extent=extent) + return context + + def context_to_image_bgr(self, context): + fig = context["fig"] + w, h = map(int, fig.get_size_inches() * fig.get_dpi()) + canvas = context["canvas"] + canvas.draw() + image_1d = np.fromstring(canvas.tostring_rgb(), dtype="uint8") + image_rgb = image_1d.reshape(h, w, 3) + image_bgr = image_rgb[:, :, ::-1].copy() + return image_bgr + + def visualize_iuv_arr(self, context, iuv_arr: np.ndarray, bbox_xywh: Boxes) -> Image: + import matplotlib.pyplot as plt + + u = _extract_u_from_iuvarr(iuv_arr).astype(float) / 255.0 + v = _extract_v_from_iuvarr(iuv_arr).astype(float) / 255.0 + extent = ( + bbox_xywh[0], + bbox_xywh[0] + bbox_xywh[2], + bbox_xywh[1], + bbox_xywh[1] + bbox_xywh[3], + ) + plt.contour(u, self.levels, extent=extent, **self.plot_args) + plt.contour(v, self.levels, extent=extent, **self.plot_args) + + +class DensePoseResultsCustomContourVisualizer(DensePoseResultsVisualizer): + """ + Contour visualization using marching squares + """ + + def __init__(self, levels=10, **kwargs): + # TODO: colormap is hardcoded + cmap = cv2.COLORMAP_PARULA + if isinstance(levels, int): + self.levels = np.linspace(0, 1, levels) + else: + self.levels = levels + if "linewidths" in kwargs: + self.linewidths = kwargs["linewidths"] + else: + self.linewidths = [1] * len(self.levels) + self.plot_args = kwargs + img_colors_bgr = cv2.applyColorMap((self.levels * 255).astype(np.uint8), cmap) + self.level_colors_bgr = [ + [int(v) for v in img_color_bgr.ravel()] for img_color_bgr in img_colors_bgr + ] + + def create_visualization_context(self, image_bgr: Image): + return image_bgr + + def context_to_image_bgr(self, context): + return context + + def get_image_bgr_from_context(self, context): + return context + + def visualize_iuv_arr(self, context, iuv_arr: np.ndarray, bbox_xywh: Boxes) -> Image: + image_bgr = self.get_image_bgr_from_context(context) + segm = _extract_i_from_iuvarr(iuv_arr) + u = _extract_u_from_iuvarr(iuv_arr).astype(float) / 255.0 + v = _extract_v_from_iuvarr(iuv_arr).astype(float) / 255.0 + self._contours(image_bgr, u, segm, bbox_xywh) + self._contours(image_bgr, v, segm, bbox_xywh) + + def _contours(self, image_bgr, arr, segm, bbox_xywh): + for part_idx in range(1, DensePoseDataRelative.N_PART_LABELS + 1): + mask = segm == part_idx + if not np.any(mask): + continue + arr_min = np.amin(arr[mask]) + arr_max = np.amax(arr[mask]) + I, J = np.nonzero(mask) + i0 = np.amin(I) + i1 = np.amax(I) + 1 + j0 = np.amin(J) + j1 = np.amax(J) + 1 + if (j1 == j0 + 1) or (i1 == i0 + 1): + continue + Nw = arr.shape[1] - 1 + Nh = arr.shape[0] - 1 + for level_idx, level in enumerate(self.levels): + if (level < arr_min) or (level > arr_max): + continue + vp = arr[i0:i1, j0:j1] >= level + bin_codes = vp[:-1, :-1] + vp[1:, :-1] * 2 + vp[1:, 1:] * 4 + vp[:-1, 1:] * 8 + mp = mask[i0:i1, j0:j1] + bin_mask_codes = mp[:-1, :-1] + mp[1:, :-1] * 2 + mp[1:, 1:] * 4 + mp[:-1, 1:] * 8 + it = np.nditer(bin_codes, flags=["multi_index"]) + color_bgr = self.level_colors_bgr[level_idx] + linewidth = self.linewidths[level_idx] + while not it.finished: + if (it[0] != 0) and (it[0] != 15): + i, j = it.multi_index + if bin_mask_codes[i, j] != 0: + self._draw_line( + image_bgr, + arr, + mask, + level, + color_bgr, + linewidth, + it[0], + it.multi_index, + bbox_xywh, + Nw, + Nh, + (i0, j0), + ) + it.iternext() + + def _draw_line( + self, + image_bgr, + arr, + mask, + v, + color_bgr, + linewidth, + bin_code, + multi_idx, + bbox_xywh, + Nw, + Nh, + offset, + ): + lines = self._bin_code_2_lines(arr, v, bin_code, multi_idx, Nw, Nh, offset) + x0, y0, w, h = bbox_xywh + x1 = x0 + w + y1 = y0 + h + for line in lines: + x0r, y0r = line[0] + x1r, y1r = line[1] + pt0 = (int(x0 + x0r * (x1 - x0)), int(y0 + y0r * (y1 - y0))) + pt1 = (int(x0 + x1r * (x1 - x0)), int(y0 + y1r * (y1 - y0))) + cv2.line(image_bgr, pt0, pt1, color_bgr, linewidth) + + def _bin_code_2_lines(self, arr, v, bin_code, multi_idx, Nw, Nh, offset): + i0, j0 = offset + i, j = multi_idx + i += i0 + j += j0 + v0, v1, v2, v3 = arr[i, j], arr[i + 1, j], arr[i + 1, j + 1], arr[i, j + 1] + x0i = float(j) / Nw + y0j = float(i) / Nh + He = 1.0 / Nh + We = 1.0 / Nw + if (bin_code == 1) or (bin_code == 14): + a = (v - v0) / (v1 - v0) + b = (v - v0) / (v3 - v0) + pt1 = (x0i, y0j + a * He) + pt2 = (x0i + b * We, y0j) + return [(pt1, pt2)] + elif (bin_code == 2) or (bin_code == 13): + a = (v - v0) / (v1 - v0) + b = (v - v1) / (v2 - v1) + pt1 = (x0i, y0j + a * He) + pt2 = (x0i + b * We, y0j + He) + return [(pt1, pt2)] + elif (bin_code == 3) or (bin_code == 12): + a = (v - v0) / (v3 - v0) + b = (v - v1) / (v2 - v1) + pt1 = (x0i + a * We, y0j) + pt2 = (x0i + b * We, y0j + He) + return [(pt1, pt2)] + elif (bin_code == 4) or (bin_code == 11): + a = (v - v1) / (v2 - v1) + b = (v - v3) / (v2 - v3) + pt1 = (x0i + a * We, y0j + He) + pt2 = (x0i + We, y0j + b * He) + return [(pt1, pt2)] + elif (bin_code == 6) or (bin_code == 9): + a = (v - v0) / (v1 - v0) + b = (v - v3) / (v2 - v3) + pt1 = (x0i, y0j + a * He) + pt2 = (x0i + We, y0j + b * He) + return [(pt1, pt2)] + elif (bin_code == 7) or (bin_code == 8): + a = (v - v0) / (v3 - v0) + b = (v - v3) / (v2 - v3) + pt1 = (x0i + a * We, y0j) + pt2 = (x0i + We, y0j + b * He) + return [(pt1, pt2)] + elif bin_code == 5: + a1 = (v - v0) / (v1 - v0) + b1 = (v - v1) / (v2 - v1) + pt11 = (x0i, y0j + a1 * He) + pt12 = (x0i + b1 * We, y0j + He) + a2 = (v - v0) / (v3 - v0) + b2 = (v - v3) / (v2 - v3) + pt21 = (x0i + a2 * We, y0j) + pt22 = (x0i + We, y0j + b2 * He) + return [(pt11, pt12), (pt21, pt22)] + elif bin_code == 10: + a1 = (v - v0) / (v3 - v0) + b1 = (v - v0) / (v1 - v0) + pt11 = (x0i + a1 * We, y0j) + pt12 = (x0i, y0j + b1 * He) + a2 = (v - v1) / (v2 - v1) + b2 = (v - v3) / (v2 - v3) + pt21 = (x0i + a2 * We, y0j + He) + pt22 = (x0i + We, y0j + b2 * He) + return [(pt11, pt12), (pt21, pt22)] + return [] + + +try: + import matplotlib + + matplotlib.use("Agg") + DensePoseResultsContourVisualizer = DensePoseResultsMplContourVisualizer +except ModuleNotFoundError: + logger = logging.getLogger(__name__) + logger.warning("Could not import matplotlib, using custom contour visualizer") + DensePoseResultsContourVisualizer = DensePoseResultsCustomContourVisualizer + + +class DensePoseResultsFineSegmentationVisualizer(DensePoseMaskedColormapResultsVisualizer): + def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7): + super(DensePoseResultsFineSegmentationVisualizer, self).__init__( + _extract_i_from_iuvarr, + _extract_i_from_iuvarr, + inplace, + cmap, + alpha, + val_scale=255.0 / DensePoseDataRelative.N_PART_LABELS, + ) + + +class DensePoseResultsUVisualizer(DensePoseMaskedColormapResultsVisualizer): + def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7): + super(DensePoseResultsUVisualizer, self).__init__( + _extract_u_from_iuvarr, _extract_i_from_iuvarr, inplace, cmap, alpha, val_scale=1.0 + ) + + +class DensePoseResultsVVisualizer(DensePoseMaskedColormapResultsVisualizer): + def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7): + super(DensePoseResultsVVisualizer, self).__init__( + _extract_v_from_iuvarr, _extract_i_from_iuvarr, inplace, cmap, alpha, val_scale=1.0 + ) + + +class DensePoseOutputsFineSegmentationVisualizer(object): + def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7): + self.mask_visualizer = MatrixVisualizer( + inplace=inplace, + cmap=cmap, + val_scale=255.0 / DensePoseDataRelative.N_PART_LABELS, + alpha=alpha, + ) + + def visualize( + self, image_bgr: Image, dp_output_with_bboxes: Optional[Tuple[DensePoseOutput, Boxes]] + ) -> Image: + if dp_output_with_bboxes is None: + return image_bgr + densepose_output, bboxes_xywh = dp_output_with_bboxes + S = densepose_output.S + I = densepose_output.I # noqa + U = densepose_output.U + V = densepose_output.V + N = S.size(0) + assert N == I.size( + 0 + ), "densepose outputs S {} and I {}" " should have equal first dim size".format( + S.size(), I.size() + ) + assert N == U.size( + 0 + ), "densepose outputs S {} and U {}" " should have equal first dim size".format( + S.size(), U.size() + ) + assert N == V.size( + 0 + ), "densepose outputs S {} and V {}" " should have equal first dim size".format( + S.size(), V.size() + ) + assert N == len( + bboxes_xywh + ), "number of bounding boxes {}" " should be equal to first dim size of outputs {}".format( + len(bboxes_xywh), N + ) + for n in range(N): + Sn = S[n].argmax(dim=0) + In = I[n].argmax(dim=0) * (Sn > 0).long() + matrix = In.cpu().numpy().astype(np.uint8) + mask = np.zeros(matrix.shape, dtype=np.uint8) + mask[matrix > 0] = 1 + bbox_xywh = bboxes_xywh[n] + image_bgr = self.mask_visualizer.visualize(image_bgr, mask, matrix, bbox_xywh) + return image_bgr + + +class DensePoseOutputsUVisualizer(object): + def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7): + self.mask_visualizer = MatrixVisualizer( + inplace=inplace, cmap=cmap, val_scale=1.0, alpha=alpha + ) + + def visualize( + self, image_bgr: Image, dp_output_with_bboxes: Optional[Tuple[DensePoseOutput, Boxes]] + ) -> Image: + if dp_output_with_bboxes is None: + return image_bgr + densepose_output, bboxes_xywh = dp_output_with_bboxes + assert isinstance( + densepose_output, DensePoseOutput + ), "DensePoseOutput expected, {} encountered".format(type(densepose_output)) + S = densepose_output.S + I = densepose_output.I # noqa + U = densepose_output.U + V = densepose_output.V + N = S.size(0) + assert N == I.size( + 0 + ), "densepose outputs S {} and I {}" " should have equal first dim size".format( + S.size(), I.size() + ) + assert N == U.size( + 0 + ), "densepose outputs S {} and U {}" " should have equal first dim size".format( + S.size(), U.size() + ) + assert N == V.size( + 0 + ), "densepose outputs S {} and V {}" " should have equal first dim size".format( + S.size(), V.size() + ) + assert N == len( + bboxes_xywh + ), "number of bounding boxes {}" " should be equal to first dim size of outputs {}".format( + len(bboxes_xywh), N + ) + for n in range(N): + Sn = S[n].argmax(dim=0) + In = I[n].argmax(dim=0) * (Sn > 0).long() + segmentation = In.cpu().numpy().astype(np.uint8) + mask = np.zeros(segmentation.shape, dtype=np.uint8) + mask[segmentation > 0] = 1 + Un = U[n].cpu().numpy().astype(np.float32) + Uvis = np.zeros(segmentation.shape, dtype=np.float32) + for partId in range(Un.shape[0]): + Uvis[segmentation == partId] = Un[partId][segmentation == partId].clip(0, 1) * 255 + bbox_xywh = bboxes_xywh[n] + image_bgr = self.mask_visualizer.visualize(image_bgr, mask, Uvis, bbox_xywh) + return image_bgr + + +class DensePoseOutputsVVisualizer(object): + def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7): + self.mask_visualizer = MatrixVisualizer( + inplace=inplace, cmap=cmap, val_scale=1.0, alpha=alpha + ) + + def visualize( + self, image_bgr: Image, dp_output_with_bboxes: Optional[Tuple[DensePoseOutput, Boxes]] + ) -> Image: + if dp_output_with_bboxes is None: + return image_bgr + densepose_output, bboxes_xywh = dp_output_with_bboxes + assert isinstance( + densepose_output, DensePoseOutput + ), "DensePoseOutput expected, {} encountered".format(type(densepose_output)) + S = densepose_output.S + I = densepose_output.I # noqa + U = densepose_output.U + V = densepose_output.V + N = S.size(0) + assert N == I.size( + 0 + ), "densepose outputs S {} and I {}" " should have equal first dim size".format( + S.size(), I.size() + ) + assert N == U.size( + 0 + ), "densepose outputs S {} and U {}" " should have equal first dim size".format( + S.size(), U.size() + ) + assert N == V.size( + 0 + ), "densepose outputs S {} and V {}" " should have equal first dim size".format( + S.size(), V.size() + ) + assert N == len( + bboxes_xywh + ), "number of bounding boxes {}" " should be equal to first dim size of outputs {}".format( + len(bboxes_xywh), N + ) + for n in range(N): + Sn = S[n].argmax(dim=0) + In = I[n].argmax(dim=0) * (Sn > 0).long() + segmentation = In.cpu().numpy().astype(np.uint8) + mask = np.zeros(segmentation.shape, dtype=np.uint8) + mask[segmentation > 0] = 1 + Vn = V[n].cpu().numpy().astype(np.float32) + Vvis = np.zeros(segmentation.shape, dtype=np.float32) + for partId in range(Vn.size(0)): + Vvis[segmentation == partId] = Vn[partId][segmentation == partId].clip(0, 1) * 255 + bbox_xywh = bboxes_xywh[n] + image_bgr = self.mask_visualizer.visualize(image_bgr, mask, Vvis, bbox_xywh) + return image_bgr + + +class DensePoseDataCoarseSegmentationVisualizer(object): + """ + Visualizer for ground truth segmentation + """ + + def __init__(self, inplace=True, cmap=cv2.COLORMAP_PARULA, alpha=0.7): + 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(object): + def __init__(self, densepose_data_to_value_fn=None, cmap=cv2.COLORMAP_PARULA): + 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): + super(DensePoseDataPointsUVisualizer, self).__init__( + densepose_data_to_value_fn=_densepose_data_u_for_cmap + ) + + +class DensePoseDataPointsVVisualizer(DensePoseDataPointsVisualizer): + def __init__(self): + super(DensePoseDataPointsVVisualizer, self).__init__( + densepose_data_to_value_fn=_densepose_data_v_for_cmap + ) + + +class DensePoseDataPointsIVisualizer(DensePoseDataPointsVisualizer): + def __init__(self): + super(DensePoseDataPointsIVisualizer, self).__init__( + densepose_data_to_value_fn=_densepose_data_i_for_cmap + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/extractor.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/extractor.py new file mode 100644 index 0000000..b715a44 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/densepose/vis/extractor.py @@ -0,0 +1,152 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +from typing import Sequence +import torch + +from detectron2.layers.nms import batched_nms +from detectron2.structures.instances import Instances + +from densepose.vis.bounding_box import BoundingBoxVisualizer, ScoredBoundingBoxVisualizer +from densepose.vis.densepose import DensePoseResultsVisualizer + +from .base import CompoundVisualizer + +Scores = Sequence[float] + + +def extract_scores_from_instances(instances: Instances, select=None): + if instances.has("scores"): + return instances.scores if select is None else instances.scores[select] + return None + + +def extract_boxes_xywh_from_instances(instances: Instances, select=None): + if instances.has("pred_boxes"): + boxes_xywh = instances.pred_boxes.tensor.clone() + boxes_xywh[:, 2] -= boxes_xywh[:, 0] + boxes_xywh[:, 3] -= boxes_xywh[:, 1] + return boxes_xywh if select is None else boxes_xywh[select] + return None + + +def create_extractor(visualizer: object): + """ + Create an extractor for the provided visualizer + """ + if isinstance(visualizer, CompoundVisualizer): + extractors = [create_extractor(v) for v in visualizer.visualizers] + return CompoundExtractor(extractors) + elif isinstance(visualizer, DensePoseResultsVisualizer): + return DensePoseResultExtractor() + elif isinstance(visualizer, ScoredBoundingBoxVisualizer): + return CompoundExtractor([extract_boxes_xywh_from_instances, extract_scores_from_instances]) + elif isinstance(visualizer, BoundingBoxVisualizer): + return extract_boxes_xywh_from_instances + else: + logger = logging.getLogger(__name__) + logger.error(f"Could not create extractor for {visualizer}") + return None + + +class BoundingBoxExtractor(object): + """ + Extracts bounding boxes from instances + """ + + def __call__(self, instances: Instances): + boxes_xywh = extract_boxes_xywh_from_instances(instances) + return boxes_xywh + + +class ScoredBoundingBoxExtractor(object): + """ + Extracts bounding boxes from instances + """ + + def __call__(self, instances: Instances, select=None): + scores = extract_scores_from_instances(instances) + boxes_xywh = extract_boxes_xywh_from_instances(instances) + if (scores is None) or (boxes_xywh is None): + return (boxes_xywh, scores) + if select is not None: + scores = scores[select] + boxes_xywh = boxes_xywh[select] + return (boxes_xywh, scores) + + +class DensePoseResultExtractor(object): + """ + Extracts DensePose result from instances + """ + + def __call__(self, instances: Instances, select=None): + boxes_xywh = extract_boxes_xywh_from_instances(instances) + if instances.has("pred_densepose") and (boxes_xywh is not None): + dpout = instances.pred_densepose + if select is not None: + dpout = dpout[select] + boxes_xywh = boxes_xywh[select] + return dpout.to_result(boxes_xywh) + else: + return None + + +class CompoundExtractor(object): + """ + Extracts data for CompoundVisualizer + """ + + def __init__(self, extractors): + self.extractors = extractors + + def __call__(self, instances: Instances, select=None): + datas = [] + for extractor in self.extractors: + data = extractor(instances, select) + datas.append(data) + return datas + + +class NmsFilteredExtractor(object): + """ + Extracts data in the format accepted by NmsFilteredVisualizer + """ + + def __init__(self, extractor, iou_threshold): + self.extractor = extractor + self.iou_threshold = iou_threshold + + def __call__(self, instances: Instances, select=None): + scores = extract_scores_from_instances(instances) + boxes_xywh = extract_boxes_xywh_from_instances(instances) + if boxes_xywh is None: + return None + select_local_idx = batched_nms( + boxes_xywh, + scores, + torch.zeros(len(scores), dtype=torch.int32), + iou_threshold=self.iou_threshold, + ).squeeze() + select_local = torch.zeros(len(boxes_xywh), dtype=torch.bool, device=boxes_xywh.device) + select_local[select_local_idx] = True + select = select_local if select is None else (select & select_local) + return self.extractor(instances, select=select) + + +class ScoreThresholdedExtractor(object): + """ + Extracts data in the format accepted by ScoreThresholdedVisualizer + """ + + def __init__(self, extractor, min_score): + self.extractor = extractor + self.min_score = min_score + + def __call__(self, instances: Instances, select=None): + scores = extract_scores_from_instances(instances) + if scores is None: + return None + select_local = scores > self.min_score + select = select_local if select is None else (select & select_local) + data = self.extractor(instances, select=select) + return data diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/README.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/README.md new file mode 100644 index 0000000..e3a94b6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/README.md @@ -0,0 +1,7 @@ + +## Some scripts for developers to use, include: + +- `run_instant_tests.sh`: run training for a few iterations. +- `run_inference_tests.sh`: run inference on a small dataset. +- `../../dev/linter.sh`: lint the codebase before commit +- `../../dev/parse_results.sh`: parse results from log file. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_inference_tests.sh b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_inference_tests.sh new file mode 100644 index 0000000..34f47d5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_inference_tests.sh @@ -0,0 +1,33 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +BIN="python train_net.py" +OUTPUT="inference_test_output" +NUM_GPUS=2 +IMS_PER_GPU=2 +IMS_PER_BATCH=$(( NUM_GPUS * IMS_PER_GPU )) + +CFG_LIST=( "${@:1}" ) + +if [ ${#CFG_LIST[@]} -eq 0 ]; then + CFG_LIST=( ./configs/quick_schedules/*inference_acc_test.yaml ) +fi + +echo "========================================================================" +echo "Configs to run:" +echo "${CFG_LIST[@]}" +echo "========================================================================" + +for cfg in "${CFG_LIST[@]}"; do + echo "========================================================================" + echo "Running $cfg ..." + echo "========================================================================" + $BIN \ + --eval-only \ + --num-gpus $NUM_GPUS \ + --config-file "$cfg" \ + OUTPUT_DIR "$OUTPUT" \ + SOLVER.IMS_PER_BATCH $IMS_PER_BATCH + rm -rf $OUTPUT +done + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_instant_tests.sh b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_instant_tests.sh new file mode 100644 index 0000000..a537851 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/dev/run_instant_tests.sh @@ -0,0 +1,28 @@ +#!/bin/bash -e +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +BIN="python train_net.py" +OUTPUT="instant_test_output" +NUM_GPUS=2 +SOLVER_IMS_PER_BATCH=$((NUM_GPUS * 2)) + +CFG_LIST=( "${@:1}" ) +if [ ${#CFG_LIST[@]} -eq 0 ]; then + CFG_LIST=( ./configs/quick_schedules/*instant_test.yaml ) +fi + +echo "========================================================================" +echo "Configs to run:" +echo "${CFG_LIST[@]}" +echo "========================================================================" + +for cfg in "${CFG_LIST[@]}"; do + echo "========================================================================" + echo "Running $cfg ..." + echo "========================================================================" + $BIN --num-gpus $NUM_GPUS --config-file "$cfg" \ + SOLVER.IMS_PER_BATCH $SOLVER_IMS_PER_BATCH \ + OUTPUT_DIR "$OUTPUT" + rm -rf "$OUTPUT" +done + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/GETTING_STARTED.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/GETTING_STARTED.md new file mode 100644 index 0000000..a6bcbed --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/GETTING_STARTED.md @@ -0,0 +1,58 @@ +# Getting Started with DensePose + +## Inference with Pre-trained Models + +1. Pick a model and its config file from [Model Zoo](MODEL_ZOO.md), for example [densepose_rcnn_R_50_FPN_s1x.yaml](../configs/densepose_rcnn_R_50_FPN_s1x.yaml) +2. Run the [Apply Net](TOOL_APPLY_NET.md) tool to visualize the results or save the to disk. For example, to use contour visualization for DensePose, one can run: +```bash +python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml densepose_rcnn_R_50_FPN_s1x.pkl image.jpg dp_contour,bbox --output image_densepose_contour.png +``` +Please see [Apply Net](TOOL_APPLY_NET.md) for more details on the tool. + +## Training + +First, prepare the [dataset](http://densepose.org/#dataset) into the following structure under the directory you'll run training scripts: +
    +datasets/coco/
    +  annotations/
    +    densepose_{train,minival,valminusminival}2014.json
    +    densepose_minival2014_100.json   (optional, for testing only)
    +  {train,val}2014/
    +    # image files that are mentioned in the corresponding json
    +
    + +To train a model one can use the [train_net.py](../train_net.py) script. +This script was used to train all DensePose models in [Model Zoo](MODEL_ZOO.md). +For example, to launch end-to-end DensePose-RCNN training with ResNet-50 FPN backbone +on 8 GPUs following the s1x schedule, one can run +```bash +python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml --num-gpus 8 +``` +The configs are made for 8-GPU training. To train on 1 GPU, one can apply the +[linear learning rate scaling rule](https://arxiv.org/abs/1706.02677): +```bash +python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml \ + SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025 +``` + +## Evaluation + +Model testing can be done in the same way as training, except for an additional flag `--eval-only` and +model location specification through `MODEL.WEIGHTS model.pth` in the command line +```bash +python train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml \ + --eval-only MODEL.WEIGHTS model.pth +``` + +## Tools + +We provide tools which allow one to: + - easily view DensePose annotated data in a dataset; + - perform DensePose inference on a set of images; + - visualize DensePose model results; + +`query_db` is a tool to print or visualize DensePose data in a dataset. +Please refer to [Query DB](TOOL_QUERY_DB.md) for more details on this tool + +`apply_net` is a tool to print or visualize DensePose results. +Please refer to [Apply Net](TOOL_APPLY_NET.md) for more details on this tool diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/MODEL_ZOO.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/MODEL_ZOO.md new file mode 100644 index 0000000..c263084 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/MODEL_ZOO.md @@ -0,0 +1,277 @@ +# Model Zoo and Baselines + +# Introduction + +We provide baselines trained with Detectron2 DensePose. The corresponding +configuration files can be found in the [configs](../configs) directory. +All models were trained on COCO `train2014` + `valminusminival2014` and +evaluated on COCO `minival2014`. For the details on common settings in which +baselines were trained, please check [Detectron 2 Model Zoo](../../../MODEL_ZOO.md). + +## License + +All models available for download through this document are licensed under the +[Creative Commons Attribution-ShareAlike 3.0 license](https://creativecommons.org/licenses/by-sa/3.0/) + +## COCO DensePose Baselines with DensePose-RCNN + +### Legacy Models + +Baselines trained using schedules from [Güler et al, 2018](https://arxiv.org/pdf/1802.00434.pdf) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    dp. AP
    GPS
    dp. AP
    GPSm
    model iddownload
    R_50_FPN_s1x_legacys1x0.3070.0513.258.152.154.9164832157model | metrics
    R_101_FPN_s1x_legacys1x0.3900.0634.359.553.256.1164832182model | metrics
    + +### Improved Baselines, Original Fully Convolutional Haad + +These models use an improved training schedule and Panoptic FPN head from [Kirillov et al, 2019](https://arxiv.org/abs/1901.02446). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    dp. AP
    GPS
    dp. AP
    GPSm
    model iddownload
    R_50_FPN_s1xs1x0.3590.0664.561.263.765.3165712039model | metrics
    R_101_FPN_s1xs1x0.4280.0795.862.364.566.4165712084model | metrics
    + +### Improved Baselines, DeepLabV3 Head + +These models use an improved training schedule, Panoptic FPN head from [Kirillov et al, 2019](https://arxiv.org/abs/1901.02446) and DeepLabV3 head from [Chen et al, 2017](https://arxiv.org/abs/1706.05587). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    dp. AP
    GPS
    dp. AP
    GPSm
    model iddownload
    R_50_FPN_DL_s1xs1x0.3920.0706.761.165.666.8165712097model | metrics
    R_101_FPN_DL_s1xs1x0.4780.0837.062.366.367.7165712116model | metrics
    + +### Baselines with Confidence Estimation + +These models perform additional estimation of confidence in regressed UV coodrinates, along the lines of [Neverova et al., 2019](https://papers.nips.cc/paper/8378-correlated-uncertainty-for-learning-dense-correspondences-from-noisy-labels). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Namelr
    sched
    train
    time
    (s/iter)
    inference
    time
    (s/im)
    train
    mem
    (GB)
    box
    AP
    dp. AP
    GPS
    dp. AP
    GPSm
    model iddownload
    R_50_FPN_WC1_s1xs1x0.3530.0644.660.564.265.6173862049model | metrics
    R_50_FPN_WC2_s1xs1x0.3640.0664.860.764.265.7173861455model | metrics
    R_50_FPN_DL_WC1_s1xs1x0.3970.0686.761.165.867.1173067973model | metrics
    R_50_FPN_DL_WC2_s1xs1x0.4100.0706.860.865.666.7173859335model | metrics
    R_101_FPN_WC1_s1xs1x0.4350.0765.762.564.966.5171402969model | metrics
    R_101_FPN_WC2_s1xs1x0.4500.0785.762.364.866.6173860702model | metrics
    R_101_FPN_DL_WC1_s1xs1x0.4790.0817.962.066.267.4173858525model | metrics
    R_101_FPN_DL_WC2_s1xs1x0.4910.0827.661.765.967.3173294801model | metrics
    + +## Old Baselines + +It is still possible to use some baselines from [DensePose 1](https://github.com/facebookresearch/DensePose). +Below are evaluation metrics for the baselines recomputed in the current framework: + +| Model | bbox AP | AP | AP50 | AP75 | APm |APl | +|-----|-----|-----|--- |--- |--- |--- | +| [`ResNet50_FPN_s1x-e2e`](https://dl.fbaipublicfiles.com/densepose/DensePose_ResNet50_FPN_s1x-e2e.pkl) | 54.673 | 48.894 | 84.963 | 50.717 | 43.132 | 50.433 | +| [`ResNet101_FPN_s1x-e2e`](https://dl.fbaipublicfiles.com/densepose/DensePose_ResNet101_FPN_s1x-e2e.pkl) | 56.032 | 51.088 | 86.250 | 55.057 | 46.542 | 52.563 | + +Note: these scores are close, but not strictly equal to the ones reported in the [DensePose 1 Model Zoo](https://github.com/facebookresearch/DensePose/blob/master/MODEL_ZOO.md), +which is due to small incompatibilities between the frameworks. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_APPLY_NET.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_APPLY_NET.md new file mode 100644 index 0000000..f5cf257 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_APPLY_NET.md @@ -0,0 +1,130 @@ +# Apply Net + +`apply_net` is a tool to print or visualize DensePose results on a set of images. +It has two modes: `dump` to save DensePose model results to a pickle file +and `show` to visualize them on images. + +## Dump Mode + +The general command form is: +```bash +python apply_net.py dump [-h] [-v] [--output ] +``` + +There are three mandatory arguments: + - ``, configuration file for a given model; + - ``, model file with trained parameters + - ``, input image file name, pattern or folder + +One can additionally provide `--output` argument to define the output file name, +which defaults to `output.pkl`. + + +Examples: + +1. Dump results of a DensePose model with ResNet-50 FPN backbone for images + in a folder `images` to file `dump.pkl`: +```bash +python apply_net.py dump configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl images --output dump.pkl -v +``` + +2. Dump results of a DensePose model with ResNet-50 FPN backbone for images + with file name matching a pattern `image*.jpg` to file `results.pkl`: +```bash +python apply_net.py dump configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl "image*.jpg" --output results.pkl -v +``` + +If you want to load the pickle file generated by the above command: +``` +# make sure DensePose is in your PYTHONPATH, or use the following line to add it: +sys.path.append("/your_detectron2_path/detectron2_repo/projects/DensePose/") + +f = open('/your_result_path/results.pkl', 'rb') +data = pickle.load(f) +``` + +The file `results.pkl` contains the list of results per image, for each image the result is a dictionary: +``` +data: [{'file_name': '/your_path/image1.jpg', + 'scores': tensor([0.9884]), + 'pred_boxes_XYXY': tensor([[ 69.6114, 0.0000, 706.9797, 706.0000]]), + 'pred_densepose': }, + {'file_name': '/your_path/image2.jpg', + 'scores': tensor([0.9999, 0.5373, 0.3991]), + 'pred_boxes_XYXY': tensor([[ 59.5734, 7.7535, 579.9311, 932.3619], + [612.9418, 686.1254, 612.9999, 704.6053], + [164.5081, 407.4034, 598.3944, 920.4266]]), + 'pred_densepose': }] +``` + +We can use the following code, to parse the outputs of the first +detected instance on the first image. +``` +img_id, instance_id = 0, 0 # Look at the first image and the first detected instance +bbox_xyxy = data[img_id]['pred_boxes_XYXY'][instance_id] +result_encoded = data[img_id]['pred_densepose'].results[instance_id] +iuv_arr = DensePoseResult.decode_png_data(*result_encoded) +``` +The array `bbox_xyxy` contains (x0, y0, x1, y1) of the bounding box. + +The shape of `iuv_arr` is `[3, H, W]`, where (H, W) is the shape of the bounding box. +- `iuv_arr[0,:,:]`: The patch index of image points, indicating which of the 24 surface patches the point is on. +- `iuv_arr[1,:,:]`: The U-coordinate value of image points. +- `iuv_arr[2,:,:]`: The V-coordinate value of image points. + + +## Visualization Mode + +The general command form is: +```bash +python apply_net.py show [-h] [-v] [--min_score ] [--nms_thresh ] [--output ] +``` + +There are four mandatory arguments: + - ``, configuration file for a given model; + - ``, model file with trained parameters + - ``, input image file name, pattern or folder + - ``, visualizations specifier; currently available visualizations are: + * `bbox` - bounding boxes of detected persons; + * `dp_segm` - segmentation masks for detected persons; + * `dp_u` - each body part is colored according to the estimated values of the + U coordinate in part parameterization; + * `dp_v` - each body part is colored according to the estimated values of the + V coordinate in part parameterization; + * `dp_contour` - plots contours with color-coded U and V coordinates + + +One can additionally provide the following optional arguments: + - `--min_score` to only show detections with sufficient scores that are not lower than provided value + - `--nms_thresh` to additionally apply non-maximum suppression to detections at a given threshold + - `--output` to define visualization file name template, which defaults to `output.png`. + To distinguish output file names for different images, the tool appends 1-based entry index, + e.g. output.0001.png, output.0002.png, etc... + + +The following examples show how to output results of a DensePose model +with ResNet-50 FPN backbone using different visualizations for image `image.jpg`: + +1. Show bounding box and segmentation: +```bash +python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg bbox,dp_segm -v +``` +![Bounding Box + Segmentation Visualization](images/res_bbox_dp_segm.jpg) + +2. Show bounding box and estimated U coordinates for body parts: +```bash +python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg bbox,dp_u -v +``` +![Bounding Box + U Coordinate Visualization](images/res_bbox_dp_u.jpg) + +3. Show bounding box and estimated V coordinates for body parts: +```bash +python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg bbox,dp_v -v +``` +![Bounding Box + V Coordinate Visualization](images/res_bbox_dp_v.jpg) + +4. Show bounding box and estimated U and V coordinates via contour plots: +```bash +python apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml DensePose_ResNet50_FPN_s1x-e2e.pkl image.jpg dp_contour,bbox -v +``` +![Bounding Box + Contour Visualization](images/res_bbox_dp_contour.jpg) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_QUERY_DB.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_QUERY_DB.md new file mode 100644 index 0000000..b0a764b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/doc/TOOL_QUERY_DB.md @@ -0,0 +1,105 @@ + +# Query Dataset + +`query_db` is a tool to print or visualize DensePose data from a dataset. +It has two modes: `print` and `show` to output dataset entries to standard +output or to visualize them on images. + +## Print Mode + +The general command form is: +```bash +python query_db.py print [-h] [-v] [--max-entries N] +``` + +There are two mandatory arguments: + - ``, DensePose dataset specification, from which to select + the entries (e.g. `densepose_coco_2014_train`). + - ``, dataset entry selector which can be a single specification, + or a comma-separated list of specifications of the form + `field[:type]=value` for exact match with the value + or `field[:type]=min-max` for a range of values + +One can additionally limit the maximum number of entries to output +by providing `--max-entries` argument. + +Examples: + +1. Output at most 10 first entries from the `densepose_coco_2014_train` dataset: +```bash +python query_db.py print densepose_coco_2014_train \* --max-entries 10 -v +``` + +2. Output all entries with `file_name` equal to `COCO_train2014_000000000036.jpg`: +```bash +python query_db.py print densepose_coco_2014_train file_name=COCO_train2014_000000000036.jpg -v +``` + +3. Output all entries with `image_id` between 36 and 156: +```bash +python query_db.py print densepose_coco_2014_train image_id:int=36-156 -v +``` + +## Visualization Mode + +The general command form is: +```bash +python query_db.py show [-h] [-v] [--max-entries N] [--output ] +``` + +There are three mandatory arguments: + - ``, DensePose dataset specification, from which to select + the entries (e.g. `densepose_coco_2014_train`). + - ``, dataset entry selector which can be a single specification, + or a comma-separated list of specifications of the form + `field[:type]=value` for exact match with the value + or `field[:type]=min-max` for a range of values + - ``, visualizations specifier; currently available visualizations are: + * `bbox` - bounding boxes of annotated persons; + * `dp_i` - annotated points colored according to the containing part; + * `dp_pts` - annotated points in green color; + * `dp_segm` - segmentation masks for annotated persons; + * `dp_u` - annotated points colored according to their U coordinate in part parameterization; + * `dp_v` - annotated points colored according to their V coordinate in part parameterization; + +One can additionally provide one of the two optional arguments: + - `--max_entries` to limit the maximum number of entries to visualize + - `--output` to provide visualization file name template, which defaults + to `output.png`. To distinguish file names for different dataset + entries, the tool appends 1-based entry index to the output file name, + e.g. output.0001.png, output.0002.png, etc. + +The following examples show how to output different visualizations for image with `id = 322` +from `densepose_coco_2014_train` dataset: + +1. Show bounding box and segmentation: +```bash +python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_segm -v +``` +![Bounding Box + Segmentation Visualization](images/vis_bbox_dp_segm.jpg) + +2. Show bounding box and points colored according to the containing part: +```bash +python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_i -v +``` +![Bounding Box + Point Label Visualization](images/vis_bbox_dp_i.jpg) + +3. Show bounding box and annotated points in green color: +```bash +python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_segm -v +``` +![Bounding Box + Point Visualization](images/vis_bbox_dp_pts.jpg) + +4. Show bounding box and annotated points colored according to their U coordinate in part parameterization: +```bash +python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_u -v +``` +![Bounding Box + Point U Visualization](images/vis_bbox_dp_u.jpg) + +5. Show bounding box and annotated points colored according to their V coordinate in part parameterization: +```bash +python query_db.py show densepose_coco_2014_train image_id:int=322 bbox,dp_v -v +``` +![Bounding Box + Point V Visualization](images/vis_bbox_dp_v.jpg) + + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/query_db.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/query_db.py new file mode 100644 index 0000000..6d3ea2f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/query_db.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import argparse +import logging +import os +import sys +from timeit import default_timer as timer +from typing import Any, ClassVar, Dict, List +import torch +from fvcore.common.file_io import PathManager + +from detectron2.data.catalog import DatasetCatalog +from detectron2.utils.logger import setup_logger + +from densepose.data.structures import DensePoseDataRelative +from densepose.utils.dbhelper import EntrySelector +from densepose.utils.logger import verbosity_to_level +from densepose.vis.base import CompoundVisualizer +from densepose.vis.bounding_box import BoundingBoxVisualizer +from densepose.vis.densepose import ( + DensePoseDataCoarseSegmentationVisualizer, + DensePoseDataPointsIVisualizer, + DensePoseDataPointsUVisualizer, + DensePoseDataPointsVisualizer, + DensePoseDataPointsVVisualizer, +) + +DOC = """Query DB - a tool to print / visualize data from a database +""" + +LOGGER_NAME = "query_db" + +logger = logging.getLogger(LOGGER_NAME) + +_ACTION_REGISTRY: Dict[str, "Action"] = {} + + +class Action(object): + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + parser.add_argument( + "-v", + "--verbosity", + action="count", + help="Verbose mode. Multiple -v options increase the verbosity.", + ) + + +def register_action(cls: type): + """ + Decorator for action classes to automate action registration + """ + global _ACTION_REGISTRY + _ACTION_REGISTRY[cls.COMMAND] = cls + return cls + + +class EntrywiseAction(Action): + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + super(EntrywiseAction, cls).add_arguments(parser) + parser.add_argument( + "dataset", metavar="", help="Dataset name (e.g. densepose_coco_2014_train)" + ) + parser.add_argument( + "selector", + metavar="", + help="Dataset entry selector in the form field1[:type]=value1[," + "field2[:type]=value_min-value_max...] which selects all " + "entries from the dataset that satisfy the constraints", + ) + parser.add_argument( + "--max-entries", metavar="N", help="Maximum number of entries to process", type=int + ) + + @classmethod + def execute(cls: type, args: argparse.Namespace): + dataset = setup_dataset(args.dataset) + entry_selector = EntrySelector.from_string(args.selector) + context = cls.create_context(args) + if args.max_entries is not None: + for _, entry in zip(range(args.max_entries), dataset): + if entry_selector(entry): + cls.execute_on_entry(entry, context) + else: + for entry in dataset: + if entry_selector(entry): + cls.execute_on_entry(entry, context) + + @classmethod + def create_context(cls: type, args: argparse.Namespace) -> Dict[str, Any]: + context = {} + return context + + +@register_action +class PrintAction(EntrywiseAction): + """ + Print action that outputs selected entries to stdout + """ + + COMMAND: ClassVar[str] = "print" + + @classmethod + def add_parser(cls: type, subparsers: argparse._SubParsersAction): + parser = subparsers.add_parser(cls.COMMAND, help="Output selected entries to stdout. ") + cls.add_arguments(parser) + parser.set_defaults(func=cls.execute) + + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + super(PrintAction, cls).add_arguments(parser) + + @classmethod + def execute_on_entry(cls: type, entry: Dict[str, Any], context: Dict[str, Any]): + import pprint + + printer = pprint.PrettyPrinter(indent=2, width=200, compact=True) + printer.pprint(entry) + + +@register_action +class ShowAction(EntrywiseAction): + """ + Show action that visualizes selected entries on an image + """ + + COMMAND: ClassVar[str] = "show" + VISUALIZERS: ClassVar[Dict[str, object]] = { + "dp_segm": DensePoseDataCoarseSegmentationVisualizer(), + "dp_i": DensePoseDataPointsIVisualizer(), + "dp_u": DensePoseDataPointsUVisualizer(), + "dp_v": DensePoseDataPointsVVisualizer(), + "dp_pts": DensePoseDataPointsVisualizer(), + "bbox": BoundingBoxVisualizer(), + } + + @classmethod + def add_parser(cls: type, subparsers: argparse._SubParsersAction): + parser = subparsers.add_parser(cls.COMMAND, help="Visualize selected entries") + cls.add_arguments(parser) + parser.set_defaults(func=cls.execute) + + @classmethod + def add_arguments(cls: type, parser: argparse.ArgumentParser): + super(ShowAction, cls).add_arguments(parser) + parser.add_argument( + "visualizations", + metavar="", + help="Comma separated list of visualizations, possible values: " + "[{}]".format(",".join(sorted(cls.VISUALIZERS.keys()))), + ) + parser.add_argument( + "--output", + metavar="", + default="output.png", + help="File name to save output to", + ) + + @classmethod + def execute_on_entry(cls: type, entry: Dict[str, Any], context: Dict[str, Any]): + import cv2 + import numpy as np + + image_fpath = PathManager.get_local_path(entry["file_name"]) + image = cv2.imread(image_fpath, cv2.IMREAD_GRAYSCALE) + image = np.tile(image[:, :, np.newaxis], [1, 1, 3]) + datas = cls._extract_data_for_visualizers_from_entry(context["vis_specs"], entry) + visualizer = context["visualizer"] + image_vis = visualizer.visualize(image, datas) + entry_idx = context["entry_idx"] + 1 + out_fname = cls._get_out_fname(entry_idx, context["out_fname"]) + cv2.imwrite(out_fname, image_vis) + logger.info(f"Output saved to {out_fname}") + context["entry_idx"] += 1 + + @classmethod + def _get_out_fname(cls: type, entry_idx: int, fname_base: str): + base, ext = os.path.splitext(fname_base) + return base + ".{0:04d}".format(entry_idx) + ext + + @classmethod + def create_context(cls: type, args: argparse.Namespace) -> Dict[str, Any]: + vis_specs = args.visualizations.split(",") + visualizers = [] + for vis_spec in vis_specs: + vis = cls.VISUALIZERS[vis_spec] + visualizers.append(vis) + context = { + "vis_specs": vis_specs, + "visualizer": CompoundVisualizer(visualizers), + "out_fname": args.output, + "entry_idx": 0, + } + return context + + @classmethod + def _extract_data_for_visualizers_from_entry( + cls: type, vis_specs: List[str], entry: Dict[str, Any] + ): + dp_list = [] + bbox_list = [] + for annotation in entry["annotations"]: + is_valid, _ = DensePoseDataRelative.validate_annotation(annotation) + if not is_valid: + continue + bbox = torch.as_tensor(annotation["bbox"]) + bbox_list.append(bbox) + dp_data = DensePoseDataRelative(annotation) + dp_list.append(dp_data) + datas = [] + for vis_spec in vis_specs: + datas.append(bbox_list if "bbox" == vis_spec else (bbox_list, dp_list)) + return datas + + +def setup_dataset(dataset_name): + logger.info("Loading dataset {}".format(dataset_name)) + start = timer() + dataset = DatasetCatalog.get(dataset_name) + stop = timer() + logger.info("Loaded dataset {} in {:.3f}s".format(dataset_name, stop - start)) + return dataset + + +def create_argument_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description=DOC, + formatter_class=lambda prog: argparse.HelpFormatter(prog, max_help_position=120), + ) + parser.set_defaults(func=lambda _: parser.print_help(sys.stdout)) + subparsers = parser.add_subparsers(title="Actions") + for _, action in _ACTION_REGISTRY.items(): + action.add_parser(subparsers) + return parser + + +def main(): + parser = create_argument_parser() + args = parser.parse_args() + verbosity = args.verbosity if hasattr(args, "verbosity") else None + global logger + logger = setup_logger(name=LOGGER_NAME) + logger.setLevel(verbosity_to_level(verbosity)) + args.func(args) + + +if __name__ == "__main__": + main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/common.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/common.py new file mode 100644 index 0000000..13bf0dd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/common.py @@ -0,0 +1,110 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import os +import torch + +from detectron2.config import get_cfg +from detectron2.engine import default_setup +from detectron2.modeling import build_model + +from densepose import add_dataset_category_config, add_densepose_config + +_BASE_CONFIG_DIR = "configs" +_EVOLUTION_CONFIG_SUB_DIR = "evolution" +_QUICK_SCHEDULES_CONFIG_SUB_DIR = "quick_schedules" +_BASE_CONFIG_FILE_PREFIX = "Base-" +_CONFIG_FILE_EXT = ".yaml" + + +def _get_base_config_dir(): + """ + Return the base directory for configurations + """ + return os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", _BASE_CONFIG_DIR) + + +def _get_evolution_config_dir(): + """ + Return the base directory for evolution configurations + """ + return os.path.join(_get_base_config_dir(), _EVOLUTION_CONFIG_SUB_DIR) + + +def _get_quick_schedules_config_dir(): + """ + Return the base directory for quick schedules configurations + """ + return os.path.join(_get_base_config_dir(), _QUICK_SCHEDULES_CONFIG_SUB_DIR) + + +def _collect_config_files(config_dir): + """ + Collect all configuration files (i.e. densepose_*.yaml) directly in the specified directory + """ + start = _get_base_config_dir() + results = [] + for entry in os.listdir(config_dir): + path = os.path.join(config_dir, entry) + if not os.path.isfile(path): + continue + _, ext = os.path.splitext(entry) + if ext != _CONFIG_FILE_EXT: + continue + if entry.startswith(_BASE_CONFIG_FILE_PREFIX): + continue + config_file = os.path.relpath(path, start) + results.append(config_file) + return results + + +def get_config_files(): + """ + Get all the configuration files (relative to the base configuration directory) + """ + return _collect_config_files(_get_base_config_dir()) + + +def get_evolution_config_files(): + """ + Get all the evolution configuration files (relative to the base configuration directory) + """ + return _collect_config_files(_get_evolution_config_dir()) + + +def get_quick_schedules_config_files(): + """ + Get all the quick schedules configuration files (relative to the base configuration directory) + """ + return _collect_config_files(_get_quick_schedules_config_dir()) + + +def _get_model_config(config_file): + """ + Load and return the configuration from the specified file (relative to the base configuration + directory) + """ + cfg = get_cfg() + add_dataset_category_config(cfg) + add_densepose_config(cfg) + path = os.path.join(_get_base_config_dir(), config_file) + cfg.merge_from_file(path) + if not torch.cuda.is_available(): + cfg.MODEL_DEVICE = "cpu" + return cfg + + +def get_model(config_file): + """ + Get the model from the specified file (relative to the base configuration directory) + """ + cfg = _get_model_config(config_file) + return build_model(cfg) + + +def setup(config_file): + """ + Setup the configuration from the specified file (relative to the base configuration directory) + """ + cfg = _get_model_config(config_file) + cfg.freeze() + default_setup(cfg, {}) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_model_e2e.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_model_e2e.py new file mode 100644 index 0000000..eed1310 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_model_e2e.py @@ -0,0 +1,43 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import unittest +import torch + +from detectron2.structures import BitMasks, Boxes, Instances + +from .common import get_model + + +# TODO(plabatut): Modularize detectron2 tests and re-use +def make_model_inputs(image, instances=None): + if instances is None: + return {"image": image} + + return {"image": image, "instances": instances} + + +def make_empty_instances(h, w): + instances = Instances((h, w)) + instances.gt_boxes = Boxes(torch.rand(0, 4)) + instances.gt_classes = torch.tensor([]).to(dtype=torch.int64) + instances.gt_masks = BitMasks(torch.rand(0, h, w)) + return instances + + +class ModelE2ETest(unittest.TestCase): + CONFIG_PATH = "" + + def setUp(self): + self.model = get_model(self.CONFIG_PATH) + + def _test_eval(self, sizes): + inputs = [make_model_inputs(torch.rand(3, size[0], size[1])) for size in sizes] + self.model.eval() + self.model(inputs) + + +class DensePoseRCNNE2ETest(ModelE2ETest): + CONFIG_PATH = "densepose_rcnn_R_101_FPN_s1x.yaml" + + def test_empty_data(self): + self._test_eval([(200, 250), (200, 249)]) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_setup.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_setup.py new file mode 100644 index 0000000..96827f1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_setup.py @@ -0,0 +1,30 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import unittest + +from .common import ( + get_config_files, + get_evolution_config_files, + get_quick_schedules_config_files, + setup, +) + + +class TestSetup(unittest.TestCase): + def _test_setup(self, config_file): + setup(config_file) + + def test_setup_configs(self): + config_files = get_config_files() + for config_file in config_files: + self._test_setup(config_file) + + def test_setup_evolution_configs(self): + config_files = get_evolution_config_files() + for config_file in config_files: + self._test_setup(config_file) + + def test_setup_quick_schedules_configs(self): + config_files = get_quick_schedules_config_files() + for config_file in config_files: + self._test_setup(config_file) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_structures.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_structures.py new file mode 100644 index 0000000..ad97c23 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/tests/test_structures.py @@ -0,0 +1,25 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import unittest + +from densepose.data.structures import normalized_coords_transform + + +class TestStructures(unittest.TestCase): + def test_normalized_coords_transform(self): + bbox = (32, 24, 288, 216) + x0, y0, w, h = bbox + xmin, ymin, xmax, ymax = x0, y0, x0 + w, y0 + h + f = normalized_coords_transform(*bbox) + # Top-left + expected_p, actual_p = (-1, -1), f((xmin, ymin)) + self.assertEqual(expected_p, actual_p) + # Top-right + expected_p, actual_p = (1, -1), f((xmax, ymin)) + self.assertEqual(expected_p, actual_p) + # Bottom-left + expected_p, actual_p = (-1, 1), f((xmin, ymax)) + self.assertEqual(expected_p, actual_p) + # Bottom-right + expected_p, actual_p = (1, 1), f((xmax, ymax)) + self.assertEqual(expected_p, actual_p) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/train_net.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/train_net.py new file mode 100644 index 0000000..9d2e7bd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/DensePose/train_net.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +""" +DensePose Training Script. + +This script is similar to the training script in detectron2/tools. + +It is an example of how a user might use detectron2 for a new project. +""" + +import logging +import os +from collections import OrderedDict +from fvcore.common.file_io import PathManager + +import detectron2.utils.comm as comm +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import CfgNode, get_cfg +from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, hooks, launch +from detectron2.evaluation import COCOEvaluator, DatasetEvaluators, verify_results +from detectron2.modeling import DatasetMapperTTA +from detectron2.utils.logger import setup_logger + +from densepose import ( + DensePoseCOCOEvaluator, + DensePoseGeneralizedRCNNWithTTA, + add_dataset_category_config, + add_densepose_config, + load_from_cfg, +) +from densepose.data import DatasetMapper, build_detection_test_loader, build_detection_train_loader + + +class Trainer(DefaultTrainer): + @classmethod + def build_evaluator(cls, cfg: CfgNode, dataset_name, output_folder=None): + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + evaluators = [COCOEvaluator(dataset_name, cfg, True, output_folder)] + if cfg.MODEL.DENSEPOSE_ON: + evaluators.append(DensePoseCOCOEvaluator(dataset_name, True, output_folder)) + return DatasetEvaluators(evaluators) + + @classmethod + def build_test_loader(cls, cfg: CfgNode, dataset_name): + return build_detection_test_loader(cfg, dataset_name, mapper=DatasetMapper(cfg, False)) + + @classmethod + def build_train_loader(cls, cfg: CfgNode): + return build_detection_train_loader(cfg, mapper=DatasetMapper(cfg, True)) + + @classmethod + def test_with_TTA(cls, cfg: CfgNode, model): + logger = logging.getLogger("detectron2.trainer") + # In the end of training, run an evaluation with TTA + # Only support some R-CNN models. + logger.info("Running inference with test-time augmentation ...") + transform_data = load_from_cfg(cfg) + model = DensePoseGeneralizedRCNNWithTTA(cfg, model, transform_data, DatasetMapperTTA(cfg)) + evaluators = [ + cls.build_evaluator( + cfg, name, output_folder=os.path.join(cfg.OUTPUT_DIR, "inference_TTA") + ) + for name in cfg.DATASETS.TEST + ] + res = cls.test(cfg, model, evaluators) + res = OrderedDict({k + "_TTA": v for k, v in res.items()}) + return res + + +def setup(args): + cfg = get_cfg() + add_dataset_category_config(cfg) + add_densepose_config(cfg) + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup(cfg, args) + # Setup logger for "densepose" module + setup_logger(output=cfg.OUTPUT_DIR, distributed_rank=comm.get_rank(), name="densepose") + return cfg + + +def main(args): + cfg = setup(args) + # disable strict kwargs checking: allow one to specify path handle + # hints through kwargs, like timeout in DP evaluation + PathManager.set_strict_kwargs_checking(False) + + if args.eval_only: + model = Trainer.build_model(cfg) + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + res = Trainer.test(cfg, model) + if cfg.TEST.AUG.ENABLED: + res.update(Trainer.test_with_TTA(cfg, model)) + if comm.is_main_process(): + verify_results(cfg, res) + return res + + trainer = Trainer(cfg) + trainer.resume_or_load(resume=args.resume) + if cfg.TEST.AUG.ENABLED: + trainer.register_hooks( + [hooks.EvalHook(0, lambda: trainer.test_with_TTA(cfg, trainer.model))] + ) + return trainer.train() + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/README.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/README.md new file mode 100644 index 0000000..443736f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/README.md @@ -0,0 +1,135 @@ +# PointRend: Image Segmentation as Rendering + +Alexander Kirillov, Yuxin Wu, Kaiming He, Ross Girshick + +[[`arXiv`](https://arxiv.org/abs/1912.08193)] [[`BibTeX`](#CitingPointRend)] + +
    + +

    + +In this repository, we release code for PointRend in Detectron2. PointRend can be flexibly applied to both instance and semantic segmentation tasks by building on top of existing state-of-the-art models. + +## Installation +Install Detectron 2 following [INSTALL.md](https://github.com/facebookresearch/detectron2/blob/master/INSTALL.md). You are ready to go! + +## Quick start and visualization + +This [Colab Notebook](https://colab.research.google.com/drive/1isGPL5h5_cKoPPhVL9XhMokRtHDvmMVL) tutorial contains examples of PointRend usage and visualizations of its point sampling stages. + +## Training + +To train a model with 8 GPUs run: +```bash +cd /path/to/detectron2/projects/PointRend +python train_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml --num-gpus 8 +``` + +## Evaluation + +Model evaluation can be done similarly: +```bash +cd /path/to/detectron2/projects/PointRend +python train_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml --eval-only MODEL.WEIGHTS /path/to/model_checkpoint +``` + +# Pretrained Models + +## Instance Segmentation +#### COCO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Mask
    head
    Backbonelr
    sched
    Output
    resolution
    mask
    AP
    mask
    AP*
    model iddownload
    PointRendR50-FPN224×22436.239.7164254221model | metrics
    PointRendR50-FPN224×22438.341.6164955410model | metrics
    + +AP* is COCO mask AP evaluated against the higher-quality LVIS annotations; see the paper for details. Run `python detectron2/datasets/prepare_cocofied_lvis.py` to prepare GT files for AP* evaluation. Since LVIS annotations are not exhaustive `lvis-api` and not `cocoapi` should be used to evaluate AP*. + +#### Cityscapes +Cityscapes model is trained with ImageNet pretraining. + + + + + + + + + + + + + + + + + + + + +
    Mask
    head
    Backbonelr
    sched
    Output
    resolution
    mask
    AP
    model iddownload
    PointRendR50-FPN224×22435.9164255101model | metrics
    + + +## Semantic Segmentation + +#### Cityscapes +Cityscapes model is trained with ImageNet pretraining. + + + + + + + + + + + + + + + + + + +
    MethodBackboneOutput
    resolution
    mIoUmodel iddownload
    SemanticFPN + PointRendR101-FPN1024×204878.6186480235model | metrics
    + +## Citing PointRend + +If you use PointRend, please use the following BibTeX entry. + +```BibTeX +@InProceedings{kirillov2019pointrend, + title={{PointRend}: Image Segmentation as Rendering}, + author={Alexander Kirillov and Yuxin Wu and Kaiming He and Ross Girshick}, + journal={ArXiv:1912.08193}, + year={2019} +} +``` diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/Base-PointRend-RCNN-FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/Base-PointRend-RCNN-FPN.yaml new file mode 100644 index 0000000..d391718 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/Base-PointRend-RCNN-FPN.yaml @@ -0,0 +1,21 @@ +_BASE_: "../../../../configs/Base-RCNN-FPN.yaml" +MODEL: + ROI_HEADS: + NAME: "PointRendROIHeads" + IN_FEATURES: ["p2", "p3", "p4", "p5"] + ROI_BOX_HEAD: + TRAIN_ON_PRED_BOXES: True + ROI_MASK_HEAD: + NAME: "CoarseMaskHead" + FC_DIM: 1024 + NUM_FC: 2 + OUTPUT_SIDE_RESOLUTION: 7 + IN_FEATURES: ["p2"] + POINT_HEAD_ON: True + POINT_HEAD: + FC_DIM: 256 + NUM_FC: 3 + IN_FEATURES: ["p2"] +INPUT: + # PointRend for instance segmenation does not work with "polygon" mask_format. + MASK_FORMAT: "bitmask" diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_cityscapes.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_cityscapes.yaml new file mode 100644 index 0000000..c23dbe1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_cityscapes.yaml @@ -0,0 +1,23 @@ +_BASE_: Base-PointRend-RCNN-FPN.yaml +MODEL: + WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl + MASK_ON: true + RESNETS: + DEPTH: 50 + ROI_HEADS: + NUM_CLASSES: 8 + POINT_HEAD: + NUM_CLASSES: 8 +DATASETS: + TEST: ("cityscapes_fine_instance_seg_val",) + TRAIN: ("cityscapes_fine_instance_seg_train",) +SOLVER: + BASE_LR: 0.01 + IMS_PER_BATCH: 8 + MAX_ITER: 24000 + STEPS: (18000,) +INPUT: + MAX_SIZE_TEST: 2048 + MAX_SIZE_TRAIN: 2048 + MIN_SIZE_TEST: 1024 + MIN_SIZE_TRAIN: (800, 832, 864, 896, 928, 960, 992, 1024) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml new file mode 100644 index 0000000..e9fc573 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml @@ -0,0 +1,9 @@ +_BASE_: Base-PointRend-RCNN-FPN.yaml +MODEL: + WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl + MASK_ON: true + RESNETS: + DEPTH: 50 +# To add COCO AP evaluation against the higher-quality LVIS annotations. +# DATASETS: +# TEST: ("coco_2017_val", "lvis_v0.5_val_cocofied") diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_coco.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_coco.yaml new file mode 100644 index 0000000..2f013f3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_coco.yaml @@ -0,0 +1,13 @@ +_BASE_: Base-PointRend-RCNN-FPN.yaml +MODEL: + WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl + MASK_ON: true + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 +# To add COCO AP evaluation against the higher-quality LVIS annotations. +# DATASETS: +# TEST: ("coco_2017_val", "lvis_v0.5_val_cocofied") + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_parsing.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_parsing.yaml new file mode 100644 index 0000000..a4af81d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_parsing.yaml @@ -0,0 +1,20 @@ +_BASE_: Base-PointRend-RCNN-FPN.yaml +MODEL: + WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl + MASK_ON: true + RESNETS: + DEPTH: 50 + ROI_HEADS: + NUM_CLASSES: 1 + POINT_HEAD: + NUM_CLASSES: 1 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 + IMS_PER_BATCH: 1 +# To add COCO AP evaluation against the higher-quality LVIS annotations. +# DATASETS: +# TEST: ("coco_2017_val", "lvis_v0.5_val_cocofied") +DATASETS: + TRAIN: ("CIHP_train",) + TEST: ("CIHP_val",) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_X_101_32x8d_FPN_3x_parsing.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_X_101_32x8d_FPN_3x_parsing.yaml new file mode 100644 index 0000000..8e52d82 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_X_101_32x8d_FPN_3x_parsing.yaml @@ -0,0 +1,28 @@ +_BASE_: Base-PointRend-RCNN-FPN.yaml +MODEL: + WEIGHTS: "./X-101-32x8d.pkl" + PIXEL_STD: [57.375, 57.120, 58.395] + MASK_ON: true + RESNETS: + STRIDE_IN_1X1: False # this is a C2 model + NUM_GROUPS: 32 + WIDTH_PER_GROUP: 8 + DEPTH: 101 + ROI_HEADS: + NUM_CLASSES: 1 + POINT_HEAD: + NUM_CLASSES: 1 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 + IMS_PER_BATCH: 1 +# To add COCO AP evaluation against the higher-quality LVIS annotations. +# DATASETS: +# TEST: ("coco_2017_val", "lvis_v0.5_val_cocofied") +INPUT: + MIN_SIZE_TRAIN: (640, 864) + MIN_SIZE_TRAIN_SAMPLING: "range" + MAX_SIZE_TRAIN: 1440 +DATASETS: + TRAIN: ("CIHP_train",) + TEST: ("CIHP_val",) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/Base-PointRend-Semantic-FPN.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/Base-PointRend-Semantic-FPN.yaml new file mode 100644 index 0000000..00562a9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/Base-PointRend-Semantic-FPN.yaml @@ -0,0 +1,19 @@ +_BASE_: "../../../../configs/Base-RCNN-FPN.yaml" +MODEL: + META_ARCHITECTURE: "SemanticSegmentor" + BACKBONE: + FREEZE_AT: 0 + SEM_SEG_HEAD: + NAME: "PointRendSemSegHead" + POINT_HEAD: + NUM_CLASSES: 54 + FC_DIM: 256 + NUM_FC: 3 + IN_FEATURES: ["p2"] + TRAIN_NUM_POINTS: 1024 + SUBDIVISION_STEPS: 2 + SUBDIVISION_NUM_POINTS: 8192 + COARSE_SEM_SEG_HEAD_NAME: "SemSegFPNHead" +DATASETS: + TRAIN: ("coco_2017_train_panoptic_stuffonly",) + TEST: ("coco_2017_val_panoptic_stuffonly",) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_101_FPN_1x_cityscapes.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_101_FPN_1x_cityscapes.yaml new file mode 100644 index 0000000..4965b06 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_101_FPN_1x_cityscapes.yaml @@ -0,0 +1,33 @@ +_BASE_: Base-PointRend-Semantic-FPN.yaml +MODEL: + WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-101.pkl + RESNETS: + DEPTH: 101 + SEM_SEG_HEAD: + NUM_CLASSES: 19 + POINT_HEAD: + NUM_CLASSES: 19 + TRAIN_NUM_POINTS: 2048 + SUBDIVISION_NUM_POINTS: 8192 +DATASETS: + TRAIN: ("cityscapes_fine_sem_seg_train",) + TEST: ("cityscapes_fine_sem_seg_val",) +SOLVER: + BASE_LR: 0.01 + STEPS: (40000, 55000) + MAX_ITER: 65000 + IMS_PER_BATCH: 32 +INPUT: + MIN_SIZE_TRAIN: (512, 768, 1024, 1280, 1536, 1792, 2048) + MIN_SIZE_TRAIN_SAMPLING: "choice" + MIN_SIZE_TEST: 1024 + MAX_SIZE_TRAIN: 4096 + MAX_SIZE_TEST: 2048 + CROP: + ENABLED: True + TYPE: "absolute" + SIZE: (512, 1024) + SINGLE_CATEGORY_MAX_AREA: 0.75 + COLOR_AUG_SSD: True +DATALOADER: + NUM_WORKERS: 16 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_50_FPN_1x_coco.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_50_FPN_1x_coco.yaml new file mode 100644 index 0000000..7948bd8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/configs/SemanticSegmentation/pointrend_semantic_R_50_FPN_1x_coco.yaml @@ -0,0 +1,5 @@ +_BASE_: Base-PointRend-Semantic-FPN.yaml +MODEL: + WEIGHTS: detectron2://ImageNetPretrained/MSRA/R-50.pkl + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/finetune_net.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/finetune_net.py new file mode 100644 index 0000000..b99baf9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/finetune_net.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +""" +PointRend Training Script. + +This script is a simplified version of the training script in detectron2/tools. +""" + +import os +import torch + +import detectron2.utils.comm as comm +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import MetadataCatalog, build_detection_train_loader +from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, launch +from detectron2.evaluation import ( + CityscapesInstanceEvaluator, + CityscapesSemSegEvaluator, + COCOEvaluator, + DatasetEvaluators, + LVISEvaluator, + SemSegEvaluator, + verify_results, +) + +from point_rend import SemSegDatasetMapper, add_pointrend_config + +os.environ['CUDA_VISIBLE_DEVICES'] = '4' +# Register Custom Dataset +from detectron2.data.datasets import register_coco_instances +register_coco_instances("CIHP_train", {}, "/data03/v_xuyunqiu/multi_parsing/data/msrcnn_finetune_annotations/CIHP_train.json", "/data03/v_xuyunqiu/data/instance-level_human_parsing/Training/Images") +register_coco_instances("CIHP_val", {}, "/data03/v_xuyunqiu/multi_parsing/data/msrcnn_finetune_annotations/CIHP_val.json", "/data03/v_xuyunqiu/data/instance-level_human_parsing/Validation/Images") + + +class Trainer(DefaultTrainer): + """ + We use the "DefaultTrainer" which contains a number pre-defined logic for + standard training workflow. They may not work for you, especially if you + are working on a new research project. In that case you can use the cleaner + "SimpleTrainer", or write your own training loop. + """ + + @classmethod + def build_evaluator(cls, cfg, dataset_name, output_folder=None): + """ + Create evaluator(s) for a given dataset. + This uses the special metadata "evaluator_type" associated with each builtin dataset. + For your own dataset, you can simply create an evaluator manually in your + script and do not have to worry about the hacky if-else logic here. + """ + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + evaluator_list = [] + evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type + if evaluator_type == "lvis": + return LVISEvaluator(dataset_name, cfg, True, output_folder) + if evaluator_type == "coco": + return COCOEvaluator(dataset_name, cfg, True, output_folder) + if evaluator_type == "sem_seg": + return SemSegEvaluator( + dataset_name, + distributed=True, + num_classes=cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES, + ignore_label=cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE, + output_dir=output_folder, + ) + if evaluator_type == "cityscapes_instance": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesInstanceEvaluator(dataset_name) + if evaluator_type == "cityscapes_sem_seg": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesSemSegEvaluator(dataset_name) + if len(evaluator_list) == 0: + raise NotImplementedError( + "no Evaluator for the dataset {} with the type {}".format( + dataset_name, evaluator_type + ) + ) + if len(evaluator_list) == 1: + return evaluator_list[0] + return DatasetEvaluators(evaluator_list) + + @classmethod + def build_train_loader(cls, cfg): + if "SemanticSegmentor" in cfg.MODEL.META_ARCHITECTURE: + mapper = SemSegDatasetMapper(cfg, True) + else: + mapper = None + return build_detection_train_loader(cfg, mapper=mapper) + + +def setup(args): + """ + Create configs and perform basic setups. + """ + cfg = get_cfg() + add_pointrend_config(cfg) + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup(cfg, args) + return cfg + + +def main(args): + cfg = setup(args) + + if args.eval_only: + model = Trainer.build_model(cfg) + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + res = Trainer.test(cfg, model) + if comm.is_main_process(): + verify_results(cfg, res) + return res + + trainer = Trainer(cfg) + trainer.resume_or_load(resume=args.resume) + return trainer.train() + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/logs/hadoop.kylin.libdfs.log b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/logs/hadoop.kylin.libdfs.log new file mode 100644 index 0000000..e69de29 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/__init__.py new file mode 100644 index 0000000..4020fe0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .config import add_pointrend_config +from .coarse_mask_head import CoarseMaskHead +from .roi_heads import PointRendROIHeads +from .dataset_mapper import SemSegDatasetMapper +from .semantic_seg import PointRendSemSegHead diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/coarse_mask_head.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/coarse_mask_head.py new file mode 100644 index 0000000..3f1cffb --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/coarse_mask_head.py @@ -0,0 +1,92 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import fvcore.nn.weight_init as weight_init +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.layers import Conv2d, ShapeSpec +from detectron2.modeling import ROI_MASK_HEAD_REGISTRY + + +@ROI_MASK_HEAD_REGISTRY.register() +class CoarseMaskHead(nn.Module): + """ + A mask head with fully connected layers. Given pooled features it first reduces channels and + spatial dimensions with conv layers and then uses FC layers to predict coarse masks analogously + to the standard box head. + """ + + def __init__(self, cfg, input_shape: ShapeSpec): + """ + The following attributes are parsed from config: + conv_dim: the output dimension of the conv layers + fc_dim: the feature dimenstion of the FC layers + num_fc: the number of FC layers + output_side_resolution: side resolution of the output square mask prediction + """ + super(CoarseMaskHead, self).__init__() + + # fmt: off + self.num_classes = cfg.MODEL.ROI_HEADS.NUM_CLASSES + conv_dim = cfg.MODEL.ROI_MASK_HEAD.CONV_DIM + self.fc_dim = cfg.MODEL.ROI_MASK_HEAD.FC_DIM + num_fc = cfg.MODEL.ROI_MASK_HEAD.NUM_FC + self.output_side_resolution = cfg.MODEL.ROI_MASK_HEAD.OUTPUT_SIDE_RESOLUTION + self.input_channels = input_shape.channels + self.input_h = input_shape.height + self.input_w = input_shape.width + # fmt: on + + self.conv_layers = [] + if self.input_channels > conv_dim: + self.reduce_channel_dim_conv = Conv2d( + self.input_channels, + conv_dim, + kernel_size=1, + stride=1, + padding=0, + bias=True, + activation=F.relu, + ) + self.conv_layers.append(self.reduce_channel_dim_conv) + + self.reduce_spatial_dim_conv = Conv2d( + conv_dim, conv_dim, kernel_size=2, stride=2, padding=0, bias=True, activation=F.relu + ) + self.conv_layers.append(self.reduce_spatial_dim_conv) + + input_dim = conv_dim * self.input_h * self.input_w + input_dim //= 4 + + self.fcs = [] + for k in range(num_fc): + fc = nn.Linear(input_dim, self.fc_dim) + self.add_module("coarse_mask_fc{}".format(k + 1), fc) + self.fcs.append(fc) + input_dim = self.fc_dim + + output_dim = self.num_classes * self.output_side_resolution * self.output_side_resolution + + self.prediction = nn.Linear(self.fc_dim, output_dim) + # use normal distribution initialization for mask prediction layer + nn.init.normal_(self.prediction.weight, std=0.001) + nn.init.constant_(self.prediction.bias, 0) + + for layer in self.conv_layers: + weight_init.c2_msra_fill(layer) + for layer in self.fcs: + weight_init.c2_xavier_fill(layer) + + def forward(self, x): + # unlike BaseMaskRCNNHead, this head only outputs intermediate + # features, because the features will be used later by PointHead. + N = x.shape[0] + x = x.view(N, self.input_channels, self.input_h, self.input_w) + for layer in self.conv_layers: + x = layer(x) + x = torch.flatten(x, start_dim=1) + for layer in self.fcs: + x = F.relu(layer(x)) + return self.prediction(x).view( + N, self.num_classes, self.output_side_resolution, self.output_side_resolution + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/color_augmentation.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/color_augmentation.py new file mode 100644 index 0000000..27344c4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/color_augmentation.py @@ -0,0 +1,98 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +import random +import cv2 +from fvcore.transforms.transform import Transform + + +class ColorAugSSDTransform(Transform): + """ + A color related data augmentation used in Single Shot Multibox Detector (SSD). + + Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, + Scott Reed, Cheng-Yang Fu, Alexander C. Berg. + SSD: Single Shot MultiBox Detector. ECCV 2016. + + Implementation based on: + + https://github.com/weiliu89/caffe/blob + /4817bf8b4200b35ada8ed0dc378dceaf38c539e4 + /src/caffe/util/im_transforms.cpp + + https://github.com/chainer/chainercv/blob + /7159616642e0be7c5b3ef380b848e16b7e99355b/chainercv + /links/model/ssd/transforms.py + """ + + def __init__( + self, + img_format, + brightness_delta=32, + contrast_low=0.5, + contrast_high=1.5, + saturation_low=0.5, + saturation_high=1.5, + hue_delta=18, + ): + super().__init__() + assert img_format in ["BGR", "RGB"] + self.is_rgb = img_format == "RGB" + del img_format + self._set_attributes(locals()) + + def apply_coords(self, coords): + return coords + + def apply_segmentation(self, segmentation): + return segmentation + + def apply_image(self, img, interp=None): + if self.is_rgb: + img = img[:, :, [2, 1, 0]] + img = self.brightness(img) + if random.randrange(2): + img = self.contrast(img) + img = self.saturation(img) + img = self.hue(img) + else: + img = self.saturation(img) + img = self.hue(img) + img = self.contrast(img) + if self.is_rgb: + img = img[:, :, [2, 1, 0]] + return img + + def convert(self, img, alpha=1, beta=0): + img = img.astype(np.float32) * alpha + beta + img = np.clip(img, 0, 255) + return img.astype(np.uint8) + + def brightness(self, img): + if random.randrange(2): + return self.convert( + img, beta=random.uniform(-self.brightness_delta, self.brightness_delta) + ) + return img + + def contrast(self, img): + if random.randrange(2): + return self.convert(img, alpha=random.uniform(self.contrast_low, self.contrast_high)) + return img + + def saturation(self, img): + if random.randrange(2): + img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) + img[:, :, 1] = self.convert( + img[:, :, 1], alpha=random.uniform(self.saturation_low, self.saturation_high) + ) + return cv2.cvtColor(img, cv2.COLOR_HSV2BGR) + return img + + def hue(self, img): + if random.randrange(2): + img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) + img[:, :, 0] = ( + img[:, :, 0].astype(int) + random.randint(-self.hue_delta, self.hue_delta) + ) % 180 + return cv2.cvtColor(img, cv2.COLOR_HSV2BGR) + return img diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/config.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/config.py new file mode 100644 index 0000000..74f6367 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/config.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from detectron2.config import CfgNode as CN + + +def add_pointrend_config(cfg): + """ + Add config for PointRend. + """ + # We retry random cropping until no single category in semantic segmentation GT occupies more + # than `SINGLE_CATEGORY_MAX_AREA` part of the crop. + cfg.INPUT.CROP.SINGLE_CATEGORY_MAX_AREA = 1.0 + # Color augmentatition from SSD paper for semantic segmentation model during training. + cfg.INPUT.COLOR_AUG_SSD = False + + # Names of the input feature maps to be used by a coarse mask head. + cfg.MODEL.ROI_MASK_HEAD.IN_FEATURES = ("p2",) + cfg.MODEL.ROI_MASK_HEAD.FC_DIM = 1024 + cfg.MODEL.ROI_MASK_HEAD.NUM_FC = 2 + # The side size of a coarse mask head prediction. + cfg.MODEL.ROI_MASK_HEAD.OUTPUT_SIDE_RESOLUTION = 7 + # True if point head is used. + cfg.MODEL.ROI_MASK_HEAD.POINT_HEAD_ON = False + + cfg.MODEL.POINT_HEAD = CN() + cfg.MODEL.POINT_HEAD.NAME = "StandardPointHead" + cfg.MODEL.POINT_HEAD.NUM_CLASSES = 80 + # Names of the input feature maps to be used by a mask point head. + cfg.MODEL.POINT_HEAD.IN_FEATURES = ("p2",) + # Number of points sampled during training for a mask point head. + cfg.MODEL.POINT_HEAD.TRAIN_NUM_POINTS = 14 * 14 + # Oversampling parameter for PointRend point sampling during training. Parameter `k` in the + # original paper. + cfg.MODEL.POINT_HEAD.OVERSAMPLE_RATIO = 3 + # Importance sampling parameter for PointRend point sampling during training. Parametr `beta` in + # the original paper. + cfg.MODEL.POINT_HEAD.IMPORTANCE_SAMPLE_RATIO = 0.75 + # Number of subdivision steps during inference. + cfg.MODEL.POINT_HEAD.SUBDIVISION_STEPS = 5 + # Maximum number of points selected at each subdivision step (N). + cfg.MODEL.POINT_HEAD.SUBDIVISION_NUM_POINTS = 28 * 28 + cfg.MODEL.POINT_HEAD.FC_DIM = 256 + cfg.MODEL.POINT_HEAD.NUM_FC = 3 + cfg.MODEL.POINT_HEAD.CLS_AGNOSTIC_MASK = False + # If True, then coarse prediction features are used as inout for each layer in PointRend's MLP. + cfg.MODEL.POINT_HEAD.COARSE_PRED_EACH_LAYER = True + cfg.MODEL.POINT_HEAD.COARSE_SEM_SEG_HEAD_NAME = "SemSegFPNHead" diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/dataset_mapper.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/dataset_mapper.py new file mode 100644 index 0000000..76b64ee --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/dataset_mapper.py @@ -0,0 +1,121 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import logging +import numpy as np +import torch +from fvcore.common.file_io import PathManager +from fvcore.transforms.transform import CropTransform +from PIL import Image + +from detectron2.data import detection_utils as utils +from detectron2.data import transforms as T + +from .color_augmentation import ColorAugSSDTransform + +""" +This file contains the mapping that's applied to "dataset dicts" for semantic segmentation models. +Unlike the default DatasetMapper this mapper uses cropping as the last transformation. +""" + +__all__ = ["SemSegDatasetMapper"] + + +class SemSegDatasetMapper: + """ + A callable which takes a dataset dict in Detectron2 Dataset format, + and map it into a format used by semantic segmentation models. + + The callable currently does the following: + + 1. Read the image from "file_name" + 2. Applies geometric transforms to the image and annotation + 3. Find and applies suitable cropping to the image and annotation + 4. Prepare image and annotation to Tensors + """ + + def __init__(self, cfg, is_train=True): + if cfg.INPUT.CROP.ENABLED and is_train: + self.crop_gen = T.RandomCrop(cfg.INPUT.CROP.TYPE, cfg.INPUT.CROP.SIZE) + logging.getLogger(__name__).info("CropGen used in training: " + str(self.crop_gen)) + else: + self.crop_gen = None + + self.tfm_gens = utils.build_transform_gen(cfg, is_train) + + if cfg.INPUT.COLOR_AUG_SSD: + self.tfm_gens.append(ColorAugSSDTransform(img_format=cfg.INPUT.FORMAT)) + logging.getLogger(__name__).info( + "Color augmnetation used in training: " + str(self.tfm_gens[-1]) + ) + + # fmt: off + self.img_format = cfg.INPUT.FORMAT + self.single_category_max_area = cfg.INPUT.CROP.SINGLE_CATEGORY_MAX_AREA + self.ignore_value = cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE + # fmt: on + + self.is_train = is_train + + def __call__(self, dataset_dict): + """ + Args: + dataset_dict (dict): Metadata of one image, in Detectron2 Dataset format. + + Returns: + dict: a format that builtin models in detectron2 accept + """ + dataset_dict = copy.deepcopy(dataset_dict) # it will be modified by code below + image = utils.read_image(dataset_dict["file_name"], format=self.img_format) + utils.check_image_size(dataset_dict, image) + assert "sem_seg_file_name" in dataset_dict + + image, transforms = T.apply_transform_gens(self.tfm_gens, image) + if self.is_train: + with PathManager.open(dataset_dict.pop("sem_seg_file_name"), "rb") as f: + sem_seg_gt = Image.open(f) + sem_seg_gt = np.asarray(sem_seg_gt, dtype="uint8") + sem_seg_gt = transforms.apply_segmentation(sem_seg_gt) + if self.crop_gen: + image, sem_seg_gt = crop_transform( + image, + sem_seg_gt, + self.crop_gen, + self.single_category_max_area, + self.ignore_value, + ) + dataset_dict["sem_seg"] = torch.as_tensor(sem_seg_gt.astype("long")) + + # Pytorch's dataloader is efficient on torch.Tensor due to shared-memory, + # but not efficient on large generic data structures due to the use of pickle & mp.Queue. + # Therefore it's important to use torch.Tensor. + dataset_dict["image"] = torch.as_tensor(np.ascontiguousarray(image.transpose(2, 0, 1))) + + if not self.is_train: + dataset_dict.pop("sem_seg_file_name", None) + return dataset_dict + + return dataset_dict + + +def crop_transform(image, sem_seg, crop_gen, single_category_max_area, ignore_value): + """ + Find a cropping window such that no single category occupies more than + `single_category_max_area` in `sem_seg`. The function retries random cropping 10 times max. + """ + if single_category_max_area >= 1.0: + crop_tfm = crop_gen.get_transform(image) + sem_seg_temp = crop_tfm.apply_segmentation(sem_seg) + else: + h, w = sem_seg.shape + crop_size = crop_gen.get_crop_size((h, w)) + for _ in range(10): + y0 = np.random.randint(h - crop_size[0] + 1) + x0 = np.random.randint(w - crop_size[1] + 1) + sem_seg_temp = sem_seg[y0 : y0 + crop_size[0], x0 : x0 + crop_size[1]] + labels, cnt = np.unique(sem_seg_temp, return_counts=True) + cnt = cnt[labels != ignore_value] + if len(cnt) > 1 and np.max(cnt) / np.sum(cnt) < single_category_max_area: + break + crop_tfm = CropTransform(x0, y0, crop_size[1], crop_size[0]) + image = crop_tfm.apply_image(image) + return image, sem_seg_temp diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_features.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_features.py new file mode 100644 index 0000000..320a33d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_features.py @@ -0,0 +1,216 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import torch +from torch.nn import functional as F + +from detectron2.layers import cat +from detectron2.structures import Boxes + + +""" +Shape shorthand in this module: + + N: minibatch dimension size, i.e. the number of RoIs for instance segmenation or the + number of images for semantic segmenation. + R: number of ROIs, combined over all images, in the minibatch + P: number of points +""" + + +def point_sample(input, point_coords, **kwargs): + """ + A wrapper around :function:`torch.nn.functional.grid_sample` to support 3D point_coords tensors. + Unlike :function:`torch.nn.functional.grid_sample` it assumes `point_coords` to lie inside + [0, 1] x [0, 1] square. + + Args: + input (Tensor): A tensor of shape (N, C, H, W) that contains features map on a H x W grid. + point_coords (Tensor): A tensor of shape (N, P, 2) or (N, Hgrid, Wgrid, 2) that contains + [0, 1] x [0, 1] normalized point coordinates. + + Returns: + output (Tensor): A tensor of shape (N, C, P) or (N, C, Hgrid, Wgrid) that contains + features for points in `point_coords`. The features are obtained via bilinear + interplation from `input` the same way as :function:`torch.nn.functional.grid_sample`. + """ + add_dim = False + if point_coords.dim() == 3: + add_dim = True + point_coords = point_coords.unsqueeze(2) + output = F.grid_sample(input, 2.0 * point_coords - 1.0, **kwargs) + if add_dim: + output = output.squeeze(3) + return output + + +def generate_regular_grid_point_coords(R, side_size, device): + """ + Generate regular square grid of points in [0, 1] x [0, 1] coordinate space. + + Args: + R (int): The number of grids to sample, one for each region. + side_size (int): The side size of the regular grid. + device (torch.device): Desired device of returned tensor. + + Returns: + (Tensor): A tensor of shape (R, side_size^2, 2) that contains coordinates + for the regular grids. + """ + aff = torch.tensor([[[0.5, 0, 0.5], [0, 0.5, 0.5]]], device=device) + r = F.affine_grid(aff, torch.Size((1, 1, side_size, side_size)), align_corners=False) + return r.view(1, -1, 2).expand(R, -1, -1) + + +def get_uncertain_point_coords_with_randomness( + coarse_logits, uncertainty_func, num_points, oversample_ratio, importance_sample_ratio +): + """ + Sample points in [0, 1] x [0, 1] coordinate space based on their uncertainty. The unceratinties + are calculated for each point using 'uncertainty_func' function that takes point's logit + prediction as input. + See PointRend paper for details. + + Args: + coarse_logits (Tensor): A tensor of shape (N, C, Hmask, Wmask) or (N, 1, Hmask, Wmask) for + class-specific or class-agnostic prediction. + uncertainty_func: A function that takes a Tensor of shape (N, C, P) or (N, 1, P) that + contains logit predictions for P points and returns their uncertainties as a Tensor of + shape (N, 1, P). + num_points (int): The number of points P to sample. + oversample_ratio (int): Oversampling parameter. + importance_sample_ratio (float): Ratio of points that are sampled via importnace sampling. + + Returns: + point_coords (Tensor): A tensor of shape (N, P, 2) that contains the coordinates of P + sampled points. + """ + assert oversample_ratio >= 1 + assert importance_sample_ratio <= 1 and importance_sample_ratio >= 0 + num_boxes = coarse_logits.shape[0] + num_sampled = int(num_points * oversample_ratio) + point_coords = torch.rand(num_boxes, num_sampled, 2, device=coarse_logits.device) + point_logits = point_sample(coarse_logits, point_coords, align_corners=False) + # It is crucial to calculate uncertainty based on the sampled prediction value for the points. + # Calculating uncertainties of the coarse predictions first and sampling them for points leads + # to incorrect results. + # To illustrate this: assume uncertainty_func(logits)=-abs(logits), a sampled point between + # two coarse predictions with -1 and 1 logits has 0 logits, and therefore 0 uncertainty value. + # However, if we calculate uncertainties for the coarse predictions first, + # both will have -1 uncertainty, and the sampled point will get -1 uncertainty. + point_uncertainties = uncertainty_func(point_logits) + num_uncertain_points = int(importance_sample_ratio * num_points) + num_random_points = num_points - num_uncertain_points + idx = torch.topk(point_uncertainties[:, 0, :], k=num_uncertain_points, dim=1)[1] + shift = num_sampled * torch.arange(num_boxes, dtype=torch.long, device=coarse_logits.device) + idx += shift[:, None] + point_coords = point_coords.view(-1, 2)[idx.view(-1), :].view( + num_boxes, num_uncertain_points, 2 + ) + if num_random_points > 0: + point_coords = cat( + [ + point_coords, + torch.rand(num_boxes, num_random_points, 2, device=coarse_logits.device), + ], + dim=1, + ) + return point_coords + + +def get_uncertain_point_coords_on_grid(uncertainty_map, num_points): + """ + Find `num_points` most uncertain points from `uncertainty_map` grid. + + Args: + uncertainty_map (Tensor): A tensor of shape (N, 1, H, W) that contains uncertainty + values for a set of points on a regular H x W grid. + num_points (int): The number of points P to select. + + Returns: + point_indices (Tensor): A tensor of shape (N, P) that contains indices from + [0, H x W) of the most uncertain points. + point_coords (Tensor): A tensor of shape (N, P, 2) that contains [0, 1] x [0, 1] normalized + coordinates of the most uncertain points from the H x W grid. + """ + R, _, H, W = uncertainty_map.shape + h_step = 1.0 / float(H) + w_step = 1.0 / float(W) + + num_points = min(H * W, num_points) + point_indices = torch.topk(uncertainty_map.view(R, H * W), k=num_points, dim=1)[1] + point_coords = torch.zeros(R, num_points, 2, dtype=torch.float, device=uncertainty_map.device) + point_coords[:, :, 0] = w_step / 2.0 + (point_indices % W).to(torch.float) * w_step + point_coords[:, :, 1] = h_step / 2.0 + (point_indices // W).to(torch.float) * h_step + return point_indices, point_coords + + +def point_sample_fine_grained_features(features_list, feature_scales, boxes, point_coords): + """ + Get features from feature maps in `features_list` that correspond to specific point coordinates + inside each bounding box from `boxes`. + + Args: + features_list (list[Tensor]): A list of feature map tensors to get features from. + feature_scales (list[float]): A list of scales for tensors in `features_list`. + boxes (list[Boxes]): A list of I Boxes objects that contain R_1 + ... + R_I = R boxes all + together. + point_coords (Tensor): A tensor of shape (R, P, 2) that contains + [0, 1] x [0, 1] box-normalized coordinates of the P sampled points. + + Returns: + point_features (Tensor): A tensor of shape (R, C, P) that contains features sampled + from all features maps in feature_list for P sampled points for all R boxes in `boxes`. + point_coords_wrt_image (Tensor): A tensor of shape (R, P, 2) that contains image-level + coordinates of P points. + """ + cat_boxes = Boxes.cat(boxes) + num_boxes = [len(b) for b in boxes] + + point_coords_wrt_image = get_point_coords_wrt_image(cat_boxes.tensor, point_coords) + split_point_coords_wrt_image = torch.split(point_coords_wrt_image, num_boxes) + + point_features = [] + for idx_img, point_coords_wrt_image_per_image in enumerate(split_point_coords_wrt_image): + point_features_per_image = [] + for idx_feature, feature_map in enumerate(features_list): + h, w = feature_map.shape[-2:] + scale = torch.tensor([w, h], device=feature_map.device) / feature_scales[idx_feature] + point_coords_scaled = point_coords_wrt_image_per_image / scale + point_features_per_image.append( + point_sample( + feature_map[idx_img].unsqueeze(0), + point_coords_scaled.unsqueeze(0), + align_corners=False, + ) + .squeeze(0) + .transpose(1, 0) + ) + point_features.append(cat(point_features_per_image, dim=1)) + + return cat(point_features, dim=0), point_coords_wrt_image + + +def get_point_coords_wrt_image(boxes_coords, point_coords): + """ + Convert box-normalized [0, 1] x [0, 1] point cooordinates to image-level coordinates. + + Args: + boxes_coords (Tensor): A tensor of shape (R, 4) that contains bounding boxes. + coordinates. + point_coords (Tensor): A tensor of shape (R, P, 2) that contains + [0, 1] x [0, 1] box-normalized coordinates of the P sampled points. + + Returns: + point_coords_wrt_image (Tensor): A tensor of shape (R, P, 2) that contains + image-normalized coordinates of P sampled points. + """ + with torch.no_grad(): + point_coords_wrt_image = point_coords.clone() + point_coords_wrt_image[:, :, 0] = point_coords_wrt_image[:, :, 0] * ( + boxes_coords[:, None, 2] - boxes_coords[:, None, 0] + ) + point_coords_wrt_image[:, :, 1] = point_coords_wrt_image[:, :, 1] * ( + boxes_coords[:, None, 3] - boxes_coords[:, None, 1] + ) + point_coords_wrt_image[:, :, 0] += boxes_coords[:, None, 0] + point_coords_wrt_image[:, :, 1] += boxes_coords[:, None, 1] + return point_coords_wrt_image diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_head.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_head.py new file mode 100644 index 0000000..6f35bae --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/point_head.py @@ -0,0 +1,154 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import fvcore.nn.weight_init as weight_init +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.layers import ShapeSpec, cat +from detectron2.structures import BitMasks +from detectron2.utils.events import get_event_storage +from detectron2.utils.registry import Registry + +from .point_features import point_sample + +POINT_HEAD_REGISTRY = Registry("POINT_HEAD") +POINT_HEAD_REGISTRY.__doc__ = """ +Registry for point heads, which makes prediction for a given set of per-point features. + +The registered object will be called with `obj(cfg, input_shape)`. +""" + + +def roi_mask_point_loss(mask_logits, instances, points_coord): + """ + Compute the point-based loss for instance segmentation mask predictions. + + Args: + mask_logits (Tensor): A tensor of shape (R, C, P) or (R, 1, P) for class-specific or + class-agnostic, where R is the total number of predicted masks in all images, C is the + number of foreground classes, and P is the number of points sampled for each mask. + The values are logits. + instances (list[Instances]): A list of N Instances, where N is the number of images + in the batch. These instances are in 1:1 correspondence with the `mask_logits`. So, i_th + elememt of the list contains R_i objects and R_1 + ... + R_N is equal to R. + The ground-truth labels (class, box, mask, ...) associated with each instance are stored + in fields. + points_coords (Tensor): A tensor of shape (R, P, 2), where R is the total number of + predicted masks and P is the number of points for each mask. The coordinates are in + the image pixel coordinate space, i.e. [0, H] x [0, W]. + Returns: + point_loss (Tensor): A scalar tensor containing the loss. + """ + assert len(instances) == 0 or isinstance( + instances[0].gt_masks, BitMasks + ), "Point head works with GT in 'bitmask' format only. Set INPUT.MASK_FORMAT to 'bitmask'." + with torch.no_grad(): + cls_agnostic_mask = mask_logits.size(1) == 1 + total_num_masks = mask_logits.size(0) + + gt_classes = [] + gt_mask_logits = [] + idx = 0 + for instances_per_image in instances: + if not cls_agnostic_mask: + gt_classes_per_image = instances_per_image.gt_classes.to(dtype=torch.int64) + gt_classes.append(gt_classes_per_image) + + gt_bit_masks = instances_per_image.gt_masks.tensor + h, w = instances_per_image.gt_masks.image_size + scale = torch.tensor([w, h], dtype=torch.float, device=gt_bit_masks.device) + points_coord_grid_sample_format = ( + points_coord[idx : idx + len(instances_per_image)] / scale + ) + idx += len(instances_per_image) + gt_mask_logits.append( + point_sample( + gt_bit_masks.to(torch.float32).unsqueeze(1), + points_coord_grid_sample_format, + align_corners=False, + ).squeeze(1) + ) + gt_mask_logits = cat(gt_mask_logits) + + # torch.mean (in binary_cross_entropy_with_logits) doesn't + # accept empty tensors, so handle it separately + if gt_mask_logits.numel() == 0: + return mask_logits.sum() * 0 + + if cls_agnostic_mask: + mask_logits = mask_logits[:, 0] + else: + indices = torch.arange(total_num_masks) + gt_classes = cat(gt_classes, dim=0) + mask_logits = mask_logits[indices, gt_classes] + + # Log the training accuracy (using gt classes and 0.0 threshold for the logits) + mask_accurate = (mask_logits > 0.0) == gt_mask_logits.to(dtype=torch.uint8) + mask_accuracy = mask_accurate.nonzero().size(0) / mask_accurate.numel() + get_event_storage().put_scalar("point_rend/accuracy", mask_accuracy) + + point_loss = F.binary_cross_entropy_with_logits( + mask_logits, gt_mask_logits.to(dtype=torch.float32), reduction="mean" + ) + return point_loss + + +@POINT_HEAD_REGISTRY.register() +class StandardPointHead(nn.Module): + """ + A point head multi-layer perceptron which we model with conv1d layers with kernel 1. The head + takes both fine-grained and coarse prediction features as its input. + """ + + def __init__(self, cfg, input_shape: ShapeSpec): + """ + The following attributes are parsed from config: + fc_dim: the output dimension of each FC layers + num_fc: the number of FC layers + coarse_pred_each_layer: if True, coarse prediction features are concatenated to each + layer's input + """ + super(StandardPointHead, self).__init__() + # fmt: off + num_classes = cfg.MODEL.POINT_HEAD.NUM_CLASSES + fc_dim = cfg.MODEL.POINT_HEAD.FC_DIM + num_fc = cfg.MODEL.POINT_HEAD.NUM_FC + cls_agnostic_mask = cfg.MODEL.POINT_HEAD.CLS_AGNOSTIC_MASK + self.coarse_pred_each_layer = cfg.MODEL.POINT_HEAD.COARSE_PRED_EACH_LAYER + input_channels = input_shape.channels + # fmt: on + + fc_dim_in = input_channels + num_classes + self.fc_layers = [] + for k in range(num_fc): + fc = nn.Conv1d(fc_dim_in, fc_dim, kernel_size=1, stride=1, padding=0, bias=True) + self.add_module("fc{}".format(k + 1), fc) + self.fc_layers.append(fc) + fc_dim_in = fc_dim + fc_dim_in += num_classes if self.coarse_pred_each_layer else 0 + + num_mask_classes = 1 if cls_agnostic_mask else num_classes + self.predictor = nn.Conv1d(fc_dim_in, num_mask_classes, kernel_size=1, stride=1, padding=0) + + for layer in self.fc_layers: + weight_init.c2_msra_fill(layer) + # use normal distribution initialization for mask prediction layer + nn.init.normal_(self.predictor.weight, std=0.001) + if self.predictor.bias is not None: + nn.init.constant_(self.predictor.bias, 0) + + def forward(self, fine_grained_features, coarse_features): + x = torch.cat((fine_grained_features, coarse_features), dim=1) + for layer in self.fc_layers: + x = F.relu(layer(x)) + if self.coarse_pred_each_layer: + x = cat((x, coarse_features), dim=1) + return self.predictor(x) + + +def build_point_head(cfg, input_channels): + """ + Build a point head defined by `cfg.MODEL.POINT_HEAD.NAME`. + """ + head_name = cfg.MODEL.POINT_HEAD.NAME + return POINT_HEAD_REGISTRY.get(head_name)(cfg, input_channels) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/roi_heads.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/roi_heads.py new file mode 100644 index 0000000..4f7225b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/roi_heads.py @@ -0,0 +1,227 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +import torch + +from detectron2.layers import ShapeSpec, cat, interpolate +from detectron2.modeling import ROI_HEADS_REGISTRY, StandardROIHeads +from detectron2.modeling.roi_heads.mask_head import ( + build_mask_head, + mask_rcnn_inference, + mask_rcnn_loss, +) +from detectron2.modeling.roi_heads.roi_heads import select_foreground_proposals + +from .point_features import ( + generate_regular_grid_point_coords, + get_uncertain_point_coords_on_grid, + get_uncertain_point_coords_with_randomness, + point_sample, + point_sample_fine_grained_features, +) +from .point_head import build_point_head, roi_mask_point_loss + + +def calculate_uncertainty(logits, classes): + """ + We estimate uncerainty as L1 distance between 0.0 and the logit prediction in 'logits' for the + foreground class in `classes`. + + Args: + logits (Tensor): A tensor of shape (R, C, ...) or (R, 1, ...) for class-specific or + class-agnostic, where R is the total number of predicted masks in all images and C is + the number of foreground classes. The values are logits. + classes (list): A list of length R that contains either predicted of ground truth class + for eash predicted mask. + + Returns: + scores (Tensor): A tensor of shape (R, 1, ...) that contains uncertainty scores with + the most uncertain locations having the highest uncertainty score. + """ + if logits.shape[1] == 1: + gt_class_logits = logits.clone() + else: + gt_class_logits = logits[ + torch.arange(logits.shape[0], device=logits.device), classes + ].unsqueeze(1) + return -(torch.abs(gt_class_logits)) + + +@ROI_HEADS_REGISTRY.register() +class PointRendROIHeads(StandardROIHeads): + """ + The RoI heads class for PointRend instance segmentation models. + + In this class we redefine the mask head of `StandardROIHeads` leaving all other heads intact. + To avoid namespace conflict with other heads we use names starting from `mask_` for all + variables that correspond to the mask head in the class's namespace. + """ + + def __init__(self, cfg, input_shape): + # TODO use explicit args style + super().__init__(cfg, input_shape) + self._init_mask_head(cfg, input_shape) + + def _init_mask_head(self, cfg, input_shape): + # fmt: off + self.mask_on = cfg.MODEL.MASK_ON + if not self.mask_on: + return + self.mask_coarse_in_features = cfg.MODEL.ROI_MASK_HEAD.IN_FEATURES + self.mask_coarse_side_size = cfg.MODEL.ROI_MASK_HEAD.POOLER_RESOLUTION + self._feature_scales = {k: 1.0 / v.stride for k, v in input_shape.items()} + # fmt: on + + in_channels = np.sum([input_shape[f].channels for f in self.mask_coarse_in_features]) + self.mask_coarse_head = build_mask_head( + cfg, + ShapeSpec( + channels=in_channels, + width=self.mask_coarse_side_size, + height=self.mask_coarse_side_size, + ), + ) + self._init_point_head(cfg, input_shape) + + def _init_point_head(self, cfg, input_shape): + # fmt: off + self.mask_point_on = cfg.MODEL.ROI_MASK_HEAD.POINT_HEAD_ON + if not self.mask_point_on: + return + assert cfg.MODEL.ROI_HEADS.NUM_CLASSES == cfg.MODEL.POINT_HEAD.NUM_CLASSES + self.mask_point_in_features = cfg.MODEL.POINT_HEAD.IN_FEATURES + self.mask_point_train_num_points = cfg.MODEL.POINT_HEAD.TRAIN_NUM_POINTS + self.mask_point_oversample_ratio = cfg.MODEL.POINT_HEAD.OVERSAMPLE_RATIO + self.mask_point_importance_sample_ratio = cfg.MODEL.POINT_HEAD.IMPORTANCE_SAMPLE_RATIO + # next two parameters are use in the adaptive subdivions inference procedure + self.mask_point_subdivision_steps = cfg.MODEL.POINT_HEAD.SUBDIVISION_STEPS + self.mask_point_subdivision_num_points = cfg.MODEL.POINT_HEAD.SUBDIVISION_NUM_POINTS + # fmt: on + + in_channels = np.sum([input_shape[f].channels for f in self.mask_point_in_features]) + self.mask_point_head = build_point_head( + cfg, ShapeSpec(channels=in_channels, width=1, height=1) + ) + + def _forward_mask(self, features, instances): + """ + Forward logic of the mask prediction branch. + + Args: + features (dict[str, Tensor]): #level input features for mask prediction + instances (list[Instances]): the per-image instances to train/predict masks. + In training, they can be the proposals. + In inference, they can be the predicted boxes. + + Returns: + In training, a dict of losses. + In inference, update `instances` with new fields "pred_masks" and return it. + """ + if not self.mask_on: + return {} if self.training else instances + + if self.training: + proposals, _ = select_foreground_proposals(instances, self.num_classes) + proposal_boxes = [x.proposal_boxes for x in proposals] + mask_coarse_logits = self._forward_mask_coarse(features, proposal_boxes) + + losses = {"loss_mask": mask_rcnn_loss(mask_coarse_logits, proposals)} + losses.update(self._forward_mask_point(features, mask_coarse_logits, proposals)) + return losses + else: + pred_boxes = [x.pred_boxes for x in instances] + mask_coarse_logits = self._forward_mask_coarse(features, pred_boxes) + + mask_logits = self._forward_mask_point(features, mask_coarse_logits, instances) + mask_rcnn_inference(mask_logits, instances) + return instances + + def _forward_mask_coarse(self, features, boxes): + """ + Forward logic of the coarse mask head. + """ + point_coords = generate_regular_grid_point_coords( + np.sum(len(x) for x in boxes), self.mask_coarse_side_size, boxes[0].device + ) + mask_coarse_features_list = [features[k] for k in self.mask_coarse_in_features] + features_scales = [self._feature_scales[k] for k in self.mask_coarse_in_features] + # For regular grids of points, this function is equivalent to `len(features_list)' calls + # of `ROIAlign` (with `SAMPLING_RATIO=2`), and concat the results. + mask_features, _ = point_sample_fine_grained_features( + mask_coarse_features_list, features_scales, boxes, point_coords + ) + return self.mask_coarse_head(mask_features) + + def _forward_mask_point(self, features, mask_coarse_logits, instances): + """ + Forward logic of the mask point head. + """ + if not self.mask_point_on: + return {} if self.training else mask_coarse_logits + + mask_features_list = [features[k] for k in self.mask_point_in_features] + features_scales = [self._feature_scales[k] for k in self.mask_point_in_features] + + if self.training: + proposal_boxes = [x.proposal_boxes for x in instances] + gt_classes = cat([x.gt_classes for x in instances]) + with torch.no_grad(): + point_coords = get_uncertain_point_coords_with_randomness( + mask_coarse_logits, + lambda logits: calculate_uncertainty(logits, gt_classes), + self.mask_point_train_num_points, + self.mask_point_oversample_ratio, + self.mask_point_importance_sample_ratio, + ) + + fine_grained_features, point_coords_wrt_image = point_sample_fine_grained_features( + mask_features_list, features_scales, proposal_boxes, point_coords + ) + coarse_features = point_sample(mask_coarse_logits, point_coords, align_corners=False) + point_logits = self.mask_point_head(fine_grained_features, coarse_features) + return { + "loss_mask_point": roi_mask_point_loss( + point_logits, instances, point_coords_wrt_image + ) + } + else: + pred_boxes = [x.pred_boxes for x in instances] + pred_classes = cat([x.pred_classes for x in instances]) + # The subdivision code will fail with the empty list of boxes + if len(pred_classes) == 0: + return mask_coarse_logits + + mask_logits = mask_coarse_logits.clone() + for subdivions_step in range(self.mask_point_subdivision_steps): + mask_logits = interpolate( + mask_logits, scale_factor=2, mode="bilinear", align_corners=False + ) + # If `mask_point_subdivision_num_points` is larger or equal to the + # resolution of the next step, then we can skip this step + H, W = mask_logits.shape[-2:] + if ( + self.mask_point_subdivision_num_points >= 4 * H * W + and subdivions_step < self.mask_point_subdivision_steps - 1 + ): + continue + uncertainty_map = calculate_uncertainty(mask_logits, pred_classes) + point_indices, point_coords = get_uncertain_point_coords_on_grid( + uncertainty_map, self.mask_point_subdivision_num_points + ) + fine_grained_features, _ = point_sample_fine_grained_features( + mask_features_list, features_scales, pred_boxes, point_coords + ) + coarse_features = point_sample( + mask_coarse_logits, point_coords, align_corners=False + ) + point_logits = self.mask_point_head(fine_grained_features, coarse_features) + + # put mask point predictions to the right places on the upsampled grid. + R, C, H, W = mask_logits.shape + point_indices = point_indices.unsqueeze(1).expand(-1, C, -1) + mask_logits = ( + mask_logits.reshape(R, C, H * W) + .scatter_(2, point_indices, point_logits) + .view(R, C, H, W) + ) + return mask_logits diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/semantic_seg.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/semantic_seg.py new file mode 100644 index 0000000..670a0ea --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/point_rend/semantic_seg.py @@ -0,0 +1,134 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +from typing import Dict +import torch +from torch import nn +from torch.nn import functional as F + +from detectron2.layers import ShapeSpec, cat +from detectron2.modeling import SEM_SEG_HEADS_REGISTRY + +from .point_features import ( + get_uncertain_point_coords_on_grid, + get_uncertain_point_coords_with_randomness, + point_sample, +) +from .point_head import build_point_head + + +def calculate_uncertainty(sem_seg_logits): + """ + For each location of the prediction `sem_seg_logits` we estimate uncerainty as the + difference between top first and top second predicted logits. + + Args: + mask_logits (Tensor): A tensor of shape (N, C, ...), where N is the minibatch size and + C is the number of foreground classes. The values are logits. + + Returns: + scores (Tensor): A tensor of shape (N, 1, ...) that contains uncertainty scores with + the most uncertain locations having the highest uncertainty score. + """ + top2_scores = torch.topk(sem_seg_logits, k=2, dim=1)[0] + return (top2_scores[:, 1] - top2_scores[:, 0]).unsqueeze(1) + + +@SEM_SEG_HEADS_REGISTRY.register() +class PointRendSemSegHead(nn.Module): + """ + A semantic segmentation head that combines a head set in `POINT_HEAD.COARSE_SEM_SEG_HEAD_NAME` + and a point head set in `MODEL.POINT_HEAD.NAME`. + """ + + def __init__(self, cfg, input_shape: Dict[str, ShapeSpec]): + super().__init__() + + self.ignore_value = cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE + + self.coarse_sem_seg_head = SEM_SEG_HEADS_REGISTRY.get( + cfg.MODEL.POINT_HEAD.COARSE_SEM_SEG_HEAD_NAME + )(cfg, input_shape) + self._init_point_head(cfg, input_shape) + + def _init_point_head(self, cfg, input_shape: Dict[str, ShapeSpec]): + # fmt: off + assert cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES == cfg.MODEL.POINT_HEAD.NUM_CLASSES + feature_channels = {k: v.channels for k, v in input_shape.items()} + self.in_features = cfg.MODEL.POINT_HEAD.IN_FEATURES + self.train_num_points = cfg.MODEL.POINT_HEAD.TRAIN_NUM_POINTS + self.oversample_ratio = cfg.MODEL.POINT_HEAD.OVERSAMPLE_RATIO + self.importance_sample_ratio = cfg.MODEL.POINT_HEAD.IMPORTANCE_SAMPLE_RATIO + self.subdivision_steps = cfg.MODEL.POINT_HEAD.SUBDIVISION_STEPS + self.subdivision_num_points = cfg.MODEL.POINT_HEAD.SUBDIVISION_NUM_POINTS + # fmt: on + + in_channels = np.sum([feature_channels[f] for f in self.in_features]) + self.point_head = build_point_head(cfg, ShapeSpec(channels=in_channels, width=1, height=1)) + + def forward(self, features, targets=None): + coarse_sem_seg_logits = self.coarse_sem_seg_head.layers(features) + + if self.training: + losses = self.coarse_sem_seg_head.losses(coarse_sem_seg_logits, targets) + + with torch.no_grad(): + point_coords = get_uncertain_point_coords_with_randomness( + coarse_sem_seg_logits, + calculate_uncertainty, + self.train_num_points, + self.oversample_ratio, + self.importance_sample_ratio, + ) + coarse_features = point_sample(coarse_sem_seg_logits, point_coords, align_corners=False) + + fine_grained_features = cat( + [ + point_sample(features[in_feature], point_coords, align_corners=False) + for in_feature in self.in_features + ] + ) + point_logits = self.point_head(fine_grained_features, coarse_features) + point_targets = ( + point_sample( + targets.unsqueeze(1).to(torch.float), + point_coords, + mode="nearest", + align_corners=False, + ) + .squeeze(1) + .to(torch.long) + ) + losses["loss_sem_seg_point"] = F.cross_entropy( + point_logits, point_targets, reduction="mean", ignore_index=self.ignore_value + ) + return None, losses + else: + sem_seg_logits = coarse_sem_seg_logits.clone() + for _ in range(self.subdivision_steps): + sem_seg_logits = F.interpolate( + sem_seg_logits, scale_factor=2, mode="bilinear", align_corners=False + ) + uncertainty_map = calculate_uncertainty(sem_seg_logits) + point_indices, point_coords = get_uncertain_point_coords_on_grid( + uncertainty_map, self.subdivision_num_points + ) + fine_grained_features = cat( + [ + point_sample(features[in_feature], point_coords, align_corners=False) + for in_feature in self.in_features + ] + ) + coarse_features = point_sample( + coarse_sem_seg_logits, point_coords, align_corners=False + ) + point_logits = self.point_head(fine_grained_features, coarse_features) + + # put sem seg point predictions to the right places on the upsampled grid. + N, C, H, W = sem_seg_logits.shape + point_indices = point_indices.unsqueeze(1).expand(-1, C, -1) + sem_seg_logits = ( + sem_seg_logits.reshape(N, C, H * W) + .scatter_(2, point_indices, point_logits) + .view(N, C, H, W) + ) + return sem_seg_logits, {} diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/run.sh b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/run.sh new file mode 100644 index 0000000..4ee1614 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/run.sh @@ -0,0 +1,2 @@ +python finetune_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_X_101_32x8d_FPN_3x_parsing.yaml --num-gpus 1 +#python finetune_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_parsing.yaml --num-gpus 1 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/train_net.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/train_net.py new file mode 100644 index 0000000..7832867 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/PointRend/train_net.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +""" +PointRend Training Script. + +This script is a simplified version of the training script in detectron2/tools. +""" + +import os +import torch + +import detectron2.utils.comm as comm +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import MetadataCatalog, build_detection_train_loader +from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, launch +from detectron2.evaluation import ( + CityscapesInstanceEvaluator, + CityscapesSemSegEvaluator, + COCOEvaluator, + DatasetEvaluators, + LVISEvaluator, + SemSegEvaluator, + verify_results, +) + +from point_rend import SemSegDatasetMapper, add_pointrend_config + + +class Trainer(DefaultTrainer): + """ + We use the "DefaultTrainer" which contains a number pre-defined logic for + standard training workflow. They may not work for you, especially if you + are working on a new research project. In that case you can use the cleaner + "SimpleTrainer", or write your own training loop. + """ + + @classmethod + def build_evaluator(cls, cfg, dataset_name, output_folder=None): + """ + Create evaluator(s) for a given dataset. + This uses the special metadata "evaluator_type" associated with each builtin dataset. + For your own dataset, you can simply create an evaluator manually in your + script and do not have to worry about the hacky if-else logic here. + """ + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + evaluator_list = [] + evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type + if evaluator_type == "lvis": + return LVISEvaluator(dataset_name, cfg, True, output_folder) + if evaluator_type == "coco": + return COCOEvaluator(dataset_name, cfg, True, output_folder) + if evaluator_type == "sem_seg": + return SemSegEvaluator( + dataset_name, + distributed=True, + num_classes=cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES, + ignore_label=cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE, + output_dir=output_folder, + ) + if evaluator_type == "cityscapes_instance": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesInstanceEvaluator(dataset_name) + if evaluator_type == "cityscapes_sem_seg": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesSemSegEvaluator(dataset_name) + if len(evaluator_list) == 0: + raise NotImplementedError( + "no Evaluator for the dataset {} with the type {}".format( + dataset_name, evaluator_type + ) + ) + if len(evaluator_list) == 1: + return evaluator_list[0] + return DatasetEvaluators(evaluator_list) + + @classmethod + def build_train_loader(cls, cfg): + if "SemanticSegmentor" in cfg.MODEL.META_ARCHITECTURE: + mapper = SemSegDatasetMapper(cfg, True) + else: + mapper = None + return build_detection_train_loader(cfg, mapper=mapper) + + +def setup(args): + """ + Create configs and perform basic setups. + """ + cfg = get_cfg() + add_pointrend_config(cfg) + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup(cfg, args) + return cfg + + +def main(args): + cfg = setup(args) + + if args.eval_only: + model = Trainer.build_model(cfg) + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + res = Trainer.test(cfg, model) + if comm.is_main_process(): + verify_results(cfg, res) + return res + + trainer = Trainer(cfg) + trainer.resume_or_load(resume=args.resume) + return trainer.train() + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/README.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/README.md new file mode 100644 index 0000000..36263bd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/README.md @@ -0,0 +1,31 @@ + +Here are a few projects that are built on detectron2. +They are examples of how to use detectron2 as a library, to make your projects more +maintainable. + +## Projects by Facebook + +Note that these are research projects, and therefore may not have the same level +of support or stability of detectron2. + ++ [DensePose: Dense Human Pose Estimation In The Wild](DensePose) ++ [Scale-Aware Trident Networks for Object Detection](TridentNet) ++ [TensorMask: A Foundation for Dense Object Segmentation](TensorMask) ++ [Mesh R-CNN](https://github.com/facebookresearch/meshrcnn) ++ [PointRend: Image Segmentation as Rendering](PointRend) ++ [Momentum Contrast for Unsupervised Visual Representation Learning](https://github.com/facebookresearch/moco/tree/master/detection) + + +## External Projects + +External projects in the community that use detectron2: + + + ++ [VoVNet backbones](https://github.com/youngwanLEE/vovnet-detectron2). ++ [AdelaiDet](https://github.com/aim-uofa/adet), a detection toolbox from the Universtiy of Adelaide. ++ [CenterMask : Real-Time Anchor-Free Instance Segmentation](https://github.com/youngwanLEE/centermask2) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/README.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/README.md new file mode 100644 index 0000000..6831508 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/README.md @@ -0,0 +1,64 @@ + +# TensorMask in Detectron2 +**A Foundation for Dense Object Segmentation** + +Xinlei Chen, Ross Girshick, Kaiming He, Piotr Dollár + +[[`arXiv`](https://arxiv.org/abs/1903.12174)] [[`BibTeX`](#CitingTensorMask)] + +
    + +
    + +In this repository, we release code for TensorMask in Detectron2. +TensorMask is a dense sliding-window instance segmentation framework that, for the first time, achieves results close to the well-developed Mask R-CNN framework -- both qualitatively and quantitatively. It establishes a conceptually complementary direction for object instance segmentation research. + +## Installation +First install Detectron2 following the [documentation](https://detectron2.readthedocs.io/tutorials/install.html) and +[setup the dataset](../../datasets). Then compile the TensorMask-specific op (`swap_align2nat`): +```bash +cd /path/to/detectron2/projects/TensorMask +python setup.py build develop +``` + +## Training + +To train a model, run: +```bash +python /path/to/detectron2/projects/TensorMask/train_net.py --config-file +``` + +For example, to launch TensorMask BiPyramid training (1x schedule) with ResNet-50 backbone on 8 GPUs, +one should execute: +```bash +python /path/to/detectron2/projects/TensorMask/train_net.py --config-file configs/tensormask_R_50_FPN_1x.yaml --num-gpus 8 +``` + +## Evaluation + +Model evaluation can be done similarly (6x schedule with scale augmentation): +```bash +python /path/to/detectron2/projects/TensorMask/train_net.py --config-file configs/tensormask_R_50_FPN_6x.yaml --eval-only MODEL.WEIGHTS /path/to/model_checkpoint +``` + +# Pretrained Models + +| Backbone | lr sched | AP box | AP mask | download | +| -------- | -------- | -- | --- | -------- | +| R50 | 1x | 37.6 | 32.4 | model \|  metrics | +| R50 | 6x | 41.4 | 35.8 | model \|  metrics | + + +## Citing TensorMask + +If you use TensorMask, please use the following BibTeX entry. + +``` +@InProceedings{chen2019tensormask, + title={Tensormask: A Foundation for Dense Object Segmentation}, + author={Chen, Xinlei and Girshick, Ross and He, Kaiming and Doll{\'a}r, Piotr}, + journal={The International Conference on Computer Vision (ICCV)}, + year={2019} +} +``` + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/Base-TensorMask.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/Base-TensorMask.yaml new file mode 100644 index 0000000..a724534 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/Base-TensorMask.yaml @@ -0,0 +1,25 @@ +MODEL: + META_ARCHITECTURE: "TensorMask" + MASK_ON: True + BACKBONE: + NAME: "build_retinanet_resnet_fpn_backbone" + RESNETS: + OUT_FEATURES: ["res2", "res3", "res4", "res5"] + ANCHOR_GENERATOR: + SIZES: [[44, 60], [88, 120], [176, 240], [352, 480], [704, 960], [1408, 1920]] + ASPECT_RATIOS: [[1.0]] + FPN: + IN_FEATURES: ["res2", "res3", "res4", "res5"] + FUSE_TYPE: "avg" + TENSOR_MASK: + ALIGNED_ON: True + BIPYRAMID_ON: True +DATASETS: + TRAIN: ("coco_2017_train",) + TEST: ("coco_2017_val",) +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.02 + STEPS: (60000, 80000) + MAX_ITER: 90000 +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_1x.yaml new file mode 100644 index 0000000..5d5eee1 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_1x.yaml @@ -0,0 +1,5 @@ +_BASE_: "Base-TensorMask.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_6x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_6x.yaml new file mode 100644 index 0000000..366a965 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/configs/tensormask_R_50_FPN_6x.yaml @@ -0,0 +1,11 @@ +_BASE_: "Base-TensorMask.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (480000, 520000) + MAX_ITER: 540000 +INPUT: + MIN_SIZE_TRAIN_SAMPLING: "range" + MIN_SIZE_TRAIN: (640, 800) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/setup.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/setup.py new file mode 100644 index 0000000..0194e76 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/setup.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import glob +import os +from setuptools import find_packages, setup +import torch +from torch.utils.cpp_extension import CUDA_HOME, CppExtension, CUDAExtension + + +def get_extensions(): + this_dir = os.path.dirname(os.path.abspath(__file__)) + extensions_dir = os.path.join(this_dir, "tensormask", "layers", "csrc") + + main_source = os.path.join(extensions_dir, "vision.cpp") + sources = glob.glob(os.path.join(extensions_dir, "**", "*.cpp")) + source_cuda = glob.glob(os.path.join(extensions_dir, "**", "*.cu")) + glob.glob( + os.path.join(extensions_dir, "*.cu") + ) + + sources = [main_source] + sources + + extension = CppExtension + + extra_compile_args = {"cxx": []} + define_macros = [] + + if (torch.cuda.is_available() and CUDA_HOME is not None) or os.getenv("FORCE_CUDA", "0") == "1": + extension = CUDAExtension + sources += source_cuda + define_macros += [("WITH_CUDA", None)] + extra_compile_args["nvcc"] = [ + "-DCUDA_HAS_FP16=1", + "-D__CUDA_NO_HALF_OPERATORS__", + "-D__CUDA_NO_HALF_CONVERSIONS__", + "-D__CUDA_NO_HALF2_OPERATORS__", + ] + + # It's better if pytorch can do this by default .. + CC = os.environ.get("CC", None) + if CC is not None: + extra_compile_args["nvcc"].append("-ccbin={}".format(CC)) + + sources = [os.path.join(extensions_dir, s) for s in sources] + + include_dirs = [extensions_dir] + + ext_modules = [ + extension( + "tensormask._C", + sources, + include_dirs=include_dirs, + define_macros=define_macros, + extra_compile_args=extra_compile_args, + ) + ] + + return ext_modules + + +setup( + name="tensormask", + version="0.1", + author="FAIR", + packages=find_packages(exclude=("configs", "tests")), + python_requires=">=3.6", + ext_modules=get_extensions(), + cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension}, +) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/__init__.py new file mode 100644 index 0000000..e3b642a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .config import add_tensormask_config +from .arch import TensorMask diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/arch.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/arch.py new file mode 100644 index 0000000..a3e89c6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/arch.py @@ -0,0 +1,904 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import copy +import logging +import math +from typing import List +import torch +import torch.nn.functional as F +from fvcore.nn import sigmoid_focal_loss_star_jit, smooth_l1_loss +from torch import nn + +from detectron2.layers import ShapeSpec, batched_nms, cat, paste_masks_in_image +from detectron2.modeling.anchor_generator import DefaultAnchorGenerator +from detectron2.modeling.backbone import build_backbone +from detectron2.modeling.box_regression import Box2BoxTransform +from detectron2.modeling.meta_arch.build import META_ARCH_REGISTRY +from detectron2.modeling.meta_arch.retinanet import ( + permute_all_cls_and_box_to_N_HWA_K_and_concat, + permute_to_N_HWA_K, +) +from detectron2.structures import Boxes, ImageList, Instances +from detectron2.utils.logger import log_first_n + +from tensormask.layers import SwapAlign2Nat + +__all__ = ["TensorMask"] + + +def _assignment_rule( + gt_boxes, + anchor_boxes, + unit_lengths, + min_anchor_size, + scale_thresh=2.0, + spatial_thresh=1.0, + uniqueness_on=True, +): + """ + Given two lists of boxes of N ground truth boxes and M anchor boxes, + compute the assignment between the two, following the assignment rules in + https://arxiv.org/abs/1903.12174. + The box order must be (xmin, ymin, xmax, ymax), so please make sure to convert + to BoxMode.XYXY_ABS before calling this function. + + Args: + gt_boxes, anchor_boxes (Boxes): two Boxes. Contains N & M boxes/anchors, respectively. + unit_lengths (Tensor): Contains the unit lengths of M anchor boxes. + min_anchor_size (float): Minimum size of the anchor, in pixels + scale_thresh (float): The `scale` threshold: the maximum size of the anchor + should not be greater than scale_thresh x max(h, w) of + the ground truth box. + spatial_thresh (float): The `spatial` threshold: the l2 distance between the + center of the anchor and the ground truth box should not + be greater than spatial_thresh x u where u is the unit length. + + Returns: + matches (Tensor[int64]): a vector of length M, where matches[i] is a matched + ground-truth index in [0, N) + match_labels (Tensor[int8]): a vector of length M, where pred_labels[i] indicates + whether a prediction is a true or false positive or ignored + """ + gt_boxes, anchor_boxes = gt_boxes.tensor, anchor_boxes.tensor + N = gt_boxes.shape[0] + M = anchor_boxes.shape[0] + if N == 0 or M == 0: + return ( + gt_boxes.new_full((N,), 0, dtype=torch.int64), + gt_boxes.new_full((N,), -1, dtype=torch.int8), + ) + + # Containment rule + lt = torch.min(gt_boxes[:, None, :2], anchor_boxes[:, :2]) # [N,M,2] + rb = torch.max(gt_boxes[:, None, 2:], anchor_boxes[:, 2:]) # [N,M,2] + union = cat([lt, rb], dim=2) # [N,M,4] + + dummy_gt_boxes = torch.zeros_like(gt_boxes) + anchor = dummy_gt_boxes[:, None, :] + anchor_boxes[:, :] # [N,M,4] + + contain_matrix = torch.all(union == anchor, dim=2) # [N,M] + + # Centrality rule, scale + gt_size_lower = torch.max(gt_boxes[:, 2:] - gt_boxes[:, :2], dim=1)[0] # [N] + gt_size_upper = gt_size_lower * scale_thresh # [N] + # Fall back for small objects + gt_size_upper[gt_size_upper < min_anchor_size] = min_anchor_size + # Due to sampling of locations, the anchor sizes are deducted with sampling strides + anchor_size = ( + torch.max(anchor_boxes[:, 2:] - anchor_boxes[:, :2], dim=1)[0] - unit_lengths + ) # [M] + + size_diff_upper = gt_size_upper[:, None] - anchor_size # [N,M] + scale_matrix = size_diff_upper >= 0 # [N,M] + + # Centrality rule, spatial + gt_center = (gt_boxes[:, 2:] + gt_boxes[:, :2]) / 2 # [N,2] + anchor_center = (anchor_boxes[:, 2:] + anchor_boxes[:, :2]) / 2 # [M,2] + offset_center = gt_center[:, None, :] - anchor_center[:, :] # [N,M,2] + offset_center /= unit_lengths[:, None] # [N,M,2] + spatial_square = spatial_thresh * spatial_thresh + spatial_matrix = torch.sum(offset_center * offset_center, dim=2) <= spatial_square + + assign_matrix = (contain_matrix & scale_matrix & spatial_matrix).int() + + # assign_matrix is N (gt) x M (predicted) + # Max over gt elements (dim 0) to find best gt candidate for each prediction + matched_vals, matches = assign_matrix.max(dim=0) + match_labels = matches.new_full(matches.size(), 1, dtype=torch.int8) + + match_labels[matched_vals == 0] = 0 + match_labels[matched_vals == 1] = 1 + + # find all the elements that match to ground truths multiple times + not_unique_idxs = assign_matrix.sum(dim=0) > 1 + if uniqueness_on: + match_labels[not_unique_idxs] = 0 + else: + match_labels[not_unique_idxs] = -1 + + return matches, match_labels + + +# TODO make the paste_mask function in d2 core support mask list +def _paste_mask_lists_in_image(masks, boxes, image_shape, threshold=0.5): + """ + Paste a list of masks that are of various resolutions (e.g., 28 x 28) into an image. + The location, height, and width for pasting each mask is determined by their + corresponding bounding boxes in boxes. + + Args: + masks (list(Tensor)): A list of Tensor of shape (1, Hmask_i, Wmask_i). + Values are in [0, 1]. The list length, Bimg, is the + number of detected object instances in the image. + boxes (Boxes): A Boxes of length Bimg. boxes.tensor[i] and masks[i] correspond + to the same object instance. + image_shape (tuple): height, width + threshold (float): A threshold in [0, 1] for converting the (soft) masks to + binary masks. + + Returns: + img_masks (Tensor): A tensor of shape (Bimg, Himage, Wimage), where Bimg is the + number of detected object instances and Himage, Wimage are the image width + and height. img_masks[i] is a binary mask for object instance i. + """ + if len(masks) == 0: + return torch.empty((0, 1) + image_shape, dtype=torch.uint8) + + # Loop over masks groups. Each group has the same mask prediction size. + img_masks = [] + ind_masks = [] + mask_sizes = torch.tensor([m.shape[-1] for m in masks]) + unique_sizes = torch.unique(mask_sizes) + for msize in unique_sizes.tolist(): + cur_ind = torch.where(mask_sizes == msize)[0] + ind_masks.append(cur_ind) + + cur_masks = cat([masks[i] for i in cur_ind]) + cur_boxes = boxes[cur_ind] + img_masks.append(paste_masks_in_image(cur_masks, cur_boxes, image_shape, threshold)) + + img_masks = cat(img_masks) + ind_masks = cat(ind_masks) + + img_masks_out = torch.empty_like(img_masks) + img_masks_out[ind_masks, :, :] = img_masks + + return img_masks_out + + +def _postprocess(results, result_mask_info, output_height, output_width, mask_threshold=0.5): + """ + Post-process the output boxes for TensorMask. + The input images are often resized when entering an object detector. + As a result, we often need the outputs of the detector in a different + resolution from its inputs. + + This function will postprocess the raw outputs of TensorMask + to produce outputs according to the desired output resolution. + + Args: + results (Instances): the raw outputs from the detector. + `results.image_size` contains the input image resolution the detector sees. + This object might be modified in-place. Note that it does not contain the field + `pred_masks`, which is provided by another input `result_masks`. + result_mask_info (list[Tensor], Boxes): a pair of two items for mask related results. + The first item is a list of #detection tensors, each is the predicted masks. + The second item is the anchors corresponding to the predicted masks. + output_height, output_width: the desired output resolution. + + Returns: + Instances: the postprocessed output from the model, based on the output resolution + """ + scale_x, scale_y = (output_width / results.image_size[1], output_height / results.image_size[0]) + results = Instances((output_height, output_width), **results.get_fields()) + + output_boxes = results.pred_boxes + output_boxes.tensor[:, 0::2] *= scale_x + output_boxes.tensor[:, 1::2] *= scale_y + output_boxes.clip(results.image_size) + + inds_nonempty = output_boxes.nonempty() + results = results[inds_nonempty] + result_masks, result_anchors = result_mask_info + if result_masks: + result_anchors.tensor[:, 0::2] *= scale_x + result_anchors.tensor[:, 1::2] *= scale_y + result_masks = [x for (i, x) in zip(inds_nonempty.tolist(), result_masks) if i] + results.pred_masks = _paste_mask_lists_in_image( + result_masks, + result_anchors[inds_nonempty], + results.image_size, + threshold=mask_threshold, + ) + return results + + +class TensorMaskAnchorGenerator(DefaultAnchorGenerator): + """ + For a set of image sizes and feature maps, computes a set of anchors for TensorMask. + It also computes the unit lengths and indexes for each anchor box. + """ + + def grid_anchors_with_unit_lengths_and_indexes(self, grid_sizes): + anchors = [] + unit_lengths = [] + indexes = [] + for lvl, (size, stride, base_anchors) in enumerate( + zip(grid_sizes, self.strides, self.cell_anchors) + ): + grid_height, grid_width = size + device = base_anchors.device + shifts_x = torch.arange( + 0, grid_width * stride, step=stride, dtype=torch.float32, device=device + ) + shifts_y = torch.arange( + 0, grid_height * stride, step=stride, dtype=torch.float32, device=device + ) + shift_y, shift_x = torch.meshgrid(shifts_y, shifts_x) + shifts = torch.stack((shift_x, shift_y, shift_x, shift_y), dim=2) + # Stack anchors in shapes of (HWA, 4) + cur_anchor = (shifts[:, :, None, :] + base_anchors.view(1, 1, -1, 4)).view(-1, 4) + anchors.append(cur_anchor) + unit_lengths.append( + torch.full((cur_anchor.shape[0],), stride, dtype=torch.float32, device=device) + ) + # create mask indexes using mesh grid + shifts_l = torch.full((1,), lvl, dtype=torch.int64, device=device) + shifts_i = torch.zeros((1,), dtype=torch.int64, device=device) + shifts_h = torch.arange(0, grid_height, dtype=torch.int64, device=device) + shifts_w = torch.arange(0, grid_width, dtype=torch.int64, device=device) + shifts_a = torch.arange(0, base_anchors.shape[0], dtype=torch.int64, device=device) + grids = torch.meshgrid(shifts_l, shifts_i, shifts_h, shifts_w, shifts_a) + + indexes.append(torch.stack(grids, dim=5).view(-1, 5)) + + return anchors, unit_lengths, indexes + + def forward(self, features): + """ + Returns: + list[list[Boxes]]: a list of #image elements. Each is a list of #feature level Boxes. + The Boxes contains anchors of this image on the specific feature level. + list[list[Tensor]]: a list of #image elements. Each is a list of #feature level tensors. + The tensor contains strides, or unit lengths for the anchors. + list[list[Tensor]]: a list of #image elements. Each is a list of #feature level tensors. + The Tensor contains indexes for the anchors, with the last dimension meaning + (L, N, H, W, A), where L is level, I is image (not set yet), H is height, + W is width, and A is anchor. + """ + num_images = len(features[0]) + grid_sizes = [feature_map.shape[-2:] for feature_map in features] + anchors_list, lengths_list, indexes_list = self.grid_anchors_with_unit_lengths_and_indexes( + grid_sizes + ) + + # Convert anchors from Tensor to Boxes + anchors_per_im = [Boxes(x) for x in anchors_list] + + # TODO it can be simplified to not return duplicated information for + # each image, just like detectron2's own AnchorGenerator + anchors = [copy.deepcopy(anchors_per_im) for _ in range(num_images)] + unit_lengths = [copy.deepcopy(lengths_list) for _ in range(num_images)] + indexes = [copy.deepcopy(indexes_list) for _ in range(num_images)] + + return anchors, unit_lengths, indexes + + +@META_ARCH_REGISTRY.register() +class TensorMask(nn.Module): + """ + TensorMask model. Creates FPN backbone, anchors and a head for classification + and box regression. Calculates and applies proper losses to class, box, and + masks. + """ + + def __init__(self, cfg): + super().__init__() + + # fmt: off + self.num_classes = cfg.MODEL.TENSOR_MASK.NUM_CLASSES + self.in_features = cfg.MODEL.TENSOR_MASK.IN_FEATURES + self.anchor_sizes = cfg.MODEL.ANCHOR_GENERATOR.SIZES + self.num_levels = len(cfg.MODEL.ANCHOR_GENERATOR.SIZES) + # Loss parameters: + self.focal_loss_alpha = cfg.MODEL.TENSOR_MASK.FOCAL_LOSS_ALPHA + self.focal_loss_gamma = cfg.MODEL.TENSOR_MASK.FOCAL_LOSS_GAMMA + # Inference parameters: + self.score_threshold = cfg.MODEL.TENSOR_MASK.SCORE_THRESH_TEST + self.topk_candidates = cfg.MODEL.TENSOR_MASK.TOPK_CANDIDATES_TEST + self.nms_threshold = cfg.MODEL.TENSOR_MASK.NMS_THRESH_TEST + self.detections_im = cfg.TEST.DETECTIONS_PER_IMAGE + # Mask parameters: + self.mask_on = cfg.MODEL.MASK_ON + self.mask_loss_weight = cfg.MODEL.TENSOR_MASK.MASK_LOSS_WEIGHT + self.mask_pos_weight = torch.tensor(cfg.MODEL.TENSOR_MASK.POSITIVE_WEIGHT, + dtype=torch.float32) + self.bipyramid_on = cfg.MODEL.TENSOR_MASK.BIPYRAMID_ON + # fmt: on + + # build the backbone + self.backbone = build_backbone(cfg) + + backbone_shape = self.backbone.output_shape() + feature_shapes = [backbone_shape[f] for f in self.in_features] + feature_strides = [x.stride for x in feature_shapes] + # build anchors + self.anchor_generator = TensorMaskAnchorGenerator(cfg, feature_shapes) + self.num_anchors = self.anchor_generator.num_cell_anchors[0] + anchors_min_level = cfg.MODEL.ANCHOR_GENERATOR.SIZES[0] + self.mask_sizes = [size // feature_strides[0] for size in anchors_min_level] + self.min_anchor_size = min(anchors_min_level) - feature_strides[0] + + # head of the TensorMask + self.head = TensorMaskHead( + cfg, self.num_levels, self.num_anchors, self.mask_sizes, feature_shapes + ) + # box transform + self.box2box_transform = Box2BoxTransform(weights=cfg.MODEL.TENSOR_MASK.BBOX_REG_WEIGHTS) + self.register_buffer("pixel_mean", torch.Tensor(cfg.MODEL.PIXEL_MEAN).view(-1, 1, 1)) + self.register_buffer("pixel_std", torch.Tensor(cfg.MODEL.PIXEL_STD).view(-1, 1, 1)) + + @property + def device(self): + return self.pixel_mean.device + + def forward(self, batched_inputs): + """ + Args: + batched_inputs: a list, batched outputs of :class:`DetectionTransform` . + Each item in the list contains the inputs for one image. + For now, each item in the list is a dict that contains: + image: Tensor, image in (C, H, W) format. + instances: Instances + Other information that's included in the original dicts, such as: + "height", "width" (int): the output resolution of the model, used in inference. + See :meth:`postprocess` for details. + Returns: + losses (dict[str: Tensor]): mapping from a named loss to a tensor + storing the loss. Used during training only. + """ + images = self.preprocess_image(batched_inputs) + if "instances" in batched_inputs[0]: + gt_instances = [x["instances"].to(self.device) for x in batched_inputs] + elif "targets" in batched_inputs[0]: + log_first_n( + logging.WARN, "'targets' in the model inputs is now renamed to 'instances'!", n=10 + ) + gt_instances = [x["targets"].to(self.device) for x in batched_inputs] + else: + gt_instances = None + + features = self.backbone(images.tensor) + features = [features[f] for f in self.in_features] + # apply the TensorMask head + pred_logits, pred_deltas, pred_masks = self.head(features) + # generate anchors based on features, is it image specific? + anchors, unit_lengths, indexes = self.anchor_generator(features) + + if self.training: + # get ground truths for class labels and box targets, it will label each anchor + gt_class_info, gt_delta_info, gt_mask_info, num_fg = self.get_ground_truth( + anchors, unit_lengths, indexes, gt_instances + ) + # compute the loss + return self.losses( + gt_class_info, + gt_delta_info, + gt_mask_info, + num_fg, + pred_logits, + pred_deltas, + pred_masks, + ) + else: + # do inference to get the output + results = self.inference(pred_logits, pred_deltas, pred_masks, anchors, indexes, images) + processed_results = [] + for results_im, input_im, image_size in zip( + results, batched_inputs, images.image_sizes + ): + height = input_im.get("height", image_size[0]) + width = input_im.get("width", image_size[1]) + # this is to do post-processing with the image size + result_box, result_mask = results_im + r = _postprocess(result_box, result_mask, height, width) + processed_results.append({"instances": r}) + return processed_results + + def losses( + self, + gt_class_info, + gt_delta_info, + gt_mask_info, + num_fg, + pred_logits, + pred_deltas, + pred_masks, + ): + """ + Args: + For `gt_class_info`, `gt_delta_info`, `gt_mask_info` and `num_fg` parameters, see + :meth:`TensorMask.get_ground_truth`. + For `pred_logits`, `pred_deltas` and `pred_masks`, see + :meth:`TensorMaskHead.forward`. + + Returns: + losses (dict[str: Tensor]): mapping from a named loss to a scalar tensor + storing the loss. Used during training only. The potential dict keys are: + "loss_cls", "loss_box_reg" and "loss_mask". + """ + gt_classes_target, gt_valid_inds = gt_class_info + gt_deltas, gt_fg_inds = gt_delta_info + gt_masks, gt_mask_inds = gt_mask_info + loss_normalizer = torch.tensor(max(1, num_fg), dtype=torch.float32, device=self.device) + + # classification and regression + pred_logits, pred_deltas = permute_all_cls_and_box_to_N_HWA_K_and_concat( + pred_logits, pred_deltas, self.num_classes + ) + loss_cls = ( + sigmoid_focal_loss_star_jit( + pred_logits[gt_valid_inds], + gt_classes_target[gt_valid_inds], + alpha=self.focal_loss_alpha, + gamma=self.focal_loss_gamma, + reduction="sum", + ) + / loss_normalizer + ) + + if num_fg == 0: + loss_box_reg = pred_deltas.sum() * 0 + else: + loss_box_reg = ( + smooth_l1_loss(pred_deltas[gt_fg_inds], gt_deltas, beta=0.0, reduction="sum") + / loss_normalizer + ) + losses = {"loss_cls": loss_cls, "loss_box_reg": loss_box_reg} + + # mask prediction + if self.mask_on: + loss_mask = 0 + for lvl in range(self.num_levels): + cur_level_factor = 2 ** lvl if self.bipyramid_on else 1 + for anc in range(self.num_anchors): + cur_gt_mask_inds = gt_mask_inds[lvl][anc] + if cur_gt_mask_inds is None: + loss_mask += pred_masks[lvl][anc][0, 0, 0, 0] * 0 + else: + cur_mask_size = self.mask_sizes[anc] * cur_level_factor + # TODO maybe there are numerical issues when mask sizes are large + cur_size_divider = torch.tensor( + self.mask_loss_weight / (cur_mask_size ** 2), + dtype=torch.float32, + device=self.device, + ) + + cur_pred_masks = pred_masks[lvl][anc][ + cur_gt_mask_inds[:, 0], # N + :, # V x U + cur_gt_mask_inds[:, 1], # H + cur_gt_mask_inds[:, 2], # W + ] + + loss_mask += F.binary_cross_entropy_with_logits( + cur_pred_masks.view(-1, cur_mask_size, cur_mask_size), # V, U + gt_masks[lvl][anc].to(dtype=torch.float32), + reduction="sum", + weight=cur_size_divider, + pos_weight=self.mask_pos_weight, + ) + losses["loss_mask"] = loss_mask / loss_normalizer + return losses + + @torch.no_grad() + def get_ground_truth(self, anchors, unit_lengths, indexes, targets): + """ + Args: + anchors (list[list[Boxes]]): a list of N=#image elements. Each is a + list of #feature level Boxes. The Boxes contains anchors of + this image on the specific feature level. + unit_lengths (list[list[Tensor]]): a list of N=#image elements. Each is a + list of #feature level Tensor. The tensor contains unit lengths for anchors of + this image on the specific feature level. + indexes (list[list[Tensor]]): a list of N=#image elements. Each is a + list of #feature level Tensor. The tensor contains the 5D index of + each anchor, the second dimension means (L, N, H, W, A), where L + is level, I is image, H is height, W is width, and A is anchor. + targets (list[Instances]): a list of N `Instances`s. The i-th + `Instances` contains the ground-truth per-instance annotations + for the i-th input image. Specify `targets` during training only. + + Returns: + gt_class_info (Tensor, Tensor): A pair of two tensors for classification. + The first one is an integer tensor of shape (R, #classes) storing ground-truth + labels for each anchor. R is the total number of anchors in the batch. + The second one is an integer tensor of shape (R,), to indicate which + anchors are valid for loss computation, which anchors are not. + gt_delta_info (Tensor, Tensor): A pair of two tensors for boxes. + The first one, of shape (F, 4). F=#foreground anchors. + The last dimension represents ground-truth box2box transform + targets (dx, dy, dw, dh) that map each anchor to its matched ground-truth box. + Only foreground anchors have values in this tensor. Could be `None` if F=0. + The second one, of shape (R,), is an integer tensor indicating which anchors + are foreground ones used for box regression. Could be `None` if F=0. + gt_mask_info (list[list[Tensor]], list[list[Tensor]]): A pair of two lists for masks. + The first one is a list of P=#feature level elements. Each is a + list of A=#anchor tensors. Each tensor contains the ground truth + masks of the same size and for the same feature level. Could be `None`. + The second one is a list of P=#feature level elements. Each is a + list of A=#anchor tensors. Each tensor contains the location of the ground truth + masks of the same size and for the same feature level. The second dimension means + (N, H, W), where N is image, H is height, and W is width. Could be `None`. + num_fg (int): F=#foreground anchors, used later for loss normalization. + """ + gt_classes = [] + gt_deltas = [] + gt_masks = [[[] for _ in range(self.num_anchors)] for _ in range(self.num_levels)] + gt_mask_inds = [[[] for _ in range(self.num_anchors)] for _ in range(self.num_levels)] + + anchors = [Boxes.cat(anchors_i) for anchors_i in anchors] + unit_lengths = [cat(unit_lengths_i) for unit_lengths_i in unit_lengths] + indexes = [cat(indexes_i) for indexes_i in indexes] + + num_fg = 0 + for i, (anchors_im, unit_lengths_im, indexes_im, targets_im) in enumerate( + zip(anchors, unit_lengths, indexes, targets) + ): + # Initialize all + gt_classes_i = torch.full_like( + unit_lengths_im, self.num_classes, dtype=torch.int64, device=self.device + ) + # Ground truth classes + has_gt = len(targets_im) > 0 + if has_gt: + # Compute the pairwise matrix + gt_matched_inds, anchor_labels = _assignment_rule( + targets_im.gt_boxes, anchors_im, unit_lengths_im, self.min_anchor_size + ) + # Find the foreground instances + fg_inds = anchor_labels == 1 + fg_anchors = anchors_im[fg_inds] + num_fg += len(fg_anchors) + # Find the ground truths for foreground instances + gt_fg_matched_inds = gt_matched_inds[fg_inds] + # Assign labels for foreground instances + gt_classes_i[fg_inds] = targets_im.gt_classes[gt_fg_matched_inds] + # Anchors with label -1 are ignored, others are left as negative + gt_classes_i[anchor_labels == -1] = -1 + + # Boxes + # Ground truth box regression, only for foregrounds + matched_gt_boxes = targets_im[gt_fg_matched_inds].gt_boxes + # Compute box regression offsets for foregrounds only + gt_deltas_i = self.box2box_transform.get_deltas( + fg_anchors.tensor, matched_gt_boxes.tensor + ) + gt_deltas.append(gt_deltas_i) + + # Masks + if self.mask_on: + # Compute masks for each level and each anchor + matched_indexes = indexes_im[fg_inds, :] + for lvl in range(self.num_levels): + ids_lvl = matched_indexes[:, 0] == lvl + if torch.any(ids_lvl): + cur_level_factor = 2 ** lvl if self.bipyramid_on else 1 + for anc in range(self.num_anchors): + ids_lvl_anchor = ids_lvl & (matched_indexes[:, 4] == anc) + if torch.any(ids_lvl_anchor): + gt_masks[lvl][anc].append( + targets_im[ + gt_fg_matched_inds[ids_lvl_anchor] + ].gt_masks.crop_and_resize( + fg_anchors[ids_lvl_anchor].tensor, + self.mask_sizes[anc] * cur_level_factor, + ) + ) + # Select (N, H, W) dimensions + gt_mask_inds_lvl_anc = matched_indexes[ids_lvl_anchor, 1:4] + # Set the image index to the current image + gt_mask_inds_lvl_anc[:, 0] = i + gt_mask_inds[lvl][anc].append(gt_mask_inds_lvl_anc) + gt_classes.append(gt_classes_i) + + # Classes and boxes + gt_classes = cat(gt_classes) + gt_valid_inds = gt_classes >= 0 + gt_fg_inds = gt_valid_inds & (gt_classes < self.num_classes) + gt_classes_target = torch.zeros( + (gt_classes.shape[0], self.num_classes), dtype=torch.float32, device=self.device + ) + gt_classes_target[gt_fg_inds, gt_classes[gt_fg_inds]] = 1 + gt_deltas = cat(gt_deltas) if gt_deltas else None + + # Masks + gt_masks = [[cat(mla) if mla else None for mla in ml] for ml in gt_masks] + gt_mask_inds = [[cat(ila) if ila else None for ila in il] for il in gt_mask_inds] + return ( + (gt_classes_target, gt_valid_inds), + (gt_deltas, gt_fg_inds), + (gt_masks, gt_mask_inds), + num_fg, + ) + + def inference(self, pred_logits, pred_deltas, pred_masks, anchors, indexes, images): + """ + Arguments: + pred_logits, pred_deltas, pred_masks: Same as the output of: + meth:`TensorMaskHead.forward` + anchors, indexes: Same as the input of meth:`TensorMask.get_ground_truth` + images (ImageList): the input images + + Returns: + results (List[Instances]): a list of #images elements. + """ + assert len(anchors) == len(images) + results = [] + + pred_logits = [permute_to_N_HWA_K(x, self.num_classes) for x in pred_logits] + pred_deltas = [permute_to_N_HWA_K(x, 4) for x in pred_deltas] + + pred_logits = cat(pred_logits, dim=1) + pred_deltas = cat(pred_deltas, dim=1) + + for img_idx, (anchors_im, indexes_im) in enumerate(zip(anchors, indexes)): + # Get the size of the current image + image_size = images.image_sizes[img_idx] + + logits_im = pred_logits[img_idx] + deltas_im = pred_deltas[img_idx] + + if self.mask_on: + masks_im = [[mla[img_idx] for mla in ml] for ml in pred_masks] + else: + masks_im = [None] * self.num_levels + results_im = self.inference_single_image( + logits_im, + deltas_im, + masks_im, + Boxes.cat(anchors_im), + cat(indexes_im), + tuple(image_size), + ) + results.append(results_im) + return results + + def inference_single_image( + self, pred_logits, pred_deltas, pred_masks, anchors, indexes, image_size + ): + """ + Single-image inference. Return bounding-box detection results by thresholding + on scores and applying non-maximum suppression (NMS). + + Arguments: + pred_logits (list[Tensor]): list of #feature levels. Each entry contains + tensor of size (AxHxW, K) + pred_deltas (list[Tensor]): Same shape as 'pred_logits' except that K becomes 4. + pred_masks (list[list[Tensor]]): List of #feature levels, each is a list of #anchors. + Each entry contains tensor of size (M_i*M_i, H, W). `None` if mask_on=False. + anchors (list[Boxes]): list of #feature levels. Each entry contains + a Boxes object, which contains all the anchors for that + image in that feature level. + image_size (tuple(H, W)): a tuple of the image height and width. + + Returns: + Same as `inference`, but for only one image. + """ + pred_logits = pred_logits.flatten().sigmoid_() + # We get top locations across all levels to accelerate the inference speed, + # which does not seem to affect the accuracy. + # First select values above the threshold + logits_top_idxs = torch.where(pred_logits > self.score_threshold)[0] + # Then get the top values + num_topk = min(self.topk_candidates, logits_top_idxs.shape[0]) + pred_prob, topk_idxs = pred_logits[logits_top_idxs].sort(descending=True) + # Keep top k scoring values + pred_prob = pred_prob[:num_topk] + # Keep top k values + top_idxs = logits_top_idxs[topk_idxs[:num_topk]] + + # class index + cls_idxs = top_idxs % self.num_classes + # HWA index + top_idxs //= self.num_classes + # predict boxes + pred_boxes = self.box2box_transform.apply_deltas( + pred_deltas[top_idxs], anchors[top_idxs].tensor + ) + # apply nms + keep = batched_nms(pred_boxes, pred_prob, cls_idxs, self.nms_threshold) + # pick the top ones + keep = keep[: self.detections_im] + + results = Instances(image_size) + results.pred_boxes = Boxes(pred_boxes[keep]) + results.scores = pred_prob[keep] + results.pred_classes = cls_idxs[keep] + + # deal with masks + result_masks, result_anchors = [], None + if self.mask_on: + # index and anchors, useful for masks + top_indexes = indexes[top_idxs] + top_anchors = anchors[top_idxs] + result_indexes = top_indexes[keep] + result_anchors = top_anchors[keep] + # Get masks and do sigmoid + for lvl, _, h, w, anc in result_indexes.tolist(): + cur_size = self.mask_sizes[anc] * (2 ** lvl if self.bipyramid_on else 1) + result_masks.append( + torch.sigmoid(pred_masks[lvl][anc][:, h, w].view(1, cur_size, cur_size)) + ) + + return results, (result_masks, result_anchors) + + def preprocess_image(self, batched_inputs): + """ + Normalize, pad and batch the input images. + """ + images = [x["image"].to(self.device) for x in batched_inputs] + images = [(x - self.pixel_mean) / self.pixel_std for x in images] + images = ImageList.from_tensors(images, self.backbone.size_divisibility) + return images + + +class TensorMaskHead(nn.Module): + def __init__(self, cfg, num_levels, num_anchors, mask_sizes, input_shape: List[ShapeSpec]): + """ + TensorMask head. + """ + super().__init__() + # fmt: off + self.in_features = cfg.MODEL.TENSOR_MASK.IN_FEATURES + in_channels = input_shape[0].channels + num_classes = cfg.MODEL.TENSOR_MASK.NUM_CLASSES + cls_channels = cfg.MODEL.TENSOR_MASK.CLS_CHANNELS + num_convs = cfg.MODEL.TENSOR_MASK.NUM_CONVS + # box parameters + bbox_channels = cfg.MODEL.TENSOR_MASK.BBOX_CHANNELS + # mask parameters + self.mask_on = cfg.MODEL.MASK_ON + self.mask_sizes = mask_sizes + mask_channels = cfg.MODEL.TENSOR_MASK.MASK_CHANNELS + self.align_on = cfg.MODEL.TENSOR_MASK.ALIGNED_ON + self.bipyramid_on = cfg.MODEL.TENSOR_MASK.BIPYRAMID_ON + # fmt: on + + # class subnet + cls_subnet = [] + cur_channels = in_channels + for _ in range(num_convs): + cls_subnet.append( + nn.Conv2d(cur_channels, cls_channels, kernel_size=3, stride=1, padding=1) + ) + cur_channels = cls_channels + cls_subnet.append(nn.ReLU()) + + self.cls_subnet = nn.Sequential(*cls_subnet) + self.cls_score = nn.Conv2d( + cur_channels, num_anchors * num_classes, kernel_size=3, stride=1, padding=1 + ) + modules_list = [self.cls_subnet, self.cls_score] + + # box subnet + bbox_subnet = [] + cur_channels = in_channels + for _ in range(num_convs): + bbox_subnet.append( + nn.Conv2d(cur_channels, bbox_channels, kernel_size=3, stride=1, padding=1) + ) + cur_channels = bbox_channels + bbox_subnet.append(nn.ReLU()) + + self.bbox_subnet = nn.Sequential(*bbox_subnet) + self.bbox_pred = nn.Conv2d( + cur_channels, num_anchors * 4, kernel_size=3, stride=1, padding=1 + ) + modules_list.extend([self.bbox_subnet, self.bbox_pred]) + + # mask subnet + if self.mask_on: + mask_subnet = [] + cur_channels = in_channels + for _ in range(num_convs): + mask_subnet.append( + nn.Conv2d(cur_channels, mask_channels, kernel_size=3, stride=1, padding=1) + ) + cur_channels = mask_channels + mask_subnet.append(nn.ReLU()) + + self.mask_subnet = nn.Sequential(*mask_subnet) + modules_list.append(self.mask_subnet) + for mask_size in self.mask_sizes: + cur_mask_module = "mask_pred_%02d" % mask_size + self.add_module( + cur_mask_module, + nn.Conv2d( + cur_channels, mask_size * mask_size, kernel_size=1, stride=1, padding=0 + ), + ) + modules_list.append(getattr(self, cur_mask_module)) + if self.align_on: + if self.bipyramid_on: + for lvl in range(num_levels): + cur_mask_module = "align2nat_%02d" % lvl + lambda_val = 2 ** lvl + setattr(self, cur_mask_module, SwapAlign2Nat(lambda_val)) + # Also the fusing layer, stay at the same channel size + mask_fuse = [ + nn.Conv2d(cur_channels, cur_channels, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + ] + self.mask_fuse = nn.Sequential(*mask_fuse) + modules_list.append(self.mask_fuse) + else: + self.align2nat = SwapAlign2Nat(1) + + # Initialization + for modules in modules_list: + for layer in modules.modules(): + if isinstance(layer, nn.Conv2d): + torch.nn.init.normal_(layer.weight, mean=0, std=0.01) + torch.nn.init.constant_(layer.bias, 0) + + # Use prior in model initialization to improve stability + bias_value = -(math.log((1 - 0.01) / 0.01)) + torch.nn.init.constant_(self.cls_score.bias, bias_value) + + def forward(self, features): + """ + Arguments: + features (list[Tensor]): FPN feature map tensors in high to low resolution. + Each tensor in the list correspond to different feature levels. + + Returns: + pred_logits (list[Tensor]): #lvl tensors, each has shape (N, AxK, Hi, Wi). + The tensor predicts the classification probability + at each spatial position for each of the A anchors and K object + classes. + pred_deltas (list[Tensor]): #lvl tensors, each has shape (N, Ax4, Hi, Wi). + The tensor predicts 4-vector (dx,dy,dw,dh) box + regression values for every anchor. These values are the + relative offset between the anchor and the ground truth box. + pred_masks (list(list[Tensor])): #lvl list of tensors, each is a list of + A tensors of shape (N, M_{i,a}, Hi, Wi). + The tensor predicts a dense set of M_ixM_i masks at every location. + """ + pred_logits = [self.cls_score(self.cls_subnet(x)) for x in features] + pred_deltas = [self.bbox_pred(self.bbox_subnet(x)) for x in features] + + pred_masks = None + if self.mask_on: + mask_feats = [self.mask_subnet(x) for x in features] + + if self.bipyramid_on: + mask_feat_high_res = mask_feats[0] + H, W = mask_feat_high_res.shape[-2:] + mask_feats_up = [] + for lvl, mask_feat in enumerate(mask_feats): + lambda_val = 2.0 ** lvl + mask_feat_up = mask_feat + if lvl > 0: + mask_feat_up = F.interpolate( + mask_feat, scale_factor=lambda_val, mode="bilinear", align_corners=False + ) + mask_feats_up.append( + self.mask_fuse(mask_feat_up[:, :, :H, :W] + mask_feat_high_res) + ) + mask_feats = mask_feats_up + + pred_masks = [] + for lvl, mask_feat in enumerate(mask_feats): + cur_masks = [] + for mask_size in self.mask_sizes: + cur_mask_module = getattr(self, "mask_pred_%02d" % mask_size) + cur_mask = cur_mask_module(mask_feat) + if self.align_on: + if self.bipyramid_on: + cur_mask_module = getattr(self, "align2nat_%02d" % lvl) + cur_mask = cur_mask_module(cur_mask) + else: + cur_mask = self.align2nat(cur_mask) + cur_masks.append(cur_mask) + pred_masks.append(cur_masks) + return pred_logits, pred_deltas, pred_masks diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/config.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/config.py new file mode 100644 index 0000000..44479f2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/config.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from detectron2.config import CfgNode as CN + + +def add_tensormask_config(cfg): + """ + Add config for TensorMask. + """ + cfg.MODEL.TENSOR_MASK = CN() + + # Anchor parameters + cfg.MODEL.TENSOR_MASK.IN_FEATURES = ["p2", "p3", "p4", "p5", "p6", "p7"] + + # Convolutions to use in the towers + cfg.MODEL.TENSOR_MASK.NUM_CONVS = 4 + + # Number of foreground classes. + cfg.MODEL.TENSOR_MASK.NUM_CLASSES = 80 + # Channel size for the classification tower + cfg.MODEL.TENSOR_MASK.CLS_CHANNELS = 256 + + cfg.MODEL.TENSOR_MASK.SCORE_THRESH_TEST = 0.05 + # Only the top (1000 * #levels) candidate boxes across all levels are + # considered jointly during test (to improve speed) + cfg.MODEL.TENSOR_MASK.TOPK_CANDIDATES_TEST = 6000 + cfg.MODEL.TENSOR_MASK.NMS_THRESH_TEST = 0.5 + + # Box parameters + # Channel size for the box tower + cfg.MODEL.TENSOR_MASK.BBOX_CHANNELS = 128 + # Weights on (dx, dy, dw, dh) + cfg.MODEL.TENSOR_MASK.BBOX_REG_WEIGHTS = (1.5, 1.5, 0.75, 0.75) + + # Loss parameters + cfg.MODEL.TENSOR_MASK.FOCAL_LOSS_GAMMA = 3.0 + cfg.MODEL.TENSOR_MASK.FOCAL_LOSS_ALPHA = 0.3 + + # Mask parameters + # Channel size for the mask tower + cfg.MODEL.TENSOR_MASK.MASK_CHANNELS = 128 + # Mask loss weight + cfg.MODEL.TENSOR_MASK.MASK_LOSS_WEIGHT = 2.0 + # weight on positive pixels within the mask + cfg.MODEL.TENSOR_MASK.POSITIVE_WEIGHT = 1.5 + # Whether to predict in the aligned representation + cfg.MODEL.TENSOR_MASK.ALIGNED_ON = False + # Whether to use the bipyramid architecture + cfg.MODEL.TENSOR_MASK.BIPYRAMID_ON = False diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/__init__.py new file mode 100644 index 0000000..cbbac42 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .swap_align2nat import SwapAlign2Nat, swap_align2nat + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat.h b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat.h new file mode 100644 index 0000000..2ec0373 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat.h @@ -0,0 +1,54 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#pragma once +#include + +namespace tensormask { + +#ifdef WITH_CUDA +at::Tensor SwapAlign2Nat_forward_cuda( + const at::Tensor& X, + const int lambda_val, + const float pad_val); + +at::Tensor SwapAlign2Nat_backward_cuda( + const at::Tensor& gY, + const int lambda_val, + const int batch_size, + const int channel, + const int height, + const int width); +#endif + +inline at::Tensor SwapAlign2Nat_forward( + const at::Tensor& X, + const int lambda_val, + const float pad_val) { + if (X.type().is_cuda()) { +#ifdef WITH_CUDA + return SwapAlign2Nat_forward_cuda(X, lambda_val, pad_val); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + AT_ERROR("Not implemented on the CPU"); +} + +inline at::Tensor SwapAlign2Nat_backward( + const at::Tensor& gY, + const int lambda_val, + const int batch_size, + const int channel, + const int height, + const int width) { + if (gY.type().is_cuda()) { +#ifdef WITH_CUDA + return SwapAlign2Nat_backward_cuda( + gY, lambda_val, batch_size, channel, height, width); +#else + AT_ERROR("Not compiled with GPU support"); +#endif + } + AT_ERROR("Not implemented on the CPU"); +} + +} // namespace tensormask diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat_cuda.cu b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat_cuda.cu new file mode 100644 index 0000000..06de4a4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/SwapAlign2Nat/SwapAlign2Nat_cuda.cu @@ -0,0 +1,526 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +#include +#include +#include +#include + +// TODO make it in a common file +#define CUDA_1D_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; \ + i += blockDim.x * gridDim.x) + +template +__device__ inline T get_pixel_val( + const T* tensor, + const int idx, + const int H, + const int W, + const int y, + const int x, + const int V, + const int U, + const int v, + const int u, + const T pad_val) { + if ((y < 0) || (y >= H) || (x < 0) || (x >= W) || (v < 0) || (v >= V) || + (u < 0) || (u >= U)) { + return pad_val; + } else { + return tensor[(((idx * V + v) * U + u) * H + y) * W + x]; + } +} + +template +__device__ inline void add_pixel_val( + T* tensor, + const T val, + const int idx, + const int H, + const int W, + const int y, + const int x, + const int V, + const int U, + const int v, + const int u) { + if ((val == 0.) || (y < 0) || (y >= H) || (x < 0) || (x >= W) || (v < 0) || + (v >= V) || (u < 0) || (u >= U)) { + return; + } else { + atomicAdd(tensor + ((((idx * V + v) * U + u) * H + y) * W + x), val); + } +} + +template +__global__ void SwapAlign2NatForwardFeat( + const int nthreads, + const T* bottom_data, + const int Vout, + const int Uout, + const float hVout, + const float hUout, + const int Vin, + const int Uin, + const float lambda, + const int Hin, + const int Win, + const int Hout, + const int Wout, + const T pad_val, + T* top_data) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int idx = index; + const int x = idx % Wout; + idx /= Wout; + const int y = idx % Hout; + idx /= Hout; + const int u = idx % Uout; + idx /= Uout; + const int v = idx % Vout; + idx /= Vout; + + const float ox = x * lambda + u - hUout + 0.5; + const int xf = static_cast(floor(ox)); + const int xc = static_cast(ceil(ox)); + const float xwc = ox - xf; + const float xwf = 1. - xwc; + + const float oy = y * lambda + v - hVout + 0.5; + const int yf = static_cast(floor(oy)); + const int yc = static_cast(ceil(oy)); + const float ywc = oy - yf; + const float ywf = 1. - ywc; + + const float ou = (u + 0.5) / lambda - 0.5; + const int uf = static_cast(floor(ou)); + const int uc = static_cast(ceil(ou)); + const float uwc = ou - uf; + const float uwf = 1. - uwc; + + const float ov = (v + 0.5) / lambda - 0.5; + const int vf = static_cast(floor(ov)); + const int vc = static_cast(ceil(ov)); + const float vwc = ov - vf; + const float vwf = 1. - vwc; + + T val = ywf * xwf * vwf * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xf, Vin, Uin, vf, uf, pad_val) + + ywf * xwf * vwf * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xf, Vin, Uin, vf, uc, pad_val) + + ywf * xwf * vwc * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xf, Vin, Uin, vc, uf, pad_val) + + ywf * xwf * vwc * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xf, Vin, Uin, vc, uc, pad_val) + + ywf * xwc * vwf * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xc, Vin, Uin, vf, uf, pad_val) + + ywf * xwc * vwf * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xc, Vin, Uin, vf, uc, pad_val) + + ywf * xwc * vwc * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xc, Vin, Uin, vc, uf, pad_val) + + ywf * xwc * vwc * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yf, xc, Vin, Uin, vc, uc, pad_val) + + ywc * xwf * vwf * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xf, Vin, Uin, vf, uf, pad_val) + + ywc * xwf * vwf * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xf, Vin, Uin, vf, uc, pad_val) + + ywc * xwf * vwc * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xf, Vin, Uin, vc, uf, pad_val) + + ywc * xwf * vwc * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xf, Vin, Uin, vc, uc, pad_val) + + ywc * xwc * vwf * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xc, Vin, Uin, vf, uf, pad_val) + + ywc * xwc * vwf * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xc, Vin, Uin, vf, uc, pad_val) + + ywc * xwc * vwc * uwf * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xc, Vin, Uin, vc, uf, pad_val) + + ywc * xwc * vwc * uwc * + get_pixel_val( + bottom_data, idx, Hin, Win, yc, xc, Vin, Uin, vc, uc, pad_val); + + top_data[index] = val; + } +} + +template +__global__ void SwapAlign2NatBackwardFeat( + const int nthreads, + const T* top_diff, + const int Vout, + const int Uout, + const float hVout, + const float hUout, + const int Vin, + const int Uin, + const float lambda, + const int Hin, + const int Win, + const int Hout, + const int Wout, + T* bottom_diff) { + CUDA_1D_KERNEL_LOOP(index, nthreads) { + int idx = index; + const int x = idx % Wout; + idx /= Wout; + const int y = idx % Hout; + idx /= Hout; + const int u = idx % Uout; + idx /= Uout; + const int v = idx % Vout; + idx /= Vout; + + const float ox = x * lambda + u - hUout + 0.5; + const int xf = static_cast(floor(ox)); + const int xc = static_cast(ceil(ox)); + const float xwc = ox - xf; + const float xwf = 1. - xwc; + + const float oy = y * lambda + v - hVout + 0.5; + const int yf = static_cast(floor(oy)); + const int yc = static_cast(ceil(oy)); + const float ywc = oy - yf; + const float ywf = 1. - ywc; + + const float ou = (u + 0.5) / lambda - 0.5; + const int uf = static_cast(floor(ou)); + const int uc = static_cast(ceil(ou)); + const float uwc = ou - uf; + const float uwf = 1. - uwc; + + const float ov = (v + 0.5) / lambda - 0.5; + const int vf = static_cast(floor(ov)); + const int vc = static_cast(ceil(ov)); + const float vwc = ov - vf; + const float vwf = 1. - vwc; + + const T grad = top_diff[index]; + + add_pixel_val( + bottom_diff, + ywf * xwf * vwf * uwf * grad, + idx, + Hin, + Win, + yf, + xf, + Vin, + Uin, + vf, + uf); + add_pixel_val( + bottom_diff, + ywf * xwf * vwf * uwc * grad, + idx, + Hin, + Win, + yf, + xf, + Vin, + Uin, + vf, + uc); + add_pixel_val( + bottom_diff, + ywf * xwf * vwc * uwf * grad, + idx, + Hin, + Win, + yf, + xf, + Vin, + Uin, + vc, + uf); + add_pixel_val( + bottom_diff, + ywf * xwf * vwc * uwc * grad, + idx, + Hin, + Win, + yf, + xf, + Vin, + Uin, + vc, + uc); + add_pixel_val( + bottom_diff, + ywf * xwc * vwf * uwf * grad, + idx, + Hin, + Win, + yf, + xc, + Vin, + Uin, + vf, + uf); + add_pixel_val( + bottom_diff, + ywf * xwc * vwf * uwc * grad, + idx, + Hin, + Win, + yf, + xc, + Vin, + Uin, + vf, + uc); + add_pixel_val( + bottom_diff, + ywf * xwc * vwc * uwf * grad, + idx, + Hin, + Win, + yf, + xc, + Vin, + Uin, + vc, + uf); + add_pixel_val( + bottom_diff, + ywf * xwc * vwc * uwc * grad, + idx, + Hin, + Win, + yf, + xc, + Vin, + Uin, + vc, + uc); + add_pixel_val( + bottom_diff, + ywc * xwf * vwf * uwf * grad, + idx, + Hin, + Win, + yc, + xf, + Vin, + Uin, + vf, + uf); + add_pixel_val( + bottom_diff, + ywc * xwf * vwf * uwc * grad, + idx, + Hin, + Win, + yc, + xf, + Vin, + Uin, + vf, + uc); + add_pixel_val( + bottom_diff, + ywc * xwf * vwc * uwf * grad, + idx, + Hin, + Win, + yc, + xf, + Vin, + Uin, + vc, + uf); + add_pixel_val( + bottom_diff, + ywc * xwf * vwc * uwc * grad, + idx, + Hin, + Win, + yc, + xf, + Vin, + Uin, + vc, + uc); + add_pixel_val( + bottom_diff, + ywc * xwc * vwf * uwf * grad, + idx, + Hin, + Win, + yc, + xc, + Vin, + Uin, + vf, + uf); + add_pixel_val( + bottom_diff, + ywc * xwc * vwf * uwc * grad, + idx, + Hin, + Win, + yc, + xc, + Vin, + Uin, + vf, + uc); + add_pixel_val( + bottom_diff, + ywc * xwc * vwc * uwf * grad, + idx, + Hin, + Win, + yc, + xc, + Vin, + Uin, + vc, + uf); + add_pixel_val( + bottom_diff, + ywc * xwc * vwc * uwc * grad, + idx, + Hin, + Win, + yc, + xc, + Vin, + Uin, + vc, + uc); + } +} + +namespace tensormask { + +at::Tensor SwapAlign2Nat_forward_cuda( + const at::Tensor& X, + const int lambda_val, + const float pad_val) { + AT_ASSERTM(X.device().is_cuda(), "input must be a CUDA tensor"); + AT_ASSERTM(X.ndimension() == 4, "input must be a 4D tensor"); + AT_ASSERTM(lambda_val >= 1, "lambda should be greater or equal to 1"); + const int N = X.size(0); + const int C = X.size(1); + const int Vin = static_cast(sqrt(static_cast(C))); + const int Uin = C / Vin; + AT_ASSERTM( + C == Vin * Uin && Vin == Uin, "#channels should be a square number"); + const int Vout = lambda_val * Vin; + const int Uout = lambda_val * Uin; + const int Hin = X.size(2); + const int Win = X.size(3); + const float lambda = static_cast(lambda_val); + const int Hout = static_cast(ceil(Hin / lambda)); + const int Wout = static_cast(ceil(Win / lambda)); + const float hVout = Vout / 2.; + const float hUout = Uout / 2.; + + at::cuda::CUDAGuard device_guard(X.device()); + + at::Tensor Y = at::empty({N, Vout * Uout, Hout, Wout}, X.options()); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + dim3 grid(std::min(at::cuda::ATenCeilDiv(Y.numel(), 512L), 4096L)); + dim3 block(512); + + if (Y.numel() == 0) { + AT_CUDA_CHECK(cudaGetLastError()); + return Y; + } + + auto X_ = X.contiguous(); + AT_DISPATCH_FLOATING_TYPES(X.scalar_type(), "SwapAlign2Nat_forward", [&] { + SwapAlign2NatForwardFeat<<>>( + Y.numel(), + X_.data_ptr(), + Vout, + Uout, + hVout, + hUout, + Vin, + Uin, + lambda, + Hin, + Win, + Hout, + Wout, + pad_val, + Y.data_ptr()); + }); + cudaDeviceSynchronize(); + AT_CUDA_CHECK(cudaGetLastError()); + return Y; +} + +at::Tensor SwapAlign2Nat_backward_cuda( + const at::Tensor& gY, + const int lambda_val, + const int batch_size, + const int channel, + const int height, + const int width) { + AT_ASSERTM(gY.device().is_cuda(), "input gradient must be a CUDA tensor"); + AT_ASSERTM(gY.ndimension() == 4, "input gradient must be a 4D tensor"); + AT_ASSERTM(lambda_val >= 1, "lambda should be greater or equal to 1"); + const int Vin = static_cast(sqrt(static_cast(channel))); + const int Uin = channel / Vin; + const int Vout = lambda_val * Vin; + const int Uout = lambda_val * Uin; + const float hVout = Vout / 2.; + const float hUout = Uout / 2.; + const int Hout = gY.size(2); + const int Wout = gY.size(3); + + at::cuda::CUDAGuard device_guard(gY.device()); + + at::Tensor gX = at::zeros({batch_size, channel, height, width}, gY.options()); + + cudaStream_t stream = at::cuda::getCurrentCUDAStream(); + + dim3 grid(std::min(at::cuda::ATenCeilDiv(gY.numel(), 512L), 4096L)); + dim3 block(512); + + // handle possibly empty gradients + if (gY.numel() == 0) { + AT_CUDA_CHECK(cudaGetLastError()); + return gX; + } + + auto gY_ = gY.contiguous(); + AT_DISPATCH_FLOATING_TYPES(gY.scalar_type(), "SwapAlign2Nat_backward", [&] { + SwapAlign2NatBackwardFeat<<>>( + gY.numel(), + gY_.data_ptr(), + Vout, + Uout, + hVout, + hUout, + Vin, + Uin, + static_cast(lambda_val), + height, + width, + Hout, + Wout, + gX.data_ptr()); + }); + AT_CUDA_CHECK(cudaGetLastError()); + return gX; +} + +} // namespace tensormask diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/vision.cpp b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/vision.cpp new file mode 100644 index 0000000..ad8e472 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/csrc/vision.cpp @@ -0,0 +1,19 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +#include +#include "SwapAlign2Nat/SwapAlign2Nat.h" + +namespace tensormask { + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def( + "swap_align2nat_forward", + &SwapAlign2Nat_forward, + "SwapAlign2Nat_forward"); + m.def( + "swap_align2nat_backward", + &SwapAlign2Nat_backward, + "SwapAlign2Nat_backward"); +} + +} // namespace tensormask diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/swap_align2nat.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/swap_align2nat.py new file mode 100644 index 0000000..a72c98a --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tensormask/layers/swap_align2nat.py @@ -0,0 +1,61 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from torch import nn +from torch.autograd import Function +from torch.autograd.function import once_differentiable + +from tensormask import _C + + +class _SwapAlign2Nat(Function): + @staticmethod + def forward(ctx, X, lambda_val, pad_val): + ctx.lambda_val = lambda_val + ctx.input_shape = X.size() + + Y = _C.swap_align2nat_forward(X, lambda_val, pad_val) + return Y + + @staticmethod + @once_differentiable + def backward(ctx, gY): + lambda_val = ctx.lambda_val + bs, ch, h, w = ctx.input_shape + + gX = _C.swap_align2nat_backward(gY, lambda_val, bs, ch, h, w) + + return gX, None, None + + +swap_align2nat = _SwapAlign2Nat.apply + + +class SwapAlign2Nat(nn.Module): + """ + The op `SwapAlign2Nat` described in https://arxiv.org/abs/1903.12174. + Given an input tensor that predicts masks of shape (N, C=VxU, H, W), + apply the op, it will return masks of shape (N, V'xU', H', W') where + the unit lengths of (V, U) and (H, W) are swapped, and the mask representation + is transformed from aligned to natural. + Args: + lambda_val (int): the relative unit length ratio between (V, U) and (H, W), + as we always have larger unit lengths for (V, U) than (H, W), + lambda_val is always >= 1. + pad_val (float): padding value for the values falling outside of the input + tensor, default set to -6 as sigmoid(-6) is ~0, indicating + that is no masks outside of the tensor. + """ + + def __init__(self, lambda_val, pad_val=-6.0): + super(SwapAlign2Nat, self).__init__() + self.lambda_val = lambda_val + self.pad_val = pad_val + + def forward(self, X): + return swap_align2nat(X, self.lambda_val, self.pad_val) + + def __repr__(self): + tmpstr = self.__class__.__name__ + "(" + tmpstr += "lambda_val=" + str(self.lambda_val) + tmpstr += ", pad_val=" + str(self.pad_val) + tmpstr += ")" + return tmpstr diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/__init__.py new file mode 100644 index 0000000..168f997 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/test_swap_align2nat.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/test_swap_align2nat.py new file mode 100644 index 0000000..b3d018c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/tests/test_swap_align2nat.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import unittest +import torch +from torch.autograd import gradcheck + +from tensormask.layers.swap_align2nat import SwapAlign2Nat + + +class SwapAlign2NatTest(unittest.TestCase): + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_swap_align2nat_gradcheck_cuda(self): + dtype = torch.float64 + device = torch.device("cuda") + m = SwapAlign2Nat(2).to(dtype=dtype, device=device) + x = torch.rand(2, 4, 10, 10, dtype=dtype, device=device, requires_grad=True) + + self.assertTrue(gradcheck(m, x), "gradcheck failed for SwapAlign2Nat CUDA") + + def _swap_align2nat(self, tensor, lambda_val): + """ + The basic setup for testing Swap_Align + """ + op = SwapAlign2Nat(lambda_val, pad_val=0.0) + input = torch.from_numpy(tensor[None, :, :, :].astype("float32")) + output = op.forward(input.cuda()).cpu().numpy() + return output[0] + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/train_net.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/train_net.py new file mode 100644 index 0000000..b898fc7 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TensorMask/train_net.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +""" +TensorMask Training Script. + +This script is a simplified version of the training script in detectron2/tools. +""" + +import os + +import detectron2.utils.comm as comm +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, launch +from detectron2.evaluation import COCOEvaluator, verify_results + +from tensormask import add_tensormask_config + + +class Trainer(DefaultTrainer): + @classmethod + def build_evaluator(cls, cfg, dataset_name, output_folder=None): + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + return COCOEvaluator(dataset_name, cfg, True, output_folder) + + +def setup(args): + """ + Create configs and perform basic setups. + """ + cfg = get_cfg() + add_tensormask_config(cfg) + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup(cfg, args) + return cfg + + +def main(args): + cfg = setup(args) + + if args.eval_only: + model = Trainer.build_model(cfg) + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + res = Trainer.test(cfg, model) + if comm.is_main_process(): + verify_results(cfg, res) + return res + + trainer = Trainer(cfg) + trainer.resume_or_load(resume=args.resume) + return trainer.train() + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/README.md b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/README.md new file mode 100644 index 0000000..4b7a901 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/README.md @@ -0,0 +1,60 @@ + +# TridentNet in Detectron2 +**Scale-Aware Trident Networks for Object Detection** + +Yanghao Li\*, Yuntao Chen\*, Naiyan Wang, Zhaoxiang Zhang + +[[`TridentNet`](https://github.com/TuSimple/simpledet/tree/master/models/tridentnet)] [[`arXiv`](https://arxiv.org/abs/1901.01892)] [[`BibTeX`](#CitingTridentNet)] + +
    + +
    + +In this repository, we implement TridentNet-Fast in Detectron2. +Trident Network (TridentNet) aims to generate scale-specific feature maps with a uniform representational power. We construct a parallel multi-branch architecture in which each branch shares the same transformation parameters but with different receptive fields. TridentNet-Fast is a fast approximation version of TridentNet that could achieve significant improvements without any additional parameters and computational cost. + +## Training + +To train a model, run +```bash +python /path/to/detectron2/projects/TridentNet/train_net.py --config-file +``` + +For example, to launch end-to-end TridentNet training with ResNet-50 backbone on 8 GPUs, +one should execute: +```bash +python /path/to/detectron2/projects/TridentNet/train_net.py --config-file configs/tridentnet_fast_R_50_C4_1x.yaml --num-gpus 8 +``` + +## Evaluation + +Model evaluation can be done similarly: +```bash +python /path/to/detectron2/projects/TridentNet/train_net.py --config-file configs/tridentnet_fast_R_50_C4_1x.yaml --eval-only MODEL.WEIGHTS model.pth +``` + +## Results on MS-COCO in Detectron2 + +|Model|Backbone|Head|lr sched|AP|AP50|AP75|APs|APm|APl|download| +|-----|--------|----|--------|--|----|----|---|---|---|--------| +|Faster|R50-C4|C5-512ROI|1X|35.7|56.1|38.0|19.2|40.9|48.7|model \| metrics| +|TridentFast|R50-C4|C5-128ROI|1X|38.0|58.1|40.8|19.5|42.2|54.6|model \| metrics| +|Faster|R50-C4|C5-512ROI|3X|38.4|58.7|41.3|20.7|42.7|53.1|model \| metrics| +|TridentFast|R50-C4|C5-128ROI|3X|40.6|60.8|43.6|23.4|44.7|57.1|model \| metrics| +|Faster|R101-C4|C5-512ROI|3X|41.1|61.4|44.0|22.2|45.5|55.9|model \| metrics| +|TridentFast|R101-C4|C5-128ROI|3X|43.6|63.4|47.0|24.3|47.8|60.0|model \| metrics| + + +## Citing TridentNet + +If you use TridentNet, please use the following BibTeX entry. + +``` +@InProceedings{li2019scale, + title={Scale-Aware Trident Networks for Object Detection}, + author={Li, Yanghao and Chen, Yuntao and Wang, Naiyan and Zhang, Zhaoxiang}, + journal={The International Conference on Computer Vision (ICCV)}, + year={2019} +} +``` + diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/Base-TridentNet-Fast-C4.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/Base-TridentNet-Fast-C4.yaml new file mode 100644 index 0000000..8c3d807 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/Base-TridentNet-Fast-C4.yaml @@ -0,0 +1,29 @@ +MODEL: + META_ARCHITECTURE: "GeneralizedRCNN" + BACKBONE: + NAME: "build_trident_resnet_backbone" + ROI_HEADS: + NAME: "TridentRes5ROIHeads" + POSITIVE_FRACTION: 0.5 + BATCH_SIZE_PER_IMAGE: 128 + PROPOSAL_APPEND_GT: False + PROPOSAL_GENERATOR: + NAME: "TridentRPN" + RPN: + POST_NMS_TOPK_TRAIN: 500 + TRIDENT: + NUM_BRANCH: 3 + BRANCH_DILATIONS: [1, 2, 3] + TEST_BRANCH_IDX: 1 + TRIDENT_STAGE: "res4" +DATASETS: + TRAIN: ("coco_2017_train",) + TEST: ("coco_2017_val",) +SOLVER: + IMS_PER_BATCH: 16 + BASE_LR: 0.02 + STEPS: (60000, 80000) + MAX_ITER: 90000 +INPUT: + MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) +VERSION: 2 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_101_C4_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_101_C4_3x.yaml new file mode 100644 index 0000000..bc83c2f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_101_C4_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "Base-TridentNet-Fast-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-101.pkl" + MASK_ON: False + RESNETS: + DEPTH: 101 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_1x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_1x.yaml new file mode 100644 index 0000000..fda2cb6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_1x.yaml @@ -0,0 +1,6 @@ +_BASE_: "Base-TridentNet-Fast-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_3x.yaml b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_3x.yaml new file mode 100644 index 0000000..ebf89d0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/configs/tridentnet_fast_R_50_C4_3x.yaml @@ -0,0 +1,9 @@ +_BASE_: "Base-TridentNet-Fast-C4.yaml" +MODEL: + WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" + MASK_ON: False + RESNETS: + DEPTH: 50 +SOLVER: + STEPS: (210000, 250000) + MAX_ITER: 270000 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/train_net.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/train_net.py new file mode 100644 index 0000000..eac2ec5 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/train_net.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +""" +TridentNet Training Script. + +This script is a simplified version of the training script in detectron2/tools. +""" + +import os + +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, launch +from detectron2.evaluation import COCOEvaluator + +from tridentnet import add_tridentnet_config + + +class Trainer(DefaultTrainer): + @classmethod + def build_evaluator(cls, cfg, dataset_name, output_folder=None): + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + return COCOEvaluator(dataset_name, cfg, True, output_folder) + + +def setup(args): + """ + Create configs and perform basic setups. + """ + cfg = get_cfg() + add_tridentnet_config(cfg) + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup(cfg, args) + return cfg + + +def main(args): + cfg = setup(args) + + if args.eval_only: + model = Trainer.build_model(cfg) + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + res = Trainer.test(cfg, model) + return res + + trainer = Trainer(cfg) + trainer.resume_or_load(resume=args.resume) + return trainer.train() + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/__init__.py new file mode 100644 index 0000000..2fcdeb4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from .config import add_tridentnet_config +from .trident_backbone import ( + TridentBottleneckBlock, + build_trident_resnet_backbone, + make_trident_stage, +) +from .trident_rpn import TridentRPN +from .trident_rcnn import TridentRes5ROIHeads, TridentStandardROIHeads diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/config.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/config.py new file mode 100644 index 0000000..f33f473 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/config.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +from detectron2.config import CfgNode as CN + + +def add_tridentnet_config(cfg): + """ + Add config for tridentnet. + """ + _C = cfg + + _C.MODEL.TRIDENT = CN() + + # Number of branches for TridentNet. + _C.MODEL.TRIDENT.NUM_BRANCH = 3 + # Specify the dilations for each branch. + _C.MODEL.TRIDENT.BRANCH_DILATIONS = [1, 2, 3] + # Specify the stage for applying trident blocks. Default stage is Res4 according to the + # TridentNet paper. + _C.MODEL.TRIDENT.TRIDENT_STAGE = "res4" + # Specify the test branch index TridentNet Fast inference: + # - use -1 to aggregate results of all branches during inference. + # - otherwise, only using specified branch for fast inference. Recommended setting is + # to use the middle branch. + _C.MODEL.TRIDENT.TEST_BRANCH_IDX = 1 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_backbone.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_backbone.py new file mode 100644 index 0000000..232dfaf --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_backbone.py @@ -0,0 +1,223 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import fvcore.nn.weight_init as weight_init +import torch +import torch.nn.functional as F + +from detectron2.layers import Conv2d, FrozenBatchNorm2d, get_norm +from detectron2.modeling import BACKBONE_REGISTRY, ResNet, ResNetBlockBase, make_stage +from detectron2.modeling.backbone.resnet import BasicStem, BottleneckBlock, DeformBottleneckBlock + +from .trident_conv import TridentConv + +__all__ = ["TridentBottleneckBlock", "make_trident_stage", "build_trident_resnet_backbone"] + + +class TridentBottleneckBlock(ResNetBlockBase): + def __init__( + self, + in_channels, + out_channels, + *, + bottleneck_channels, + stride=1, + num_groups=1, + norm="BN", + stride_in_1x1=False, + num_branch=3, + dilations=(1, 2, 3), + concat_output=False, + test_branch_idx=-1, + ): + """ + Args: + num_branch (int): the number of branches in TridentNet. + dilations (tuple): the dilations of multiple branches in TridentNet. + concat_output (bool): if concatenate outputs of multiple branches in TridentNet. + Use 'True' for the last trident block. + """ + super().__init__(in_channels, out_channels, stride) + + assert num_branch == len(dilations) + + self.num_branch = num_branch + self.concat_output = concat_output + self.test_branch_idx = test_branch_idx + + if in_channels != out_channels: + self.shortcut = Conv2d( + in_channels, + out_channels, + kernel_size=1, + stride=stride, + bias=False, + norm=get_norm(norm, out_channels), + ) + else: + self.shortcut = None + + stride_1x1, stride_3x3 = (stride, 1) if stride_in_1x1 else (1, stride) + + self.conv1 = Conv2d( + in_channels, + bottleneck_channels, + kernel_size=1, + stride=stride_1x1, + bias=False, + norm=get_norm(norm, bottleneck_channels), + ) + + self.conv2 = TridentConv( + bottleneck_channels, + bottleneck_channels, + kernel_size=3, + stride=stride_3x3, + paddings=dilations, + bias=False, + groups=num_groups, + dilations=dilations, + num_branch=num_branch, + test_branch_idx=test_branch_idx, + norm=get_norm(norm, bottleneck_channels), + ) + + self.conv3 = Conv2d( + bottleneck_channels, + out_channels, + kernel_size=1, + bias=False, + norm=get_norm(norm, out_channels), + ) + + for layer in [self.conv1, self.conv2, self.conv3, self.shortcut]: + if layer is not None: # shortcut can be None + weight_init.c2_msra_fill(layer) + + def forward(self, x): + num_branch = self.num_branch if self.training or self.test_branch_idx == -1 else 1 + if not isinstance(x, list): + x = [x] * num_branch + out = [self.conv1(b) for b in x] + out = [F.relu_(b) for b in out] + + out = self.conv2(out) + out = [F.relu_(b) for b in out] + + out = [self.conv3(b) for b in out] + + if self.shortcut is not None: + shortcut = [self.shortcut(b) for b in x] + else: + shortcut = x + + out = [out_b + shortcut_b for out_b, shortcut_b in zip(out, shortcut)] + out = [F.relu_(b) for b in out] + if self.concat_output: + out = torch.cat(out) + return out + + +def make_trident_stage(block_class, num_blocks, first_stride, **kwargs): + """ + Create a resnet stage by creating many blocks for TridentNet. + """ + blocks = [] + for i in range(num_blocks - 1): + blocks.append(block_class(stride=first_stride if i == 0 else 1, **kwargs)) + kwargs["in_channels"] = kwargs["out_channels"] + blocks.append(block_class(stride=1, concat_output=True, **kwargs)) + return blocks + + +@BACKBONE_REGISTRY.register() +def build_trident_resnet_backbone(cfg, input_shape): + """ + Create a ResNet instance from config for TridentNet. + + Returns: + ResNet: a :class:`ResNet` instance. + """ + # need registration of new blocks/stems? + norm = cfg.MODEL.RESNETS.NORM + stem = BasicStem( + in_channels=input_shape.channels, + out_channels=cfg.MODEL.RESNETS.STEM_OUT_CHANNELS, + norm=norm, + ) + freeze_at = cfg.MODEL.BACKBONE.FREEZE_AT + + if freeze_at >= 1: + for p in stem.parameters(): + p.requires_grad = False + stem = FrozenBatchNorm2d.convert_frozen_batchnorm(stem) + + # fmt: off + out_features = cfg.MODEL.RESNETS.OUT_FEATURES + depth = cfg.MODEL.RESNETS.DEPTH + num_groups = cfg.MODEL.RESNETS.NUM_GROUPS + width_per_group = cfg.MODEL.RESNETS.WIDTH_PER_GROUP + bottleneck_channels = num_groups * width_per_group + in_channels = cfg.MODEL.RESNETS.STEM_OUT_CHANNELS + out_channels = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS + stride_in_1x1 = cfg.MODEL.RESNETS.STRIDE_IN_1X1 + res5_dilation = cfg.MODEL.RESNETS.RES5_DILATION + deform_on_per_stage = cfg.MODEL.RESNETS.DEFORM_ON_PER_STAGE + deform_modulated = cfg.MODEL.RESNETS.DEFORM_MODULATED + deform_num_groups = cfg.MODEL.RESNETS.DEFORM_NUM_GROUPS + num_branch = cfg.MODEL.TRIDENT.NUM_BRANCH + branch_dilations = cfg.MODEL.TRIDENT.BRANCH_DILATIONS + trident_stage = cfg.MODEL.TRIDENT.TRIDENT_STAGE + test_branch_idx = cfg.MODEL.TRIDENT.TEST_BRANCH_IDX + # fmt: on + assert res5_dilation in {1, 2}, "res5_dilation cannot be {}.".format(res5_dilation) + + num_blocks_per_stage = {50: [3, 4, 6, 3], 101: [3, 4, 23, 3], 152: [3, 8, 36, 3]}[depth] + + stages = [] + + res_stage_idx = {"res2": 2, "res3": 3, "res4": 4, "res5": 5} + out_stage_idx = [res_stage_idx[f] for f in out_features] + trident_stage_idx = res_stage_idx[trident_stage] + max_stage_idx = max(out_stage_idx) + for idx, stage_idx in enumerate(range(2, max_stage_idx + 1)): + dilation = res5_dilation if stage_idx == 5 else 1 + first_stride = 1 if idx == 0 or (stage_idx == 5 and dilation == 2) else 2 + stage_kargs = { + "num_blocks": num_blocks_per_stage[idx], + "first_stride": first_stride, + "in_channels": in_channels, + "bottleneck_channels": bottleneck_channels, + "out_channels": out_channels, + "num_groups": num_groups, + "norm": norm, + "stride_in_1x1": stride_in_1x1, + "dilation": dilation, + } + if stage_idx == trident_stage_idx: + assert not deform_on_per_stage[ + idx + ], "Not support deformable conv in Trident blocks yet." + stage_kargs["block_class"] = TridentBottleneckBlock + stage_kargs["num_branch"] = num_branch + stage_kargs["dilations"] = branch_dilations + stage_kargs["test_branch_idx"] = test_branch_idx + stage_kargs.pop("dilation") + elif deform_on_per_stage[idx]: + stage_kargs["block_class"] = DeformBottleneckBlock + stage_kargs["deform_modulated"] = deform_modulated + stage_kargs["deform_num_groups"] = deform_num_groups + else: + stage_kargs["block_class"] = BottleneckBlock + blocks = ( + make_trident_stage(**stage_kargs) + if stage_idx == trident_stage_idx + else make_stage(**stage_kargs) + ) + in_channels = out_channels + out_channels *= 2 + bottleneck_channels *= 2 + + if freeze_at >= stage_idx: + for block in blocks: + block.freeze() + stages.append(blocks) + return ResNet(stem, stages, out_features=out_features) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_conv.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_conv.py new file mode 100644 index 0000000..7e2d525 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_conv.py @@ -0,0 +1,107 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import torch +from torch import nn +from torch.nn import functional as F +from torch.nn.modules.utils import _pair + +from detectron2.layers.wrappers import _NewEmptyTensorOp + + +class TridentConv(nn.Module): + def __init__( + self, + in_channels, + out_channels, + kernel_size, + stride=1, + paddings=0, + dilations=1, + groups=1, + num_branch=1, + test_branch_idx=-1, + bias=False, + norm=None, + activation=None, + ): + super(TridentConv, self).__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = _pair(kernel_size) + self.num_branch = num_branch + self.stride = _pair(stride) + self.groups = groups + self.with_bias = bias + if isinstance(paddings, int): + paddings = [paddings] * self.num_branch + if isinstance(dilations, int): + dilations = [dilations] * self.num_branch + self.paddings = [_pair(padding) for padding in paddings] + self.dilations = [_pair(dilation) for dilation in dilations] + self.test_branch_idx = test_branch_idx + self.norm = norm + self.activation = activation + + assert len({self.num_branch, len(self.paddings), len(self.dilations)}) == 1 + + self.weight = nn.Parameter( + torch.Tensor(out_channels, in_channels // groups, *self.kernel_size) + ) + if bias: + self.bias = nn.Parameter(torch.Tensor(out_channels)) + else: + self.bias = None + + nn.init.kaiming_uniform_(self.weight, nonlinearity="relu") + if self.bias is not None: + nn.init.constant_(self.bias, 0) + + def forward(self, inputs): + num_branch = self.num_branch if self.training or self.test_branch_idx == -1 else 1 + assert len(inputs) == num_branch + + if inputs[0].numel() == 0: + output_shape = [ + (i + 2 * p - (di * (k - 1) + 1)) // s + 1 + for i, p, di, k, s in zip( + inputs[0].shape[-2:], self.padding, self.dilation, self.kernel_size, self.stride + ) + ] + output_shape = [input[0].shape[0], self.weight.shape[0]] + output_shape + return [_NewEmptyTensorOp.apply(input, output_shape) for input in inputs] + + if self.training or self.test_branch_idx == -1: + outputs = [ + F.conv2d(input, self.weight, self.bias, self.stride, padding, dilation, self.groups) + for input, dilation, padding in zip(inputs, self.dilations, self.paddings) + ] + else: + outputs = [ + F.conv2d( + inputs[0], + self.weight, + self.bias, + self.stride, + self.paddings[self.test_branch_idx], + self.dilations[self.test_branch_idx], + self.groups, + ) + ] + + if self.norm is not None: + outputs = [self.norm(x) for x in outputs] + if self.activation is not None: + outputs = [self.activation(x) for x in outputs] + return outputs + + def extra_repr(self): + tmpstr = "in_channels=" + str(self.in_channels) + tmpstr += ", out_channels=" + str(self.out_channels) + tmpstr += ", kernel_size=" + str(self.kernel_size) + tmpstr += ", num_branch=" + str(self.num_branch) + tmpstr += ", test_branch_idx=" + str(self.test_branch_idx) + tmpstr += ", stride=" + str(self.stride) + tmpstr += ", paddings=" + str(self.paddings) + tmpstr += ", dilations=" + str(self.dilations) + tmpstr += ", groups=" + str(self.groups) + tmpstr += ", bias=" + str(self.with_bias) + return tmpstr diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rcnn.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rcnn.py new file mode 100644 index 0000000..65deb90 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rcnn.py @@ -0,0 +1,116 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from detectron2.layers import batched_nms +from detectron2.modeling import ROI_HEADS_REGISTRY, StandardROIHeads +from detectron2.modeling.roi_heads.roi_heads import Res5ROIHeads +from detectron2.structures import Instances + + +def merge_branch_instances(instances, num_branch, nms_thresh, topk_per_image): + """ + Merge detection results from different branches of TridentNet. + Return detection results by applying non-maximum suppression (NMS) on bounding boxes + and keep the unsuppressed boxes and other instances (e.g mask) if any. + + Args: + instances (list[Instances]): A list of N * num_branch instances that store detection + results. Contain N images and each image has num_branch instances. + num_branch (int): Number of branches used for merging detection results for each image. + nms_thresh (float): The threshold to use for box non-maximum suppression. Value in [0, 1]. + topk_per_image (int): The number of top scoring detections to return. Set < 0 to return + all detections. + + Returns: + results: (list[Instances]): A list of N instances, one for each image in the batch, + that stores the topk most confidence detections after merging results from multiple + branches. + """ + if num_branch == 1: + return instances + + batch_size = len(instances) // num_branch + results = [] + for i in range(batch_size): + instance = Instances.cat([instances[i + batch_size * j] for j in range(num_branch)]) + + # Apply per-class NMS + keep = batched_nms( + instance.pred_boxes.tensor, instance.scores, instance.pred_classes, nms_thresh + ) + keep = keep[:topk_per_image] + result = instance[keep] + + results.append(result) + + return results + + +@ROI_HEADS_REGISTRY.register() +class TridentRes5ROIHeads(Res5ROIHeads): + """ + The TridentNet ROIHeads in a typical "C4" R-CNN model. + See :class:`Res5ROIHeads`. + """ + + def __init__(self, cfg, input_shape): + super().__init__(cfg, input_shape) + + self.num_branch = cfg.MODEL.TRIDENT.NUM_BRANCH + self.trident_fast = cfg.MODEL.TRIDENT.TEST_BRANCH_IDX != -1 + + def forward(self, images, features, proposals, targets=None): + """ + See :class:`Res5ROIHeads.forward`. + """ + num_branch = self.num_branch if self.training or not self.trident_fast else 1 + all_targets = targets * num_branch if targets is not None else None + pred_instances, losses = super().forward(images, features, proposals, all_targets) + del images, all_targets, targets + + if self.training: + return pred_instances, losses + else: + pred_instances = merge_branch_instances( + pred_instances, + num_branch, + self.box_predictor.test_nms_thresh, + self.box_predictor.test_topk_per_image, + ) + + return pred_instances, {} + + +@ROI_HEADS_REGISTRY.register() +class TridentStandardROIHeads(StandardROIHeads): + """ + The `StandardROIHeads` for TridentNet. + See :class:`StandardROIHeads`. + """ + + def __init__(self, cfg, input_shape): + super(TridentStandardROIHeads, self).__init__(cfg, input_shape) + + self.num_branch = cfg.MODEL.TRIDENT.NUM_BRANCH + self.trident_fast = cfg.MODEL.TRIDENT.TEST_BRANCH_IDX != -1 + + def forward(self, images, features, proposals, targets=None): + """ + See :class:`Res5ROIHeads.forward`. + """ + # Use 1 branch if using trident_fast during inference. + num_branch = self.num_branch if self.training or not self.trident_fast else 1 + # Duplicate targets for all branches in TridentNet. + all_targets = targets * num_branch if targets is not None else None + pred_instances, losses = super().forward(images, features, proposals, all_targets) + del images, all_targets, targets + + if self.training: + return pred_instances, losses + else: + pred_instances = merge_branch_instances( + pred_instances, + num_branch, + self.box_predictor.test_nms_thresh, + self.box_predictor.test_topk_per_image, + ) + + return pred_instances, {} diff --git a/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rpn.py b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rpn.py new file mode 100644 index 0000000..c30137f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/projects/TridentNet/tridentnet/trident_rpn.py @@ -0,0 +1,32 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import torch + +from detectron2.modeling import PROPOSAL_GENERATOR_REGISTRY +from detectron2.modeling.proposal_generator.rpn import RPN +from detectron2.structures import ImageList + + +@PROPOSAL_GENERATOR_REGISTRY.register() +class TridentRPN(RPN): + """ + Trident RPN subnetwork. + """ + + def __init__(self, cfg, input_shape): + super(TridentRPN, self).__init__(cfg, input_shape) + + self.num_branch = cfg.MODEL.TRIDENT.NUM_BRANCH + self.trident_fast = cfg.MODEL.TRIDENT.TEST_BRANCH_IDX != -1 + + def forward(self, images, features, gt_instances=None): + """ + See :class:`RPN.forward`. + """ + num_branch = self.num_branch if self.training or not self.trident_fast else 1 + # Duplicate images and gt_instances for all branches in TridentNet. + all_images = ImageList( + torch.cat([images.tensor] * num_branch), images.image_sizes * num_branch + ) + all_gt_instances = gt_instances * num_branch if gt_instances is not None else None + + return super(TridentRPN, self).forward(all_images, features, all_gt_instances) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/setup.cfg b/preprocess/humanparsing/mhp_extension/detectron2/setup.cfg new file mode 100644 index 0000000..b09bba9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/setup.cfg @@ -0,0 +1,26 @@ +[isort] +line_length=100 +multi_line_output=3 +include_trailing_comma=True +known_standard_library=numpy,setuptools,mock +skip=./datasets,docs +skip_glob=*/__init__.py +known_myself=detectron2 +known_third_party=fvcore,matplotlib,cv2,torch,torchvision,PIL,pycocotools,yacs,termcolor,cityscapesscripts,tabulate,tqdm,scipy,lvis,psutil,pkg_resources,caffe2,onnx +no_lines_before=STDLIB,THIRDPARTY +sections=FUTURE,STDLIB,THIRDPARTY,myself,FIRSTPARTY,LOCALFOLDER +default_section=FIRSTPARTY + +[mypy] +python_version=3.6 +ignore_missing_imports = True +warn_unused_configs = True +disallow_untyped_defs = True +check_untyped_defs = True +warn_unused_ignores = True +warn_redundant_casts = True +show_column_numbers = True +follow_imports = silent +allow_redefinition = True +; Require all functions to be annotated +disallow_incomplete_defs = True diff --git a/preprocess/humanparsing/mhp_extension/detectron2/setup.py b/preprocess/humanparsing/mhp_extension/detectron2/setup.py new file mode 100644 index 0000000..a863fab --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/setup.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import glob +import os +import shutil +from os import path +from setuptools import find_packages, setup +from typing import List +import torch +from torch.utils.cpp_extension import CUDA_HOME, CppExtension, CUDAExtension + +torch_ver = [int(x) for x in torch.__version__.split(".")[:2]] +assert torch_ver >= [1, 4], "Requires PyTorch >= 1.4" + + +def get_version(): + init_py_path = path.join(path.abspath(path.dirname(__file__)), "detectron2", "__init__.py") + init_py = open(init_py_path, "r").readlines() + version_line = [l.strip() for l in init_py if l.startswith("__version__")][0] + version = version_line.split("=")[-1].strip().strip("'\"") + + # The following is used to build release packages. + # Users should never use it. + suffix = os.getenv("D2_VERSION_SUFFIX", "") + version = version + suffix + if os.getenv("BUILD_NIGHTLY", "0") == "1": + from datetime import datetime + + date_str = datetime.today().strftime("%y%m%d") + version = version + ".dev" + date_str + + new_init_py = [l for l in init_py if not l.startswith("__version__")] + new_init_py.append('__version__ = "{}"\n'.format(version)) + with open(init_py_path, "w") as f: + f.write("".join(new_init_py)) + return version + + +def get_extensions(): + this_dir = path.dirname(path.abspath(__file__)) + extensions_dir = path.join(this_dir, "detectron2", "layers", "csrc") + + main_source = path.join(extensions_dir, "vision.cpp") + sources = glob.glob(path.join(extensions_dir, "**", "*.cpp")) + source_cuda = glob.glob(path.join(extensions_dir, "**", "*.cu")) + glob.glob( + path.join(extensions_dir, "*.cu") + ) + + sources = [main_source] + sources + extension = CppExtension + + extra_compile_args = {"cxx": []} + define_macros = [] + + if ( + torch.cuda.is_available() and CUDA_HOME is not None and os.path.isdir(CUDA_HOME) + ) or os.getenv("FORCE_CUDA", "0") == "1": + extension = CUDAExtension + sources += source_cuda + define_macros += [("WITH_CUDA", None)] + extra_compile_args["nvcc"] = [ + "-DCUDA_HAS_FP16=1", + "-D__CUDA_NO_HALF_OPERATORS__", + "-D__CUDA_NO_HALF_CONVERSIONS__", + "-D__CUDA_NO_HALF2_OPERATORS__", + ] + + # It's better if pytorch can do this by default .. + CC = os.environ.get("CC", None) + if CC is not None: + extra_compile_args["nvcc"].append("-ccbin={}".format(CC)) + + include_dirs = [extensions_dir] + + ext_modules = [ + extension( + "detectron2._C", + sources, + include_dirs=include_dirs, + define_macros=define_macros, + extra_compile_args=extra_compile_args, + ) + ] + + return ext_modules + + +def get_model_zoo_configs() -> List[str]: + """ + Return a list of configs to include in package for model zoo. Copy over these configs inside + detectron2/model_zoo. + """ + + # Use absolute paths while symlinking. + source_configs_dir = path.join(path.dirname(path.realpath(__file__)), "configs") + destination = path.join( + path.dirname(path.realpath(__file__)), "detectron2", "model_zoo", "configs" + ) + # Symlink the config directory inside package to have a cleaner pip install. + + # Remove stale symlink/directory from a previous build. + if path.exists(source_configs_dir): + if path.islink(destination): + os.unlink(destination) + elif path.isdir(destination): + shutil.rmtree(destination) + + if not path.exists(destination): + try: + os.symlink(source_configs_dir, destination) + except OSError: + # Fall back to copying if symlink fails: ex. on Windows. + shutil.copytree(source_configs_dir, destination) + + config_paths = glob.glob("configs/**/*.yaml", recursive=True) + return config_paths + + +setup( + name="detectron2", + version=get_version(), + author="FAIR", + url="https://github.com/facebookresearch/detectron2", + description="Detectron2 is FAIR's next-generation research " + "platform for object detection and segmentation.", + packages=find_packages(exclude=("configs", "tests*")), + package_data={"detectron2.model_zoo": get_model_zoo_configs()}, + python_requires=">=3.6", + install_requires=[ + "termcolor>=1.1", + "Pillow", # you can also use pillow-simd for better performance + "yacs>=0.1.6", + "tabulate", + "cloudpickle", + "matplotlib", + "mock", + "tqdm>4.29.0", + "tensorboard", + "fvcore>=0.1.1", + "future", # used by caffe2 + "pydot", # used to save caffe2 SVGs + ], + extras_require={ + "all": ["shapely", "psutil"], + "dev": [ + "flake8==3.7.9", + "isort", + "black @ git+https://github.com/psf/black@673327449f86fce558adde153bb6cbe54bfebad2", + "flake8-bugbear", + "flake8-comprehensions", + ], + }, + ext_modules=get_extensions(), + cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension}, +) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/README.md b/preprocess/humanparsing/mhp_extension/detectron2/tests/README.md new file mode 100644 index 0000000..f560384 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/README.md @@ -0,0 +1,9 @@ +## Unit Tests + +To run the unittests, do: +``` +cd detectron2 +python -m unittest discover -v -s ./tests +``` + +There are also end-to-end inference & training tests, in [dev/run_*_tests.sh](../dev). diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/__init__.py new file mode 100644 index 0000000..168f997 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/__init__.py @@ -0,0 +1 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/data/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_coco.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_coco.py new file mode 100644 index 0000000..2cd807d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_coco.py @@ -0,0 +1,77 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import json +import numpy as np +import os +import tempfile +import unittest +import pycocotools + +from detectron2.data import DatasetCatalog, MetadataCatalog +from detectron2.data.datasets.coco import convert_to_coco_dict, load_coco_json +from detectron2.structures import BoxMode + + +def make_mask(): + """ + Makes a donut shaped binary mask. + """ + H = 100 + W = 100 + mask = np.zeros([H, W], dtype=np.uint8) + for x in range(W): + for y in range(H): + d = np.linalg.norm(np.array([W, H]) / 2 - np.array([x, y])) + if d > 10 and d < 20: + mask[y, x] = 1 + return mask + + +def make_dataset_dicts(mask): + """ + Returns a list of dicts that represents a single COCO data point for + object detection. The single instance given by `mask` is represented by + RLE. + """ + record = {} + record["file_name"] = "test" + record["image_id"] = 0 + record["height"] = mask.shape[0] + record["width"] = mask.shape[1] + + y, x = np.nonzero(mask) + segmentation = pycocotools.mask.encode(np.asarray(mask, order="F")) + min_x = np.min(x) + max_x = np.max(x) + min_y = np.min(y) + max_y = np.max(y) + obj = { + "bbox": [min_x, min_y, max_x, max_y], + "bbox_mode": BoxMode.XYXY_ABS, + "category_id": 0, + "iscrowd": 0, + "segmentation": segmentation, + } + record["annotations"] = [obj] + return [record] + + +class TestRLEToJson(unittest.TestCase): + def test(self): + # Make a dummy dataset. + mask = make_mask() + DatasetCatalog.register("test_dataset", lambda: make_dataset_dicts(mask)) + MetadataCatalog.get("test_dataset").set(thing_classes=["test_label"]) + + # Dump to json. + json_dict = convert_to_coco_dict("test_dataset") + with tempfile.TemporaryDirectory() as tmpdir: + json_file_name = os.path.join(tmpdir, "test.json") + with open(json_file_name, "w") as f: + json.dump(json_dict, f) + # Load from json. + dicts = load_coco_json(json_file_name, "") + + # Check the loaded mask matches the original. + anno = dicts[0]["annotations"][0] + loaded_mask = pycocotools.mask.decode(anno["segmentation"]) + self.assertTrue(np.array_equal(loaded_mask, mask)) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_detection_utils.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_detection_utils.py new file mode 100644 index 0000000..bdd94dd --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_detection_utils.py @@ -0,0 +1,116 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +import copy +import numpy as np +import unittest +import pycocotools.mask as mask_util + +from detectron2.data import detection_utils +from detectron2.data import transforms as T +from detectron2.structures import BitMasks, BoxMode + + +class TestTransformAnnotations(unittest.TestCase): + def test_transform_simple_annotation(self): + transforms = T.TransformList([T.HFlipTransform(400)]) + anno = { + "bbox": np.asarray([10, 10, 200, 300]), + "bbox_mode": BoxMode.XYXY_ABS, + "category_id": 3, + "segmentation": [[10, 10, 100, 100, 100, 10], [150, 150, 200, 150, 200, 200]], + } + + output = detection_utils.transform_instance_annotations(anno, transforms, (400, 400)) + self.assertTrue(np.allclose(output["bbox"], [200, 10, 390, 300])) + self.assertEqual(len(output["segmentation"]), len(anno["segmentation"])) + self.assertTrue(np.allclose(output["segmentation"][0], [390, 10, 300, 100, 300, 10])) + + detection_utils.annotations_to_instances([output, output], (400, 400)) + + def test_flip_keypoints(self): + transforms = T.TransformList([T.HFlipTransform(400)]) + anno = { + "bbox": np.asarray([10, 10, 200, 300]), + "bbox_mode": BoxMode.XYXY_ABS, + "keypoints": np.random.rand(17, 3) * 50 + 15, + } + + output = detection_utils.transform_instance_annotations( + copy.deepcopy(anno), + transforms, + (400, 400), + keypoint_hflip_indices=detection_utils.create_keypoint_hflip_indices( + ["keypoints_coco_2017_train"] + ), + ) + # The first keypoint is nose + self.assertTrue(np.allclose(output["keypoints"][0, 0], 400 - anno["keypoints"][0, 0])) + # The last 16 keypoints are 8 left-right pairs + self.assertTrue( + np.allclose( + output["keypoints"][1:, 0].reshape(-1, 2)[:, ::-1], + 400 - anno["keypoints"][1:, 0].reshape(-1, 2), + ) + ) + self.assertTrue( + np.allclose( + output["keypoints"][1:, 1:].reshape(-1, 2, 2)[:, ::-1, :], + anno["keypoints"][1:, 1:].reshape(-1, 2, 2), + ) + ) + + def test_transform_RLE(self): + transforms = T.TransformList([T.HFlipTransform(400)]) + mask = np.zeros((300, 400), order="F").astype("uint8") + mask[:, :200] = 1 + + anno = { + "bbox": np.asarray([10, 10, 200, 300]), + "bbox_mode": BoxMode.XYXY_ABS, + "segmentation": mask_util.encode(mask[:, :, None])[0], + "category_id": 3, + } + output = detection_utils.transform_instance_annotations( + copy.deepcopy(anno), transforms, (300, 400) + ) + mask = output["segmentation"] + self.assertTrue((mask[:, 200:] == 1).all()) + self.assertTrue((mask[:, :200] == 0).all()) + + inst = detection_utils.annotations_to_instances( + [output, output], (400, 400), mask_format="bitmask" + ) + self.assertTrue(isinstance(inst.gt_masks, BitMasks)) + + def test_transform_RLE_resize(self): + transforms = T.TransformList( + [T.HFlipTransform(400), T.ScaleTransform(300, 400, 400, 400, "bilinear")] + ) + mask = np.zeros((300, 400), order="F").astype("uint8") + mask[:, :200] = 1 + + anno = { + "bbox": np.asarray([10, 10, 200, 300]), + "bbox_mode": BoxMode.XYXY_ABS, + "segmentation": mask_util.encode(mask[:, :, None])[0], + "category_id": 3, + } + output = detection_utils.transform_instance_annotations( + copy.deepcopy(anno), transforms, (400, 400) + ) + + inst = detection_utils.annotations_to_instances( + [output, output], (400, 400), mask_format="bitmask" + ) + self.assertTrue(isinstance(inst.gt_masks, BitMasks)) + + def test_gen_crop(self): + instance = {"bbox": [10, 10, 100, 100], "bbox_mode": BoxMode.XYXY_ABS} + t = detection_utils.gen_crop_transform_with_instance((10, 10), (150, 150), instance) + # the box center must fall into the cropped region + self.assertTrue(t.x0 <= 55 <= t.x0 + t.w) + + def test_gen_crop_outside_boxes(self): + instance = {"bbox": [10, 10, 100, 100], "bbox_mode": BoxMode.XYXY_ABS} + with self.assertRaises(AssertionError): + detection_utils.gen_crop_transform_with_instance((10, 10), (15, 15), instance) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_rotation_transform.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_rotation_transform.py new file mode 100644 index 0000000..45faf7e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_rotation_transform.py @@ -0,0 +1,62 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +import unittest + +from detectron2.data.transforms.transform import RotationTransform + + +class TestRotationTransform(unittest.TestCase): + def assertEqualsArrays(self, a1, a2): + self.assertTrue(np.allclose(a1, a2)) + + def randomData(self, h=5, w=5): + image = np.random.rand(h, w) + coords = np.array([[i, j] for j in range(h + 1) for i in range(w + 1)], dtype=float) + return image, coords, h, w + + def test180(self): + image, coords, h, w = self.randomData(6, 6) + rot = RotationTransform(h, w, 180, expand=False, center=None) + self.assertEqualsArrays(rot.apply_image(image), image[::-1, ::-1]) + rotated_coords = [[w - c[0], h - c[1]] for c in coords] + self.assertEqualsArrays(rot.apply_coords(coords), rotated_coords) + + def test45_coords(self): + _, coords, h, w = self.randomData(4, 6) + rot = RotationTransform(h, w, 45, expand=False, center=None) + rotated_coords = [ + [(x + y - (h + w) / 2) / np.sqrt(2) + w / 2, h / 2 + (y + (w - h) / 2 - x) / np.sqrt(2)] + for (x, y) in coords + ] + self.assertEqualsArrays(rot.apply_coords(coords), rotated_coords) + + def test90(self): + image, coords, h, w = self.randomData() + rot = RotationTransform(h, w, 90, expand=False, center=None) + self.assertEqualsArrays(rot.apply_image(image), image.T[::-1]) + rotated_coords = [[c[1], w - c[0]] for c in coords] + self.assertEqualsArrays(rot.apply_coords(coords), rotated_coords) + + def test90_expand(self): # non-square image + image, coords, h, w = self.randomData(h=5, w=8) + rot = RotationTransform(h, w, 90, expand=True, center=None) + self.assertEqualsArrays(rot.apply_image(image), image.T[::-1]) + rotated_coords = [[c[1], w - c[0]] for c in coords] + self.assertEqualsArrays(rot.apply_coords(coords), rotated_coords) + + def test_center_expand(self): + # center has no effect if expand=True because it only affects shifting + image, coords, h, w = self.randomData(h=5, w=8) + angle = np.random.randint(360) + rot1 = RotationTransform(h, w, angle, expand=True, center=None) + rot2 = RotationTransform(h, w, angle, expand=True, center=(0, 0)) + rot3 = RotationTransform(h, w, angle, expand=True, center=(h, w)) + rot4 = RotationTransform(h, w, angle, expand=True, center=(2, 5)) + for r1 in [rot1, rot2, rot3, rot4]: + for r2 in [rot1, rot2, rot3, rot4]: + self.assertEqualsArrays(r1.apply_image(image), r2.apply_image(image)) + self.assertEqualsArrays(r1.apply_coords(coords), r2.apply_coords(coords)) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_sampler.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_sampler.py new file mode 100644 index 0000000..1256a87 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_sampler.py @@ -0,0 +1,23 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +import unittest +from torch.utils.data.sampler import SequentialSampler + +from detectron2.data.samplers import GroupedBatchSampler + + +class TestGroupedBatchSampler(unittest.TestCase): + def test_missing_group_id(self): + sampler = SequentialSampler(list(range(100))) + group_ids = [1] * 100 + samples = GroupedBatchSampler(sampler, group_ids, 2) + + for mini_batch in samples: + self.assertEqual(len(mini_batch), 2) + + def test_groups(self): + sampler = SequentialSampler(list(range(100))) + group_ids = [1, 0] * 50 + samples = GroupedBatchSampler(sampler, group_ids, 2) + + for mini_batch in samples: + self.assertEqual((mini_batch[0] + mini_batch[1]) % 2, 0) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_transforms.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_transforms.py new file mode 100644 index 0000000..6d85518 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/data/test_transforms.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import logging +import numpy as np +import unittest +from unittest import mock + +from detectron2.config import get_cfg +from detectron2.data import detection_utils +from detectron2.data import transforms as T +from detectron2.utils.logger import setup_logger + +logger = logging.getLogger(__name__) + + +class TestTransforms(unittest.TestCase): + def setUp(self): + setup_logger() + + def test_apply_rotated_boxes(self): + np.random.seed(125) + cfg = get_cfg() + is_train = True + transform_gen = detection_utils.build_transform_gen(cfg, is_train) + image = np.random.rand(200, 300) + image, transforms = T.apply_transform_gens(transform_gen, image) + image_shape = image.shape[:2] # h, w + assert image_shape == (800, 1200) + annotation = {"bbox": [179, 97, 62, 40, -56]} + + boxes = np.array([annotation["bbox"]], dtype=np.float64) # boxes.shape = (1, 5) + transformed_bbox = transforms.apply_rotated_box(boxes)[0] + + expected_bbox = np.array([484, 388, 248, 160, 56], dtype=np.float64) + err_msg = "transformed_bbox = {}, expected {}".format(transformed_bbox, expected_bbox) + assert np.allclose(transformed_bbox, expected_bbox), err_msg + + def test_apply_rotated_boxes_unequal_scaling_factor(self): + np.random.seed(125) + h, w = 400, 200 + newh, neww = 800, 800 + image = np.random.rand(h, w) + transform_gen = [] + transform_gen.append(T.Resize(shape=(newh, neww))) + image, transforms = T.apply_transform_gens(transform_gen, image) + image_shape = image.shape[:2] # h, w + assert image_shape == (newh, neww) + + boxes = np.array( + [ + [150, 100, 40, 20, 0], + [150, 100, 40, 20, 30], + [150, 100, 40, 20, 90], + [150, 100, 40, 20, -90], + ], + dtype=np.float64, + ) + transformed_boxes = transforms.apply_rotated_box(boxes) + + expected_bboxes = np.array( + [ + [600, 200, 160, 40, 0], + [600, 200, 144.22205102, 52.91502622, 49.10660535], + [600, 200, 80, 80, 90], + [600, 200, 80, 80, -90], + ], + dtype=np.float64, + ) + err_msg = "transformed_boxes = {}, expected {}".format(transformed_boxes, expected_bboxes) + assert np.allclose(transformed_boxes, expected_bboxes), err_msg + + def test_print_transform_gen(self): + t = T.RandomCrop("relative", (100, 100)) + self.assertTrue(str(t) == "RandomCrop(crop_type='relative', crop_size=(100, 100))") + + t = T.RandomFlip(prob=0.5) + self.assertTrue(str(t) == "RandomFlip(prob=0.5)") + + t = T.RandomFlip() + self.assertTrue(str(t) == "RandomFlip()") + + def test_random_apply_prob_out_of_range_check(self): + # GIVEN + test_probabilities = {0.0: True, 0.5: True, 1.0: True, -0.01: False, 1.01: False} + + # WHEN + for given_probability, is_valid in test_probabilities.items(): + # THEN + if not is_valid: + self.assertRaises(AssertionError, T.RandomApply, None, prob=given_probability) + else: + T.RandomApply(T.NoOpTransform(), prob=given_probability) + + def test_random_apply_wrapping_transform_gen_probability_occured_evaluation(self): + # GIVEN + transform_mock = mock.MagicMock(name="MockTransform", spec=T.TransformGen) + image_mock = mock.MagicMock(name="MockImage") + random_apply = T.RandomApply(transform_mock, prob=0.001) + + # WHEN + with mock.patch.object(random_apply, "_rand_range", return_value=0.0001): + transform = random_apply.get_transform(image_mock) + + # THEN + transform_mock.get_transform.assert_called_once_with(image_mock) + self.assertIsNot(transform, transform_mock) + + def test_random_apply_wrapping_std_transform_probability_occured_evaluation(self): + # GIVEN + transform_mock = mock.MagicMock(name="MockTransform", spec=T.Transform) + image_mock = mock.MagicMock(name="MockImage") + random_apply = T.RandomApply(transform_mock, prob=0.001) + + # WHEN + with mock.patch.object(random_apply, "_rand_range", return_value=0.0001): + transform = random_apply.get_transform(image_mock) + + # THEN + self.assertIs(transform, transform_mock) + + def test_random_apply_probability_not_occured_evaluation(self): + # GIVEN + transform_mock = mock.MagicMock(name="MockTransform", spec=T.TransformGen) + image_mock = mock.MagicMock(name="MockImage") + random_apply = T.RandomApply(transform_mock, prob=0.001) + + # WHEN + with mock.patch.object(random_apply, "_rand_range", return_value=0.9): + transform = random_apply.get_transform(image_mock) + + # THEN + transform_mock.get_transform.assert_not_called() + self.assertIsInstance(transform, T.NoOpTransform) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_mask_ops.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_mask_ops.py new file mode 100644 index 0000000..d180627 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_mask_ops.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import contextlib +import io +import numpy as np +import unittest +from collections import defaultdict +import torch +import tqdm +from fvcore.common.benchmark import benchmark +from fvcore.common.file_io import PathManager +from pycocotools.coco import COCO +from tabulate import tabulate +from torch.nn import functional as F + +from detectron2.data import MetadataCatalog +from detectron2.layers.mask_ops import ( + pad_masks, + paste_mask_in_image_old, + paste_masks_in_image, + scale_boxes, +) +from detectron2.structures import BitMasks, Boxes, BoxMode, PolygonMasks +from detectron2.structures.masks import polygons_to_bitmask + + +def iou_between_full_image_bit_masks(a, b): + intersect = (a & b).sum() + union = (a | b).sum() + return intersect / union + + +def rasterize_polygons_with_grid_sample(full_image_bit_mask, box, mask_size, threshold=0.5): + x0, y0, x1, y1 = box[0], box[1], box[2], box[3] + + img_h, img_w = full_image_bit_mask.shape + + mask_y = np.arange(0.0, mask_size) + 0.5 # mask y sample coords in [0.5, mask_size - 0.5] + mask_x = np.arange(0.0, mask_size) + 0.5 # mask x sample coords in [0.5, mask_size - 0.5] + mask_y = mask_y / mask_size * (y1 - y0) + y0 + mask_x = mask_x / mask_size * (x1 - x0) + x0 + + mask_x = (mask_x - 0.5) / (img_w - 1) * 2 + -1 + mask_y = (mask_y - 0.5) / (img_h - 1) * 2 + -1 + gy, gx = torch.meshgrid(torch.from_numpy(mask_y), torch.from_numpy(mask_x)) + ind = torch.stack([gx, gy], dim=-1).to(dtype=torch.float32) + + full_image_bit_mask = torch.from_numpy(full_image_bit_mask) + mask = F.grid_sample( + full_image_bit_mask[None, None, :, :].to(dtype=torch.float32), + ind[None, :, :, :], + align_corners=True, + ) + + return mask[0, 0] >= threshold + + +class TestMaskCropPaste(unittest.TestCase): + def setUp(self): + json_file = MetadataCatalog.get("coco_2017_val_100").json_file + if not PathManager.isfile(json_file): + raise unittest.SkipTest("{} not found".format(json_file)) + with contextlib.redirect_stdout(io.StringIO()): + json_file = PathManager.get_local_path(json_file) + self.coco = COCO(json_file) + + def test_crop_paste_consistency(self): + """ + rasterize_polygons_within_box (used in training) + and + paste_masks_in_image (used in inference) + should be inverse operations to each other. + + This function runs several implementation of the above two operations and prints + the reconstruction error. + """ + + anns = self.coco.loadAnns(self.coco.getAnnIds(iscrowd=False)) # avoid crowd annotations + + selected_anns = anns[:100] + + ious = [] + for ann in tqdm.tqdm(selected_anns): + results = self.process_annotation(ann) + ious.append([k[2] for k in results]) + + ious = np.array(ious) + mean_ious = ious.mean(axis=0) + table = [] + res_dic = defaultdict(dict) + for row, iou in zip(results, mean_ious): + table.append((row[0], row[1], iou)) + res_dic[row[0]][row[1]] = iou + print(tabulate(table, headers=["rasterize", "paste", "iou"], tablefmt="simple")) + # assert that the reconstruction is good: + self.assertTrue(res_dic["polygon"]["aligned"] > 0.94) + self.assertTrue(res_dic["roialign"]["aligned"] > 0.95) + + def process_annotation(self, ann, mask_side_len=28): + # Parse annotation data + img_info = self.coco.loadImgs(ids=[ann["image_id"]])[0] + height, width = img_info["height"], img_info["width"] + gt_polygons = [np.array(p, dtype=np.float64) for p in ann["segmentation"]] + gt_bbox = BoxMode.convert(ann["bbox"], BoxMode.XYWH_ABS, BoxMode.XYXY_ABS) + gt_bit_mask = polygons_to_bitmask(gt_polygons, height, width) + + # Run rasterize .. + torch_gt_bbox = torch.tensor(gt_bbox).to(dtype=torch.float32).reshape(-1, 4) + box_bitmasks = { + "polygon": PolygonMasks([gt_polygons]).crop_and_resize(torch_gt_bbox, mask_side_len)[0], + "gridsample": rasterize_polygons_with_grid_sample(gt_bit_mask, gt_bbox, mask_side_len), + "roialign": BitMasks(torch.from_numpy(gt_bit_mask[None, :, :])).crop_and_resize( + torch_gt_bbox, mask_side_len + )[0], + } + + # Run paste .. + results = defaultdict(dict) + for k, box_bitmask in box_bitmasks.items(): + padded_bitmask, scale = pad_masks(box_bitmask[None, :, :], 1) + scaled_boxes = scale_boxes(torch_gt_bbox, scale) + + r = results[k] + r["old"] = paste_mask_in_image_old( + padded_bitmask[0], scaled_boxes[0], height, width, threshold=0.5 + ) + r["aligned"] = paste_masks_in_image( + box_bitmask[None, :, :], Boxes(torch_gt_bbox), (height, width) + )[0] + + table = [] + for rasterize_method, r in results.items(): + for paste_method, mask in r.items(): + mask = np.asarray(mask) + iou = iou_between_full_image_bit_masks(gt_bit_mask.astype("uint8"), mask) + table.append((rasterize_method, paste_method, iou)) + return table + + def test_polygon_area(self): + # Draw polygon boxes + for d in [5.0, 10.0, 1000.0]: + polygon = PolygonMasks([[[0, 0, 0, d, d, d, d, 0]]]) + area = polygon.area()[0] + target = d ** 2 + self.assertEqual(area, target) + + # Draw polygon triangles + for d in [5.0, 10.0, 1000.0]: + polygon = PolygonMasks([[[0, 0, 0, d, d, d]]]) + area = polygon.area()[0] + target = d ** 2 / 2 + self.assertEqual(area, target) + + +def benchmark_paste(): + S = 800 + H, W = image_shape = (S, S) + N = 64 + torch.manual_seed(42) + masks = torch.rand(N, 28, 28) + + center = torch.rand(N, 2) * 600 + 100 + wh = torch.clamp(torch.randn(N, 2) * 40 + 200, min=50) + x0y0 = torch.clamp(center - wh * 0.5, min=0.0) + x1y1 = torch.clamp(center + wh * 0.5, max=S) + boxes = Boxes(torch.cat([x0y0, x1y1], axis=1)) + + def func(device, n=3): + m = masks.to(device=device) + b = boxes.to(device=device) + + def bench(): + for _ in range(n): + paste_masks_in_image(m, b, image_shape) + if device.type == "cuda": + torch.cuda.synchronize() + + return bench + + specs = [{"device": torch.device("cpu"), "n": 3}] + if torch.cuda.is_available(): + specs.append({"device": torch.device("cuda"), "n": 3}) + + benchmark(func, "paste_masks", specs, num_iters=10, warmup_iters=2) + + +if __name__ == "__main__": + benchmark_paste() + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_nms_rotated.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_nms_rotated.py new file mode 100644 index 0000000..94b346c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_nms_rotated.py @@ -0,0 +1,188 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from __future__ import absolute_import, division, print_function, unicode_literals +import numpy as np +import unittest +import torch +from torchvision import ops + +from detectron2.layers import batched_nms, batched_nms_rotated, nms_rotated + + +def nms_edit_distance(keep1, keep2): + """ + Compare the "keep" result of two nms call. + They are allowed to be different in terms of edit distance + due to floating point precision issues, e.g., + if a box happen to have an IoU of 0.5 with another box, + one implentation may choose to keep it while another may discard it. + """ + if torch.equal(keep1, keep2): + # they should be equal most of the time + return 0 + keep1, keep2 = tuple(keep1.cpu()), tuple(keep2.cpu()) + m, n = len(keep1), len(keep2) + + # edit distance with DP + f = [np.arange(n + 1), np.arange(n + 1)] + for i in range(m): + cur_row = i % 2 + other_row = (i + 1) % 2 + f[other_row][0] = i + 1 + for j in range(n): + f[other_row][j + 1] = ( + f[cur_row][j] + if keep1[i] == keep2[j] + else min(min(f[cur_row][j], f[cur_row][j + 1]), f[other_row][j]) + 1 + ) + return f[m % 2][n] + + +class TestNMSRotated(unittest.TestCase): + def reference_horizontal_nms(self, boxes, scores, iou_threshold): + """ + Args: + box_scores (N, 5): boxes in corner-form and probabilities. + (Note here 5 == 4 + 1, i.e., 4-dim horizontal box + 1-dim prob) + iou_threshold: intersection over union threshold. + Returns: + picked: a list of indexes of the kept boxes + """ + picked = [] + _, indexes = scores.sort(descending=True) + while len(indexes) > 0: + current = indexes[0] + picked.append(current.item()) + if len(indexes) == 1: + break + current_box = boxes[current, :] + indexes = indexes[1:] + rest_boxes = boxes[indexes, :] + iou = ops.box_iou(rest_boxes, current_box.unsqueeze(0)).squeeze(1) + indexes = indexes[iou <= iou_threshold] + + return torch.as_tensor(picked) + + def _create_tensors(self, N): + boxes = torch.rand(N, 4) * 100 + # Note: the implementation of this function in torchvision is: + # boxes[:, 2:] += torch.rand(N, 2) * 100 + # but it does not guarantee non-negative widths/heights constraints: + # boxes[:, 2] >= boxes[:, 0] and boxes[:, 3] >= boxes[:, 1]: + boxes[:, 2:] += boxes[:, :2] + scores = torch.rand(N) + return boxes, scores + + def test_batched_nms_rotated_0_degree_cpu(self): + N = 2000 + num_classes = 50 + boxes, scores = self._create_tensors(N) + idxs = torch.randint(0, num_classes, (N,)) + rotated_boxes = torch.zeros(N, 5) + rotated_boxes[:, 0] = (boxes[:, 0] + boxes[:, 2]) / 2.0 + rotated_boxes[:, 1] = (boxes[:, 1] + boxes[:, 3]) / 2.0 + rotated_boxes[:, 2] = boxes[:, 2] - boxes[:, 0] + rotated_boxes[:, 3] = boxes[:, 3] - boxes[:, 1] + err_msg = "Rotated NMS with 0 degree is incompatible with horizontal NMS for IoU={}" + for iou in [0.2, 0.5, 0.8]: + backup = boxes.clone() + keep_ref = batched_nms(boxes, scores, idxs, iou) + assert torch.allclose(boxes, backup), "boxes modified by batched_nms" + backup = rotated_boxes.clone() + keep = batched_nms_rotated(rotated_boxes, scores, idxs, iou) + assert torch.allclose( + rotated_boxes, backup + ), "rotated_boxes modified by batched_nms_rotated" + self.assertLessEqual(nms_edit_distance(keep, keep_ref), 1, err_msg.format(iou)) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_batched_nms_rotated_0_degree_cuda(self): + N = 2000 + num_classes = 50 + boxes, scores = self._create_tensors(N) + idxs = torch.randint(0, num_classes, (N,)) + rotated_boxes = torch.zeros(N, 5) + rotated_boxes[:, 0] = (boxes[:, 0] + boxes[:, 2]) / 2.0 + rotated_boxes[:, 1] = (boxes[:, 1] + boxes[:, 3]) / 2.0 + rotated_boxes[:, 2] = boxes[:, 2] - boxes[:, 0] + rotated_boxes[:, 3] = boxes[:, 3] - boxes[:, 1] + err_msg = "Rotated NMS with 0 degree is incompatible with horizontal NMS for IoU={}" + for iou in [0.2, 0.5, 0.8]: + backup = boxes.clone() + keep_ref = batched_nms(boxes.cuda(), scores.cuda(), idxs, iou) + self.assertTrue(torch.allclose(boxes, backup), "boxes modified by batched_nms") + backup = rotated_boxes.clone() + keep = batched_nms_rotated(rotated_boxes.cuda(), scores.cuda(), idxs, iou) + self.assertTrue( + torch.allclose(rotated_boxes, backup), + "rotated_boxes modified by batched_nms_rotated", + ) + self.assertLessEqual(nms_edit_distance(keep, keep_ref), 1, err_msg.format(iou)) + + def test_nms_rotated_0_degree_cpu(self): + N = 1000 + boxes, scores = self._create_tensors(N) + rotated_boxes = torch.zeros(N, 5) + rotated_boxes[:, 0] = (boxes[:, 0] + boxes[:, 2]) / 2.0 + rotated_boxes[:, 1] = (boxes[:, 1] + boxes[:, 3]) / 2.0 + rotated_boxes[:, 2] = boxes[:, 2] - boxes[:, 0] + rotated_boxes[:, 3] = boxes[:, 3] - boxes[:, 1] + err_msg = "Rotated NMS incompatible between CPU and reference implementation for IoU={}" + for iou in [0.5]: + keep_ref = self.reference_horizontal_nms(boxes, scores, iou) + keep = nms_rotated(rotated_boxes, scores, iou) + self.assertLessEqual(nms_edit_distance(keep, keep_ref), 1, err_msg.format(iou)) + + def test_nms_rotated_90_degrees_cpu(self): + N = 1000 + boxes, scores = self._create_tensors(N) + rotated_boxes = torch.zeros(N, 5) + rotated_boxes[:, 0] = (boxes[:, 0] + boxes[:, 2]) / 2.0 + rotated_boxes[:, 1] = (boxes[:, 1] + boxes[:, 3]) / 2.0 + # Note for rotated_boxes[:, 2] and rotated_boxes[:, 3]: + # widths and heights are intentionally swapped here for 90 degrees case + # so that the reference horizontal nms could be used + rotated_boxes[:, 2] = boxes[:, 3] - boxes[:, 1] + rotated_boxes[:, 3] = boxes[:, 2] - boxes[:, 0] + + rotated_boxes[:, 4] = torch.ones(N) * 90 + err_msg = "Rotated NMS incompatible between CPU and reference implementation for IoU={}" + for iou in [0.2, 0.5, 0.8]: + keep_ref = self.reference_horizontal_nms(boxes, scores, iou) + keep = nms_rotated(rotated_boxes, scores, iou) + assert torch.equal(keep, keep_ref), err_msg.format(iou) + + def test_nms_rotated_180_degrees_cpu(self): + N = 1000 + boxes, scores = self._create_tensors(N) + rotated_boxes = torch.zeros(N, 5) + rotated_boxes[:, 0] = (boxes[:, 0] + boxes[:, 2]) / 2.0 + rotated_boxes[:, 1] = (boxes[:, 1] + boxes[:, 3]) / 2.0 + rotated_boxes[:, 2] = boxes[:, 2] - boxes[:, 0] + rotated_boxes[:, 3] = boxes[:, 3] - boxes[:, 1] + rotated_boxes[:, 4] = torch.ones(N) * 180 + err_msg = "Rotated NMS incompatible between CPU and reference implementation for IoU={}" + for iou in [0.2, 0.5, 0.8]: + keep_ref = self.reference_horizontal_nms(boxes, scores, iou) + keep = nms_rotated(rotated_boxes, scores, iou) + assert torch.equal(keep, keep_ref), err_msg.format(iou) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_nms_rotated_0_degree_cuda(self): + N = 1000 + boxes, scores = self._create_tensors(N) + rotated_boxes = torch.zeros(N, 5) + rotated_boxes[:, 0] = (boxes[:, 0] + boxes[:, 2]) / 2.0 + rotated_boxes[:, 1] = (boxes[:, 1] + boxes[:, 3]) / 2.0 + rotated_boxes[:, 2] = boxes[:, 2] - boxes[:, 0] + rotated_boxes[:, 3] = boxes[:, 3] - boxes[:, 1] + err_msg = "Rotated NMS incompatible between CPU and CUDA for IoU={}" + + for iou in [0.2, 0.5, 0.8]: + r_cpu = nms_rotated(rotated_boxes, scores, iou) + r_cuda = nms_rotated(rotated_boxes.cuda(), scores.cuda(), iou) + + assert torch.equal(r_cpu, r_cuda.cpu()), err_msg.format(iou) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align.py new file mode 100644 index 0000000..633d7c2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align.py @@ -0,0 +1,152 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import numpy as np +import unittest +import cv2 +import torch +from fvcore.common.benchmark import benchmark + +from detectron2.layers.roi_align import ROIAlign + + +class ROIAlignTest(unittest.TestCase): + def test_forward_output(self): + input = np.arange(25).reshape(5, 5).astype("float32") + """ + 0 1 2 3 4 + 5 6 7 8 9 + 10 11 12 13 14 + 15 16 17 18 19 + 20 21 22 23 24 + """ + + output = self._simple_roialign(input, [1, 1, 3, 3], (4, 4), aligned=False) + output_correct = self._simple_roialign(input, [1, 1, 3, 3], (4, 4), aligned=True) + + # without correction: + old_results = [ + [7.5, 8, 8.5, 9], + [10, 10.5, 11, 11.5], + [12.5, 13, 13.5, 14], + [15, 15.5, 16, 16.5], + ] + + # with 0.5 correction: + correct_results = [ + [4.5, 5.0, 5.5, 6.0], + [7.0, 7.5, 8.0, 8.5], + [9.5, 10.0, 10.5, 11.0], + [12.0, 12.5, 13.0, 13.5], + ] + # This is an upsampled version of [[6, 7], [11, 12]] + + self.assertTrue(np.allclose(output.flatten(), np.asarray(old_results).flatten())) + self.assertTrue( + np.allclose(output_correct.flatten(), np.asarray(correct_results).flatten()) + ) + + # Also see similar issues in tensorflow at + # https://github.com/tensorflow/tensorflow/issues/26278 + + def test_resize(self): + H, W = 30, 30 + input = np.random.rand(H, W).astype("float32") * 100 + box = [10, 10, 20, 20] + output = self._simple_roialign(input, box, (5, 5), aligned=True) + + input2x = cv2.resize(input, (W // 2, H // 2), interpolation=cv2.INTER_LINEAR) + box2x = [x / 2 for x in box] + output2x = self._simple_roialign(input2x, box2x, (5, 5), aligned=True) + diff = np.abs(output2x - output) + self.assertTrue(diff.max() < 1e-4) + + def _simple_roialign(self, img, box, resolution, aligned=True): + """ + RoiAlign with scale 1.0 and 0 sample ratio. + """ + if isinstance(resolution, int): + resolution = (resolution, resolution) + op = ROIAlign(resolution, 1.0, 0, aligned=aligned) + input = torch.from_numpy(img[None, None, :, :].astype("float32")) + + rois = [0] + list(box) + rois = torch.from_numpy(np.asarray(rois)[None, :].astype("float32")) + output = op.forward(input, rois) + if torch.cuda.is_available(): + output_cuda = op.forward(input.cuda(), rois.cuda()).cpu() + self.assertTrue(torch.allclose(output, output_cuda)) + return output[0, 0] + + def _simple_roialign_with_grad(self, img, box, resolution, device): + if isinstance(resolution, int): + resolution = (resolution, resolution) + + op = ROIAlign(resolution, 1.0, 0, aligned=True) + input = torch.from_numpy(img[None, None, :, :].astype("float32")) + + rois = [0] + list(box) + rois = torch.from_numpy(np.asarray(rois)[None, :].astype("float32")) + input = input.to(device=device) + rois = rois.to(device=device) + input.requires_grad = True + output = op.forward(input, rois) + return input, output + + def test_empty_box(self): + img = np.random.rand(5, 5) + box = [3, 4, 5, 4] + o = self._simple_roialign(img, box, 7) + self.assertTrue(o.shape == (7, 7)) + self.assertTrue((o == 0).all()) + + for dev in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + input, output = self._simple_roialign_with_grad(img, box, 7, torch.device(dev)) + output.sum().backward() + self.assertTrue(torch.allclose(input.grad, torch.zeros_like(input))) + + def test_empty_batch(self): + input = torch.zeros(0, 3, 10, 10, dtype=torch.float32) + rois = torch.zeros(0, 5, dtype=torch.float32) + op = ROIAlign((7, 7), 1.0, 0, aligned=True) + output = op.forward(input, rois) + self.assertTrue(output.shape == (0, 3, 7, 7)) + + +def benchmark_roi_align(): + from detectron2 import _C + + def random_boxes(mean_box, stdev, N, maxsize): + ret = torch.rand(N, 4) * stdev + torch.tensor(mean_box, dtype=torch.float) + ret.clamp_(min=0, max=maxsize) + return ret + + def func(N, C, H, W, nboxes_per_img): + input = torch.rand(N, C, H, W) + boxes = [] + batch_idx = [] + for k in range(N): + b = random_boxes([80, 80, 130, 130], 24, nboxes_per_img, H) + # try smaller boxes: + # b = random_boxes([100, 100, 110, 110], 4, nboxes_per_img, H) + boxes.append(b) + batch_idx.append(torch.zeros(nboxes_per_img, 1, dtype=torch.float32) + k) + boxes = torch.cat(boxes, axis=0) + batch_idx = torch.cat(batch_idx, axis=0) + boxes = torch.cat([batch_idx, boxes], axis=1) + + input = input.cuda() + boxes = boxes.cuda() + + def bench(): + _C.roi_align_forward(input, boxes, 1.0, 7, 7, 0, True) + torch.cuda.synchronize() + + return bench + + args = [dict(N=2, C=512, H=256, W=256, nboxes_per_img=500)] + benchmark(func, "cuda_roialign", args, num_iters=20, warmup_iters=1) + + +if __name__ == "__main__": + if torch.cuda.is_available(): + benchmark_roi_align() + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align_rotated.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align_rotated.py new file mode 100644 index 0000000..1915b59 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/layers/test_roi_align_rotated.py @@ -0,0 +1,176 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest +import cv2 +import torch +from torch.autograd import Variable, gradcheck + +from detectron2.layers.roi_align import ROIAlign +from detectron2.layers.roi_align_rotated import ROIAlignRotated + +logger = logging.getLogger(__name__) + + +class ROIAlignRotatedTest(unittest.TestCase): + def _box_to_rotated_box(self, box, angle): + return [ + (box[0] + box[2]) / 2.0, + (box[1] + box[3]) / 2.0, + box[2] - box[0], + box[3] - box[1], + angle, + ] + + def _rot90(self, img, num): + num = num % 4 # note: -1 % 4 == 3 + for _ in range(num): + img = img.transpose(0, 1).flip(0) + return img + + def test_forward_output_0_90_180_270(self): + for i in range(4): + # i = 0, 1, 2, 3 corresponding to 0, 90, 180, 270 degrees + img = torch.arange(25, dtype=torch.float32).reshape(5, 5) + """ + 0 1 2 3 4 + 5 6 7 8 9 + 10 11 12 13 14 + 15 16 17 18 19 + 20 21 22 23 24 + """ + box = [1, 1, 3, 3] + rotated_box = self._box_to_rotated_box(box=box, angle=90 * i) + + result = self._simple_roi_align_rotated(img=img, box=rotated_box, resolution=(4, 4)) + + # Here's an explanation for 0 degree case: + # point 0 in the original input lies at [0.5, 0.5] + # (the center of bin [0, 1] x [0, 1]) + # point 1 in the original input lies at [1.5, 0.5], etc. + # since the resolution is (4, 4) that divides [1, 3] x [1, 3] + # into 4 x 4 equal bins, + # the top-left bin is [1, 1.5] x [1, 1.5], and its center + # (1.25, 1.25) lies at the 3/4 position + # between point 0 and point 1, point 5 and point 6, + # point 0 and point 5, point 1 and point 6, so it can be calculated as + # 0.25*(0*0.25+1*0.75)+(5*0.25+6*0.75)*0.75 = 4.5 + result_expected = torch.tensor( + [ + [4.5, 5.0, 5.5, 6.0], + [7.0, 7.5, 8.0, 8.5], + [9.5, 10.0, 10.5, 11.0], + [12.0, 12.5, 13.0, 13.5], + ] + ) + # This is also an upsampled version of [[6, 7], [11, 12]] + + # When the box is rotated by 90 degrees CCW, + # the result would be rotated by 90 degrees CW, thus it's -i here + result_expected = self._rot90(result_expected, -i) + + assert torch.allclose(result, result_expected) + + def test_resize(self): + H, W = 30, 30 + input = torch.rand(H, W) * 100 + box = [10, 10, 20, 20] + rotated_box = self._box_to_rotated_box(box, angle=0) + output = self._simple_roi_align_rotated(img=input, box=rotated_box, resolution=(5, 5)) + + input2x = cv2.resize(input.numpy(), (W // 2, H // 2), interpolation=cv2.INTER_LINEAR) + input2x = torch.from_numpy(input2x) + box2x = [x / 2 for x in box] + rotated_box2x = self._box_to_rotated_box(box2x, angle=0) + output2x = self._simple_roi_align_rotated(img=input2x, box=rotated_box2x, resolution=(5, 5)) + assert torch.allclose(output2x, output) + + def _simple_roi_align_rotated(self, img, box, resolution): + """ + RoiAlignRotated with scale 1.0 and 0 sample ratio. + """ + op = ROIAlignRotated(output_size=resolution, spatial_scale=1.0, sampling_ratio=0) + input = img[None, None, :, :] + + rois = [0] + list(box) + rois = torch.tensor(rois, dtype=torch.float32)[None, :] + result_cpu = op.forward(input, rois) + if torch.cuda.is_available(): + result_cuda = op.forward(input.cuda(), rois.cuda()) + assert torch.allclose(result_cpu, result_cuda.cpu()) + return result_cpu[0, 0] + + def test_empty_box(self): + img = torch.rand(5, 5) + out = self._simple_roi_align_rotated(img, [2, 3, 0, 0, 0], (7, 7)) + self.assertTrue((out == 0).all()) + + def test_roi_align_rotated_gradcheck_cpu(self): + dtype = torch.float64 + device = torch.device("cpu") + roi_align_rotated_op = ROIAlignRotated( + output_size=(5, 5), spatial_scale=0.5, sampling_ratio=1 + ).to(dtype=dtype, device=device) + x = torch.rand(1, 1, 10, 10, dtype=dtype, device=device, requires_grad=True) + # roi format is (batch index, x_center, y_center, width, height, angle) + rois = torch.tensor( + [[0, 4.5, 4.5, 9, 9, 0], [0, 2, 7, 4, 4, 0], [0, 7, 7, 4, 4, 0]], + dtype=dtype, + device=device, + ) + + def func(input): + return roi_align_rotated_op(input, rois) + + assert gradcheck(func, (x,)), "gradcheck failed for RoIAlignRotated CPU" + assert gradcheck(func, (x.transpose(2, 3),)), "gradcheck failed for RoIAlignRotated CPU" + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_roi_align_rotated_gradient_cuda(self): + """ + Compute gradients for ROIAlignRotated with multiple bounding boxes on the GPU, + and compare the result with ROIAlign + """ + # torch.manual_seed(123) + dtype = torch.float64 + device = torch.device("cuda") + pool_h, pool_w = (5, 5) + + roi_align = ROIAlign(output_size=(pool_h, pool_w), spatial_scale=1, sampling_ratio=2).to( + device=device + ) + + roi_align_rotated = ROIAlignRotated( + output_size=(pool_h, pool_w), spatial_scale=1, sampling_ratio=2 + ).to(device=device) + + x = torch.rand(1, 1, 10, 10, dtype=dtype, device=device, requires_grad=True) + # x_rotated = x.clone() won't work (will lead to grad_fun=CloneBackward)! + x_rotated = Variable(x.data.clone(), requires_grad=True) + + # roi_rotated format is (batch index, x_center, y_center, width, height, angle) + rois_rotated = torch.tensor( + [[0, 4.5, 4.5, 9, 9, 0], [0, 2, 7, 4, 4, 0], [0, 7, 7, 4, 4, 0]], + dtype=dtype, + device=device, + ) + + y_rotated = roi_align_rotated(x_rotated, rois_rotated) + s_rotated = y_rotated.sum() + s_rotated.backward() + + # roi format is (batch index, x1, y1, x2, y2) + rois = torch.tensor( + [[0, 0, 0, 9, 9], [0, 0, 5, 4, 9], [0, 5, 5, 9, 9]], dtype=dtype, device=device + ) + + y = roi_align(x, rois) + s = y.sum() + s.backward() + + assert torch.allclose( + x.grad, x_rotated.grad + ), "gradients for ROIAlign and ROIAlignRotated mismatch on CUDA" + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_anchor_generator.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_anchor_generator.py new file mode 100644 index 0000000..bc14f02 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_anchor_generator.py @@ -0,0 +1,121 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest +import torch + +from detectron2.config import get_cfg +from detectron2.layers import ShapeSpec +from detectron2.modeling.anchor_generator import DefaultAnchorGenerator, RotatedAnchorGenerator + +logger = logging.getLogger(__name__) + + +class TestAnchorGenerator(unittest.TestCase): + def test_default_anchor_generator(self): + cfg = get_cfg() + cfg.MODEL.ANCHOR_GENERATOR.SIZES = [[32, 64]] + cfg.MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS = [[0.25, 1, 4]] + + anchor_generator = DefaultAnchorGenerator(cfg, [ShapeSpec(stride=4)]) + + # only the last two dimensions of features matter here + num_images = 2 + features = {"stage3": torch.rand(num_images, 96, 1, 2)} + anchors = anchor_generator([features["stage3"]]) + expected_anchor_tensor = torch.tensor( + [ + [-32.0, -8.0, 32.0, 8.0], + [-16.0, -16.0, 16.0, 16.0], + [-8.0, -32.0, 8.0, 32.0], + [-64.0, -16.0, 64.0, 16.0], + [-32.0, -32.0, 32.0, 32.0], + [-16.0, -64.0, 16.0, 64.0], + [-28.0, -8.0, 36.0, 8.0], # -28.0 == -32.0 + STRIDE (4) + [-12.0, -16.0, 20.0, 16.0], + [-4.0, -32.0, 12.0, 32.0], + [-60.0, -16.0, 68.0, 16.0], + [-28.0, -32.0, 36.0, 32.0], + [-12.0, -64.0, 20.0, 64.0], + ] + ) + + assert torch.allclose(anchors[0].tensor, expected_anchor_tensor) + + def test_default_anchor_generator_centered(self): + # test explicit args + anchor_generator = DefaultAnchorGenerator( + sizes=[32, 64], aspect_ratios=[0.25, 1, 4], strides=[4] + ) + + # only the last two dimensions of features matter here + num_images = 2 + features = {"stage3": torch.rand(num_images, 96, 1, 2)} + expected_anchor_tensor = torch.tensor( + [ + [-30.0, -6.0, 34.0, 10.0], + [-14.0, -14.0, 18.0, 18.0], + [-6.0, -30.0, 10.0, 34.0], + [-62.0, -14.0, 66.0, 18.0], + [-30.0, -30.0, 34.0, 34.0], + [-14.0, -62.0, 18.0, 66.0], + [-26.0, -6.0, 38.0, 10.0], + [-10.0, -14.0, 22.0, 18.0], + [-2.0, -30.0, 14.0, 34.0], + [-58.0, -14.0, 70.0, 18.0], + [-26.0, -30.0, 38.0, 34.0], + [-10.0, -62.0, 22.0, 66.0], + ] + ) + + anchors = anchor_generator([features["stage3"]]) + assert torch.allclose(anchors[0].tensor, expected_anchor_tensor) + + # doesn't work yet + # anchors = torch.jit.script(anchor_generator)([features["stage3"]]) + # assert torch.allclose(anchors[0].tensor, expected_anchor_tensor) + + def test_rrpn_anchor_generator(self): + cfg = get_cfg() + cfg.MODEL.ANCHOR_GENERATOR.SIZES = [[32, 64]] + cfg.MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS = [[0.25, 1, 4]] + cfg.MODEL.ANCHOR_GENERATOR.ANGLES = [0, 45] # test single list[float] + anchor_generator = RotatedAnchorGenerator(cfg, [ShapeSpec(stride=4)]) + + # only the last two dimensions of features matter here + num_images = 2 + features = {"stage3": torch.rand(num_images, 96, 1, 2)} + anchors = anchor_generator([features["stage3"]]) + expected_anchor_tensor = torch.tensor( + [ + [0.0, 0.0, 64.0, 16.0, 0.0], + [0.0, 0.0, 64.0, 16.0, 45.0], + [0.0, 0.0, 32.0, 32.0, 0.0], + [0.0, 0.0, 32.0, 32.0, 45.0], + [0.0, 0.0, 16.0, 64.0, 0.0], + [0.0, 0.0, 16.0, 64.0, 45.0], + [0.0, 0.0, 128.0, 32.0, 0.0], + [0.0, 0.0, 128.0, 32.0, 45.0], + [0.0, 0.0, 64.0, 64.0, 0.0], + [0.0, 0.0, 64.0, 64.0, 45.0], + [0.0, 0.0, 32.0, 128.0, 0.0], + [0.0, 0.0, 32.0, 128.0, 45.0], + [4.0, 0.0, 64.0, 16.0, 0.0], # 4.0 == 0.0 + STRIDE (4) + [4.0, 0.0, 64.0, 16.0, 45.0], + [4.0, 0.0, 32.0, 32.0, 0.0], + [4.0, 0.0, 32.0, 32.0, 45.0], + [4.0, 0.0, 16.0, 64.0, 0.0], + [4.0, 0.0, 16.0, 64.0, 45.0], + [4.0, 0.0, 128.0, 32.0, 0.0], + [4.0, 0.0, 128.0, 32.0, 45.0], + [4.0, 0.0, 64.0, 64.0, 0.0], + [4.0, 0.0, 64.0, 64.0, 45.0], + [4.0, 0.0, 32.0, 128.0, 0.0], + [4.0, 0.0, 32.0, 128.0, 45.0], + ] + ) + + assert torch.allclose(anchors[0].tensor, expected_anchor_tensor) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_box2box_transform.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_box2box_transform.py new file mode 100644 index 0000000..9d124d7 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_box2box_transform.py @@ -0,0 +1,64 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest +import torch + +from detectron2.modeling.box_regression import Box2BoxTransform, Box2BoxTransformRotated + +logger = logging.getLogger(__name__) + + +def random_boxes(mean_box, stdev, N): + return torch.rand(N, 4) * stdev + torch.tensor(mean_box, dtype=torch.float) + + +class TestBox2BoxTransform(unittest.TestCase): + def test_reconstruction(self): + weights = (5, 5, 10, 10) + b2b_tfm = Box2BoxTransform(weights=weights) + src_boxes = random_boxes([10, 10, 20, 20], 1, 10) + dst_boxes = random_boxes([10, 10, 20, 20], 1, 10) + + devices = [torch.device("cpu")] + if torch.cuda.is_available(): + devices.append(torch.device("cuda")) + for device in devices: + src_boxes = src_boxes.to(device=device) + dst_boxes = dst_boxes.to(device=device) + deltas = b2b_tfm.get_deltas(src_boxes, dst_boxes) + dst_boxes_reconstructed = b2b_tfm.apply_deltas(deltas, src_boxes) + assert torch.allclose(dst_boxes, dst_boxes_reconstructed) + + +def random_rotated_boxes(mean_box, std_length, std_angle, N): + return torch.cat( + [torch.rand(N, 4) * std_length, torch.rand(N, 1) * std_angle], dim=1 + ) + torch.tensor(mean_box, dtype=torch.float) + + +class TestBox2BoxTransformRotated(unittest.TestCase): + def test_reconstruction(self): + weights = (5, 5, 10, 10, 1) + b2b_transform = Box2BoxTransformRotated(weights=weights) + src_boxes = random_rotated_boxes([10, 10, 20, 20, -30], 5, 60.0, 10) + dst_boxes = random_rotated_boxes([10, 10, 20, 20, -30], 5, 60.0, 10) + + devices = [torch.device("cpu")] + if torch.cuda.is_available(): + devices.append(torch.device("cuda")) + for device in devices: + src_boxes = src_boxes.to(device=device) + dst_boxes = dst_boxes.to(device=device) + deltas = b2b_transform.get_deltas(src_boxes, dst_boxes) + dst_boxes_reconstructed = b2b_transform.apply_deltas(deltas, src_boxes) + assert torch.allclose(dst_boxes[:, :4], dst_boxes_reconstructed[:, :4], atol=1e-5) + # angle difference has to be normalized + assert torch.allclose( + (dst_boxes[:, 4] - dst_boxes_reconstructed[:, 4] + 180.0) % 360.0 - 180.0, + torch.zeros_like(dst_boxes[:, 4]), + atol=1e-4, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_fast_rcnn.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_fast_rcnn.py new file mode 100644 index 0000000..70b64d3 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_fast_rcnn.py @@ -0,0 +1,106 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest +import torch + +from detectron2.layers import ShapeSpec +from detectron2.modeling.box_regression import Box2BoxTransform, Box2BoxTransformRotated +from detectron2.modeling.roi_heads.fast_rcnn import FastRCNNOutputLayers +from detectron2.modeling.roi_heads.rotated_fast_rcnn import RotatedFastRCNNOutputLayers +from detectron2.structures import Boxes, Instances, RotatedBoxes +from detectron2.utils.events import EventStorage + +logger = logging.getLogger(__name__) + + +class FastRCNNTest(unittest.TestCase): + def test_fast_rcnn(self): + torch.manual_seed(132) + + box_head_output_size = 8 + + box_predictor = FastRCNNOutputLayers( + ShapeSpec(channels=box_head_output_size), + box2box_transform=Box2BoxTransform(weights=(10, 10, 5, 5)), + num_classes=5, + ) + feature_pooled = torch.rand(2, box_head_output_size) + predictions = box_predictor(feature_pooled) + + proposal_boxes = torch.tensor([[0.8, 1.1, 3.2, 2.8], [2.3, 2.5, 7, 8]], dtype=torch.float32) + gt_boxes = torch.tensor([[1, 1, 3, 3], [2, 2, 6, 6]], dtype=torch.float32) + proposal = Instances((10, 10)) + proposal.proposal_boxes = Boxes(proposal_boxes) + proposal.gt_boxes = Boxes(gt_boxes) + proposal.gt_classes = torch.tensor([1, 2]) + + with EventStorage(): # capture events in a new storage to discard them + losses = box_predictor.losses(predictions, [proposal]) + + expected_losses = { + "loss_cls": torch.tensor(1.7951188087), + "loss_box_reg": torch.tensor(4.0357131958), + } + for name in expected_losses.keys(): + assert torch.allclose(losses[name], expected_losses[name]) + + def test_fast_rcnn_empty_batch(self, device="cpu"): + box_predictor = FastRCNNOutputLayers( + ShapeSpec(channels=10), + box2box_transform=Box2BoxTransform(weights=(10, 10, 5, 5)), + num_classes=8, + ).to(device=device) + + logits = torch.randn(0, 100, requires_grad=True, device=device) + deltas = torch.randn(0, 4, requires_grad=True, device=device) + losses = box_predictor.losses([logits, deltas], []) + for value in losses.values(): + self.assertTrue(torch.allclose(value, torch.zeros_like(value))) + sum(losses.values()).backward() + self.assertTrue(logits.grad is not None) + self.assertTrue(deltas.grad is not None) + + predictions, _ = box_predictor.inference([logits, deltas], []) + self.assertEqual(len(predictions), 0) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_fast_rcnn_empty_batch_cuda(self): + self.test_fast_rcnn_empty_batch(device=torch.device("cuda")) + + def test_fast_rcnn_rotated(self): + torch.manual_seed(132) + box_head_output_size = 8 + + box_predictor = RotatedFastRCNNOutputLayers( + ShapeSpec(channels=box_head_output_size), + box2box_transform=Box2BoxTransformRotated(weights=(10, 10, 5, 5, 1)), + num_classes=5, + ) + feature_pooled = torch.rand(2, box_head_output_size) + predictions = box_predictor(feature_pooled) + proposal_boxes = torch.tensor( + [[2, 1.95, 2.4, 1.7, 0], [4.65, 5.25, 4.7, 5.5, 0]], dtype=torch.float32 + ) + gt_boxes = torch.tensor([[2, 2, 2, 2, 0], [4, 4, 4, 4, 0]], dtype=torch.float32) + proposal = Instances((10, 10)) + proposal.proposal_boxes = RotatedBoxes(proposal_boxes) + proposal.gt_boxes = RotatedBoxes(gt_boxes) + proposal.gt_classes = torch.tensor([1, 2]) + + with EventStorage(): # capture events in a new storage to discard them + losses = box_predictor.losses(predictions, [proposal]) + + # Note: the expected losses are slightly different even if + # the boxes are essentially the same as in the FastRCNNOutput test, because + # bbox_pred in FastRCNNOutputLayers have different Linear layers/initialization + # between the two cases. + expected_losses = { + "loss_cls": torch.tensor(1.7920907736), + "loss_box_reg": torch.tensor(4.0410838127), + } + for name in expected_losses.keys(): + assert torch.allclose(losses[name], expected_losses[name]) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_model_e2e.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_model_e2e.py new file mode 100644 index 0000000..95fe6a0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_model_e2e.py @@ -0,0 +1,154 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + + +import unittest +import torch + +import detectron2.model_zoo as model_zoo +from detectron2.config import get_cfg +from detectron2.modeling import build_model +from detectron2.structures import BitMasks, Boxes, ImageList, Instances +from detectron2.utils.events import EventStorage + + +def get_model_zoo(config_path): + """ + Like model_zoo.get, but do not load any weights (even pretrained) + """ + cfg_file = model_zoo.get_config_file(config_path) + cfg = get_cfg() + cfg.merge_from_file(cfg_file) + if not torch.cuda.is_available(): + cfg.MODEL.DEVICE = "cpu" + return build_model(cfg) + + +def create_model_input(img, inst=None): + if inst is not None: + return {"image": img, "instances": inst} + else: + return {"image": img} + + +def get_empty_instance(h, w): + inst = Instances((h, w)) + inst.gt_boxes = Boxes(torch.rand(0, 4)) + inst.gt_classes = torch.tensor([]).to(dtype=torch.int64) + inst.gt_masks = BitMasks(torch.rand(0, h, w)) + return inst + + +def get_regular_bitmask_instances(h, w): + inst = Instances((h, w)) + inst.gt_boxes = Boxes(torch.rand(3, 4)) + inst.gt_boxes.tensor[:, 2:] += inst.gt_boxes.tensor[:, :2] + inst.gt_classes = torch.tensor([3, 4, 5]).to(dtype=torch.int64) + inst.gt_masks = BitMasks((torch.rand(3, h, w) > 0.5)) + return inst + + +class ModelE2ETest: + def setUp(self): + torch.manual_seed(43) + self.model = get_model_zoo(self.CONFIG_PATH) + + def _test_eval(self, input_sizes): + inputs = [create_model_input(torch.rand(3, s[0], s[1])) for s in input_sizes] + self.model.eval() + self.model(inputs) + + def _test_train(self, input_sizes, instances): + assert len(input_sizes) == len(instances) + inputs = [ + create_model_input(torch.rand(3, s[0], s[1]), inst) + for s, inst in zip(input_sizes, instances) + ] + self.model.train() + with EventStorage(): + losses = self.model(inputs) + sum(losses.values()).backward() + del losses + + def _inf_tensor(self, *shape): + return 1.0 / torch.zeros(*shape, device=self.model.device) + + def _nan_tensor(self, *shape): + return torch.zeros(*shape, device=self.model.device).fill_(float("nan")) + + def test_empty_data(self): + instances = [get_empty_instance(200, 250), get_empty_instance(200, 249)] + self._test_eval([(200, 250), (200, 249)]) + self._test_train([(200, 250), (200, 249)], instances) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") + def test_eval_tocpu(self): + model = get_model_zoo(self.CONFIG_PATH).cpu() + model.eval() + input_sizes = [(200, 250), (200, 249)] + inputs = [create_model_input(torch.rand(3, s[0], s[1])) for s in input_sizes] + model(inputs) + + +class MaskRCNNE2ETest(ModelE2ETest, unittest.TestCase): + CONFIG_PATH = "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml" + + def test_half_empty_data(self): + instances = [get_empty_instance(200, 250), get_regular_bitmask_instances(200, 249)] + self._test_train([(200, 250), (200, 249)], instances) + + # This test is flaky because in some environment the output features are zero due to relu + # def test_rpn_inf_nan_data(self): + # self.model.eval() + # for tensor in [self._inf_tensor, self._nan_tensor]: + # images = ImageList(tensor(1, 3, 512, 512), [(510, 510)]) + # features = { + # "p2": tensor(1, 256, 256, 256), + # "p3": tensor(1, 256, 128, 128), + # "p4": tensor(1, 256, 64, 64), + # "p5": tensor(1, 256, 32, 32), + # "p6": tensor(1, 256, 16, 16), + # } + # props, _ = self.model.proposal_generator(images, features) + # self.assertEqual(len(props[0]), 0) + + def test_roiheads_inf_nan_data(self): + self.model.eval() + for tensor in [self._inf_tensor, self._nan_tensor]: + images = ImageList(tensor(1, 3, 512, 512), [(510, 510)]) + features = { + "p2": tensor(1, 256, 256, 256), + "p3": tensor(1, 256, 128, 128), + "p4": tensor(1, 256, 64, 64), + "p5": tensor(1, 256, 32, 32), + "p6": tensor(1, 256, 16, 16), + } + props = [Instances((510, 510))] + props[0].proposal_boxes = Boxes([[10, 10, 20, 20]]).to(device=self.model.device) + props[0].objectness_logits = torch.tensor([1.0]).reshape(1, 1) + det, _ = self.model.roi_heads(images, features, props) + self.assertEqual(len(det[0]), 0) + + +class RetinaNetE2ETest(ModelE2ETest, unittest.TestCase): + CONFIG_PATH = "COCO-Detection/retinanet_R_50_FPN_1x.yaml" + + def test_inf_nan_data(self): + self.model.eval() + self.model.score_threshold = -999999999 + for tensor in [self._inf_tensor, self._nan_tensor]: + images = ImageList(tensor(1, 3, 512, 512), [(510, 510)]) + features = [ + tensor(1, 256, 128, 128), + tensor(1, 256, 64, 64), + tensor(1, 256, 32, 32), + tensor(1, 256, 16, 16), + tensor(1, 256, 8, 8), + ] + anchors = self.model.anchor_generator(features) + box_cls, box_delta = self.model.head(features) + box_cls = [tensor(*k.shape) for k in box_cls] + box_delta = [tensor(*k.shape) for k in box_delta] + det = self.model.inference(box_cls, box_delta, anchors, images.image_sizes) + # all predictions (if any) are infinite or nan + if len(det[0]): + self.assertTrue(torch.isfinite(det[0].pred_boxes.tensor).sum() == 0) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_heads.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_heads.py new file mode 100644 index 0000000..5a06303 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_heads.py @@ -0,0 +1,108 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest +import torch + +from detectron2.config import get_cfg +from detectron2.modeling.backbone import build_backbone +from detectron2.modeling.proposal_generator.build import build_proposal_generator +from detectron2.modeling.roi_heads import build_roi_heads +from detectron2.structures import Boxes, ImageList, Instances, RotatedBoxes +from detectron2.utils.events import EventStorage + +logger = logging.getLogger(__name__) + + +class ROIHeadsTest(unittest.TestCase): + def test_roi_heads(self): + torch.manual_seed(121) + cfg = get_cfg() + cfg.MODEL.ROI_HEADS.NAME = "StandardROIHeads" + cfg.MODEL.ROI_BOX_HEAD.NAME = "FastRCNNConvFCHead" + cfg.MODEL.ROI_BOX_HEAD.NUM_FC = 2 + cfg.MODEL.ROI_BOX_HEAD.POOLER_TYPE = "ROIAlignV2" + cfg.MODEL.ROI_BOX_HEAD.BBOX_REG_WEIGHTS = (10, 10, 5, 5) + backbone = build_backbone(cfg) + num_images = 2 + images_tensor = torch.rand(num_images, 20, 30) + image_sizes = [(10, 10), (20, 30)] + images = ImageList(images_tensor, image_sizes) + num_channels = 1024 + features = {"res4": torch.rand(num_images, num_channels, 1, 2)} + + image_shape = (15, 15) + gt_boxes0 = torch.tensor([[1, 1, 3, 3], [2, 2, 6, 6]], dtype=torch.float32) + gt_instance0 = Instances(image_shape) + gt_instance0.gt_boxes = Boxes(gt_boxes0) + gt_instance0.gt_classes = torch.tensor([2, 1]) + gt_boxes1 = torch.tensor([[1, 5, 2, 8], [7, 3, 10, 5]], dtype=torch.float32) + gt_instance1 = Instances(image_shape) + gt_instance1.gt_boxes = Boxes(gt_boxes1) + gt_instance1.gt_classes = torch.tensor([1, 2]) + gt_instances = [gt_instance0, gt_instance1] + + proposal_generator = build_proposal_generator(cfg, backbone.output_shape()) + roi_heads = build_roi_heads(cfg, backbone.output_shape()) + + with EventStorage(): # capture events in a new storage to discard them + proposals, proposal_losses = proposal_generator(images, features, gt_instances) + _, detector_losses = roi_heads(images, features, proposals, gt_instances) + + expected_losses = { + "loss_cls": torch.tensor(4.4236516953), + "loss_box_reg": torch.tensor(0.0091214813), + } + for name in expected_losses.keys(): + self.assertTrue(torch.allclose(detector_losses[name], expected_losses[name])) + + def test_rroi_heads(self): + torch.manual_seed(121) + cfg = get_cfg() + cfg.MODEL.PROPOSAL_GENERATOR.NAME = "RRPN" + cfg.MODEL.ANCHOR_GENERATOR.NAME = "RotatedAnchorGenerator" + cfg.MODEL.ROI_HEADS.NAME = "RROIHeads" + cfg.MODEL.ROI_BOX_HEAD.NAME = "FastRCNNConvFCHead" + cfg.MODEL.ROI_BOX_HEAD.NUM_FC = 2 + cfg.MODEL.RPN.BBOX_REG_WEIGHTS = (1, 1, 1, 1, 1) + cfg.MODEL.RPN.HEAD_NAME = "StandardRPNHead" + cfg.MODEL.ROI_BOX_HEAD.POOLER_TYPE = "ROIAlignRotated" + cfg.MODEL.ROI_BOX_HEAD.BBOX_REG_WEIGHTS = (10, 10, 5, 5, 1) + backbone = build_backbone(cfg) + num_images = 2 + images_tensor = torch.rand(num_images, 20, 30) + image_sizes = [(10, 10), (20, 30)] + images = ImageList(images_tensor, image_sizes) + num_channels = 1024 + features = {"res4": torch.rand(num_images, num_channels, 1, 2)} + + image_shape = (15, 15) + gt_boxes0 = torch.tensor([[2, 2, 2, 2, 30], [4, 4, 4, 4, 0]], dtype=torch.float32) + gt_instance0 = Instances(image_shape) + gt_instance0.gt_boxes = RotatedBoxes(gt_boxes0) + gt_instance0.gt_classes = torch.tensor([2, 1]) + gt_boxes1 = torch.tensor([[1.5, 5.5, 1, 3, 0], [8.5, 4, 3, 2, -50]], dtype=torch.float32) + gt_instance1 = Instances(image_shape) + gt_instance1.gt_boxes = RotatedBoxes(gt_boxes1) + gt_instance1.gt_classes = torch.tensor([1, 2]) + gt_instances = [gt_instance0, gt_instance1] + + proposal_generator = build_proposal_generator(cfg, backbone.output_shape()) + roi_heads = build_roi_heads(cfg, backbone.output_shape()) + + with EventStorage(): # capture events in a new storage to discard them + proposals, proposal_losses = proposal_generator(images, features, gt_instances) + _, detector_losses = roi_heads(images, features, proposals, gt_instances) + + expected_losses = { + "loss_cls": torch.tensor(4.381618499755859), + "loss_box_reg": torch.tensor(0.0011829272843897343), + } + for name in expected_losses.keys(): + err_msg = "detector_losses[{}] = {}, expected losses = {}".format( + name, detector_losses[name], expected_losses[name] + ) + self.assertTrue(torch.allclose(detector_losses[name], expected_losses[name]), err_msg) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_pooler.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_pooler.py new file mode 100644 index 0000000..9aa3825 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_roi_pooler.py @@ -0,0 +1,85 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest +import torch + +from detectron2.modeling.poolers import ROIPooler +from detectron2.structures import Boxes, RotatedBoxes + +logger = logging.getLogger(__name__) + + +class TestROIPooler(unittest.TestCase): + def _rand_boxes(self, num_boxes, x_max, y_max): + coords = torch.rand(num_boxes, 4) + coords[:, 0] *= x_max + coords[:, 1] *= y_max + coords[:, 2] *= x_max + coords[:, 3] *= y_max + boxes = torch.zeros(num_boxes, 4) + boxes[:, 0] = torch.min(coords[:, 0], coords[:, 2]) + boxes[:, 1] = torch.min(coords[:, 1], coords[:, 3]) + boxes[:, 2] = torch.max(coords[:, 0], coords[:, 2]) + boxes[:, 3] = torch.max(coords[:, 1], coords[:, 3]) + return boxes + + def _test_roialignv2_roialignrotated_match(self, device): + pooler_resolution = 14 + canonical_level = 4 + canonical_scale_factor = 2 ** canonical_level + pooler_scales = (1.0 / canonical_scale_factor,) + sampling_ratio = 0 + + N, C, H, W = 2, 4, 10, 8 + N_rois = 10 + std = 11 + mean = 0 + feature = (torch.rand(N, C, H, W) - 0.5) * 2 * std + mean + + features = [feature.to(device)] + + rois = [] + rois_rotated = [] + for _ in range(N): + boxes = self._rand_boxes( + num_boxes=N_rois, x_max=W * canonical_scale_factor, y_max=H * canonical_scale_factor + ) + + rotated_boxes = torch.zeros(N_rois, 5) + rotated_boxes[:, 0] = (boxes[:, 0] + boxes[:, 2]) / 2.0 + rotated_boxes[:, 1] = (boxes[:, 1] + boxes[:, 3]) / 2.0 + rotated_boxes[:, 2] = boxes[:, 2] - boxes[:, 0] + rotated_boxes[:, 3] = boxes[:, 3] - boxes[:, 1] + rois.append(Boxes(boxes).to(device)) + rois_rotated.append(RotatedBoxes(rotated_boxes).to(device)) + + roialignv2_pooler = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type="ROIAlignV2", + ) + + roialignv2_out = roialignv2_pooler(features, rois) + + roialignrotated_pooler = ROIPooler( + output_size=pooler_resolution, + scales=pooler_scales, + sampling_ratio=sampling_ratio, + pooler_type="ROIAlignRotated", + ) + + roialignrotated_out = roialignrotated_pooler(features, rois_rotated) + + self.assertTrue(torch.allclose(roialignv2_out, roialignrotated_out, atol=1e-4)) + + def test_roialignv2_roialignrotated_match_cpu(self): + self._test_roialignv2_roialignrotated_match(device="cpu") + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_roialignv2_roialignrotated_match_cuda(self): + self._test_roialignv2_roialignrotated_match(device="cuda") + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_rpn.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_rpn.py new file mode 100644 index 0000000..967d210 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/modeling/test_rpn.py @@ -0,0 +1,234 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest +import torch + +from detectron2.config import get_cfg +from detectron2.modeling.backbone import build_backbone +from detectron2.modeling.proposal_generator.build import build_proposal_generator +from detectron2.modeling.proposal_generator.rpn_outputs import find_top_rpn_proposals +from detectron2.structures import Boxes, ImageList, Instances, RotatedBoxes +from detectron2.utils.events import EventStorage + +logger = logging.getLogger(__name__) + + +class RPNTest(unittest.TestCase): + def test_rpn(self): + torch.manual_seed(121) + cfg = get_cfg() + cfg.MODEL.PROPOSAL_GENERATOR.NAME = "RPN" + cfg.MODEL.ANCHOR_GENERATOR.NAME = "DefaultAnchorGenerator" + cfg.MODEL.RPN.BBOX_REG_WEIGHTS = (1, 1, 1, 1) + backbone = build_backbone(cfg) + proposal_generator = build_proposal_generator(cfg, backbone.output_shape()) + num_images = 2 + images_tensor = torch.rand(num_images, 20, 30) + image_sizes = [(10, 10), (20, 30)] + images = ImageList(images_tensor, image_sizes) + image_shape = (15, 15) + num_channels = 1024 + features = {"res4": torch.rand(num_images, num_channels, 1, 2)} + gt_boxes = torch.tensor([[1, 1, 3, 3], [2, 2, 6, 6]], dtype=torch.float32) + gt_instances = Instances(image_shape) + gt_instances.gt_boxes = Boxes(gt_boxes) + with EventStorage(): # capture events in a new storage to discard them + proposals, proposal_losses = proposal_generator( + images, features, [gt_instances[0], gt_instances[1]] + ) + + expected_losses = { + "loss_rpn_cls": torch.tensor(0.0804563984), + "loss_rpn_loc": torch.tensor(0.0990132466), + } + for name in expected_losses.keys(): + err_msg = "proposal_losses[{}] = {}, expected losses = {}".format( + name, proposal_losses[name], expected_losses[name] + ) + self.assertTrue(torch.allclose(proposal_losses[name], expected_losses[name]), err_msg) + + expected_proposal_boxes = [ + Boxes(torch.tensor([[0, 0, 10, 10], [7.3365392685, 0, 10, 10]])), + Boxes( + torch.tensor( + [ + [0, 0, 30, 20], + [0, 0, 16.7862777710, 13.1362524033], + [0, 0, 30, 13.3173446655], + [0, 0, 10.8602609634, 20], + [7.7165775299, 0, 27.3875980377, 20], + ] + ) + ), + ] + + expected_objectness_logits = [ + torch.tensor([0.1225359365, -0.0133192837]), + torch.tensor([0.1415634006, 0.0989848152, 0.0565387346, -0.0072308783, -0.0428492837]), + ] + + for proposal, expected_proposal_box, im_size, expected_objectness_logit in zip( + proposals, expected_proposal_boxes, image_sizes, expected_objectness_logits + ): + self.assertEqual(len(proposal), len(expected_proposal_box)) + self.assertEqual(proposal.image_size, im_size) + self.assertTrue( + torch.allclose(proposal.proposal_boxes.tensor, expected_proposal_box.tensor) + ) + self.assertTrue(torch.allclose(proposal.objectness_logits, expected_objectness_logit)) + + def test_rrpn(self): + torch.manual_seed(121) + cfg = get_cfg() + cfg.MODEL.PROPOSAL_GENERATOR.NAME = "RRPN" + cfg.MODEL.ANCHOR_GENERATOR.NAME = "RotatedAnchorGenerator" + cfg.MODEL.ANCHOR_GENERATOR.SIZES = [[32, 64]] + cfg.MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS = [[0.25, 1]] + cfg.MODEL.ANCHOR_GENERATOR.ANGLES = [[0, 60]] + cfg.MODEL.RPN.BBOX_REG_WEIGHTS = (1, 1, 1, 1, 1) + cfg.MODEL.RPN.HEAD_NAME = "StandardRPNHead" + backbone = build_backbone(cfg) + proposal_generator = build_proposal_generator(cfg, backbone.output_shape()) + num_images = 2 + images_tensor = torch.rand(num_images, 20, 30) + image_sizes = [(10, 10), (20, 30)] + images = ImageList(images_tensor, image_sizes) + image_shape = (15, 15) + num_channels = 1024 + features = {"res4": torch.rand(num_images, num_channels, 1, 2)} + gt_boxes = torch.tensor([[2, 2, 2, 2, 0], [4, 4, 4, 4, 0]], dtype=torch.float32) + gt_instances = Instances(image_shape) + gt_instances.gt_boxes = RotatedBoxes(gt_boxes) + with EventStorage(): # capture events in a new storage to discard them + proposals, proposal_losses = proposal_generator( + images, features, [gt_instances[0], gt_instances[1]] + ) + + expected_losses = { + "loss_rpn_cls": torch.tensor(0.043263837695121765), + "loss_rpn_loc": torch.tensor(0.14432406425476074), + } + for name in expected_losses.keys(): + err_msg = "proposal_losses[{}] = {}, expected losses = {}".format( + name, proposal_losses[name], expected_losses[name] + ) + self.assertTrue(torch.allclose(proposal_losses[name], expected_losses[name]), err_msg) + + expected_proposal_boxes = [ + RotatedBoxes( + torch.tensor( + [ + [0.60189795, 1.24095452, 61.98131943, 18.03621292, -4.07244873], + [15.64940453, 1.69624567, 59.59749603, 16.34339333, 2.62692475], + [-3.02982378, -2.69752932, 67.90952301, 59.62455750, 59.97010040], + [16.71863365, 1.98309708, 35.61507797, 32.81484985, 62.92267227], + [0.49432933, -7.92979717, 67.77606201, 62.93098450, -1.85656738], + [8.00880814, 1.36017394, 121.81007385, 32.74150467, 50.44297409], + [16.44299889, -4.82221127, 63.39775848, 61.22503662, 54.12270737], + [5.00000000, 5.00000000, 10.00000000, 10.00000000, -0.76943970], + [17.64130402, -0.98095351, 61.40377808, 16.28918839, 55.53118134], + [0.13016054, 4.60568953, 35.80157471, 32.30180359, 62.52872086], + [-4.26460743, 0.39604485, 124.30079651, 31.84611320, -1.58203125], + [7.52815342, -0.91636634, 62.39784622, 15.45565224, 60.79549789], + ] + ) + ), + RotatedBoxes( + torch.tensor( + [ + [0.07734215, 0.81635046, 65.33510590, 17.34688377, -1.51821899], + [-3.41833067, -3.11320257, 64.17595673, 60.55617905, 58.27033234], + [20.67383385, -6.16561556, 63.60531998, 62.52315903, 54.85546494], + [15.00000000, 10.00000000, 30.00000000, 20.00000000, -0.18218994], + [9.22646523, -6.84775209, 62.09895706, 65.46472931, -2.74307251], + [15.00000000, 4.93451595, 30.00000000, 9.86903191, -0.60272217], + [8.88342094, 2.65560246, 120.95362854, 32.45022202, 55.75970078], + [16.39088631, 2.33887148, 34.78761292, 35.61492920, 60.81977463], + [9.78298569, 10.00000000, 19.56597137, 20.00000000, -0.86660767], + [1.28576660, 5.49873352, 34.93610382, 33.22600174, 60.51599884], + [17.58912468, -1.63270092, 62.96052551, 16.45713997, 52.91245270], + [5.64749718, -1.90428460, 62.37649155, 16.19474792, 61.09543991], + [0.82255805, 2.34931135, 118.83985901, 32.83671188, 56.50753784], + [-5.33874989, 1.64404404, 125.28501892, 33.35424042, -2.80731201], + ] + ) + ), + ] + + expected_objectness_logits = [ + torch.tensor( + [ + 0.10111768, + 0.09112845, + 0.08466332, + 0.07589971, + 0.06650183, + 0.06350251, + 0.04299347, + 0.01864817, + 0.00986163, + 0.00078543, + -0.04573630, + -0.04799230, + ] + ), + torch.tensor( + [ + 0.11373727, + 0.09377633, + 0.05281663, + 0.05143715, + 0.04040275, + 0.03250912, + 0.01307789, + 0.01177734, + 0.00038105, + -0.00540255, + -0.01194804, + -0.01461012, + -0.03061717, + -0.03599222, + ] + ), + ] + + torch.set_printoptions(precision=8, sci_mode=False) + + for proposal, expected_proposal_box, im_size, expected_objectness_logit in zip( + proposals, expected_proposal_boxes, image_sizes, expected_objectness_logits + ): + self.assertEqual(len(proposal), len(expected_proposal_box)) + self.assertEqual(proposal.image_size, im_size) + # It seems that there's some randomness in the result across different machines: + # This test can be run on a local machine for 100 times with exactly the same result, + # However, a different machine might produce slightly different results, + # thus the atol here. + err_msg = "computed proposal boxes = {}, expected {}".format( + proposal.proposal_boxes.tensor, expected_proposal_box.tensor + ) + self.assertTrue( + torch.allclose( + proposal.proposal_boxes.tensor, expected_proposal_box.tensor, atol=1e-5 + ), + err_msg, + ) + + err_msg = "computed objectness logits = {}, expected {}".format( + proposal.objectness_logits, expected_objectness_logit + ) + self.assertTrue( + torch.allclose(proposal.objectness_logits, expected_objectness_logit, atol=1e-5), + err_msg, + ) + + def test_rpn_proposals_inf(self): + N, Hi, Wi, A = 3, 3, 3, 3 + proposals = [torch.rand(N, Hi * Wi * A, 4)] + pred_logits = [torch.rand(N, Hi * Wi * A)] + pred_logits[0][1][3:5].fill_(float("inf")) + images = ImageList.from_tensors([torch.rand(3, 10, 10)] * 3) + find_top_rpn_proposals(proposals, pred_logits, images, 0.5, 1000, 1000, 0, False) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/__init__.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_boxes.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_boxes.py new file mode 100644 index 0000000..4d33c3b --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_boxes.py @@ -0,0 +1,182 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import json +import math +import numpy as np +import unittest +import torch + +from detectron2.structures import Boxes, BoxMode, pairwise_iou + + +class TestBoxMode(unittest.TestCase): + def _convert_xy_to_wh(self, x): + return BoxMode.convert(x, BoxMode.XYXY_ABS, BoxMode.XYWH_ABS) + + def _convert_xywha_to_xyxy(self, x): + return BoxMode.convert(x, BoxMode.XYWHA_ABS, BoxMode.XYXY_ABS) + + def _convert_xywh_to_xywha(self, x): + return BoxMode.convert(x, BoxMode.XYWH_ABS, BoxMode.XYWHA_ABS) + + def test_box_convert_list(self): + for tp in [list, tuple]: + box = tp([5.0, 5.0, 10.0, 10.0]) + output = self._convert_xy_to_wh(box) + self.assertIsInstance(output, tp) + self.assertIsInstance(output[0], float) + self.assertEqual(output, tp([5.0, 5.0, 5.0, 5.0])) + + with self.assertRaises(Exception): + self._convert_xy_to_wh([box]) + + def test_box_convert_array(self): + box = np.asarray([[5, 5, 10, 10], [1, 1, 2, 3]]) + output = self._convert_xy_to_wh(box) + self.assertEqual(output.dtype, box.dtype) + self.assertEqual(output.shape, box.shape) + self.assertTrue((output[0] == [5, 5, 5, 5]).all()) + self.assertTrue((output[1] == [1, 1, 1, 2]).all()) + + def test_box_convert_cpu_tensor(self): + box = torch.tensor([[5, 5, 10, 10], [1, 1, 2, 3]]) + output = self._convert_xy_to_wh(box) + self.assertEqual(output.dtype, box.dtype) + self.assertEqual(output.shape, box.shape) + output = output.numpy() + self.assertTrue((output[0] == [5, 5, 5, 5]).all()) + self.assertTrue((output[1] == [1, 1, 1, 2]).all()) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_box_convert_cuda_tensor(self): + box = torch.tensor([[5, 5, 10, 10], [1, 1, 2, 3]]).cuda() + output = self._convert_xy_to_wh(box) + self.assertEqual(output.dtype, box.dtype) + self.assertEqual(output.shape, box.shape) + self.assertEqual(output.device, box.device) + output = output.cpu().numpy() + self.assertTrue((output[0] == [5, 5, 5, 5]).all()) + self.assertTrue((output[1] == [1, 1, 1, 2]).all()) + + def test_box_convert_xywha_to_xyxy_list(self): + for tp in [list, tuple]: + box = tp([50, 50, 30, 20, 0]) + output = self._convert_xywha_to_xyxy(box) + self.assertIsInstance(output, tp) + self.assertEqual(output, tp([35, 40, 65, 60])) + + with self.assertRaises(Exception): + self._convert_xywha_to_xyxy([box]) + + def test_box_convert_xywha_to_xyxy_array(self): + for dtype in [np.float64, np.float32]: + box = np.asarray( + [ + [50, 50, 30, 20, 0], + [50, 50, 30, 20, 90], + [1, 1, math.sqrt(2), math.sqrt(2), -45], + ], + dtype=dtype, + ) + output = self._convert_xywha_to_xyxy(box) + self.assertEqual(output.dtype, box.dtype) + expected = np.asarray([[35, 40, 65, 60], [40, 35, 60, 65], [0, 0, 2, 2]], dtype=dtype) + self.assertTrue(np.allclose(output, expected, atol=1e-6), "output={}".format(output)) + + def test_box_convert_xywha_to_xyxy_tensor(self): + for dtype in [torch.float32, torch.float64]: + box = torch.tensor( + [ + [50, 50, 30, 20, 0], + [50, 50, 30, 20, 90], + [1, 1, math.sqrt(2), math.sqrt(2), -45], + ], + dtype=dtype, + ) + output = self._convert_xywha_to_xyxy(box) + self.assertEqual(output.dtype, box.dtype) + expected = torch.tensor([[35, 40, 65, 60], [40, 35, 60, 65], [0, 0, 2, 2]], dtype=dtype) + + self.assertTrue(torch.allclose(output, expected, atol=1e-6), "output={}".format(output)) + + def test_box_convert_xywh_to_xywha_list(self): + for tp in [list, tuple]: + box = tp([50, 50, 30, 20]) + output = self._convert_xywh_to_xywha(box) + self.assertIsInstance(output, tp) + self.assertEqual(output, tp([65, 60, 30, 20, 0])) + + with self.assertRaises(Exception): + self._convert_xywh_to_xywha([box]) + + def test_box_convert_xywh_to_xywha_array(self): + for dtype in [np.float64, np.float32]: + box = np.asarray([[30, 40, 70, 60], [30, 40, 60, 70], [-1, -1, 2, 2]], dtype=dtype) + output = self._convert_xywh_to_xywha(box) + self.assertEqual(output.dtype, box.dtype) + expected = np.asarray( + [[65, 70, 70, 60, 0], [60, 75, 60, 70, 0], [0, 0, 2, 2, 0]], dtype=dtype + ) + self.assertTrue(np.allclose(output, expected, atol=1e-6), "output={}".format(output)) + + def test_box_convert_xywh_to_xywha_tensor(self): + for dtype in [torch.float32, torch.float64]: + box = torch.tensor([[30, 40, 70, 60], [30, 40, 60, 70], [-1, -1, 2, 2]], dtype=dtype) + output = self._convert_xywh_to_xywha(box) + self.assertEqual(output.dtype, box.dtype) + expected = torch.tensor( + [[65, 70, 70, 60, 0], [60, 75, 60, 70, 0], [0, 0, 2, 2, 0]], dtype=dtype + ) + + self.assertTrue(torch.allclose(output, expected, atol=1e-6), "output={}".format(output)) + + def test_json_serializable(self): + payload = {"box_mode": BoxMode.XYWH_REL} + try: + json.dumps(payload) + except Exception: + self.fail("JSON serialization failed") + + def test_json_deserializable(self): + payload = '{"box_mode": 2}' + obj = json.loads(payload) + try: + obj["box_mode"] = BoxMode(obj["box_mode"]) + except Exception: + self.fail("JSON deserialization failed") + + +class TestBoxIOU(unittest.TestCase): + def test_pairwise_iou(self): + boxes1 = torch.tensor([[0.0, 0.0, 1.0, 1.0], [0.0, 0.0, 1.0, 1.0]]) + + boxes2 = torch.tensor( + [ + [0.0, 0.0, 1.0, 1.0], + [0.0, 0.0, 0.5, 1.0], + [0.0, 0.0, 1.0, 0.5], + [0.0, 0.0, 0.5, 0.5], + [0.5, 0.5, 1.0, 1.0], + [0.5, 0.5, 1.5, 1.5], + ] + ) + + expected_ious = torch.tensor( + [ + [1.0, 0.5, 0.5, 0.25, 0.25, 0.25 / (2 - 0.25)], + [1.0, 0.5, 0.5, 0.25, 0.25, 0.25 / (2 - 0.25)], + ] + ) + + ious = pairwise_iou(Boxes(boxes1), Boxes(boxes2)) + + self.assertTrue(torch.allclose(ious, expected_ious)) + + +class TestBoxes(unittest.TestCase): + def test_empty_cat(self): + x = Boxes.cat([]) + self.assertTrue(x.tensor.shape, (0, 4)) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_imagelist.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_imagelist.py new file mode 100644 index 0000000..abeb355 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_imagelist.py @@ -0,0 +1,38 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import unittest +from typing import Sequence +import torch + +from detectron2.structures import ImageList + + +class TestImageList(unittest.TestCase): + def test_imagelist_padding_shape(self): + class TensorToImageList(torch.nn.Module): + def forward(self, tensors: Sequence[torch.Tensor]): + return ImageList.from_tensors(tensors, 4).tensor + + func = torch.jit.trace( + TensorToImageList(), ([torch.ones((3, 10, 10), dtype=torch.float32)],) + ) + ret = func([torch.ones((3, 15, 20), dtype=torch.float32)]) + self.assertEqual(list(ret.shape), [1, 3, 16, 20], str(ret.shape)) + + func = torch.jit.trace( + TensorToImageList(), + ( + [ + torch.ones((3, 16, 10), dtype=torch.float32), + torch.ones((3, 13, 11), dtype=torch.float32), + ], + ), + ) + ret = func( + [ + torch.ones((3, 25, 20), dtype=torch.float32), + torch.ones((3, 10, 10), dtype=torch.float32), + ] + ) + # does not support calling with different #images + self.assertEqual(list(ret.shape), [2, 3, 28, 20], str(ret.shape)) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_instances.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_instances.py new file mode 100644 index 0000000..79c5249 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_instances.py @@ -0,0 +1,25 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import unittest +import torch + +from detectron2.structures import Instances + + +class TestInstancesIndexing(unittest.TestCase): + def test_int_indexing(self): + attr1 = torch.tensor([[0.0, 0.0, 1.0], [0.0, 0.0, 0.5], [0.0, 0.0, 1.0], [0.0, 0.5, 0.5]]) + attr2 = torch.tensor([0.1, 0.2, 0.3, 0.4]) + instances = Instances((100, 100)) + instances.attr1 = attr1 + instances.attr2 = attr2 + for i in range(-len(instances), len(instances)): + inst = instances[i] + self.assertEqual((inst.attr1 == attr1[i]).all(), True) + self.assertEqual((inst.attr2 == attr2[i]).all(), True) + + self.assertRaises(IndexError, lambda: instances[len(instances)]) + self.assertRaises(IndexError, lambda: instances[-len(instances) - 1]) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_rotated_boxes.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_rotated_boxes.py new file mode 100644 index 0000000..575ac48 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/structures/test_rotated_boxes.py @@ -0,0 +1,357 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +from __future__ import absolute_import, division, print_function, unicode_literals +import logging +import math +import random +import unittest +import torch +from fvcore.common.benchmark import benchmark + +from detectron2.layers.rotated_boxes import pairwise_iou_rotated +from detectron2.structures.boxes import Boxes +from detectron2.structures.rotated_boxes import RotatedBoxes, pairwise_iou + +logger = logging.getLogger(__name__) + + +class TestRotatedBoxesLayer(unittest.TestCase): + def test_iou_0_dim_cpu(self): + boxes1 = torch.rand(0, 5, dtype=torch.float32) + boxes2 = torch.rand(10, 5, dtype=torch.float32) + expected_ious = torch.zeros(0, 10, dtype=torch.float32) + ious = pairwise_iou_rotated(boxes1, boxes2) + self.assertTrue(torch.allclose(ious, expected_ious)) + + boxes1 = torch.rand(10, 5, dtype=torch.float32) + boxes2 = torch.rand(0, 5, dtype=torch.float32) + expected_ious = torch.zeros(10, 0, dtype=torch.float32) + ious = pairwise_iou_rotated(boxes1, boxes2) + self.assertTrue(torch.allclose(ious, expected_ious)) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_iou_0_dim_cuda(self): + boxes1 = torch.rand(0, 5, dtype=torch.float32) + boxes2 = torch.rand(10, 5, dtype=torch.float32) + expected_ious = torch.zeros(0, 10, dtype=torch.float32) + ious_cuda = pairwise_iou_rotated(boxes1.cuda(), boxes2.cuda()) + self.assertTrue(torch.allclose(ious_cuda.cpu(), expected_ious)) + + boxes1 = torch.rand(10, 5, dtype=torch.float32) + boxes2 = torch.rand(0, 5, dtype=torch.float32) + expected_ious = torch.zeros(10, 0, dtype=torch.float32) + ious_cuda = pairwise_iou_rotated(boxes1.cuda(), boxes2.cuda()) + self.assertTrue(torch.allclose(ious_cuda.cpu(), expected_ious)) + + def test_iou_half_overlap_cpu(self): + boxes1 = torch.tensor([[0.5, 0.5, 1.0, 1.0, 0.0]], dtype=torch.float32) + boxes2 = torch.tensor([[0.25, 0.5, 0.5, 1.0, 0.0]], dtype=torch.float32) + expected_ious = torch.tensor([[0.5]], dtype=torch.float32) + ious = pairwise_iou_rotated(boxes1, boxes2) + self.assertTrue(torch.allclose(ious, expected_ious)) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_iou_half_overlap_cuda(self): + boxes1 = torch.tensor([[0.5, 0.5, 1.0, 1.0, 0.0]], dtype=torch.float32) + boxes2 = torch.tensor([[0.25, 0.5, 0.5, 1.0, 0.0]], dtype=torch.float32) + expected_ious = torch.tensor([[0.5]], dtype=torch.float32) + ious_cuda = pairwise_iou_rotated(boxes1.cuda(), boxes2.cuda()) + self.assertTrue(torch.allclose(ious_cuda.cpu(), expected_ious)) + + def test_iou_precision(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + boxes1 = torch.tensor([[565, 565, 10, 10.0, 0]], dtype=torch.float32, device=device) + boxes2 = torch.tensor([[565, 565, 10, 8.3, 0]], dtype=torch.float32, device=device) + iou = 8.3 / 10.0 + expected_ious = torch.tensor([[iou]], dtype=torch.float32) + ious = pairwise_iou_rotated(boxes1, boxes2) + self.assertTrue(torch.allclose(ious.cpu(), expected_ious)) + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def test_iou_too_many_boxes_cuda(self): + s1, s2 = 5, 1289035 + boxes1 = torch.zeros(s1, 5) + boxes2 = torch.zeros(s2, 5) + ious_cuda = pairwise_iou_rotated(boxes1.cuda(), boxes2.cuda()) + self.assertTupleEqual(tuple(ious_cuda.shape), (s1, s2)) + + def test_iou_extreme(self): + # Cause floating point issues in cuda kernels (#1266) + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + boxes1 = torch.tensor([[160.0, 153.0, 230.0, 23.0, -37.0]], device=device) + boxes2 = torch.tensor( + [ + [ + -1.117407639806935e17, + 1.3858420478349148e18, + 1000.0000610351562, + 1000.0000610351562, + 1612.0, + ] + ], + device=device, + ) + ious = pairwise_iou_rotated(boxes1, boxes2) + self.assertTrue(ious.min() >= 0, ious) + + +class TestRotatedBoxesStructure(unittest.TestCase): + def test_clip_area_0_degree(self): + for _ in range(50): + num_boxes = 100 + boxes_5d = torch.zeros(num_boxes, 5) + boxes_5d[:, 0] = torch.FloatTensor(num_boxes).uniform_(-100, 500) + boxes_5d[:, 1] = torch.FloatTensor(num_boxes).uniform_(-100, 500) + boxes_5d[:, 2] = torch.FloatTensor(num_boxes).uniform_(0, 500) + boxes_5d[:, 3] = torch.FloatTensor(num_boxes).uniform_(0, 500) + # Convert from (x_ctr, y_ctr, w, h, 0) to (x1, y1, x2, y2) + boxes_4d = torch.zeros(num_boxes, 4) + boxes_4d[:, 0] = boxes_5d[:, 0] - boxes_5d[:, 2] / 2.0 + boxes_4d[:, 1] = boxes_5d[:, 1] - boxes_5d[:, 3] / 2.0 + boxes_4d[:, 2] = boxes_5d[:, 0] + boxes_5d[:, 2] / 2.0 + boxes_4d[:, 3] = boxes_5d[:, 1] + boxes_5d[:, 3] / 2.0 + + image_size = (500, 600) + test_boxes_4d = Boxes(boxes_4d) + test_boxes_5d = RotatedBoxes(boxes_5d) + # Before clip + areas_4d = test_boxes_4d.area() + areas_5d = test_boxes_5d.area() + self.assertTrue(torch.allclose(areas_4d, areas_5d, atol=1e-1, rtol=1e-5)) + # After clip + test_boxes_4d.clip(image_size) + test_boxes_5d.clip(image_size) + areas_4d = test_boxes_4d.area() + areas_5d = test_boxes_5d.area() + self.assertTrue(torch.allclose(areas_4d, areas_5d, atol=1e-1, rtol=1e-5)) + + def test_clip_area_arbitrary_angle(self): + num_boxes = 100 + boxes_5d = torch.zeros(num_boxes, 5) + boxes_5d[:, 0] = torch.FloatTensor(num_boxes).uniform_(-100, 500) + boxes_5d[:, 1] = torch.FloatTensor(num_boxes).uniform_(-100, 500) + boxes_5d[:, 2] = torch.FloatTensor(num_boxes).uniform_(0, 500) + boxes_5d[:, 3] = torch.FloatTensor(num_boxes).uniform_(0, 500) + boxes_5d[:, 4] = torch.FloatTensor(num_boxes).uniform_(-1800, 1800) + clip_angle_threshold = random.uniform(0, 180) + + image_size = (500, 600) + test_boxes_5d = RotatedBoxes(boxes_5d) + # Before clip + areas_before = test_boxes_5d.area() + # After clip + test_boxes_5d.clip(image_size, clip_angle_threshold) + areas_diff = test_boxes_5d.area() - areas_before + + # the areas should only decrease after clipping + self.assertTrue(torch.all(areas_diff <= 0)) + # whenever the box is clipped (thus the area shrinks), + # the angle for the box must be within the clip_angle_threshold + # Note that the clip function will normalize the angle range + # to be within (-180, 180] + self.assertTrue( + torch.all(torch.abs(boxes_5d[:, 4][torch.where(areas_diff < 0)]) < clip_angle_threshold) + ) + + def test_normalize_angles(self): + # torch.manual_seed(0) + for _ in range(50): + num_boxes = 100 + boxes_5d = torch.zeros(num_boxes, 5) + boxes_5d[:, 0] = torch.FloatTensor(num_boxes).uniform_(-100, 500) + boxes_5d[:, 1] = torch.FloatTensor(num_boxes).uniform_(-100, 500) + boxes_5d[:, 2] = torch.FloatTensor(num_boxes).uniform_(0, 500) + boxes_5d[:, 3] = torch.FloatTensor(num_boxes).uniform_(0, 500) + boxes_5d[:, 4] = torch.FloatTensor(num_boxes).uniform_(-1800, 1800) + rotated_boxes = RotatedBoxes(boxes_5d) + normalized_boxes = rotated_boxes.clone() + normalized_boxes.normalize_angles() + self.assertTrue(torch.all(normalized_boxes.tensor[:, 4] >= -180)) + self.assertTrue(torch.all(normalized_boxes.tensor[:, 4] < 180)) + # x, y, w, h should not change + self.assertTrue(torch.allclose(boxes_5d[:, :4], normalized_boxes.tensor[:, :4])) + # the cos/sin values of the angles should stay the same + + self.assertTrue( + torch.allclose( + torch.cos(boxes_5d[:, 4] * math.pi / 180), + torch.cos(normalized_boxes.tensor[:, 4] * math.pi / 180), + atol=1e-5, + ) + ) + + self.assertTrue( + torch.allclose( + torch.sin(boxes_5d[:, 4] * math.pi / 180), + torch.sin(normalized_boxes.tensor[:, 4] * math.pi / 180), + atol=1e-5, + ) + ) + + def test_pairwise_iou_0_degree(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + boxes1 = torch.tensor( + [[0.5, 0.5, 1.0, 1.0, 0.0], [0.5, 0.5, 1.0, 1.0, 0.0]], + dtype=torch.float32, + device=device, + ) + boxes2 = torch.tensor( + [ + [0.5, 0.5, 1.0, 1.0, 0.0], + [0.25, 0.5, 0.5, 1.0, 0.0], + [0.5, 0.25, 1.0, 0.5, 0.0], + [0.25, 0.25, 0.5, 0.5, 0.0], + [0.75, 0.75, 0.5, 0.5, 0.0], + [1.0, 1.0, 1.0, 1.0, 0.0], + ], + dtype=torch.float32, + device=device, + ) + expected_ious = torch.tensor( + [ + [1.0, 0.5, 0.5, 0.25, 0.25, 0.25 / (2 - 0.25)], + [1.0, 0.5, 0.5, 0.25, 0.25, 0.25 / (2 - 0.25)], + ], + dtype=torch.float32, + device=device, + ) + ious = pairwise_iou(RotatedBoxes(boxes1), RotatedBoxes(boxes2)) + self.assertTrue(torch.allclose(ious, expected_ious)) + + def test_pairwise_iou_45_degrees(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + boxes1 = torch.tensor( + [ + [1, 1, math.sqrt(2), math.sqrt(2), 45], + [1, 1, 2 * math.sqrt(2), 2 * math.sqrt(2), -45], + ], + dtype=torch.float32, + device=device, + ) + boxes2 = torch.tensor([[1, 1, 2, 2, 0]], dtype=torch.float32, device=device) + expected_ious = torch.tensor([[0.5], [0.5]], dtype=torch.float32, device=device) + ious = pairwise_iou(RotatedBoxes(boxes1), RotatedBoxes(boxes2)) + self.assertTrue(torch.allclose(ious, expected_ious)) + + def test_pairwise_iou_orthogonal(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + boxes1 = torch.tensor([[5, 5, 10, 6, 55]], dtype=torch.float32, device=device) + boxes2 = torch.tensor([[5, 5, 10, 6, -35]], dtype=torch.float32, device=device) + iou = (6.0 * 6.0) / (6.0 * 6.0 + 4.0 * 6.0 + 4.0 * 6.0) + expected_ious = torch.tensor([[iou]], dtype=torch.float32, device=device) + ious = pairwise_iou(RotatedBoxes(boxes1), RotatedBoxes(boxes2)) + self.assertTrue(torch.allclose(ious, expected_ious)) + + def test_pairwise_iou_large_close_boxes(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + boxes1 = torch.tensor( + [[299.500000, 417.370422, 600.000000, 364.259186, 27.1828]], + dtype=torch.float32, + device=device, + ) + boxes2 = torch.tensor( + [[299.500000, 417.370422, 600.000000, 364.259155, 27.1828]], + dtype=torch.float32, + device=device, + ) + iou = 364.259155 / 364.259186 + expected_ious = torch.tensor([[iou]], dtype=torch.float32, device=device) + ious = pairwise_iou(RotatedBoxes(boxes1), RotatedBoxes(boxes2)) + self.assertTrue(torch.allclose(ious, expected_ious)) + + def test_pairwise_iou_many_boxes(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + num_boxes1 = 100 + num_boxes2 = 200 + boxes1 = torch.stack( + [ + torch.tensor( + [5 + 20 * i, 5 + 20 * i, 10, 10, 0], dtype=torch.float32, device=device + ) + for i in range(num_boxes1) + ] + ) + boxes2 = torch.stack( + [ + torch.tensor( + [5 + 20 * i, 5 + 20 * i, 10, 1 + 9 * i / num_boxes2, 0], + dtype=torch.float32, + device=device, + ) + for i in range(num_boxes2) + ] + ) + expected_ious = torch.zeros(num_boxes1, num_boxes2, dtype=torch.float32, device=device) + for i in range(min(num_boxes1, num_boxes2)): + expected_ious[i][i] = (1 + 9 * i / num_boxes2) / 10.0 + ious = pairwise_iou(RotatedBoxes(boxes1), RotatedBoxes(boxes2)) + self.assertTrue(torch.allclose(ious, expected_ious)) + + def test_pairwise_iou_issue1207_simplified(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + # Simplified test case of D2-issue-1207 + boxes1 = torch.tensor([[3, 3, 8, 2, -45.0]], device=device) + boxes2 = torch.tensor([[6, 0, 8, 2, -45.0]], device=device) + iou = 0.0 + expected_ious = torch.tensor([[iou]], dtype=torch.float32, device=device) + + ious = pairwise_iou(RotatedBoxes(boxes1), RotatedBoxes(boxes2)) + self.assertTrue(torch.allclose(ious, expected_ious)) + + def test_pairwise_iou_issue1207(self): + for device in ["cpu"] + ["cuda"] if torch.cuda.is_available() else []: + # The original test case in D2-issue-1207 + boxes1 = torch.tensor([[160.0, 153.0, 230.0, 23.0, -37.0]], device=device) + boxes2 = torch.tensor([[190.0, 127.0, 80.0, 21.0, -46.0]], device=device) + + iou = 0.0 + expected_ious = torch.tensor([[iou]], dtype=torch.float32, device=device) + + ious = pairwise_iou(RotatedBoxes(boxes1), RotatedBoxes(boxes2)) + self.assertTrue(torch.allclose(ious, expected_ious)) + + def test_empty_cat(self): + x = RotatedBoxes.cat([]) + self.assertTrue(x.tensor.shape, (0, 5)) + + +def benchmark_rotated_iou(): + num_boxes1 = 200 + num_boxes2 = 500 + boxes1 = torch.stack( + [ + torch.tensor([5 + 20 * i, 5 + 20 * i, 10, 10, 0], dtype=torch.float32) + for i in range(num_boxes1) + ] + ) + boxes2 = torch.stack( + [ + torch.tensor( + [5 + 20 * i, 5 + 20 * i, 10, 1 + 9 * i / num_boxes2, 0], dtype=torch.float32 + ) + for i in range(num_boxes2) + ] + ) + + def func(dev, n=1): + b1 = boxes1.to(device=dev) + b2 = boxes2.to(device=dev) + + def bench(): + for _ in range(n): + pairwise_iou_rotated(b1, b2) + if dev.type == "cuda": + torch.cuda.synchronize() + + return bench + + # only run it once per timed loop, since it's slow + args = [{"dev": torch.device("cpu"), "n": 1}] + if torch.cuda.is_available(): + args.append({"dev": torch.device("cuda"), "n": 10}) + + benchmark(func, "rotated_iou", args, warmup_iters=3) + + +if __name__ == "__main__": + unittest.main() + benchmark_rotated_iou() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/test_checkpoint.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_checkpoint.py new file mode 100644 index 0000000..725b488 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_checkpoint.py @@ -0,0 +1,48 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import unittest +from collections import OrderedDict +import torch +from torch import nn + +from detectron2.checkpoint.c2_model_loading import align_and_update_state_dicts +from detectron2.utils.logger import setup_logger + + +class TestCheckpointer(unittest.TestCase): + def setUp(self): + setup_logger() + + def create_complex_model(self): + m = nn.Module() + m.block1 = nn.Module() + m.block1.layer1 = nn.Linear(2, 3) + m.layer2 = nn.Linear(3, 2) + m.res = nn.Module() + m.res.layer2 = nn.Linear(3, 2) + + state_dict = OrderedDict() + state_dict["layer1.weight"] = torch.rand(3, 2) + state_dict["layer1.bias"] = torch.rand(3) + state_dict["layer2.weight"] = torch.rand(2, 3) + state_dict["layer2.bias"] = torch.rand(2) + state_dict["res.layer2.weight"] = torch.rand(2, 3) + state_dict["res.layer2.bias"] = torch.rand(2) + return m, state_dict + + def test_complex_model_loaded(self): + for add_data_parallel in [False, True]: + model, state_dict = self.create_complex_model() + if add_data_parallel: + model = nn.DataParallel(model) + model_sd = model.state_dict() + + align_and_update_state_dicts(model_sd, state_dict) + for loaded, stored in zip(model_sd.values(), state_dict.values()): + # different tensor references + self.assertFalse(id(loaded) == id(stored)) + # same content + self.assertTrue(loaded.equal(stored)) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/test_config.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_config.py new file mode 100644 index 0000000..650bdf2 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_config.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + + +import os +import tempfile +import unittest +import torch + +from detectron2.config import configurable, downgrade_config, get_cfg, upgrade_config +from detectron2.layers import ShapeSpec + +_V0_CFG = """ +MODEL: + RPN_HEAD: + NAME: "TEST" +VERSION: 0 +""" + +_V1_CFG = """ +MODEL: + WEIGHT: "/path/to/weight" +""" + + +class TestConfigVersioning(unittest.TestCase): + def test_upgrade_downgrade_consistency(self): + cfg = get_cfg() + # check that custom is preserved + cfg.USER_CUSTOM = 1 + + down = downgrade_config(cfg, to_version=0) + up = upgrade_config(down) + self.assertTrue(up == cfg) + + def _merge_cfg_str(self, cfg, merge_str): + f = tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) + try: + f.write(merge_str) + f.close() + cfg.merge_from_file(f.name) + finally: + os.remove(f.name) + return cfg + + def test_auto_upgrade(self): + cfg = get_cfg() + latest_ver = cfg.VERSION + cfg.USER_CUSTOM = 1 + + self._merge_cfg_str(cfg, _V0_CFG) + + self.assertEqual(cfg.MODEL.RPN.HEAD_NAME, "TEST") + self.assertEqual(cfg.VERSION, latest_ver) + + def test_guess_v1(self): + cfg = get_cfg() + latest_ver = cfg.VERSION + self._merge_cfg_str(cfg, _V1_CFG) + self.assertEqual(cfg.VERSION, latest_ver) + + +class _TestClassA(torch.nn.Module): + @configurable + def __init__(self, arg1, arg2, arg3=3): + super().__init__() + self.arg1 = arg1 + self.arg2 = arg2 + self.arg3 = arg3 + assert arg1 == 1 + assert arg2 == 2 + assert arg3 == 3 + + @classmethod + def from_config(cls, cfg): + args = {"arg1": cfg.ARG1, "arg2": cfg.ARG2} + return args + + +class _TestClassB(_TestClassA): + @configurable + def __init__(self, input_shape, arg1, arg2, arg3=3): + """ + Doc of _TestClassB + """ + assert input_shape == "shape" + super().__init__(arg1, arg2, arg3) + + @classmethod + def from_config(cls, cfg, input_shape): # test extra positional arg in from_config + args = {"arg1": cfg.ARG1, "arg2": cfg.ARG2} + args["input_shape"] = input_shape + return args + + +class _LegacySubClass(_TestClassB): + # an old subclass written in cfg style + def __init__(self, cfg, input_shape, arg4=4): + super().__init__(cfg, input_shape) + assert self.arg1 == 1 + assert self.arg2 == 2 + assert self.arg3 == 3 + + +class _NewSubClassNewInit(_TestClassB): + # test new subclass with a new __init__ + @configurable + def __init__(self, input_shape, arg4=4, **kwargs): + super().__init__(input_shape, **kwargs) + assert self.arg1 == 1 + assert self.arg2 == 2 + assert self.arg3 == 3 + + +class _LegacySubClassNotCfg(_TestClassB): + # an old subclass written in cfg style, but argument is not called "cfg" + def __init__(self, config, input_shape): + super().__init__(config, input_shape) + assert self.arg1 == 1 + assert self.arg2 == 2 + assert self.arg3 == 3 + + +class _TestClassC(_TestClassB): + @classmethod + def from_config(cls, cfg, input_shape, **kwargs): # test extra kwarg overwrite + args = {"arg1": cfg.ARG1, "arg2": cfg.ARG2} + args["input_shape"] = input_shape + args.update(kwargs) + return args + + +class _TestClassD(_TestClassA): + @configurable + def __init__(self, input_shape: ShapeSpec, arg1: int, arg2, arg3=3): + assert input_shape == "shape" + super().__init__(arg1, arg2, arg3) + + # _TestClassA.from_config does not have input_shape args. + # Test whether input_shape will be forwarded to __init__ + + +class TestConfigurable(unittest.TestCase): + def testInitWithArgs(self): + _ = _TestClassA(arg1=1, arg2=2, arg3=3) + _ = _TestClassB("shape", arg1=1, arg2=2) + _ = _TestClassC("shape", arg1=1, arg2=2) + _ = _TestClassD("shape", arg1=1, arg2=2, arg3=3) + + def testPatchedAttr(self): + self.assertTrue("Doc" in _TestClassB.__init__.__doc__) + self.assertEqual(_TestClassD.__init__.__annotations__["arg1"], int) + + def testInitWithCfg(self): + cfg = get_cfg() + cfg.ARG1 = 1 + cfg.ARG2 = 2 + cfg.ARG3 = 3 + _ = _TestClassA(cfg) + _ = _TestClassB(cfg, input_shape="shape") + _ = _TestClassC(cfg, input_shape="shape") + _ = _TestClassD(cfg, input_shape="shape") + _ = _LegacySubClass(cfg, input_shape="shape") + _ = _NewSubClassNewInit(cfg, input_shape="shape") + _ = _LegacySubClassNotCfg(cfg, input_shape="shape") + with self.assertRaises(TypeError): + # disallow forwarding positional args to __init__ since it's prone to errors + _ = _TestClassD(cfg, "shape") + + # call with kwargs instead + _ = _TestClassA(cfg=cfg) + _ = _TestClassB(cfg=cfg, input_shape="shape") + _ = _TestClassC(cfg=cfg, input_shape="shape") + _ = _TestClassD(cfg=cfg, input_shape="shape") + _ = _LegacySubClass(cfg=cfg, input_shape="shape") + _ = _NewSubClassNewInit(cfg=cfg, input_shape="shape") + _ = _LegacySubClassNotCfg(config=cfg, input_shape="shape") + + def testInitWithCfgOverwrite(self): + cfg = get_cfg() + cfg.ARG1 = 1 + cfg.ARG2 = 999 # wrong config + with self.assertRaises(AssertionError): + _ = _TestClassA(cfg, arg3=3) + + # overwrite arg2 with correct config later: + _ = _TestClassA(cfg, arg2=2, arg3=3) + _ = _TestClassB(cfg, input_shape="shape", arg2=2, arg3=3) + _ = _TestClassC(cfg, input_shape="shape", arg2=2, arg3=3) + _ = _TestClassD(cfg, input_shape="shape", arg2=2, arg3=3) + + # call with kwargs cfg=cfg instead + _ = _TestClassA(cfg=cfg, arg2=2, arg3=3) + _ = _TestClassB(cfg=cfg, input_shape="shape", arg2=2, arg3=3) + _ = _TestClassC(cfg=cfg, input_shape="shape", arg2=2, arg3=3) + _ = _TestClassD(cfg=cfg, input_shape="shape", arg2=2, arg3=3) + + def testInitWithCfgWrongArgs(self): + cfg = get_cfg() + cfg.ARG1 = 1 + cfg.ARG2 = 2 + with self.assertRaises(TypeError): + _ = _TestClassB(cfg, "shape", not_exist=1) + with self.assertRaises(TypeError): + _ = _TestClassC(cfg, "shape", not_exist=1) + with self.assertRaises(TypeError): + _ = _TestClassD(cfg, "shape", not_exist=1) + + def testBadClass(self): + class _BadClass1: + @configurable + def __init__(self, a=1, b=2): + pass + + class _BadClass2: + @configurable + def __init__(self, a=1, b=2): + pass + + def from_config(self, cfg): # noqa + pass + + class _BadClass3: + @configurable + def __init__(self, a=1, b=2): + pass + + # bad name: must be cfg + @classmethod + def from_config(cls, config): # noqa + pass + + with self.assertRaises(AttributeError): + _ = _BadClass1(a=1) + + with self.assertRaises(TypeError): + _ = _BadClass2(a=1) + + with self.assertRaises(TypeError): + _ = _BadClass3(get_cfg()) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/test_export_caffe2.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_export_caffe2.py new file mode 100644 index 0000000..ad989c4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_export_caffe2.py @@ -0,0 +1,71 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +# -*- coding: utf-8 -*- + +import copy +import numpy as np +import os +import tempfile +import unittest +import cv2 +import torch +from fvcore.common.file_io import PathManager + +from detectron2 import model_zoo +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import DatasetCatalog +from detectron2.modeling import build_model +from detectron2.utils.logger import setup_logger + + +@unittest.skipIf(os.environ.get("CIRCLECI"), "Require COCO data and model zoo.") +class TestCaffe2Export(unittest.TestCase): + def setUp(self): + setup_logger() + + def _test_model(self, config_path, device="cpu"): + # requires extra dependencies + from detectron2.export import Caffe2Model, add_export_config, export_caffe2_model + + cfg = get_cfg() + cfg.merge_from_file(model_zoo.get_config_file(config_path)) + cfg = add_export_config(cfg) + cfg.MODEL.DEVICE = device + + model = build_model(cfg) + DetectionCheckpointer(model).load(model_zoo.get_checkpoint_url(config_path)) + + inputs = [{"image": self._get_test_image()}] + c2_model = export_caffe2_model(cfg, model, copy.deepcopy(inputs)) + + with tempfile.TemporaryDirectory(prefix="detectron2_unittest") as d: + c2_model.save_protobuf(d) + c2_model.save_graph(os.path.join(d, "test.svg"), inputs=copy.deepcopy(inputs)) + c2_model = Caffe2Model.load_protobuf(d) + c2_model(inputs)[0]["instances"] + + def _get_test_image(self): + try: + file_name = DatasetCatalog.get("coco_2017_train")[0]["file_name"] + assert PathManager.exists(file_name) + except Exception: + self.skipTest("COCO dataset not available.") + + with PathManager.open(file_name, "rb") as f: + buf = f.read() + img = cv2.imdecode(np.frombuffer(buf, dtype=np.uint8), cv2.IMREAD_COLOR) + assert img is not None, file_name + return torch.from_numpy(img.transpose(2, 0, 1)) + + def testMaskRCNN(self): + self._test_model("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") + + @unittest.skipIf(not torch.cuda.is_available(), "CUDA not available") + def testMaskRCNNGPU(self): + self._test_model("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml", device="cuda") + + def testRetinaNet(self): + self._test_model("COCO-Detection/retinanet_R_50_FPN_3x.yaml") + + def testPanopticFPN(self): + self._test_model("COCO-PanopticSegmentation/panoptic_fpn_R_50_3x.yaml") diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_analysis.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_analysis.py new file mode 100644 index 0000000..0e3f84c --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_analysis.py @@ -0,0 +1,58 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + + +import unittest +import torch + +import detectron2.model_zoo as model_zoo +from detectron2.config import get_cfg +from detectron2.modeling import build_model +from detectron2.utils.analysis import flop_count_operators, parameter_count + + +def get_model_zoo(config_path): + """ + Like model_zoo.get, but do not load any weights (even pretrained) + """ + cfg_file = model_zoo.get_config_file(config_path) + cfg = get_cfg() + cfg.merge_from_file(cfg_file) + if not torch.cuda.is_available(): + cfg.MODEL.DEVICE = "cpu" + return build_model(cfg) + + +class RetinaNetTest(unittest.TestCase): + def setUp(self): + self.model = get_model_zoo("COCO-Detection/retinanet_R_50_FPN_1x.yaml") + + def test_flop(self): + # RetinaNet supports flop-counting with random inputs + inputs = [{"image": torch.rand(3, 800, 800)}] + res = flop_count_operators(self.model, inputs) + self.assertTrue(int(res["conv"]), 146) # 146B flops + + def test_param_count(self): + res = parameter_count(self.model) + self.assertTrue(res[""], 37915572) + self.assertTrue(res["backbone"], 31452352) + + +class FasterRCNNTest(unittest.TestCase): + def setUp(self): + self.model = get_model_zoo("COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml") + + def test_flop(self): + # Faster R-CNN supports flop-counting with random inputs + inputs = [{"image": torch.rand(3, 800, 800)}] + res = flop_count_operators(self.model, inputs) + + # This only checks flops for backbone & proposal generator + # Flops for box head is not conv, and depends on #proposals, which is + # almost 0 for random inputs. + self.assertTrue(int(res["conv"]), 117) + + def test_param_count(self): + res = parameter_count(self.model) + self.assertTrue(res[""], 41699936) + self.assertTrue(res["backbone"], 26799296) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_zoo.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_zoo.py new file mode 100644 index 0000000..2d16c71 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_model_zoo.py @@ -0,0 +1,29 @@ +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import logging +import unittest + +from detectron2 import model_zoo +from detectron2.modeling import FPN, GeneralizedRCNN + +logger = logging.getLogger(__name__) + + +class TestModelZoo(unittest.TestCase): + def test_get_returns_model(self): + model = model_zoo.get("Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml", trained=False) + self.assertIsInstance(model, GeneralizedRCNN) + self.assertIsInstance(model.backbone, FPN) + + def test_get_invalid_model(self): + self.assertRaises(RuntimeError, model_zoo.get, "Invalid/config.yaml") + + def test_get_url(self): + url = model_zoo.get_checkpoint_url("Misc/scratch_mask_rcnn_R_50_FPN_3x_gn.yaml") + self.assertEqual( + url, + "https://dl.fbaipublicfiles.com/detectron2/Misc/scratch_mask_rcnn_R_50_FPN_3x_gn/138602908/model_final_01ca85.pkl", # noqa + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tests/test_visualizer.py b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_visualizer.py new file mode 100644 index 0000000..1cdeddc --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tests/test_visualizer.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +# File: + +import numpy as np +import unittest +import torch + +from detectron2.data import MetadataCatalog +from detectron2.structures import BoxMode, Instances, RotatedBoxes +from detectron2.utils.visualizer import Visualizer + + +class TestVisualizer(unittest.TestCase): + def _random_data(self): + H, W = 100, 100 + N = 10 + img = np.random.rand(H, W, 3) * 255 + boxxy = np.random.rand(N, 2) * (H // 2) + boxes = np.concatenate((boxxy, boxxy + H // 2), axis=1) + + def _rand_poly(): + return np.random.rand(3, 2).flatten() * H + + polygons = [[_rand_poly() for _ in range(np.random.randint(1, 5))] for _ in range(N)] + + mask = np.zeros_like(img[:, :, 0], dtype=np.bool) + mask[:10, 10:20] = 1 + + labels = [str(i) for i in range(N)] + return img, boxes, labels, polygons, [mask] * N + + @property + def metadata(self): + return MetadataCatalog.get("coco_2017_train") + + def test_draw_dataset_dict(self): + img = np.random.rand(512, 512, 3) * 255 + dic = { + "annotations": [ + { + "bbox": [ + 368.9946492271106, + 330.891438763377, + 13.148537455410235, + 13.644708680142685, + ], + "bbox_mode": BoxMode.XYWH_ABS, + "category_id": 0, + "iscrowd": 1, + "segmentation": { + "counts": "_jh52m?2N2N2N2O100O10O001N1O2MceP2", + "size": [512, 512], + }, + } + ], + "height": 512, + "image_id": 1, + "width": 512, + } + v = Visualizer(img, self.metadata) + v.draw_dataset_dict(dic) + + def test_overlay_instances(self): + img, boxes, labels, polygons, masks = self._random_data() + + v = Visualizer(img, self.metadata) + output = v.overlay_instances(masks=polygons, boxes=boxes, labels=labels).get_image() + self.assertEqual(output.shape, img.shape) + + # Test 2x scaling + v = Visualizer(img, self.metadata, scale=2.0) + output = v.overlay_instances(masks=polygons, boxes=boxes, labels=labels).get_image() + self.assertEqual(output.shape[0], img.shape[0] * 2) + + # Test overlay masks + v = Visualizer(img, self.metadata) + output = v.overlay_instances(masks=masks, boxes=boxes, labels=labels).get_image() + self.assertEqual(output.shape, img.shape) + + def test_overlay_instances_no_boxes(self): + img, boxes, labels, polygons, _ = self._random_data() + v = Visualizer(img, self.metadata) + v.overlay_instances(masks=polygons, boxes=None, labels=labels).get_image() + + def test_draw_instance_predictions(self): + img, boxes, _, _, masks = self._random_data() + num_inst = len(boxes) + inst = Instances((img.shape[0], img.shape[1])) + inst.pred_classes = torch.randint(0, 80, size=(num_inst,)) + inst.scores = torch.rand(num_inst) + inst.pred_boxes = torch.from_numpy(boxes) + inst.pred_masks = torch.from_numpy(np.asarray(masks)) + + v = Visualizer(img, self.metadata) + v.draw_instance_predictions(inst) + + def test_draw_empty_mask_predictions(self): + img, boxes, _, _, masks = self._random_data() + num_inst = len(boxes) + inst = Instances((img.shape[0], img.shape[1])) + inst.pred_classes = torch.randint(0, 80, size=(num_inst,)) + inst.scores = torch.rand(num_inst) + inst.pred_boxes = torch.from_numpy(boxes) + inst.pred_masks = torch.from_numpy(np.zeros_like(np.asarray(masks))) + + v = Visualizer(img, self.metadata) + v.draw_instance_predictions(inst) + + def test_correct_output_shape(self): + img = np.random.rand(928, 928, 3) * 255 + v = Visualizer(img, self.metadata) + out = v.output.get_image() + self.assertEqual(out.shape, img.shape) + + def test_overlay_rotated_instances(self): + H, W = 100, 150 + img = np.random.rand(H, W, 3) * 255 + num_boxes = 50 + boxes_5d = torch.zeros(num_boxes, 5) + boxes_5d[:, 0] = torch.FloatTensor(num_boxes).uniform_(-0.1 * W, 1.1 * W) + boxes_5d[:, 1] = torch.FloatTensor(num_boxes).uniform_(-0.1 * H, 1.1 * H) + boxes_5d[:, 2] = torch.FloatTensor(num_boxes).uniform_(0, max(W, H)) + boxes_5d[:, 3] = torch.FloatTensor(num_boxes).uniform_(0, max(W, H)) + boxes_5d[:, 4] = torch.FloatTensor(num_boxes).uniform_(-1800, 1800) + rotated_boxes = RotatedBoxes(boxes_5d) + labels = [str(i) for i in range(num_boxes)] + + v = Visualizer(img, self.metadata) + output = v.overlay_instances(boxes=rotated_boxes, labels=labels).get_image() + self.assertEqual(output.shape, img.shape) + + def test_draw_no_metadata(self): + img, boxes, _, _, masks = self._random_data() + num_inst = len(boxes) + inst = Instances((img.shape[0], img.shape[1])) + inst.pred_classes = torch.randint(0, 80, size=(num_inst,)) + inst.scores = torch.rand(num_inst) + inst.pred_boxes = torch.from_numpy(boxes) + inst.pred_masks = torch.from_numpy(np.asarray(masks)) + + v = Visualizer(img, MetadataCatalog.get("asdfasdf")) + v.draw_instance_predictions(inst) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/README.md b/preprocess/humanparsing/mhp_extension/detectron2/tools/README.md new file mode 100644 index 0000000..3733863 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/README.md @@ -0,0 +1,45 @@ + +This directory contains a few scripts that use detectron2. + + +* `train_net.py` + +An example training script that's made to train builtin models of detectron2. + +For usage, see [GETTING_STARTED.md](../GETTING_STARTED.md). + +* `plain_train_net.py` + +Similar to `train_net.py`, but implements a training loop instead of using `Trainer`. +This script includes fewer features but it may be more friendly to hackers. + +* `benchmark.py` + +Benchmark the training speed, inference speed or data loading speed of a given config. + +Usage: +``` +python benchmark.py --config-file config.yaml --task train/eval/data [optional DDP flags] +``` + +* `visualize_json_results.py` + +Visualize the json instance detection/segmentation results dumped by `COCOEvalutor` or `LVISEvaluator` + +Usage: +``` +python visualize_json_results.py --input x.json --output dir/ --dataset coco_2017_val +``` +If not using a builtin dataset, you'll need your own script or modify this script. + +* `visualize_data.py` + +Visualize ground truth raw annotations or training data (after preprocessing/augmentations). + +Usage: +``` +python visualize_data.py --config-file config.yaml --source annotation/dataloader --output-dir dir/ [--show] +``` + +NOTE: the script does not stop by itself when using `--source dataloader` because a training +dataloader is usually infinite. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/analyze_model.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/analyze_model.py new file mode 100644 index 0000000..9c06ea4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/analyze_model.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import logging +import numpy as np +from collections import Counter +import tqdm + +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import build_detection_test_loader +from detectron2.engine import default_argument_parser +from detectron2.modeling import build_model +from detectron2.utils.analysis import ( + activation_count_operators, + flop_count_operators, + parameter_count_table, +) +from detectron2.utils.logger import setup_logger + +logger = logging.getLogger("detectron2") + + +def setup(args): + cfg = get_cfg() + cfg.merge_from_file(args.config_file) + cfg.DATALOADER.NUM_WORKERS = 0 + cfg.merge_from_list(args.opts) + cfg.freeze() + setup_logger() + return cfg + + +def do_flop(cfg): + data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) + model = build_model(cfg) + DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS) + model.eval() + + counts = Counter() + total_flops = [] + for idx, data in zip(tqdm.trange(args.num_inputs), data_loader): # noqa + count = flop_count_operators(model, data) + counts += count + total_flops.append(sum(count.values())) + logger.info( + "(G)Flops for Each Type of Operators:\n" + str([(k, v / idx) for k, v in counts.items()]) + ) + logger.info("Total (G)Flops: {}±{}".format(np.mean(total_flops), np.std(total_flops))) + + +def do_activation(cfg): + data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) + model = build_model(cfg) + DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS) + model.eval() + + counts = Counter() + total_activations = [] + for idx, data in zip(tqdm.trange(args.num_inputs), data_loader): # noqa + count = activation_count_operators(model, data) + counts += count + total_activations.append(sum(count.values())) + logger.info( + "(Million) Activations for Each Type of Operators:\n" + + str([(k, v / idx) for k, v in counts.items()]) + ) + logger.info( + "Total (Million) Activations: {}±{}".format( + np.mean(total_activations), np.std(total_activations) + ) + ) + + +def do_parameter(cfg): + model = build_model(cfg) + logger.info("Parameter Count:\n" + parameter_count_table(model, max_depth=5)) + + +def do_structure(cfg): + model = build_model(cfg) + logger.info("Model Structure:\n" + str(model)) + + +if __name__ == "__main__": + parser = default_argument_parser( + epilog=""" +Examples: + +To show parameters of a model: +$ ./analyze_model.py --tasks parameter \\ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml + +Flops and activations are data-dependent, therefore inputs and model weights +are needed to count them: + +$ ./analyze_model.py --num-inputs 100 --tasks flop \\ + --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \\ + MODEL.WEIGHTS /path/to/model.pkl +""" + ) + parser.add_argument( + "--tasks", + choices=["flop", "activation", "parameter", "structure"], + required=True, + nargs="+", + ) + parser.add_argument( + "--num-inputs", + default=100, + type=int, + help="number of inputs used to compute statistics for flops/activations, " + "both are data dependent.", + ) + args = parser.parse_args() + assert not args.eval_only + assert args.num_gpus == 1 + + cfg = setup(args) + + for task in args.tasks: + { + "flop": do_flop, + "activation": do_activation, + "parameter": do_parameter, + "structure": do_structure, + }[task](cfg) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/benchmark.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/benchmark.py new file mode 100644 index 0000000..9eec59f --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/benchmark.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +A script to benchmark builtin models. + +Note: this script has an extra dependency of psutil. +""" + +import itertools +import logging +import psutil +import torch +import tqdm +from fvcore.common.timer import Timer +from torch.nn.parallel import DistributedDataParallel + +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import ( + DatasetFromList, + build_detection_test_loader, + build_detection_train_loader, +) +from detectron2.engine import SimpleTrainer, default_argument_parser, hooks, launch +from detectron2.modeling import build_model +from detectron2.solver import build_optimizer +from detectron2.utils import comm +from detectron2.utils.events import CommonMetricPrinter +from detectron2.utils.logger import setup_logger + +logger = logging.getLogger("detectron2") + + +def setup(args): + cfg = get_cfg() + cfg.merge_from_file(args.config_file) + cfg.SOLVER.BASE_LR = 0.001 # Avoid NaNs. Not useful in this script anyway. + cfg.merge_from_list(args.opts) + cfg.freeze() + setup_logger(distributed_rank=comm.get_rank()) + return cfg + + +def benchmark_data(args): + cfg = setup(args) + + timer = Timer() + dataloader = build_detection_train_loader(cfg) + logger.info("Initialize loader using {} seconds.".format(timer.seconds())) + + timer.reset() + itr = iter(dataloader) + for i in range(10): # warmup + next(itr) + if i == 0: + startup_time = timer.seconds() + timer = Timer() + max_iter = 1000 + for _ in tqdm.trange(max_iter): + next(itr) + logger.info( + "{} iters ({} images) in {} seconds.".format( + max_iter, max_iter * cfg.SOLVER.IMS_PER_BATCH, timer.seconds() + ) + ) + logger.info("Startup time: {} seconds".format(startup_time)) + vram = psutil.virtual_memory() + logger.info( + "RAM Usage: {:.2f}/{:.2f} GB".format( + (vram.total - vram.available) / 1024 ** 3, vram.total / 1024 ** 3 + ) + ) + + # test for a few more rounds + for _ in range(10): + timer = Timer() + max_iter = 1000 + for _ in tqdm.trange(max_iter): + next(itr) + logger.info( + "{} iters ({} images) in {} seconds.".format( + max_iter, max_iter * cfg.SOLVER.IMS_PER_BATCH, timer.seconds() + ) + ) + + +def benchmark_train(args): + cfg = setup(args) + model = build_model(cfg) + logger.info("Model:\n{}".format(model)) + if comm.get_world_size() > 1: + model = DistributedDataParallel( + model, device_ids=[comm.get_local_rank()], broadcast_buffers=False + ) + optimizer = build_optimizer(cfg, model) + checkpointer = DetectionCheckpointer(model, optimizer=optimizer) + checkpointer.load(cfg.MODEL.WEIGHTS) + + cfg.defrost() + cfg.DATALOADER.NUM_WORKERS = 0 + data_loader = build_detection_train_loader(cfg) + dummy_data = list(itertools.islice(data_loader, 100)) + + def f(): + data = DatasetFromList(dummy_data, copy=False) + while True: + yield from data + + max_iter = 400 + trainer = SimpleTrainer(model, f(), optimizer) + trainer.register_hooks( + [hooks.IterationTimer(), hooks.PeriodicWriter([CommonMetricPrinter(max_iter)])] + ) + trainer.train(1, max_iter) + + +@torch.no_grad() +def benchmark_eval(args): + cfg = setup(args) + model = build_model(cfg) + model.eval() + logger.info("Model:\n{}".format(model)) + DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS) + + cfg.defrost() + cfg.DATALOADER.NUM_WORKERS = 0 + data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) + dummy_data = list(itertools.islice(data_loader, 100)) + + def f(): + while True: + yield from DatasetFromList(dummy_data, copy=False) + + for _ in range(5): # warmup + model(dummy_data[0]) + + max_iter = 400 + timer = Timer() + with tqdm.tqdm(total=max_iter) as pbar: + for idx, d in enumerate(f()): + if idx == max_iter: + break + model(d) + pbar.update() + logger.info("{} iters in {} seconds.".format(max_iter, timer.seconds())) + + +if __name__ == "__main__": + parser = default_argument_parser() + parser.add_argument("--task", choices=["train", "eval", "data"], required=True) + args = parser.parse_args() + assert not args.eval_only + + if args.task == "data": + f = benchmark_data + elif args.task == "train": + """ + Note: training speed may not be representative. + The training cost of a R-CNN model varies with the content of the data + and the quality of the model. + """ + f = benchmark_train + elif args.task == "eval": + f = benchmark_eval + # only benchmark single-GPU inference. + assert args.num_gpus == 1 and args.num_machines == 1 + launch(f, args.num_gpus, args.num_machines, args.machine_rank, args.dist_url, args=(args,)) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/convert-torchvision-to-d2.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/convert-torchvision-to-d2.py new file mode 100644 index 0000000..18a24e4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/convert-torchvision-to-d2.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import pickle as pkl +import sys +import torch + +""" +Usage: + # download one of the ResNet{18,34,50,101,152} models from torchvision: + wget https://download.pytorch.org/models/resnet50-19c8e357.pth -O r50.pth + # run the conversion + ./convert-torchvision-to-d2.py r50.pth r50.pkl + + # Then, use r50.pkl with the following changes in config: + +MODEL: + WEIGHTS: "/path/to/r50.pkl" + PIXEL_MEAN: [123.675, 116.280, 103.530] + PIXEL_STD: [58.395, 57.120, 57.375] + RESNETS: + DEPTH: 50 + STRIDE_IN_1X1: False +INPUT: + FORMAT: "RGB" + + These models typically produce slightly worse results than the + pre-trained ResNets we use in official configs, which are the + original ResNet models released by MSRA. +""" + +if __name__ == "__main__": + input = sys.argv[1] + + obj = torch.load(input, map_location="cpu") + + newmodel = {} + for k in list(obj.keys()): + old_k = k + if "layer" not in k: + k = "stem." + k + for t in [1, 2, 3, 4]: + k = k.replace("layer{}".format(t), "res{}".format(t + 1)) + for t in [1, 2, 3]: + k = k.replace("bn{}".format(t), "conv{}.norm".format(t)) + k = k.replace("downsample.0", "shortcut") + k = k.replace("downsample.1", "shortcut.norm") + print(old_k, "->", k) + newmodel[k] = obj.pop(old_k).detach().numpy() + + res = {"model": newmodel, "__author__": "torchvision", "matching_heuristics": True} + + with open(sys.argv[2], "wb") as f: + pkl.dump(res, f) + if obj: + print("Unconverted keys:", obj.keys()) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/README.md b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/README.md new file mode 100644 index 0000000..b9d5b15 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/README.md @@ -0,0 +1,9 @@ + +This directory contains: + +1. A script that converts a detectron2 model to caffe2 format. + +2. An example that loads a Mask R-CNN model in caffe2 format and runs inference. + +See [tutorial](https://detectron2.readthedocs.io/tutorials/deployment.html) +for their usage. diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_converter.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_converter.py new file mode 100644 index 0000000..08feb69 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_converter.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +import argparse +import os +import onnx +import torch + +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import build_detection_test_loader +from detectron2.evaluation import COCOEvaluator, inference_on_dataset, print_csv_format +from detectron2.export import Caffe2Tracer, add_export_config +from detectron2.modeling import build_model +from detectron2.utils.logger import setup_logger + + +def setup_cfg(args): + cfg = get_cfg() + # cuda context is initialized before creating dataloader, so we don't fork anymore + cfg.DATALOADER.NUM_WORKERS = 0 + cfg = add_export_config(cfg) + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + if cfg.MODEL.DEVICE != "cpu": + TORCH_VERSION = tuple(int(x) for x in torch.__version__.split(".")[:2]) + assert TORCH_VERSION >= (1, 5), "PyTorch>=1.5 required for GPU conversion!" + return cfg + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Convert a model using caffe2 tracing.") + parser.add_argument( + "--format", + choices=["caffe2", "onnx", "torchscript"], + help="output format", + default="caffe2", + ) + parser.add_argument("--config-file", default="", metavar="FILE", help="path to config file") + parser.add_argument("--run-eval", action="store_true") + parser.add_argument("--output", help="output directory for the converted model") + parser.add_argument( + "opts", + help="Modify config options using the command-line", + default=None, + nargs=argparse.REMAINDER, + ) + args = parser.parse_args() + logger = setup_logger() + logger.info("Command line arguments: " + str(args)) + os.makedirs(args.output, exist_ok=True) + + cfg = setup_cfg(args) + + # create a torch model + torch_model = build_model(cfg) + DetectionCheckpointer(torch_model).resume_or_load(cfg.MODEL.WEIGHTS) + + # get a sample data + data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) + first_batch = next(iter(data_loader)) + + # convert and save caffe2 model + tracer = Caffe2Tracer(cfg, torch_model, first_batch) + if args.format == "caffe2": + caffe2_model = tracer.export_caffe2() + caffe2_model.save_protobuf(args.output) + # draw the caffe2 graph + caffe2_model.save_graph(os.path.join(args.output, "model.svg"), inputs=first_batch) + elif args.format == "onnx": + onnx_model = tracer.export_onnx() + onnx.save(onnx_model, os.path.join(args.output, "model.onnx")) + elif args.format == "torchscript": + script_model = tracer.export_torchscript() + script_model.save(os.path.join(args.output, "model.ts")) + + # Recursively print IR of all modules + with open(os.path.join(args.output, "model_ts_IR.txt"), "w") as f: + try: + f.write(script_model._actual_script_module._c.dump_to_str(True, False, False)) + except AttributeError: + pass + # Print IR of the entire graph (all submodules inlined) + with open(os.path.join(args.output, "model_ts_IR_inlined.txt"), "w") as f: + f.write(str(script_model.inlined_graph)) + # Print the model structure in pytorch style + with open(os.path.join(args.output, "model.txt"), "w") as f: + f.write(str(script_model)) + + # run evaluation with the converted model + if args.run_eval: + assert args.format == "caffe2", "Python inference in other format is not yet supported." + dataset = cfg.DATASETS.TEST[0] + data_loader = build_detection_test_loader(cfg, dataset) + # NOTE: hard-coded evaluator. change to the evaluator for your dataset + evaluator = COCOEvaluator(dataset, cfg, True, args.output) + metrics = inference_on_dataset(caffe2_model, data_loader, evaluator) + print_csv_format(metrics) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_mask_rcnn.cpp b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_mask_rcnn.cpp new file mode 100644 index 0000000..44370b4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/caffe2_mask_rcnn.cpp @@ -0,0 +1,119 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +C10_DEFINE_string(predict_net, "", "path to model.pb"); +C10_DEFINE_string(init_net, "", "path to model_init.pb"); +C10_DEFINE_string(input, "", "path to input image"); + +using namespace std; +using namespace caffe2; + +int main(int argc, char** argv) { + caffe2::GlobalInit(&argc, &argv); + string predictNetPath = FLAGS_predict_net; + string initNetPath = FLAGS_init_net; + cv::Mat input = cv::imread(FLAGS_input, cv::IMREAD_COLOR); + + const int height = input.rows; + const int width = input.cols; + // FPN models require divisibility of 32 + assert(height % 32 == 0 && width % 32 == 0); + const int batch = 1; + const int channels = 3; + + // initialize Net and Workspace + caffe2::NetDef initNet_, predictNet_; + CAFFE_ENFORCE(ReadProtoFromFile(initNetPath, &initNet_)); + CAFFE_ENFORCE(ReadProtoFromFile(predictNetPath, &predictNet_)); + + Workspace workSpace; + for (auto& str : predictNet_.external_input()) { + workSpace.CreateBlob(str); + } + CAFFE_ENFORCE(workSpace.CreateNet(predictNet_)); + CAFFE_ENFORCE(workSpace.RunNetOnce(initNet_)); + + // setup inputs + auto data = BlobGetMutableTensor(workSpace.GetBlob("data"), caffe2::CPU); + data->Resize(batch, channels, height, width); + float* ptr = data->mutable_data(); + // HWC to CHW + for (int c = 0; c < 3; ++c) { + for (int i = 0; i < height * width; ++i) { + ptr[c * height * width + i] = static_cast(input.data[3 * i + c]); + } + } + + auto im_info = + BlobGetMutableTensor(workSpace.GetBlob("im_info"), caffe2::CPU); + im_info->Resize(batch, 3); + float* im_info_ptr = im_info->mutable_data(); + im_info_ptr[0] = height; + im_info_ptr[1] = width; + im_info_ptr[2] = 1.0; + + // run the network + CAFFE_ENFORCE(workSpace.RunNet(predictNet_.name())); + + // run 3 more times to benchmark + int N_benchmark = 3; + auto start_time = chrono::high_resolution_clock::now(); + for (int i = 0; i < N_benchmark; ++i) { + CAFFE_ENFORCE(workSpace.RunNet(predictNet_.name())); + } + auto end_time = chrono::high_resolution_clock::now(); + auto ms = chrono::duration_cast(end_time - start_time) + .count(); + cout << "Latency (should vary with different inputs): " + << ms * 1.0 / 1e6 / N_benchmark << " seconds" << endl; + + // parse Mask R-CNN outputs + caffe2::Tensor bbox( + workSpace.GetBlob("bbox_nms")->Get(), caffe2::CPU); + caffe2::Tensor scores( + workSpace.GetBlob("score_nms")->Get(), caffe2::CPU); + caffe2::Tensor labels( + workSpace.GetBlob("class_nms")->Get(), caffe2::CPU); + caffe2::Tensor mask_probs( + workSpace.GetBlob("mask_fcn_probs")->Get(), caffe2::CPU); + cout << "bbox:" << bbox.DebugString() << endl; + cout << "scores:" << scores.DebugString() << endl; + cout << "labels:" << labels.DebugString() << endl; + cout << "mask_probs: " << mask_probs.DebugString() << endl; + + int num_instances = bbox.sizes()[0]; + for (int i = 0; i < num_instances; ++i) { + float score = scores.data()[i]; + if (score < 0.6) + continue; // skip them + + const float* box = bbox.data() + i * 4; + int label = labels.data()[i]; + + cout << "Prediction " << i << ", xyxy=("; + cout << box[0] << ", " << box[1] << ", " << box[2] << ", " << box[3] + << "); score=" << score << "; label=" << label << endl; + + const float* mask = mask_probs.data() + + i * mask_probs.size_from_dim(1) + label * mask_probs.size_from_dim(2); + + // save the 28x28 mask + cv::Mat cv_mask(28, 28, CV_32FC1); + memcpy(cv_mask.data, mask, 28 * 28 * sizeof(float)); + cv::imwrite("mask" + std::to_string(i) + ".png", cv_mask * 255.); + } + return 0; +} diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/torchscript_traced_mask_rcnn.cpp b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/torchscript_traced_mask_rcnn.cpp new file mode 100644 index 0000000..82fbdb0 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/deploy/torchscript_traced_mask_rcnn.cpp @@ -0,0 +1,71 @@ +// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + +#include +#include +#include + +#include +#include + +using namespace std; + +// experimental. don't use +int main(int argc, const char* argv[]) { + if (argc != 3) { + return 1; + } + std::string image_file = argv[2]; + + torch::autograd::AutoGradMode guard(false); + auto module = torch::jit::load(argv[1]); + + assert(module.buffers().size() > 0); + // Assume that the entire model is on the same device. + // We just put input to this device. + auto device = (*begin(module.buffers())).device(); + + cv::Mat input_img = cv::imread(image_file, cv::IMREAD_COLOR); + const int height = input_img.rows; + const int width = input_img.cols; + // FPN models require divisibility of 32 + assert(height % 32 == 0 && width % 32 == 0); + const int channels = 3; + + auto input = torch::from_blob( + input_img.data, {1, height, width, channels}, torch::kUInt8); + // NHWC to NCHW + input = input.to(device, torch::kFloat).permute({0, 3, 1, 2}).contiguous(); + + std::array im_info_data{height * 1.0f, width * 1.0f, 1.0f}; + auto im_info = torch::from_blob(im_info_data.data(), {1, 3}).to(device); + + // run the network + auto output = module.forward({std::make_tuple(input, im_info)}); + + // run 3 more times to benchmark + int N_benchmark = 3; + auto start_time = chrono::high_resolution_clock::now(); + for (int i = 0; i < N_benchmark; ++i) { + output = module.forward({std::make_tuple(input, im_info)}); + } + auto end_time = chrono::high_resolution_clock::now(); + auto ms = chrono::duration_cast(end_time - start_time) + .count(); + cout << "Latency (should vary with different inputs): " + << ms * 1.0 / 1e6 / N_benchmark << " seconds" << endl; + + auto outputs = output.toTuple()->elements(); + // parse Mask R-CNN outputs + auto bbox = outputs[0].toTensor(), scores = outputs[1].toTensor(), + labels = outputs[2].toTensor(), mask_probs = outputs[3].toTensor(); + + cout << "bbox: " << bbox.toString() << " " << bbox.sizes() << endl; + cout << "scores: " << scores.toString() << " " << scores.sizes() << endl; + cout << "labels: " << labels.toString() << " " << labels.sizes() << endl; + cout << "mask_probs: " << mask_probs.toString() << " " << mask_probs.sizes() + << endl; + + int num_instances = bbox.sizes()[0]; + cout << bbox << endl; + return 0; +} diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/finetune_net.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/finetune_net.py new file mode 100644 index 0000000..3e52185 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/finetune_net.py @@ -0,0 +1,183 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +Detection Training Script. + +This scripts reads a given config file and runs the training or evaluation. +It is an entry point that is made to train standard models in detectron2. + +In order to let one script support training of many models, +this script contains logic that are specific to these built-in models and therefore +may not be suitable for your own project. +For example, your research project perhaps only needs a single "evaluator". + +Therefore, we recommend you to use detectron2 as an library and take +this file as an example of how to use the library. +You may want to write your own script with your data and other customizations. +""" + +import logging +import os +from collections import OrderedDict +import torch + +import detectron2.utils.comm as comm +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import MetadataCatalog +from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, hooks, launch +from detectron2.evaluation import ( + CityscapesInstanceEvaluator, + CityscapesSemSegEvaluator, + COCOEvaluator, + COCOPanopticEvaluator, + DatasetEvaluators, + LVISEvaluator, + PascalVOCDetectionEvaluator, + SemSegEvaluator, + verify_results, +) +from detectron2.modeling import GeneralizedRCNNWithTTA + +# Register Custom Dataset +from detectron2.data.datasets import register_coco_instances + +register_coco_instances("CIHP_train", {}, "../../data/msrcnn_finetune_annotations/CIHP_train.json", + "../../data/instance-level_human_parsing/Training/Images") +register_coco_instances("CIHP_val", {}, "../../data/msrcnn_finetune_annotations/CIHP_val.json", + "../../data/instance-level_human_parsing/Validation/Images") +register_coco_instances("demo_train", {}, "../../demo/annotations/demo_train.json", + "../../demo/img") +register_coco_instances("demo_val", {}, "../../demo/annotations/demo_val.json", + "../../demo/img") + + +class Trainer(DefaultTrainer): + """ + We use the "DefaultTrainer" which contains pre-defined default logic for + standard training workflow. They may not work for you, especially if you + are working on a new research project. In that case you can use the cleaner + "SimpleTrainer", or write your own training loop. You can use + "tools/plain_train_net.py" as an example. + """ + + @classmethod + def build_evaluator(cls, cfg, dataset_name, output_folder=None): + """ + Create evaluator(s) for a given dataset. + This uses the special metadata "evaluator_type" associated with each builtin dataset. + For your own dataset, you can simply create an evaluator manually in your + script and do not have to worry about the hacky if-else logic here. + """ + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + evaluator_list = [] + evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type + if evaluator_type in ["sem_seg", "coco_panoptic_seg"]: + evaluator_list.append( + SemSegEvaluator( + dataset_name, + distributed=True, + num_classes=cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES, + ignore_label=cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE, + output_dir=output_folder, + ) + ) + if evaluator_type in ["coco", "coco_panoptic_seg"]: + evaluator_list.append(COCOEvaluator(dataset_name, cfg, True, output_folder)) + if evaluator_type == "coco_panoptic_seg": + evaluator_list.append(COCOPanopticEvaluator(dataset_name, output_folder)) + if evaluator_type == "cityscapes_instance": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesInstanceEvaluator(dataset_name) + if evaluator_type == "cityscapes_sem_seg": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesSemSegEvaluator(dataset_name) + elif evaluator_type == "pascal_voc": + return PascalVOCDetectionEvaluator(dataset_name) + elif evaluator_type == "lvis": + return LVISEvaluator(dataset_name, cfg, True, output_folder) + if len(evaluator_list) == 0: + raise NotImplementedError( + "no Evaluator for the dataset {} with the type {}".format( + dataset_name, evaluator_type + ) + ) + elif len(evaluator_list) == 1: + return evaluator_list[0] + return DatasetEvaluators(evaluator_list) + + @classmethod + def test_with_TTA(cls, cfg, model): + logger = logging.getLogger("detectron2.trainer") + # In the end of training, run an evaluation with TTA + # Only support some R-CNN models. + logger.info("Running inference with test-time augmentation ...") + model = GeneralizedRCNNWithTTA(cfg, model) + evaluators = [ + cls.build_evaluator( + cfg, name, output_folder=os.path.join(cfg.OUTPUT_DIR, "inference_TTA") + ) + for name in cfg.DATASETS.TEST + ] + res = cls.test(cfg, model, evaluators) + res = OrderedDict({k + "_TTA": v for k, v in res.items()}) + return res + + +def setup(args): + """ + Create configs and perform basic setups. + """ + cfg = get_cfg() + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup(cfg, args) + return cfg + + +def main(args): + cfg = setup(args) + + if args.eval_only: + model = Trainer.build_model(cfg) + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + res = Trainer.test(cfg, model) + if cfg.TEST.AUG.ENABLED: + res.update(Trainer.test_with_TTA(cfg, model)) + if comm.is_main_process(): + verify_results(cfg, res) + return res + + """ + If you'd like to do anything fancier than the standard training logic, + consider writing your own training loop (see plain_train_net.py) or + subclassing the trainer. + """ + trainer = Trainer(cfg) + trainer.resume_or_load(resume=False) + if cfg.TEST.AUG.ENABLED: + trainer.register_hooks( + [hooks.EvalHook(0, lambda: trainer.test_with_TTA(cfg, trainer.model))] + ) + return trainer.train() + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/inference.sh b/preprocess/humanparsing/mhp_extension/detectron2/tools/inference.sh new file mode 100644 index 0000000..3b9d39e --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/inference.sh @@ -0,0 +1,4 @@ +python finetune_net.py \ + --num-gpus 1 \ + --config-file ../configs/Misc/parsing_inference.yaml \ + --eval-only MODEL.WEIGHTS ./model_final.pth TEST.AUG.ENABLED False diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/plain_train_net.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/plain_train_net.py new file mode 100644 index 0000000..52a0a28 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/plain_train_net.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +Detectron2 training script with a plain training loop. + +This script reads a given config file and runs the training or evaluation. +It is an entry point that is able to train standard models in detectron2. + +In order to let one script support training of many models, +this script contains logic that are specific to these built-in models and therefore +may not be suitable for your own project. +For example, your research project perhaps only needs a single "evaluator". + +Therefore, we recommend you to use detectron2 as a library and take +this file as an example of how to use the library. +You may want to write your own script with your data and other customizations. + +Compared to "train_net.py", this script supports fewer default features. +It also includes fewer abstraction, therefore is easier to add custom logic. +""" + +import logging +import os +from collections import OrderedDict +import torch +from torch.nn.parallel import DistributedDataParallel + +import detectron2.utils.comm as comm +from detectron2.checkpoint import DetectionCheckpointer, PeriodicCheckpointer +from detectron2.config import get_cfg +from detectron2.data import ( + MetadataCatalog, + build_detection_test_loader, + build_detection_train_loader, +) +from detectron2.engine import default_argument_parser, default_setup, launch +from detectron2.evaluation import ( + CityscapesInstanceEvaluator, + CityscapesSemSegEvaluator, + COCOEvaluator, + COCOPanopticEvaluator, + DatasetEvaluators, + LVISEvaluator, + PascalVOCDetectionEvaluator, + SemSegEvaluator, + inference_on_dataset, + print_csv_format, +) +from detectron2.modeling import build_model +from detectron2.solver import build_lr_scheduler, build_optimizer +from detectron2.utils.events import ( + CommonMetricPrinter, + EventStorage, + JSONWriter, + TensorboardXWriter, +) + +logger = logging.getLogger("detectron2") + + +def get_evaluator(cfg, dataset_name, output_folder=None): + """ + Create evaluator(s) for a given dataset. + This uses the special metadata "evaluator_type" associated with each builtin dataset. + For your own dataset, you can simply create an evaluator manually in your + script and do not have to worry about the hacky if-else logic here. + """ + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + evaluator_list = [] + evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type + if evaluator_type in ["sem_seg", "coco_panoptic_seg"]: + evaluator_list.append( + SemSegEvaluator( + dataset_name, + distributed=True, + num_classes=cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES, + ignore_label=cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE, + output_dir=output_folder, + ) + ) + if evaluator_type in ["coco", "coco_panoptic_seg"]: + evaluator_list.append(COCOEvaluator(dataset_name, cfg, True, output_folder)) + if evaluator_type == "coco_panoptic_seg": + evaluator_list.append(COCOPanopticEvaluator(dataset_name, output_folder)) + if evaluator_type == "cityscapes_instance": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesInstanceEvaluator(dataset_name) + if evaluator_type == "cityscapes_sem_seg": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesSemSegEvaluator(dataset_name) + if evaluator_type == "pascal_voc": + return PascalVOCDetectionEvaluator(dataset_name) + if evaluator_type == "lvis": + return LVISEvaluator(dataset_name, cfg, True, output_folder) + if len(evaluator_list) == 0: + raise NotImplementedError( + "no Evaluator for the dataset {} with the type {}".format(dataset_name, evaluator_type) + ) + if len(evaluator_list) == 1: + return evaluator_list[0] + return DatasetEvaluators(evaluator_list) + + +def do_test(cfg, model): + results = OrderedDict() + for dataset_name in cfg.DATASETS.TEST: + data_loader = build_detection_test_loader(cfg, dataset_name) + evaluator = get_evaluator( + cfg, dataset_name, os.path.join(cfg.OUTPUT_DIR, "inference", dataset_name) + ) + results_i = inference_on_dataset(model, data_loader, evaluator) + results[dataset_name] = results_i + if comm.is_main_process(): + logger.info("Evaluation results for {} in csv format:".format(dataset_name)) + print_csv_format(results_i) + if len(results) == 1: + results = list(results.values())[0] + return results + + +def do_train(cfg, model, resume=False): + model.train() + optimizer = build_optimizer(cfg, model) + scheduler = build_lr_scheduler(cfg, optimizer) + + checkpointer = DetectionCheckpointer( + model, cfg.OUTPUT_DIR, optimizer=optimizer, scheduler=scheduler + ) + start_iter = ( + checkpointer.resume_or_load(cfg.MODEL.WEIGHTS, resume=resume).get("iteration", -1) + 1 + ) + max_iter = cfg.SOLVER.MAX_ITER + + periodic_checkpointer = PeriodicCheckpointer( + checkpointer, cfg.SOLVER.CHECKPOINT_PERIOD, max_iter=max_iter + ) + + writers = ( + [ + CommonMetricPrinter(max_iter), + JSONWriter(os.path.join(cfg.OUTPUT_DIR, "metrics.json")), + TensorboardXWriter(cfg.OUTPUT_DIR), + ] + if comm.is_main_process() + else [] + ) + + # compared to "train_net.py", we do not support accurate timing and + # precise BN here, because they are not trivial to implement + data_loader = build_detection_train_loader(cfg) + logger.info("Starting training from iteration {}".format(start_iter)) + with EventStorage(start_iter) as storage: + for data, iteration in zip(data_loader, range(start_iter, max_iter)): + iteration = iteration + 1 + storage.step() + + loss_dict = model(data) + losses = sum(loss_dict.values()) + assert torch.isfinite(losses).all(), loss_dict + + loss_dict_reduced = {k: v.item() for k, v in comm.reduce_dict(loss_dict).items()} + losses_reduced = sum(loss for loss in loss_dict_reduced.values()) + if comm.is_main_process(): + storage.put_scalars(total_loss=losses_reduced, **loss_dict_reduced) + + optimizer.zero_grad() + losses.backward() + optimizer.step() + storage.put_scalar("lr", optimizer.param_groups[0]["lr"], smoothing_hint=False) + scheduler.step() + + if ( + cfg.TEST.EVAL_PERIOD > 0 + and iteration % cfg.TEST.EVAL_PERIOD == 0 + and iteration != max_iter + ): + do_test(cfg, model) + # Compared to "train_net.py", the test results are not dumped to EventStorage + comm.synchronize() + + if iteration - start_iter > 5 and (iteration % 20 == 0 or iteration == max_iter): + for writer in writers: + writer.write() + periodic_checkpointer.step(iteration) + + +def setup(args): + """ + Create configs and perform basic setups. + """ + cfg = get_cfg() + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup( + cfg, args + ) # if you don't like any of the default setup, write your own setup code + return cfg + + +def main(args): + cfg = setup(args) + + model = build_model(cfg) + logger.info("Model:\n{}".format(model)) + if args.eval_only: + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + return do_test(cfg, model) + + distributed = comm.get_world_size() > 1 + if distributed: + model = DistributedDataParallel( + model, device_ids=[comm.get_local_rank()], broadcast_buffers=False + ) + + do_train(cfg, model, resume=args.resume) + return do_test(cfg, model) + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/run.sh b/preprocess/humanparsing/mhp_extension/detectron2/tools/run.sh new file mode 100644 index 0000000..b892673 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/run.sh @@ -0,0 +1,3 @@ +python finetune_net.py \ + --config-file ../configs/Misc/parsing_finetune_cihp+vip.yaml \ + --num-gpus 8 diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/train_net.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/train_net.py new file mode 100644 index 0000000..b1c0ee4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/train_net.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +""" +Detection Training Script. + +This scripts reads a given config file and runs the training or evaluation. +It is an entry point that is made to train standard models in detectron2. + +In order to let one script support training of many models, +this script contains logic that are specific to these built-in models and therefore +may not be suitable for your own project. +For example, your research project perhaps only needs a single "evaluator". + +Therefore, we recommend you to use detectron2 as an library and take +this file as an example of how to use the library. +You may want to write your own script with your data and other customizations. +""" + +import logging +import os +from collections import OrderedDict +import torch + +import detectron2.utils.comm as comm +from detectron2.checkpoint import DetectionCheckpointer +from detectron2.config import get_cfg +from detectron2.data import MetadataCatalog +from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, hooks, launch +from detectron2.evaluation import ( + CityscapesInstanceEvaluator, + CityscapesSemSegEvaluator, + COCOEvaluator, + COCOPanopticEvaluator, + DatasetEvaluators, + LVISEvaluator, + PascalVOCDetectionEvaluator, + SemSegEvaluator, + verify_results, +) +from detectron2.modeling import GeneralizedRCNNWithTTA + + +class Trainer(DefaultTrainer): + """ + We use the "DefaultTrainer" which contains pre-defined default logic for + standard training workflow. They may not work for you, especially if you + are working on a new research project. In that case you can use the cleaner + "SimpleTrainer", or write your own training loop. You can use + "tools/plain_train_net.py" as an example. + """ + + @classmethod + def build_evaluator(cls, cfg, dataset_name, output_folder=None): + """ + Create evaluator(s) for a given dataset. + This uses the special metadata "evaluator_type" associated with each builtin dataset. + For your own dataset, you can simply create an evaluator manually in your + script and do not have to worry about the hacky if-else logic here. + """ + if output_folder is None: + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") + evaluator_list = [] + evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type + if evaluator_type in ["sem_seg", "coco_panoptic_seg"]: + evaluator_list.append( + SemSegEvaluator( + dataset_name, + distributed=True, + num_classes=cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES, + ignore_label=cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE, + output_dir=output_folder, + ) + ) + if evaluator_type in ["coco", "coco_panoptic_seg"]: + evaluator_list.append(COCOEvaluator(dataset_name, cfg, True, output_folder)) + if evaluator_type == "coco_panoptic_seg": + evaluator_list.append(COCOPanopticEvaluator(dataset_name, output_folder)) + if evaluator_type == "cityscapes_instance": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesInstanceEvaluator(dataset_name) + if evaluator_type == "cityscapes_sem_seg": + assert ( + torch.cuda.device_count() >= comm.get_rank() + ), "CityscapesEvaluator currently do not work with multiple machines." + return CityscapesSemSegEvaluator(dataset_name) + elif evaluator_type == "pascal_voc": + return PascalVOCDetectionEvaluator(dataset_name) + elif evaluator_type == "lvis": + return LVISEvaluator(dataset_name, cfg, True, output_folder) + if len(evaluator_list) == 0: + raise NotImplementedError( + "no Evaluator for the dataset {} with the type {}".format( + dataset_name, evaluator_type + ) + ) + elif len(evaluator_list) == 1: + return evaluator_list[0] + return DatasetEvaluators(evaluator_list) + + @classmethod + def test_with_TTA(cls, cfg, model): + logger = logging.getLogger("detectron2.trainer") + # In the end of training, run an evaluation with TTA + # Only support some R-CNN models. + logger.info("Running inference with test-time augmentation ...") + model = GeneralizedRCNNWithTTA(cfg, model) + evaluators = [ + cls.build_evaluator( + cfg, name, output_folder=os.path.join(cfg.OUTPUT_DIR, "inference_TTA") + ) + for name in cfg.DATASETS.TEST + ] + res = cls.test(cfg, model, evaluators) + res = OrderedDict({k + "_TTA": v for k, v in res.items()}) + return res + + +def setup(args): + """ + Create configs and perform basic setups. + """ + cfg = get_cfg() + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + default_setup(cfg, args) + return cfg + + +def main(args): + cfg = setup(args) + + if args.eval_only: + model = Trainer.build_model(cfg) + DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( + cfg.MODEL.WEIGHTS, resume=args.resume + ) + res = Trainer.test(cfg, model) + if cfg.TEST.AUG.ENABLED: + res.update(Trainer.test_with_TTA(cfg, model)) + if comm.is_main_process(): + verify_results(cfg, res) + return res + + """ + If you'd like to do anything fancier than the standard training logic, + consider writing your own training loop (see plain_train_net.py) or + subclassing the trainer. + """ + trainer = Trainer(cfg) + trainer.resume_or_load(resume=args.resume) + if cfg.TEST.AUG.ENABLED: + trainer.register_hooks( + [hooks.EvalHook(0, lambda: trainer.test_with_TTA(cfg, trainer.model))] + ) + return trainer.train() + + +if __name__ == "__main__": + args = default_argument_parser().parse_args() + print("Command Line Args:", args) + launch( + main, + args.num_gpus, + num_machines=args.num_machines, + machine_rank=args.machine_rank, + dist_url=args.dist_url, + args=(args,), + ) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_data.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_data.py new file mode 100644 index 0000000..b143b2d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_data.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved +import argparse +import os +from itertools import chain +import cv2 +import tqdm + +from detectron2.config import get_cfg +from detectron2.data import DatasetCatalog, MetadataCatalog, build_detection_train_loader +from detectron2.data import detection_utils as utils +from detectron2.data.build import filter_images_with_few_keypoints +from detectron2.utils.logger import setup_logger +from detectron2.utils.visualizer import Visualizer + + +def setup(args): + cfg = get_cfg() + if args.config_file: + cfg.merge_from_file(args.config_file) + cfg.merge_from_list(args.opts) + cfg.freeze() + return cfg + + +def parse_args(in_args=None): + parser = argparse.ArgumentParser(description="Visualize ground-truth data") + parser.add_argument( + "--source", + choices=["annotation", "dataloader"], + required=True, + help="visualize the annotations or the data loader (with pre-processing)", + ) + parser.add_argument("--config-file", metavar="FILE", help="path to config file") + parser.add_argument("--output-dir", default="./", help="path to output directory") + parser.add_argument("--show", action="store_true", help="show output in a window") + parser.add_argument( + "opts", + help="Modify config options using the command-line", + default=None, + nargs=argparse.REMAINDER, + ) + return parser.parse_args(in_args) + + +if __name__ == "__main__": + args = parse_args() + logger = setup_logger() + logger.info("Arguments: " + str(args)) + cfg = setup(args) + + dirname = args.output_dir + os.makedirs(dirname, exist_ok=True) + metadata = MetadataCatalog.get(cfg.DATASETS.TRAIN[0]) + + def output(vis, fname): + if args.show: + print(fname) + cv2.imshow("window", vis.get_image()[:, :, ::-1]) + cv2.waitKey() + else: + filepath = os.path.join(dirname, fname) + print("Saving to {} ...".format(filepath)) + vis.save(filepath) + + scale = 2.0 if args.show else 1.0 + if args.source == "dataloader": + train_data_loader = build_detection_train_loader(cfg) + for batch in train_data_loader: + for per_image in batch: + # Pytorch tensor is in (C, H, W) format + img = per_image["image"].permute(1, 2, 0).cpu().detach().numpy() + img = utils.convert_image_to_rgb(img, cfg.INPUT.FORMAT) + + visualizer = Visualizer(img, metadata=metadata, scale=scale) + target_fields = per_image["instances"].get_fields() + labels = [metadata.thing_classes[i] for i in target_fields["gt_classes"]] + vis = visualizer.overlay_instances( + labels=labels, + boxes=target_fields.get("gt_boxes", None), + masks=target_fields.get("gt_masks", None), + keypoints=target_fields.get("gt_keypoints", None), + ) + output(vis, str(per_image["image_id"]) + ".jpg") + else: + dicts = list(chain.from_iterable([DatasetCatalog.get(k) for k in cfg.DATASETS.TRAIN])) + if cfg.MODEL.KEYPOINT_ON: + dicts = filter_images_with_few_keypoints(dicts, 1) + for dic in tqdm.tqdm(dicts): + img = utils.read_image(dic["file_name"], "RGB") + visualizer = Visualizer(img, metadata=metadata, scale=scale) + vis = visualizer.draw_dataset_dict(dic) + output(vis, os.path.basename(dic["file_name"])) diff --git a/preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_json_results.py b/preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_json_results.py new file mode 100644 index 0000000..d11ecb9 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/detectron2/tools/visualize_json_results.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved + +import argparse +import json +import numpy as np +import os +from collections import defaultdict +import cv2 +import tqdm +from fvcore.common.file_io import PathManager + +from detectron2.data import DatasetCatalog, MetadataCatalog +from detectron2.structures import Boxes, BoxMode, Instances +from detectron2.utils.logger import setup_logger +from detectron2.utils.visualizer import Visualizer + + +def create_instances(predictions, image_size): + ret = Instances(image_size) + + score = np.asarray([x["score"] for x in predictions]) + chosen = (score > args.conf_threshold).nonzero()[0] + score = score[chosen] + bbox = np.asarray([predictions[i]["bbox"] for i in chosen]).reshape(-1, 4) + bbox = BoxMode.convert(bbox, BoxMode.XYWH_ABS, BoxMode.XYXY_ABS) + + labels = np.asarray([dataset_id_map(predictions[i]["category_id"]) for i in chosen]) + + ret.scores = score + ret.pred_boxes = Boxes(bbox) + ret.pred_classes = labels + + try: + ret.pred_masks = [predictions[i]["segmentation"] for i in chosen] + except KeyError: + pass + return ret + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="A script that visualizes the json predictions from COCO or LVIS dataset." + ) + parser.add_argument("--input", required=True, help="JSON file produced by the model") + parser.add_argument("--output", required=True, help="output directory") + parser.add_argument("--dataset", help="name of the dataset", default="coco_2017_val") + parser.add_argument("--conf-threshold", default=0.5, type=float, help="confidence threshold") + args = parser.parse_args() + + logger = setup_logger() + + with PathManager.open(args.input, "r") as f: + predictions = json.load(f) + + pred_by_image = defaultdict(list) + for p in predictions: + pred_by_image[p["image_id"]].append(p) + + dicts = list(DatasetCatalog.get(args.dataset)) + metadata = MetadataCatalog.get(args.dataset) + if hasattr(metadata, "thing_dataset_id_to_contiguous_id"): + + def dataset_id_map(ds_id): + return metadata.thing_dataset_id_to_contiguous_id[ds_id] + + elif "lvis" in args.dataset: + # LVIS results are in the same format as COCO results, but have a different + # mapping from dataset category id to contiguous category id in [0, #categories - 1] + def dataset_id_map(ds_id): + return ds_id - 1 + + else: + raise ValueError("Unsupported dataset: {}".format(args.dataset)) + + os.makedirs(args.output, exist_ok=True) + + for dic in tqdm.tqdm(dicts): + img = cv2.imread(dic["file_name"], cv2.IMREAD_COLOR)[:, :, ::-1] + basename = os.path.basename(dic["file_name"]) + + predictions = create_instances(pred_by_image[dic["image_id"]], img.shape[:2]) + vis = Visualizer(img, metadata) + vis_pred = vis.draw_instance_predictions(predictions).get_image() + + vis = Visualizer(img, metadata) + vis_gt = vis.draw_dataset_dict(dic).get_image() + + concat = np.concatenate((vis_pred, vis_gt), axis=1) + cv2.imwrite(os.path.join(args.output, basename), concat[:, :, ::-1]) diff --git a/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_datasets.py b/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_datasets.py new file mode 100644 index 0000000..8b00594 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_datasets.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : datasets.py +@Time : 8/4/19 3:35 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import os +import numpy as np +import random +import torch +import cv2 +from torch.utils import data +from utils.transforms import get_affine_transform + + +class CropDataSet(data.Dataset): + def __init__(self, root, split_name, crop_size=[473, 473], scale_factor=0.25, + rotation_factor=30, ignore_label=255, transform=None): + self.root = root + self.aspect_ratio = crop_size[1] * 1.0 / crop_size[0] + self.crop_size = np.asarray(crop_size) + self.ignore_label = ignore_label + self.scale_factor = scale_factor + self.rotation_factor = rotation_factor + self.flip_prob = 0.5 + self.transform = transform + self.split_name = split_name + + list_path = os.path.join(self.root, self.split_name + '.txt') + train_list = [i_id.strip() for i_id in open(list_path)] + + self.train_list = train_list + self.number_samples = len(self.train_list) + + def __len__(self): + return self.number_samples + + def _box2cs(self, box): + x, y, w, h = box[:4] + return self._xywh2cs(x, y, w, h) + + def _xywh2cs(self, x, y, w, h): + center = np.zeros((2), dtype=np.float32) + center[0] = x + w * 0.5 + center[1] = y + h * 0.5 + if w > self.aspect_ratio * h: + h = w * 1.0 / self.aspect_ratio + elif w < self.aspect_ratio * h: + w = h * self.aspect_ratio + scale = np.array([w * 1.0, h * 1.0], dtype=np.float32) + return center, scale + + def __getitem__(self, index): + train_item = self.train_list[index] + + im_path = os.path.join(self.root, self.split_name + '_images', train_item + '.jpg') + parsing_anno_path = os.path.join(self.root, self.split_name + '_segmentations', train_item + '.png') + + im = cv2.imread(im_path, cv2.IMREAD_COLOR) + h, w, _ = im.shape + parsing_anno = np.zeros((h, w), dtype=np.long) + + # Get person center and scale + person_center, s = self._box2cs([0, 0, w - 1, h - 1]) + r = 0 + + if self.split_name != 'test': + # Get pose annotation + parsing_anno = cv2.imread(parsing_anno_path, cv2.IMREAD_GRAYSCALE) + sf = self.scale_factor + rf = self.rotation_factor + s = s * np.clip(np.random.randn() * sf + 1, 1 - sf, 1 + sf) + r = np.clip(np.random.randn() * rf, -rf * 2, rf * 2) if random.random() <= 0.6 else 0 + + if random.random() <= self.flip_prob: + im = im[:, ::-1, :] + parsing_anno = parsing_anno[:, ::-1] + person_center[0] = im.shape[1] - person_center[0] - 1 + right_idx = [15, 17, 19] + left_idx = [14, 16, 18] + for i in range(0, 3): + right_pos = np.where(parsing_anno == right_idx[i]) + left_pos = np.where(parsing_anno == left_idx[i]) + parsing_anno[right_pos[0], right_pos[1]] = left_idx[i] + parsing_anno[left_pos[0], left_pos[1]] = right_idx[i] + + trans = get_affine_transform(person_center, s, r, self.crop_size) + input = cv2.warpAffine( + im, + trans, + (int(self.crop_size[1]), int(self.crop_size[0])), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(0, 0, 0)) + + if self.transform: + input = self.transform(input) + + meta = { + 'name': train_item, + 'center': person_center, + 'height': h, + 'width': w, + 'scale': s, + 'rotation': r + } + + if self.split_name == 'val' or self.split_name == 'test': + return input, meta + else: + label_parsing = cv2.warpAffine( + parsing_anno, + trans, + (int(self.crop_size[1]), int(self.crop_size[0])), + flags=cv2.INTER_NEAREST, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(255)) + + label_parsing = torch.from_numpy(label_parsing) + + return input, label_parsing, meta + + +class CropDataValSet(data.Dataset): + def __init__(self, root, split_name='crop_pic', crop_size=[473, 473], transform=None, flip=False): + self.root = root + self.crop_size = crop_size + self.transform = transform + self.flip = flip + self.split_name = split_name + self.root = root + self.aspect_ratio = crop_size[1] * 1.0 / crop_size[0] + self.crop_size = np.asarray(crop_size) + + list_path = os.path.join(self.root, self.split_name + '.txt') + val_list = [i_id.strip() for i_id in open(list_path)] + + self.val_list = val_list + self.number_samples = len(self.val_list) + + def __len__(self): + return len(self.val_list) + + def _box2cs(self, box): + x, y, w, h = box[:4] + return self._xywh2cs(x, y, w, h) + + def _xywh2cs(self, x, y, w, h): + center = np.zeros((2), dtype=np.float32) + center[0] = x + w * 0.5 + center[1] = y + h * 0.5 + if w > self.aspect_ratio * h: + h = w * 1.0 / self.aspect_ratio + elif w < self.aspect_ratio * h: + w = h * self.aspect_ratio + scale = np.array([w * 1.0, h * 1.0], dtype=np.float32) + + return center, scale + + def __getitem__(self, index): + val_item = self.val_list[index] + # Load training image + im_path = os.path.join(self.root, self.split_name, val_item + '.jpg') + im = cv2.imread(im_path, cv2.IMREAD_COLOR) + h, w, _ = im.shape + # Get person center and scale + person_center, s = self._box2cs([0, 0, w - 1, h - 1]) + r = 0 + trans = get_affine_transform(person_center, s, r, self.crop_size) + input = cv2.warpAffine( + im, + trans, + (int(self.crop_size[1]), int(self.crop_size[0])), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(0, 0, 0)) + input = self.transform(input) + flip_input = input.flip(dims=[-1]) + if self.flip: + batch_input_im = torch.stack([input, flip_input]) + else: + batch_input_im = input + + meta = { + 'name': val_item, + 'center': person_center, + 'height': h, + 'width': w, + 'scale': s, + 'rotation': r + } + + return batch_input_im, meta diff --git a/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_evaluate.py b/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_evaluate.py new file mode 100644 index 0000000..288e3c8 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_evaluate.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : evaluate.py +@Time : 8/4/19 3:36 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import os +import argparse +import numpy as np +import torch + +from torch.utils import data +from tqdm import tqdm +from PIL import Image as PILImage +import torchvision.transforms as transforms +import torch.backends.cudnn as cudnn + +import networks +from utils.miou import compute_mean_ioU +from utils.transforms import BGR2RGB_transform +from utils.transforms import transform_parsing, transform_logits +from mhp_extension.global_local_parsing.global_local_datasets import CropDataValSet + + +def get_arguments(): + """Parse all the arguments provided from the CLI. + + Returns: + A list of parsed arguments. + """ + parser = argparse.ArgumentParser(description="Self Correction for Human Parsing") + + # Network Structure + parser.add_argument("--arch", type=str, default='resnet101') + # Data Preference + parser.add_argument("--data-dir", type=str, default='./data/LIP') + parser.add_argument("--batch-size", type=int, default=1) + parser.add_argument("--split-name", type=str, default='crop_pic') + parser.add_argument("--input-size", type=str, default='473,473') + parser.add_argument("--num-classes", type=int, default=20) + parser.add_argument("--ignore-label", type=int, default=255) + parser.add_argument("--random-mirror", action="store_true") + parser.add_argument("--random-scale", action="store_true") + # Evaluation Preference + parser.add_argument("--log-dir", type=str, default='./log') + parser.add_argument("--model-restore", type=str, default='./log/checkpoint.pth.tar') + parser.add_argument("--gpu", type=str, default='0', help="choose gpu device.") + parser.add_argument("--save-results", action="store_true", help="whether to save the results.") + parser.add_argument("--flip", action="store_true", help="random flip during the test.") + parser.add_argument("--multi-scales", type=str, default='1', help="multiple scales during the test") + return parser.parse_args() + + +def get_palette(num_cls): + """ Returns the color map for visualizing the segmentation mask. + Args: + num_cls: Number of classes + Returns: + The color map + """ + n = num_cls + palette = [0] * (n * 3) + for j in range(0, n): + lab = j + palette[j * 3 + 0] = 0 + palette[j * 3 + 1] = 0 + palette[j * 3 + 2] = 0 + i = 0 + while lab: + palette[j * 3 + 0] |= (((lab >> 0) & 1) << (7 - i)) + palette[j * 3 + 1] |= (((lab >> 1) & 1) << (7 - i)) + palette[j * 3 + 2] |= (((lab >> 2) & 1) << (7 - i)) + i += 1 + lab >>= 3 + return palette + + +def multi_scale_testing(model, batch_input_im, crop_size=[473, 473], flip=True, multi_scales=[1]): + flipped_idx = (15, 14, 17, 16, 19, 18) + if len(batch_input_im.shape) > 4: + batch_input_im = batch_input_im.squeeze() + if len(batch_input_im.shape) == 3: + batch_input_im = batch_input_im.unsqueeze(0) + + interp = torch.nn.Upsample(size=crop_size, mode='bilinear', align_corners=True) + ms_outputs = [] + for s in multi_scales: + interp_im = torch.nn.Upsample(scale_factor=s, mode='bilinear', align_corners=True) + scaled_im = interp_im(batch_input_im) + parsing_output = model(scaled_im) + parsing_output = parsing_output[0][-1] + output = parsing_output[0] + if flip: + flipped_output = parsing_output[1] + flipped_output[14:20, :, :] = flipped_output[flipped_idx, :, :] + output += flipped_output.flip(dims=[-1]) + output *= 0.5 + output = interp(output.unsqueeze(0)) + ms_outputs.append(output[0]) + ms_fused_parsing_output = torch.stack(ms_outputs) + ms_fused_parsing_output = ms_fused_parsing_output.mean(0) + ms_fused_parsing_output = ms_fused_parsing_output.permute(1, 2, 0) # HWC + parsing = torch.argmax(ms_fused_parsing_output, dim=2) + parsing = parsing.data.cpu().numpy() + ms_fused_parsing_output = ms_fused_parsing_output.data.cpu().numpy() + return parsing, ms_fused_parsing_output + + +def main(): + """Create the model and start the evaluation process.""" + args = get_arguments() + multi_scales = [float(i) for i in args.multi_scales.split(',')] + gpus = [int(i) for i in args.gpu.split(',')] + assert len(gpus) == 1 + if not args.gpu == 'None': + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + cudnn.benchmark = True + cudnn.enabled = True + + h, w = map(int, args.input_size.split(',')) + input_size = [h, w] + + model = networks.init_model(args.arch, num_classes=args.num_classes, pretrained=None) + + IMAGE_MEAN = model.mean + IMAGE_STD = model.std + INPUT_SPACE = model.input_space + print('image mean: {}'.format(IMAGE_MEAN)) + print('image std: {}'.format(IMAGE_STD)) + print('input space:{}'.format(INPUT_SPACE)) + if INPUT_SPACE == 'BGR': + print('BGR Transformation') + transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize(mean=IMAGE_MEAN, + std=IMAGE_STD), + + ]) + if INPUT_SPACE == 'RGB': + print('RGB Transformation') + transform = transforms.Compose([ + transforms.ToTensor(), + BGR2RGB_transform(), + transforms.Normalize(mean=IMAGE_MEAN, + std=IMAGE_STD), + ]) + + # Data loader + lip_test_dataset = CropDataValSet(args.data_dir, args.split_name, crop_size=input_size, transform=transform, + flip=args.flip) + num_samples = len(lip_test_dataset) + print('Totoal testing sample numbers: {}'.format(num_samples)) + testloader = data.DataLoader(lip_test_dataset, batch_size=args.batch_size, shuffle=False, pin_memory=True) + + # Load model weight + state_dict = torch.load(args.model_restore) + from collections import OrderedDict + new_state_dict = OrderedDict() + for k, v in state_dict.items(): + name = k[7:] # remove `module.` + new_state_dict[name] = v + model.load_state_dict(new_state_dict) + model.cuda() + model.eval() + + sp_results_dir = os.path.join(args.log_dir, args.split_name + '_parsing') + if not os.path.exists(sp_results_dir): + os.makedirs(sp_results_dir) + + palette = get_palette(20) + parsing_preds = [] + scales = np.zeros((num_samples, 2), dtype=np.float32) + centers = np.zeros((num_samples, 2), dtype=np.int32) + with torch.no_grad(): + for idx, batch in enumerate(tqdm(testloader)): + image, meta = batch + if (len(image.shape) > 4): + image = image.squeeze() + im_name = meta['name'][0] + c = meta['center'].numpy()[0] + s = meta['scale'].numpy()[0] + w = meta['width'].numpy()[0] + h = meta['height'].numpy()[0] + scales[idx, :] = s + centers[idx, :] = c + parsing, logits = multi_scale_testing(model, image.cuda(), crop_size=input_size, flip=args.flip, + multi_scales=multi_scales) + if args.save_results: + parsing_result = transform_parsing(parsing, c, s, w, h, input_size) + parsing_result_path = os.path.join(sp_results_dir, im_name + '.png') + output_im = PILImage.fromarray(np.asarray(parsing_result, dtype=np.uint8)) + output_im.putpalette(palette) + output_im.save(parsing_result_path) + # save logits + logits_result = transform_logits(logits, c, s, w, h, input_size) + logits_result_path = os.path.join(sp_results_dir, im_name + '.npy') + np.save(logits_result_path, logits_result) + return + + +if __name__ == '__main__': + main() diff --git a/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_train.py b/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_train.py new file mode 100644 index 0000000..810b1db --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/global_local_parsing/global_local_train.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : train.py +@Time : 8/4/19 3:36 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import os +import json +import timeit +import argparse + +import torch +import torch.optim as optim +import torchvision.transforms as transforms +import torch.backends.cudnn as cudnn +from torch.utils import data + +import networks +import utils.schp as schp +from datasets.datasets import LIPDataSet +from datasets.target_generation import generate_edge_tensor +from utils.transforms import BGR2RGB_transform +from utils.criterion import CriterionAll +from utils.encoding import DataParallelModel, DataParallelCriterion +from utils.warmup_scheduler import SGDRScheduler + + +def get_arguments(): + """Parse all the arguments provided from the CLI. + Returns: + A list of parsed arguments. + """ + parser = argparse.ArgumentParser(description="Self Correction for Human Parsing") + + # Network Structure + parser.add_argument("--arch", type=str, default='resnet101') + # Data Preference + parser.add_argument("--data-dir", type=str, default='./data/LIP') + parser.add_argument("--batch-size", type=int, default=16) + parser.add_argument("--input-size", type=str, default='473,473') + parser.add_argument("--split-name", type=str, default='crop_pic') + parser.add_argument("--num-classes", type=int, default=20) + parser.add_argument("--ignore-label", type=int, default=255) + parser.add_argument("--random-mirror", action="store_true") + parser.add_argument("--random-scale", action="store_true") + # Training Strategy + parser.add_argument("--learning-rate", type=float, default=7e-3) + parser.add_argument("--momentum", type=float, default=0.9) + parser.add_argument("--weight-decay", type=float, default=5e-4) + parser.add_argument("--gpu", type=str, default='0,1,2') + parser.add_argument("--start-epoch", type=int, default=0) + parser.add_argument("--epochs", type=int, default=150) + parser.add_argument("--eval-epochs", type=int, default=10) + parser.add_argument("--imagenet-pretrain", type=str, default='./pretrain_model/resnet101-imagenet.pth') + parser.add_argument("--log-dir", type=str, default='./log') + parser.add_argument("--model-restore", type=str, default='./log/checkpoint.pth.tar') + parser.add_argument("--schp-start", type=int, default=100, help='schp start epoch') + parser.add_argument("--cycle-epochs", type=int, default=10, help='schp cyclical epoch') + parser.add_argument("--schp-restore", type=str, default='./log/schp_checkpoint.pth.tar') + parser.add_argument("--lambda-s", type=float, default=1, help='segmentation loss weight') + parser.add_argument("--lambda-e", type=float, default=1, help='edge loss weight') + parser.add_argument("--lambda-c", type=float, default=0.1, help='segmentation-edge consistency loss weight') + return parser.parse_args() + + +def main(): + args = get_arguments() + print(args) + + start_epoch = 0 + cycle_n = 0 + + if not os.path.exists(args.log_dir): + os.makedirs(args.log_dir) + with open(os.path.join(args.log_dir, 'args.json'), 'w') as opt_file: + json.dump(vars(args), opt_file) + + gpus = [int(i) for i in args.gpu.split(',')] + if not args.gpu == 'None': + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu + + input_size = list(map(int, args.input_size.split(','))) + + cudnn.enabled = True + cudnn.benchmark = True + + # Model Initialization + AugmentCE2P = networks.init_model(args.arch, num_classes=args.num_classes, pretrained=args.imagenet_pretrain) + model = DataParallelModel(AugmentCE2P) + model.cuda() + + IMAGE_MEAN = AugmentCE2P.mean + IMAGE_STD = AugmentCE2P.std + INPUT_SPACE = AugmentCE2P.input_space + print('image mean: {}'.format(IMAGE_MEAN)) + print('image std: {}'.format(IMAGE_STD)) + print('input space:{}'.format(INPUT_SPACE)) + + restore_from = args.model_restore + if os.path.exists(restore_from): + print('Resume training from {}'.format(restore_from)) + checkpoint = torch.load(restore_from) + model.load_state_dict(checkpoint['state_dict']) + start_epoch = checkpoint['epoch'] + + SCHP_AugmentCE2P = networks.init_model(args.arch, num_classes=args.num_classes, pretrained=args.imagenet_pretrain) + schp_model = DataParallelModel(SCHP_AugmentCE2P) + schp_model.cuda() + + if os.path.exists(args.schp_restore): + print('Resuming schp checkpoint from {}'.format(args.schp_restore)) + schp_checkpoint = torch.load(args.schp_restore) + schp_model_state_dict = schp_checkpoint['state_dict'] + cycle_n = schp_checkpoint['cycle_n'] + schp_model.load_state_dict(schp_model_state_dict) + + # Loss Function + criterion = CriterionAll(lambda_1=args.lambda_s, lambda_2=args.lambda_e, lambda_3=args.lambda_c, + num_classes=args.num_classes) + criterion = DataParallelCriterion(criterion) + criterion.cuda() + + # Data Loader + if INPUT_SPACE == 'BGR': + print('BGR Transformation') + transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize(mean=IMAGE_MEAN, + std=IMAGE_STD), + ]) + + elif INPUT_SPACE == 'RGB': + print('RGB Transformation') + transform = transforms.Compose([ + transforms.ToTensor(), + BGR2RGB_transform(), + transforms.Normalize(mean=IMAGE_MEAN, + std=IMAGE_STD), + ]) + + train_dataset = LIPDataSet(args.data_dir, args.split_name, crop_size=input_size, transform=transform) + train_loader = data.DataLoader(train_dataset, batch_size=args.batch_size * len(gpus), + num_workers=16, shuffle=True, pin_memory=True, drop_last=True) + print('Total training samples: {}'.format(len(train_dataset))) + + # Optimizer Initialization + optimizer = optim.SGD(model.parameters(), lr=args.learning_rate, momentum=args.momentum, + weight_decay=args.weight_decay) + + lr_scheduler = SGDRScheduler(optimizer, total_epoch=args.epochs, + eta_min=args.learning_rate / 100, warmup_epoch=10, + start_cyclical=args.schp_start, cyclical_base_lr=args.learning_rate / 2, + cyclical_epoch=args.cycle_epochs) + + total_iters = args.epochs * len(train_loader) + start = timeit.default_timer() + for epoch in range(start_epoch, args.epochs): + lr_scheduler.step(epoch=epoch) + lr = lr_scheduler.get_lr()[0] + + model.train() + for i_iter, batch in enumerate(train_loader): + i_iter += len(train_loader) * epoch + + images, labels, _ = batch + labels = labels.cuda(non_blocking=True) + + edges = generate_edge_tensor(labels) + labels = labels.type(torch.cuda.LongTensor) + edges = edges.type(torch.cuda.LongTensor) + + preds = model(images) + + # Online Self Correction Cycle with Label Refinement + if cycle_n >= 1: + with torch.no_grad(): + soft_preds = schp_model(images) + soft_parsing = [] + soft_edge = [] + for soft_pred in soft_preds: + soft_parsing.append(soft_pred[0][-1]) + soft_edge.append(soft_pred[1][-1]) + soft_preds = torch.cat(soft_parsing, dim=0) + soft_edges = torch.cat(soft_edge, dim=0) + else: + soft_preds = None + soft_edges = None + + loss = criterion(preds, [labels, edges, soft_preds, soft_edges], cycle_n) + + optimizer.zero_grad() + loss.backward() + optimizer.step() + + if i_iter % 100 == 0: + print('iter = {} of {} completed, lr = {}, loss = {}'.format(i_iter, total_iters, lr, + loss.data.cpu().numpy())) + if (epoch + 1) % (args.eval_epochs) == 0: + schp.save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + }, False, args.log_dir, filename='checkpoint_{}.pth.tar'.format(epoch + 1)) + + # Self Correction Cycle with Model Aggregation + if (epoch + 1) >= args.schp_start and (epoch + 1 - args.schp_start) % args.cycle_epochs == 0: + print('Self-correction cycle number {}'.format(cycle_n)) + schp.moving_average(schp_model, model, 1.0 / (cycle_n + 1)) + cycle_n += 1 + schp.bn_re_estimate(train_loader, schp_model) + schp.save_schp_checkpoint({ + 'state_dict': schp_model.state_dict(), + 'cycle_n': cycle_n, + }, False, args.log_dir, filename='schp_{}_checkpoint.pth.tar'.format(cycle_n)) + + torch.cuda.empty_cache() + end = timeit.default_timer() + print('epoch = {} of {} completed using {} s'.format(epoch, args.epochs, + (end - start) / (epoch - start_epoch + 1))) + + end = timeit.default_timer() + print('Training Finished in {} seconds'.format(end - start)) + + +if __name__ == '__main__': + main() diff --git a/preprocess/humanparsing/mhp_extension/global_local_parsing/make_id_list.py b/preprocess/humanparsing/mhp_extension/global_local_parsing/make_id_list.py new file mode 100644 index 0000000..311edf4 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/global_local_parsing/make_id_list.py @@ -0,0 +1,13 @@ +import os + +DATASET = 'VIP' # DATASET: MHPv2 or CIHP or VIP +TYPE = 'crop_pic' # crop_pic or DemoDataset +IMG_DIR = '../demo/cropped_img/crop_pic' +SAVE_DIR = '../demo/cropped_img' + +if not os.path.exists(SAVE_DIR): + os.makedirs(SAVE_DIR) + +with open(os.path.join(SAVE_DIR, TYPE + '.txt'), "w") as f: + for img_name in os.listdir(IMG_DIR): + f.write(img_name[:-4] + '\n') diff --git a/preprocess/humanparsing/mhp_extension/logits_fusion.py b/preprocess/humanparsing/mhp_extension/logits_fusion.py new file mode 100644 index 0000000..07a8446 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/logits_fusion.py @@ -0,0 +1,307 @@ +import argparse +import cv2 +import os +import json +import numpy as np +from PIL import Image as PILImage +import joblib + + +def mask_nms(masks, bbox_scores, instances_confidence_threshold=0.5, overlap_threshold=0.7): + """ + NMS-like procedure used in Panoptic Segmentation + Remove the overlap areas of different instances in Instance Segmentation + """ + panoptic_seg = np.zeros(masks.shape[:2], dtype=np.uint8) + sorted_inds = list(range(len(bbox_scores))) + current_segment_id = 0 + segments_score = [] + + for inst_id in sorted_inds: + score = bbox_scores[inst_id] + if score < instances_confidence_threshold: + break + mask = masks[:, :, inst_id] + mask_area = mask.sum() + + if mask_area == 0: + continue + + intersect = (mask > 0) & (panoptic_seg > 0) + intersect_area = intersect.sum() + + if intersect_area * 1.0 / mask_area > overlap_threshold: + continue + + if intersect_area > 0: + mask = mask & (panoptic_seg == 0) + + current_segment_id += 1 + # panoptic_seg[np.where(mask==1)] = current_segment_id + # panoptic_seg = panoptic_seg + current_segment_id*mask + panoptic_seg = np.where(mask == 0, panoptic_seg, current_segment_id) + segments_score.append(score) + # print(np.unique(panoptic_seg)) + return panoptic_seg, segments_score + + +def extend(si, sj, instance_label, global_label, panoptic_seg_mask, class_map): + """ + """ + directions = [[-1, 0], [0, 1], [1, 0], [0, -1], + [1, 1], [1, -1], [-1, 1], [-1, -1]] + + inst_class = instance_label[si, sj] + human_class = panoptic_seg_mask[si, sj] + global_class = class_map[inst_class] + queue = [[si, sj]] + + while len(queue) != 0: + cur = queue[0] + queue.pop(0) + + for direction in directions: + ni = cur[0] + direction[0] + nj = cur[1] + direction[1] + + if ni >= 0 and nj >= 0 and \ + ni < instance_label.shape[0] and \ + nj < instance_label.shape[1] and \ + instance_label[ni, nj] == 0 and \ + global_label[ni, nj] == global_class: + instance_label[ni, nj] = inst_class + # Using refined instance label to refine human label + panoptic_seg_mask[ni, nj] = human_class + queue.append([ni, nj]) + + +def refine(instance_label, panoptic_seg_mask, global_label, class_map): + """ + Inputs: + [ instance_label ] + np.array() with shape [h, w] + [ global_label ] with shape [h, w] + np.array() + """ + for i in range(instance_label.shape[0]): + for j in range(instance_label.shape[1]): + if instance_label[i, j] != 0: + extend(i, j, instance_label, global_label, panoptic_seg_mask, class_map) + + +def get_palette(num_cls): + """ Returns the color map for visualizing the segmentation mask. + Inputs: + =num_cls= + Number of classes. + Returns: + The color map. + """ + n = num_cls + palette = [0] * (n * 3) + for j in range(0, n): + lab = j + palette[j * 3 + 0] = 0 + palette[j * 3 + 1] = 0 + palette[j * 3 + 2] = 0 + i = 0 + while lab: + palette[j * 3 + 0] |= (((lab >> 0) & 1) << (7 - i)) + palette[j * 3 + 1] |= (((lab >> 1) & 1) << (7 - i)) + palette[j * 3 + 2] |= (((lab >> 2) & 1) << (7 - i)) + i += 1 + lab >>= 3 + return palette + + +def patch2img_output(patch_dir, img_name, img_height, img_width, bbox, bbox_type, num_class): + """transform bbox patch outputs to image output""" + assert bbox_type == 'gt' or 'msrcnn' + output = np.zeros((img_height, img_width, num_class), dtype='float') + output[:, :, 0] = np.inf + count_predictions = np.zeros((img_height, img_width, num_class), dtype='int32') + for i in range(len(bbox)): # person index starts from 1 + file_path = os.path.join(patch_dir, os.path.splitext(img_name)[0] + '_' + str(i + 1) + '_' + bbox_type + '.npy') + bbox_output = np.load(file_path) + output[bbox[i][1]:bbox[i][3] + 1, bbox[i][0]:bbox[i][2] + 1, 1:] += bbox_output[:, :, 1:] + count_predictions[bbox[i][1]:bbox[i][3] + 1, bbox[i][0]:bbox[i][2] + 1, 1:] += 1 + output[bbox[i][1]:bbox[i][3] + 1, bbox[i][0]:bbox[i][2] + 1, 0] \ + = np.minimum(output[bbox[i][1]:bbox[i][3] + 1, bbox[i][0]:bbox[i][2] + 1, 0], bbox_output[:, :, 0]) + + # Caution zero dividing. + count_predictions[count_predictions == 0] = 1 + return output / count_predictions + + +def get_instance(cat_gt, panoptic_seg_mask): + """ + """ + instance_gt = np.zeros_like(cat_gt, dtype=np.uint8) + num_humans = len(np.unique(panoptic_seg_mask)) - 1 + class_map = {} + + total_part_num = 0 + for id in range(1, num_humans + 1): + human_part_label = np.where(panoptic_seg_mask == id, cat_gt, 0).astype(np.uint8) + # human_part_label = (np.where(panoptic_seg_mask==id) * cat_gt).astype(np.uint8) + part_classes = np.unique(human_part_label) + + exceed = False + for part_id in part_classes: + if part_id == 0: # background + continue + total_part_num += 1 + + if total_part_num > 255: + print("total_part_num exceed, return current instance map: {}".format(total_part_num)) + exceed = True + break + class_map[total_part_num] = part_id + instance_gt[np.where(human_part_label == part_id)] = total_part_num + if exceed: + break + + # Make instance id continous. + ori_cur_labels = np.unique(instance_gt) + total_num_label = len(ori_cur_labels) + if instance_gt.max() + 1 != total_num_label: + for label in range(1, total_num_label): + instance_gt[instance_gt == ori_cur_labels[label]] = label + + final_class_map = {} + for label in range(1, total_num_label): + if label >= 1: + final_class_map[label] = class_map[ori_cur_labels[label]] + + return instance_gt, final_class_map + + +def compute_confidence(im_name, feature_map, class_map, + instance_label, output_dir, + panoptic_seg_mask, seg_score_list): + """ + """ + conf_file = open(os.path.join(output_dir, os.path.splitext(im_name)[0] + '.txt'), 'w') + + weighted_map = np.zeros_like(feature_map[:, :, 0]) + for index, score in enumerate(seg_score_list): + weighted_map += (panoptic_seg_mask == index + 1) * score + + for label in class_map.keys(): + cls = class_map[label] + confidence = feature_map[:, :, cls].reshape(-1)[np.where(instance_label.reshape(-1) == label)] + confidence = (weighted_map * feature_map[:, :, cls].copy()).reshape(-1)[ + np.where(instance_label.reshape(-1) == label)] + + confidence = confidence.sum() / len(confidence) + conf_file.write('{} {}\n'.format(cls, confidence)) + + conf_file.close() + + +def result_saving(fused_output, img_name, img_height, img_width, output_dir, mask_output_path, bbox_score, msrcnn_bbox): + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + global_root = os.path.join(output_dir, 'global_parsing') + instance_root = os.path.join(output_dir, 'instance_parsing') + tag_dir = os.path.join(output_dir, 'global_tag') + + if not os.path.exists(global_root): + os.makedirs(global_root) + if not os.path.exists(instance_root): + os.makedirs(instance_root) + if not os.path.exists(tag_dir): + os.makedirs(tag_dir) + + # For visualizing indexed png image. + palette = get_palette(256) + + fused_output = cv2.resize(fused_output, dsize=(img_width, img_height), interpolation=cv2.INTER_LINEAR) + seg_pred = np.asarray(np.argmax(fused_output, axis=2), dtype=np.uint8) + masks = np.load(mask_output_path) + masks[np.where(seg_pred == 0)] = 0 + + panoptic_seg_mask = masks + seg_score_list = bbox_score + + instance_pred, class_map = get_instance(seg_pred, panoptic_seg_mask) + refine(instance_pred, panoptic_seg_mask, seg_pred, class_map) + + compute_confidence(img_name, fused_output, class_map, instance_pred, instance_root, + panoptic_seg_mask, seg_score_list) + + ins_seg_results = open(os.path.join(tag_dir, os.path.splitext(img_name)[0] + '.txt'), "a") + keep_human_id_list = list(np.unique(panoptic_seg_mask)) + if 0 in keep_human_id_list: + keep_human_id_list.remove(0) + for i in keep_human_id_list: + ins_seg_results.write('{:.6f} {} {} {} {}\n'.format(seg_score_list[i - 1], + int(msrcnn_bbox[i - 1][1]), int(msrcnn_bbox[i - 1][0]), + int(msrcnn_bbox[i - 1][3]), int(msrcnn_bbox[i - 1][2]))) + ins_seg_results.close() + + output_im_global = PILImage.fromarray(seg_pred) + output_im_instance = PILImage.fromarray(instance_pred) + output_im_tag = PILImage.fromarray(panoptic_seg_mask) + output_im_global.putpalette(palette) + output_im_instance.putpalette(palette) + output_im_tag.putpalette(palette) + + output_im_global.save(os.path.join(global_root, os.path.splitext(img_name)[0] + '.png')) + output_im_instance.save(os.path.join(instance_root, os.path.splitext(img_name)[0] + '.png')) + output_im_tag.save(os.path.join(tag_dir, os.path.splitext(img_name)[0] + '.png')) + + +def multi_process(a, args): + img_name = a['im_name'] + img_height = a['img_height'] + img_width = a['img_width'] + msrcnn_bbox = a['person_bbox'] + bbox_score = a['person_bbox_score'] + + ######### loading outputs from gloabl and local models ######### + global_output = np.load(os.path.join(args.global_output_dir, os.path.splitext(img_name)[0] + '.npy')) + + msrcnn_output = patch2img_output(args.msrcnn_output_dir, img_name, img_height, img_width, msrcnn_bbox, + bbox_type='msrcnn', num_class=20) + + gt_output = patch2img_output(args.gt_output_dir, img_name, img_height, img_width, msrcnn_bbox, bbox_type='msrcnn', + num_class=20) + + #### global and local branch logits fusion ##### +# fused_output = global_output + msrcnn_output + gt_output + fused_output = global_output + gt_output + + + mask_output_path = os.path.join(args.mask_output_dir, os.path.splitext(img_name)[0] + '_mask.npy') + result_saving(fused_output, img_name, img_height, img_width, args.save_dir, mask_output_path, bbox_score, msrcnn_bbox) + return + + +def main(args): + json_file = open(args.test_json_path) + anno = json.load(json_file)['root'] + + results = joblib.Parallel(n_jobs=24, verbose=10, pre_dispatch="all")( + [joblib.delayed(multi_process)(a, args) for i, a in enumerate(anno)] + ) + + +def get_arguments(): + parser = argparse.ArgumentParser(description="obtain final prediction by logits fusion") + parser.add_argument("--test_json_path", type=str, default='./data/CIHP/cascade_152_finetune/test.json') + parser.add_argument("--global_output_dir", type=str, + default='./data/CIHP/global/global_result-cihp-resnet101/global_output') +# parser.add_argument("--msrcnn_output_dir", type=str, +# default='./data/CIHP/cascade_152__finetune/msrcnn_result-cihp-resnet101/msrcnn_output') + parser.add_argument("--gt_output_dir", type=str, + default='./data/CIHP/cascade_152__finetune/gt_result-cihp-resnet101/gt_output') + parser.add_argument("--mask_output_dir", type=str, default='./data/CIHP/cascade_152_finetune/mask') + parser.add_argument("--save_dir", type=str, default='./data/CIHP/fusion_results/cihp-msrcnn_finetune') + return parser.parse_args() + + +if __name__ == '__main__': + args = get_arguments() + main(args) diff --git a/preprocess/humanparsing/mhp_extension/make_crop_and_mask_w_mask_nms.py b/preprocess/humanparsing/mhp_extension/make_crop_and_mask_w_mask_nms.py new file mode 100644 index 0000000..1efc5ae --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/make_crop_and_mask_w_mask_nms.py @@ -0,0 +1,134 @@ +import numpy as np +import cv2, torch +import os +import json +import argparse +import pycocotools.mask as mask_util +from tqdm import tqdm + + +def bbox_expand(img_height, img_width, bbox, exp_ratio): + x_min, y_min, x_max, y_max = bbox[:] + exp_x = (x_max - x_min) * ((exp_ratio - 1) / 2) + exp_y = (y_max - y_min) * ((exp_ratio - 1) / 2) + new_x_min = 0 if x_min - exp_x < 0 else np.round(x_min - exp_x) + new_y_min = 0 if y_min - exp_y < 0 else np.round(y_min - exp_y) + new_x_max = img_width - 1 if x_max + exp_x > img_width - 1 else np.round(x_max + exp_x) + new_y_max = img_height - 1 if y_max + exp_y > img_height - 1 else np.round(y_max + exp_y) + return int(new_x_min), int(new_y_min), int(new_x_max), int(new_y_max) + + +def make_crop_and_mask(img_info, pred, file_list, crop_save_dir, mask_save_dir, args): + img_name = img_info['file_name'] + img_id = img_info['id'] - 1 # img_info['id'] start form 1 + img_w = img_info['width'] + img_h = img_info['height'] + + img = cv2.imread(os.path.join(args.img_dir, img_name)) + + exp_bbox = [] + ori_bbox = [] + bbox_name_list = [] + bbox_score_list = [] + person_idx = 0 + + panoptic_seg = np.zeros((img_h, img_w), dtype=np.uint8) + assert len(pred[img_id]['instances']) > 0, 'image without instance prediction' + + for instance in pred[img_id]['instances']: + score = instance['score'] + if score < args.conf_thres: + break + + mask = mask_util.decode(instance['segmentation']) + mask_area = mask.sum() + + if mask_area == 0: # if mask_area < img_w*img_h/1000: + continue + + intersect = (mask > 0) & (panoptic_seg > 0) + intersect_area = intersect.sum() + + if intersect_area * 1.0 / mask_area > args.overlap_threshold: # todo add args + continue + + if intersect_area > 0: + mask = mask & (panoptic_seg == 0) + + person_idx += 1 + panoptic_seg = np.where(mask == 0, panoptic_seg, person_idx) + + bbox_score_list.append(score) + + ins_bbox = instance['bbox'] # [x,y,w,h] format + x_min, y_min, box_w, box_h = ins_bbox + x_max, y_max = x_min + box_w, y_min + box_h + exp_x_min, exp_y_min, exp_x_max, exp_y_max = bbox_expand(img_h, img_w, [x_min, y_min, x_max, y_max], + args.exp_ratio) + crop_img = img[exp_y_min:exp_y_max + 1, exp_x_min:exp_x_max + 1, :] + exp_bbox.append([exp_x_min, exp_y_min, exp_x_max, exp_y_max]) + ori_bbox.append([x_min, y_min, x_max, y_max]) + bbox_name = os.path.splitext(img_name)[0] + '_' + str(person_idx) + '_msrcnn.jpg' + bbox_name_list.append(bbox_name) + + cv2.imwrite(os.path.join(crop_save_dir, bbox_name), crop_img) + + assert person_idx > 0, 'image without instance' + mask_name = os.path.splitext(img_name)[0] + '_mask.npy' + np.save(os.path.join(mask_save_dir, mask_name), panoptic_seg) + + ############## json writing ################## + item = {} + item['dataset'] = 'CIHP' + item['im_name'] = img_name + item['img_height'] = img_h + item['img_width'] = img_w + item['center'] = [img_h / 2, img_w / 2] + item['person_num'] = person_idx + item['person_bbox'] = exp_bbox + item['real_person_bbox'] = ori_bbox + item['person_bbox_score'] = bbox_score_list + item['bbox_name'] = bbox_name_list + item['mask_name'] = mask_name + file_list.append(item) + json_file = {'root': file_list} + return json_file, file_list + + +def get_arguments(): + parser = argparse.ArgumentParser(description="crop person val/test demo for inference") + parser.add_argument("--exp_ratio", type=float, default=1.2) + parser.add_argument("--overlap_threshold", type=float, default=0.5) + parser.add_argument("--conf_thres", type=float, default=0.5) + parser.add_argument("--img_dir", type=str, + default='/data03/v_xuyunqiu/data/instance-level_human_parsing/Testing/Images') + parser.add_argument("--save_dir", type=str, + default='/data03/v_xuyunqiu/Projects/experiment_data/testing/resnest_200_TTA_mask_nms_all_data') + parser.add_argument("--img_list", type=str, + default='/data03/v_xuyunqiu/Projects/pycococreator/annotations/CIHP_test.json') + parser.add_argument("--det_res", type=str, + default='/data02/v_xuyunqiu/detectron2-ResNeSt/tools/output_cihp_inference_resnest/inference_TTA/instances_predictions.pth') + return parser.parse_args() + + +def main(args): + img_info_list = json.load(open(args.img_list, encoding='UTF-8')) + pred = torch.load(args.det_res) + + crop_save_dir = os.path.join(args.save_dir, 'crop_pic') + if not os.path.exists(crop_save_dir): + os.makedirs(crop_save_dir) + mask_save_dir = os.path.join(args.save_dir, 'crop_mask') + if not os.path.exists(mask_save_dir): + os.makedirs(mask_save_dir) + + file_list = [] + for img_info in tqdm(img_info_list['images']): + json_file, file_list = make_crop_and_mask(img_info, pred, file_list, crop_save_dir, mask_save_dir, args) + with open(os.path.join(args.save_dir, 'crop.json'), 'w') as f: + json.dump(json_file, f, indent=2) + + +if __name__ == '__main__': + args = get_arguments() + main(args) diff --git a/preprocess/humanparsing/mhp_extension/scripts/make_coco_style_annotation.sh b/preprocess/humanparsing/mhp_extension/scripts/make_coco_style_annotation.sh new file mode 100644 index 0000000..37a1e7d --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/scripts/make_coco_style_annotation.sh @@ -0,0 +1,14 @@ +python ./coco_style_annotation_creator/human_to_coco.py \ + --dataset 'CIHP' \ + --json_save_dir './data/CIHP/annotations' \ + --train_img_dir './data/CIHP/Training/Images' \ + --train_anno_dir './data/CIHP/Training/Human_ids' \ + --val_img_dir './data/CIHP/Validation/Images' \ + --val_anno_dir './data/CIHP/Validation/Human_ids' + + +python ./coco_style_annotation_creator/test_human2coco_format.py \ + --dataset 'CIHP' \ + --json_save_dir './data/CIHP/annotations' \ + --test_img_dir './data/CIHP/Testing/Images' + diff --git a/preprocess/humanparsing/mhp_extension/scripts/make_crop.sh b/preprocess/humanparsing/mhp_extension/scripts/make_crop.sh new file mode 100644 index 0000000..604a433 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/scripts/make_crop.sh @@ -0,0 +1,6 @@ +python make_crop_and_mask_w_mask_nms.py \ + --img_dir './data/CIHP/Testing/Images' \ + --save_dir './data/CIHP/' \ + --img_list './data/CIHP/annotations/CIHP_val.json' \ + --det_res './data/CIHP/detectron2_prediction/inference/instances_predictions.pth' + diff --git a/preprocess/humanparsing/mhp_extension/scripts/parsing_fusion.sh b/preprocess/humanparsing/mhp_extension/scripts/parsing_fusion.sh new file mode 100644 index 0000000..107bcf6 --- /dev/null +++ b/preprocess/humanparsing/mhp_extension/scripts/parsing_fusion.sh @@ -0,0 +1,6 @@ +python logits_fusion.py \ +--test_json_path ./data/CIHP/crop.json \ +--global_output_dir ./data/CIHP/global_pic_parsing \ +--msrcnn_output_dir ./data/CIHP/crop_pic_parsing \ +--gt_output_dir ./data/CIHP/crop_pic_parsing \ +--save_dir ./data/CIHP/mhp_fusion_parsing diff --git a/preprocess/humanparsing/modules/__init__.py b/preprocess/humanparsing/modules/__init__.py new file mode 100644 index 0000000..8a098de --- /dev/null +++ b/preprocess/humanparsing/modules/__init__.py @@ -0,0 +1,5 @@ +from .bn import ABN, InPlaceABN, InPlaceABNSync +from .functions import ACT_RELU, ACT_LEAKY_RELU, ACT_ELU, ACT_NONE +from .misc import GlobalAvgPool2d, SingleGPU +from .residual import IdentityResidualBlock +from .dense import DenseModule diff --git a/preprocess/humanparsing/modules/__pycache__/__init__.cpython-311.pyc b/preprocess/humanparsing/modules/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86a5f62290aff5c8fcf4ec4d188f6cf53cfdf109 GIT binary patch literal 727 zcmah`%WB&|6dg&HCEKyxMcZZRRZ(K`_YDI2k$*F(W1T6Y>T9 zf>OHbuV^W>?W%NB$S$kSC^4mw(BW|AoO1{6<<8e`w+;09{w_?Xhpg71ZK0 zNI+syz$|Dn8`{i)j%6~NHkb=t)`U&wL67;+uXBgCSR1xk2X<=TpgXJ!yR~*{kM&_+ z>*fLk-cL(62%O3p45w9l!sj%KvC+N1da>bg(5U>u=mZ^)kCs)>sH5@V-Nzg68E*>p zlj&?a4(zIbNX06mgY(n55Ogo8S_{HYDL$Mp1FL#8NifeywmHU%BzZ)KRK%Zjp|g*< z!tX_rQ#=hGRQ8HXN6#o5hFncmYn}5rBZ4d0G@)n6H`Fra1|uq#X1B6qyf1HC$Q@%{ z-B@AS)%qK_(hRP@9J~q#lW-*1db6CM3&Im|p-?Jh7Of~o{G22tLUF#kw~K^Cahl)z zcv}eLTxEhGE)uM^A)3uj_Q`skD?L3LeRvzD5~otcSgG(VXAw^$sq~scRxdz>2oX*) zgkGeZYyb64`bIw1Q=5-dmzsV%mSvUTWpO`BFf9Iu5in|~m>S_J} DHeK1a literal 0 HcmV?d00001 diff --git a/preprocess/humanparsing/modules/__pycache__/bn.cpython-311.pyc b/preprocess/humanparsing/modules/__pycache__/bn.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1960f4826b21e7f96010d30ae86e34f7b528f6e GIT binary patch literal 7817 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 Wu!^c^oIVOPQdh%!yf^4Q-hTlkYY=__ literal 0 HcmV?d00001 diff --git a/preprocess/humanparsing/modules/__pycache__/dense.cpython-311.pyc b/preprocess/humanparsing/modules/__pycache__/dense.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e5934dc068ea61a75afb53e67e9469dfa606c80 GIT binary patch literal 3076 zcmbtW-EY%Y6uo!S~wDb!$meP$jqN^yYm_!lKQkAieR=|*0*3B5(DF(+5*ACDw zm8uD8nbb+0)QLWTR86SURHp4=f50C02RJAak)=vV6WaQgt~^XU?OdmJ6Fw@Y-Pp(H zoO|xQ=iGDe@8pMYxB)@?IbKq}3Lx|c5xfSn+cq!4=MIvQOlc@hB`J#Vv_>as_sgW& zBnvu5X0IDd6cMICt`wff)iL)up*DB zk~O|gRg}!o@VHd5uTXFJ<}k=#fm;enQZfQpD20*f6q83ON@i}?Cs`#Rv$xR-*sc0A zBst<%vM!HqQAr+_=bYe(qMOPYL(Xc-It!MV5Xtu%gc!VJ;ms0_(09}wWD)nangu$q z<n>aV*3@vizYkD$-~oUMa?f1Tyv_PA}XX7!M#xAu4(f)hofTp&l)&Yz-X zx@K&nH-hZc)$P4uXTU>p?j8hIK)dSqr06NScFvt7$N;+P@4^3!$wx)ly0g}2iFbEGvpI0NTtmYV-dMsOAQafiOFJFH~rH{3fg3b&HItcvD3 zIh+Z`smqA6tm;#kB-7z#RTC}M&=V0SU}iH4#^lmCydbE$Y6*f9RCPhRBI>%LnGQFF zjhogLhttGq1)C17>rO-E+I^&&mcx;C&HkLveR&0xt>*YOBFRt z+;O;*V1GzX)H|%HXerzTO59AyF47&lY*?12=!$erNQshVV29TYoECt`5n@59PQ4&V znrNDWV3PdDx7ysZ??;bJ4xOGnX{1xr7fuT|Rb4i2nnK3FmUvlH1pS68tD+!f`w#UC z1{S1D_Lat7$E1`sEh8=HhOC&LQkaO?%%L?t{LQtcfdU^d^6^J};vt_X z@CSQi+Ot2;7Wwv4>l=A?KDhOH(%Qb5{?=GDh;FS$h_xQN8`{e*jJYk6^K!78j00EA80;KGc1{7{z8n`=H2<^|0<;Th`-mYvy5|HGBCJ5x% zl6UhUkUIo);9F_H`bB8=Z;WwevBtzqPA5bS`WG(;B&9qma zj_RJhWLO7~IrKQvT#UT6{Pz6=Br}D5gN4YT%@5)(=#_j&Kp@q?b^mW*zj_jZGLzeKP`V$`wRLlr)P-t1WQebo_I$P2vi0ZA?Pv?t75sK_ zkDecUeUBgk%(#n+0E&#PrV|_{K2^Xb0PrGRaTrOoa2wIK14*!Mb{y)K!>M{EYneC> zYLiqc0yLF`)ujx4Q^fL2b9Jt^lq99*mq6xFsi}FPInS-tUO~2gHyp$I-T9%lXv<># z(*9-9j`kFyJ;i7bT+8U*1$HsGG_=^bbiEMmEJizDr3^JKTwjpBK9e8Kk3Na)nx9^3 zT|R3^x(ku+Vx-&VyWR5uU<>H3i)jVWy+IHvm;`)C5UyuMteOl@v`A1USQ;pmopi33p4}D&i7?$z}!!;F$L-jh?d4U9c~SWz-Y^{CO4W zL0n^*rUFOdItPw!Fd*K(SW$3%pr?#>B5ts*3lMQoGBiz*NToB~(t~?Q7`&VFK3&J; zPZK7X>jv&{m7?Yj{}ENDB8hy)AFb@yF?<+Aa%oL+w*h`As)V}i+UGF}&AGo4YO!md d$Eew^eac)X1u?xy7WOSBHi-V|OFCWO{sl2Cp&0-G literal 0 HcmV?d00001 diff --git a/preprocess/humanparsing/modules/__pycache__/functions.cpython-311.pyc b/preprocess/humanparsing/modules/__pycache__/functions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ef980330118181cc63cbd74ae060c48483d25a1 GIT binary patch literal 13279 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 R?kY=d55@eW6O1zYe*g)K^>hFL literal 0 HcmV?d00001 diff --git a/preprocess/humanparsing/modules/__pycache__/residual.cpython-311.pyc b/preprocess/humanparsing/modules/__pycache__/residual.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02b3bad88dfd665d5344cecaf2456c0727f0dde0 GIT binary patch literal 9531 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 literal 0 HcmV?d00001 diff --git a/preprocess/humanparsing/modules/bn.py b/preprocess/humanparsing/modules/bn.py new file mode 100644 index 0000000..a794698 --- /dev/null +++ b/preprocess/humanparsing/modules/bn.py @@ -0,0 +1,132 @@ +import torch +import torch.nn as nn +import torch.nn.functional as functional + +try: + from queue import Queue +except ImportError: + from Queue import Queue + +from .functions import * + + +class ABN(nn.Module): + """Activated Batch Normalization + + This gathers a `BatchNorm2d` and an activation function in a single module + """ + + def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True, activation="leaky_relu", slope=0.01): + """Creates an Activated Batch Normalization module + + Parameters + ---------- + num_features : int + Number of feature channels in the input and output. + eps : float + Small constant to prevent numerical issues. + momentum : float + Momentum factor applied to compute running statistics as. + affine : bool + If `True` apply learned scale and shift transformation after normalization. + activation : str + Name of the activation functions, one of: `leaky_relu`, `elu` or `none`. + slope : float + Negative slope for the `leaky_relu` activation. + """ + super(ABN, self).__init__() + self.num_features = num_features + self.affine = affine + self.eps = eps + self.momentum = momentum + self.activation = activation + self.slope = slope + if self.affine: + self.weight = nn.Parameter(torch.ones(num_features)) + self.bias = nn.Parameter(torch.zeros(num_features)) + else: + self.register_parameter('weight', None) + self.register_parameter('bias', None) + self.register_buffer('running_mean', torch.zeros(num_features)) + self.register_buffer('running_var', torch.ones(num_features)) + self.reset_parameters() + + def reset_parameters(self): + nn.init.constant_(self.running_mean, 0) + nn.init.constant_(self.running_var, 1) + if self.affine: + nn.init.constant_(self.weight, 1) + nn.init.constant_(self.bias, 0) + + def forward(self, x): + x = functional.batch_norm(x, self.running_mean, self.running_var, self.weight, self.bias, + self.training, self.momentum, self.eps) + + if self.activation == ACT_RELU: + return functional.relu(x, inplace=True) + elif self.activation == ACT_LEAKY_RELU: + return functional.leaky_relu(x, negative_slope=self.slope, inplace=True) + elif self.activation == ACT_ELU: + return functional.elu(x, inplace=True) + else: + return x + + def __repr__(self): + rep = '{name}({num_features}, eps={eps}, momentum={momentum},' \ + ' affine={affine}, activation={activation}' + if self.activation == "leaky_relu": + rep += ', slope={slope})' + else: + rep += ')' + return rep.format(name=self.__class__.__name__, **self.__dict__) + + +class InPlaceABN(ABN): + """InPlace Activated Batch Normalization""" + + def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True, activation="leaky_relu", slope=0.01): + """Creates an InPlace Activated Batch Normalization module + + Parameters + ---------- + num_features : int + Number of feature channels in the input and output. + eps : float + Small constant to prevent numerical issues. + momentum : float + Momentum factor applied to compute running statistics as. + affine : bool + If `True` apply learned scale and shift transformation after normalization. + activation : str + Name of the activation functions, one of: `leaky_relu`, `elu` or `none`. + slope : float + Negative slope for the `leaky_relu` activation. + """ + super(InPlaceABN, self).__init__(num_features, eps, momentum, affine, activation, slope) + + def forward(self, x): + x, _, _ = inplace_abn(x, self.weight, self.bias, self.running_mean, self.running_var, + self.training, self.momentum, self.eps, self.activation, self.slope) + return x + + +class InPlaceABNSync(ABN): + """InPlace Activated Batch Normalization with cross-GPU synchronization + This assumes that it will be replicated across GPUs using the same mechanism as in `nn.DistributedDataParallel`. + """ + + def forward(self, x): + x, _, _ = inplace_abn_sync(x, self.weight, self.bias, self.running_mean, self.running_var, + self.training, self.momentum, self.eps, self.activation, self.slope) + return x + + def __repr__(self): + rep = '{name}({num_features}, eps={eps}, momentum={momentum},' \ + ' affine={affine}, activation={activation}' + if self.activation == "leaky_relu": + rep += ', slope={slope})' + else: + rep += ')' + return rep.format(name=self.__class__.__name__, **self.__dict__) + + diff --git a/preprocess/humanparsing/modules/deeplab.py b/preprocess/humanparsing/modules/deeplab.py new file mode 100644 index 0000000..fd25b78 --- /dev/null +++ b/preprocess/humanparsing/modules/deeplab.py @@ -0,0 +1,84 @@ +import torch +import torch.nn as nn +import torch.nn.functional as functional + +from models._util import try_index +from .bn import ABN + + +class DeeplabV3(nn.Module): + def __init__(self, + in_channels, + out_channels, + hidden_channels=256, + dilations=(12, 24, 36), + norm_act=ABN, + pooling_size=None): + super(DeeplabV3, self).__init__() + self.pooling_size = pooling_size + + self.map_convs = nn.ModuleList([ + nn.Conv2d(in_channels, hidden_channels, 1, bias=False), + nn.Conv2d(in_channels, hidden_channels, 3, bias=False, dilation=dilations[0], padding=dilations[0]), + nn.Conv2d(in_channels, hidden_channels, 3, bias=False, dilation=dilations[1], padding=dilations[1]), + nn.Conv2d(in_channels, hidden_channels, 3, bias=False, dilation=dilations[2], padding=dilations[2]) + ]) + self.map_bn = norm_act(hidden_channels * 4) + + self.global_pooling_conv = nn.Conv2d(in_channels, hidden_channels, 1, bias=False) + self.global_pooling_bn = norm_act(hidden_channels) + + self.red_conv = nn.Conv2d(hidden_channels * 4, out_channels, 1, bias=False) + self.pool_red_conv = nn.Conv2d(hidden_channels, out_channels, 1, bias=False) + self.red_bn = norm_act(out_channels) + + self.reset_parameters(self.map_bn.activation, self.map_bn.slope) + + def reset_parameters(self, activation, slope): + gain = nn.init.calculate_gain(activation, slope) + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.xavier_normal_(m.weight.data, gain) + if hasattr(m, "bias") and m.bias is not None: + nn.init.constant_(m.bias, 0) + elif isinstance(m, ABN): + if hasattr(m, "weight") and m.weight is not None: + nn.init.constant_(m.weight, 1) + if hasattr(m, "bias") and m.bias is not None: + nn.init.constant_(m.bias, 0) + + def forward(self, x): + # Map convolutions + out = torch.cat([m(x) for m in self.map_convs], dim=1) + out = self.map_bn(out) + out = self.red_conv(out) + + # Global pooling + pool = self._global_pooling(x) + pool = self.global_pooling_conv(pool) + pool = self.global_pooling_bn(pool) + pool = self.pool_red_conv(pool) + if self.training or self.pooling_size is None: + pool = pool.repeat(1, 1, x.size(2), x.size(3)) + + out += pool + out = self.red_bn(out) + return out + + def _global_pooling(self, x): + if self.training or self.pooling_size is None: + pool = x.view(x.size(0), x.size(1), -1).mean(dim=-1) + pool = pool.view(x.size(0), x.size(1), 1, 1) + else: + pooling_size = (min(try_index(self.pooling_size, 0), x.shape[2]), + min(try_index(self.pooling_size, 1), x.shape[3])) + padding = ( + (pooling_size[1] - 1) // 2, + (pooling_size[1] - 1) // 2 if pooling_size[1] % 2 == 1 else (pooling_size[1] - 1) // 2 + 1, + (pooling_size[0] - 1) // 2, + (pooling_size[0] - 1) // 2 if pooling_size[0] % 2 == 1 else (pooling_size[0] - 1) // 2 + 1 + ) + + pool = functional.avg_pool2d(x, pooling_size, stride=1) + pool = functional.pad(pool, pad=padding, mode="replicate") + return pool diff --git a/preprocess/humanparsing/modules/dense.py b/preprocess/humanparsing/modules/dense.py new file mode 100644 index 0000000..9638d6e --- /dev/null +++ b/preprocess/humanparsing/modules/dense.py @@ -0,0 +1,42 @@ +from collections import OrderedDict + +import torch +import torch.nn as nn + +from .bn import ABN + + +class DenseModule(nn.Module): + def __init__(self, in_channels, growth, layers, bottleneck_factor=4, norm_act=ABN, dilation=1): + super(DenseModule, self).__init__() + self.in_channels = in_channels + self.growth = growth + self.layers = layers + + self.convs1 = nn.ModuleList() + self.convs3 = nn.ModuleList() + for i in range(self.layers): + self.convs1.append(nn.Sequential(OrderedDict([ + ("bn", norm_act(in_channels)), + ("conv", nn.Conv2d(in_channels, self.growth * bottleneck_factor, 1, bias=False)) + ]))) + self.convs3.append(nn.Sequential(OrderedDict([ + ("bn", norm_act(self.growth * bottleneck_factor)), + ("conv", nn.Conv2d(self.growth * bottleneck_factor, self.growth, 3, padding=dilation, bias=False, + dilation=dilation)) + ]))) + in_channels += self.growth + + @property + def out_channels(self): + return self.in_channels + self.growth * self.layers + + def forward(self, x): + inputs = [x] + for i in range(self.layers): + x = torch.cat(inputs, dim=1) + x = self.convs1[i](x) + x = self.convs3[i](x) + inputs += [x] + + return torch.cat(inputs, dim=1) diff --git a/preprocess/humanparsing/modules/functions.py b/preprocess/humanparsing/modules/functions.py new file mode 100644 index 0000000..16ceb83 --- /dev/null +++ b/preprocess/humanparsing/modules/functions.py @@ -0,0 +1,245 @@ +import pdb +from os import path +import torch +import torch.distributed as dist +import torch.autograd as autograd +import torch.cuda.comm as comm +from torch.autograd.function import once_differentiable +from torch.utils.cpp_extension import load + +_src_path = path.join(path.dirname(path.abspath(__file__)), "src") +_backend = load(name="inplace_abn", + extra_cflags=["/O2"], + sources=[path.join(_src_path, f) for f in [ + "inplace_abn.cpp", + "inplace_abn_cpu.cpp", + "inplace_abn_cuda.cu", + "inplace_abn_cuda_half.cu" + ]], + extra_cuda_cflags=["--expt-extended-lambda"]) + +# Activation names +ACT_RELU = "relu" +ACT_LEAKY_RELU = "leaky_relu" +ACT_ELU = "elu" +ACT_NONE = "none" + + +def _check(fn, *args, **kwargs): + success = fn(*args, **kwargs) + if not success: + raise RuntimeError("CUDA Error encountered in {}".format(fn)) + + +def _broadcast_shape(x): + out_size = [] + for i, s in enumerate(x.size()): + if i != 1: + out_size.append(1) + else: + out_size.append(s) + return out_size + + +def _reduce(x): + if len(x.size()) == 2: + return x.sum(dim=0) + else: + n, c = x.size()[0:2] + return x.contiguous().view((n, c, -1)).sum(2).sum(0) + + +def _count_samples(x): + count = 1 + for i, s in enumerate(x.size()): + if i != 1: + count *= s + return count + + +def _act_forward(ctx, x): + if ctx.activation == ACT_LEAKY_RELU: + _backend.leaky_relu_forward(x, ctx.slope) + elif ctx.activation == ACT_ELU: + _backend.elu_forward(x) + elif ctx.activation == ACT_NONE: + pass + + +def _act_backward(ctx, x, dx): + if ctx.activation == ACT_LEAKY_RELU: + _backend.leaky_relu_backward(x, dx, ctx.slope) + elif ctx.activation == ACT_ELU: + _backend.elu_backward(x, dx) + elif ctx.activation == ACT_NONE: + pass + + +class InPlaceABN(autograd.Function): + @staticmethod + def forward(ctx, x, weight, bias, running_mean, running_var, + training=True, momentum=0.1, eps=1e-05, activation=ACT_LEAKY_RELU, slope=0.01): + # Save context + ctx.training = training + ctx.momentum = momentum + ctx.eps = eps + ctx.activation = activation + ctx.slope = slope + ctx.affine = weight is not None and bias is not None + + # Prepare inputs + count = _count_samples(x) + x = x.contiguous() + weight = weight.contiguous() if ctx.affine else x.new_empty(0) + bias = bias.contiguous() if ctx.affine else x.new_empty(0) + + if ctx.training: + mean, var = _backend.mean_var(x) + + # Update running stats + running_mean.mul_((1 - ctx.momentum)).add_(ctx.momentum * mean) + running_var.mul_((1 - ctx.momentum)).add_(ctx.momentum * var * count / (count - 1)) + + # Mark in-place modified tensors + ctx.mark_dirty(x, running_mean, running_var) + else: + mean, var = running_mean.contiguous(), running_var.contiguous() + ctx.mark_dirty(x) + + # BN forward + activation + _backend.forward(x, mean, var, weight, bias, ctx.affine, ctx.eps) + _act_forward(ctx, x) + + # Output + ctx.var = var + ctx.save_for_backward(x, var, weight, bias) + ctx.mark_non_differentiable(running_mean, running_var) + return x, running_mean, running_var + + @staticmethod + @once_differentiable + def backward(ctx, dz, _drunning_mean, _drunning_var): + z, var, weight, bias = ctx.saved_tensors + dz = dz.contiguous() + + # Undo activation + _act_backward(ctx, z, dz) + + if ctx.training: + edz, eydz = _backend.edz_eydz(z, dz, weight, bias, ctx.affine, ctx.eps) + else: + # TODO: implement simplified CUDA backward for inference mode + edz = dz.new_zeros(dz.size(1)) + eydz = dz.new_zeros(dz.size(1)) + + dx = _backend.backward(z, dz, var, weight, bias, edz, eydz, ctx.affine, ctx.eps) + # dweight = eydz * weight.sign() if ctx.affine else None + dweight = eydz if ctx.affine else None + if dweight is not None: + dweight[weight < 0] *= -1 + dbias = edz if ctx.affine else None + + return dx, dweight, dbias, None, None, None, None, None, None, None + + +class InPlaceABNSync(autograd.Function): + @classmethod + def forward(cls, ctx, x, weight, bias, running_mean, running_var, + training=True, momentum=0.1, eps=1e-05, activation=ACT_LEAKY_RELU, slope=0.01, equal_batches=True): + # Save context + ctx.training = training + ctx.momentum = momentum + ctx.eps = eps + ctx.activation = activation + ctx.slope = slope + ctx.affine = weight is not None and bias is not None + + # Prepare inputs + ctx.world_size = dist.get_world_size() if dist.is_initialized() else 1 + + # count = _count_samples(x) + batch_size = x.new_tensor([x.shape[0]], dtype=torch.long) + + x = x.contiguous() + weight = weight.contiguous() if ctx.affine else x.new_empty(0) + bias = bias.contiguous() if ctx.affine else x.new_empty(0) + + if ctx.training: + mean, var = _backend.mean_var(x) + if ctx.world_size > 1: + # get global batch size + if equal_batches: + batch_size *= ctx.world_size + else: + dist.all_reduce(batch_size, dist.ReduceOp.SUM) + + ctx.factor = x.shape[0] / float(batch_size.item()) + + mean_all = mean.clone() * ctx.factor + dist.all_reduce(mean_all, dist.ReduceOp.SUM) + + var_all = (var + (mean - mean_all) ** 2) * ctx.factor + dist.all_reduce(var_all, dist.ReduceOp.SUM) + + mean = mean_all + var = var_all + + # Update running stats + running_mean.mul_((1 - ctx.momentum)).add_(ctx.momentum * mean) + count = batch_size.item() * x.view(x.shape[0], x.shape[1], -1).shape[-1] + running_var.mul_((1 - ctx.momentum)).add_(ctx.momentum * var * (float(count) / (count - 1))) + + # Mark in-place modified tensors + ctx.mark_dirty(x, running_mean, running_var) + else: + mean, var = running_mean.contiguous(), running_var.contiguous() + ctx.mark_dirty(x) + + # BN forward + activation + _backend.forward(x, mean, var, weight, bias, ctx.affine, ctx.eps) + _act_forward(ctx, x) + + # Output + ctx.var = var + ctx.save_for_backward(x, var, weight, bias) + ctx.mark_non_differentiable(running_mean, running_var) + return x, running_mean, running_var + + @staticmethod + @once_differentiable + def backward(ctx, dz, _drunning_mean, _drunning_var): + z, var, weight, bias = ctx.saved_tensors + dz = dz.contiguous() + + # Undo activation + _act_backward(ctx, z, dz) + + if ctx.training: + edz, eydz = _backend.edz_eydz(z, dz, weight, bias, ctx.affine, ctx.eps) + edz_local = edz.clone() + eydz_local = eydz.clone() + + if ctx.world_size > 1: + edz *= ctx.factor + dist.all_reduce(edz, dist.ReduceOp.SUM) + + eydz *= ctx.factor + dist.all_reduce(eydz, dist.ReduceOp.SUM) + else: + edz_local = edz = dz.new_zeros(dz.size(1)) + eydz_local = eydz = dz.new_zeros(dz.size(1)) + + dx = _backend.backward(z, dz, var, weight, bias, edz, eydz, ctx.affine, ctx.eps) + # dweight = eydz_local * weight.sign() if ctx.affine else None + dweight = eydz_local if ctx.affine else None + if dweight is not None: + dweight[weight < 0] *= -1 + dbias = edz_local if ctx.affine else None + + return dx, dweight, dbias, None, None, None, None, None, None, None + + +inplace_abn = InPlaceABN.apply +inplace_abn_sync = InPlaceABNSync.apply + +__all__ = ["inplace_abn", "inplace_abn_sync", "ACT_RELU", "ACT_LEAKY_RELU", "ACT_ELU", "ACT_NONE"] diff --git a/preprocess/humanparsing/modules/misc.py b/preprocess/humanparsing/modules/misc.py new file mode 100644 index 0000000..3c50b69 --- /dev/null +++ b/preprocess/humanparsing/modules/misc.py @@ -0,0 +1,21 @@ +import torch.nn as nn +import torch +import torch.distributed as dist + +class GlobalAvgPool2d(nn.Module): + def __init__(self): + """Global average pooling over the input's spatial dimensions""" + super(GlobalAvgPool2d, self).__init__() + + def forward(self, inputs): + in_size = inputs.size() + return inputs.view((in_size[0], in_size[1], -1)).mean(dim=2) + +class SingleGPU(nn.Module): + def __init__(self, module): + super(SingleGPU, self).__init__() + self.module=module + + def forward(self, input): + return self.module(input.cuda(non_blocking=True)) + diff --git a/preprocess/humanparsing/modules/residual.py b/preprocess/humanparsing/modules/residual.py new file mode 100644 index 0000000..8a5c90e --- /dev/null +++ b/preprocess/humanparsing/modules/residual.py @@ -0,0 +1,182 @@ +from collections import OrderedDict + +import torch.nn as nn + +from .bn import ABN, ACT_LEAKY_RELU, ACT_ELU, ACT_NONE +import torch.nn.functional as functional + + +class ResidualBlock(nn.Module): + """Configurable residual block + + Parameters + ---------- + in_channels : int + Number of input channels. + channels : list of int + Number of channels in the internal feature maps. Can either have two or three elements: if three construct + a residual block with two `3 x 3` convolutions, otherwise construct a bottleneck block with `1 x 1`, then + `3 x 3` then `1 x 1` convolutions. + stride : int + Stride of the first `3 x 3` convolution + dilation : int + Dilation to apply to the `3 x 3` convolutions. + groups : int + Number of convolution groups. This is used to create ResNeXt-style blocks and is only compatible with + bottleneck blocks. + norm_act : callable + Function to create normalization / activation Module. + dropout: callable + Function to create Dropout Module. + """ + + def __init__(self, + in_channels, + channels, + stride=1, + dilation=1, + groups=1, + norm_act=ABN, + dropout=None): + super(ResidualBlock, self).__init__() + + # Check parameters for inconsistencies + if len(channels) != 2 and len(channels) != 3: + raise ValueError("channels must contain either two or three values") + if len(channels) == 2 and groups != 1: + raise ValueError("groups > 1 are only valid if len(channels) == 3") + + is_bottleneck = len(channels) == 3 + need_proj_conv = stride != 1 or in_channels != channels[-1] + + if not is_bottleneck: + bn2 = norm_act(channels[1]) + bn2.activation = ACT_NONE + layers = [ + ("conv1", nn.Conv2d(in_channels, channels[0], 3, stride=stride, padding=dilation, bias=False, + dilation=dilation)), + ("bn1", norm_act(channels[0])), + ("conv2", nn.Conv2d(channels[0], channels[1], 3, stride=1, padding=dilation, bias=False, + dilation=dilation)), + ("bn2", bn2) + ] + if dropout is not None: + layers = layers[0:2] + [("dropout", dropout())] + layers[2:] + else: + bn3 = norm_act(channels[2]) + bn3.activation = ACT_NONE + layers = [ + ("conv1", nn.Conv2d(in_channels, channels[0], 1, stride=1, padding=0, bias=False)), + ("bn1", norm_act(channels[0])), + ("conv2", nn.Conv2d(channels[0], channels[1], 3, stride=stride, padding=dilation, bias=False, + groups=groups, dilation=dilation)), + ("bn2", norm_act(channels[1])), + ("conv3", nn.Conv2d(channels[1], channels[2], 1, stride=1, padding=0, bias=False)), + ("bn3", bn3) + ] + if dropout is not None: + layers = layers[0:4] + [("dropout", dropout())] + layers[4:] + self.convs = nn.Sequential(OrderedDict(layers)) + + if need_proj_conv: + self.proj_conv = nn.Conv2d(in_channels, channels[-1], 1, stride=stride, padding=0, bias=False) + self.proj_bn = norm_act(channels[-1]) + self.proj_bn.activation = ACT_NONE + + def forward(self, x): + if hasattr(self, "proj_conv"): + residual = self.proj_conv(x) + residual = self.proj_bn(residual) + else: + residual = x + x = self.convs(x) + residual + + if self.convs.bn1.activation == ACT_LEAKY_RELU: + return functional.leaky_relu(x, negative_slope=self.convs.bn1.slope, inplace=True) + elif self.convs.bn1.activation == ACT_ELU: + return functional.elu(x, inplace=True) + else: + return x + + +class IdentityResidualBlock(nn.Module): + def __init__(self, + in_channels, + channels, + stride=1, + dilation=1, + groups=1, + norm_act=ABN, + dropout=None): + """Configurable identity-mapping residual block + + Parameters + ---------- + in_channels : int + Number of input channels. + channels : list of int + Number of channels in the internal feature maps. Can either have two or three elements: if three construct + a residual block with two `3 x 3` convolutions, otherwise construct a bottleneck block with `1 x 1`, then + `3 x 3` then `1 x 1` convolutions. + stride : int + Stride of the first `3 x 3` convolution + dilation : int + Dilation to apply to the `3 x 3` convolutions. + groups : int + Number of convolution groups. This is used to create ResNeXt-style blocks and is only compatible with + bottleneck blocks. + norm_act : callable + Function to create normalization / activation Module. + dropout: callable + Function to create Dropout Module. + """ + super(IdentityResidualBlock, self).__init__() + + # Check parameters for inconsistencies + if len(channels) != 2 and len(channels) != 3: + raise ValueError("channels must contain either two or three values") + if len(channels) == 2 and groups != 1: + raise ValueError("groups > 1 are only valid if len(channels) == 3") + + is_bottleneck = len(channels) == 3 + need_proj_conv = stride != 1 or in_channels != channels[-1] + + self.bn1 = norm_act(in_channels) + if not is_bottleneck: + layers = [ + ("conv1", nn.Conv2d(in_channels, channels[0], 3, stride=stride, padding=dilation, bias=False, + dilation=dilation)), + ("bn2", norm_act(channels[0])), + ("conv2", nn.Conv2d(channels[0], channels[1], 3, stride=1, padding=dilation, bias=False, + dilation=dilation)) + ] + if dropout is not None: + layers = layers[0:2] + [("dropout", dropout())] + layers[2:] + else: + layers = [ + ("conv1", nn.Conv2d(in_channels, channels[0], 1, stride=stride, padding=0, bias=False)), + ("bn2", norm_act(channels[0])), + ("conv2", nn.Conv2d(channels[0], channels[1], 3, stride=1, padding=dilation, bias=False, + groups=groups, dilation=dilation)), + ("bn3", norm_act(channels[1])), + ("conv3", nn.Conv2d(channels[1], channels[2], 1, stride=1, padding=0, bias=False)) + ] + if dropout is not None: + layers = layers[0:4] + [("dropout", dropout())] + layers[4:] + self.convs = nn.Sequential(OrderedDict(layers)) + + if need_proj_conv: + self.proj_conv = nn.Conv2d(in_channels, channels[-1], 1, stride=stride, padding=0, bias=False) + + def forward(self, x): + if hasattr(self, "proj_conv"): + bn1 = self.bn1(x) + shortcut = self.proj_conv(bn1) + else: + shortcut = x.clone() + bn1 = self.bn1(x) + + out = self.convs(bn1) + out.add_(shortcut) + + return out diff --git a/preprocess/humanparsing/modules/src/checks.h b/preprocess/humanparsing/modules/src/checks.h new file mode 100644 index 0000000..e761a6f --- /dev/null +++ b/preprocess/humanparsing/modules/src/checks.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +// Define AT_CHECK for old version of ATen where the same function was called AT_ASSERT +#ifndef AT_CHECK +#define AT_CHECK AT_ASSERT +#endif + +#define CHECK_CUDA(x) AT_CHECK((x).type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CPU(x) AT_CHECK(!(x).type().is_cuda(), #x " must be a CPU tensor") +#define CHECK_CONTIGUOUS(x) AT_CHECK((x).is_contiguous(), #x " must be contiguous") + +#define CHECK_CUDA_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) +#define CHECK_CPU_INPUT(x) CHECK_CPU(x); CHECK_CONTIGUOUS(x) \ No newline at end of file diff --git a/preprocess/humanparsing/modules/src/inplace_abn.cpp b/preprocess/humanparsing/modules/src/inplace_abn.cpp new file mode 100644 index 0000000..0a6b112 --- /dev/null +++ b/preprocess/humanparsing/modules/src/inplace_abn.cpp @@ -0,0 +1,95 @@ +#include + +#include + +#include "inplace_abn.h" + +std::vector mean_var(at::Tensor x) { + if (x.is_cuda()) { + if (x.type().scalarType() == at::ScalarType::Half) { + return mean_var_cuda_h(x); + } else { + return mean_var_cuda(x); + } + } else { + return mean_var_cpu(x); + } +} + +at::Tensor forward(at::Tensor x, at::Tensor mean, at::Tensor var, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + if (x.is_cuda()) { + if (x.type().scalarType() == at::ScalarType::Half) { + return forward_cuda_h(x, mean, var, weight, bias, affine, eps); + } else { + return forward_cuda(x, mean, var, weight, bias, affine, eps); + } + } else { + return forward_cpu(x, mean, var, weight, bias, affine, eps); + } +} + +std::vector edz_eydz(at::Tensor z, at::Tensor dz, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + if (z.is_cuda()) { + if (z.type().scalarType() == at::ScalarType::Half) { + return edz_eydz_cuda_h(z, dz, weight, bias, affine, eps); + } else { + return edz_eydz_cuda(z, dz, weight, bias, affine, eps); + } + } else { + return edz_eydz_cpu(z, dz, weight, bias, affine, eps); + } +} + +at::Tensor backward(at::Tensor z, at::Tensor dz, at::Tensor var, at::Tensor weight, at::Tensor bias, + at::Tensor edz, at::Tensor eydz, bool affine, float eps) { + if (z.is_cuda()) { + if (z.type().scalarType() == at::ScalarType::Half) { + return backward_cuda_h(z, dz, var, weight, bias, edz, eydz, affine, eps); + } else { + return backward_cuda(z, dz, var, weight, bias, edz, eydz, affine, eps); + } + } else { + return backward_cpu(z, dz, var, weight, bias, edz, eydz, affine, eps); + } +} + +void leaky_relu_forward(at::Tensor z, float slope) { + at::leaky_relu_(z, slope); +} + +void leaky_relu_backward(at::Tensor z, at::Tensor dz, float slope) { + if (z.is_cuda()) { + if (z.type().scalarType() == at::ScalarType::Half) { + return leaky_relu_backward_cuda_h(z, dz, slope); + } else { + return leaky_relu_backward_cuda(z, dz, slope); + } + } else { + return leaky_relu_backward_cpu(z, dz, slope); + } +} + +void elu_forward(at::Tensor z) { + at::elu_(z); +} + +void elu_backward(at::Tensor z, at::Tensor dz) { + if (z.is_cuda()) { + return elu_backward_cuda(z, dz); + } else { + return elu_backward_cpu(z, dz); + } +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("mean_var", &mean_var, "Mean and variance computation"); + m.def("forward", &forward, "In-place forward computation"); + m.def("edz_eydz", &edz_eydz, "First part of backward computation"); + m.def("backward", &backward, "Second part of backward computation"); + m.def("leaky_relu_forward", &leaky_relu_forward, "Leaky relu forward computation"); + m.def("leaky_relu_backward", &leaky_relu_backward, "Leaky relu backward computation and inversion"); + m.def("elu_forward", &elu_forward, "Elu forward computation"); + m.def("elu_backward", &elu_backward, "Elu backward computation and inversion"); +} diff --git a/preprocess/humanparsing/modules/src/inplace_abn.h b/preprocess/humanparsing/modules/src/inplace_abn.h new file mode 100644 index 0000000..17afd11 --- /dev/null +++ b/preprocess/humanparsing/modules/src/inplace_abn.h @@ -0,0 +1,88 @@ +#pragma once + +#include + +#include + +std::vector mean_var_cpu(at::Tensor x); +std::vector mean_var_cuda(at::Tensor x); +std::vector mean_var_cuda_h(at::Tensor x); + +at::Tensor forward_cpu(at::Tensor x, at::Tensor mean, at::Tensor var, at::Tensor weight, at::Tensor bias, + bool affine, float eps); +at::Tensor forward_cuda(at::Tensor x, at::Tensor mean, at::Tensor var, at::Tensor weight, at::Tensor bias, + bool affine, float eps); +at::Tensor forward_cuda_h(at::Tensor x, at::Tensor mean, at::Tensor var, at::Tensor weight, at::Tensor bias, + bool affine, float eps); + +std::vector edz_eydz_cpu(at::Tensor z, at::Tensor dz, at::Tensor weight, at::Tensor bias, + bool affine, float eps); +std::vector edz_eydz_cuda(at::Tensor z, at::Tensor dz, at::Tensor weight, at::Tensor bias, + bool affine, float eps); +std::vector edz_eydz_cuda_h(at::Tensor z, at::Tensor dz, at::Tensor weight, at::Tensor bias, + bool affine, float eps); + +at::Tensor backward_cpu(at::Tensor z, at::Tensor dz, at::Tensor var, at::Tensor weight, at::Tensor bias, + at::Tensor edz, at::Tensor eydz, bool affine, float eps); +at::Tensor backward_cuda(at::Tensor z, at::Tensor dz, at::Tensor var, at::Tensor weight, at::Tensor bias, + at::Tensor edz, at::Tensor eydz, bool affine, float eps); +at::Tensor backward_cuda_h(at::Tensor z, at::Tensor dz, at::Tensor var, at::Tensor weight, at::Tensor bias, + at::Tensor edz, at::Tensor eydz, bool affine, float eps); + +void leaky_relu_backward_cpu(at::Tensor z, at::Tensor dz, float slope); +void leaky_relu_backward_cuda(at::Tensor z, at::Tensor dz, float slope); +void leaky_relu_backward_cuda_h(at::Tensor z, at::Tensor dz, float slope); + +void elu_backward_cpu(at::Tensor z, at::Tensor dz); +void elu_backward_cuda(at::Tensor z, at::Tensor dz); + +static void get_dims(at::Tensor x, int64_t& num, int64_t& chn, int64_t& sp) { + num = x.size(0); + chn = x.size(1); + sp = 1; + for (int64_t i = 2; i < x.ndimension(); ++i) + sp *= x.size(i); +} + +/* + * Specialized CUDA reduction functions for BN + */ +#ifdef __CUDACC__ + +#include "utils/cuda.cuh" + +template +__device__ T reduce(Op op, int plane, int N, int S) { + T sum = (T)0; + for (int batch = 0; batch < N; ++batch) { + for (int x = threadIdx.x; x < S; x += blockDim.x) { + sum += op(batch, plane, x); + } + } + + // sum over NumThreads within a warp + sum = warpSum(sum); + + // 'transpose', and reduce within warp again + __shared__ T shared[32]; + __syncthreads(); + if (threadIdx.x % WARP_SIZE == 0) { + shared[threadIdx.x / WARP_SIZE] = sum; + } + if (threadIdx.x >= blockDim.x / WARP_SIZE && threadIdx.x < WARP_SIZE) { + // zero out the other entries in shared + shared[threadIdx.x] = (T)0; + } + __syncthreads(); + if (threadIdx.x / WARP_SIZE == 0) { + sum = warpSum(shared[threadIdx.x]); + if (threadIdx.x == 0) { + shared[0] = sum; + } + } + __syncthreads(); + + // Everyone picks it up, should be broadcast into the whole gradInput + return shared[0]; +} +#endif diff --git a/preprocess/humanparsing/modules/src/inplace_abn_cpu.cpp b/preprocess/humanparsing/modules/src/inplace_abn_cpu.cpp new file mode 100644 index 0000000..ffc6d38 --- /dev/null +++ b/preprocess/humanparsing/modules/src/inplace_abn_cpu.cpp @@ -0,0 +1,119 @@ +#include + +#include + +#include "utils/checks.h" +#include "inplace_abn.h" + +at::Tensor reduce_sum(at::Tensor x) { + if (x.ndimension() == 2) { + return x.sum(0); + } else { + auto x_view = x.view({x.size(0), x.size(1), -1}); + return x_view.sum(-1).sum(0); + } +} + +at::Tensor broadcast_to(at::Tensor v, at::Tensor x) { + if (x.ndimension() == 2) { + return v; + } else { + std::vector broadcast_size = {1, -1}; + for (int64_t i = 2; i < x.ndimension(); ++i) + broadcast_size.push_back(1); + + return v.view(broadcast_size); + } +} + +int64_t count(at::Tensor x) { + int64_t count = x.size(0); + for (int64_t i = 2; i < x.ndimension(); ++i) + count *= x.size(i); + + return count; +} + +at::Tensor invert_affine(at::Tensor z, at::Tensor weight, at::Tensor bias, bool affine, float eps) { + if (affine) { + return (z - broadcast_to(bias, z)) / broadcast_to(at::abs(weight) + eps, z); + } else { + return z; + } +} + +std::vector mean_var_cpu(at::Tensor x) { + auto num = count(x); + auto mean = reduce_sum(x) / num; + auto diff = x - broadcast_to(mean, x); + auto var = reduce_sum(diff.pow(2)) / num; + + return {mean, var}; +} + +at::Tensor forward_cpu(at::Tensor x, at::Tensor mean, at::Tensor var, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + auto gamma = affine ? at::abs(weight) + eps : at::ones_like(var); + auto mul = at::rsqrt(var + eps) * gamma; + + x.sub_(broadcast_to(mean, x)); + x.mul_(broadcast_to(mul, x)); + if (affine) x.add_(broadcast_to(bias, x)); + + return x; +} + +std::vector edz_eydz_cpu(at::Tensor z, at::Tensor dz, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + auto edz = reduce_sum(dz); + auto y = invert_affine(z, weight, bias, affine, eps); + auto eydz = reduce_sum(y * dz); + + return {edz, eydz}; +} + +at::Tensor backward_cpu(at::Tensor z, at::Tensor dz, at::Tensor var, at::Tensor weight, at::Tensor bias, + at::Tensor edz, at::Tensor eydz, bool affine, float eps) { + auto y = invert_affine(z, weight, bias, affine, eps); + auto mul = affine ? at::rsqrt(var + eps) * (at::abs(weight) + eps) : at::rsqrt(var + eps); + + auto num = count(z); + auto dx = (dz - broadcast_to(edz / num, dz) - y * broadcast_to(eydz / num, dz)) * broadcast_to(mul, dz); + return dx; +} + +void leaky_relu_backward_cpu(at::Tensor z, at::Tensor dz, float slope) { + CHECK_CPU_INPUT(z); + CHECK_CPU_INPUT(dz); + + AT_DISPATCH_FLOATING_TYPES(z.type(), "leaky_relu_backward_cpu", ([&] { + int64_t count = z.numel(); + auto *_z = z.data(); + auto *_dz = dz.data(); + + for (int64_t i = 0; i < count; ++i) { + if (_z[i] < 0) { + _z[i] *= 1 / slope; + _dz[i] *= slope; + } + } + })); +} + +void elu_backward_cpu(at::Tensor z, at::Tensor dz) { + CHECK_CPU_INPUT(z); + CHECK_CPU_INPUT(dz); + + AT_DISPATCH_FLOATING_TYPES(z.type(), "elu_backward_cpu", ([&] { + int64_t count = z.numel(); + auto *_z = z.data(); + auto *_dz = dz.data(); + + for (int64_t i = 0; i < count; ++i) { + if (_z[i] < 0) { + _z[i] = log1p(_z[i]); + _dz[i] *= (_z[i] + 1.f); + } + } + })); +} diff --git a/preprocess/humanparsing/modules/src/inplace_abn_cuda.cu b/preprocess/humanparsing/modules/src/inplace_abn_cuda.cu new file mode 100644 index 0000000..b157b06 --- /dev/null +++ b/preprocess/humanparsing/modules/src/inplace_abn_cuda.cu @@ -0,0 +1,333 @@ +#include + +#include +#include + +#include + +#include "utils/checks.h" +#include "utils/cuda.cuh" +#include "inplace_abn.h" + +#include + +// Operations for reduce +template +struct SumOp { + __device__ SumOp(const T *t, int c, int s) + : tensor(t), chn(c), sp(s) {} + __device__ __forceinline__ T operator()(int batch, int plane, int n) { + return tensor[(batch * chn + plane) * sp + n]; + } + const T *tensor; + const int chn; + const int sp; +}; + +template +struct VarOp { + __device__ VarOp(T m, const T *t, int c, int s) + : mean(m), tensor(t), chn(c), sp(s) {} + __device__ __forceinline__ T operator()(int batch, int plane, int n) { + T val = tensor[(batch * chn + plane) * sp + n]; + return (val - mean) * (val - mean); + } + const T mean; + const T *tensor; + const int chn; + const int sp; +}; + +template +struct GradOp { + __device__ GradOp(T _weight, T _bias, const T *_z, const T *_dz, int c, int s) + : weight(_weight), bias(_bias), z(_z), dz(_dz), chn(c), sp(s) {} + __device__ __forceinline__ Pair operator()(int batch, int plane, int n) { + T _y = (z[(batch * chn + plane) * sp + n] - bias) / weight; + T _dz = dz[(batch * chn + plane) * sp + n]; + return Pair(_dz, _y * _dz); + } + const T weight; + const T bias; + const T *z; + const T *dz; + const int chn; + const int sp; +}; + +/*********** + * mean_var + ***********/ + +template +__global__ void mean_var_kernel(const T *x, T *mean, T *var, int num, int chn, int sp) { + int plane = blockIdx.x; + T norm = T(1) / T(num * sp); + + T _mean = reduce>(SumOp(x, chn, sp), plane, num, sp) * norm; + __syncthreads(); + T _var = reduce>(VarOp(_mean, x, chn, sp), plane, num, sp) * norm; + + if (threadIdx.x == 0) { + mean[plane] = _mean; + var[plane] = _var; + } +} + +std::vector mean_var_cuda(at::Tensor x) { + CHECK_CUDA_INPUT(x); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(x, num, chn, sp); + + // Prepare output tensors + auto mean = at::empty({chn}, x.options()); + auto var = at::empty({chn}, x.options()); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + AT_DISPATCH_FLOATING_TYPES(x.type(), "mean_var_cuda", ([&] { + mean_var_kernel<<>>( + x.data(), + mean.data(), + var.data(), + num, chn, sp); + })); + + return {mean, var}; +} + +/********** + * forward + **********/ + +template +__global__ void forward_kernel(T *x, const T *mean, const T *var, const T *weight, const T *bias, + bool affine, float eps, int num, int chn, int sp) { + int plane = blockIdx.x; + + T _mean = mean[plane]; + T _var = var[plane]; + T _weight = affine ? abs(weight[plane]) + eps : T(1); + T _bias = affine ? bias[plane] : T(0); + + T mul = rsqrt(_var + eps) * _weight; + + for (int batch = 0; batch < num; ++batch) { + for (int n = threadIdx.x; n < sp; n += blockDim.x) { + T _x = x[(batch * chn + plane) * sp + n]; + T _y = (_x - _mean) * mul + _bias; + + x[(batch * chn + plane) * sp + n] = _y; + } + } +} + +at::Tensor forward_cuda(at::Tensor x, at::Tensor mean, at::Tensor var, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + CHECK_CUDA_INPUT(x); + CHECK_CUDA_INPUT(mean); + CHECK_CUDA_INPUT(var); + CHECK_CUDA_INPUT(weight); + CHECK_CUDA_INPUT(bias); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(x, num, chn, sp); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + AT_DISPATCH_FLOATING_TYPES(x.type(), "forward_cuda", ([&] { + forward_kernel<<>>( + x.data(), + mean.data(), + var.data(), + weight.data(), + bias.data(), + affine, eps, num, chn, sp); + })); + + return x; +} + +/*********** + * edz_eydz + ***********/ + +template +__global__ void edz_eydz_kernel(const T *z, const T *dz, const T *weight, const T *bias, + T *edz, T *eydz, bool affine, float eps, int num, int chn, int sp) { + int plane = blockIdx.x; + + T _weight = affine ? abs(weight[plane]) + eps : 1.f; + T _bias = affine ? bias[plane] : 0.f; + + Pair res = reduce, GradOp>(GradOp(_weight, _bias, z, dz, chn, sp), plane, num, sp); + __syncthreads(); + + if (threadIdx.x == 0) { + edz[plane] = res.v1; + eydz[plane] = res.v2; + } +} + +std::vector edz_eydz_cuda(at::Tensor z, at::Tensor dz, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + CHECK_CUDA_INPUT(z); + CHECK_CUDA_INPUT(dz); + CHECK_CUDA_INPUT(weight); + CHECK_CUDA_INPUT(bias); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(z, num, chn, sp); + + auto edz = at::empty({chn}, z.options()); + auto eydz = at::empty({chn}, z.options()); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + AT_DISPATCH_FLOATING_TYPES(z.type(), "edz_eydz_cuda", ([&] { + edz_eydz_kernel<<>>( + z.data(), + dz.data(), + weight.data(), + bias.data(), + edz.data(), + eydz.data(), + affine, eps, num, chn, sp); + })); + + return {edz, eydz}; +} + +/*********** + * backward + ***********/ + +template +__global__ void backward_kernel(const T *z, const T *dz, const T *var, const T *weight, const T *bias, const T *edz, + const T *eydz, T *dx, bool affine, float eps, int num, int chn, int sp) { + int plane = blockIdx.x; + + T _weight = affine ? abs(weight[plane]) + eps : 1.f; + T _bias = affine ? bias[plane] : 0.f; + T _var = var[plane]; + T _edz = edz[plane]; + T _eydz = eydz[plane]; + + T _mul = _weight * rsqrt(_var + eps); + T count = T(num * sp); + + for (int batch = 0; batch < num; ++batch) { + for (int n = threadIdx.x; n < sp; n += blockDim.x) { + T _dz = dz[(batch * chn + plane) * sp + n]; + T _y = (z[(batch * chn + plane) * sp + n] - _bias) / _weight; + + dx[(batch * chn + plane) * sp + n] = (_dz - _edz / count - _y * _eydz / count) * _mul; + } + } +} + +at::Tensor backward_cuda(at::Tensor z, at::Tensor dz, at::Tensor var, at::Tensor weight, at::Tensor bias, + at::Tensor edz, at::Tensor eydz, bool affine, float eps) { + CHECK_CUDA_INPUT(z); + CHECK_CUDA_INPUT(dz); + CHECK_CUDA_INPUT(var); + CHECK_CUDA_INPUT(weight); + CHECK_CUDA_INPUT(bias); + CHECK_CUDA_INPUT(edz); + CHECK_CUDA_INPUT(eydz); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(z, num, chn, sp); + + auto dx = at::zeros_like(z); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + AT_DISPATCH_FLOATING_TYPES(z.type(), "backward_cuda", ([&] { + backward_kernel<<>>( + z.data(), + dz.data(), + var.data(), + weight.data(), + bias.data(), + edz.data(), + eydz.data(), + dx.data(), + affine, eps, num, chn, sp); + })); + + return dx; +} + +/************** + * activations + **************/ + +template +inline void leaky_relu_backward_impl(T *z, T *dz, float slope, int64_t count) { + // Create thrust pointers + thrust::device_ptr th_z = thrust::device_pointer_cast(z); + thrust::device_ptr th_dz = thrust::device_pointer_cast(dz); + + auto stream = at::cuda::getCurrentCUDAStream(); + thrust::transform_if(thrust::cuda::par.on(stream), + th_dz, th_dz + count, th_z, th_dz, + [slope] __device__ (const T& dz) { return dz * slope; }, + [] __device__ (const T& z) { return z < 0; }); + thrust::transform_if(thrust::cuda::par.on(stream), + th_z, th_z + count, th_z, + [slope] __device__ (const T& z) { return z / slope; }, + [] __device__ (const T& z) { return z < 0; }); +} + +void leaky_relu_backward_cuda(at::Tensor z, at::Tensor dz, float slope) { + CHECK_CUDA_INPUT(z); + CHECK_CUDA_INPUT(dz); + + int64_t count = z.numel(); + + AT_DISPATCH_FLOATING_TYPES(z.type(), "leaky_relu_backward_cuda", ([&] { + leaky_relu_backward_impl(z.data(), dz.data(), slope, count); + })); +} + +template +inline void elu_backward_impl(T *z, T *dz, int64_t count) { + // Create thrust pointers + thrust::device_ptr th_z = thrust::device_pointer_cast(z); + thrust::device_ptr th_dz = thrust::device_pointer_cast(dz); + + auto stream = at::cuda::getCurrentCUDAStream(); + thrust::transform_if(thrust::cuda::par.on(stream), + th_dz, th_dz + count, th_z, th_z, th_dz, + [] __device__ (const T& dz, const T& z) { return dz * (z + 1.); }, + [] __device__ (const T& z) { return z < 0; }); + thrust::transform_if(thrust::cuda::par.on(stream), + th_z, th_z + count, th_z, + [] __device__ (const T& z) { return log1p(z); }, + [] __device__ (const T& z) { return z < 0; }); +} + +void elu_backward_cuda(at::Tensor z, at::Tensor dz) { + CHECK_CUDA_INPUT(z); + CHECK_CUDA_INPUT(dz); + + int64_t count = z.numel(); + + AT_DISPATCH_FLOATING_TYPES(z.type(), "leaky_relu_backward_cuda", ([&] { + elu_backward_impl(z.data(), dz.data(), count); + })); +} diff --git a/preprocess/humanparsing/modules/src/inplace_abn_cuda_half.cu b/preprocess/humanparsing/modules/src/inplace_abn_cuda_half.cu new file mode 100644 index 0000000..bb63e73 --- /dev/null +++ b/preprocess/humanparsing/modules/src/inplace_abn_cuda_half.cu @@ -0,0 +1,275 @@ +#include + +#include + +#include + +#include "utils/checks.h" +#include "utils/cuda.cuh" +#include "inplace_abn.h" + +#include + +// Operations for reduce +struct SumOpH { + __device__ SumOpH(const half *t, int c, int s) + : tensor(t), chn(c), sp(s) {} + __device__ __forceinline__ float operator()(int batch, int plane, int n) { + return __half2float(tensor[(batch * chn + plane) * sp + n]); + } + const half *tensor; + const int chn; + const int sp; +}; + +struct VarOpH { + __device__ VarOpH(float m, const half *t, int c, int s) + : mean(m), tensor(t), chn(c), sp(s) {} + __device__ __forceinline__ float operator()(int batch, int plane, int n) { + const auto t = __half2float(tensor[(batch * chn + plane) * sp + n]); + return (t - mean) * (t - mean); + } + const float mean; + const half *tensor; + const int chn; + const int sp; +}; + +struct GradOpH { + __device__ GradOpH(float _weight, float _bias, const half *_z, const half *_dz, int c, int s) + : weight(_weight), bias(_bias), z(_z), dz(_dz), chn(c), sp(s) {} + __device__ __forceinline__ Pair operator()(int batch, int plane, int n) { + float _y = (__half2float(z[(batch * chn + plane) * sp + n]) - bias) / weight; + float _dz = __half2float(dz[(batch * chn + plane) * sp + n]); + return Pair(_dz, _y * _dz); + } + const float weight; + const float bias; + const half *z; + const half *dz; + const int chn; + const int sp; +}; + +/*********** + * mean_var + ***********/ + +__global__ void mean_var_kernel_h(const half *x, float *mean, float *var, int num, int chn, int sp) { + int plane = blockIdx.x; + float norm = 1.f / static_cast(num * sp); + + float _mean = reduce(SumOpH(x, chn, sp), plane, num, sp) * norm; + __syncthreads(); + float _var = reduce(VarOpH(_mean, x, chn, sp), plane, num, sp) * norm; + + if (threadIdx.x == 0) { + mean[plane] = _mean; + var[plane] = _var; + } +} + +std::vector mean_var_cuda_h(at::Tensor x) { + CHECK_CUDA_INPUT(x); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(x, num, chn, sp); + + // Prepare output tensors + auto mean = at::empty({chn},x.options().dtype(at::kFloat)); + auto var = at::empty({chn},x.options().dtype(at::kFloat)); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + mean_var_kernel_h<<>>( + reinterpret_cast(x.data()), + mean.data(), + var.data(), + num, chn, sp); + + return {mean, var}; +} + +/********** + * forward + **********/ + +__global__ void forward_kernel_h(half *x, const float *mean, const float *var, const float *weight, const float *bias, + bool affine, float eps, int num, int chn, int sp) { + int plane = blockIdx.x; + + const float _mean = mean[plane]; + const float _var = var[plane]; + const float _weight = affine ? abs(weight[plane]) + eps : 1.f; + const float _bias = affine ? bias[plane] : 0.f; + + const float mul = rsqrt(_var + eps) * _weight; + + for (int batch = 0; batch < num; ++batch) { + for (int n = threadIdx.x; n < sp; n += blockDim.x) { + half *x_ptr = x + (batch * chn + plane) * sp + n; + float _x = __half2float(*x_ptr); + float _y = (_x - _mean) * mul + _bias; + + *x_ptr = __float2half(_y); + } + } +} + +at::Tensor forward_cuda_h(at::Tensor x, at::Tensor mean, at::Tensor var, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + CHECK_CUDA_INPUT(x); + CHECK_CUDA_INPUT(mean); + CHECK_CUDA_INPUT(var); + CHECK_CUDA_INPUT(weight); + CHECK_CUDA_INPUT(bias); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(x, num, chn, sp); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + forward_kernel_h<<>>( + reinterpret_cast(x.data()), + mean.data(), + var.data(), + weight.data(), + bias.data(), + affine, eps, num, chn, sp); + + return x; +} + +__global__ void edz_eydz_kernel_h(const half *z, const half *dz, const float *weight, const float *bias, + float *edz, float *eydz, bool affine, float eps, int num, int chn, int sp) { + int plane = blockIdx.x; + + float _weight = affine ? abs(weight[plane]) + eps : 1.f; + float _bias = affine ? bias[plane] : 0.f; + + Pair res = reduce, GradOpH>(GradOpH(_weight, _bias, z, dz, chn, sp), plane, num, sp); + __syncthreads(); + + if (threadIdx.x == 0) { + edz[plane] = res.v1; + eydz[plane] = res.v2; + } +} + +std::vector edz_eydz_cuda_h(at::Tensor z, at::Tensor dz, at::Tensor weight, at::Tensor bias, + bool affine, float eps) { + CHECK_CUDA_INPUT(z); + CHECK_CUDA_INPUT(dz); + CHECK_CUDA_INPUT(weight); + CHECK_CUDA_INPUT(bias); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(z, num, chn, sp); + + auto edz = at::empty({chn},z.options().dtype(at::kFloat)); + auto eydz = at::empty({chn},z.options().dtype(at::kFloat)); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + edz_eydz_kernel_h<<>>( + reinterpret_cast(z.data()), + reinterpret_cast(dz.data()), + weight.data(), + bias.data(), + edz.data(), + eydz.data(), + affine, eps, num, chn, sp); + + return {edz, eydz}; +} + +__global__ void backward_kernel_h(const half *z, const half *dz, const float *var, const float *weight, const float *bias, const float *edz, + const float *eydz, half *dx, bool affine, float eps, int num, int chn, int sp) { + int plane = blockIdx.x; + + float _weight = affine ? abs(weight[plane]) + eps : 1.f; + float _bias = affine ? bias[plane] : 0.f; + float _var = var[plane]; + float _edz = edz[plane]; + float _eydz = eydz[plane]; + + float _mul = _weight * rsqrt(_var + eps); + float count = float(num * sp); + + for (int batch = 0; batch < num; ++batch) { + for (int n = threadIdx.x; n < sp; n += blockDim.x) { + float _dz = __half2float(dz[(batch * chn + plane) * sp + n]); + float _y = (__half2float(z[(batch * chn + plane) * sp + n]) - _bias) / _weight; + + dx[(batch * chn + plane) * sp + n] = __float2half((_dz - _edz / count - _y * _eydz / count) * _mul); + } + } +} + +at::Tensor backward_cuda_h(at::Tensor z, at::Tensor dz, at::Tensor var, at::Tensor weight, at::Tensor bias, + at::Tensor edz, at::Tensor eydz, bool affine, float eps) { + CHECK_CUDA_INPUT(z); + CHECK_CUDA_INPUT(dz); + CHECK_CUDA_INPUT(var); + CHECK_CUDA_INPUT(weight); + CHECK_CUDA_INPUT(bias); + CHECK_CUDA_INPUT(edz); + CHECK_CUDA_INPUT(eydz); + + // Extract dimensions + int64_t num, chn, sp; + get_dims(z, num, chn, sp); + + auto dx = at::zeros_like(z); + + // Run kernel + dim3 blocks(chn); + dim3 threads(getNumThreads(sp)); + auto stream = at::cuda::getCurrentCUDAStream(); + backward_kernel_h<<>>( + reinterpret_cast(z.data()), + reinterpret_cast(dz.data()), + var.data(), + weight.data(), + bias.data(), + edz.data(), + eydz.data(), + reinterpret_cast(dx.data()), + affine, eps, num, chn, sp); + + return dx; +} + +__global__ void leaky_relu_backward_impl_h(half *z, half *dz, float slope, int64_t count) { + for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < count; i += blockDim.x * gridDim.x){ + float _z = __half2float(z[i]); + if (_z < 0) { + dz[i] = __float2half(__half2float(dz[i]) * slope); + z[i] = __float2half(_z / slope); + } + } +} + +void leaky_relu_backward_cuda_h(at::Tensor z, at::Tensor dz, float slope) { + CHECK_CUDA_INPUT(z); + CHECK_CUDA_INPUT(dz); + + int64_t count = z.numel(); + dim3 threads(getNumThreads(count)); + dim3 blocks = (count + threads.x - 1) / threads.x; + auto stream = at::cuda::getCurrentCUDAStream(); + leaky_relu_backward_impl_h<<>>( + reinterpret_cast(z.data()), + reinterpret_cast(dz.data()), + slope, count); +} + diff --git a/preprocess/humanparsing/modules/src/utils/checks.h b/preprocess/humanparsing/modules/src/utils/checks.h new file mode 100644 index 0000000..e761a6f --- /dev/null +++ b/preprocess/humanparsing/modules/src/utils/checks.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +// Define AT_CHECK for old version of ATen where the same function was called AT_ASSERT +#ifndef AT_CHECK +#define AT_CHECK AT_ASSERT +#endif + +#define CHECK_CUDA(x) AT_CHECK((x).type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CPU(x) AT_CHECK(!(x).type().is_cuda(), #x " must be a CPU tensor") +#define CHECK_CONTIGUOUS(x) AT_CHECK((x).is_contiguous(), #x " must be contiguous") + +#define CHECK_CUDA_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) +#define CHECK_CPU_INPUT(x) CHECK_CPU(x); CHECK_CONTIGUOUS(x) \ No newline at end of file diff --git a/preprocess/humanparsing/modules/src/utils/common.h b/preprocess/humanparsing/modules/src/utils/common.h new file mode 100644 index 0000000..e8403ee --- /dev/null +++ b/preprocess/humanparsing/modules/src/utils/common.h @@ -0,0 +1,49 @@ +#pragma once + +#include + +/* + * Functions to share code between CPU and GPU + */ + +#ifdef __CUDACC__ +// CUDA versions + +#define HOST_DEVICE __host__ __device__ +#define INLINE_HOST_DEVICE __host__ __device__ inline +#define FLOOR(x) floor(x) + +#if __CUDA_ARCH__ >= 600 +// Recent compute capabilities have block-level atomicAdd for all data types, so we use that +#define ACCUM(x,y) atomicAdd_block(&(x),(y)) +#else +// Older architectures don't have block-level atomicAdd, nor atomicAdd for doubles, so we defer to atomicAdd for float +// and use the known atomicCAS-based implementation for double +template +__device__ inline data_t atomic_add(data_t *address, data_t val) { + return atomicAdd(address, val); +} + +template<> +__device__ inline double atomic_add(double *address, double val) { + unsigned long long int* address_as_ull = (unsigned long long int*)address; + unsigned long long int old = *address_as_ull, assumed; + do { + assumed = old; + old = atomicCAS(address_as_ull, assumed, __double_as_longlong(val + __longlong_as_double(assumed))); + } while (assumed != old); + return __longlong_as_double(old); +} + +#define ACCUM(x,y) atomic_add(&(x),(y)) +#endif // #if __CUDA_ARCH__ >= 600 + +#else +// CPU versions + +#define HOST_DEVICE +#define INLINE_HOST_DEVICE inline +#define FLOOR(x) std::floor(x) +#define ACCUM(x,y) (x) += (y) + +#endif // #ifdef __CUDACC__ \ No newline at end of file diff --git a/preprocess/humanparsing/modules/src/utils/cuda.cuh b/preprocess/humanparsing/modules/src/utils/cuda.cuh new file mode 100644 index 0000000..60c0023 --- /dev/null +++ b/preprocess/humanparsing/modules/src/utils/cuda.cuh @@ -0,0 +1,71 @@ +#pragma once + +/* + * General settings and functions + */ +const int WARP_SIZE = 32; +const int MAX_BLOCK_SIZE = 1024; + +static int getNumThreads(int nElem) { + int threadSizes[6] = {32, 64, 128, 256, 512, MAX_BLOCK_SIZE}; + for (int i = 0; i < 6; ++i) { + if (nElem <= threadSizes[i]) { + return threadSizes[i]; + } + } + return MAX_BLOCK_SIZE; +} + +/* + * Reduction utilities + */ +template +__device__ __forceinline__ T WARP_SHFL_XOR(T value, int laneMask, int width = warpSize, + unsigned int mask = 0xffffffff) { +#if CUDART_VERSION >= 9000 + return __shfl_xor_sync(mask, value, laneMask, width); +#else + return __shfl_xor(value, laneMask, width); +#endif +} + +__device__ __forceinline__ int getMSB(int val) { return 31 - __clz(val); } + +template +struct Pair { + T v1, v2; + __device__ Pair() {} + __device__ Pair(T _v1, T _v2) : v1(_v1), v2(_v2) {} + __device__ Pair(T v) : v1(v), v2(v) {} + __device__ Pair(int v) : v1(v), v2(v) {} + __device__ Pair &operator+=(const Pair &a) { + v1 += a.v1; + v2 += a.v2; + return *this; + } +}; + +template +static __device__ __forceinline__ T warpSum(T val) { +#if __CUDA_ARCH__ >= 300 + for (int i = 0; i < getMSB(WARP_SIZE); ++i) { + val += WARP_SHFL_XOR(val, 1 << i, WARP_SIZE); + } +#else + __shared__ T values[MAX_BLOCK_SIZE]; + values[threadIdx.x] = val; + __threadfence_block(); + const int base = (threadIdx.x / WARP_SIZE) * WARP_SIZE; + for (int i = 1; i < WARP_SIZE; i++) { + val += values[base + ((i + threadIdx.x) % WARP_SIZE)]; + } +#endif + return val; +} + +template +static __device__ __forceinline__ Pair warpSum(Pair value) { + value.v1 = warpSum(value.v1); + value.v2 = warpSum(value.v2); + return value; +} \ No newline at end of file diff --git a/preprocess/humanparsing/networks/AugmentCE2P.py b/preprocess/humanparsing/networks/AugmentCE2P.py new file mode 100644 index 0000000..ce32f78 --- /dev/null +++ b/preprocess/humanparsing/networks/AugmentCE2P.py @@ -0,0 +1,388 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : AugmentCE2P.py +@Time : 8/4/19 3:35 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import functools +import pdb + +import torch +import torch.nn as nn +from torch.nn import functional as F +# Note here we adopt the InplaceABNSync implementation from https://github.com/mapillary/inplace_abn +# By default, the InplaceABNSync module contains a BatchNorm Layer and a LeakyReLu layer +from modules import InPlaceABNSync +import numpy as np + +BatchNorm2d = functools.partial(InPlaceABNSync, activation='none') + +affine_par = True + +pretrained_settings = { + 'resnet101': { + 'imagenet': { + 'input_space': 'BGR', + 'input_size': [3, 224, 224], + 'input_range': [0, 1], + 'mean': [0.406, 0.456, 0.485], + 'std': [0.225, 0.224, 0.229], + 'num_classes': 1000 + } + }, +} + + +def conv3x3(in_planes, out_planes, stride=1): + "3x3 convolution with padding" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=1, bias=False) + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, dilation=1, downsample=None, fist_dilation=1, multi_grid=1): + super(Bottleneck, self).__init__() + self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = BatchNorm2d(planes) + self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, + padding=dilation * multi_grid, dilation=dilation * multi_grid, bias=False) + self.bn2 = BatchNorm2d(planes) + self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) + self.bn3 = BatchNorm2d(planes * 4) + self.relu = nn.ReLU(inplace=False) + self.relu_inplace = nn.ReLU(inplace=True) + self.downsample = downsample + self.dilation = dilation + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out = out + residual + out = self.relu_inplace(out) + + return out + + +class CostomAdaptiveAvgPool2D(nn.Module): + + def __init__(self, output_size): + + super(CostomAdaptiveAvgPool2D, self).__init__() + + self.output_size = output_size + + def forward(self, x): + + H_in, W_in = x.shape[-2:] + H_out, W_out = self.output_size + + out_i = [] + for i in range(H_out): + out_j = [] + for j in range(W_out): + hs = int(np.floor(i * H_in / H_out)) + he = int(np.ceil((i + 1) * H_in / H_out)) + + ws = int(np.floor(j * W_in / W_out)) + we = int(np.ceil((j + 1) * W_in / W_out)) + + # print(hs, he, ws, we) + kernel_size = [he - hs, we - ws] + + out = F.avg_pool2d(x[:, :, hs:he, ws:we], kernel_size) + out_j.append(out) + + out_j = torch.concat(out_j, -1) + out_i.append(out_j) + + out_i = torch.concat(out_i, -2) + return out_i + + +class PSPModule(nn.Module): + """ + Reference: + Zhao, Hengshuang, et al. *"Pyramid scene parsing network."* + """ + + def __init__(self, features, out_features=512, sizes=(1, 2, 3, 6)): + super(PSPModule, self).__init__() + + self.stages = [] + tmp = [] + for size in sizes: + if size == 3 or size == 6: + tmp.append(self._make_stage_custom(features, out_features, size)) + else: + tmp.append(self._make_stage(features, out_features, size)) + self.stages = nn.ModuleList(tmp) + # self.stages = nn.ModuleList([self._make_stage(features, out_features, size) for size in sizes]) + self.bottleneck = nn.Sequential( + nn.Conv2d(features + len(sizes) * out_features, out_features, kernel_size=3, padding=1, dilation=1, + bias=False), + InPlaceABNSync(out_features), + ) + + def _make_stage(self, features, out_features, size): + prior = nn.AdaptiveAvgPool2d(output_size=(size, size)) + conv = nn.Conv2d(features, out_features, kernel_size=1, bias=False) + bn = InPlaceABNSync(out_features) + return nn.Sequential(prior, conv, bn) + + def _make_stage_custom(self, features, out_features, size): + prior = CostomAdaptiveAvgPool2D(output_size=(size, size)) + conv = nn.Conv2d(features, out_features, kernel_size=1, bias=False) + bn = InPlaceABNSync(out_features) + return nn.Sequential(prior, conv, bn) + + def forward(self, feats): + h, w = feats.size(2), feats.size(3) + priors = [F.interpolate(input=stage(feats), size=(h, w), mode='bilinear', align_corners=True) for stage in + self.stages] + [feats] + bottle = self.bottleneck(torch.cat(priors, 1)) + return bottle + + +class ASPPModule(nn.Module): + """ + Reference: + Chen, Liang-Chieh, et al. *"Rethinking Atrous Convolution for Semantic Image Segmentation."* + """ + + def __init__(self, features, inner_features=256, out_features=512, dilations=(12, 24, 36)): + super(ASPPModule, self).__init__() + + self.conv1 = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), + nn.Conv2d(features, inner_features, kernel_size=1, padding=0, dilation=1, + bias=False), + InPlaceABNSync(inner_features)) + self.conv2 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(inner_features)) + self.conv3 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=3, padding=dilations[0], dilation=dilations[0], bias=False), + InPlaceABNSync(inner_features)) + self.conv4 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=3, padding=dilations[1], dilation=dilations[1], bias=False), + InPlaceABNSync(inner_features)) + self.conv5 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=3, padding=dilations[2], dilation=dilations[2], bias=False), + InPlaceABNSync(inner_features)) + + self.bottleneck = nn.Sequential( + nn.Conv2d(inner_features * 5, out_features, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(out_features), + nn.Dropout2d(0.1) + ) + + def forward(self, x): + _, _, h, w = x.size() + + feat1 = F.interpolate(self.conv1(x), size=(h, w), mode='bilinear', align_corners=True) + + feat2 = self.conv2(x) + feat3 = self.conv3(x) + feat4 = self.conv4(x) + feat5 = self.conv5(x) + out = torch.cat((feat1, feat2, feat3, feat4, feat5), 1) + + bottle = self.bottleneck(out) + return bottle + + +class Edge_Module(nn.Module): + """ + Edge Learning Branch + """ + + def __init__(self, in_fea=[256, 512, 1024], mid_fea=256, out_fea=2): + super(Edge_Module, self).__init__() + + self.conv1 = nn.Sequential( + nn.Conv2d(in_fea[0], mid_fea, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(mid_fea) + ) + self.conv2 = nn.Sequential( + nn.Conv2d(in_fea[1], mid_fea, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(mid_fea) + ) + self.conv3 = nn.Sequential( + nn.Conv2d(in_fea[2], mid_fea, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(mid_fea) + ) + self.conv4 = nn.Conv2d(mid_fea, out_fea, kernel_size=3, padding=1, dilation=1, bias=True) + self.conv5 = nn.Conv2d(out_fea * 3, out_fea, kernel_size=1, padding=0, dilation=1, bias=True) + + def forward(self, x1, x2, x3): + _, _, h, w = x1.size() + + edge1_fea = self.conv1(x1) + edge1 = self.conv4(edge1_fea) + edge2_fea = self.conv2(x2) + edge2 = self.conv4(edge2_fea) + edge3_fea = self.conv3(x3) + edge3 = self.conv4(edge3_fea) + + edge2_fea = F.interpolate(edge2_fea, size=(h, w), mode='bilinear', align_corners=True) + edge3_fea = F.interpolate(edge3_fea, size=(h, w), mode='bilinear', align_corners=True) + edge2 = F.interpolate(edge2, size=(h, w), mode='bilinear', align_corners=True) + edge3 = F.interpolate(edge3, size=(h, w), mode='bilinear', align_corners=True) + + edge = torch.cat([edge1, edge2, edge3], dim=1) + edge_fea = torch.cat([edge1_fea, edge2_fea, edge3_fea], dim=1) + edge = self.conv5(edge) + + return edge, edge_fea + + +class Decoder_Module(nn.Module): + """ + Parsing Branch Decoder Module. + """ + + def __init__(self, num_classes): + super(Decoder_Module, self).__init__() + self.conv1 = nn.Sequential( + nn.Conv2d(512, 256, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(256) + ) + self.conv2 = nn.Sequential( + nn.Conv2d(256, 48, kernel_size=1, stride=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(48) + ) + self.conv3 = nn.Sequential( + nn.Conv2d(304, 256, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(256), + nn.Conv2d(256, 256, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(256) + ) + + self.conv4 = nn.Conv2d(256, num_classes, kernel_size=1, padding=0, dilation=1, bias=True) + + def forward(self, xt, xl): + _, _, h, w = xl.size() + xt = F.interpolate(self.conv1(xt), size=(h, w), mode='bilinear', align_corners=True) + xl = self.conv2(xl) + x = torch.cat([xt, xl], dim=1) + x = self.conv3(x) + seg = self.conv4(x) + return seg, x + + +class ResNet(nn.Module): + def __init__(self, block, layers, num_classes): + self.inplanes = 128 + super(ResNet, self).__init__() + self.conv1 = conv3x3(3, 64, stride=2) + self.bn1 = BatchNorm2d(64) + self.relu1 = nn.ReLU(inplace=False) + self.conv2 = conv3x3(64, 64) + self.bn2 = BatchNorm2d(64) + self.relu2 = nn.ReLU(inplace=False) + self.conv3 = conv3x3(64, 128) + self.bn3 = BatchNorm2d(128) + self.relu3 = nn.ReLU(inplace=False) + + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4 = self._make_layer(block, 512, layers[3], stride=1, dilation=2, multi_grid=(1, 1, 1)) + + self.context_encoding = PSPModule(2048, 512) + + self.edge = Edge_Module() + self.decoder = Decoder_Module(num_classes) + + self.fushion = nn.Sequential( + nn.Conv2d(1024, 256, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(256), + nn.Dropout2d(0.1), + nn.Conv2d(256, num_classes, kernel_size=1, padding=0, dilation=1, bias=True) + ) + + def _make_layer(self, block, planes, blocks, stride=1, dilation=1, multi_grid=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d(self.inplanes, planes * block.expansion, + kernel_size=1, stride=stride, bias=False), + BatchNorm2d(planes * block.expansion, affine=affine_par)) + + layers = [] + generate_multi_grid = lambda index, grids: grids[index % len(grids)] if isinstance(grids, tuple) else 1 + layers.append(block(self.inplanes, planes, stride, dilation=dilation, downsample=downsample, + multi_grid=generate_multi_grid(0, multi_grid))) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append( + block(self.inplanes, planes, dilation=dilation, multi_grid=generate_multi_grid(i, multi_grid))) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.relu1(self.bn1(self.conv1(x))) + x = self.relu2(self.bn2(self.conv2(x))) + x = self.relu3(self.bn3(self.conv3(x))) + x = self.maxpool(x) + x2 = self.layer1(x) + x3 = self.layer2(x2) + x4 = self.layer3(x3) + x5 = self.layer4(x4) + x = self.context_encoding(x5) + parsing_result, parsing_fea = self.decoder(x, x2) + # Edge Branch + edge_result, edge_fea = self.edge(x2, x3, x4) + # Fusion Branch + x = torch.cat([parsing_fea, edge_fea], dim=1) + fusion_result = self.fushion(x) + return [[parsing_result, fusion_result], edge_result] + + +def initialize_pretrained_model(model, settings, pretrained='./models/resnet101-imagenet.pth'): + model.input_space = settings['input_space'] + model.input_size = settings['input_size'] + model.input_range = settings['input_range'] + model.mean = settings['mean'] + model.std = settings['std'] + + if pretrained is not None: + saved_state_dict = torch.load(pretrained) + new_params = model.state_dict().copy() + for i in saved_state_dict: + i_parts = i.split('.') + if not i_parts[0] == 'fc': + new_params['.'.join(i_parts[0:])] = saved_state_dict[i] + model.load_state_dict(new_params) + + +def resnet101(num_classes=20, pretrained='./models/resnet101-imagenet.pth'): + model = ResNet(Bottleneck, [3, 4, 23, 3], num_classes) + settings = pretrained_settings['resnet101']['imagenet'] + initialize_pretrained_model(model, settings, pretrained) + return model diff --git a/preprocess/humanparsing/networks/__init__.py b/preprocess/humanparsing/networks/__init__.py new file mode 100644 index 0000000..3d5d384 --- /dev/null +++ b/preprocess/humanparsing/networks/__init__.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import +from networks.AugmentCE2P import resnet101 + +__factory = { + 'resnet101': resnet101, +} + + +def init_model(name, *args, **kwargs): + if name not in __factory.keys(): + raise KeyError("Unknown model arch: {}".format(name)) + return __factory[name](*args, **kwargs) \ No newline at end of file diff --git a/preprocess/humanparsing/networks/__pycache__/AugmentCE2P.cpython-311.pyc b/preprocess/humanparsing/networks/__pycache__/AugmentCE2P.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5abce994f6efb0897563e95d08d7cb39b312541 GIT binary patch literal 24008 zcmdUXYj7J^mR{q@CJ2z=1EeHMBJ?07=s}s(!+w)y|6nCk3HL`fn$%{?o7zdbwLKB06J=GERqZPI5i0Ul zO}tf^eCIaM=mrUnHFnihn&9c%_uaSeJ?A^;K7QhIIXGNDo%mH)c#-4&J3SPx%Dm&* zzcX>%Z7#(1a3NF395wZr*xlS?W_L@Eh25=#wjP^_;#i{AL3>XHb6cbQU}aAwbDN`% zo+>jJHVrrng@h|ZwomOJn>p?i{Hs@wD^$@_9pXckAx9q-Y4p6+)N~I7^#KOsr7djL^ zG8pI!<3X|PK5)`!c|twy$s-VAxZ%I$+<-d957ds<=kL-MQr798|8czBXL#UbJ z$Uj6z!i4}K5bFyo*1>QfrdSfmkWv*J9`pyJfkXn$uXTRZg~vZVKidLwn@dvt^4Eao zPH`y=xs*9%4p~06er(48!oPZa%aeAQ7R)b|4=j# z3nvsu9Ph2V1rM@JQ04LQzqq@9+qteo=k~-0d#{~2@_?Co;pCZ0nvOE*B(HxC-C%*&6tK2VXJFfhBXqj=_rU zX|C54vc6r}V-4Bf=6Y;t?y9NBj_+2XICjUA$tb#O@Zu9I60@&#JV>3Qa1qyM9b_H& z@%K%}E|S!EG{>blBiGLA!U~yj+{bW!qCJ|pWQF#?4Nw)>m7>lD+48C7WB7ei^ymDx zLY$#v^De)~b-|~Q8eV<<~@oQv$jmWQg=xLgGJ#%%kak~578PRh@ z@*I&pN7B|Y$HV%inafgrn_S<9M_!G1IeU4!`X5vplu5-EihBW`Ey6&BUn**8J8-rtmX-f`|{Wtr^ z6UE2K%}B;_BQ_RGTMCiuZ^XyqUoG;Zs+zH#VpUtNsrmLFy!!{)OHz|hZt|rMKB}%A zKX?O$p(+omTkco4WGzzlO1XL^%CD(QJJ{gx*%;4N<#^EvQP2DRvA|&1?^hgt|6n{c z3{2!#oPPf$v{pW(GJJI?5F=c}n31px?V-5xOe+|UM*aS~CSe;j6%CwSD&O+L$ry77 z1$2XePZj=h?%L~zW~?sTk{PZXS=wN$pW)^s?A=%yL1eF8g;DWrCA{>&he00G+dSZp z8IZ@yAdd|)$)Ysvi4&&l3I&D$;KN;)`%c8;(ayaFwnF`ev6T=UUq9#pyy5&Bn;>B+ zY)3)p#{>k0gG5LgC{^gh4Cn(a`z)-N3x_F`eFMtD>(xsSZ<&|VM9DcMNzgdLCwk1g zep%g`O-lSanP2yS-+Z6nEb%YO{EH(0;-h9r3YlLZvfpgROLCmG&?9^VV!Q+JP%nTR z?%QUP%Ib9vF-FbA28tR5^RtfH`nXYhQpd7VRwL`(%Z;1f^o>>^9&d* zgPNoU#yD<3D8X#1@- zbe7GnSi{PE4Zm!ju2faZF@mp~a;2Pf?=z29CpFNAw$xZTbV3+`zHL@%%8{!2wmIcY zxxQ`gwHCjAs@kX)jMk+1tnS+sdI?IbF@6CPH}*f1guU|DfChL|e8^IgE1$BL$(1k7 zb=)+zwoJbEkf|hJdx|tA>+vW5_cy=!4P&TJ;P{Qt2}If-03-00(|%YBF84td1)m8i_Q23kI2KZDutfy>6+3`yFp%`Q)zSS8%FcQa zU{tZbM$~rD41 zXYWGDNJ}|xk(Y@VD343v^w+sZp2msSGAA>qGN&fa-EgF>=@2B8+_dV3Gi^%`KXTWl zZ4YZ3$A@n%o>)A?xhuU-iKM%74UOr24?T-An{S<)I5)#pxt23BZhGih@WZ-03$n|y zp$}G1o{^S!N((p23pYxhO|oaxxLFNvLU`bV*2zsDES+kVmc1w~d`VvTlH}Pcd$x|7 zAAb#b%-A{a^6c*Su1uOIPu{H%m%cDw^|-NVBAV^UcGKUaiT!m>UYOiGwS4O2RIAwf zqP*gz>9tbhez|e~xFzTI+;+a}%$$~6`uN_MYG+j2DxX{Rd7?Lrs6fUuj$9wH zk!wGQUJx_6L8ONQ4uI$c@r>1KTQ$SYL7WS1o*8aFqKaS2If#GlBK}VovmNQhFS9%F zrFMsq9irGCssOEE0+}ZzQK>v}>claIM@G&vQ{KsNZ&(P&g5hnNWv{0{5MSp#7>@NN z`iEiLTIUTXy@6=Ecg^w>*Mz`eB;-xNmKcV~iJ4x!dDBb#@--}vCmdwZU8_2N;Z*g| zC&VU$Bmzp<_JqPs} znV3<7%onQiPqp(^s|c=_d}*|jg%kGRgzzdo)cFSk7sGz$1xqC1P^C)e$Ltx3LmdrA zVMb6Kr^1(pVOoy_qN<(40&AT>T|#kO&}?_U3RMB(d&7a`FjOGLNzy@kvXQYhp;(fG zL$G4Nt>Q;gqY7sSC> zuGtH7hif^k9j@gtcDR;5b}q_nmz=9*=jx{w)@H}&90+o(N#jpN!ul~uBZeX2pTc1@ zj~4MRlwnJ+`O{J**=n%2v+<8i*eK51+EG%`{5fjVBfe6jCy+F0W%)~IOtr#rXE*W$ zsM$75cBsk(GtCPtkPzx4nbefpQuQdrdLQd}!X?DGtM)h{3AZpz+_Ef(E7B=-*4y#olNrgrRF zWEL zeyf7KLyCc~{;l-6Y5fUi=sCWXK#UFFh6#Ah=2`q2LJHxt+d2l{k;QYib)Ng&p>(f+ zP?N8kIz7E<>Zs`MlH6UgyXz~rx7J1|KpQ20i-+%+zGMB4?KXGAl*QBR3n&~txoFNW z8?VIdA2i>z-n6A*txVf`Ap_p#^*ZO?lF5e~ralujEHfGE>#9{qKiYKT2@?lKd10(A zG+mgne75641UWIm5!4M#Hsw~2kY^+lzHhnB5iEGKb<|`SzFG=1*ujmG7rkM*VeKWw z%k-()I74#FJl4kS9Q=hyG!hF3gwvRGv%zRRoK(lC6~>>i;tE6~eKCJ9j>$LyGj76Z zREDMxlVM>f4r6@SXH(4WFF?&90S1i*q9vi2`W4fa1VIn4_xg2JY<%I^9)+yJtnko| zk=9~&%WDzs+oSPdAez_#McVnexEP(eRD4Qo41AqK<(isH1w{@_Kje(rHSyv)<}Miu*RmuYZkq0BC<_l>1pmvdaH<3LcN`>DaiU%=e z!gL7Y!UC~}d9;aM3MTR`{3nRf<3$U9GiHm8pW%o&+%^X^zA|K`)z(g0N1iw}7xQ!4 zY>hMAd_?`URE;41wX489=brL}dVwiV8=LYZrK33I$t#YoQzr`g#z=|2;nft5J^kU> zI;?|$uCabkeP9sv3ekO5i`8ruA~qjPQdC`ocTtt_nr!47C0FRdJoZJ06eng z5p061sF7fRvk!LH@`QTs6XNSnR)Pfe$ewH-^s>+X7WC`aNap5n24Af`#$M&LR-QYm^d;u9cnzL2A#9P6CEU%hnj|KfrplwQAxfUq1sJe+LId;f z-hYp-Ki%o8Q8mv$reMb78BQduE_{;+wX%vB*N}@%sBM5tofO}s-Zm?hdxiKAl*i5x z6Q2d4N$g*#j>G^KG_{i9exUAYwkbmi8^ zD>|myr4?QBims;>mc~7p$0iCj&hZaC2VL>aylR-Op6^}MDDe-)t*dLM44~Um8i_R;O^NQ@e^8ZUVJlDLW zpex5P<=D7-a^1bI&n}5?&}snD8Ihb3*%_hN$t%XxctgdTvAR;re0gPh>J2g zmcbXN`J!wg#Bl!@PoHQ$=fK%8bA-90QERdw@)4@jzPPN;UrUJmjbn}$`T#J`v7`vL zH!iDj&|(gxg&Xr2wU@WLmBg$-Oie1xnrkHjI2bsLw-Lb zLa1B#9uWfJKBsPS!{jfbZB?znA|28$us(-w8`T>)5^-j#$ ztEfI(FV(inwXFsuZxJR?ZxzmeA1+v1jBsAKMd6Ii?;_VeBKtw~(*aBr5cw$ukg{0@ zz%L-|UXE;X5=5Vms1ThB3gTb83ghzGCU}+34q(x?8H=`IrR}wp1?v?`)xJ<)*q@&r zSjx~j`FM{)uZ^|%&x7FgHL-o|ZK83@GH;K?N+CO1 z-W;kZUEhor)i`LG)JUsgM*4np<)L9@hVl600trWTDnZ3{)K3|>I}L8RnjT0FmO{C5 zD6YtQVF6)_q3l>Q4F;-IU~)`#GI~mC1_f?$1o(=`-TFw?t1s@&sg0fa<3%n7jg;&Nn9y;H|pE zv#*mq$`h76Vc8R=IBEPbR%qZhgaU{YKKlVa_;cYN>nPU8FwB9*pMA|jCxkilh)YY7 zDp>|RN|>X-owZoxDAmbFE6e6tqSG*>q45}frlm7=qg7?|tTJ-8QD;&cHNboto=Q~` z<|%{bD$As)nkP+FnKX`h(m2Yban6&*X_(p6xFfKeBjxNrFpq&dO>JcM zVig1yu^vG`D58x2n6Gvy=Bu6f-zfYE<@;SCV<1Xp7&5$rF(n&wsy>}XpH9_hW6=i- zwkfK@6D98i*^-EZ=`I~0tlvlRROHZ}M}#v-k=TyWM2N8I_G|CHcI)+t*NceoQNx1U zhu=M%5pEryIG(O7K)tP!yH$3#0{eZ%@W&0FiDOxx9%nY3mm1E?4d>I959bYJST#J^ zF&UU_n;H?j&xr0q%@)j>)i0RX znu$ySH+tluxy@0aWMr+LiPGJEz)sisA)X-QijVe0_1x zPA0I3{E8a-B8UNSn#p2Jgy&i|h)dh?o3`BRCfji@W{KyeE9-4bXSn%@S}!U+h=1)W zaKvXMQcF=NL!M?V6NSajU?#RI)qBIV4NWM3&(#cLp2#mRQDLVyAIF>TW-N+f9Vuxn z#A%Hmf zRldeI4QNc0JqBM5RbuNX+4G+J?aSoGcEUY>ZpNv)vR39|tJ5CmL-41TdpNa9z>{E7$sy8HY(iEo$rc9Cx-cQ5=T;cAfx6oPzg)b`qW7xBj_PBo2JAT-ihv5 z#DZ4%1pn&Az_G>-3chro6|({+GC)QwwEq_f#`GwgB|Z&zsUfR~X2?3u^eP`;fHYX$ zdo@}DX9Tun*OCbLC8#b1IHJQMjU@vj4@Z{bMG^#v%D|C_uIjNjGn;<2?fq@p3-9f? zvtz1us%y$V-6OvChUhvcxz5S1b7^zVRr^lQ&7O?;#`&@HSpMRy#fm2((>dOs?Gl}B zlCw>Awxvxur~945HxG|rx^Zmm7#>UZx75^)ccm}qr;>#^#rw~xJ&4$;;6gc=_NUn;_7A(TgdXZ3DVqZkmh#9elnam9!?rG zGm?31Xi+yN*^C{|oL?(WKX8(obV1iD-R7zrU|Qmml_uEcs>9@}B*N-Mq%0mpfU-5d zZ;*#2b4-Y*4UV}j!Xf({n>dR$41G-?k!Q)*s={0RmRgXAVb^oiLc82Z;Cfe2ILjkdJOB#+>;yeu;dX$VX=##6cX^kn7XxS$L$W zkXN#!-~yhk2{~tdUG3$Pq$}nxqY%S8HWxyYTMI6XzuDtqNg>qG2WYP-y9~Z91>cZ6 zRE0Nj;NSjft?^xwU4>Yve~DGXklV6CyilD{G#O$Q%dCQ(Q7yB+w9Hx9aJiN@ZKiHG z{^UA5n1%4kE^x`vtB zIYJB6gipyYO5~q`oc65{w$KAZjekil9}#MKbrNVTxz-V3NRm1LcEw;@bw_dUrs~mI z+`_4PY*Z?b1+KDPcp;c816OIIOkrJgG;l2}D0X)1$lp8j_l^1cCbmpTabqV44O9KyEsKxXwq7iykz#-EVBe)Yb*en$`Zy zCpB)D8@D5{DyIt!PHmZ9_Oq=>-q=`~&a+P|Z3_tHFCdifOyf^QFEqx2nw-Xi zhBk0U5P*D$8?C?^9MeUH9uoCfr;14Gg&iEG;>vNFSx{pMXY@ND2Q=Ja@YRsY{5b;a zU_B6y*Ff%{6mf?p`@v^t)gnnRmA^1cVgT*NCw0GO$o4h|3o<`9n5Si}C3U2=&lT{m z3}M%uF-IU8s6s`Hg^}Bu=BO>?N1?Kuo*U!MOE3?1;B18b`pehTMsn8ijB^? zNF)fa=Xc(J!EcWS1}}sHJ4RL(I3-*6&)B+tfv_6uB(cwSq`%Jn@j}^iD ze)fvAcF+Aqd&EV19xiOYvjn>*CMsEA<5cUY^>AmojZq?J~J`8H~l1Lx@Hc8%dpY?;N{%3|lS7ZQ~(q^?7xwUp#W2 ze*U+_3sLFFpnPOdbjKujOm@excG@*WC4r(OjsAn3bJt;wcCT2|D)OzY%NT|gF>M-} z&(?v$;=*O|F#Cc(zR2tg{?q|yU8RG}$Q+DMqhwpr*n>VR_-hQl#Glx~tn0Z;#n7L9 zp;Wyn(;~osZtF{lnr3`E;}d&Vol2@@K708UwTh<37UMxwm6XRebm&A`G48AhPC5fd zC)RW^OVkW()#S38`dW;K(n~ftvIS+D`f7+-a%cg2cTIsc#DofHWZUe(1UoP{Lja=U& zqJR{5GFjk+e?{b9gTO|&3ICgw>ilkCzYtE~5GJLn@J#C>s@O!L8Y28#O6JNR>8AS4 z&7*fA;z)I#N9XN$=ZHV=RQYq>$drWgXIwm_laDC*Gn%d>2cFDOxc5W!z z;=aCUw6DDO#w%m5AamFQ-?;e(9+^F`@K|@lKjv4hg%n!m(dmBRTz22NEW2ECw#v>{ zWY@OlC(#e1n6$hgwQZH#w!&tguFh0F@~-?z<%gA%%K`tFOWw`07l(%|Nmq@ZeatM7 z-^?Bq8`n>Dh|bNDbF=K+jI0(c{*m*2XSVyjnmaXVSFW}tyF_$vm}(Ylz9I78P{sEz z(8Acy+J#$j`--YKI^}L)oCOtp<3)GSp zgcz29=|F4Ak}S@T`07PwrXoNC(A6XkLUaZnglHurM8B+x^J{V>W&Xn-ma)*6TJnio z&M65#M#VlURIiLwFviJmeLqB7-{)Si5Snf6$Ke6R_YU#-4fAc_eEN5@hU{hJ1kxLi zrZMuf?RbN+!+6KJWk(60#|gH8?QH4|C*6@~5Qysw#Lxxe(E?c%zc95k3yfm!4Ps$e zxoGM(HET2;2q_MLYhcDuB$&hrBJrVX*n>9|jo@J*jsrnzC=%@<&&R>pPBzy46h0A7 zCb23Kr)1(t%A^p0$`DfAiNNKsK7rzhg|85}4Gbn29K}I<^q5S{+Cr){(?NUKe2zWi z{$ieVepEOr{08qAr?K|;aFC(Hn_VI=*l>NHZ1v=tTCz^LX+1qO7(;3oX4(MnuJ3#M zaL&CT55`qtd0z4yB1 zO$WvunTHU|o2PV5FcTevA=!n$(g53Oqt0PC0>~HzHKxe4;Yc&^x=yYe=%W_>Y&7(9 z3xE&GEY2a29t=TjJ&u#42q_86K%O*_i#^iV6^H>LoN-Gp+)BOf!xnlF`?iS1%wGRU z$^H+KFF=fkstGJlBG;)WkR-h>aL8MAH?yVBN+mm_7j{CN zYA_VKpbj6Nov70ui>X>2eGYY7YX$l%&O1w}2PfEY7VgkBp&P+;@T|ZNS6EAt9}}@q zS!CE$?8jI#!Asr;iS!crV)wX;Ut9IqE(sonf1BFOEQ--TXGFP zk^OS@t3~$9HMh*TDm)ORL@bqc_8Ci6lUd~IXBJybIG@%?oNXo?>^7T>*G(*ZO8%c0 z15cWknQ#ovY?8TfC-Rj1KQ9IzH2F-JMVw8>%@dVR$^Y|W;91i;iaeXB)qwx!#lZ8X zH72YynoY)+Pxzja|L4WP9#aeDJe!Q4oOt~y`F~yv+-urvG67G_P17gGkb=TK*T*<+ Wt~RZi;f!Rt)l`c;wR00Tfc_unHW+*W literal 0 HcmV?d00001 diff --git a/preprocess/humanparsing/networks/__pycache__/__init__.cpython-311.pyc b/preprocess/humanparsing/networks/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..015aad052df3568faa5e2b524bfd435a7d0731f1 GIT binary patch literal 862 zcmZ`%&r2IY6rS1L#3YhfPz>Id3WZd$#zUZ@7V!raL4_)murRE<6J3&>2{W^Xv?)mG zu@os3d(5F&iih@3iA88w@YGXp0dJoAHn>44eY|<^dv9jmeDh|$X0sUt^4;vx5=Q8E z6vU$4g6nAjr^rPvt|1?nF^;fS(|ow?pK<78>Hbemp3Gdx@hm$C}BsQ>)FH!igQK61##-Ze;3CSmJ>+DeZqjP zjFV)0dw12VR08R7Mpj-vx9Wn{1$U^F)?wh=tZobGu>%X9t-(cAT7-DaQ-sXan_;F8 z`}Y?);GTvdH^CgE?$Ge3r>9FFmo7#pFGnXkLy=zP#yj~Zzw)J@`O*({kzcsXFI?mn zFLR5X)Z*3f*vanuXP;L)!&B{bFp(Nl*H8{^6_Q~Fx*DiJP(no1sBkRiG_xEW_>`%Y zwYi=C#}Y}H?=$*_MD(dd7R*g*0jLHwx+F#+jGkHUfa&QN<1TvCxvyRHxN~27NtAeS WGSSnutahC4Wpq5 1.0 else last_channel + self.features = [conv_bn(3, input_channel, 2)] + # building inverted residual blocks + for t, c, n, s in interverted_residual_setting: + output_channel = int(c * width_mult) + for i in range(n): + if i == 0: + self.features.append(block(input_channel, output_channel, s, expand_ratio=t)) + else: + self.features.append(block(input_channel, output_channel, 1, expand_ratio=t)) + input_channel = output_channel + # building last several layers + self.features.append(conv_1x1_bn(input_channel, self.last_channel)) + # make it nn.Sequential + self.features = nn.Sequential(*self.features) + + # building classifier + self.classifier = nn.Sequential( + nn.Dropout(0.2), + nn.Linear(self.last_channel, n_class), + ) + + self._initialize_weights() + + def forward(self, x): + x = self.features(x) + x = x.mean(3).mean(2) + x = self.classifier(x) + return x + + def _initialize_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + m.weight.data.normal_(0, math.sqrt(2. / n)) + if m.bias is not None: + m.bias.data.zero_() + elif isinstance(m, BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + elif isinstance(m, nn.Linear): + n = m.weight.size(1) + m.weight.data.normal_(0, 0.01) + m.bias.data.zero_() + + +def mobilenetv2(pretrained=False, **kwargs): + """Constructs a MobileNet_V2 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = MobileNetV2(n_class=1000, **kwargs) + if pretrained: + model.load_state_dict(load_url(model_urls['mobilenetv2']), strict=False) + return model diff --git a/preprocess/humanparsing/networks/backbone/resnet.py b/preprocess/humanparsing/networks/backbone/resnet.py new file mode 100644 index 0000000..88d6f73 --- /dev/null +++ b/preprocess/humanparsing/networks/backbone/resnet.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : resnet.py +@Time : 8/4/19 3:35 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import functools +import torch.nn as nn +import math +from torch.utils.model_zoo import load_url + +from modules import InPlaceABNSync + +BatchNorm2d = functools.partial(InPlaceABNSync, activation='none') + +__all__ = ['ResNet', 'resnet18', 'resnet50', 'resnet101'] # resnet101 is coming soon! + +model_urls = { + 'resnet18': 'http://sceneparsing.csail.mit.edu/model/pretrained_resnet/resnet18-imagenet.pth', + 'resnet50': 'http://sceneparsing.csail.mit.edu/model/pretrained_resnet/resnet50-imagenet.pth', + 'resnet101': 'http://sceneparsing.csail.mit.edu/model/pretrained_resnet/resnet101-imagenet.pth' +} + + +def conv3x3(in_planes, out_planes, stride=1): + "3x3 convolution with padding" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=1, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = BatchNorm2d(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = BatchNorm2d(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = BatchNorm2d(planes) + self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, + padding=1, bias=False) + self.bn2 = BatchNorm2d(planes) + self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) + self.bn3 = BatchNorm2d(planes * 4) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + + def __init__(self, block, layers, num_classes=1000): + self.inplanes = 128 + super(ResNet, self).__init__() + self.conv1 = conv3x3(3, 64, stride=2) + self.bn1 = BatchNorm2d(64) + self.relu1 = nn.ReLU(inplace=True) + self.conv2 = conv3x3(64, 64) + self.bn2 = BatchNorm2d(64) + self.relu2 = nn.ReLU(inplace=True) + self.conv3 = conv3x3(64, 128) + self.bn3 = BatchNorm2d(128) + self.relu3 = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4 = self._make_layer(block, 512, layers[3], stride=2) + self.avgpool = nn.AvgPool2d(7, stride=1) + self.fc = nn.Linear(512 * block.expansion, num_classes) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + m.weight.data.normal_(0, math.sqrt(2. / n)) + elif isinstance(m, BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + + def _make_layer(self, block, planes, blocks, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d(self.inplanes, planes * block.expansion, + kernel_size=1, stride=stride, bias=False), + BatchNorm2d(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.relu1(self.bn1(self.conv1(x))) + x = self.relu2(self.bn2(self.conv2(x))) + x = self.relu3(self.bn3(self.conv3(x))) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = x.view(x.size(0), -1) + x = self.fc(x) + + return x + + +def resnet18(pretrained=False, **kwargs): + """Constructs a ResNet-18 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) + if pretrained: + model.load_state_dict(load_url(model_urls['resnet18'])) + return model + + +def resnet50(pretrained=False, **kwargs): + """Constructs a ResNet-50 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) + if pretrained: + model.load_state_dict(load_url(model_urls['resnet50']), strict=False) + return model + + +def resnet101(pretrained=False, **kwargs): + """Constructs a ResNet-101 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) + if pretrained: + model.load_state_dict(load_url(model_urls['resnet101']), strict=False) + return model diff --git a/preprocess/humanparsing/networks/backbone/resnext.py b/preprocess/humanparsing/networks/backbone/resnext.py new file mode 100644 index 0000000..96adb54 --- /dev/null +++ b/preprocess/humanparsing/networks/backbone/resnext.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : resnext.py.py +@Time : 8/11/19 8:58 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" +import functools +import torch.nn as nn +import math +from torch.utils.model_zoo import load_url + +from modules import InPlaceABNSync + +BatchNorm2d = functools.partial(InPlaceABNSync, activation='none') + +__all__ = ['ResNeXt', 'resnext101'] # support resnext 101 + +model_urls = { + 'resnext50': 'http://sceneparsing.csail.mit.edu/model/pretrained_resnet/resnext50-imagenet.pth', + 'resnext101': 'http://sceneparsing.csail.mit.edu/model/pretrained_resnet/resnext101-imagenet.pth' +} + + +def conv3x3(in_planes, out_planes, stride=1): + "3x3 convolution with padding" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=1, bias=False) + + +class GroupBottleneck(nn.Module): + expansion = 2 + + def __init__(self, inplanes, planes, stride=1, groups=1, downsample=None): + super(GroupBottleneck, self).__init__() + self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = BatchNorm2d(planes) + self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, + padding=1, groups=groups, bias=False) + self.bn2 = BatchNorm2d(planes) + self.conv3 = nn.Conv2d(planes, planes * 2, kernel_size=1, bias=False) + self.bn3 = BatchNorm2d(planes * 2) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class ResNeXt(nn.Module): + + def __init__(self, block, layers, groups=32, num_classes=1000): + self.inplanes = 128 + super(ResNeXt, self).__init__() + self.conv1 = conv3x3(3, 64, stride=2) + self.bn1 = BatchNorm2d(64) + self.relu1 = nn.ReLU(inplace=True) + self.conv2 = conv3x3(64, 64) + self.bn2 = BatchNorm2d(64) + self.relu2 = nn.ReLU(inplace=True) + self.conv3 = conv3x3(64, 128) + self.bn3 = BatchNorm2d(128) + self.relu3 = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + self.layer1 = self._make_layer(block, 128, layers[0], groups=groups) + self.layer2 = self._make_layer(block, 256, layers[1], stride=2, groups=groups) + self.layer3 = self._make_layer(block, 512, layers[2], stride=2, groups=groups) + self.layer4 = self._make_layer(block, 1024, layers[3], stride=2, groups=groups) + self.avgpool = nn.AvgPool2d(7, stride=1) + self.fc = nn.Linear(1024 * block.expansion, num_classes) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels // m.groups + m.weight.data.normal_(0, math.sqrt(2. / n)) + elif isinstance(m, BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + + def _make_layer(self, block, planes, blocks, stride=1, groups=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d(self.inplanes, planes * block.expansion, + kernel_size=1, stride=stride, bias=False), + BatchNorm2d(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, groups, downsample)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes, groups=groups)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.relu1(self.bn1(self.conv1(x))) + x = self.relu2(self.bn2(self.conv2(x))) + x = self.relu3(self.bn3(self.conv3(x))) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = x.view(x.size(0), -1) + x = self.fc(x) + + return x + + +def resnext101(pretrained=False, **kwargs): + """Constructs a ResNet-101 model. + Args: + pretrained (bool): If True, returns a model pre-trained on Places + """ + model = ResNeXt(GroupBottleneck, [3, 4, 23, 3], **kwargs) + if pretrained: + model.load_state_dict(load_url(model_urls['resnext101']), strict=False) + return model diff --git a/preprocess/humanparsing/networks/context_encoding/aspp.py b/preprocess/humanparsing/networks/context_encoding/aspp.py new file mode 100644 index 0000000..d0ba531 --- /dev/null +++ b/preprocess/humanparsing/networks/context_encoding/aspp.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : aspp.py +@Time : 8/4/19 3:36 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import torch +import torch.nn as nn +from torch.nn import functional as F + +from modules import InPlaceABNSync + + +class ASPPModule(nn.Module): + """ + Reference: + Chen, Liang-Chieh, et al. *"Rethinking Atrous Convolution for Semantic Image Segmentation."* + """ + def __init__(self, features, out_features=512, inner_features=256, dilations=(12, 24, 36)): + super(ASPPModule, self).__init__() + + self.conv1 = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), + nn.Conv2d(features, inner_features, kernel_size=1, padding=0, dilation=1, + bias=False), + InPlaceABNSync(inner_features)) + self.conv2 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(inner_features)) + self.conv3 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=3, padding=dilations[0], dilation=dilations[0], bias=False), + InPlaceABNSync(inner_features)) + self.conv4 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=3, padding=dilations[1], dilation=dilations[1], bias=False), + InPlaceABNSync(inner_features)) + self.conv5 = nn.Sequential( + nn.Conv2d(features, inner_features, kernel_size=3, padding=dilations[2], dilation=dilations[2], bias=False), + InPlaceABNSync(inner_features)) + + self.bottleneck = nn.Sequential( + nn.Conv2d(inner_features * 5, out_features, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(out_features), + nn.Dropout2d(0.1) + ) + + def forward(self, x): + _, _, h, w = x.size() + + feat1 = F.interpolate(self.conv1(x), size=(h, w), mode='bilinear', align_corners=True) + + feat2 = self.conv2(x) + feat3 = self.conv3(x) + feat4 = self.conv4(x) + feat5 = self.conv5(x) + out = torch.cat((feat1, feat2, feat3, feat4, feat5), 1) + + bottle = self.bottleneck(out) + return bottle \ No newline at end of file diff --git a/preprocess/humanparsing/networks/context_encoding/ocnet.py b/preprocess/humanparsing/networks/context_encoding/ocnet.py new file mode 100644 index 0000000..ac43ebf --- /dev/null +++ b/preprocess/humanparsing/networks/context_encoding/ocnet.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : ocnet.py +@Time : 8/4/19 3:36 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import functools + +import torch +import torch.nn as nn +from torch.autograd import Variable +from torch.nn import functional as F + +from modules import InPlaceABNSync +BatchNorm2d = functools.partial(InPlaceABNSync, activation='none') + + +class _SelfAttentionBlock(nn.Module): + ''' + The basic implementation for self-attention block/non-local block + Input: + N X C X H X W + Parameters: + in_channels : the dimension of the input feature map + key_channels : the dimension after the key/query transform + value_channels : the dimension after the value transform + scale : choose the scale to downsample the input feature maps (save memory cost) + Return: + N X C X H X W + position-aware context features.(w/o concate or add with the input) + ''' + + def __init__(self, in_channels, key_channels, value_channels, out_channels=None, scale=1): + super(_SelfAttentionBlock, self).__init__() + self.scale = scale + self.in_channels = in_channels + self.out_channels = out_channels + self.key_channels = key_channels + self.value_channels = value_channels + if out_channels == None: + self.out_channels = in_channels + self.pool = nn.MaxPool2d(kernel_size=(scale, scale)) + self.f_key = nn.Sequential( + nn.Conv2d(in_channels=self.in_channels, out_channels=self.key_channels, + kernel_size=1, stride=1, padding=0), + InPlaceABNSync(self.key_channels), + ) + self.f_query = self.f_key + self.f_value = nn.Conv2d(in_channels=self.in_channels, out_channels=self.value_channels, + kernel_size=1, stride=1, padding=0) + self.W = nn.Conv2d(in_channels=self.value_channels, out_channels=self.out_channels, + kernel_size=1, stride=1, padding=0) + nn.init.constant(self.W.weight, 0) + nn.init.constant(self.W.bias, 0) + + def forward(self, x): + batch_size, h, w = x.size(0), x.size(2), x.size(3) + if self.scale > 1: + x = self.pool(x) + + value = self.f_value(x).view(batch_size, self.value_channels, -1) + value = value.permute(0, 2, 1) + query = self.f_query(x).view(batch_size, self.key_channels, -1) + query = query.permute(0, 2, 1) + key = self.f_key(x).view(batch_size, self.key_channels, -1) + + sim_map = torch.matmul(query, key) + sim_map = (self.key_channels ** -.5) * sim_map + sim_map = F.softmax(sim_map, dim=-1) + + context = torch.matmul(sim_map, value) + context = context.permute(0, 2, 1).contiguous() + context = context.view(batch_size, self.value_channels, *x.size()[2:]) + context = self.W(context) + if self.scale > 1: + context = F.upsample(input=context, size=(h, w), mode='bilinear', align_corners=True) + return context + + +class SelfAttentionBlock2D(_SelfAttentionBlock): + def __init__(self, in_channels, key_channels, value_channels, out_channels=None, scale=1): + super(SelfAttentionBlock2D, self).__init__(in_channels, + key_channels, + value_channels, + out_channels, + scale) + + +class BaseOC_Module(nn.Module): + """ + Implementation of the BaseOC module + Parameters: + in_features / out_features: the channels of the input / output feature maps. + dropout: we choose 0.05 as the default value. + size: you can apply multiple sizes. Here we only use one size. + Return: + features fused with Object context information. + """ + + def __init__(self, in_channels, out_channels, key_channels, value_channels, dropout, sizes=([1])): + super(BaseOC_Module, self).__init__() + self.stages = [] + self.stages = nn.ModuleList( + [self._make_stage(in_channels, out_channels, key_channels, value_channels, size) for size in sizes]) + self.conv_bn_dropout = nn.Sequential( + nn.Conv2d(2 * in_channels, out_channels, kernel_size=1, padding=0), + InPlaceABNSync(out_channels), + nn.Dropout2d(dropout) + ) + + def _make_stage(self, in_channels, output_channels, key_channels, value_channels, size): + return SelfAttentionBlock2D(in_channels, + key_channels, + value_channels, + output_channels, + size) + + def forward(self, feats): + priors = [stage(feats) for stage in self.stages] + context = priors[0] + for i in range(1, len(priors)): + context += priors[i] + output = self.conv_bn_dropout(torch.cat([context, feats], 1)) + return output + + +class BaseOC_Context_Module(nn.Module): + """ + Output only the context features. + Parameters: + in_features / out_features: the channels of the input / output feature maps. + dropout: specify the dropout ratio + fusion: We provide two different fusion method, "concat" or "add" + size: we find that directly learn the attention weights on even 1/8 feature maps is hard. + Return: + features after "concat" or "add" + """ + + def __init__(self, in_channels, out_channels, key_channels, value_channels, dropout, sizes=([1])): + super(BaseOC_Context_Module, self).__init__() + self.stages = [] + self.stages = nn.ModuleList( + [self._make_stage(in_channels, out_channels, key_channels, value_channels, size) for size in sizes]) + self.conv_bn_dropout = nn.Sequential( + nn.Conv2d(in_channels, out_channels, kernel_size=1, padding=0), + InPlaceABNSync(out_channels), + ) + + def _make_stage(self, in_channels, output_channels, key_channels, value_channels, size): + return SelfAttentionBlock2D(in_channels, + key_channels, + value_channels, + output_channels, + size) + + def forward(self, feats): + priors = [stage(feats) for stage in self.stages] + context = priors[0] + for i in range(1, len(priors)): + context += priors[i] + output = self.conv_bn_dropout(context) + return output + + +class ASP_OC_Module(nn.Module): + def __init__(self, features, out_features=256, dilations=(12, 24, 36)): + super(ASP_OC_Module, self).__init__() + self.context = nn.Sequential(nn.Conv2d(features, out_features, kernel_size=3, padding=1, dilation=1, bias=True), + InPlaceABNSync(out_features), + BaseOC_Context_Module(in_channels=out_features, out_channels=out_features, + key_channels=out_features // 2, value_channels=out_features, + dropout=0, sizes=([2]))) + self.conv2 = nn.Sequential(nn.Conv2d(features, out_features, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(out_features)) + self.conv3 = nn.Sequential( + nn.Conv2d(features, out_features, kernel_size=3, padding=dilations[0], dilation=dilations[0], bias=False), + InPlaceABNSync(out_features)) + self.conv4 = nn.Sequential( + nn.Conv2d(features, out_features, kernel_size=3, padding=dilations[1], dilation=dilations[1], bias=False), + InPlaceABNSync(out_features)) + self.conv5 = nn.Sequential( + nn.Conv2d(features, out_features, kernel_size=3, padding=dilations[2], dilation=dilations[2], bias=False), + InPlaceABNSync(out_features)) + + self.conv_bn_dropout = nn.Sequential( + nn.Conv2d(out_features * 5, out_features, kernel_size=1, padding=0, dilation=1, bias=False), + InPlaceABNSync(out_features), + nn.Dropout2d(0.1) + ) + + def _cat_each(self, feat1, feat2, feat3, feat4, feat5): + assert (len(feat1) == len(feat2)) + z = [] + for i in range(len(feat1)): + z.append(torch.cat((feat1[i], feat2[i], feat3[i], feat4[i], feat5[i]), 1)) + return z + + def forward(self, x): + if isinstance(x, Variable): + _, _, h, w = x.size() + elif isinstance(x, tuple) or isinstance(x, list): + _, _, h, w = x[0].size() + else: + raise RuntimeError('unknown input type') + + feat1 = self.context(x) + feat2 = self.conv2(x) + feat3 = self.conv3(x) + feat4 = self.conv4(x) + feat5 = self.conv5(x) + + if isinstance(x, Variable): + out = torch.cat((feat1, feat2, feat3, feat4, feat5), 1) + elif isinstance(x, tuple) or isinstance(x, list): + out = self._cat_each(feat1, feat2, feat3, feat4, feat5) + else: + raise RuntimeError('unknown input type') + output = self.conv_bn_dropout(out) + return output diff --git a/preprocess/humanparsing/networks/context_encoding/psp.py b/preprocess/humanparsing/networks/context_encoding/psp.py new file mode 100644 index 0000000..47181dc --- /dev/null +++ b/preprocess/humanparsing/networks/context_encoding/psp.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : psp.py +@Time : 8/4/19 3:36 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import torch +import torch.nn as nn +from torch.nn import functional as F + +from modules import InPlaceABNSync + + +class PSPModule(nn.Module): + """ + Reference: + Zhao, Hengshuang, et al. *"Pyramid scene parsing network."* + """ + def __init__(self, features, out_features=512, sizes=(1, 2, 3, 6)): + super(PSPModule, self).__init__() + + self.stages = [] + self.stages = nn.ModuleList([self._make_stage(features, out_features, size) for size in sizes]) + self.bottleneck = nn.Sequential( + nn.Conv2d(features + len(sizes) * out_features, out_features, kernel_size=3, padding=1, dilation=1, + bias=False), + InPlaceABNSync(out_features), + ) + + def _make_stage(self, features, out_features, size): + prior = nn.AdaptiveAvgPool2d(output_size=(size, size)) + conv = nn.Conv2d(features, out_features, kernel_size=1, bias=False) + bn = InPlaceABNSync(out_features) + return nn.Sequential(prior, conv, bn) + + def forward(self, feats): + h, w = feats.size(2), feats.size(3) + priors = [F.interpolate(input=stage(feats), size=(h, w), mode='bilinear', align_corners=True) for stage in + self.stages] + [feats] + bottle = self.bottleneck(torch.cat(priors, 1)) + return bottle \ No newline at end of file diff --git a/preprocess/humanparsing/parsing_api.py b/preprocess/humanparsing/parsing_api.py new file mode 100644 index 0000000..1fe5b94 --- /dev/null +++ b/preprocess/humanparsing/parsing_api.py @@ -0,0 +1,238 @@ +import pdb +from pathlib import Path +import sys + +PROJECT_ROOT = Path(__file__).absolute().parents[0].absolute() +sys.path.insert(0, str(PROJECT_ROOT)) +import os +import torch +import numpy as np +import cv2 +from . import networks +from collections import OrderedDict +import torchvision.transforms as transforms +from torch.utils.data import DataLoader +from .datasets.simple_extractor_dataset import SimpleFolderDataset +from .utils.transforms import transform_logits +from tqdm import tqdm +from PIL import Image + + +def get_palette(num_cls): + """ Returns the color map for visualizing the segmentation mask. + Args: + num_cls: Number of classes + Returns: + The color map + """ + n = num_cls + palette = [0] * (n * 3) + for j in range(0, n): + lab = j + palette[j * 3 + 0] = 0 + palette[j * 3 + 1] = 0 + palette[j * 3 + 2] = 0 + i = 0 + while lab: + palette[j * 3 + 0] |= (((lab >> 0) & 1) << (7 - i)) + palette[j * 3 + 1] |= (((lab >> 1) & 1) << (7 - i)) + palette[j * 3 + 2] |= (((lab >> 2) & 1) << (7 - i)) + i += 1 + lab >>= 3 + return palette + + +def delete_irregular(logits_result): + parsing_result = np.argmax(logits_result, axis=2) + upper_cloth = np.where(parsing_result == 4, 255, 0) + contours, hierarchy = cv2.findContours(upper_cloth.astype(np.uint8), + cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1) + area = [] + for i in range(len(contours)): + a = cv2.contourArea(contours[i], True) + area.append(abs(a)) + if len(area) != 0: + top = area.index(max(area)) + M = cv2.moments(contours[top]) + cY = int(M["m01"] / M["m00"]) + + dresses = np.where(parsing_result == 7, 255, 0) + contours_dress, hierarchy_dress = cv2.findContours(dresses.astype(np.uint8), + cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1) + area_dress = [] + for j in range(len(contours_dress)): + a_d = cv2.contourArea(contours_dress[j], True) + area_dress.append(abs(a_d)) + if len(area_dress) != 0: + top_dress = area_dress.index(max(area_dress)) + M_dress = cv2.moments(contours_dress[top_dress]) + cY_dress = int(M_dress["m01"] / M_dress["m00"]) + wear_type = "dresses" + if len(area) != 0: + if len(area_dress) != 0 and cY_dress > cY: + irregular_list = np.array([4, 5, 6]) + logits_result[:, :, irregular_list] = -1 + else: + irregular_list = np.array([5, 6, 7, 8, 9, 10, 12, 13]) + logits_result[:cY, :, irregular_list] = -1 + wear_type = "cloth_pant" + parsing_result = np.argmax(logits_result, axis=2) + # pad border + parsing_result = np.pad(parsing_result, pad_width=1, mode='constant', constant_values=0) + return parsing_result, wear_type + + + +def hole_fill(img): + img_copy = img.copy() + mask = np.zeros((img.shape[0] + 2, img.shape[1] + 2), dtype=np.uint8) + cv2.floodFill(img, mask, (0, 0), 255) + img_inverse = cv2.bitwise_not(img) + dst = cv2.bitwise_or(img_copy, img_inverse) + return dst + +def refine_mask(mask): + contours, hierarchy = cv2.findContours(mask.astype(np.uint8), + cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1) + area = [] + for j in range(len(contours)): + a_d = cv2.contourArea(contours[j], True) + area.append(abs(a_d)) + refine_mask = np.zeros_like(mask).astype(np.uint8) + if len(area) != 0: + i = area.index(max(area)) + cv2.drawContours(refine_mask, contours, i, color=255, thickness=-1) + # keep large area in skin case + for j in range(len(area)): + if j != i and area[i] > 2000: + cv2.drawContours(refine_mask, contours, j, color=255, thickness=-1) + return refine_mask + +def refine_hole(parsing_result_filled, parsing_result, arm_mask): + filled_hole = cv2.bitwise_and(np.where(parsing_result_filled == 4, 255, 0), + np.where(parsing_result != 4, 255, 0)) - arm_mask * 255 + contours, hierarchy = cv2.findContours(filled_hole, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1) + refine_hole_mask = np.zeros_like(parsing_result).astype(np.uint8) + for i in range(len(contours)): + a = cv2.contourArea(contours[i], True) + # keep hole > 2000 pixels + if abs(a) > 2000: + cv2.drawContours(refine_hole_mask, contours, i, color=255, thickness=-1) + return refine_hole_mask + arm_mask + + + +def load_atr_model(): + # load atr model + num_classes = 18 + label = ['Background', 'Hat', 'Hair', 'Sunglasses', 'Upper-clothes', 'Skirt', 'Pants', 'Dress', 'Belt', + 'Left-shoe', 'Right-shoe', 'Face', 'Left-leg', 'Right-leg', 'Left-arm', 'Right-arm', 'Bag', 'Scarf'] + model = networks.init_model('resnet101', num_classes=num_classes, pretrained=None) + state_dict = torch.load(os.path.join(Path(__file__).absolute().parents[2].absolute(), 'checkpoints/humanparsing/exp-schp-201908301523-atr.pth'))['state_dict'] + new_state_dict = OrderedDict() + for k, v in state_dict.items(): + name = k[7:] # remove `module.` + new_state_dict[name] = v + model.load_state_dict(new_state_dict) + model.cuda() + model.eval() + # load lip model + return model + +def load_lip_model(): + # load atr model + num_classes = 20 + label = ['Background', 'Hat', 'Hair', 'Glove', 'Sunglasses', 'Upper-clothes', 'Dress', 'Coat', + 'Socks', 'Pants', 'Jumpsuits', 'Scarf', 'Skirt', 'Face', 'Left-arm', 'Right-arm', + 'Left-leg', 'Right-leg', 'Left-shoe', 'Right-shoe'] + model = networks.init_model('resnet101', num_classes=num_classes, pretrained=None) + state_dict = torch.load(os.path.join(Path(__file__).absolute().parents[2].absolute(), 'checkpoints/humanparsing/exp-schp-201908261155-lip.pth'))['state_dict'] + new_state_dict = OrderedDict() + for k, v in state_dict.items(): + name = k[7:] # remove `module.` + new_state_dict[name] = v + model.load_state_dict(new_state_dict) + model.cuda() + model.eval() + # load lip model + return model + +def inference(model, lip_model, input_dir): + # load datasetloader + transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize(mean=[0.406, 0.456, 0.485], std=[0.225, 0.224, 0.229]) + ]) + dataset = SimpleFolderDataset(root=input_dir, input_size=[512, 512], transform=transform) + dataloader = DataLoader(dataset) + with torch.no_grad(): + for _, batch in enumerate(tqdm(dataloader)): + image, meta = batch + c = meta['center'].numpy()[0] + s = meta['scale'].numpy()[0] + w = meta['width'].numpy()[0] + h = meta['height'].numpy()[0] + + output = model(image.cuda()) + + upsample = torch.nn.Upsample(size=[512, 512], mode='bilinear', align_corners=True) + upsample_output = upsample(output[0][-1][0].unsqueeze(0)) + upsample_output = upsample_output.squeeze() + upsample_output = upsample_output.permute(1, 2, 0) # CHW -> HWC + logits_result = transform_logits(upsample_output.data.cpu().numpy(), c, s, w, h, input_size=[512, 512]) + + # delete irregular classes, e.g. pants/ skirts over clothes + parsing_result = np.argmax(logits_result, axis=2) + parsing_result = np.pad(parsing_result, pad_width=1, mode='constant', constant_values=0) + + # try holefilling the clothes part + arm_mask = (parsing_result == 14).astype(np.float32) \ + + (parsing_result == 15).astype(np.float32) + upper_cloth_mask = (parsing_result == 4).astype(np.float32) + arm_mask + img = np.where(upper_cloth_mask, 255, 0) + dst = hole_fill(img.astype(np.uint8)) + parsing_result_filled = dst / 255 * 4 + parsing_result_woarm = np.where(parsing_result_filled == 4, parsing_result_filled, parsing_result) + + # add back arm and refined hole between arm and cloth + refine_hole_mask = refine_hole(parsing_result_filled.astype(np.uint8), parsing_result.astype(np.uint8), + arm_mask.astype(np.uint8)) + parsing_result = np.where(refine_hole_mask, parsing_result, parsing_result_woarm) + # remove padding + parsing_result = parsing_result[1:-1, 1:-1] + + + dataset_lip = SimpleFolderDataset(root=input_dir, input_size=[473, 473], transform=transform) + dataloader_lip = DataLoader(dataset_lip) + with torch.no_grad(): + for _, batch in enumerate(tqdm(dataloader_lip)): + image, meta = batch + c = meta['center'].numpy()[0] + s = meta['scale'].numpy()[0] + w = meta['width'].numpy()[0] + h = meta['height'].numpy()[0] + + output_lip = lip_model(image.cuda()) + + upsample = torch.nn.Upsample(size=[473, 473], mode='bilinear', align_corners=True) + upsample_output_lip = upsample(output_lip[0][-1][0].unsqueeze(0)) + upsample_output_lip = upsample_output_lip.squeeze() + upsample_output_lip = upsample_output_lip.permute(1, 2, 0) # CHW -> HWC + logits_result_lip = transform_logits(upsample_output_lip.data.cpu().numpy(), c, s, w, h, input_size=[473, 473]) + parsing_result_lip = np.argmax(logits_result_lip, axis=2) + # add neck parsing result + neck_mask = np.logical_and(np.logical_not((parsing_result_lip == 13).astype(np.float32)), (parsing_result == 11).astype(np.float32)) + # filter out small part of neck + neck_mask = refine_mask(neck_mask) + # Image.fromarray(((neck_mask > 0) * 127.5 + 127.5).astype(np.uint8)).save("neck_mask.jpg") + parsing_result = np.where(neck_mask, 18, parsing_result) + palette = get_palette(19) + parsing_result_path = os.path.join('parsed.png') + output_img = Image.fromarray(np.asarray(parsing_result, dtype=np.uint8)) + output_img.putpalette(palette) + # output_img.save(parsing_result_path) + face_mask = torch.from_numpy((parsing_result == 11).astype(np.float32)) + + return output_img, face_mask + + diff --git a/preprocess/humanparsing/utils/__init__.py b/preprocess/humanparsing/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/preprocess/humanparsing/utils/__pycache__/__init__.cpython-311.pyc b/preprocess/humanparsing/utils/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e6ab4f8b12483b389c0f20407b394260ac57b3d GIT binary patch literal 272 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 GFaHaUq}lQS literal 0 HcmV?d00001 diff --git a/preprocess/humanparsing/utils/consistency_loss.py b/preprocess/humanparsing/utils/consistency_loss.py new file mode 100644 index 0000000..b872fdc --- /dev/null +++ b/preprocess/humanparsing/utils/consistency_loss.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : kl_loss.py +@Time : 7/23/19 4:02 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" +import torch +import torch.nn.functional as F +from torch import nn +from datasets.target_generation import generate_edge_tensor + + +class ConsistencyLoss(nn.Module): + def __init__(self, ignore_index=255): + super(ConsistencyLoss, self).__init__() + self.ignore_index=ignore_index + + def forward(self, parsing, edge, label): + parsing_pre = torch.argmax(parsing, dim=1) + parsing_pre[label==self.ignore_index]=self.ignore_index + generated_edge = generate_edge_tensor(parsing_pre) + edge_pre = torch.argmax(edge, dim=1) + v_generate_edge = generated_edge[label!=255] + v_edge_pre = edge_pre[label!=255] + v_edge_pre = v_edge_pre.type(torch.cuda.FloatTensor) + positive_union = (v_generate_edge==1)&(v_edge_pre==1) # only the positive values count + return F.smooth_l1_loss(v_generate_edge[positive_union].squeeze(0), v_edge_pre[positive_union].squeeze(0)) diff --git a/preprocess/humanparsing/utils/criterion.py b/preprocess/humanparsing/utils/criterion.py new file mode 100644 index 0000000..9688943 --- /dev/null +++ b/preprocess/humanparsing/utils/criterion.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : criterion.py +@Time : 8/30/19 8:59 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import torch.nn as nn +import torch +import numpy as np +from torch.nn import functional as F +from .lovasz_softmax import LovaszSoftmax +from .kl_loss import KLDivergenceLoss +from .consistency_loss import ConsistencyLoss + +NUM_CLASSES = 20 + + +class CriterionAll(nn.Module): + def __init__(self, use_class_weight=False, ignore_index=255, lambda_1=1, lambda_2=1, lambda_3=1, + num_classes=20): + super(CriterionAll, self).__init__() + self.ignore_index = ignore_index + self.use_class_weight = use_class_weight + self.criterion = torch.nn.CrossEntropyLoss(ignore_index=ignore_index) + self.lovasz = LovaszSoftmax(ignore_index=ignore_index) + self.kldiv = KLDivergenceLoss(ignore_index=ignore_index) + self.reg = ConsistencyLoss(ignore_index=ignore_index) + self.lamda_1 = lambda_1 + self.lamda_2 = lambda_2 + self.lamda_3 = lambda_3 + self.num_classes = num_classes + + def parsing_loss(self, preds, target, cycle_n=None): + """ + Loss function definition. + + Args: + preds: [[parsing result1, parsing result2],[edge result]] + target: [parsing label, egde label] + soft_preds: [[parsing result1, parsing result2],[edge result]] + Returns: + Calculated Loss. + """ + h, w = target[0].size(1), target[0].size(2) + + pos_num = torch.sum(target[1] == 1, dtype=torch.float) + neg_num = torch.sum(target[1] == 0, dtype=torch.float) + + weight_pos = neg_num / (pos_num + neg_num) + weight_neg = pos_num / (pos_num + neg_num) + weights = torch.tensor([weight_neg, weight_pos]) # edge loss weight + + loss = 0 + + # loss for segmentation + preds_parsing = preds[0] + for pred_parsing in preds_parsing: + scale_pred = F.interpolate(input=pred_parsing, size=(h, w), + mode='bilinear', align_corners=True) + + loss += 0.5 * self.lamda_1 * self.lovasz(scale_pred, target[0]) + if target[2] is None: + loss += 0.5 * self.lamda_1 * self.criterion(scale_pred, target[0]) + else: + soft_scale_pred = F.interpolate(input=target[2], size=(h, w), + mode='bilinear', align_corners=True) + soft_scale_pred = moving_average(soft_scale_pred, to_one_hot(target[0], num_cls=self.num_classes), + 1.0 / (cycle_n + 1.0)) + loss += 0.5 * self.lamda_1 * self.kldiv(scale_pred, soft_scale_pred, target[0]) + + # loss for edge + preds_edge = preds[1] + for pred_edge in preds_edge: + scale_pred = F.interpolate(input=pred_edge, size=(h, w), + mode='bilinear', align_corners=True) + if target[3] is None: + loss += self.lamda_2 * F.cross_entropy(scale_pred, target[1], + weights.cuda(), ignore_index=self.ignore_index) + else: + soft_scale_edge = F.interpolate(input=target[3], size=(h, w), + mode='bilinear', align_corners=True) + soft_scale_edge = moving_average(soft_scale_edge, to_one_hot(target[1], num_cls=2), + 1.0 / (cycle_n + 1.0)) + loss += self.lamda_2 * self.kldiv(scale_pred, soft_scale_edge, target[0]) + + # consistency regularization + preds_parsing = preds[0] + preds_edge = preds[1] + for pred_parsing in preds_parsing: + scale_pred = F.interpolate(input=pred_parsing, size=(h, w), + mode='bilinear', align_corners=True) + scale_edge = F.interpolate(input=preds_edge[0], size=(h, w), + mode='bilinear', align_corners=True) + loss += self.lamda_3 * self.reg(scale_pred, scale_edge, target[0]) + + return loss + + def forward(self, preds, target, cycle_n=None): + loss = self.parsing_loss(preds, target, cycle_n) + return loss + + def _generate_weights(self, masks, num_classes): + """ + masks: torch.Tensor with shape [B, H, W] + """ + masks_label = masks.data.cpu().numpy().astype(np.int64) + pixel_nums = [] + tot_pixels = 0 + for i in range(num_classes): + pixel_num_of_cls_i = np.sum(masks_label == i).astype(np.float) + pixel_nums.append(pixel_num_of_cls_i) + tot_pixels += pixel_num_of_cls_i + weights = [] + for i in range(num_classes): + weights.append( + (tot_pixels - pixel_nums[i]) / tot_pixels / (num_classes - 1) + ) + weights = np.array(weights, dtype=np.float) + # weights = torch.from_numpy(weights).float().to(masks.device) + return weights + + +def moving_average(target1, target2, alpha=1.0): + target = 0 + target += (1.0 - alpha) * target1 + target += target2 * alpha + return target + + +def to_one_hot(tensor, num_cls, dim=1, ignore_index=255): + b, h, w = tensor.shape + tensor[tensor == ignore_index] = 0 + onehot_tensor = torch.zeros(b, num_cls, h, w).cuda() + onehot_tensor.scatter_(dim, tensor.unsqueeze(dim), 1) + return onehot_tensor diff --git a/preprocess/humanparsing/utils/encoding.py b/preprocess/humanparsing/utils/encoding.py new file mode 100644 index 0000000..e865470 --- /dev/null +++ b/preprocess/humanparsing/utils/encoding.py @@ -0,0 +1,188 @@ +##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +## Created by: Hang Zhang +## ECE Department, Rutgers University +## Email: zhang.hang@rutgers.edu +## Copyright (c) 2017 +## +## This source code is licensed under the MIT-style license found in the +## LICENSE file in the root directory of this source tree +##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +"""Encoding Data Parallel""" +import threading +import functools +import torch +from torch.autograd import Variable, Function +import torch.cuda.comm as comm +from torch.nn.parallel.data_parallel import DataParallel +from torch.nn.parallel.parallel_apply import get_a_var +from torch.nn.parallel._functions import ReduceAddCoalesced, Broadcast + +torch_ver = torch.__version__[:3] + +__all__ = ['allreduce', 'DataParallelModel', 'DataParallelCriterion', 'patch_replication_callback'] + +def allreduce(*inputs): + """Cross GPU all reduce autograd operation for calculate mean and + variance in SyncBN. + """ + return AllReduce.apply(*inputs) + +class AllReduce(Function): + @staticmethod + def forward(ctx, num_inputs, *inputs): + ctx.num_inputs = num_inputs + ctx.target_gpus = [inputs[i].get_device() for i in range(0, len(inputs), num_inputs)] + inputs = [inputs[i:i + num_inputs] + for i in range(0, len(inputs), num_inputs)] + # sort before reduce sum + inputs = sorted(inputs, key=lambda i: i[0].get_device()) + results = comm.reduce_add_coalesced(inputs, ctx.target_gpus[0]) + outputs = comm.broadcast_coalesced(results, ctx.target_gpus) + return tuple([t for tensors in outputs for t in tensors]) + + @staticmethod + def backward(ctx, *inputs): + inputs = [i.data for i in inputs] + inputs = [inputs[i:i + ctx.num_inputs] + for i in range(0, len(inputs), ctx.num_inputs)] + results = comm.reduce_add_coalesced(inputs, ctx.target_gpus[0]) + outputs = comm.broadcast_coalesced(results, ctx.target_gpus) + return (None,) + tuple([Variable(t) for tensors in outputs for t in tensors]) + +class Reduce(Function): + @staticmethod + def forward(ctx, *inputs): + ctx.target_gpus = [inputs[i].get_device() for i in range(len(inputs))] + inputs = sorted(inputs, key=lambda i: i.get_device()) + return comm.reduce_add(inputs) + + @staticmethod + def backward(ctx, gradOutput): + return Broadcast.apply(ctx.target_gpus, gradOutput) + + +class DataParallelModel(DataParallel): + """Implements data parallelism at the module level. + + This container parallelizes the application of the given module by + splitting the input across the specified devices by chunking in the + batch dimension. + In the forward pass, the module is replicated on each device, + and each replica handles a portion of the input. During the backwards pass, gradients from each replica are summed into the original module. + Note that the outputs are not gathered, please use compatible + :class:`encoding.parallel.DataParallelCriterion`. + + The batch size should be larger than the number of GPUs used. It should + also be an integer multiple of the number of GPUs so that each chunk is + the same size (so that each GPU processes the same number of samples). + + Args: + module: module to be parallelized + device_ids: CUDA devices (default: all devices) + + Reference: + Hang Zhang, Kristin Dana, Jianping Shi, Zhongyue Zhang, Xiaogang Wang, Ambrish Tyagi, + Amit Agrawal. “Context Encoding for Semantic Segmentation. + *The IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2018* + + Example:: + + >>> net = encoding.nn.DataParallelModel(model, device_ids=[0, 1, 2]) + >>> y = net(x) + """ + def gather(self, outputs, output_device): + return outputs + + def replicate(self, module, device_ids): + modules = super(DataParallelModel, self).replicate(module, device_ids) + return modules + + +class DataParallelCriterion(DataParallel): + """ + Calculate loss in multiple-GPUs, which balance the memory usage for + Semantic Segmentation. + + The targets are splitted across the specified devices by chunking in + the batch dimension. Please use together with :class:`encoding.parallel.DataParallelModel`. + + Reference: + Hang Zhang, Kristin Dana, Jianping Shi, Zhongyue Zhang, Xiaogang Wang, Ambrish Tyagi, + Amit Agrawal. “Context Encoding for Semantic Segmentation. + *The IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2018* + + Example:: + + >>> net = encoding.nn.DataParallelModel(model, device_ids=[0, 1, 2]) + >>> criterion = encoding.nn.DataParallelCriterion(criterion, device_ids=[0, 1, 2]) + >>> y = net(x) + >>> loss = criterion(y, target) + """ + def forward(self, inputs, *targets, **kwargs): + # input should be already scatterd + # scattering the targets instead + if not self.device_ids: + return self.module(inputs, *targets, **kwargs) + targets, kwargs = self.scatter(targets, kwargs, self.device_ids) + if len(self.device_ids) == 1: + return self.module(inputs, *targets[0], **kwargs[0]) + replicas = self.replicate(self.module, self.device_ids[:len(inputs)]) + outputs = _criterion_parallel_apply(replicas, inputs, targets, kwargs) + return Reduce.apply(*outputs) / len(outputs) + + +def _criterion_parallel_apply(modules, inputs, targets, kwargs_tup=None, devices=None): + assert len(modules) == len(inputs) + assert len(targets) == len(inputs) + if kwargs_tup: + assert len(modules) == len(kwargs_tup) + else: + kwargs_tup = ({},) * len(modules) + if devices is not None: + assert len(modules) == len(devices) + else: + devices = [None] * len(modules) + + lock = threading.Lock() + results = {} + if torch_ver != "0.3": + grad_enabled = torch.is_grad_enabled() + + def _worker(i, module, input, target, kwargs, device=None): + if torch_ver != "0.3": + torch.set_grad_enabled(grad_enabled) + if device is None: + device = get_a_var(input).get_device() + try: + if not isinstance(input, tuple): + input = (input,) + with torch.cuda.device(device): + output = module(*(input + target), **kwargs) + with lock: + results[i] = output + except Exception as e: + with lock: + results[i] = e + + if len(modules) > 1: + threads = [threading.Thread(target=_worker, + args=(i, module, input, target, + kwargs, device),) + for i, (module, input, target, kwargs, device) in + enumerate(zip(modules, inputs, targets, kwargs_tup, devices))] + + for thread in threads: + thread.start() + for thread in threads: + thread.join() + else: + _worker(0, modules[0], inputs[0], kwargs_tup[0], devices[0]) + + outputs = [] + for i in range(len(inputs)): + output = results[i] + if isinstance(output, Exception): + raise output + outputs.append(output) + return outputs diff --git a/preprocess/humanparsing/utils/kl_loss.py b/preprocess/humanparsing/utils/kl_loss.py new file mode 100644 index 0000000..9a685d9 --- /dev/null +++ b/preprocess/humanparsing/utils/kl_loss.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : kl_loss.py +@Time : 7/23/19 4:02 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" +import torch +import torch.nn.functional as F +from torch import nn + + +def flatten_probas(input, target, labels, ignore=255): + """ + Flattens predictions in the batch. + """ + B, C, H, W = input.size() + input = input.permute(0, 2, 3, 1).contiguous().view(-1, C) # B * H * W, C = P, C + target = target.permute(0, 2, 3, 1).contiguous().view(-1, C) # B * H * W, C = P, C + labels = labels.view(-1) + if ignore is None: + return input, target + valid = (labels != ignore) + vinput = input[valid.nonzero().squeeze()] + vtarget = target[valid.nonzero().squeeze()] + return vinput, vtarget + + +class KLDivergenceLoss(nn.Module): + def __init__(self, ignore_index=255, T=1): + super(KLDivergenceLoss, self).__init__() + self.ignore_index=ignore_index + self.T = T + + def forward(self, input, target, label): + log_input_prob = F.log_softmax(input / self.T, dim=1) + target_porb = F.softmax(target / self.T, dim=1) + loss = F.kl_div(*flatten_probas(log_input_prob, target_porb, label, ignore=self.ignore_index)) + return self.T*self.T*loss # balanced diff --git a/preprocess/humanparsing/utils/lovasz_softmax.py b/preprocess/humanparsing/utils/lovasz_softmax.py new file mode 100644 index 0000000..b6e444f --- /dev/null +++ b/preprocess/humanparsing/utils/lovasz_softmax.py @@ -0,0 +1,279 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : lovasz_softmax.py +@Time : 8/30/19 7:12 PM +@Desc : Lovasz-Softmax and Jaccard hinge loss in PyTorch + Maxim Berman 2018 ESAT-PSI KU Leuven (MIT License) +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +from __future__ import print_function, division + +import torch +from torch.autograd import Variable +import torch.nn.functional as F +import numpy as np +from torch import nn + +try: + from itertools import ifilterfalse +except ImportError: # py3k + from itertools import filterfalse as ifilterfalse + + +def lovasz_grad(gt_sorted): + """ + Computes gradient of the Lovasz extension w.r.t sorted errors + See Alg. 1 in paper + """ + p = len(gt_sorted) + gts = gt_sorted.sum() + intersection = gts - gt_sorted.float().cumsum(0) + union = gts + (1 - gt_sorted).float().cumsum(0) + jaccard = 1. - intersection / union + if p > 1: # cover 1-pixel case + jaccard[1:p] = jaccard[1:p] - jaccard[0:-1] + return jaccard + + +def iou_binary(preds, labels, EMPTY=1., ignore=None, per_image=True): + """ + IoU for foreground class + binary: 1 foreground, 0 background + """ + if not per_image: + preds, labels = (preds,), (labels,) + ious = [] + for pred, label in zip(preds, labels): + intersection = ((label == 1) & (pred == 1)).sum() + union = ((label == 1) | ((pred == 1) & (label != ignore))).sum() + if not union: + iou = EMPTY + else: + iou = float(intersection) / float(union) + ious.append(iou) + iou = mean(ious) # mean accross images if per_image + return 100 * iou + + +def iou(preds, labels, C, EMPTY=1., ignore=None, per_image=False): + """ + Array of IoU for each (non ignored) class + """ + if not per_image: + preds, labels = (preds,), (labels,) + ious = [] + for pred, label in zip(preds, labels): + iou = [] + for i in range(C): + if i != ignore: # The ignored label is sometimes among predicted classes (ENet - CityScapes) + intersection = ((label == i) & (pred == i)).sum() + union = ((label == i) | ((pred == i) & (label != ignore))).sum() + if not union: + iou.append(EMPTY) + else: + iou.append(float(intersection) / float(union)) + ious.append(iou) + ious = [mean(iou) for iou in zip(*ious)] # mean accross images if per_image + return 100 * np.array(ious) + + +# --------------------------- BINARY LOSSES --------------------------- + + +def lovasz_hinge(logits, labels, per_image=True, ignore=None): + """ + Binary Lovasz hinge loss + logits: [B, H, W] Variable, logits at each pixel (between -\infty and +\infty) + labels: [B, H, W] Tensor, binary ground truth masks (0 or 1) + per_image: compute the loss per image instead of per batch + ignore: void class id + """ + if per_image: + loss = mean(lovasz_hinge_flat(*flatten_binary_scores(log.unsqueeze(0), lab.unsqueeze(0), ignore)) + for log, lab in zip(logits, labels)) + else: + loss = lovasz_hinge_flat(*flatten_binary_scores(logits, labels, ignore)) + return loss + + +def lovasz_hinge_flat(logits, labels): + """ + Binary Lovasz hinge loss + logits: [P] Variable, logits at each prediction (between -\infty and +\infty) + labels: [P] Tensor, binary ground truth labels (0 or 1) + ignore: label to ignore + """ + if len(labels) == 0: + # only void pixels, the gradients should be 0 + return logits.sum() * 0. + signs = 2. * labels.float() - 1. + errors = (1. - logits * Variable(signs)) + errors_sorted, perm = torch.sort(errors, dim=0, descending=True) + perm = perm.data + gt_sorted = labels[perm] + grad = lovasz_grad(gt_sorted) + loss = torch.dot(F.relu(errors_sorted), Variable(grad)) + return loss + + +def flatten_binary_scores(scores, labels, ignore=None): + """ + Flattens predictions in the batch (binary case) + Remove labels equal to 'ignore' + """ + scores = scores.view(-1) + labels = labels.view(-1) + if ignore is None: + return scores, labels + valid = (labels != ignore) + vscores = scores[valid] + vlabels = labels[valid] + return vscores, vlabels + + +class StableBCELoss(torch.nn.modules.Module): + def __init__(self): + super(StableBCELoss, self).__init__() + + def forward(self, input, target): + neg_abs = - input.abs() + loss = input.clamp(min=0) - input * target + (1 + neg_abs.exp()).log() + return loss.mean() + + +def binary_xloss(logits, labels, ignore=None): + """ + Binary Cross entropy loss + logits: [B, H, W] Variable, logits at each pixel (between -\infty and +\infty) + labels: [B, H, W] Tensor, binary ground truth masks (0 or 1) + ignore: void class id + """ + logits, labels = flatten_binary_scores(logits, labels, ignore) + loss = StableBCELoss()(logits, Variable(labels.float())) + return loss + + +# --------------------------- MULTICLASS LOSSES --------------------------- + + +def lovasz_softmax(probas, labels, classes='present', per_image=False, ignore=255, weighted=None): + """ + Multi-class Lovasz-Softmax loss + probas: [B, C, H, W] Variable, class probabilities at each prediction (between 0 and 1). + Interpreted as binary (sigmoid) output with outputs of size [B, H, W]. + labels: [B, H, W] Tensor, ground truth labels (between 0 and C - 1) + classes: 'all' for all, 'present' for classes present in labels, or a list of classes to average. + per_image: compute the loss per image instead of per batch + ignore: void class labels + """ + if per_image: + loss = mean(lovasz_softmax_flat(*flatten_probas(prob.unsqueeze(0), lab.unsqueeze(0), ignore), classes=classes, weighted=weighted) + for prob, lab in zip(probas, labels)) + else: + loss = lovasz_softmax_flat(*flatten_probas(probas, labels, ignore), classes=classes, weighted=weighted ) + return loss + + +def lovasz_softmax_flat(probas, labels, classes='present', weighted=None): + """ + Multi-class Lovasz-Softmax loss + probas: [P, C] Variable, class probabilities at each prediction (between 0 and 1) + labels: [P] Tensor, ground truth labels (between 0 and C - 1) + classes: 'all' for all, 'present' for classes present in labels, or a list of classes to average. + """ + if probas.numel() == 0: + # only void pixels, the gradients should be 0 + return probas * 0. + C = probas.size(1) + losses = [] + class_to_sum = list(range(C)) if classes in ['all', 'present'] else classes + for c in class_to_sum: + fg = (labels == c).float() # foreground for class c + if (classes is 'present' and fg.sum() == 0): + continue + if C == 1: + if len(classes) > 1: + raise ValueError('Sigmoid output possible only with 1 class') + class_pred = probas[:, 0] + else: + class_pred = probas[:, c] + errors = (Variable(fg) - class_pred).abs() + errors_sorted, perm = torch.sort(errors, 0, descending=True) + perm = perm.data + fg_sorted = fg[perm] + if weighted is not None: + losses.append(weighted[c]*torch.dot(errors_sorted, Variable(lovasz_grad(fg_sorted)))) + else: + losses.append(torch.dot(errors_sorted, Variable(lovasz_grad(fg_sorted)))) + return mean(losses) + + +def flatten_probas(probas, labels, ignore=None): + """ + Flattens predictions in the batch + """ + if probas.dim() == 3: + # assumes output of a sigmoid layer + B, H, W = probas.size() + probas = probas.view(B, 1, H, W) + B, C, H, W = probas.size() + probas = probas.permute(0, 2, 3, 1).contiguous().view(-1, C) # B * H * W, C = P, C + labels = labels.view(-1) + if ignore is None: + return probas, labels + valid = (labels != ignore) + vprobas = probas[valid.nonzero().squeeze()] + vlabels = labels[valid] + return vprobas, vlabels + + +def xloss(logits, labels, ignore=None): + """ + Cross entropy loss + """ + return F.cross_entropy(logits, Variable(labels), ignore_index=255) + + +# --------------------------- HELPER FUNCTIONS --------------------------- +def isnan(x): + return x != x + + +def mean(l, ignore_nan=False, empty=0): + """ + nanmean compatible with generators. + """ + l = iter(l) + if ignore_nan: + l = ifilterfalse(isnan, l) + try: + n = 1 + acc = next(l) + except StopIteration: + if empty == 'raise': + raise ValueError('Empty mean') + return empty + for n, v in enumerate(l, 2): + acc += v + if n == 1: + return acc + return acc / n + +# --------------------------- Class --------------------------- +class LovaszSoftmax(nn.Module): + def __init__(self, per_image=False, ignore_index=255, weighted=None): + super(LovaszSoftmax, self).__init__() + self.lovasz_softmax = lovasz_softmax + self.per_image = per_image + self.ignore_index=ignore_index + self.weighted = weighted + + def forward(self, pred, label): + pred = F.softmax(pred, dim=1) + return self.lovasz_softmax(pred, label, per_image=self.per_image, ignore=self.ignore_index, weighted=self.weighted) \ No newline at end of file diff --git a/preprocess/humanparsing/utils/miou.py b/preprocess/humanparsing/utils/miou.py new file mode 100644 index 0000000..51a2cc9 --- /dev/null +++ b/preprocess/humanparsing/utils/miou.py @@ -0,0 +1,155 @@ +import cv2 +import os +import numpy as np + +from collections import OrderedDict +from PIL import Image as PILImage +from utils.transforms import transform_parsing + +LABELS = ['Background', 'Hat', 'Hair', 'Glove', 'Sunglasses', 'Upper-clothes', 'Dress', 'Coat', \ + 'Socks', 'Pants', 'Jumpsuits', 'Scarf', 'Skirt', 'Face', 'Left-arm', 'Right-arm', 'Left-leg', + 'Right-leg', 'Left-shoe', 'Right-shoe'] + + +# LABELS = ['Background', 'Head', 'Torso', 'Upper Arms', 'Lower Arms', 'Upper Legs', 'Lower Legs'] + +def get_palette(num_cls): + """ Returns the color map for visualizing the segmentation mask. + Args: + num_cls: Number of classes + Returns: + The color map + """ + + n = num_cls + palette = [0] * (n * 3) + for j in range(0, n): + lab = j + palette[j * 3 + 0] = 0 + palette[j * 3 + 1] = 0 + palette[j * 3 + 2] = 0 + i = 0 + while lab: + palette[j * 3 + 0] |= (((lab >> 0) & 1) << (7 - i)) + palette[j * 3 + 1] |= (((lab >> 1) & 1) << (7 - i)) + palette[j * 3 + 2] |= (((lab >> 2) & 1) << (7 - i)) + i += 1 + lab >>= 3 + return palette + + +def get_confusion_matrix(gt_label, pred_label, num_classes): + """ + Calcute the confusion matrix by given label and pred + :param gt_label: the ground truth label + :param pred_label: the pred label + :param num_classes: the nunber of class + :return: the confusion matrix + """ + index = (gt_label * num_classes + pred_label).astype('int32') + label_count = np.bincount(index) + confusion_matrix = np.zeros((num_classes, num_classes)) + + for i_label in range(num_classes): + for i_pred_label in range(num_classes): + cur_index = i_label * num_classes + i_pred_label + if cur_index < len(label_count): + confusion_matrix[i_label, i_pred_label] = label_count[cur_index] + + return confusion_matrix + + +def compute_mean_ioU(preds, scales, centers, num_classes, datadir, input_size=[473, 473], dataset='val'): + val_file = os.path.join(datadir, dataset + '_id.txt') + val_id = [i_id.strip() for i_id in open(val_file)] + + confusion_matrix = np.zeros((num_classes, num_classes)) + + for i, pred_out in enumerate(preds): + im_name = val_id[i] + gt_path = os.path.join(datadir, dataset + '_segmentations', im_name + '.png') + gt = np.array(PILImage.open(gt_path)) + h, w = gt.shape + s = scales[i] + c = centers[i] + pred = transform_parsing(pred_out, c, s, w, h, input_size) + + gt = np.asarray(gt, dtype=np.int32) + pred = np.asarray(pred, dtype=np.int32) + + ignore_index = gt != 255 + + gt = gt[ignore_index] + pred = pred[ignore_index] + + confusion_matrix += get_confusion_matrix(gt, pred, num_classes) + + pos = confusion_matrix.sum(1) + res = confusion_matrix.sum(0) + tp = np.diag(confusion_matrix) + + pixel_accuracy = (tp.sum() / pos.sum()) * 100 + mean_accuracy = ((tp / np.maximum(1.0, pos)).mean()) * 100 + IoU_array = (tp / np.maximum(1.0, pos + res - tp)) + IoU_array = IoU_array * 100 + mean_IoU = IoU_array.mean() + print('Pixel accuracy: %f \n' % pixel_accuracy) + print('Mean accuracy: %f \n' % mean_accuracy) + print('Mean IU: %f \n' % mean_IoU) + name_value = [] + + for i, (label, iou) in enumerate(zip(LABELS, IoU_array)): + name_value.append((label, iou)) + + name_value.append(('Pixel accuracy', pixel_accuracy)) + name_value.append(('Mean accuracy', mean_accuracy)) + name_value.append(('Mean IU', mean_IoU)) + name_value = OrderedDict(name_value) + return name_value + + +def compute_mean_ioU_file(preds_dir, num_classes, datadir, dataset='val'): + list_path = os.path.join(datadir, dataset + '_id.txt') + val_id = [i_id.strip() for i_id in open(list_path)] + + confusion_matrix = np.zeros((num_classes, num_classes)) + + for i, im_name in enumerate(val_id): + gt_path = os.path.join(datadir, 'segmentations', im_name + '.png') + gt = cv2.imread(gt_path, cv2.IMREAD_GRAYSCALE) + + pred_path = os.path.join(preds_dir, im_name + '.png') + pred = np.asarray(PILImage.open(pred_path)) + + gt = np.asarray(gt, dtype=np.int32) + pred = np.asarray(pred, dtype=np.int32) + + ignore_index = gt != 255 + + gt = gt[ignore_index] + pred = pred[ignore_index] + + confusion_matrix += get_confusion_matrix(gt, pred, num_classes) + + pos = confusion_matrix.sum(1) + res = confusion_matrix.sum(0) + tp = np.diag(confusion_matrix) + + pixel_accuracy = (tp.sum() / pos.sum()) * 100 + mean_accuracy = ((tp / np.maximum(1.0, pos)).mean()) * 100 + IoU_array = (tp / np.maximum(1.0, pos + res - tp)) + IoU_array = IoU_array * 100 + mean_IoU = IoU_array.mean() + print('Pixel accuracy: %f \n' % pixel_accuracy) + print('Mean accuracy: %f \n' % mean_accuracy) + print('Mean IU: %f \n' % mean_IoU) + name_value = [] + + for i, (label, iou) in enumerate(zip(LABELS, IoU_array)): + name_value.append((label, iou)) + + name_value.append(('Pixel accuracy', pixel_accuracy)) + name_value.append(('Mean accuracy', mean_accuracy)) + name_value.append(('Mean IU', mean_IoU)) + name_value = OrderedDict(name_value) + return name_value diff --git a/preprocess/humanparsing/utils/schp.py b/preprocess/humanparsing/utils/schp.py new file mode 100644 index 0000000..f574704 --- /dev/null +++ b/preprocess/humanparsing/utils/schp.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : schp.py +@Time : 4/8/19 2:11 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import os +import torch +import modules + +def moving_average(net1, net2, alpha=1): + for param1, param2 in zip(net1.parameters(), net2.parameters()): + param1.data *= (1.0 - alpha) + param1.data += param2.data * alpha + + +def _check_bn(module, flag): + if issubclass(module.__class__, modules.bn.InPlaceABNSync): + flag[0] = True + + +def check_bn(model): + flag = [False] + model.apply(lambda module: _check_bn(module, flag)) + return flag[0] + + +def reset_bn(module): + if issubclass(module.__class__, modules.bn.InPlaceABNSync): + module.running_mean = torch.zeros_like(module.running_mean) + module.running_var = torch.ones_like(module.running_var) + + +def _get_momenta(module, momenta): + if issubclass(module.__class__, modules.bn.InPlaceABNSync): + momenta[module] = module.momentum + + +def _set_momenta(module, momenta): + if issubclass(module.__class__, modules.bn.InPlaceABNSync): + module.momentum = momenta[module] + + +def bn_re_estimate(loader, model): + if not check_bn(model): + print('No batch norm layer detected') + return + model.train() + momenta = {} + model.apply(reset_bn) + model.apply(lambda module: _get_momenta(module, momenta)) + n = 0 + for i_iter, batch in enumerate(loader): + images, labels, _ = batch + b = images.data.size(0) + momentum = b / (n + b) + for module in momenta.keys(): + module.momentum = momentum + model(images) + n += b + model.apply(lambda module: _set_momenta(module, momenta)) + + +def save_schp_checkpoint(states, is_best_parsing, output_dir, filename='schp_checkpoint.pth.tar'): + save_path = os.path.join(output_dir, filename) + if os.path.exists(save_path): + os.remove(save_path) + torch.save(states, save_path) + if is_best_parsing and 'state_dict' in states: + best_save_path = os.path.join(output_dir, 'model_parsing_best.pth.tar') + if os.path.exists(best_save_path): + os.remove(best_save_path) + torch.save(states, best_save_path) diff --git a/preprocess/humanparsing/utils/soft_dice_loss.py b/preprocess/humanparsing/utils/soft_dice_loss.py new file mode 100644 index 0000000..cb5895f --- /dev/null +++ b/preprocess/humanparsing/utils/soft_dice_loss.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : soft_dice_loss.py +@Time : 8/13/19 5:09 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +from __future__ import print_function, division + +import torch +import torch.nn.functional as F +from torch import nn + +try: + from itertools import ifilterfalse +except ImportError: # py3k + from itertools import filterfalse as ifilterfalse + + +def tversky_loss(probas, labels, alpha=0.5, beta=0.5, epsilon=1e-6): + ''' + Tversky loss function. + probas: [P, C] Variable, class probabilities at each prediction (between 0 and 1) + labels: [P] Tensor, ground truth labels (between 0 and C - 1) + + Same as soft dice loss when alpha=beta=0.5. + Same as Jaccord loss when alpha=beta=1.0. + See `Tversky loss function for image segmentation using 3D fully convolutional deep networks` + https://arxiv.org/pdf/1706.05721.pdf + ''' + C = probas.size(1) + losses = [] + for c in list(range(C)): + fg = (labels == c).float() + if fg.sum() == 0: + continue + class_pred = probas[:, c] + p0 = class_pred + p1 = 1 - class_pred + g0 = fg + g1 = 1 - fg + numerator = torch.sum(p0 * g0) + denominator = numerator + alpha * torch.sum(p0 * g1) + beta * torch.sum(p1 * g0) + losses.append(1 - ((numerator) / (denominator + epsilon))) + return mean(losses) + + +def flatten_probas(probas, labels, ignore=255): + """ + Flattens predictions in the batch + """ + B, C, H, W = probas.size() + probas = probas.permute(0, 2, 3, 1).contiguous().view(-1, C) # B * H * W, C = P, C + labels = labels.view(-1) + if ignore is None: + return probas, labels + valid = (labels != ignore) + vprobas = probas[valid.nonzero().squeeze()] + vlabels = labels[valid] + return vprobas, vlabels + + +def isnan(x): + return x != x + + +def mean(l, ignore_nan=False, empty=0): + """ + nanmean compatible with generators. + """ + l = iter(l) + if ignore_nan: + l = ifilterfalse(isnan, l) + try: + n = 1 + acc = next(l) + except StopIteration: + if empty == 'raise': + raise ValueError('Empty mean') + return empty + for n, v in enumerate(l, 2): + acc += v + if n == 1: + return acc + return acc / n + + +class SoftDiceLoss(nn.Module): + def __init__(self, ignore_index=255): + super(SoftDiceLoss, self).__init__() + self.ignore_index = ignore_index + + def forward(self, pred, label): + pred = F.softmax(pred, dim=1) + return tversky_loss(*flatten_probas(pred, label, ignore=self.ignore_index), alpha=0.5, beta=0.5) + + +class SoftJaccordLoss(nn.Module): + def __init__(self, ignore_index=255): + super(SoftJaccordLoss, self).__init__() + self.ignore_index = ignore_index + + def forward(self, pred, label): + pred = F.softmax(pred, dim=1) + return tversky_loss(*flatten_probas(pred, label, ignore=self.ignore_index), alpha=1.0, beta=1.0) diff --git a/preprocess/humanparsing/utils/transforms.py b/preprocess/humanparsing/utils/transforms.py new file mode 100644 index 0000000..1442a72 --- /dev/null +++ b/preprocess/humanparsing/utils/transforms.py @@ -0,0 +1,167 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Written by Bin Xiao (Bin.Xiao@microsoft.com) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import cv2 +import torch + +class BRG2Tensor_transform(object): + def __call__(self, pic): + img = torch.from_numpy(pic.transpose((2, 0, 1))) + if isinstance(img, torch.ByteTensor): + return img.float() + else: + return img + +class BGR2RGB_transform(object): + def __call__(self, tensor): + return tensor[[2,1,0],:,:] + +def flip_back(output_flipped, matched_parts): + ''' + ouput_flipped: numpy.ndarray(batch_size, num_joints, height, width) + ''' + assert output_flipped.ndim == 4,\ + 'output_flipped should be [batch_size, num_joints, height, width]' + + output_flipped = output_flipped[:, :, :, ::-1] + + for pair in matched_parts: + tmp = output_flipped[:, pair[0], :, :].copy() + output_flipped[:, pair[0], :, :] = output_flipped[:, pair[1], :, :] + output_flipped[:, pair[1], :, :] = tmp + + return output_flipped + + +def fliplr_joints(joints, joints_vis, width, matched_parts): + """ + flip coords + """ + # Flip horizontal + joints[:, 0] = width - joints[:, 0] - 1 + + # Change left-right parts + for pair in matched_parts: + joints[pair[0], :], joints[pair[1], :] = \ + joints[pair[1], :], joints[pair[0], :].copy() + joints_vis[pair[0], :], joints_vis[pair[1], :] = \ + joints_vis[pair[1], :], joints_vis[pair[0], :].copy() + + return joints*joints_vis, joints_vis + + +def transform_preds(coords, center, scale, input_size): + target_coords = np.zeros(coords.shape) + trans = get_affine_transform(center, scale, 0, input_size, inv=1) + for p in range(coords.shape[0]): + target_coords[p, 0:2] = affine_transform(coords[p, 0:2], trans) + return target_coords + +def transform_parsing(pred, center, scale, width, height, input_size): + + trans = get_affine_transform(center, scale, 0, input_size, inv=1) + target_pred = cv2.warpAffine( + pred, + trans, + (int(width), int(height)), #(int(width), int(height)), + flags=cv2.INTER_NEAREST, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(0)) + + return target_pred + +def transform_logits(logits, center, scale, width, height, input_size): + + trans = get_affine_transform(center, scale, 0, input_size, inv=1) + channel = logits.shape[2] + target_logits = [] + for i in range(channel): + target_logit = cv2.warpAffine( + logits[:,:,i], + trans, + (int(width), int(height)), #(int(width), int(height)), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=(0)) + target_logits.append(target_logit) + target_logits = np.stack(target_logits,axis=2) + + return target_logits + + +def get_affine_transform(center, + scale, + rot, + output_size, + shift=np.array([0, 0], dtype=np.float32), + inv=0): + if not isinstance(scale, np.ndarray) and not isinstance(scale, list): + print(scale) + scale = np.array([scale, scale]) + + scale_tmp = scale + + src_w = scale_tmp[0] + dst_w = output_size[1] + dst_h = output_size[0] + + rot_rad = np.pi * rot / 180 + src_dir = get_dir([0, src_w * -0.5], rot_rad) + dst_dir = np.array([0, (dst_w-1) * -0.5], np.float32) + + src = np.zeros((3, 2), dtype=np.float32) + dst = np.zeros((3, 2), dtype=np.float32) + src[0, :] = center + scale_tmp * shift + src[1, :] = center + src_dir + scale_tmp * shift + dst[0, :] = [(dst_w-1) * 0.5, (dst_h-1) * 0.5] + dst[1, :] = np.array([(dst_w-1) * 0.5, (dst_h-1) * 0.5]) + dst_dir + + src[2:, :] = get_3rd_point(src[0, :], src[1, :]) + dst[2:, :] = get_3rd_point(dst[0, :], dst[1, :]) + + if inv: + trans = cv2.getAffineTransform(np.float32(dst), np.float32(src)) + else: + trans = cv2.getAffineTransform(np.float32(src), np.float32(dst)) + + return trans + + +def affine_transform(pt, t): + new_pt = np.array([pt[0], pt[1], 1.]).T + new_pt = np.dot(t, new_pt) + return new_pt[:2] + + +def get_3rd_point(a, b): + direct = a - b + return b + np.array([-direct[1], direct[0]], dtype=np.float32) + + +def get_dir(src_point, rot_rad): + sn, cs = np.sin(rot_rad), np.cos(rot_rad) + + src_result = [0, 0] + src_result[0] = src_point[0] * cs - src_point[1] * sn + src_result[1] = src_point[0] * sn + src_point[1] * cs + + return src_result + + +def crop(img, center, scale, output_size, rot=0): + trans = get_affine_transform(center, scale, rot, output_size) + + dst_img = cv2.warpAffine(img, + trans, + (int(output_size[1]), int(output_size[0])), + flags=cv2.INTER_LINEAR) + + return dst_img diff --git a/preprocess/humanparsing/utils/warmup_scheduler.py b/preprocess/humanparsing/utils/warmup_scheduler.py new file mode 100644 index 0000000..2528a9c --- /dev/null +++ b/preprocess/humanparsing/utils/warmup_scheduler.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +""" +@Author : Peike Li +@Contact : peike.li@yahoo.com +@File : warmup_scheduler.py +@Time : 3/28/19 2:24 PM +@Desc : +@License : This source code is licensed under the license found in the + LICENSE file in the root directory of this source tree. +""" + +import math +from torch.optim.lr_scheduler import _LRScheduler + + +class GradualWarmupScheduler(_LRScheduler): + """ Gradually warm-up learning rate with cosine annealing in optimizer. + Proposed in 'Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour'. + """ + + def __init__(self, optimizer, total_epoch, eta_min=0, warmup_epoch=10, last_epoch=-1): + self.total_epoch = total_epoch + self.eta_min = eta_min + self.warmup_epoch = warmup_epoch + super(GradualWarmupScheduler, self).__init__(optimizer, last_epoch) + + def get_lr(self): + if self.last_epoch <= self.warmup_epoch: + return [self.eta_min + self.last_epoch*(base_lr - self.eta_min)/self.warmup_epoch for base_lr in self.base_lrs] + else: + return [self.eta_min + (base_lr-self.eta_min)*(1+math.cos(math.pi*(self.last_epoch-self.warmup_epoch)/(self.total_epoch-self.warmup_epoch))) / 2 for base_lr in self.base_lrs] + + +class SGDRScheduler(_LRScheduler): + """ Consine annealing with warm up and restarts. + Proposed in `SGDR: Stochastic Gradient Descent with Warm Restarts`. + """ + def __init__(self, optimizer, total_epoch=150, start_cyclical=100, cyclical_base_lr=7e-4, cyclical_epoch=10, eta_min=0, warmup_epoch=10, last_epoch=-1): + self.total_epoch = total_epoch + self.start_cyclical = start_cyclical + self.cyclical_epoch = cyclical_epoch + self.cyclical_base_lr = cyclical_base_lr + self.eta_min = eta_min + self.warmup_epoch = warmup_epoch + super(SGDRScheduler, self).__init__(optimizer, last_epoch) + + def get_lr(self): + if self.last_epoch < self.warmup_epoch: + return [self.eta_min + self.last_epoch*(base_lr - self.eta_min)/self.warmup_epoch for base_lr in self.base_lrs] + elif self.last_epoch < self.start_cyclical: + return [self.eta_min + (base_lr-self.eta_min)*(1+math.cos(math.pi*(self.last_epoch-self.warmup_epoch)/(self.start_cyclical-self.warmup_epoch))) / 2 for base_lr in self.base_lrs] + else: + return [self.eta_min + (self.cyclical_base_lr-self.eta_min)*(1+math.cos(math.pi* ((self.last_epoch-self.start_cyclical)% self.cyclical_epoch)/self.cyclical_epoch)) / 2 for base_lr in self.base_lrs] + + +if __name__ == '__main__': + import matplotlib.pyplot as plt + import torch + model = torch.nn.Linear(10, 2) + optimizer = torch.optim.SGD(params=model.parameters(), lr=7e-3, momentum=0.9, weight_decay=5e-4) + scheduler_warmup = SGDRScheduler(optimizer, total_epoch=150, eta_min=7e-5, warmup_epoch=10, start_cyclical=100, cyclical_base_lr=3.5e-3, cyclical_epoch=10) + lr = [] + for epoch in range(0,150): + scheduler_warmup.step(epoch) + lr.append(scheduler_warmup.get_lr()) + plt.style.use('ggplot') + plt.plot(list(range(0,150)), lr) + plt.show() + diff --git a/preprocess/openpose/annotator/openpose/LICENSE b/preprocess/openpose/annotator/openpose/LICENSE new file mode 100644 index 0000000..6f60b76 --- /dev/null +++ b/preprocess/openpose/annotator/openpose/LICENSE @@ -0,0 +1,108 @@ +OPENPOSE: MULTIPERSON KEYPOINT DETECTION +SOFTWARE LICENSE AGREEMENT +ACADEMIC OR NON-PROFIT ORGANIZATION NONCOMMERCIAL RESEARCH USE ONLY + +BY USING OR DOWNLOADING THE SOFTWARE, YOU ARE AGREEING TO THE TERMS OF THIS LICENSE AGREEMENT. IF YOU DO NOT AGREE WITH THESE TERMS, YOU MAY NOT USE OR DOWNLOAD THE SOFTWARE. + +This is a license agreement ("Agreement") between your academic institution or non-profit organization or self (called "Licensee" or "You" in this Agreement) and Carnegie Mellon University (called "Licensor" in this Agreement). All rights not specifically granted to you in this Agreement are reserved for Licensor. + +RESERVATION OF OWNERSHIP AND GRANT OF LICENSE: +Licensor retains exclusive ownership of any copy of the Software (as defined below) licensed under this Agreement and hereby grants to Licensee a personal, non-exclusive, +non-transferable license to use the Software for noncommercial research purposes, without the right to sublicense, pursuant to the terms and conditions of this Agreement. As used in this Agreement, the term "Software" means (i) the actual copy of all or any portion of code for program routines made accessible to Licensee by Licensor pursuant to this Agreement, inclusive of backups, updates, and/or merged copies permitted hereunder or subsequently supplied by Licensor, including all or any file structures, programming instructions, user interfaces and screen formats and sequences as well as any and all documentation and instructions related to it, and (ii) all or any derivatives and/or modifications created or made by You to any of the items specified in (i). + +CONFIDENTIALITY: Licensee acknowledges that the Software is proprietary to Licensor, and as such, Licensee agrees to receive all such materials in confidence and use the Software only in accordance with the terms of this Agreement. Licensee agrees to use reasonable effort to protect the Software from unauthorized use, reproduction, distribution, or publication. + +COPYRIGHT: The Software is owned by Licensor and is protected by United +States copyright laws and applicable international treaties and/or conventions. + +PERMITTED USES: The Software may be used for your own noncommercial internal research purposes. You understand and agree that Licensor is not obligated to implement any suggestions and/or feedback you might provide regarding the Software, but to the extent Licensor does so, you are not entitled to any compensation related thereto. + +DERIVATIVES: You may create derivatives of or make modifications to the Software, however, You agree that all and any such derivatives and modifications will be owned by Licensor and become a part of the Software licensed to You under this Agreement. You may only use such derivatives and modifications for your own noncommercial internal research purposes, and you may not otherwise use, distribute or copy such derivatives and modifications in violation of this Agreement. + +BACKUPS: If Licensee is an organization, it may make that number of copies of the Software necessary for internal noncommercial use at a single site within its organization provided that all information appearing in or on the original labels, including the copyright and trademark notices are copied onto the labels of the copies. + +USES NOT PERMITTED: You may not distribute, copy or use the Software except as explicitly permitted herein. Licensee has not been granted any trademark license as part of this Agreement and may not use the name or mark “OpenPose", "Carnegie Mellon" or any renditions thereof without the prior written permission of Licensor. + +You may not sell, rent, lease, sublicense, lend, time-share or transfer, in whole or in part, or provide third parties access to prior or present versions (or any parts thereof) of the Software. + +ASSIGNMENT: You may not assign this Agreement or your rights hereunder without the prior written consent of Licensor. Any attempted assignment without such consent shall be null and void. + +TERM: The term of the license granted by this Agreement is from Licensee's acceptance of this Agreement by downloading the Software or by using the Software until terminated as provided below. + +The Agreement automatically terminates without notice if you fail to comply with any provision of this Agreement. Licensee may terminate this Agreement by ceasing using the Software. Upon any termination of this Agreement, Licensee will delete any and all copies of the Software. You agree that all provisions which operate to protect the proprietary rights of Licensor shall remain in force should breach occur and that the obligation of confidentiality described in this Agreement is binding in perpetuity and, as such, survives the term of the Agreement. + +FEE: Provided Licensee abides completely by the terms and conditions of this Agreement, there is no fee due to Licensor for Licensee's use of the Software in accordance with this Agreement. + +DISCLAIMER OF WARRANTIES: THE SOFTWARE IS PROVIDED "AS-IS" WITHOUT WARRANTY OF ANY KIND INCLUDING ANY WARRANTIES OF PERFORMANCE OR MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE OR PURPOSE OR OF NON-INFRINGEMENT. LICENSEE BEARS ALL RISK RELATING TO QUALITY AND PERFORMANCE OF THE SOFTWARE AND RELATED MATERIALS. + +SUPPORT AND MAINTENANCE: No Software support or training by the Licensor is provided as part of this Agreement. + +EXCLUSIVE REMEDY AND LIMITATION OF LIABILITY: To the maximum extent permitted under applicable law, Licensor shall not be liable for direct, indirect, special, incidental, or consequential damages or lost profits related to Licensee's use of and/or inability to use the Software, even if Licensor is advised of the possibility of such damage. + +EXPORT REGULATION: Licensee agrees to comply with any and all applicable +U.S. export control laws, regulations, and/or other laws related to embargoes and sanction programs administered by the Office of Foreign Assets Control. + +SEVERABILITY: If any provision(s) of this Agreement shall be held to be invalid, illegal, or unenforceable by a court or other tribunal of competent jurisdiction, the validity, legality and enforceability of the remaining provisions shall not in any way be affected or impaired thereby. + +NO IMPLIED WAIVERS: No failure or delay by Licensor in enforcing any right or remedy under this Agreement shall be construed as a waiver of any future or other exercise of such right or remedy by Licensor. + +GOVERNING LAW: This Agreement shall be construed and enforced in accordance with the laws of the Commonwealth of Pennsylvania without reference to conflict of laws principles. You consent to the personal jurisdiction of the courts of this County and waive their rights to venue outside of Allegheny County, Pennsylvania. + +ENTIRE AGREEMENT AND AMENDMENTS: This Agreement constitutes the sole and entire agreement between Licensee and Licensor as to the matter set forth herein and supersedes any previous agreements, understandings, and arrangements between the parties relating hereto. + + + +************************************************************************ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION + +This project incorporates material from the project(s) listed below (collectively, "Third Party Code"). This Third Party Code is licensed to you under their original license terms set forth below. We reserves all other rights not expressly granted, whether by implication, estoppel or otherwise. + +1. Caffe, version 1.0.0, (https://github.com/BVLC/caffe/) + +COPYRIGHT + +All contributions by the University of California: +Copyright (c) 2014-2017 The Regents of the University of California (Regents) +All rights reserved. + +All other contributions: +Copyright (c) 2014-2017, the respective contributors +All rights reserved. + +Caffe uses a shared copyright model: each contributor holds copyright over +their contributions to Caffe. The project versioning records all such +contribution and copyright details. If a contributor wants to further mark +their specific copyright on a particular contribution, they should indicate +their copyright solely in the commit message of the change when it is +committed. + +LICENSE + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +CONTRIBUTION AGREEMENT + +By contributing to the BVLC/caffe repository through pull-request, comment, +or otherwise, the contributor releases their content to the +license and copyright terms herein. + +************END OF THIRD-PARTY SOFTWARE NOTICES AND INFORMATION********** \ No newline at end of file diff --git a/preprocess/openpose/annotator/openpose/__init__.py b/preprocess/openpose/annotator/openpose/__init__.py new file mode 100644 index 0000000..cf6a81d --- /dev/null +++ b/preprocess/openpose/annotator/openpose/__init__.py @@ -0,0 +1,102 @@ +# Openpose +# Original from CMU https://github.com/CMU-Perceptual-Computing-Lab/openpose +# 2nd Edited by https://github.com/Hzzone/pytorch-openpose +# 3rd Edited by ControlNet +# 4th Edited by ControlNet (added face and correct hands) + +import os +import pdb + +os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" + +import torch +import numpy as np +from . import util +from .body import Body +from .hand import Hand +from .face import Face +from annotator.util import annotator_ckpts_path + +body_model_path = "https://huggingface.co/lllyasviel/Annotators/resolve/main/body_pose_model.pth" +hand_model_path = "https://huggingface.co/lllyasviel/Annotators/resolve/main/hand_pose_model.pth" +face_model_path = "https://huggingface.co/lllyasviel/Annotators/resolve/main/facenet.pth" + + +def draw_pose(pose, H, W, draw_body=True, draw_hand=True, draw_face=True): + bodies = pose['bodies'] + faces = pose['faces'] + hands = pose['hands'] + candidate = bodies['candidate'] + subset = bodies['subset'] + canvas = np.zeros(shape=(H, W, 3), dtype=np.uint8) + + if draw_body: + canvas = util.draw_bodypose(canvas, candidate, subset) + + if draw_hand: + canvas = util.draw_handpose(canvas, hands) + + if draw_face: + canvas = util.draw_facepose(canvas, faces) + + return canvas + + +class OpenposeDetector: + def __init__(self): + body_modelpath = os.path.join(annotator_ckpts_path, "body_pose_model.pth") + # hand_modelpath = os.path.join(annotator_ckpts_path, "hand_pose_model.pth") + # face_modelpath = os.path.join(annotator_ckpts_path, "facenet.pth") + + if not os.path.exists(body_modelpath): + from basicsr.utils.download_util import load_file_from_url + load_file_from_url(body_model_path, model_dir=annotator_ckpts_path) + + # if not os.path.exists(hand_modelpath): + # from basicsr.utils.download_util import load_file_from_url + # load_file_from_url(hand_model_path, model_dir=annotator_ckpts_path) + + # if not os.path.exists(face_modelpath): + # from basicsr.utils.download_util import load_file_from_url + # load_file_from_url(face_model_path, model_dir=annotator_ckpts_path) + + self.body_estimation = Body(body_modelpath) + # self.hand_estimation = Hand(hand_modelpath) + # self.face_estimation = Face(face_modelpath) + + + def __call__(self, oriImg, hand_and_face=False, return_is_index=False): + oriImg = oriImg[:, :, ::-1].copy() + H, W, C = oriImg.shape + with torch.no_grad(): + candidate, subset = self.body_estimation(oriImg) + hands = [] + faces = [] + if hand_and_face: + # Hand + hands_list = util.handDetect(candidate, subset, oriImg) + for x, y, w, is_left in hands_list: + peaks = self.hand_estimation(oriImg[y:y + w, x:x + w, :]).astype(np.float32) + if peaks.ndim == 2 and peaks.shape[1] == 2: + peaks[:, 0] = np.where(peaks[:, 0] < 1e-6, -1, peaks[:, 0] + x) / float(W) + peaks[:, 1] = np.where(peaks[:, 1] < 1e-6, -1, peaks[:, 1] + y) / float(H) + hands.append(peaks.tolist()) + # Face + faces_list = util.faceDetect(candidate, subset, oriImg) + for x, y, w in faces_list: + heatmaps = self.face_estimation(oriImg[y:y + w, x:x + w, :]) + peaks = self.face_estimation.compute_peaks_from_heatmaps(heatmaps).astype(np.float32) + if peaks.ndim == 2 and peaks.shape[1] == 2: + peaks[:, 0] = np.where(peaks[:, 0] < 1e-6, -1, peaks[:, 0] + x) / float(W) + peaks[:, 1] = np.where(peaks[:, 1] < 1e-6, -1, peaks[:, 1] + y) / float(H) + faces.append(peaks.tolist()) + if candidate.ndim == 2 and candidate.shape[1] == 4: + candidate = candidate[:, :2] + candidate[:, 0] /= float(W) + candidate[:, 1] /= float(H) + bodies = dict(candidate=candidate.tolist(), subset=subset.tolist()) + pose = dict(bodies=bodies, hands=hands, faces=faces) + if return_is_index: + return pose + else: + return pose, draw_pose(pose, H, W) diff --git a/preprocess/openpose/annotator/openpose/__pycache__/__init__.cpython-311.pyc b/preprocess/openpose/annotator/openpose/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..513649cc191f427cd2bcb42b9727a35f31c8164c GIT binary patch literal 6424 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 literal 0 HcmV?d00001 diff --git a/preprocess/openpose/annotator/openpose/__pycache__/body.cpython-311.pyc b/preprocess/openpose/annotator/openpose/__pycache__/body.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4827f3db0192e40d129def6904b3e0fc4db3cfc2 GIT binary patch literal 17468 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 literal 0 HcmV?d00001 diff --git a/preprocess/openpose/annotator/openpose/__pycache__/face.cpython-311.pyc b/preprocess/openpose/annotator/openpose/__pycache__/face.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84444ef4b84ded8740853af6838b8bbd898d707f GIT binary patch literal 19773 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 literal 0 HcmV?d00001 diff --git a/preprocess/openpose/annotator/openpose/__pycache__/hand.cpython-311.pyc b/preprocess/openpose/annotator/openpose/__pycache__/hand.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..399ba3afa127b1421eb5cc61894e5606cce2ed58 GIT binary patch literal 6780 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 map_left, one_heatmap >= map_right, one_heatmap >= map_up, one_heatmap >= map_down, + one_heatmap > thre1)) + peaks = list(zip(np.nonzero(peaks_binary)[1], np.nonzero(peaks_binary)[0])) # note reverse + peaks_with_score = [x + (map_ori[x[1], x[0]],) for x in peaks] + peak_id = range(peak_counter, peak_counter + len(peaks)) + peaks_with_score_and_id = [peaks_with_score[i] + (peak_id[i],) for i in range(len(peak_id))] + + all_peaks.append(peaks_with_score_and_id) + peak_counter += len(peaks) + + # find connection in the specified sequence, center 29 is in the position 15 + limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], \ + [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], \ + [1, 16], [16, 18], [3, 17], [6, 18]] + # the middle joints heatmap correpondence + mapIdx = [[31, 32], [39, 40], [33, 34], [35, 36], [41, 42], [43, 44], [19, 20], [21, 22], \ + [23, 24], [25, 26], [27, 28], [29, 30], [47, 48], [49, 50], [53, 54], [51, 52], \ + [55, 56], [37, 38], [45, 46]] + + connection_all = [] + special_k = [] + mid_num = 10 + + for k in range(len(mapIdx)): + score_mid = paf_avg[:, :, [x - 19 for x in mapIdx[k]]] + candA = all_peaks[limbSeq[k][0] - 1] + candB = all_peaks[limbSeq[k][1] - 1] + nA = len(candA) + nB = len(candB) + indexA, indexB = limbSeq[k] + if (nA != 0 and nB != 0): + connection_candidate = [] + for i in range(nA): + for j in range(nB): + vec = np.subtract(candB[j][:2], candA[i][:2]) + norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1]) + norm = max(0.001, norm) + vec = np.divide(vec, norm) + + startend = list(zip(np.linspace(candA[i][0], candB[j][0], num=mid_num), \ + np.linspace(candA[i][1], candB[j][1], num=mid_num))) + + vec_x = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 0] \ + for I in range(len(startend))]) + vec_y = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 1] \ + for I in range(len(startend))]) + + score_midpts = np.multiply(vec_x, vec[0]) + np.multiply(vec_y, vec[1]) + score_with_dist_prior = sum(score_midpts) / len(score_midpts) + min( + 0.5 * oriImg.shape[0] / norm - 1, 0) + criterion1 = len(np.nonzero(score_midpts > thre2)[0]) > 0.8 * len(score_midpts) + criterion2 = score_with_dist_prior > 0 + if criterion1 and criterion2: + connection_candidate.append( + [i, j, score_with_dist_prior, score_with_dist_prior + candA[i][2] + candB[j][2]]) + + connection_candidate = sorted(connection_candidate, key=lambda x: x[2], reverse=True) + connection = np.zeros((0, 5)) + for c in range(len(connection_candidate)): + i, j, s = connection_candidate[c][0:3] + if (i not in connection[:, 3] and j not in connection[:, 4]): + connection = np.vstack([connection, [candA[i][3], candB[j][3], s, i, j]]) + if (len(connection) >= min(nA, nB)): + break + + connection_all.append(connection) + else: + special_k.append(k) + connection_all.append([]) + + # last number in each row is the total parts number of that person + # the second last number in each row is the score of the overall configuration + subset = -1 * np.ones((0, 20)) + candidate = np.array([item for sublist in all_peaks for item in sublist]) + + for k in range(len(mapIdx)): + if k not in special_k: + partAs = connection_all[k][:, 0] + partBs = connection_all[k][:, 1] + indexA, indexB = np.array(limbSeq[k]) - 1 + + for i in range(len(connection_all[k])): # = 1:size(temp,1) + found = 0 + subset_idx = [-1, -1] + for j in range(len(subset)): # 1:size(subset,1): + if subset[j][indexA] == partAs[i] or subset[j][indexB] == partBs[i]: + subset_idx[found] = j + found += 1 + + if found == 1: + j = subset_idx[0] + if subset[j][indexB] != partBs[i]: + subset[j][indexB] = partBs[i] + subset[j][-1] += 1 + subset[j][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2] + elif found == 2: # if found 2 and disjoint, merge them + j1, j2 = subset_idx + membership = ((subset[j1] >= 0).astype(int) + (subset[j2] >= 0).astype(int))[:-2] + if len(np.nonzero(membership == 2)[0]) == 0: # merge + subset[j1][:-2] += (subset[j2][:-2] + 1) + subset[j1][-2:] += subset[j2][-2:] + subset[j1][-2] += connection_all[k][i][2] + subset = np.delete(subset, j2, 0) + else: # as like found == 1 + subset[j1][indexB] = partBs[i] + subset[j1][-1] += 1 + subset[j1][-2] += candidate[partBs[i].astype(int), 2] + connection_all[k][i][2] + + # if find no partA in the subset, create a new subset + elif not found and k < 17: + row = -1 * np.ones(20) + row[indexA] = partAs[i] + row[indexB] = partBs[i] + row[-1] = 2 + row[-2] = sum(candidate[connection_all[k][i, :2].astype(int), 2]) + connection_all[k][i][2] + subset = np.vstack([subset, row]) + # delete some rows of subset which has few parts occur + deleteIdx = [] + for i in range(len(subset)): + if subset[i][-1] < 4 or subset[i][-2] / subset[i][-1] < 0.4: + deleteIdx.append(i) + subset = np.delete(subset, deleteIdx, axis=0) + + # subset: n*20 array, 0-17 is the index in candidate, 18 is the total score, 19 is the total parts + # candidate: x, y, score, id + return candidate, subset + + +# if __name__ == "__main__": +# body_estimation = Body('../model/body_pose_model.pth') + +# test_image = '../images/ski.jpg' +# oriImg = cv2.imread(test_image) # B,G,R order +# candidate, subset = body_estimation(oriImg) +# canvas = util.draw_bodypose(oriImg, candidate, subset) +# plt.imshow(canvas[:, :, [2, 1, 0]]) +# plt.show() diff --git a/preprocess/openpose/annotator/openpose/face.py b/preprocess/openpose/annotator/openpose/face.py new file mode 100644 index 0000000..8cf6241 --- /dev/null +++ b/preprocess/openpose/annotator/openpose/face.py @@ -0,0 +1,368 @@ +import logging +import numpy as np +from torchvision.transforms import ToTensor, ToPILImage +import torch +import torch.nn.functional as F +import cv2 + +from . import util +from torch.nn import Conv2d, Module, ReLU, MaxPool2d, init + + +class FaceNet(Module): + """Model the cascading heatmaps. """ + def __init__(self): + super(FaceNet, self).__init__() + # cnn to make feature map + self.relu = ReLU() + self.max_pooling_2d = MaxPool2d(kernel_size=2, stride=2) + self.conv1_1 = Conv2d(in_channels=3, out_channels=64, + kernel_size=3, stride=1, padding=1) + self.conv1_2 = Conv2d( + in_channels=64, out_channels=64, kernel_size=3, stride=1, + padding=1) + self.conv2_1 = Conv2d( + in_channels=64, out_channels=128, kernel_size=3, stride=1, + padding=1) + self.conv2_2 = Conv2d( + in_channels=128, out_channels=128, kernel_size=3, stride=1, + padding=1) + self.conv3_1 = Conv2d( + in_channels=128, out_channels=256, kernel_size=3, stride=1, + padding=1) + self.conv3_2 = Conv2d( + in_channels=256, out_channels=256, kernel_size=3, stride=1, + padding=1) + self.conv3_3 = Conv2d( + in_channels=256, out_channels=256, kernel_size=3, stride=1, + padding=1) + self.conv3_4 = Conv2d( + in_channels=256, out_channels=256, kernel_size=3, stride=1, + padding=1) + self.conv4_1 = Conv2d( + in_channels=256, out_channels=512, kernel_size=3, stride=1, + padding=1) + self.conv4_2 = Conv2d( + in_channels=512, out_channels=512, kernel_size=3, stride=1, + padding=1) + self.conv4_3 = Conv2d( + in_channels=512, out_channels=512, kernel_size=3, stride=1, + padding=1) + self.conv4_4 = Conv2d( + in_channels=512, out_channels=512, kernel_size=3, stride=1, + padding=1) + self.conv5_1 = Conv2d( + in_channels=512, out_channels=512, kernel_size=3, stride=1, + padding=1) + self.conv5_2 = Conv2d( + in_channels=512, out_channels=512, kernel_size=3, stride=1, + padding=1) + self.conv5_3_CPM = Conv2d( + in_channels=512, out_channels=128, kernel_size=3, stride=1, + padding=1) + + # stage1 + self.conv6_1_CPM = Conv2d( + in_channels=128, out_channels=512, kernel_size=1, stride=1, + padding=0) + self.conv6_2_CPM = Conv2d( + in_channels=512, out_channels=71, kernel_size=1, stride=1, + padding=0) + + # stage2 + self.Mconv1_stage2 = Conv2d( + in_channels=199, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv2_stage2 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv3_stage2 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv4_stage2 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv5_stage2 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv6_stage2 = Conv2d( + in_channels=128, out_channels=128, kernel_size=1, stride=1, + padding=0) + self.Mconv7_stage2 = Conv2d( + in_channels=128, out_channels=71, kernel_size=1, stride=1, + padding=0) + + # stage3 + self.Mconv1_stage3 = Conv2d( + in_channels=199, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv2_stage3 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv3_stage3 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv4_stage3 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv5_stage3 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv6_stage3 = Conv2d( + in_channels=128, out_channels=128, kernel_size=1, stride=1, + padding=0) + self.Mconv7_stage3 = Conv2d( + in_channels=128, out_channels=71, kernel_size=1, stride=1, + padding=0) + + # stage4 + self.Mconv1_stage4 = Conv2d( + in_channels=199, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv2_stage4 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv3_stage4 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv4_stage4 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv5_stage4 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv6_stage4 = Conv2d( + in_channels=128, out_channels=128, kernel_size=1, stride=1, + padding=0) + self.Mconv7_stage4 = Conv2d( + in_channels=128, out_channels=71, kernel_size=1, stride=1, + padding=0) + + # stage5 + self.Mconv1_stage5 = Conv2d( + in_channels=199, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv2_stage5 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv3_stage5 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv4_stage5 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv5_stage5 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv6_stage5 = Conv2d( + in_channels=128, out_channels=128, kernel_size=1, stride=1, + padding=0) + self.Mconv7_stage5 = Conv2d( + in_channels=128, out_channels=71, kernel_size=1, stride=1, + padding=0) + + # stage6 + self.Mconv1_stage6 = Conv2d( + in_channels=199, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv2_stage6 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv3_stage6 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv4_stage6 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv5_stage6 = Conv2d( + in_channels=128, out_channels=128, kernel_size=7, stride=1, + padding=3) + self.Mconv6_stage6 = Conv2d( + in_channels=128, out_channels=128, kernel_size=1, stride=1, + padding=0) + self.Mconv7_stage6 = Conv2d( + in_channels=128, out_channels=71, kernel_size=1, stride=1, + padding=0) + + for m in self.modules(): + if isinstance(m, Conv2d): + init.constant_(m.bias, 0) + + def forward(self, x): + """Return a list of heatmaps.""" + heatmaps = [] + + h = self.relu(self.conv1_1(x)) + h = self.relu(self.conv1_2(h)) + h = self.max_pooling_2d(h) + h = self.relu(self.conv2_1(h)) + h = self.relu(self.conv2_2(h)) + h = self.max_pooling_2d(h) + h = self.relu(self.conv3_1(h)) + h = self.relu(self.conv3_2(h)) + h = self.relu(self.conv3_3(h)) + h = self.relu(self.conv3_4(h)) + h = self.max_pooling_2d(h) + h = self.relu(self.conv4_1(h)) + h = self.relu(self.conv4_2(h)) + h = self.relu(self.conv4_3(h)) + h = self.relu(self.conv4_4(h)) + h = self.relu(self.conv5_1(h)) + h = self.relu(self.conv5_2(h)) + h = self.relu(self.conv5_3_CPM(h)) + feature_map = h + + # stage1 + h = self.relu(self.conv6_1_CPM(h)) + h = self.conv6_2_CPM(h) + heatmaps.append(h) + + # stage2 + h = torch.cat([h, feature_map], dim=1) # channel concat + h = self.relu(self.Mconv1_stage2(h)) + h = self.relu(self.Mconv2_stage2(h)) + h = self.relu(self.Mconv3_stage2(h)) + h = self.relu(self.Mconv4_stage2(h)) + h = self.relu(self.Mconv5_stage2(h)) + h = self.relu(self.Mconv6_stage2(h)) + h = self.Mconv7_stage2(h) + heatmaps.append(h) + + # stage3 + h = torch.cat([h, feature_map], dim=1) # channel concat + h = self.relu(self.Mconv1_stage3(h)) + h = self.relu(self.Mconv2_stage3(h)) + h = self.relu(self.Mconv3_stage3(h)) + h = self.relu(self.Mconv4_stage3(h)) + h = self.relu(self.Mconv5_stage3(h)) + h = self.relu(self.Mconv6_stage3(h)) + h = self.Mconv7_stage3(h) + heatmaps.append(h) + + # stage4 + h = torch.cat([h, feature_map], dim=1) # channel concat + h = self.relu(self.Mconv1_stage4(h)) + h = self.relu(self.Mconv2_stage4(h)) + h = self.relu(self.Mconv3_stage4(h)) + h = self.relu(self.Mconv4_stage4(h)) + h = self.relu(self.Mconv5_stage4(h)) + h = self.relu(self.Mconv6_stage4(h)) + h = self.Mconv7_stage4(h) + heatmaps.append(h) + + # stage5 + h = torch.cat([h, feature_map], dim=1) # channel concat + h = self.relu(self.Mconv1_stage5(h)) + h = self.relu(self.Mconv2_stage5(h)) + h = self.relu(self.Mconv3_stage5(h)) + h = self.relu(self.Mconv4_stage5(h)) + h = self.relu(self.Mconv5_stage5(h)) + h = self.relu(self.Mconv6_stage5(h)) + h = self.Mconv7_stage5(h) + heatmaps.append(h) + + # stage6 + h = torch.cat([h, feature_map], dim=1) # channel concat + h = self.relu(self.Mconv1_stage6(h)) + h = self.relu(self.Mconv2_stage6(h)) + h = self.relu(self.Mconv3_stage6(h)) + h = self.relu(self.Mconv4_stage6(h)) + h = self.relu(self.Mconv5_stage6(h)) + h = self.relu(self.Mconv6_stage6(h)) + h = self.Mconv7_stage6(h) + heatmaps.append(h) + + return heatmaps + + +LOG = logging.getLogger(__name__) +TOTEN = ToTensor() +TOPIL = ToPILImage() + + +params = { + 'gaussian_sigma': 2.5, + 'inference_img_size': 736, # 368, 736, 1312 + 'heatmap_peak_thresh': 0.1, + 'crop_scale': 1.5, + 'line_indices': [ + [0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], + [6, 7], [7, 8], [8, 9], [9, 10], [10, 11], [11, 12], [12, 13], + [13, 14], [14, 15], [15, 16], + [17, 18], [18, 19], [19, 20], [20, 21], + [22, 23], [23, 24], [24, 25], [25, 26], + [27, 28], [28, 29], [29, 30], + [31, 32], [32, 33], [33, 34], [34, 35], + [36, 37], [37, 38], [38, 39], [39, 40], [40, 41], [41, 36], + [42, 43], [43, 44], [44, 45], [45, 46], [46, 47], [47, 42], + [48, 49], [49, 50], [50, 51], [51, 52], [52, 53], [53, 54], + [54, 55], [55, 56], [56, 57], [57, 58], [58, 59], [59, 48], + [60, 61], [61, 62], [62, 63], [63, 64], [64, 65], [65, 66], + [66, 67], [67, 60] + ], +} + + +class Face(object): + """ + The OpenPose face landmark detector model. + + Args: + inference_size: set the size of the inference image size, suggested: + 368, 736, 1312, default 736 + gaussian_sigma: blur the heatmaps, default 2.5 + heatmap_peak_thresh: return landmark if over threshold, default 0.1 + + """ + def __init__(self, face_model_path, + inference_size=None, + gaussian_sigma=None, + heatmap_peak_thresh=None): + self.inference_size = inference_size or params["inference_img_size"] + self.sigma = gaussian_sigma or params['gaussian_sigma'] + self.threshold = heatmap_peak_thresh or params["heatmap_peak_thresh"] + self.model = FaceNet() + self.model.load_state_dict(torch.load(face_model_path)) + if torch.cuda.is_available(): + self.model = self.model.cuda() + print('cuda') + self.model.eval() + + def __call__(self, face_img): + H, W, C = face_img.shape + + w_size = 384 + x_data = torch.from_numpy(util.smart_resize(face_img, (w_size, w_size))).permute([2, 0, 1]) / 256.0 - 0.5 + + if torch.cuda.is_available(): + x_data = x_data.cuda() + + with torch.no_grad(): + hs = self.model(x_data[None, ...]) + + # output_path = "/home/aigc/ProjectVTON/WebDemo/onnx_models/face_estimation.onnx" + # torch.onnx.export(self.model, x_data[None, ...], output_path, export_params=True, + # opset_version=11, + # do_constant_folding=True) + heatmaps = F.interpolate( + hs[-1], + (H, W), + mode='bilinear', align_corners=True).cpu().numpy()[0] + return heatmaps + + def compute_peaks_from_heatmaps(self, heatmaps): + all_peaks = [] + for part in range(heatmaps.shape[0]): + map_ori = heatmaps[part].copy() + binary = np.ascontiguousarray(map_ori > 0.05, dtype=np.uint8) + + if np.sum(binary) == 0: + continue + + positions = np.where(binary > 0.5) + intensities = map_ori[positions] + mi = np.argmax(intensities) + y, x = positions[0][mi], positions[1][mi] + all_peaks.append([x, y]) + + return np.array(all_peaks) diff --git a/preprocess/openpose/annotator/openpose/hand.py b/preprocess/openpose/annotator/openpose/hand.py new file mode 100644 index 0000000..eefe0af --- /dev/null +++ b/preprocess/openpose/annotator/openpose/hand.py @@ -0,0 +1,98 @@ +import cv2 +import json +import numpy as np +import math +import time +from scipy.ndimage.filters import gaussian_filter +import matplotlib.pyplot as plt +import matplotlib +import torch +from skimage.measure import label + +from .model import handpose_model +from . import util + +class Hand(object): + def __init__(self, model_path): + self.model = handpose_model() + if torch.cuda.is_available(): + self.model = self.model.cuda() + print('cuda') + model_dict = util.transfer(self.model, torch.load(model_path)) + self.model.load_state_dict(model_dict) + self.model.eval() + + def __call__(self, oriImgRaw): + scale_search = [0.5, 1.0, 1.5, 2.0] + # scale_search = [0.5] + boxsize = 368 + stride = 8 + padValue = 128 + thre = 0.05 + multiplier = [x * boxsize for x in scale_search] + + wsize = 128 + heatmap_avg = np.zeros((wsize, wsize, 22)) + + Hr, Wr, Cr = oriImgRaw.shape + + oriImg = cv2.GaussianBlur(oriImgRaw, (0, 0), 0.8) + + for m in range(len(multiplier)): + scale = multiplier[m] + imageToTest = util.smart_resize(oriImg, (scale, scale)) + + imageToTest_padded, pad = util.padRightDownCorner(imageToTest, stride, padValue) + im = np.transpose(np.float32(imageToTest_padded[:, :, :, np.newaxis]), (3, 2, 0, 1)) / 256 - 0.5 + im = np.ascontiguousarray(im) + + data = torch.from_numpy(im).float() + if torch.cuda.is_available(): + data = data.cuda() + + with torch.no_grad(): + output = self.model(data).cpu().numpy() + + # output_path = "/home/aigc/ProjectVTON/WebDemo/onnx_models/hand_estimation.onnx" + # torch.onnx.export(self.model, data, output_path, export_params=True, + # opset_version=11, + # do_constant_folding=True) + + # extract outputs, resize, and remove padding + heatmap = np.transpose(np.squeeze(output), (1, 2, 0)) # output 1 is heatmaps + heatmap = util.smart_resize_k(heatmap, fx=stride, fy=stride) + heatmap = heatmap[:imageToTest_padded.shape[0] - pad[2], :imageToTest_padded.shape[1] - pad[3], :] + heatmap = util.smart_resize(heatmap, (wsize, wsize)) + + heatmap_avg += heatmap / len(multiplier) + + all_peaks = [] + for part in range(21): + map_ori = heatmap_avg[:, :, part] + one_heatmap = gaussian_filter(map_ori, sigma=3) + binary = np.ascontiguousarray(one_heatmap > thre, dtype=np.uint8) + + if np.sum(binary) == 0: + all_peaks.append([0, 0]) + continue + label_img, label_numbers = label(binary, return_num=True, connectivity=binary.ndim) + max_index = np.argmax([np.sum(map_ori[label_img == i]) for i in range(1, label_numbers + 1)]) + 1 + label_img[label_img != max_index] = 0 + map_ori[label_img == 0] = 0 + + y, x = util.npmax(map_ori) + y = int(float(y) * float(Hr) / float(wsize)) + x = int(float(x) * float(Wr) / float(wsize)) + all_peaks.append([x, y]) + return np.array(all_peaks) + +if __name__ == "__main__": + hand_estimation = Hand('../model/hand_pose_model.pth') + + # test_image = '../images/hand.jpg' + test_image = '../images/hand.jpg' + oriImg = cv2.imread(test_image) # B,G,R order + peaks = hand_estimation(oriImg) + canvas = util.draw_handpose(oriImg, peaks, True) + cv2.imshow('', canvas) + cv2.waitKey(0) \ No newline at end of file diff --git a/preprocess/openpose/annotator/openpose/model.py b/preprocess/openpose/annotator/openpose/model.py new file mode 100644 index 0000000..5dfc80d --- /dev/null +++ b/preprocess/openpose/annotator/openpose/model.py @@ -0,0 +1,219 @@ +import torch +from collections import OrderedDict + +import torch +import torch.nn as nn + +def make_layers(block, no_relu_layers): + layers = [] + for layer_name, v in block.items(): + if 'pool' in layer_name: + layer = nn.MaxPool2d(kernel_size=v[0], stride=v[1], + padding=v[2]) + layers.append((layer_name, layer)) + else: + conv2d = nn.Conv2d(in_channels=v[0], out_channels=v[1], + kernel_size=v[2], stride=v[3], + padding=v[4]) + layers.append((layer_name, conv2d)) + if layer_name not in no_relu_layers: + layers.append(('relu_'+layer_name, nn.ReLU(inplace=True))) + + return nn.Sequential(OrderedDict(layers)) + +class bodypose_model(nn.Module): + def __init__(self): + super(bodypose_model, self).__init__() + + # these layers have no relu layer + no_relu_layers = ['conv5_5_CPM_L1', 'conv5_5_CPM_L2', 'Mconv7_stage2_L1',\ + 'Mconv7_stage2_L2', 'Mconv7_stage3_L1', 'Mconv7_stage3_L2',\ + 'Mconv7_stage4_L1', 'Mconv7_stage4_L2', 'Mconv7_stage5_L1',\ + 'Mconv7_stage5_L2', 'Mconv7_stage6_L1', 'Mconv7_stage6_L1'] + blocks = {} + block0 = OrderedDict([ + ('conv1_1', [3, 64, 3, 1, 1]), + ('conv1_2', [64, 64, 3, 1, 1]), + ('pool1_stage1', [2, 2, 0]), + ('conv2_1', [64, 128, 3, 1, 1]), + ('conv2_2', [128, 128, 3, 1, 1]), + ('pool2_stage1', [2, 2, 0]), + ('conv3_1', [128, 256, 3, 1, 1]), + ('conv3_2', [256, 256, 3, 1, 1]), + ('conv3_3', [256, 256, 3, 1, 1]), + ('conv3_4', [256, 256, 3, 1, 1]), + ('pool3_stage1', [2, 2, 0]), + ('conv4_1', [256, 512, 3, 1, 1]), + ('conv4_2', [512, 512, 3, 1, 1]), + ('conv4_3_CPM', [512, 256, 3, 1, 1]), + ('conv4_4_CPM', [256, 128, 3, 1, 1]) + ]) + + + # Stage 1 + block1_1 = OrderedDict([ + ('conv5_1_CPM_L1', [128, 128, 3, 1, 1]), + ('conv5_2_CPM_L1', [128, 128, 3, 1, 1]), + ('conv5_3_CPM_L1', [128, 128, 3, 1, 1]), + ('conv5_4_CPM_L1', [128, 512, 1, 1, 0]), + ('conv5_5_CPM_L1', [512, 38, 1, 1, 0]) + ]) + + block1_2 = OrderedDict([ + ('conv5_1_CPM_L2', [128, 128, 3, 1, 1]), + ('conv5_2_CPM_L2', [128, 128, 3, 1, 1]), + ('conv5_3_CPM_L2', [128, 128, 3, 1, 1]), + ('conv5_4_CPM_L2', [128, 512, 1, 1, 0]), + ('conv5_5_CPM_L2', [512, 19, 1, 1, 0]) + ]) + blocks['block1_1'] = block1_1 + blocks['block1_2'] = block1_2 + + self.model0 = make_layers(block0, no_relu_layers) + + # Stages 2 - 6 + for i in range(2, 7): + blocks['block%d_1' % i] = OrderedDict([ + ('Mconv1_stage%d_L1' % i, [185, 128, 7, 1, 3]), + ('Mconv2_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv3_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv4_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv5_stage%d_L1' % i, [128, 128, 7, 1, 3]), + ('Mconv6_stage%d_L1' % i, [128, 128, 1, 1, 0]), + ('Mconv7_stage%d_L1' % i, [128, 38, 1, 1, 0]) + ]) + + blocks['block%d_2' % i] = OrderedDict([ + ('Mconv1_stage%d_L2' % i, [185, 128, 7, 1, 3]), + ('Mconv2_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv3_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv4_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv5_stage%d_L2' % i, [128, 128, 7, 1, 3]), + ('Mconv6_stage%d_L2' % i, [128, 128, 1, 1, 0]), + ('Mconv7_stage%d_L2' % i, [128, 19, 1, 1, 0]) + ]) + + for k in blocks.keys(): + blocks[k] = make_layers(blocks[k], no_relu_layers) + + self.model1_1 = blocks['block1_1'] + self.model2_1 = blocks['block2_1'] + self.model3_1 = blocks['block3_1'] + self.model4_1 = blocks['block4_1'] + self.model5_1 = blocks['block5_1'] + self.model6_1 = blocks['block6_1'] + + self.model1_2 = blocks['block1_2'] + self.model2_2 = blocks['block2_2'] + self.model3_2 = blocks['block3_2'] + self.model4_2 = blocks['block4_2'] + self.model5_2 = blocks['block5_2'] + self.model6_2 = blocks['block6_2'] + + + def forward(self, x): + + out1 = self.model0(x) + + out1_1 = self.model1_1(out1) + out1_2 = self.model1_2(out1) + out2 = torch.cat([out1_1, out1_2, out1], 1) + + out2_1 = self.model2_1(out2) + out2_2 = self.model2_2(out2) + out3 = torch.cat([out2_1, out2_2, out1], 1) + + out3_1 = self.model3_1(out3) + out3_2 = self.model3_2(out3) + out4 = torch.cat([out3_1, out3_2, out1], 1) + + out4_1 = self.model4_1(out4) + out4_2 = self.model4_2(out4) + out5 = torch.cat([out4_1, out4_2, out1], 1) + + out5_1 = self.model5_1(out5) + out5_2 = self.model5_2(out5) + out6 = torch.cat([out5_1, out5_2, out1], 1) + + out6_1 = self.model6_1(out6) + out6_2 = self.model6_2(out6) + + return out6_1, out6_2 + +class handpose_model(nn.Module): + def __init__(self): + super(handpose_model, self).__init__() + + # these layers have no relu layer + no_relu_layers = ['conv6_2_CPM', 'Mconv7_stage2', 'Mconv7_stage3',\ + 'Mconv7_stage4', 'Mconv7_stage5', 'Mconv7_stage6'] + # stage 1 + block1_0 = OrderedDict([ + ('conv1_1', [3, 64, 3, 1, 1]), + ('conv1_2', [64, 64, 3, 1, 1]), + ('pool1_stage1', [2, 2, 0]), + ('conv2_1', [64, 128, 3, 1, 1]), + ('conv2_2', [128, 128, 3, 1, 1]), + ('pool2_stage1', [2, 2, 0]), + ('conv3_1', [128, 256, 3, 1, 1]), + ('conv3_2', [256, 256, 3, 1, 1]), + ('conv3_3', [256, 256, 3, 1, 1]), + ('conv3_4', [256, 256, 3, 1, 1]), + ('pool3_stage1', [2, 2, 0]), + ('conv4_1', [256, 512, 3, 1, 1]), + ('conv4_2', [512, 512, 3, 1, 1]), + ('conv4_3', [512, 512, 3, 1, 1]), + ('conv4_4', [512, 512, 3, 1, 1]), + ('conv5_1', [512, 512, 3, 1, 1]), + ('conv5_2', [512, 512, 3, 1, 1]), + ('conv5_3_CPM', [512, 128, 3, 1, 1]) + ]) + + block1_1 = OrderedDict([ + ('conv6_1_CPM', [128, 512, 1, 1, 0]), + ('conv6_2_CPM', [512, 22, 1, 1, 0]) + ]) + + blocks = {} + blocks['block1_0'] = block1_0 + blocks['block1_1'] = block1_1 + + # stage 2-6 + for i in range(2, 7): + blocks['block%d' % i] = OrderedDict([ + ('Mconv1_stage%d' % i, [150, 128, 7, 1, 3]), + ('Mconv2_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv3_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv4_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv5_stage%d' % i, [128, 128, 7, 1, 3]), + ('Mconv6_stage%d' % i, [128, 128, 1, 1, 0]), + ('Mconv7_stage%d' % i, [128, 22, 1, 1, 0]) + ]) + + for k in blocks.keys(): + blocks[k] = make_layers(blocks[k], no_relu_layers) + + self.model1_0 = blocks['block1_0'] + self.model1_1 = blocks['block1_1'] + self.model2 = blocks['block2'] + self.model3 = blocks['block3'] + self.model4 = blocks['block4'] + self.model5 = blocks['block5'] + self.model6 = blocks['block6'] + + def forward(self, x): + out1_0 = self.model1_0(x) + out1_1 = self.model1_1(out1_0) + concat_stage2 = torch.cat([out1_1, out1_0], 1) + out_stage2 = self.model2(concat_stage2) + concat_stage3 = torch.cat([out_stage2, out1_0], 1) + out_stage3 = self.model3(concat_stage3) + concat_stage4 = torch.cat([out_stage3, out1_0], 1) + out_stage4 = self.model4(concat_stage4) + concat_stage5 = torch.cat([out_stage4, out1_0], 1) + out_stage5 = self.model5(concat_stage5) + concat_stage6 = torch.cat([out_stage5, out1_0], 1) + out_stage6 = self.model6(concat_stage6) + return out_stage6 + + diff --git a/preprocess/openpose/annotator/openpose/util.py b/preprocess/openpose/annotator/openpose/util.py new file mode 100644 index 0000000..73d7d01 --- /dev/null +++ b/preprocess/openpose/annotator/openpose/util.py @@ -0,0 +1,297 @@ +import math +import numpy as np +import matplotlib +import cv2 + + +eps = 0.01 + + +def smart_resize(x, s): + Ht, Wt = s + if x.ndim == 2: + Ho, Wo = x.shape + Co = 1 + else: + Ho, Wo, Co = x.shape + if Co == 3 or Co == 1: + k = float(Ht + Wt) / float(Ho + Wo) + return cv2.resize(x, (int(Wt), int(Ht)), interpolation=cv2.INTER_AREA if k < 1 else cv2.INTER_LANCZOS4) + else: + return np.stack([smart_resize(x[:, :, i], s) for i in range(Co)], axis=2) + + +def smart_resize_k(x, fx, fy): + if x.ndim == 2: + Ho, Wo = x.shape + Co = 1 + else: + Ho, Wo, Co = x.shape + Ht, Wt = Ho * fy, Wo * fx + if Co == 3 or Co == 1: + k = float(Ht + Wt) / float(Ho + Wo) + return cv2.resize(x, (int(Wt), int(Ht)), interpolation=cv2.INTER_AREA if k < 1 else cv2.INTER_LANCZOS4) + else: + return np.stack([smart_resize_k(x[:, :, i], fx, fy) for i in range(Co)], axis=2) + + +def padRightDownCorner(img, stride, padValue): + h = img.shape[0] + w = img.shape[1] + + pad = 4 * [None] + pad[0] = 0 # up + pad[1] = 0 # left + pad[2] = 0 if (h % stride == 0) else stride - (h % stride) # down + pad[3] = 0 if (w % stride == 0) else stride - (w % stride) # right + + img_padded = img + pad_up = np.tile(img_padded[0:1, :, :]*0 + padValue, (pad[0], 1, 1)) + img_padded = np.concatenate((pad_up, img_padded), axis=0) + pad_left = np.tile(img_padded[:, 0:1, :]*0 + padValue, (1, pad[1], 1)) + img_padded = np.concatenate((pad_left, img_padded), axis=1) + pad_down = np.tile(img_padded[-2:-1, :, :]*0 + padValue, (pad[2], 1, 1)) + img_padded = np.concatenate((img_padded, pad_down), axis=0) + pad_right = np.tile(img_padded[:, -2:-1, :]*0 + padValue, (1, pad[3], 1)) + img_padded = np.concatenate((img_padded, pad_right), axis=1) + + return img_padded, pad + + +def transfer(model, model_weights): + transfered_model_weights = {} + for weights_name in model.state_dict().keys(): + transfered_model_weights[weights_name] = model_weights['.'.join(weights_name.split('.')[1:])] + return transfered_model_weights + + +def draw_bodypose(canvas, candidate, subset): + H, W, C = canvas.shape + candidate = np.array(candidate) + subset = np.array(subset) + + stickwidth = 4 + + limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], \ + [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], \ + [1, 16], [16, 18], [3, 17], [6, 18]] + + colors = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0], [0, 255, 0], \ + [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85, 0, 255], \ + [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] + + for i in range(17): + for n in range(len(subset)): + index = subset[n][np.array(limbSeq[i]) - 1] + if -1 in index: + continue + Y = candidate[index.astype(int), 0] * float(W) + X = candidate[index.astype(int), 1] * float(H) + mX = np.mean(X) + mY = np.mean(Y) + length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 + angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) + polygon = cv2.ellipse2Poly((int(mY), int(mX)), (int(length / 2), stickwidth), int(angle), 0, 360, 1) + cv2.fillConvexPoly(canvas, polygon, colors[i]) + + canvas = (canvas * 0.6).astype(np.uint8) + + for i in range(18): + for n in range(len(subset)): + index = int(subset[n][i]) + if index == -1: + continue + x, y = candidate[index][0:2] + x = int(x * W) + y = int(y * H) + cv2.circle(canvas, (int(x), int(y)), 4, colors[i], thickness=-1) + + return canvas + + +def draw_handpose(canvas, all_hand_peaks): + H, W, C = canvas.shape + + edges = [[0, 1], [1, 2], [2, 3], [3, 4], [0, 5], [5, 6], [6, 7], [7, 8], [0, 9], [9, 10], \ + [10, 11], [11, 12], [0, 13], [13, 14], [14, 15], [15, 16], [0, 17], [17, 18], [18, 19], [19, 20]] + + for peaks in all_hand_peaks: + peaks = np.array(peaks) + + for ie, e in enumerate(edges): + x1, y1 = peaks[e[0]] + x2, y2 = peaks[e[1]] + x1 = int(x1 * W) + y1 = int(y1 * H) + x2 = int(x2 * W) + y2 = int(y2 * H) + if x1 > eps and y1 > eps and x2 > eps and y2 > eps: + cv2.line(canvas, (x1, y1), (x2, y2), matplotlib.colors.hsv_to_rgb([ie / float(len(edges)), 1.0, 1.0]) * 255, thickness=2) + + for i, keyponit in enumerate(peaks): + x, y = keyponit + x = int(x * W) + y = int(y * H) + if x > eps and y > eps: + cv2.circle(canvas, (x, y), 4, (0, 0, 255), thickness=-1) + return canvas + + +def draw_facepose(canvas, all_lmks): + H, W, C = canvas.shape + for lmks in all_lmks: + lmks = np.array(lmks) + for lmk in lmks: + x, y = lmk + x = int(x * W) + y = int(y * H) + if x > eps and y > eps: + cv2.circle(canvas, (x, y), 3, (255, 255, 255), thickness=-1) + return canvas + + +# detect hand according to body pose keypoints +# please refer to https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/src/openpose/hand/handDetector.cpp +def handDetect(candidate, subset, oriImg): + # right hand: wrist 4, elbow 3, shoulder 2 + # left hand: wrist 7, elbow 6, shoulder 5 + ratioWristElbow = 0.33 + detect_result = [] + image_height, image_width = oriImg.shape[0:2] + for person in subset.astype(int): + # if any of three not detected + has_left = np.sum(person[[5, 6, 7]] == -1) == 0 + has_right = np.sum(person[[2, 3, 4]] == -1) == 0 + if not (has_left or has_right): + continue + hands = [] + #left hand + if has_left: + left_shoulder_index, left_elbow_index, left_wrist_index = person[[5, 6, 7]] + x1, y1 = candidate[left_shoulder_index][:2] + x2, y2 = candidate[left_elbow_index][:2] + x3, y3 = candidate[left_wrist_index][:2] + hands.append([x1, y1, x2, y2, x3, y3, True]) + # right hand + if has_right: + right_shoulder_index, right_elbow_index, right_wrist_index = person[[2, 3, 4]] + x1, y1 = candidate[right_shoulder_index][:2] + x2, y2 = candidate[right_elbow_index][:2] + x3, y3 = candidate[right_wrist_index][:2] + hands.append([x1, y1, x2, y2, x3, y3, False]) + + for x1, y1, x2, y2, x3, y3, is_left in hands: + # pos_hand = pos_wrist + ratio * (pos_wrist - pos_elbox) = (1 + ratio) * pos_wrist - ratio * pos_elbox + # handRectangle.x = posePtr[wrist*3] + ratioWristElbow * (posePtr[wrist*3] - posePtr[elbow*3]); + # handRectangle.y = posePtr[wrist*3+1] + ratioWristElbow * (posePtr[wrist*3+1] - posePtr[elbow*3+1]); + # const auto distanceWristElbow = getDistance(poseKeypoints, person, wrist, elbow); + # const auto distanceElbowShoulder = getDistance(poseKeypoints, person, elbow, shoulder); + # handRectangle.width = 1.5f * fastMax(distanceWristElbow, 0.9f * distanceElbowShoulder); + x = x3 + ratioWristElbow * (x3 - x2) + y = y3 + ratioWristElbow * (y3 - y2) + distanceWristElbow = math.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2) + distanceElbowShoulder = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) + width = 1.5 * max(distanceWristElbow, 0.9 * distanceElbowShoulder) + # x-y refers to the center --> offset to topLeft point + # handRectangle.x -= handRectangle.width / 2.f; + # handRectangle.y -= handRectangle.height / 2.f; + x -= width / 2 + y -= width / 2 # width = height + # overflow the image + if x < 0: x = 0 + if y < 0: y = 0 + width1 = width + width2 = width + if x + width > image_width: width1 = image_width - x + if y + width > image_height: width2 = image_height - y + width = min(width1, width2) + # the max hand box value is 20 pixels + if width >= 20: + detect_result.append([int(x), int(y), int(width), is_left]) + + ''' + return value: [[x, y, w, True if left hand else False]]. + width=height since the network require squared input. + x, y is the coordinate of top left + ''' + return detect_result + + +# Written by Lvmin +def faceDetect(candidate, subset, oriImg): + # left right eye ear 14 15 16 17 + detect_result = [] + image_height, image_width = oriImg.shape[0:2] + for person in subset.astype(int): + has_head = person[0] > -1 + if not has_head: + continue + + has_left_eye = person[14] > -1 + has_right_eye = person[15] > -1 + has_left_ear = person[16] > -1 + has_right_ear = person[17] > -1 + + if not (has_left_eye or has_right_eye or has_left_ear or has_right_ear): + continue + + head, left_eye, right_eye, left_ear, right_ear = person[[0, 14, 15, 16, 17]] + + width = 0.0 + x0, y0 = candidate[head][:2] + + if has_left_eye: + x1, y1 = candidate[left_eye][:2] + d = max(abs(x0 - x1), abs(y0 - y1)) + width = max(width, d * 3.0) + + if has_right_eye: + x1, y1 = candidate[right_eye][:2] + d = max(abs(x0 - x1), abs(y0 - y1)) + width = max(width, d * 3.0) + + if has_left_ear: + x1, y1 = candidate[left_ear][:2] + d = max(abs(x0 - x1), abs(y0 - y1)) + width = max(width, d * 1.5) + + if has_right_ear: + x1, y1 = candidate[right_ear][:2] + d = max(abs(x0 - x1), abs(y0 - y1)) + width = max(width, d * 1.5) + + x, y = x0, y0 + + x -= width + y -= width + + if x < 0: + x = 0 + + if y < 0: + y = 0 + + width1 = width * 2 + width2 = width * 2 + + if x + width > image_width: + width1 = image_width - x + + if y + width > image_height: + width2 = image_height - y + + width = min(width1, width2) + + if width >= 20: + detect_result.append([int(x), int(y), int(width)]) + + return detect_result + + +# get max index of 2d array +def npmax(array): + arrayindex = array.argmax(1) + arrayvalue = array.max(1) + i = arrayvalue.argmax() + j = arrayindex[i] + return i, j diff --git a/preprocess/openpose/annotator/util.py b/preprocess/openpose/annotator/util.py new file mode 100644 index 0000000..c743b9b --- /dev/null +++ b/preprocess/openpose/annotator/util.py @@ -0,0 +1,100 @@ +import random + +import numpy as np +import cv2 +import os +from pathlib import Path + +PROJECT_ROOT = Path(__file__).absolute().parents[3].absolute() + +annotator_ckpts_path = os.path.join(PROJECT_ROOT, 'checkpoints/openpose/ckpts') +# print(annotator_ckpts_path) + +def HWC3(x): + assert x.dtype == np.uint8 + if x.ndim == 2: + x = x[:, :, None] + assert x.ndim == 3 + H, W, C = x.shape + assert C == 1 or C == 3 or C == 4 + if C == 3: + return x + if C == 1: + return np.concatenate([x, x, x], axis=2) + if C == 4: + color = x[:, :, 0:3].astype(np.float32) + alpha = x[:, :, 3:4].astype(np.float32) / 255.0 + y = color * alpha + 255.0 * (1.0 - alpha) + y = y.clip(0, 255).astype(np.uint8) + return y + + +def resize_image(input_image, resolution): + H, W, C = input_image.shape + H = float(H) + W = float(W) + k = float(resolution) / min(H, W) + H *= k + W *= k + H = int(np.round(H / 64.0)) * 64 + W = int(np.round(W / 64.0)) * 64 + img = cv2.resize(input_image, (W, H), interpolation=cv2.INTER_LANCZOS4 if k > 1 else cv2.INTER_AREA) + return img + + +def nms(x, t, s): + x = cv2.GaussianBlur(x.astype(np.float32), (0, 0), s) + + f1 = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]], dtype=np.uint8) + f2 = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]], dtype=np.uint8) + f3 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.uint8) + f4 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=np.uint8) + + y = np.zeros_like(x) + + for f in [f1, f2, f3, f4]: + np.putmask(y, cv2.dilate(x, kernel=f) == x, x) + + z = np.zeros_like(y, dtype=np.uint8) + z[y > t] = 255 + return z + + +def make_noise_disk(H, W, C, F): + noise = np.random.uniform(low=0, high=1, size=((H // F) + 2, (W // F) + 2, C)) + noise = cv2.resize(noise, (W + 2 * F, H + 2 * F), interpolation=cv2.INTER_CUBIC) + noise = noise[F: F + H, F: F + W] + noise -= np.min(noise) + noise /= np.max(noise) + if C == 1: + noise = noise[:, :, None] + return noise + + +def min_max_norm(x): + x -= np.min(x) + x /= np.maximum(np.max(x), 1e-5) + return x + + +def safe_step(x, step=2): + y = x.astype(np.float32) * float(step + 1) + y = y.astype(np.int32).astype(np.float32) / float(step) + return y + + +def img2mask(img, H, W, low=10, high=90): + assert img.ndim == 3 or img.ndim == 2 + assert img.dtype == np.uint8 + + if img.ndim == 3: + y = img[:, :, random.randrange(0, img.shape[2])] + else: + y = img + + y = cv2.resize(y, (W, H), interpolation=cv2.INTER_CUBIC) + + if random.uniform(0, 1) < 0.5: + y = 255 - y + + return y < np.percentile(y, random.randrange(low, high)) diff --git a/preprocess/openpose/run_openpose.py b/preprocess/openpose/run_openpose.py new file mode 100644 index 0000000..3a958f1 --- /dev/null +++ b/preprocess/openpose/run_openpose.py @@ -0,0 +1,84 @@ +import pdb + +import config +from pathlib import Path +import sys + +PROJECT_ROOT = Path(__file__).absolute().parents[0].absolute() +sys.path.insert(0, str(PROJECT_ROOT)) +import os + +import cv2 +import einops +import numpy as np +import random +import time +import json + +# from pytorch_lightning import seed_everything +from .annotator.util import resize_image, HWC3 +from .annotator.openpose import OpenposeDetector + +import argparse +from PIL import Image +import torch +import pdb + +# os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3' + +class OpenPose: + def __init__(self, gpu_id: int): + self.gpu_id = gpu_id + torch.cuda.set_device(gpu_id) + self.preprocessor = OpenposeDetector() + + def __call__(self, input_image, resolution=384): + torch.cuda.set_device(self.gpu_id) + if isinstance(input_image, Image.Image): + input_image = np.asarray(input_image) + elif type(input_image) == str: + input_image = np.asarray(Image.open(input_image)) + else: + raise ValueError + with torch.no_grad(): + input_image = HWC3(input_image) + input_image = resize_image(input_image, resolution) + H, W, C = input_image.shape + assert (H == 512 and W == 384), 'Incorrect input image shape' + pose, detected_map = self.preprocessor(input_image, hand_and_face=False) + + candidate = pose['bodies']['candidate'] + subset = pose['bodies']['subset'][0][:18] + for i in range(18): + if subset[i] == -1: + candidate.insert(i, [0, 0]) + for j in range(i, 18): + if(subset[j]) != -1: + subset[j] += 1 + elif subset[i] != i: + candidate.pop(i) + for j in range(i, 18): + if(subset[j]) != -1: + subset[j] -= 1 + + candidate = candidate[:18] + + for i in range(18): + candidate[i][0] *= 384 + candidate[i][1] *= 512 + + keypoints = {"pose_keypoints_2d": candidate} + # with open("/home/aigc/ProjectVTON/OpenPose/keypoints/keypoints.json", "w") as f: + # json.dump(keypoints, f) + # + # # print(candidate) + # output_image = cv2.resize(cv2.cvtColor(detected_map, cv2.COLOR_BGR2RGB), (768, 1024)) + # cv2.imwrite('/home/aigc/ProjectVTON/OpenPose/keypoints/out_pose.jpg', output_image) + + return keypoints + + +if __name__ == '__main__': + + model = OpenPose() + model('./images/bad_model.jpg') diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6f83ae8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +# pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 +# torch==2.0.1 +# torchvision==0.15.2 +numpy +opencv-python +pillow +diffusers==0.24.0 +transformers +accelerate +matplotlib +tqdm +# gradio==4.16.0 +scipy +onnxruntime +scikit-image + +# RuntimeError: Ninja is required to load C++ extensions +Ninja diff --git a/utils_ootd.py b/utils_ootd.py new file mode 100644 index 0000000..1efa2f4 --- /dev/null +++ b/utils_ootd.py @@ -0,0 +1,235 @@ +import pdb + +import numpy as np +import cv2 +from PIL import Image, ImageDraw + +label_map = { + "background": 0, + "hat": 1, + "hair": 2, + "sunglasses": 3, + "upper_clothes": 4, + "skirt": 5, + "pants": 6, + "dress": 7, + "belt": 8, + "left_shoe": 9, + "right_shoe": 10, + "head": 11, + "left_leg": 12, + "right_leg": 13, + "left_arm": 14, + "right_arm": 15, + "bag": 16, + "scarf": 17, +} + +def extend_arm_mask(wrist, elbow, scale): + wrist = elbow + scale * (wrist - elbow) + return wrist + +def hole_fill(img): + img = np.pad(img[1:-1, 1:-1], pad_width = 1, mode = 'constant', constant_values=0) + img_copy = img.copy() + mask = np.zeros((img.shape[0] + 2, img.shape[1] + 2), dtype=np.uint8) + + cv2.floodFill(img, mask, (0, 0), 255) + img_inverse = cv2.bitwise_not(img) + dst = cv2.bitwise_or(img_copy, img_inverse) + return dst + +def refine_mask(mask): + contours, hierarchy = cv2.findContours(mask.astype(np.uint8), + cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1) + area = [] + for j in range(len(contours)): + a_d = cv2.contourArea(contours[j], True) + area.append(abs(a_d)) + refine_mask = np.zeros_like(mask).astype(np.uint8) + if len(area) != 0: + i = area.index(max(area)) + cv2.drawContours(refine_mask, contours, i, color=255, thickness=-1) + + return refine_mask + +def get_mask_location(model_type, category, model_parse: Image.Image, keypoint: dict, width=384,height=512): + im_parse = model_parse.resize((width, height), Image.NEAREST) + parse_array = np.array(im_parse) + + if model_type == 'hd': + arm_width = 60 + elif model_type == 'dc': + arm_width = 45 + else: + raise ValueError("model_type must be \'hd\' or \'dc\'!") + + parse_head = (parse_array == 1).astype(np.float32) + \ + (parse_array == 3).astype(np.float32) + \ + (parse_array == 11).astype(np.float32) + + parser_mask_fixed = (parse_array == label_map["left_shoe"]).astype(np.float32) + \ + (parse_array == label_map["right_shoe"]).astype(np.float32) + \ + (parse_array == label_map["hat"]).astype(np.float32) + \ + (parse_array == label_map["sunglasses"]).astype(np.float32) + \ + (parse_array == label_map["bag"]).astype(np.float32) + + # (parse_array == label_map["scarf"]).astype(np.float32) + \ + + parser_mask_changeable = (parse_array == label_map["background"]).astype(np.float32) + + arms_left = (parse_array == 14).astype(np.float32) + arms_right = (parse_array == 15).astype(np.float32) + arms = arms_left + arms_right + + if category == 'dresses': + # 裙子加腿 mask + parse_mask = (parse_array == 7).astype(np.float32) + \ + (parse_array == 4).astype(np.float32) + \ + (parse_array == 5).astype(np.float32) + \ + (parse_array == 6).astype(np.float32) + # (parse_array == 12).astype(np.float32) + \ + # (parse_array == 13).astype(np.float32) + \ + + # 除fixed的区域,都是parser_mask_changeable + parser_mask_changeable += np.logical_and(parse_array, np.logical_not(parser_mask_fixed)) + + elif category == 'upper_body': + # 上衣mask + parse_mask = (parse_array == 4).astype(np.float32) + (parse_array == 7).astype(np.float32) + # 下半身衣物fixed + parser_mask_fixed_lower_cloth = (parse_array == label_map["skirt"]).astype(np.float32) + \ + (parse_array == label_map["pants"]).astype(np.float32) + # parser_mask_fixed_lower_cloth = cv2.erode(parser_mask_fixed_lower_cloth, np.ones((5, 5), np.uint16)) + parser_mask_fixed += parser_mask_fixed_lower_cloth + # 除fixed的区域,都是parser_mask_changeable + parser_mask_changeable += np.logical_and(parse_array, np.logical_not(parser_mask_fixed)) + elif category == 'lower_body': + # 裤子加腿 mask + parse_mask = (parse_array == 6).astype(np.float32) + \ + (parse_array == 12).astype(np.float32) + \ + (parse_array == 13).astype(np.float32) + \ + (parse_array == 5).astype(np.float32) + # 手臂fixed + parser_mask_fixed += (parse_array == label_map["upper_clothes"]).astype(np.float32) + \ + (parse_array == 14).astype(np.float32) + \ + (parse_array == 15).astype(np.float32) + # 除fixed的区域,都是parser_mask_changeable + parser_mask_changeable += np.logical_and(parse_array, np.logical_not(parser_mask_fixed)) + else: + raise NotImplementedError + + # Load pose points + pose_data = keypoint["pose_keypoints_2d"] + pose_data = np.array(pose_data) + pose_data = pose_data.reshape((-1, 2)) + + im_arms_left = Image.new('L', (width, height)) + im_arms_right = Image.new('L', (width, height)) + arms_draw_left = ImageDraw.Draw(im_arms_left) + arms_draw_right = ImageDraw.Draw(im_arms_right) + if category == 'dresses' or category == 'upper_body': + shoulder_right = np.multiply(tuple(pose_data[2][:2]), height / 512.0) + shoulder_left = np.multiply(tuple(pose_data[5][:2]), height / 512.0) + elbow_right = np.multiply(tuple(pose_data[3][:2]), height / 512.0) + elbow_left = np.multiply(tuple(pose_data[6][:2]), height / 512.0) + wrist_right = np.multiply(tuple(pose_data[4][:2]), height / 512.0) + wrist_left = np.multiply(tuple(pose_data[7][:2]), height / 512.0) + ARM_LINE_WIDTH = int(arm_width / 512 * height) + size_left = [shoulder_left[0] - ARM_LINE_WIDTH // 2, shoulder_left[1] - ARM_LINE_WIDTH // 2, shoulder_left[0] + ARM_LINE_WIDTH // 2, shoulder_left[1] + ARM_LINE_WIDTH // 2] + size_right = [shoulder_right[0] - ARM_LINE_WIDTH // 2, shoulder_right[1] - ARM_LINE_WIDTH // 2, shoulder_right[0] + ARM_LINE_WIDTH // 2, + shoulder_right[1] + ARM_LINE_WIDTH // 2] + + + if wrist_right[0] <= 1. and wrist_right[1] <= 1.: + if elbow_right[0] <= 1. and elbow_right[1] <= 1.: + # arms_draw_left.line( + # np.concatenate((wrist_left, elbow_left, shoulder_left)).astype(np.uint16).tolist(), 'white', + # 60, 'curve') + # arms_draw_left.arc(size_left, 0, 360, 'white', 30) + im_arms_right = arms_right + else: + # arms_draw_left.line( + # np.concatenate((wrist_left, elbow_left, shoulder_left)).astype(np.uint16).tolist(), 'white', + # 60, 'curve') + # arms_draw_left.arc(size_left, 0, 360, 'white', 30) + im_arms_right = arms_right + # arms_draw_right.line(np.concatenate((shoulder_right, elbow_right)).astype(np.uint16).tolist(), 'white', ARM_LINE_WIDTH, 'curve') + # arms_draw_right.arc(size_right, 0, 360, 'white', ARM_LINE_WIDTH//2) + else: + wrist_right = extend_arm_mask(wrist_right, elbow_right, 1.2) + arms_draw_right.line(np.concatenate((shoulder_right, elbow_right, wrist_right)).astype(np.uint16).tolist(), 'white', ARM_LINE_WIDTH, 'curve') + arms_draw_right.arc(size_right, 0, 360, 'white', ARM_LINE_WIDTH // 2) + + if wrist_left[0] <= 1. and wrist_left[1] <= 1.: + if elbow_left[0] <= 1. and elbow_left[1] <= 1.: + # arms_draw_right.line( + # np.concatenate((shoulder_right, elbow_right, wrist_right)).astype(np.uint16).tolist(), + # 'white', 60, 'curve') + # arms_draw_right.arc(size_right, 0, 360, 'white', 30) + im_arms_left = arms_left + else: + # arms_draw_left.line(np.concatenate((elbow_left, shoulder_left)).astype(np.uint16).tolist(), 'white', ARM_LINE_WIDTH, 'curve') + im_arms_left = arms_left + # arms_draw_left.arc(size_left, 0, 360, 'white', ARM_LINE_WIDTH//2) + + # arms_draw_right.line( + # np.concatenate((shoulder_right, elbow_right, wrist_right)).astype(np.uint16).tolist(), + # 'white', 60, 'curve') + # arms_draw_right.arc(size_right, 0, 360, 'white', 30) + else: + # extend arm scale 1.2 + wrist_left = extend_arm_mask(wrist_left, elbow_left, 1.2) + arms_draw_left.line(np.concatenate((wrist_left, elbow_left, shoulder_left)).astype(np.uint16).tolist(), 'white', ARM_LINE_WIDTH, 'curve') + arms_draw_left.arc(size_left, 0, 360, 'white', ARM_LINE_WIDTH // 2) + + # im_arms_left.save("leftarm.jpg") + # im_arms_right.save("rightarm.jpg") + hands_left = np.logical_and(np.logical_not(im_arms_left), arms_left) + # hands_left_refine = refine_mask(hands_left) + # im_arms_left += np.logical_and(np.logical_not(hands_left_refine), hands_left) + # Image.fromarray(((hands_left > 0) * 127.5 + 127.5).astype(np.uint8)).save("hands_left.jpg") + hands_right = np.logical_and(np.logical_not(im_arms_right), arms_right) + # hands_right_refine = refine_mask(hands_right) + # im_arms_right += np.logical_and(np.logical_not(hands_right_refine), hands_right) + # Image.fromarray(((hands_right > 0) * 127.5 + 127.5).astype(np.uint8)).save("hands_right.jpg") + # Image.fromarray(((parser_mask_fixed > 0) * 127.5 + 127.5).astype(np.uint8)).save("fixed_before.jpg") + parser_mask_fixed += hands_left + hands_right + # Image.fromarray(((parser_mask_fixed > 0) * 127.5 + 127.5).astype(np.uint8)).save("fixed_after.jpg") + + # parser_mask_fixed 加入脸部和双肩以上脖子 + parser_mask_fixed = np.logical_or(parser_mask_fixed, parse_head) + parse_mask = cv2.dilate(parse_mask, np.ones((5, 5), np.uint16), iterations=5) + if category == 'dresses' or category == 'upper_body': + neck_mask = (parse_array == 18).astype(np.float32) + # Image.fromarray(((parse_mask > 0) * 127.5 + 127.5).astype(np.uint8)).save("mask_before.jpg") + neck_mask = cv2.dilate(neck_mask, np.ones((5, 5), np.uint16), iterations=1) + neck_mask = np.logical_and(neck_mask, np.logical_not(parse_head)) + parse_mask = np.logical_or(parse_mask, neck_mask) + # Image.fromarray(((parse_mask > 0) * 127.5 + 127.5).astype(np.uint8)).save("mask_after.jpg") + # 单独控制手臂部分大小 + arm_mask = cv2.dilate(np.logical_or(im_arms_left, im_arms_right).astype('float32'), np.ones((5, 5), np.uint16), iterations=4) + # Image.fromarray(((arm_mask > 0) * 127.5 + 127.5).astype(np.uint8)).save("arm_mask.jpg") + parse_mask += np.logical_or(parse_mask, arm_mask) + + # pdb.set_trace() + # 除了fix(hands排除)就是changeable,not parse_mask 除了要mask的 其余置1(除了fixed区域与mask区域,其余都为1) + # Image.fromarray(((parse_mask > 0) * 127.5 + 127.5).astype(np.uint8)).save("mask_addarm.jpg") + parse_mask = np.logical_and(parser_mask_changeable, np.logical_not(parse_mask)) + + # parser_mask_fixed + parse_mask 结合,把fixed加入,只剩要mask区域(若有侵蚀到fixed的操作也会被fixed重新取回) + # Image.fromarray(((parser_mask_fixed > 0).cpu().numpy() * 127.5 + 127.5).astype(np.uint8)).save("mask_fixed.jpg") + parse_mask_total = np.logical_or(parse_mask, parser_mask_fixed) + inpaint_mask = 1 - parse_mask_total + img = np.where(inpaint_mask, 255, 0) + dst = hole_fill(img.astype(np.uint8)) + dst = refine_mask(dst) + inpaint_mask = dst / 255 * 1 + mask = Image.fromarray(inpaint_mask.astype(np.uint8) * 255) + mask_gray = Image.fromarray(inpaint_mask.astype(np.uint8) * 127) + + # print("save") + # mask.save("mask.png") + # mask_gray.save("mask_gray.png") + + return mask, mask_gray \ No newline at end of file

    +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%0DTVQ-77Ks8B(e(2fh!rhLYbfEY3x?q?8y)$===Y zU`9hA55e$lIxX}pcc{&f73GO6<(Ohk1BB0pH(Ze+JiiBxt->fSEIK)x7QeTj#3*Z_ zxS!$qYkw3hf1?=Ev>@M+sO~(b1ib7-CsK^A4FrmxLvoL?4JDHZ?u-YioTi;ssD}e6 zB-C*}BSjD^&vUd#<15e0u-bigF|dg63Y$8!=BRyvYGbaXvQoH=03Kh;>qU>kt@;Xdo3RGAeYrK`KoNoj3>rT)f}rn zEPHk?|woaqtUil#U@#Xs_aCoKw;W7By=*?5q3!<`7{PIp3cC~= zIhBW>OeekI!+wp^+|#3531sp+k~DctCY{ixu!wL^>}#acb+rI;6jO{xKY-yxPBR*t zJ1)2eU?a(Mj+VVo>k-MB^-VtWCnIgwbmBgfGuVrN>JmV--IH}TO6+4xhOWbcq_3wq z-$)A1T?Kx>w6#I}p5zuIcsf1w2r)T>SJlt`Pyn24VJI@&f+kxR+jh39_ZMYEg{1s{ z^kOfF@i`fi<79rmSue#yWyq1*WPc@#Ja5<#NCHI<#oF71!cwtU8y#4Glwdtaaf!6Y zy5xg}`@|0QZ%UO~S0K0!L%(TEHu3lK%SZ}xy{jE7P@wY72U&ij4Amg!QqENQEDM3o z>uU5mH=)~ueSv_*7We0NVD+zat~xAV5>+iLy-Xl3ydQDXT!h(rKNRTIJZc+w-8h

    (H#&)ueujc$K-OmWne)}8* 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⋙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

    3J9h%OmNq+ZTXz* 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 z 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

  • 5TxOd%d={9s26nyoVgd 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