From 7956f49b22dd7b5f1b18f660766342b9f68c9d92 Mon Sep 17 00:00:00 2001
From: zhihaolee <1090259542@qq.com>
Date: Mon, 1 Aug 2022 10:53:35 +0800
Subject: [PATCH] Cliff (#93)
* Create README.MD
* code and data link
* Update README.MD
Update README.MD
---
CLIFF/LICENSE | 21 +
CLIFF/README.MD | 77 ++-
...HIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt | 65 +++
CLIFF/assets/im00492/im00492.png | Bin 0 -> 210973 bytes
CLIFF/assets/im00492/im00492_bbox.jpg | Bin 0 -> 69990 bytes
.../im00492/im00492_front_view_cliff_hr48.jpg | Bin 0 -> 69283 bytes
.../im00492/im00492_side_view_cliff_hr48.jpg | Bin 0 -> 6463 bytes
CLIFF/assets/im08036/im08036.png | Bin 0 -> 412562 bytes
CLIFF/assets/im08036/im08036_bbox.jpg | Bin 0 -> 123631 bytes
.../im08036/im08036_front_view_cliff_hr48.jpg | Bin 0 -> 117813 bytes
.../im08036/im08036_side_view_cliff_hr48.jpg | Bin 0 -> 13148 bytes
CLIFF/assets/teaser.gif | Bin 0 -> 2744200 bytes
.../viz_cliffGT_perImg-COCO_sample.jpg | Bin 0 -> 49358 bytes
.../viz_cliffGT_perSubject-MPII_sample.jpg | Bin 0 -> 32319 bytes
CLIFF/common/constants.py | 23 +
CLIFF/common/imutils.py | 150 +++++
CLIFF/common/mocap_dataset.py | 48 ++
CLIFF/common/renderer_pyrd.py | 90 +++
CLIFF/common/skeleton_drawer.py | 112 ++++
CLIFF/common/utils.py | 78 +++
CLIFF/data/smpl_mean_params.npz | Bin 0 -> 1310 bytes
CLIFF/demo.py | 261 +++++++++
CLIFF/lib/yolov3_dataset.py | 36 ++
CLIFF/lib/yolov3_detector.py | 68 +++
CLIFF/models/backbones/hrnet/cls_hrnet.py | 518 ++++++++++++++++++
.../backbones/hrnet/hrnet_config/__init__.py | 9 +
.../backbones/hrnet/hrnet_config/default.py | 136 +++++
.../backbones/hrnet/hrnet_config/models.py | 58 ++
...hrnet_w48_sgd_lr5e-2_wd1e-4_bs32_x100.yaml | 92 ++++
...hrnet_w64_sgd_lr5e-2_wd1e-4_bs32_x100.yaml | 92 ++++
CLIFF/models/backbones/resnet.py | 94 ++++
CLIFF/models/cliff_hr48/cliff.py | 105 ++++
CLIFF/models/cliff_res50/cliff.py | 97 ++++
CLIFF/requirements.txt | 11 +
CLIFF/scripts/run_cliffGT_visualization.sh | 17 +
CLIFF/scripts/run_demo.sh | 29 +
CLIFF/viz_cliffGT_perImg.py | 122 +++++
CLIFF/viz_cliffGT_perSubject.py | 101 ++++
38 files changed, 2496 insertions(+), 14 deletions(-)
create mode 100644 CLIFF/LICENSE
create mode 100644 CLIFF/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt
create mode 100644 CLIFF/assets/im00492/im00492.png
create mode 100644 CLIFF/assets/im00492/im00492_bbox.jpg
create mode 100644 CLIFF/assets/im00492/im00492_front_view_cliff_hr48.jpg
create mode 100644 CLIFF/assets/im00492/im00492_side_view_cliff_hr48.jpg
create mode 100644 CLIFF/assets/im08036/im08036.png
create mode 100644 CLIFF/assets/im08036/im08036_bbox.jpg
create mode 100644 CLIFF/assets/im08036/im08036_front_view_cliff_hr48.jpg
create mode 100644 CLIFF/assets/im08036/im08036_side_view_cliff_hr48.jpg
create mode 100644 CLIFF/assets/teaser.gif
create mode 100644 CLIFF/assets/visualized_cliffGT/viz_cliffGT_perImg-COCO_sample.jpg
create mode 100644 CLIFF/assets/visualized_cliffGT/viz_cliffGT_perSubject-MPII_sample.jpg
create mode 100644 CLIFF/common/constants.py
create mode 100644 CLIFF/common/imutils.py
create mode 100644 CLIFF/common/mocap_dataset.py
create mode 100644 CLIFF/common/renderer_pyrd.py
create mode 100644 CLIFF/common/skeleton_drawer.py
create mode 100644 CLIFF/common/utils.py
create mode 100644 CLIFF/data/smpl_mean_params.npz
create mode 100644 CLIFF/demo.py
create mode 100644 CLIFF/lib/yolov3_dataset.py
create mode 100644 CLIFF/lib/yolov3_detector.py
create mode 100644 CLIFF/models/backbones/hrnet/cls_hrnet.py
create mode 100644 CLIFF/models/backbones/hrnet/hrnet_config/__init__.py
create mode 100644 CLIFF/models/backbones/hrnet/hrnet_config/default.py
create mode 100644 CLIFF/models/backbones/hrnet/hrnet_config/models.py
create mode 100644 CLIFF/models/backbones/hrnet/models/cls_hrnet_w48_sgd_lr5e-2_wd1e-4_bs32_x100.yaml
create mode 100644 CLIFF/models/backbones/hrnet/models/cls_hrnet_w64_sgd_lr5e-2_wd1e-4_bs32_x100.yaml
create mode 100644 CLIFF/models/backbones/resnet.py
create mode 100644 CLIFF/models/cliff_hr48/cliff.py
create mode 100644 CLIFF/models/cliff_res50/cliff.py
create mode 100644 CLIFF/requirements.txt
create mode 100644 CLIFF/scripts/run_cliffGT_visualization.sh
create mode 100644 CLIFF/scripts/run_demo.sh
create mode 100644 CLIFF/viz_cliffGT_perImg.py
create mode 100644 CLIFF/viz_cliffGT_perSubject.py
diff --git a/CLIFF/LICENSE b/CLIFF/LICENSE
new file mode 100644
index 0000000..d0dc4d3
--- /dev/null
+++ b/CLIFF/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (C) 2022. Huawei Technologies Co., Ltd. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/CLIFF/README.MD b/CLIFF/README.MD
index 775c76f..e828c7c 100644
--- a/CLIFF/README.MD
+++ b/CLIFF/README.MD
@@ -1,11 +1,14 @@
# CLIFF [ECCV 2022 Oral]
+
+*(This testing video is from the 3DPW testset, and processed frame by frame without temporal smoothing.)*
-This repo contains the CLIFF demo code,
+## Introduction
+This repo contains the demo code,
and the pseudo-GT SMPL parameters used in the training for the paper:
-**CLIFF: Carrying Location Information in Full Frames into Human Pose and Shape Estimation**
+**CLIFF: Carrying Location Information in Full Frames into Human Pose and Shape Estimation**.
## Installation
```bash
@@ -13,10 +16,13 @@ conda create -n cliff python=3.10
pip install -r requirements.txt
```
-1. Download [the SMPL models](https://smpl.is.tue.mpg.de/) for rendering the reconstructed meshes
-2. Download [pytorch-yolo-v3](https://github.com/ayooshkathuria/pytorch-yolo-v3), unzip it under the `lib` directory, and change the folder name to **"pytorch_yolo_v3_master"**
-2. Download the pretrained checkpoints and some testing samples to run the demo [[Google Drive]()]
-3. Download the CLIFF pseudo-GT for the in-the-wild datasets [[Google Drive]()]
+1. Download [the SMPL models](https://smpl.is.tue.mpg.de) for rendering the reconstructed meshes
+2. Download [pytorch-yolo-v3](https://github.com/ayooshkathuria/pytorch-yolo-v3),
+ unzip it under the `lib` directory, and change the folder name to **"pytorch_yolo_v3_master"**
+3. Download the pretrained checkpoints and some testing samples to run the demo [[Google Drive](
+ https://drive.google.com/drive/folders/1EmSZwaDULhT9m1VvH7YOpCXwBWgYrgwP?usp=sharing)]
+4. Download the CLIFF pseudo-GT for the in-the-wild datasets [[Google Drive](
+ https://drive.google.com/drive/folders/1EmSZwaDULhT9m1VvH7YOpCXwBWgYrgwP?usp=sharing)]
Finally put these data following the directory structure as below:
```
@@ -26,38 +32,81 @@ ${ROOT}
|-- mpii_cliffGT.npz
|-- data
|-- ckpt
- |-- hr48-PA43.0_MJE69.0_MVE81.2_3dpw-PA32.6_MJE47.6_MVE60.1_h36m-p2.pt
- |-- res50-PA45.7_MJE72.0_MVE85.3_3dpw-PA35.7_MJE52.8_MVE63.2_h36m-p2.pt
+ |-- hr48-PA43.0_MJE69.0_MVE81.2_3dpw.pt
+ |-- res50-PA45.7_MJE72.0_MVE85.3_3dpw.pt
+ |-- yolov3.weights
|-- smpl
|-- SMPL_FEMALE.pkl
|-- SMPL_MALE.pkl
|-- SMPL_NEUTRAL.pkl
|-- lib
|-- pytorch_yolo_v3_master
- |-- yolov3.weights
```
-
## Demo
```shell
sh scripts/run_demo.sh
```
-Change the options in the scripts.
-See the option description in the bottom lines of `demo.py`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+The results will be saved in the same directory as the input, including the detected bbox,
+the front-view and side-view rendering of the reconstructed meshes,
+and the npz file containing all the estimation information.
+
+One can change the demo options in the script.
+Please see the option description in the bottom lines of `demo.py`.
## Pseudo-GT
+
+Run the script to visualize the pseudoGT, press the `<-` and `->` button to the next sample, and `esc` to exit.
+
```shell
sh scripts/run_cliffGT_visualization.sh
```
+
+
+
+
+Data format:
+```
+'imgname': # image name, e.g., images/015601864.jpg, train2014/COCO_train2014_000000044474.jpg
+'center': # bbox center, [x, y]
+'scale': # bbox scale, bbox_size_in_pixel / 200.
+'part': # 2D keypoint annotation, shape (24, 3), [x, y, conf], see common/skeleton_drawer.py for the order
+'annot_id': # annotation ID, only available for the COCO dataset
+'pose': # SMPL pose parameters in axis-angle, shape (72,)
+'shape': # SMPL shape parameters, shape (10,)
+'has_smpl': # whether the smpl parameters are available (true for all samples)
+'global_t': # Pelvis translation in the camera coordinate system w.r.t the original full-frame image
+'focal_l': # estimated focal length for the original image, np.sqrt(img_w ** 2 + img_h ** 2)
+'S': # 3D joints with Pelvis aligned at (0, 0, 0), shape (24, 4), [x, y, z, conf], same order as 'part'
+```
+
+## Issues
+When submitting an issue, please add **"[CLIFF]"** before the title, e.g., `[CLIFF] your issue title`.
+This is for clarifying which subproject the issue points to.
## Citing
```
-@Inproceedings{li_2022_eccv_cliff,
+@Inproceedings{li2022cliff,
Title = {CLIFF: Carrying Location Information in Full Frames into Human Pose and Shape Estimation},
Author = {Li, Zhihao and Liu, Jianzhuang and Zhang, Zhensong and Xu, Songcen and Yan, Youliang},
Booktitle = {ECCV},
Year = {2022}
}
-```
\ No newline at end of file
+```
diff --git a/CLIFF/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt b/CLIFF/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt
new file mode 100644
index 0000000..ac9b515
--- /dev/null
+++ b/CLIFF/THIRD PARTY OPEN SOURCE SOFTWARE NOTICE.txt
@@ -0,0 +1,65 @@
+Please note we provide an open source software notice for the third party open source software along with this software and/or this software component contributed by Huawei (in the following just “this SOFTWARE”). The open source software licenses are granted by the respective right holders.
+
+Warranty Disclaimer
+THE OPEN SOURCE SOFTWARE IN THIS SOFTWARE IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
+
+Copyright Notice and License Texts
+Software: SPIN (https://github.com/nkolot/SPIN)
+Copyright notice:
+Copyright (c) 2019,
+University of Pennsylvania,
+Max Planck Institute for Intelligent Systems
+All rights reserved.
+
+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.
+
+3. The names of the contributors may not be used to endorse or
+ promote products derived from this software without specific
+ prior written permission.
+
+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.
+
+Copyright Notice and License Texts
+Software: HRNet-Image-Classification (https://github.com/HRNet/HRNet-Image-Classification)
+Copyright notice:
+MIT License
+
+Copyright (c) 2019 Microsoft Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/CLIFF/assets/im00492/im00492.png b/CLIFF/assets/im00492/im00492.png
new file mode 100644
index 0000000000000000000000000000000000000000..eef536c8f6f2b2ae31c52c3a4ae5616573b5a92f
GIT binary patch
literal 210973
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